1package funk
2
3import (
4	"testing"
5
6	"github.com/stretchr/testify/assert"
7)
8
9func TestZipEmptyResult(t *testing.T) {
10	map1 := map[string]int{"a": 1, "b": 2}
11	array1 := []int{21, 22, 23}
12	emptySlice := []int{}
13
14	t.Run("NonSliceOrArray", func(t *testing.T) {
15		assert.Panics(t, func() { Zip(map1, array1) }, "It should panic")
16	})
17
18	t.Run("ZerosSized", func(t *testing.T) {
19		expected := []Tuple{}
20		result := Zip(emptySlice, array1)
21		assert.Equal(t, result, expected)
22	})
23}
24
25func zipIntsAndAssert(t *testing.T, data1, data2 interface{}) {
26	t.Run("FirstOneShorter", func(t *testing.T) {
27		expected := []Tuple{
28			{Element1: 11, Element2: 21},
29			{Element1: 12, Element2: 22},
30			{Element1: 13, Element2: 23},
31		}
32		result := Zip(data1, data2)
33		assert.Equal(t, result, expected)
34	})
35
36	t.Run("SecondOneShorter", func(t *testing.T) {
37		expected := []Tuple{
38			{Element1: 21, Element2: 11},
39			{Element1: 22, Element2: 12},
40			{Element1: 23, Element2: 13},
41		}
42		result := Zip(data2, data1)
43		assert.Equal(t, result, expected)
44	})
45}
46
47func TestZipSlices(t *testing.T) {
48	slice1 := []int{11, 12, 13}
49	slice2 := []int{21, 22, 23, 24, 25}
50	zipIntsAndAssert(t, slice1, slice2)
51}
52
53func TestZipArrays(t *testing.T) {
54	array1 := [...]int{11, 12, 13}
55	array2 := [...]int{21, 22, 23, 24, 25}
56	zipIntsAndAssert(t, array1, array2)
57}
58
59func TestZipStructs(t *testing.T) {
60	type struct1 struct {
61		Member1 uint16
62		Member2 string
63	}
64	type struct2 struct {
65		Member3 bool
66	}
67	type struct3 struct {
68		Member4 int
69		Member5 struct2
70	}
71
72	slice1 := []struct1{
73		{
74			Member1: 11,
75			Member2: "a",
76		},
77		{
78			Member1: 12,
79			Member2: "b",
80		},
81		{
82			Member1: 13,
83			Member2: "c",
84		},
85	}
86	slice2 := []struct3{
87		{
88			Member4: 21,
89			Member5: struct2{
90				Member3: false,
91			},
92		},
93		{
94			Member4: 22,
95			Member5: struct2{
96				Member3: true,
97			},
98		},
99	}
100
101	expected := []Tuple{
102		{
103			Element1: struct1{
104				Member1: 11,
105				Member2: "a",
106			},
107			Element2: struct3{
108				Member4: 21,
109				Member5: struct2{
110					Member3: false,
111				},
112			},
113		},
114		{
115			Element1: struct1{
116				Member1: 12,
117				Member2: "b",
118			},
119			Element2: struct3{
120				Member4: 22,
121				Member5: struct2{
122					Member3: true,
123				},
124			},
125		},
126	}
127
128	result := Zip(slice1, slice2)
129	assert.Equal(t, expected, result)
130}
131