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.