v2 / vlib / v / tests / for_in_iterator_next_test.v
125 lines · 104 sloc · 2.33 KB · 309c11f6e37923e1c50a91ed5f972e8f193e864d
Raw
1module main
2
3pub interface Iterator {
4mut:
5 next() ?string
6}
7
8pub struct LineIterator {
9 lines []string
10mut:
11 idx int
12}
13
14type AliasLineIterator = LineIterator
15
16pub fn (mut line_iterator LineIterator) next() ?string {
17 if line_iterator.idx >= line_iterator.lines.len {
18 return none
19 }
20 defer { line_iterator.idx += 1 }
21 return line_iterator.lines[line_iterator.idx]
22}
23
24fn iterator_as_interface() Iterator {
25 return LineIterator{
26 lines: ['interface']
27 }
28}
29
30fn iterator_as_concrete_type() LineIterator {
31 return LineIterator{
32 lines: ['concrete']
33 }
34}
35
36fn iterator_as_alias_concrete_type() AliasLineIterator {
37 return AliasLineIterator(LineIterator{
38 lines: ['alias', 'iterator', 'next']
39 })
40}
41
42pub fn (mut line_iterator AliasLineIterator) next() ?string {
43 if line_iterator.idx >= line_iterator.lines.len {
44 return none
45 }
46 defer { line_iterator.idx += 2 }
47 return line_iterator.lines[line_iterator.idx]
48}
49
50struct SquareIterator {
51 arr []int
52mut:
53 idx int
54}
55
56interface Iterable[T] {
57mut:
58 idx int
59 next() ?T
60}
61
62fn (mut iter SquareIterator) next() ?string {
63 if iter.idx >= iter.arr.len {
64 return none
65 }
66 defer { iter.idx++ }
67 return (iter.arr[iter.idx] * iter.arr[iter.idx]).str()
68}
69
70fn collect_iterable(iter Iterable[string]) []string {
71 mut out := []string{}
72 for item in iter {
73 out << item
74 }
75 return out
76}
77
78fn test_main() {
79 mut out := []string{}
80 for line in iterator_as_interface() {
81 out << 'LINE: ${line}'
82 }
83 for idx, line in iterator_as_interface() {
84 out << 'LINE [${idx}]: ${line}'
85 }
86
87 assert out[0] == 'LINE: interface'
88 assert out[1] == 'LINE [0]: interface'
89
90 for line in iterator_as_concrete_type() {
91 out << 'LINE: ${line}'
92 }
93 for idx, line in iterator_as_concrete_type() {
94 out << 'LINE [${idx}]: ${line}'
95 }
96
97 assert out[2] == 'LINE: concrete'
98 assert out[3] == 'LINE [0]: concrete'
99
100 mut iter := iterator_as_interface()
101 for {
102 line := iter.next() or { break }
103 out << 'LINE: ${line}'
104 }
105 for _, line in iterator_as_concrete_type() {
106 out << 'LINE: ${line}'
107 }
108
109 assert out[4] == 'LINE: interface'
110 assert out[5] == 'LINE: concrete'
111
112 for _, line in iterator_as_alias_concrete_type() {
113 out << 'LINE: ${line}'
114 }
115
116 assert out[6] == 'LINE: alias'
117 assert out[7] == 'LINE: next'
118}
119
120fn test_for_in_generic_iterator_interface_param() {
121 iter := SquareIterator{
122 arr: [1, 2, 3, 4, 5]
123 }
124 assert collect_iterable(iter) == ['1', '4', '9', '16', '25']
125}
126