v2 / vlib / v / tests / structs / mut_test.v
372 lines · 336 sloc · 5.72 KB · 6488041a749df9762348d019c4223908c476f2e2
Raw
1struct Aaa {
2pub mut:
3 v []int
4}
5
6struct Bbb {
7pub mut:
8 a []Aaa
9}
10
11fn foo(b int, mut a []int) {
12 a[0] = 7
13 // a << 4
14}
15
16fn test_mut() {
17 mut numbers := [1, 2, 3]
18 foo(7, mut numbers)
19 assert numbers.len == 3
20 // TODO: bring back once << works with mutable args
21 // assert numbers.len == 4
22 // assert numbers[0] == 7
23 // assert numbers[3] == 4
24 println(numbers)
25 n := 1
26 mut b := (&n)
27
28 unsafe {
29 (*b) = 10
30 }
31 // mut b := mut a
32 // b = 10
33}
34
35fn test_mut_2() {
36 zero := 0
37 mut b := Bbb{}
38 b.a << Aaa{}
39 b.a[0].v = [9, 8, 7]
40 b.a[0].v << 6
41 b.a[zero].v << 5
42 b.a[0].v[zero] = 3
43 b.a[0].v[b.a[zero].v[zero]] += 2 - 1 // TODO
44 b.a[0].v[b.a[0].v[zero]] += 2 - 1 // TODO
45 assert b.a[0].v.len == 5
46 assert b.a[0].v[0] == 3
47 assert b.a[0].v[1] == 8
48 assert b.a[0].v[2] == 7
49 assert b.a[0].v[3] == 8
50 assert b.a[0].v[4] == 5
51}
52
53fn test_mut_3() {
54 mut indices := []int{len: 3}
55 mut results := []string{}
56
57 for i, mut v in indices {
58 v = i
59 a := v
60 println('${i} ${v} ${a}')
61 results << '${i} ${v} ${a}'
62 }
63 assert results[0] == '0 0 0'
64 assert results[1] == '1 1 1'
65 assert results[2] == '2 2 2'
66}
67
68struct St {
69mut:
70 n int
71}
72
73fn f(mut x St) {
74 mut y := St{
75 n: 2
76 }
77 a := x
78 b := y
79 x.n = 3
80 y.n = 4
81 println('${a.n} ${b.n}')
82 assert '${a.n} ${b.n}' == '1 2'
83}
84
85fn test_mut_4() {
86 mut x := St{
87 n: 1
88 }
89 f(mut x)
90}
91
92fn test_mut_5() {
93 mut arr1 := []int{len: 2}
94 mut arr2 := []int{len: 2}
95 mut results := []string{}
96
97 for i, mut v in arr1 {
98 for ii, mut vv in arr2 {
99 v = i
100 a := v
101 println('${i} ${v} ${a}')
102 results << '${i} ${v} ${a}'
103
104 vv = ii
105 aa := vv
106 println('${ii} ${vv} ${aa}')
107 results << '${ii} ${vv} ${aa}'
108 }
109 }
110
111 assert results[0] == '0 0 0'
112 assert results[1] == '0 0 0'
113 assert results[2] == '0 0 0'
114 assert results[3] == '1 1 1'
115 assert results[4] == '1 1 1'
116 assert results[5] == '0 0 0'
117 assert results[6] == '1 1 1'
118 assert results[7] == '1 1 1'
119}
120
121fn test_mut_6() {
122 mut results := []int{}
123 mut arr := []int{len: 3}
124 for _, mut v in arr {
125 v = v + 1
126 println(v)
127 results << v
128 }
129 assert results[0] == 1
130 assert results[1] == 1
131 assert results[2] == 1
132}
133
134fn test_mut_7() {
135 mut arr := []int{len: 3}
136 mut results := []int{}
137 for _, mut v in arr {
138 v = v + 1 // v: 1
139 mut vv := v // vv: 1, v: 1
140 vv = vv + v // vv: 2, v: 1
141 println(v)
142 println(vv)
143 results << v
144 results << vv
145 }
146 assert results[0] == 1
147 assert results[1] == 2
148 assert results[2] == 1
149 assert results[3] == 2
150 assert results[4] == 1
151 assert results[5] == 2
152}
153
154fn test_mut_8() {
155 mut indices := []int{len: 1}
156 for i, mut v in indices {
157 v = i
158 mut b := v
159 println(typeof(i).name)
160 println(typeof(v).name)
161 println(typeof(b).name)
162 u := [v, 5, 6]
163 println(typeof(u).name)
164 println(u)
165 assert typeof(b).name == 'int'
166 assert typeof(u).name == '[]int'
167 assert u == [0, 5, 6]
168 }
169}
170
171fn test_mut_9() {
172 mut arr := [0, 0, 0]
173 mut results := []string{}
174 for _, mut v in arr {
175 v = v + 1 // v: 1
176 mut vv := v // vv: 1, v: 1
177 vv = vv + v // vv: 2, v: 1
178 foo := {
179 'a': v
180 'b': vv
181 }
182 println(v)
183 println(vv)
184 println(foo)
185 results << '${v}'
186 results << '${vv}'
187 results << '${foo}'
188 }
189 assert results[0] == '1'
190 assert results[1] == '2'
191 assert results[2] == "{'a': 1, 'b': 2}"
192 assert results[3] == '1'
193 assert results[4] == '2'
194 assert results[5] == "{'a': 1, 'b': 2}"
195 assert results[6] == '1'
196 assert results[7] == '2'
197 assert results[8] == "{'a': 1, 'b': 2}"
198}
199
200fn foo1(mut arr [][]int) {
201 mut results := []int{}
202 for _, mut j in arr {
203 for _, mut k in j {
204 k = k + 1 // k: 1
205 mut kk := k // kk: 1, k: 1
206 kk = kk + k // kk: 2, k: 1
207 k++ // kk: 2, k: 2
208 kk++ // kk: 3, k: 2
209 println(k)
210 println(kk)
211 results << k
212 results << kk
213 }
214 }
215 assert results[0] == 2
216 assert results[1] == 3
217 assert results[2] == 2
218 assert results[3] == 3
219}
220
221fn test_mut_10() {
222 mut arr := [[0, 0]]
223 foo1(mut arr)
224}
225
226fn foo2(mut arr [][]int) {
227 mut results := []int{}
228 for _, mut j in arr {
229 for _, mut k in j {
230 k = k + 1 // k: 1
231 mut kk := k // kk: 1, k: 1
232 kk = kk + k // kk: 2, k: 1
233 k-- // kk: 2, k: 2
234 kk-- // kk: 3, k: 2
235 println(k)
236 println(kk)
237 results << k
238 results << kk
239 }
240 }
241 assert results[0] == 0
242 assert results[1] == 1
243 assert results[2] == 0
244 assert results[3] == 1
245}
246
247fn test_mut_11() {
248 mut arr := [[0, 0]]
249 foo2(mut arr)
250}
251
252fn foo3(mut arr [][]int) {
253 mut results := []string{}
254 for _, mut j in arr {
255 j[0] += 2
256 println(j) // [2, 0]
257 results << '${j}'
258 }
259 assert results[0] == '[2, 0]'
260}
261
262fn test_mut_12() {
263 mut arr := [[0, 0]]
264 foo3(mut arr)
265}
266
267struct Foo {
268mut:
269 foo int
270}
271
272fn foo4(mut f Foo) {
273 f2 := unsafe { &f }
274 f.foo = 100
275 println(f.foo)
276 println(f2.foo)
277 assert f.foo == 100
278 assert f2.foo == 100
279}
280
281fn test_mut_13() {
282 mut f := Foo{
283 foo: 1
284 }
285 foo4(mut f)
286}
287
288fn foo5(mut arr []int) {
289 arr2 := unsafe { &arr }
290 arr[0] = 0
291 println(arr[0]) // 0
292 assert arr[0] == 0
293 unsafe {
294 println(arr2[0]) // 0
295 assert arr2[0] == 0
296 }
297}
298
299fn test_mut_14() {
300 mut arr := [1, 2, 3]
301 foo5(mut arr)
302}
303
304fn foo6(mut arr [3]int) {
305 arr2 := unsafe { &arr }
306 arr[0] = 0
307 println(arr[0]) // 0
308 assert arr[0] == 0
309 unsafe {
310 println(arr2[0]) // 0
311 assert arr2[0] == 0
312 }
313}
314
315fn test_mut_15() {
316 mut arr := [1, 2, 3]!
317 foo6(mut arr)
318}
319
320fn foo7(mut m map[string]int) {
321 m2 := unsafe { &m }
322 m['one'] = 1
323 println(m['one']) // 1
324 assert m['one'] == 1
325 unsafe {
326 println(m2['one']) // 1
327 assert m2['one'] == 1
328 }
329}
330
331fn test_mut_16() {
332 mut m := {
333 'one': 100
334 'two': 2
335 }
336 foo7(mut m)
337}
338
339fn test_mut_17() {
340 mut arr := [{
341 'foo': 1
342 }]
343 for _, mut j in arr {
344 mut k := j.clone()
345 j['foo'] = 0
346 unsafe {
347 k['foo'] = 10
348 }
349 println(j)
350 println(k)
351 assert j == {
352 'foo': 0
353 }
354 assert k == {
355 'foo': 10
356 }
357 }
358}
359
360fn foo8(mut a [1]int) {
361 a2 := a
362 a[0] = 100
363 println(a)
364 println(a2)
365 assert '${a}' == '[100]'
366 assert '${a2}' == '[1]'
367}
368
369fn test_mut_18() {
370 mut a := [1]!
371 foo8(mut a)
372}
373