| 1 | import arrays |
| 2 | |
| 3 | struct Compound { |
| 4 | mut: |
| 5 | s string |
| 6 | i int |
| 7 | u u64 |
| 8 | m map[string]i16 |
| 9 | } |
| 10 | |
| 11 | fn 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 | |
| 23 | fn 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 | |
| 42 | fn 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 | |
| 56 | fn 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 | |