1 package iter
2
3 import (
4 "errors"
5 "fmt"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9 )
10
11 func ExampleMapper() {
12 input := []int{1, 2, 3, 4}
13 mapper := Mapper[int, bool]{
14 MaxGoroutines: len(input) / 2,
15 }
16
17 results := mapper.Map(input, func(v *int) bool { return *v%2 == 0 })
18 fmt.Println(results)
19
20
21 }
22
23 func TestMap(t *testing.T) {
24 t.Parallel()
25
26 t.Run("empty", func(t *testing.T) {
27 t.Parallel()
28 f := func() {
29 ints := []int{}
30 Map(ints, func(val *int) int {
31 panic("this should never be called")
32 })
33 }
34 require.NotPanics(t, f)
35 })
36
37 t.Run("panic is propagated", func(t *testing.T) {
38 t.Parallel()
39 f := func() {
40 ints := []int{1}
41 Map(ints, func(val *int) int {
42 panic("super bad thing happened")
43 })
44 }
45 require.Panics(t, f)
46 })
47
48 t.Run("mutating inputs is fine, though not recommended", func(t *testing.T) {
49 t.Parallel()
50 ints := []int{1, 2, 3, 4, 5}
51 Map(ints, func(val *int) int {
52 *val += 1
53 return 0
54 })
55 require.Equal(t, []int{2, 3, 4, 5, 6}, ints)
56 })
57
58 t.Run("basic increment", func(t *testing.T) {
59 t.Parallel()
60 ints := []int{1, 2, 3, 4, 5}
61 res := Map(ints, func(val *int) int {
62 return *val + 1
63 })
64 require.Equal(t, []int{2, 3, 4, 5, 6}, res)
65 require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
66 })
67
68 t.Run("huge inputs", func(t *testing.T) {
69 t.Parallel()
70 ints := make([]int, 10000)
71 res := Map(ints, func(val *int) int {
72 return 1
73 })
74 expected := make([]int, 10000)
75 for i := 0; i < 10000; i++ {
76 expected[i] = 1
77 }
78 require.Equal(t, expected, res)
79 })
80 }
81
82 func TestMapErr(t *testing.T) {
83 t.Parallel()
84
85 t.Run("empty", func(t *testing.T) {
86 t.Parallel()
87 f := func() {
88 ints := []int{}
89 res, err := MapErr(ints, func(val *int) (int, error) {
90 panic("this should never be called")
91 })
92 require.NoError(t, err)
93 require.Equal(t, ints, res)
94 }
95 require.NotPanics(t, f)
96 })
97
98 t.Run("panic is propagated", func(t *testing.T) {
99 t.Parallel()
100 f := func() {
101 ints := []int{1}
102 _, _ = MapErr(ints, func(val *int) (int, error) {
103 panic("super bad thing happened")
104 })
105 }
106 require.Panics(t, f)
107 })
108
109 t.Run("mutating inputs is fine, though not recommended", func(t *testing.T) {
110 t.Parallel()
111 ints := []int{1, 2, 3, 4, 5}
112 res, err := MapErr(ints, func(val *int) (int, error) {
113 *val += 1
114 return 0, nil
115 })
116 require.NoError(t, err)
117 require.Equal(t, []int{2, 3, 4, 5, 6}, ints)
118 require.Equal(t, []int{0, 0, 0, 0, 0}, res)
119 })
120
121 t.Run("basic increment", func(t *testing.T) {
122 t.Parallel()
123 ints := []int{1, 2, 3, 4, 5}
124 res, err := MapErr(ints, func(val *int) (int, error) {
125 return *val + 1, nil
126 })
127 require.NoError(t, err)
128 require.Equal(t, []int{2, 3, 4, 5, 6}, res)
129 require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
130 })
131
132 err1 := errors.New("error1")
133 err2 := errors.New("error1")
134
135 t.Run("error is propagated", func(t *testing.T) {
136 t.Parallel()
137 ints := []int{1, 2, 3, 4, 5}
138 res, err := MapErr(ints, func(val *int) (int, error) {
139 if *val == 3 {
140 return 0, err1
141 }
142 return *val + 1, nil
143 })
144 require.ErrorIs(t, err, err1)
145 require.Equal(t, []int{2, 3, 0, 5, 6}, res)
146 require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
147 })
148
149 t.Run("multiple errors are propagated", func(t *testing.T) {
150 t.Parallel()
151 ints := []int{1, 2, 3, 4, 5}
152 res, err := MapErr(ints, func(val *int) (int, error) {
153 if *val == 3 {
154 return 0, err1
155 }
156 if *val == 4 {
157 return 0, err2
158 }
159 return *val + 1, nil
160 })
161 require.ErrorIs(t, err, err1)
162 require.ErrorIs(t, err, err2)
163 require.Equal(t, []int{2, 3, 0, 0, 6}, res)
164 require.Equal(t, []int{1, 2, 3, 4, 5}, ints)
165 })
166
167 t.Run("huge inputs", func(t *testing.T) {
168 t.Parallel()
169 ints := make([]int, 10000)
170 res := Map(ints, func(val *int) int {
171 return 1
172 })
173 expected := make([]int, 10000)
174 for i := 0; i < 10000; i++ {
175 expected[i] = 1
176 }
177 require.Equal(t, expected, res)
178 })
179 }
180
View as plain text