7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
169 lines
3.6 KiB
Go
169 lines
3.6 KiB
Go
package updates
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"go.uber.org/zap/zaptest"
|
|
)
|
|
|
|
func TestSequenceBox(t *testing.T) {
|
|
var (
|
|
state int
|
|
updates []update
|
|
)
|
|
|
|
ctx := context.Background()
|
|
box := newSequenceBox(sequenceConfig{
|
|
InitialState: 3,
|
|
Apply: func(ctx context.Context, s int, u []update) error {
|
|
state = s
|
|
updates = append(updates, u...)
|
|
return nil
|
|
},
|
|
Logger: zaptest.NewLogger(t),
|
|
})
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 1,
|
|
State: 2,
|
|
Count: 1,
|
|
}))
|
|
require.Zero(t, state)
|
|
require.Empty(t, updates)
|
|
require.Empty(t, box.pending)
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 1,
|
|
State: 3,
|
|
Count: 1,
|
|
}))
|
|
require.Zero(t, state)
|
|
require.Empty(t, updates)
|
|
require.Empty(t, box.pending)
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 1,
|
|
State: 4,
|
|
Count: 1,
|
|
}))
|
|
require.Equal(t, 4, state)
|
|
require.Equal(t, []update{{Value: 1, State: 4, Count: 1}}, updates)
|
|
require.Empty(t, box.pending)
|
|
updates = nil
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 1,
|
|
State: 6,
|
|
Count: 1,
|
|
}))
|
|
require.Equal(t, 4, state)
|
|
require.Empty(t, updates)
|
|
require.Equal(t, []update{{Value: 1, State: 6, Count: 1}}, box.pending)
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 2,
|
|
State: 5,
|
|
Count: 1,
|
|
}))
|
|
require.Equal(t, 6, state)
|
|
require.Equal(t, []update{{Value: 2, State: 5, Count: 1}, {Value: 1, State: 6, Count: 1}}, updates)
|
|
require.Empty(t, box.pending)
|
|
updates = nil
|
|
|
|
require.Nil(t, box.Handle(ctx, update{
|
|
Value: 3,
|
|
State: 8,
|
|
Count: 1,
|
|
}))
|
|
require.Equal(t, 6, state)
|
|
require.Empty(t, updates)
|
|
require.Equal(t, []update{{Value: 3, State: 8, Count: 1}}, box.pending)
|
|
<-box.gapTimeout.C
|
|
|
|
require.Equal(t, []gap{{from: 6, to: 7}}, box.gaps.gaps)
|
|
box.gaps.Clear()
|
|
require.False(t, box.gaps.Has())
|
|
}
|
|
|
|
func TestSequenceBoxApplyPending(t *testing.T) {
|
|
tests := []struct {
|
|
InitialState int
|
|
Pending []update
|
|
PendingAfter []update
|
|
Applied []update
|
|
}{
|
|
{
|
|
InitialState: 5,
|
|
Pending: []update{
|
|
{Value: 1, State: 3, Count: 1},
|
|
{Value: 1, State: 4, Count: 1},
|
|
{Value: 1, State: 1, Count: 1},
|
|
},
|
|
PendingAfter: []update{},
|
|
Applied: []update{},
|
|
},
|
|
{
|
|
InitialState: 5,
|
|
Pending: []update{
|
|
{Value: 1, State: 3, Count: 1},
|
|
{Value: 1, State: 8, Count: 1},
|
|
{Value: 1, State: 7, Count: 1},
|
|
{Value: 1, State: 4, Count: 1},
|
|
{Value: 1, State: 1, Count: 1},
|
|
},
|
|
PendingAfter: []update{
|
|
{1, 7, 1, entities{}},
|
|
{1, 8, 1, entities{}},
|
|
},
|
|
Applied: []update{},
|
|
},
|
|
{
|
|
InitialState: 5,
|
|
Pending: []update{
|
|
{Value: 1, State: 8, Count: 1},
|
|
{Value: 1, State: 7, Count: 1},
|
|
},
|
|
PendingAfter: []update{
|
|
{1, 7, 1, entities{}},
|
|
{Value: 1, State: 8, Count: 1},
|
|
},
|
|
Applied: []update{},
|
|
},
|
|
{
|
|
InitialState: 5,
|
|
Pending: []update{
|
|
{Value: 1, State: 3, Count: 1},
|
|
{Value: 1, State: 6, Count: 1},
|
|
{Value: 1, State: 8, Count: 1},
|
|
{Value: 1, State: 4, Count: 1},
|
|
{Value: 1, State: 1, Count: 1},
|
|
},
|
|
PendingAfter: []update{
|
|
{Value: 1, State: 8, Count: 1},
|
|
},
|
|
Applied: []update{
|
|
{Value: 1, State: 6, Count: 1},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
applied := make([]update, 0)
|
|
box := newSequenceBox(sequenceConfig{
|
|
InitialState: test.InitialState,
|
|
Apply: func(_ context.Context, s int, u []update) error {
|
|
applied = append(applied, u...)
|
|
return nil
|
|
},
|
|
Logger: zaptest.NewLogger(t),
|
|
})
|
|
|
|
box.pending = test.Pending
|
|
require.NoError(t, box.applyPending(context.TODO()))
|
|
require.Equal(t, test.PendingAfter, box.pending)
|
|
require.Equal(t, test.Applied, applied)
|
|
}
|
|
}
|