v2 / vlib / builtin / fixed_array_test.v
498 lines · 425 sloc · 10.43 KB · 25d72fef689d2f0d18beaa6dceaef9f6b622d6b5
Raw
1fn a() {}
2
3fn b() {}
4
5fn c() {}
6
7fn v() {}
8
9fn test_any_all_of_ints() {
10 ia := [1, 2, 3]!
11
12 assert ia.any(it > 2)
13 assert ia.any(|x| x > 2)
14 assert [1, 2, 3]!.any(it > 2)
15 assert [1, 2, 3]!.any(|x| x > 2)
16
17 assert !ia.all(it > 1)
18 assert !ia.all(|x| x > 1)
19 assert ![1, 2, 3]!.all(it > 1)
20 assert ![1, 2, 3]!.all(|x| x > 1)
21
22 assert ia.any(it == 2)
23 assert ia.any(|x| x == 2)
24 assert [1, 2, 3]!.any(it == 2)
25 assert [1, 2, 3]!.any(|x| x == 2)
26
27 assert !ia.all(it == 3)
28 assert !ia.all(|x| x == 3)
29 assert ![1, 2, 3]!.all(it == 3)
30 assert ![1, 2, 3]!.all(|x| x == 3)
31}
32
33fn test_any_all_of_strings() {
34 sa := ['a', 'b', 'c']!
35
36 assert sa.any(it == 'b')
37 assert sa.any(|x| x == 'b')
38 assert ['a', 'b', 'c']!.any(it == 'b')
39 assert ['a', 'b', 'c']!.any(|x| x == 'b')
40
41 assert !sa.all(it == 'c')
42 assert !sa.all(|x| x == 'c')
43 assert !['a', 'b', 'c']!.all(it == 'c')
44 assert !['a', 'b', 'c']!.all(|x| x == 'c')
45}
46
47fn test_any_all_of_voidptrs() {
48 pa := [voidptr(123), voidptr(45), voidptr(99)]!
49
50 assert pa.any(it == voidptr(45))
51 assert pa.any(|x| x == voidptr(45))
52 assert [voidptr(123), voidptr(45), voidptr(99)]!.any(it == voidptr(45))
53 assert [voidptr(123), voidptr(45), voidptr(99)]!.any(|x| x == voidptr(45))
54
55 assert !pa.all(it == voidptr(123))
56 assert !pa.all(|x| x == voidptr(123))
57 assert ![voidptr(123), voidptr(45), voidptr(99)]!.all(it == voidptr(123))
58 assert ![voidptr(123), voidptr(45), voidptr(99)]!.all(|x| x == voidptr(123))
59}
60
61fn test_any_all_of_fns() {
62 fa := [a, b, c]!
63
64 assert fa.any(it == b)
65 assert fa.any(|x| x == b)
66 assert [a, b, c]!.any(it == b)
67 assert [a, b, c]!.any(|x| x == b)
68
69 assert !fa.all(it == v)
70 assert !fa.all(|x| x == v)
71 assert ![a, b, c]!.all(it == v)
72 assert ![a, b, c]!.all(|x| x == v)
73}
74
75fn test_contains_of_ints() {
76 ia := [1, 2, 3]!
77 mut ii := ia.contains(2)
78 dump(ii)
79 assert ii
80 assert [1, 2, 3]!.contains(2)
81
82 ii = ia.contains(5)
83 dump(ii)
84 assert !ii
85 assert ![1, 2, 3]!.contains(5)
86}
87
88fn test_contains_of_strings() {
89 sa := ['a', 'b', 'c']!
90 mut si := sa.contains('b')
91 dump(si)
92 assert si
93 assert ['a', 'b', 'c']!.contains('b')
94
95 si = sa.contains('v')
96 dump(si)
97 assert !si
98 assert !['a', 'b', 'c']!.contains('v')
99}
100
101fn test_contains_of_voidptrs() {
102 pa := [voidptr(123), voidptr(45), voidptr(99)]!
103 mut pi := pa.contains(voidptr(45))
104 dump(pi)
105 assert pi
106 assert [voidptr(123), voidptr(45), voidptr(99)]!.contains(voidptr(45))
107
108 pi = pa.contains(unsafe { nil })
109 dump(pi)
110 assert !pi
111 assert ![voidptr(123), voidptr(45), voidptr(99)]!.contains(unsafe { nil })
112}
113
114fn test_contains_of_fns() {
115 fa := [a, b, c]!
116 mut fi := fa.contains(b)
117 dump(fi)
118 assert fi
119 assert [a, b, c]!.contains(b)
120
121 fi = fa.contains(v)
122 dump(fi)
123 assert !fi
124 assert ![a, b, c]!.contains(v)
125}
126
127fn test_index_of_ints() {
128 ia := [1, 2, 3]!
129 mut ii := ia.index(2)
130 dump(ii)
131 assert ii == 1
132 assert [1, 2, 3]!.index(2) == 1
133
134 ii = ia.index(5)
135 dump(ii)
136 assert ii == -1
137 assert [1, 2, 3]!.index(5) == -1
138}
139
140fn test_index_of_strings() {
141 sa := ['a', 'b', 'c']!
142 mut si := sa.index('b')
143 dump(si)
144 assert si == 1
145 assert ['a', 'b', 'c']!.index('b') == 1
146
147 si = sa.index('v')
148 dump(si)
149 assert si == -1
150 assert ['a', 'b', 'c']!.index('v') == -1
151}
152
153fn test_index_of_voidptrs() {
154 pa := [voidptr(123), voidptr(45), voidptr(99)]!
155 mut pi := pa.index(voidptr(45))
156 dump(pi)
157 assert pi == 1
158 assert [voidptr(123), voidptr(45), voidptr(99)]!.index(voidptr(45)) == 1
159
160 pi = pa.index(unsafe { nil })
161 dump(pi)
162 assert pi == -1
163 assert [voidptr(123), voidptr(45), voidptr(99)]!.index(unsafe { nil }) == -1
164}
165
166fn test_index_of_fns() {
167 fa := [a, b, c]!
168 mut fi := fa.index(b)
169 dump(fi)
170 assert fi == 1
171 assert [a, b, c]!.index(b) == 1
172
173 fi = fa.index(v)
174 dump(fi)
175 assert fi == -1
176 assert [a, b, c]!.index(v) == -1
177}
178
179fn test_fixed_array_map() {
180 a := [1, 2, 3]!
181
182 b1 := a.map(it * 2)
183 println(b1)
184 assert b1 == [2, 4, 6]!
185 b10 := [1, 2, 3]!.map(it * 2)
186 assert b10 == [2, 4, 6]!
187 assert [1, 2, 3]!.map(it * 2) == [2, 4, 6]!
188
189 b11 := a.map(|x| x * 2)
190 println(b11)
191 assert b11 == [2, 4, 6]!
192 b110 := [1, 2, 3]!.map(|x| x * 2)
193 assert b110 == [2, 4, 6]!
194 assert [1, 2, 3]!.map(|x| x * 2) == [2, 4, 6]!
195
196 b2 := a.map('${it}')
197 println(b2)
198 assert b2 == ['1', '2', '3']!
199 b20 := [1, 2, 3]!.map('${it}')
200 assert b20 == ['1', '2', '3']!
201 assert [1, 2, 3]!.map('${it}') == ['1', '2', '3']!
202
203 b22 := a.map(|x| '${x}')
204 println(b22)
205 assert b22 == ['1', '2', '3']!
206 b220 := [1, 2, 3]!.map(|x| '${x}')
207 assert b220 == ['1', '2', '3']!
208 assert [1, 2, 3]!.map(|x| '${x}') == ['1', '2', '3']!
209
210 b3 := a.map(it + 2)
211 println(b3)
212 assert b3 == [3, 4, 5]!
213 b30 := [1, 2, 3]!.map(it + 2)
214 assert b30 == [3, 4, 5]!
215 assert [1, 2, 3]!.map(it + 2) == [3, 4, 5]!
216
217 b33 := a.map(|x| x + 2)
218 println(b33)
219 assert b33 == [3, 4, 5]!
220 b330 := [1, 2, 3]!.map(|x| x + 2)
221 assert b330 == [3, 4, 5]!
222 assert [1, 2, 3]!.map(|x| x + 2) == [3, 4, 5]!
223}
224
225struct User {
226 age int
227 name string
228}
229
230fn test_fixed_array_reverse_in_place() {
231 mut a := ['hi', '1', '5', '3']!
232 a.reverse_in_place()
233 assert a == ['3', '5', '1', 'hi']!
234
235 mut nums := [67, -3, 108, 42, 7]!
236 nums.reverse_in_place()
237 assert nums == [7, 42, 108, -3, 67]!
238
239 mut users := [User{22, 'Peter'}, User{20, 'Bob'}, User{25, 'Alice'}]!
240 users.reverse_in_place()
241 assert users[0].age == 25
242 assert users[1].age == 20
243 assert users[2].age == 22
244 assert users[0].name == 'Alice'
245 assert users[1].name == 'Bob'
246 assert users[2].name == 'Peter'
247}
248
249fn test_fixed_array_reverse() {
250 a := ['hi', '1', '5', '3']!
251 b := a.reverse()
252 assert a == ['hi', '1', '5', '3']!
253 assert b == ['3', '5', '1', 'hi']!
254 assert ['hi', '1', '5', '3']!.reverse() == ['3', '5', '1', 'hi']!
255
256 mut nums := [67, -3, 108, 42, 7]!
257 n := nums.reverse()
258 assert nums == [67, -3, 108, 42, 7]!
259 assert n == [7, 42, 108, -3, 67]!
260 assert [67, -3, 108, 42, 7]!.reverse() == [7, 42, 108, -3, 67]!
261
262 mut users := [User{22, 'Peter'}, User{20, 'Bob'}, User{25, 'Alice'}]!
263 u := users.reverse()
264
265 assert users[0].age == 22
266 assert users[1].age == 20
267 assert users[2].age == 25
268 assert users[0].name == 'Peter'
269 assert users[1].name == 'Bob'
270 assert users[2].name == 'Alice'
271
272 assert u[0].age == 25
273 assert u[1].age == 20
274 assert u[2].age == 22
275 assert u[0].name == 'Alice'
276 assert u[1].name == 'Bob'
277 assert u[2].name == 'Peter'
278
279 u2 := [User{22, 'Peter'}, User{20, 'Bob'}, User{25, 'Alice'}]!.reverse()
280 assert u2[0].age == 25
281 assert u2[1].age == 20
282 assert u2[2].age == 22
283 assert u2[0].name == 'Alice'
284 assert u2[1].name == 'Bob'
285 assert u2[2].name == 'Peter'
286}
287
288fn test_fixed_array_sort() {
289 mut a := ['hi', '1', '5', '3']!
290 a.sort()
291 assert a == ['1', '3', '5', 'hi']!
292
293 mut nums := [67, -3, 108, 42, 7]!
294 nums.sort()
295 assert nums == [-3, 7, 42, 67, 108]!
296
297 nums.sort(a < b)
298 assert nums == [-3, 7, 42, 67, 108]!
299
300 nums.sort(b < a)
301 assert nums == [108, 67, 42, 7, -3]!
302
303 mut users := [User{22, 'Peter'}, User{20, 'Bob'}, User{25, 'Alice'}]!
304 users.sort(a.age < b.age)
305 assert users[0].age == 20
306 assert users[1].age == 22
307 assert users[2].age == 25
308 assert users[0].name == 'Bob'
309 assert users[1].name == 'Peter'
310 assert users[2].name == 'Alice'
311
312 users.sort(a.age > b.age)
313 assert users[0].age == 25
314 assert users[1].age == 22
315 assert users[2].age == 20
316
317 users.sort(b.age > a.age)
318 assert users[0].age == 20
319 assert users[1].age == 22
320 assert users[2].age == 25
321
322 users.sort(a.name < b.name)
323 assert users[0].name == 'Alice'
324 assert users[1].name == 'Bob'
325 assert users[2].name == 'Peter'
326}
327
328fn test_fixed_array_sort_preserves_relative_order_for_equal_elements() {
329 mut source := [User{4, 'B'}, User{4, 'A'}, User{5, 'C'}]!
330
331 mut sorted := source
332 sorted.sort(a.age > b.age)
333 assert sorted[0].name == 'C'
334 assert sorted[1].name == 'B'
335 assert sorted[2].name == 'A'
336
337 copy := source.sorted(a.age > b.age)
338 assert copy[0].name == 'C'
339 assert copy[1].name == 'B'
340 assert copy[2].name == 'A'
341}
342
343fn test_sorted_immutable_original_should_not_change() {
344 a := ['hi', '1', '5', '3']!
345 b := a.sorted()
346 assert a == ['hi', '1', '5', '3']!
347 assert b == ['1', '3', '5', 'hi']!
348 assert ['hi', '1', '5', '3']!.sorted() == ['1', '3', '5', 'hi']!
349}
350
351fn test_sorted_mutable_original_should_not_change() {
352 mut a := ['hi', '1', '5', '3']!
353 b := a.sorted()
354 assert a == ['hi', '1', '5', '3']!
355 assert b == ['1', '3', '5', 'hi']!
356 assert ['hi', '1', '5', '3']!.sorted() == ['1', '3', '5', 'hi']!
357}
358
359fn test_sorted_reversed() {
360 aa := ['hi', '1', '5', '3']!
361 bb := aa.sorted(a > b)
362 assert aa == ['hi', '1', '5', '3']!
363 assert bb == ['hi', '5', '3', '1']!
364 assert ['hi', '1', '5', '3']!.sorted(a > b) == ['hi', '5', '3', '1']!
365}
366
367fn test_sorted_by_len() {
368 a := ['hi', 'abc', 'a', 'zzzzz']!
369 c := a.sorted(a.len < b.len)
370 assert c == ['a', 'hi', 'abc', 'zzzzz']!
371 assert ['hi', 'abc', 'a', 'zzzzz']!.sorted(a.len < b.len) == ['a', 'hi', 'abc', 'zzzzz']!
372}
373
374fn test_sort_with_compare_1() {
375 mut a := ['hi', '1', '5', '3']!
376 a.sort_with_compare(fn (a &string, b &string) int {
377 if a < b {
378 return -1
379 }
380 if a > b {
381 return 1
382 }
383 return 0
384 })
385 assert a == ['1', '3', '5', 'hi']!
386}
387
388fn test_sorted_with_compare_1() {
389 a := ['hi', '1', '5', '3']!
390 b := a.sorted_with_compare(fn (a &string, b &string) int {
391 if a < b {
392 return -1
393 }
394 if a > b {
395 return 1
396 }
397 return 0
398 })
399 assert a == ['hi', '1', '5', '3']!
400 assert b == ['1', '3', '5', 'hi']!
401 assert ['hi', '1', '5', '3']!.sorted_with_compare(fn (a &string, b &string) int {
402 if a < b {
403 return -1
404 }
405 if a > b {
406 return 1
407 }
408 return 0
409 }) == ['1', '3', '5', 'hi']!
410}
411
412struct Ka {
413 s string
414 i int
415}
416
417fn test_sort_with_compare_2() {
418 mut arr := [
419 Ka{
420 s: 'bbb'
421 i: 100
422 },
423 Ka{
424 s: 'aaa'
425 i: 101
426 },
427 Ka{
428 s: 'ccc'
429 i: 102
430 },
431 ]!
432 cmp := fn (a &Ka, b &Ka) int {
433 return compare_strings(a.s, b.s)
434 }
435 arr.sort_with_compare(cmp)
436 assert arr[0].s == 'aaa'
437 assert arr[0].i == 101
438 assert arr[1].s == 'bbb'
439 assert arr[1].i == 100
440 assert arr[2].s == 'ccc'
441 assert arr[2].i == 102
442}
443
444fn test_sorted_with_compare_2() {
445 arr := [
446 Ka{
447 s: 'bbb'
448 i: 100
449 },
450 Ka{
451 s: 'aaa'
452 i: 101
453 },
454 Ka{
455 s: 'ccc'
456 i: 102
457 },
458 ]!
459 cmp := fn (a &Ka, b &Ka) int {
460 return compare_strings(a.s, b.s)
461 }
462 b := arr.sorted_with_compare(cmp)
463 assert arr[0].s == 'bbb'
464 assert arr[0].i == 100
465 assert arr[1].s == 'aaa'
466 assert arr[1].i == 101
467 assert arr[2].s == 'ccc'
468 assert arr[2].i == 102
469
470 assert b[0].s == 'aaa'
471 assert b[0].i == 101
472 assert b[1].s == 'bbb'
473 assert b[1].i == 100
474 assert b[2].s == 'ccc'
475 assert b[2].i == 102
476
477 b2 := [
478 Ka{
479 s: 'bbb'
480 i: 100
481 },
482 Ka{
483 s: 'aaa'
484 i: 101
485 },
486 Ka{
487 s: 'ccc'
488 i: 102
489 },
490 ]!.sorted_with_compare(cmp)
491
492 assert b2[0].s == 'aaa'
493 assert b2[0].i == 101
494 assert b2[1].s == 'bbb'
495 assert b2[1].i == 100
496 assert b2[2].s == 'ccc'
497 assert b2[2].i == 102
498}
499