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 }