github.com/m4gshm/gollections@v0.0.10/kv/iter/test/kvit_test.go (about) 1 package test 2 3 import ( 4 "errors" 5 "testing" 6 7 breakLoop "github.com/m4gshm/gollections/break/kv/loop" 8 "github.com/m4gshm/gollections/iter" 9 "github.com/m4gshm/gollections/k" 10 kviter "github.com/m4gshm/gollections/kv/iter" 11 "github.com/m4gshm/gollections/kv/loop" 12 "github.com/m4gshm/gollections/slice" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func Test_Collect_Group(t *testing.T) { 17 pairs := kviter.OfPairs(k.V(1, "1"), k.V(2, "2"), k.V(2, "22")) 18 groups := kviter.Group[int, string](pairs) 19 20 assert.Equal(t, len(groups), 2) 21 assert.Equal(t, []string{"1"}, groups[1]) 22 assert.Equal(t, []string{"2", "22"}, groups[2]) 23 } 24 25 func Test_Collect_Map(t *testing.T) { 26 groups := loop.ToMap(kviter.FromPairs[int, string](iter.Of(k.V(1, "1"), k.V(2, "2"), k.V(2, "22"))).Next) 27 28 assert.Equal(t, len(groups), 2) 29 assert.Equal(t, "1", groups[1]) 30 assert.Equal(t, "2", groups[2]) 31 } 32 33 type rows[T any] struct { 34 in []T 35 cursor int 36 } 37 38 func (r *rows[T]) hasNext() bool { 39 return r.cursor < len(r.in) 40 } 41 42 func (r *rows[T]) next() (T, error) { 43 e := r.in[r.cursor] 44 r.cursor++ 45 if r.cursor > 3 { 46 var no T 47 return no, errors.New("next error") 48 } 49 return e, nil 50 } 51 52 func Test_OfLoop(t *testing.T) { 53 data := &rows[int]{slice.Of(1, 2, 3), 0} 54 55 evens := func(r *rows[int]) (bool, int, error) { 56 next, err := r.next() 57 if err != nil { 58 return false, 0, err 59 } 60 return next%2 == 0, next, nil 61 } 62 63 iterator := breakLoop.New(data, (*rows[int]).hasNext, evens) 64 65 m, err := breakLoop.ToMap(iterator) 66 67 assert.Equal(t, 2, m[true]) 68 assert.Equal(t, 1, m[false]) 69 assert.Nil(t, err) 70 71 streamWithError := &rows[int]{slice.Of(1, 2, 3, 4), 0} 72 iterWithError := breakLoop.New(streamWithError, (*rows[int]).hasNext, evens) 73 m2, err2 := breakLoop.ToMap(iterWithError) 74 75 assert.Equal(t, 2, m2[true]) 76 assert.Equal(t, "next error", err2.Error()) 77 }