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  }