src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/eval/vals/iterate_test.go (about) 1 package vals 2 3 import ( 4 "testing" 5 6 "src.elv.sh/pkg/tt" 7 ) 8 9 // An implementation of Iterator. 10 type iterator struct{ elements []any } 11 12 func (i iterator) Iterate(f func(any) bool) { 13 Feed(f, i.elements...) 14 } 15 16 // A non-implementation of Iterator. 17 type nonIterator struct{} 18 19 func TestCanIterate(t *testing.T) { 20 tt.Test(t, CanIterate, 21 Args("foo").Rets(true), 22 Args(MakeList("foo", "bar")).Rets(true), 23 Args(iterator{vs("a", "b")}).Rets(true), 24 Args(nonIterator{}).Rets(false), 25 ) 26 } 27 28 func TestCollect(t *testing.T) { 29 tt.Test(t, Collect, 30 Args("foo").Rets(vs("f", "o", "o"), nil), 31 Args(MakeList("foo", "bar")).Rets(vs("foo", "bar"), nil), 32 Args(iterator{vs("a", "b")}).Rets(vs("a", "b"), nil), 33 Args(nonIterator{}).Rets(vs(), cannotIterate{"!!vals.nonIterator"}), 34 ) 35 } 36 37 // Iterate is tested indirectly by the test against Collect.