github.com/m4gshm/gollections@v0.0.10/break/loop/test/api_test.go (about)

     1  package test
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	breakKvLoop "github.com/m4gshm/gollections/break/kv/loop"
    11  	breakLoop "github.com/m4gshm/gollections/break/loop"
    12  	"github.com/m4gshm/gollections/convert/as"
    13  	"github.com/m4gshm/gollections/loop"
    14  	"github.com/m4gshm/gollections/loop/convert"
    15  	"github.com/m4gshm/gollections/op"
    16  	"github.com/m4gshm/gollections/predicate/eq"
    17  	"github.com/m4gshm/gollections/predicate/more"
    18  	"github.com/m4gshm/gollections/slice"
    19  )
    20  
    21  func Test_ReduceSum(t *testing.T) {
    22  	s := loop.Of(1, 3, 5, 7, 9, 11)
    23  	r, _ := breakLoop.Reduce(breakLoop.From(s), op.Sum[int])
    24  	assert.Equal(t, 1+3+5+7+9+11, r)
    25  }
    26  
    27  func Test_EmptyLoop(t *testing.T) {
    28  	s := breakLoop.Of[int]()
    29  	r, _ := breakLoop.Reduce(s, op.Sum[int])
    30  	assert.Equal(t, 0, r)
    31  }
    32  
    33  func Test_Sum(t *testing.T) {
    34  	s := loop.Of(1, 3, 5, 7, 9, 11)
    35  	r, _ := breakLoop.Sum(breakLoop.From(s))
    36  	assert.Equal(t, 1+3+5+7+9+11, r)
    37  }
    38  
    39  func Test_Convert(t *testing.T) {
    40  	s := loop.Of(1, 3, 5, 7, 9, 11)
    41  	r := breakLoop.Convert(breakLoop.From(s), strconv.Itoa)
    42  	o, _ := breakLoop.Slice(r.Next)
    43  	assert.Equal(t, []string{"1", "3", "5", "7", "9", "11"}, o)
    44  }
    45  
    46  func Test_IterWitErr(t *testing.T) {
    47  	s := breakLoop.From(loop.Of("1", "3", "5", "7eee", "9", "11"))
    48  	r := []int{}
    49  	var outErr error
    50  	for it, i, ok, err := breakLoop.Conv(s, strconv.Atoi).Start(); ok || err != nil; i, ok, err = it.Next() {
    51  		if err != nil {
    52  			outErr = err
    53  			break
    54  		}
    55  		r = append(r, i)
    56  	}
    57  
    58  	assert.Error(t, outErr)
    59  	assert.Equal(t, []int{1, 3, 5}, r)
    60  
    61  	s = breakLoop.From(loop.Of("1", "3", "5", "7eee", "9", "11"))
    62  	r = []int{}
    63  	//ignore err
    64  	for it, i, ok, err := breakLoop.Conv(s, strconv.Atoi).Start(); ok || err != nil; i, ok, err = it.Next() {
    65  		if err == nil {
    66  			r = append(r, i)
    67  		}
    68  	}
    69  	assert.Equal(t, []int{1, 3, 5, 9, 11}, r)
    70  }
    71  
    72  func Test_NotNil(t *testing.T) {
    73  	type entity struct{ val string }
    74  	var (
    75  		source   = breakLoop.Of([]*entity{{"first"}, nil, {"third"}, nil, {"fifth"}}...)
    76  		result   = breakLoop.NotNil(source)
    77  		expected = []*entity{{"first"}, {"third"}, {"fifth"}}
    78  	)
    79  	o, _ := breakLoop.Slice(result.Next)
    80  	assert.Equal(t, expected, o)
    81  }
    82  
    83  func Test_ConvertPointersToValues(t *testing.T) {
    84  	type entity struct{ val string }
    85  	var (
    86  		source   = breakLoop.Of([]*entity{{"first"}, nil, {"third"}, nil, {"fifth"}}...)
    87  		result   = breakLoop.PtrVal(source)
    88  		expected = []entity{{"first"}, {}, {"third"}, {}, {"fifth"}}
    89  	)
    90  	o, _ := breakLoop.Slice(result.Next)
    91  	assert.Equal(t, expected, o)
    92  }
    93  
    94  func Test_ConvertNotnilPointersToValues(t *testing.T) {
    95  	type entity struct{ val string }
    96  	var (
    97  		source   = breakLoop.Of([]*entity{{"first"}, nil, {"third"}, nil, {"fifth"}}...)
    98  		result   = breakLoop.NoNilPtrVal(source)
    99  		expected = []entity{{"first"}, {"third"}, {"fifth"}}
   100  	)
   101  	o, _ := breakLoop.Slice(result.Next)
   102  	assert.Equal(t, expected, o)
   103  }
   104  
   105  func Test_ConvertNotNil(t *testing.T) {
   106  	type entity struct{ val string }
   107  	var (
   108  		source   = loop.Of([]*entity{{"first"}, nil, {"third"}, nil, {"fifth"}}...)
   109  		result   = convert.NotNil(source, func(e *entity) string { return e.val })
   110  		expected = []string{"first", "third", "fifth"}
   111  	)
   112  	assert.Equal(t, expected, loop.Slice(result.Next))
   113  }
   114  
   115  func Test_ConvertToNotNil(t *testing.T) {
   116  	type entity struct{ val *string }
   117  	var (
   118  		first    = "first"
   119  		third    = "third"
   120  		fifth    = "fifth"
   121  		source   = loop.Of([]entity{{&first}, {}, {&third}, {}, {&fifth}}...)
   122  		result   = convert.ToNotNil(source, func(e entity) *string { return e.val })
   123  		expected = []*string{&first, &third, &fifth}
   124  	)
   125  	assert.Equal(t, expected, loop.Slice(result.Next))
   126  }
   127  
   128  func Test_ConvertNilSafe(t *testing.T) {
   129  	type entity struct{ val *string }
   130  	var (
   131  		first    = "first"
   132  		third    = "third"
   133  		fifth    = "fifth"
   134  		source   = loop.Of([]*entity{{&first}, {}, {&third}, nil, {&fifth}}...)
   135  		result   = convert.NilSafe(source, func(e *entity) *string { return e.val })
   136  		expected = []*string{&first, &third, &fifth}
   137  	)
   138  	assert.Equal(t, expected, loop.Slice(result.Next))
   139  }
   140  
   141  var even = func(v int) bool { return v%2 == 0 }
   142  
   143  func Test_ConvertFiltered(t *testing.T) {
   144  	s := loop.Of(1, 3, 4, 5, 7, 8, 9, 11)
   145  	r := breakLoop.FilterAndConvert(breakLoop.From(s), even, strconv.Itoa)
   146  	o, _ := breakLoop.Slice(r.Next)
   147  	assert.Equal(t, []string{"4", "8"}, o)
   148  }
   149  
   150  func Test_ConvertFilteredInplace(t *testing.T) {
   151  	s := loop.Of(1, 3, 4, 5, 7, 8, 9, 11)
   152  	r := breakLoop.ConvCheck(breakLoop.From(s), func(i int) (string, bool, error) { return strconv.Itoa(i), even(i), nil })
   153  	o, _ := breakLoop.Slice(r.Next)
   154  	assert.Equal(t, []string{"4", "8"}, o)
   155  }
   156  
   157  func Test_Flatt(t *testing.T) {
   158  	md := loop.Of([][]int{{1, 2, 3}, {4}, {5, 6}}...)
   159  	f := breakLoop.Flat(breakLoop.From(md), as.Is[[]int])
   160  	e := []int{1, 2, 3, 4, 5, 6}
   161  	o, _ := breakLoop.Slice(f.Next)
   162  	assert.Equal(t, e, o)
   163  }
   164  
   165  func Test_FlattFilter(t *testing.T) {
   166  	md := loop.Of([][]int{{1, 2, 3}, {4}, {5, 6}}...)
   167  	f := breakLoop.FilterAndFlat(breakLoop.From(md), func(from []int) bool { return len(from) > 1 }, as.Is[[]int])
   168  	e := []int{1, 2, 3, 5, 6}
   169  	o, _ := breakLoop.Slice(f.Next)
   170  	assert.Equal(t, e, o)
   171  }
   172  
   173  func Test_FlattElemFilter(t *testing.T) {
   174  	md := loop.Of([][]int{{1, 2, 3}, {4}, {5, 6}}...)
   175  	f := breakLoop.FlattAndFilter(breakLoop.From(md), as.Is[[]int], even)
   176  	e := []int{2, 4, 6}
   177  	o, _ := breakLoop.Slice(f.Next)
   178  	assert.Equal(t, e, o)
   179  }
   180  
   181  func Test_FilterAndFlattFilt(t *testing.T) {
   182  	md := loop.Of([][]int{{1, 2, 3}, {4}, {5, 6}}...)
   183  	f := breakLoop.FilterFlatFilter(breakLoop.From(md), func(from []int) bool { return len(from) > 1 }, as.Is[[]int], even)
   184  	e := []int{2, 6}
   185  	o, _ := breakLoop.Slice(f.Next)
   186  	assert.Equal(t, e, o)
   187  }
   188  
   189  func Test_Filter(t *testing.T) {
   190  	s := loop.Of(1, 3, 4, 5, 7, 8, 9, 11)
   191  	f := breakLoop.Filter(breakLoop.From(s), even)
   192  	e := []int{4, 8}
   193  	o, _ := breakLoop.Slice(f.Next)
   194  	assert.Equal(t, e, o)
   195  }
   196  
   197  func Test_Filtering(t *testing.T) {
   198  	r := breakLoop.Filt(breakLoop.From(loop.Of(1, 2, 3, 4, 5, 6)), func(i int) (bool, error) { return i%2 == 0, nil })
   199  	o, _ := breakLoop.Slice(r.Next)
   200  	assert.Equal(t, []int{2, 4, 6}, o)
   201  }
   202  
   203  func Test_MatchAny(t *testing.T) {
   204  	elements := loop.Of(1, 2, 3, 4)
   205  
   206  	ok, _ := breakLoop.HasAny(breakLoop.From(elements), eq.To(4))
   207  	assert.True(t, ok)
   208  
   209  	noOk, _ := breakLoop.HasAny(breakLoop.From(elements), more.Than(5))
   210  	assert.False(t, noOk)
   211  }
   212  
   213  type Role struct {
   214  	name string
   215  }
   216  
   217  type User struct {
   218  	name  string
   219  	age   int
   220  	roles []Role
   221  }
   222  
   223  func (u User) Name() string  { return u.name }
   224  func (u User) Age() int      { return u.age }
   225  func (u User) Roles() []Role { return u.roles }
   226  
   227  var users = []User{
   228  	{name: "Bob", age: 26, roles: []Role{{"Admin"}, {"manager"}}},
   229  	{name: "Alice", age: 35, roles: []Role{{"Manager"}}},
   230  	{name: "Tom", age: 18}, {},
   231  }
   232  
   233  func Test_KeyValuer(t *testing.T) {
   234  	m, _ := breakKvLoop.Group(breakLoop.KeyValue(breakLoop.From(loop.Of(users...)), User.Name, User.Age).Next)
   235  
   236  	assert.Equal(t, m["Alice"], slice.Of(35))
   237  	assert.Equal(t, m["Bob"], slice.Of(26))
   238  	assert.Equal(t, m["Tom"], slice.Of(18))
   239  
   240  	g, _ := breakLoop.Group(breakLoop.From(loop.Of(users...)), User.Name, User.Age)
   241  	assert.Equal(t, m, g)
   242  }
   243  
   244  func Test_Keyer(t *testing.T) {
   245  	m, _ := breakKvLoop.Group(breakLoop.ExtraKey(breakLoop.From(loop.Of(users...)), User.Name).Next)
   246  
   247  	assert.Equal(t, m["Alice"], slice.Of(users[1]))
   248  	assert.Equal(t, m["Bob"], slice.Of(users[0]))
   249  	assert.Equal(t, m["Tom"], slice.Of(users[2]))
   250  
   251  	g := loop.Group(loop.Of(users...), User.Name, as.Is[User])
   252  	assert.Equal(t, m, g)
   253  }
   254  
   255  func Test_Valuer(t *testing.T) {
   256  	bob, bobRoles, _, _ := breakLoop.ExtraValue(breakLoop.From(loop.Of(users...)), User.Roles).Next()
   257  
   258  	assert.Equal(t, bob, users[0])
   259  	assert.Equal(t, bobRoles, users[0].roles)
   260  }
   261  
   262  func Test_MultiValuer(t *testing.T) {
   263  	l := breakLoop.ExtraVals(breakLoop.From(loop.Of(users...)), User.Roles)
   264  	bob, bobRole, _, _ := l.Next()
   265  	bob2, bobRole2, _, _ := l.Next()
   266  
   267  	assert.Equal(t, bob, users[0])
   268  	assert.Equal(t, bob2, users[0])
   269  	assert.Equal(t, bobRole, users[0].roles[0])
   270  	assert.Equal(t, bobRole2, users[0].roles[1])
   271  }
   272  
   273  func Test_MultipleKeyValuer(t *testing.T) {
   274  	m, _ := breakKvLoop.Group(breakLoop.KeysValues(breakLoop.From(loop.Of(users...)),
   275  		func(u User) ([]string, error) {
   276  			return slice.Convert(u.roles, func(r Role) string { return strings.ToLower(r.name) }), nil
   277  		},
   278  		func(u User) ([]string, error) { return []string{u.name, strings.ToLower(u.name)}, nil },
   279  	).Next)
   280  
   281  	assert.Equal(t, m["admin"], slice.Of("Bob", "bob"))
   282  	assert.Equal(t, m["manager"], slice.Of("Bob", "bob", "Alice", "alice"))
   283  	assert.Equal(t, m[""], slice.Of("Tom", "tom", "", ""))
   284  }