aerc/lib/iterator/iterator_test.go
Koni Marti c83ffabf38 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>
2022-10-27 22:44:39 +02:00

96 lines
2.3 KiB
Go

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")
}
}