github.com/m4gshm/gollections@v0.0.10/map_/test/api_test.go (about) 1 package test 2 3 import ( 4 "strconv" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 9 "github.com/m4gshm/gollections/convert/ptr" 10 "github.com/m4gshm/gollections/map_" 11 "github.com/m4gshm/gollections/map_/clone" 12 "github.com/m4gshm/gollections/map_/group" 13 "github.com/m4gshm/gollections/map_/resolv" 14 "github.com/m4gshm/gollections/op" 15 "github.com/m4gshm/gollections/slice" 16 "github.com/m4gshm/gollections/slice/clone/sort" 17 ) 18 19 type entity struct{ val string } 20 21 var ( 22 first = entity{"1_first"} 23 second = entity{"2_second"} 24 third = entity{"3_third"} 25 26 entities = map[int]*entity{1: &first, 2: &second, 3: &third} 27 ) 28 29 func Test_Clone(t *testing.T) { 30 c := clone.Of(entities) 31 32 assert.Equal(t, entities, c) 33 assert.NotSame(t, entities, c) 34 35 for k := range entities { 36 assert.Same(t, entities[k], c[k]) 37 } 38 } 39 40 func Test_DeepClone(t *testing.T) { 41 c := clone.Deep(entities, func(e *entity) *entity { return ptr.Of(*e) }) 42 43 assert.Equal(t, entities, c) 44 assert.NotSame(t, entities, c) 45 46 for i := range entities { 47 assert.Equal(t, entities[i], c[i]) 48 assert.NotSame(t, entities[i], c[i]) 49 } 50 } 51 52 func Test_Keys(t *testing.T) { 53 keys := map_.Keys(entities) 54 assert.Equal(t, slice.Of(1, 2, 3), sort.Of(keys)) 55 } 56 57 func Test_Values(t *testing.T) { 58 values := map_.Values(entities) 59 assert.Equal(t, slice.Of(&first, &second, &third), sort.By(values, func(e *entity) string { return e.val })) 60 } 61 62 func Test_ConvertValues(t *testing.T) { 63 var strValues map[int]string = map_.ConvertValues(entities, func(e *entity) string { return e.val }) 64 65 assert.Equal(t, "1_first", strValues[1]) 66 assert.Equal(t, "2_second", strValues[2]) 67 assert.Equal(t, "3_third", strValues[3]) 68 } 69 70 func Test_ValuesConverted(t *testing.T) { 71 var values []string = map_.ValuesConverted(entities, func(e *entity) string { return e.val }) 72 assert.Equal(t, slice.Of("1_first", "2_second", "3_third"), sort.Of(values)) 73 } 74 75 type rows[T any] struct { 76 in []T 77 cursor int 78 } 79 80 func (r *rows[T]) hasNext() bool { return r.cursor < len(r.in) } 81 func (r *rows[T]) next() (T, error) { e := r.in[r.cursor]; r.cursor++; return e, nil } 82 83 func Test_OfLoop(t *testing.T) { 84 stream := &rows[int]{slice.Of(1, 2, 3), 0} 85 result, _ := map_.OfLoop(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) { 86 n, err := r.next() 87 return n%2 == 0, n, err 88 }) 89 90 assert.Equal(t, 2, result[true]) 91 assert.Equal(t, 1, result[false]) 92 } 93 94 func Test_OfLoopResolv(t *testing.T) { 95 stream := &rows[int]{slice.Of(1, 2, 3, 4), 0} 96 result, _ := map_.OfLoopResolv(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) { 97 n, err := r.next() 98 return n%2 == 0, n, err 99 }, resolv.Last[bool, int]) 100 101 assert.Equal(t, 4, result[true]) 102 assert.Equal(t, 3, result[false]) 103 } 104 105 func Test_Generate(t *testing.T) { 106 counter := 0 107 result, _ := map_.Generate(func() (bool, int, bool, error) { counter++; return counter%2 == 0, counter, counter < 4, nil }) 108 109 assert.Equal(t, 2, result[true]) 110 assert.Equal(t, 1, result[false]) 111 } 112 113 func Test_GenerateResolv(t *testing.T) { 114 counter := 0 115 result, _ := map_.GenerateResolv(func() (bool, int, bool, error) { 116 counter++ 117 return counter%2 == 0, counter, counter < 5, nil 118 }, func(exists bool, k bool, old, new int) int { 119 return op.IfElse(exists, op.IfElse(k, new, old), new) 120 }) 121 122 assert.Equal(t, 4, result[true]) 123 assert.Equal(t, 1, result[false]) 124 } 125 126 func Test_GroupOfLoop(t *testing.T) { 127 stream := &rows[int]{slice.Of(1, 2, 3), 0} 128 result, _ := group.OfLoop(stream, (*rows[int]).hasNext, func(r *rows[int]) (bool, int, error) { 129 n, err := r.next() 130 return n%2 == 0, n, err 131 }) 132 133 assert.Equal(t, slice.Of(2), result[true]) 134 assert.Equal(t, slice.Of(1, 3), result[false]) 135 } 136 137 func Test_StringRepresentation(t *testing.T) { 138 order := slice.Of(4, 3, 2, 1) 139 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 140 actual := map_.ToStringOrdered(order, elements) 141 142 expected := "[4:4 3:3 2:2 1:1]" 143 assert.Equal(t, expected, actual) 144 } 145 146 func Test_Reduce(t *testing.T) { 147 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 148 k, _ := map_.Reduce(elements, func(k, k2 int, v, v2 string) (int, string) { 149 return k + k2, "" 150 }) 151 152 assert.Equal(t, 1+2+3+4, k) 153 } 154 155 func Test_MatchAny(t *testing.T) { 156 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 157 ok := map_.HasAny(elements, func(k int, v string) bool { 158 return k == 2 || v == "4" 159 }) 160 161 assert.True(t, ok) 162 163 noOk := map_.HasAny(elements, func(k int, v string) bool { 164 return k > 5 165 }) 166 167 assert.False(t, noOk) 168 } 169 170 func Test_ToSlice(t *testing.T) { 171 result := map_.ToSlice(entities, func(key int, val *entity) string { return strconv.Itoa(key) + ":" + val.val }) 172 assert.Equal(t, slice.Of("1:1_first", "2:2_second", "3:3_third"), sort.Of(result)) 173 } 174 175 func Test_ToSliceErrorable(t *testing.T) { 176 result, _ := map_.ToSlicee(entities, func(key int, val *entity) (int, error) { 177 v, err := strconv.Atoi(string(val.val[0])) 178 return v + key, err 179 }) 180 assert.Equal(t, slice.Of(2, 4, 6), sort.Of(result)) 181 } 182 183 func Test_Filter(t *testing.T) { 184 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 185 186 result := map_.Filter(elements, func(key int, val string) bool { return key <= 2 || val == "4" }) 187 check := map_.KeyChecker(result) 188 assert.Equal(t, 3, len(result)) 189 assert.True(t, check(1)) 190 assert.True(t, check(2)) 191 assert.False(t, check(3)) 192 assert.True(t, check(4)) 193 } 194 195 func Test_FilterKeys(t *testing.T) { 196 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 197 198 result := map_.FilterKeys(elements, func(key int) bool { return key <= 2 }) 199 check := map_.KeyChecker(result) 200 assert.Equal(t, 2, len(result)) 201 assert.True(t, check(1)) 202 assert.True(t, check(2)) 203 assert.False(t, check(3)) 204 assert.False(t, check(4)) 205 } 206 207 func Test_FilterValues(t *testing.T) { 208 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 209 210 result := map_.FilterValues(elements, func(val string) bool { return val <= "2" }) 211 check := map_.KeyChecker(result) 212 assert.Equal(t, 2, len(result)) 213 assert.True(t, check(1)) 214 assert.True(t, check(2)) 215 assert.False(t, check(3)) 216 assert.False(t, check(4)) 217 } 218 219 func Test_Getter(t *testing.T) { 220 elements := map[int]string{4: "4", 2: "2", 1: "1", 3: "3"} 221 222 getter := map_.Getter(elements) 223 assert.Equal(t, "1", getter(1)) 224 assert.Equal(t, "2", getter(2)) 225 assert.Equal(t, "3", getter(3)) 226 assert.Equal(t, "4", getter(4)) 227 228 nilGetter := map_.Getter[map[int]string](nil) 229 230 assert.Equal(t, "", nilGetter(0)) 231 232 getterOk := map_.GetterOk(elements) 233 234 _, ok := getterOk(1) 235 assert.True(t, ok) 236 _, ok = getterOk(0) 237 assert.False(t, ok) 238 }