4
4
"fmt"
5
5
"github.com/stretchr/testify/assert"
6
6
"github.com/thecasualcoder/godash"
7
+ "sort"
7
8
"testing"
8
9
)
9
10
@@ -141,6 +142,164 @@ func TestMap(t *testing.T) {
141
142
})
142
143
}
143
144
145
+ func TestMapForMap (t * testing.T ) {
146
+ t .Run ("support primitive type values" , func (t * testing.T ) {
147
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
148
+ out := make ([]int , 0 )
149
+
150
+ err := godash .Map (in , & out , func (key string , value int ) int {
151
+ return value * value
152
+ })
153
+
154
+ expected := []int {1 , 4 , 9 }
155
+ assert .NoError (t , err )
156
+ assert .ElementsMatch (t , expected , out )
157
+ })
158
+
159
+ t .Run ("support structs" , func (t * testing.T ) {
160
+ type person struct {
161
+ name string
162
+ }
163
+
164
+ in := map [string ]person {
165
+ "person1" : {name : "john" },
166
+ "person2" : {name : "doe" },
167
+ }
168
+ out := make ([]string , 0 )
169
+ expected := []string {"john" , "doe" }
170
+
171
+ err := godash .Map (in , & out , func (key string , value person ) string {
172
+ return value .name
173
+ })
174
+
175
+ assert .NoError (t , err )
176
+ assert .ElementsMatch (t , expected , out )
177
+ })
178
+
179
+ squared := func (key string , value int ) int {
180
+ return value * value
181
+ }
182
+
183
+ t .Run ("should not panic if output is nil" , func (t * testing.T ) {
184
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
185
+
186
+ {
187
+ var out []int
188
+
189
+ err := godash .Map (in , out , squared )
190
+
191
+ assert .EqualError (t , err , "output is nil. Pass a reference to set output" )
192
+ }
193
+
194
+ {
195
+ err := godash .Map (in , nil , squared )
196
+
197
+ assert .EqualError (t , err , "output is nil. Pass a reference to set output" )
198
+ }
199
+ })
200
+
201
+ t .Run ("should not panic if output is not a slice" , func (t * testing.T ) {
202
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
203
+
204
+ var out int
205
+
206
+ err := godash .Map (in , & out , squared )
207
+
208
+ assert .EqualError (t , err , "output should be a slice for input of type slice" )
209
+ })
210
+
211
+ t .Run ("should not accept mapper function that are not functions" , func (t * testing.T ) {
212
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
213
+ var out []int
214
+
215
+ err := godash .Map (in , & out , 7 )
216
+
217
+ assert .EqualError (t , err , "mapperFn has to be a function" )
218
+ })
219
+
220
+ t .Run ("should not accept mapper function that do not take exactly two arguments" , func (t * testing.T ) {
221
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
222
+ var out []int
223
+
224
+ {
225
+ err := godash .Map (in , & out , func () int { return 0 })
226
+ assert .EqualError (t , err , "mapper function has to take exactly two arguments" )
227
+ }
228
+
229
+ {
230
+ err := godash .Map (in , & out , func (int ) int { return 0 })
231
+ assert .EqualError (t , err , "mapper function has to take exactly two arguments" )
232
+ }
233
+
234
+ {
235
+ err := godash .Map (in , & out , func (int , int , int ) int { return 0 })
236
+ assert .EqualError (t , err , "mapper function has to take exactly two arguments" )
237
+ }
238
+ })
239
+
240
+ t .Run ("should not accept mapper function that do not return exactly one value" , func (t * testing.T ) {
241
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
242
+ var out []int
243
+
244
+ {
245
+ err := godash .Map (in , & out , func (int , int ) {})
246
+ assert .EqualError (t , err , "mapper function should return only one return value" )
247
+ }
248
+
249
+ {
250
+ err := godash .Map (in , & out , func (int , int ) (int , int ) { return 0 , 0 })
251
+ assert .EqualError (t , err , "mapper function should return only one return value" )
252
+ }
253
+ })
254
+
255
+ t .Run ("should accept mapper function whose first argument's kind should be map's key kind" , func (t * testing.T ) {
256
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
257
+
258
+ var out []int
259
+
260
+ {
261
+ err := godash .Map (in , & out , func (int , int ) string { return "" })
262
+ assert .EqualError (t , err , "mapper function's first argument (int) has to be (string)" )
263
+ }
264
+
265
+ {
266
+ err := godash .Map (in , & out , func (string , int ) int { return 0 })
267
+ assert .NoError (t , err )
268
+ }
269
+ })
270
+
271
+ t .Run ("should accept mapper function whose second argument's kind should be map's value kind" , func (t * testing.T ) {
272
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
273
+
274
+ var out []int
275
+
276
+ {
277
+ err := godash .Map (in , & out , func (string , string ) string { return "" })
278
+ assert .EqualError (t , err , "mapper function's second argument (string) has to be (int)" )
279
+ }
280
+
281
+ {
282
+ err := godash .Map (in , & out , func (string , int ) int { return 0 })
283
+ assert .NoError (t , err )
284
+ }
285
+ })
286
+
287
+ t .Run ("should accept mapper function whose return's kind should be output slice's element kind" , func (t * testing.T ) {
288
+ in := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 }
289
+ var out []string
290
+
291
+ {
292
+ err := godash .Map (in , & out , func (string , int ) int { return 0 })
293
+ assert .EqualError (t , err , "mapper function's return type has to be (int) but is (string)" )
294
+ }
295
+
296
+ {
297
+ err := godash .Map (in , & out , func (string , int ) string { return "" })
298
+ assert .NoError (t , err )
299
+ }
300
+ })
301
+ }
302
+
144
303
func ExampleMap () {
145
304
input := []int {0 , 1 , 2 , 3 , 4 }
146
305
var output []string
@@ -153,3 +312,17 @@ func ExampleMap() {
153
312
154
313
// Output: [0 1 4 9 16]
155
314
}
315
+
316
+ func ExampleMap_map () {
317
+ input := map [string ]int {"key1" : 1 , "key2" : 2 , "key3" : 3 , "key4" : 4 , "key5" : 5 }
318
+ var output []int
319
+
320
+ _ = godash .Map (input , & output , func (key string , num int ) int {
321
+ return num * num
322
+ })
323
+
324
+ sort .Ints (output )
325
+ fmt .Println (output )
326
+
327
+ // Unordered Output: [1 4 9 16 25]
328
+ }
0 commit comments