v2 / vlib / arrays / reverse_iterator_test.v
89 lines · 84 sloc · 1.56 KB · a9c939adf63ae9aa0836ff08385603deb4b99aaa
Raw
1import arrays
2
3struct Compound {
4mut:
5 s string
6 i int
7 u u64
8 m map[string]i16
9}
10
11fn check[T](original []T) {
12 mut result := []T{cap: original.len}
13 for x in arrays.reverse_iterator(original) {
14 result << x
15 }
16 assert result.len == original.len
17 assert result.first() == original.last()
18 assert result.reverse() == original
19 eprintln('> original: ${original}')
20 eprintln('> result: ${result}')
21}
22
23fn test_reverse_iterator_basic() {
24 check(['abc', 'def', 'ghi', 'jkl'])
25 check([10, 20, 30, 40])
26 check([
27 Compound{'abc', 123, 444, {
28 'aa': i16(12)
29 'bb': 31
30 }},
31 Compound{'def', 456, 555, {
32 'bb': i16(22)
33 'cc': 32
34 }},
35 Compound{'xyz', 789, 666, {
36 'cc': i16(32)
37 'dd': 33
38 }},
39 ])
40}
41
42fn test_reverse_iterator_with_mut() {
43 mut original := [10, 20]
44 mut before := []int{cap: original.len}
45 mut after := []int{cap: original.len}
46 for mut x in arrays.reverse_iterator(original) {
47 before << *x
48 (*x)++
49 after << *x
50 }
51 assert before == [20, 10]
52 assert after == [21, 11]
53 assert original == [11, 21]
54}
55
56fn test_reverse_iterator_with_mut_compound() {
57 mut original := [Compound{
58 s: 'abc'
59 i: 123
60 }, Compound{
61 s: 'xyz'
62 i: 987
63 }]
64 mut before := []Compound{cap: original.len}
65 mut after := []Compound{cap: original.len}
66 for mut x in arrays.reverse_iterator(original) {
67 before << *x
68 x.i++
69 x.s += ' tail'
70 x.u = 99
71 x.m['modified'] = 1
72 after << *x
73 }
74 assert after[0] == Compound{
75 s: 'xyz tail'
76 i: 988
77 u: 99
78 m: {
79 'modified': i16(1)
80 }
81 }
82 assert before[0] == Compound{
83 s: 'xyz'
84 i: 987
85 u: 0
86 m: {}
87 }
88 assert after.reverse() == original
89}
90