diff options
author | Koni Marti <koni.marti@gmail.com> | 2022-10-20 16:43:40 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-10-27 22:44:39 +0200 |
commit | c83ffabf3853e5f06294bba78dc23bc7ff84b0af (patch) | |
tree | cfebeb1cd345526ec10eb93bce00e2630106e9d2 /lib/iterator/iterator_test.go | |
parent | f20933f51220e1946ccecd16e0ebfda05aa2b5cb (diff) | |
download | aerc-c83ffabf3853e5f06294bba78dc23bc7ff84b0af.tar.gz |
iterator: implement iterators over uid/thread data
Implement an iterator framework for uid and thread data. Iterators
ensure that the underlying data is accessed in the right order and
provide an abstraction of the index handling.
Iterators should be used when the order of the uids/threads is
important.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib/iterator/iterator_test.go')
-rw-r--r-- | lib/iterator/iterator_test.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/iterator/iterator_test.go b/lib/iterator/iterator_test.go new file mode 100644 index 00000000..6a8d3f6e --- /dev/null +++ b/lib/iterator/iterator_test.go @@ -0,0 +1,95 @@ +package iterator_test + +import ( + "testing" + + "git.sr.ht/~rjarry/aerc/lib/iterator" + "git.sr.ht/~rjarry/aerc/worker/types" +) + +func toThreads(uids []uint32) []*types.Thread { + threads := make([]*types.Thread, len(uids)) + for i, u := range uids { + threads[i] = &types.Thread{Uid: u} + } + return threads +} + +func TestIterator_DefaultFactory(t *testing.T) { + input := []uint32{1, 2, 3, 4, 5, 6, 7, 8, 9} + want := []uint32{9, 8, 7, 6, 5, 4, 3, 2, 1} + + factory := iterator.NewFactory(false) + if factory == nil { + t.Errorf("could not create factory") + } + start, end := len(input)-1, 0 + checkUids(t, factory, input, want, start, end) + checkThreads(t, factory, toThreads(input), + toThreads(want), start, end) +} + +func TestIterator_ReverseFactory(t *testing.T) { + input := []uint32{1, 2, 3, 4, 5, 6, 7, 8, 9} + want := []uint32{1, 2, 3, 4, 5, 6, 7, 8, 9} + + factory := iterator.NewFactory(true) + if factory == nil { + t.Errorf("could not create factory") + } + + start, end := 0, len(input)-1 + checkUids(t, factory, input, want, start, end) + checkThreads(t, factory, toThreads(input), + toThreads(want), start, end) +} + +func checkUids(t *testing.T, factory iterator.Factory, + input []uint32, want []uint32, start, end int, +) { + label := "uids" + got := make([]uint32, 0) + iter := factory.NewIterator(input) + for iter.Next() { + got = append(got, iter.Value().(uint32)) + } + if len(got) != len(want) { + t.Errorf(label + "number of elements not correct") + } + for i, u := range want { + if got[i] != u { + t.Errorf(label + "order not correct") + } + } + if iter.StartIndex() != start { + t.Errorf(label + "start index not correct") + } + if iter.EndIndex() != end { + t.Errorf(label + "end index not correct") + } +} + +func checkThreads(t *testing.T, factory iterator.Factory, + input []*types.Thread, want []*types.Thread, start, end int, +) { + label := "threads" + got := make([]*types.Thread, 0) + iter := factory.NewIterator(input) + for iter.Next() { + got = append(got, iter.Value().(*types.Thread)) + } + if len(got) != len(want) { + t.Errorf(label + "number of elements not correct") + } + for i, th := range want { + if got[i].Uid != th.Uid { + t.Errorf(label + "order not correct") + } + } + if iter.StartIndex() != start { + t.Errorf(label + "start index not correct") + } + if iter.EndIndex() != end { + t.Errorf(label + "end index not correct") + } +} |