v2 / vlib / v / tests / defer / defer_test.v
189 lines · 168 sloc · 2.08 KB · be82b0395efa8d7cfc63e81550873fe0fafe5790
Raw
1fn foo() string {
2 println('foo()')
3 return 'foo'
4}
5
6fn foo2() string {
7 println('start')
8 defer {
9 println('defer')
10 }
11 defer {
12 println('defer2')
13 }
14 println('end')
15 return foo()
16}
17
18fn test_defer() {
19 assert foo2() == 'foo'
20}
21
22fn set_num(i int, mut n Num) {
23 defer {
24 println('exiting')
25 n.val++
26 }
27 println('Hi')
28 if i < 5 {
29 return
30 } else {
31 n.val++
32 }
33}
34
35fn set_num_opt(mut n Num) ?int {
36 defer {
37 n.val = 1
38 }
39 return 99
40}
41
42struct Num {
43mut:
44 val int
45}
46
47fn (n Num) add(i int) int {
48 return n.val + i
49}
50
51fn test_defer_early_exit() {
52 mut sum := Num{0}
53 for i in 0 .. 10 {
54 set_num(i, mut sum)
55 }
56 println('sum: ${sum.val}')
57 assert sum.val == 15
58}
59
60fn test_defer_option() {
61 mut ok := Num{0}
62 set_num_opt(mut ok) or {}
63 assert ok.val == 1
64}
65
66fn test_defer_with_anon_fn() {
67 mut f := &Num{
68 val: 110
69 }
70 defer {
71 assert f.add(1) == 111
72 }
73
74 spawn fn () {
75 defer {
76 println('deferred 1')
77 }
78 }()
79 x := fn () {
80 defer {
81 println('deferred 2')
82 }
83 return
84 }
85 x()
86 return
87}
88
89fn set_num_if(mut n Num, v int, cond bool) {
90 if cond {
91 defer {
92 n.val = v
93 }
94 }
95}
96
97fn test_defer_with_if() {
98 mut n := Num{0}
99 set_num_if(mut n, 10, true)
100 assert n.val == 10
101 set_num_if(mut n, 20, false)
102 assert n.val == 10
103}
104
105fn test_defer_order() {
106 mut i := 0
107 defer {
108 i++
109 assert i == 3
110 }
111 defer {
112 i++
113 assert i == 2
114 }
115 defer {
116 i++
117 assert i == 1
118 }
119}
120
121fn test_defer_access() {
122 if true {
123 mut i := 0
124 defer {
125 i++
126 assert i == 1
127 }
128 }
129}
130
131fn test_defer_arrays() {
132 mut ia := []int{}
133 defer {
134 ia << 1
135 }
136}
137
138fn test_defer_str_interpol() {
139 mut t := []string{}
140 defer {
141 t << 'test'
142 t << '${t[0]}'
143 }
144}
145
146fn test_defer_not_change_return_values() {
147 assert num() == 10
148}
149
150fn num() int {
151 mut ret := 10
152 defer {
153 ret = 20
154 }
155 return ret
156}
157
158fn close(i int) {
159 eprintln('Close ${i}')
160}
161
162fn test_defer_with_reserved_words() {
163 if 1 == 1 {
164 single := 1
165 defer {
166 close(single)
167 }
168 }
169 if 2 == 2 {
170 double := 9
171 defer {
172 close(double)
173 }
174 }
175 eprintln('Done')
176 assert true
177}
178
179fn test_defer_inside_comptime_if_else() {
180 $if false {
181 } $else {
182 defer {}
183 }
184 $if true {
185 defer {}
186 } $else {
187 }
188 assert true
189}
190