v2 / vlib / v / tests / concurrency / shared_lock_expr_test.v
183 lines · 166 sloc · 2.76 KB · 345b29d88db4abbe4d38ffc10e212559b6284043
Raw
1struct St {
2mut:
3 i int
4}
5
6fn test_lock_expr() {
7 shared xx := St{
8 i: 173
9 }
10 shared y := St{
11 i: -57
12 }
13 mut m := 0
14 m = lock y {
15 y.i
16 }
17 n := rlock xx {
18 xx.i
19 }
20 assert m == -57
21 assert n == 173
22}
23
24struct Abc {
25mut:
26 a f64
27}
28
29fn test_multi_objects() {
30 shared x := Abc{
31 a: 12.5
32 }
33 shared y := Abc{
34 a: -7.5
35 }
36 shared z := Abc{
37 a: 13.125
38 }
39 a, b, c := rlock z, x, y {
40 y.a, z.a, x.a
41 }
42 assert a == -7.5
43 assert b == 13.125
44 assert c == 12.5
45}
46
47fn (mut st Abc) getvals(mut a Abc, mut b Abc) (f64, f64, f64) {
48 return a.a, st.a, b.a
49}
50
51fn test_mult_ret_method() {
52 shared x := Abc{
53 a: 12.5
54 }
55 shared y := Abc{
56 a: -7.5
57 }
58 shared z := Abc{
59 a: 13.125
60 }
61 a, b, c := lock z, x, y {
62 z.getvals(mut x, mut y)
63 }
64 assert a == 12.5
65 assert b == 13.125
66 assert c == -7.5
67}
68
69fn test_shared_lock_map_index_expr() {
70 shared m := {
71 'qwe': 'asd'
72 }
73 for key in ['fdf', 'qwe'] {
74 v := rlock m {
75 m[key] or { 'key not found' }
76 }
77 if key == 'qwe' {
78 assert v == 'asd'
79 } else {
80 assert v == 'key not found'
81 }
82 }
83}
84
85fn test_shared_lock_array_index_expr() {
86 shared a := [-12.5, 6.25]
87 for i in -2 .. 4 {
88 v := rlock a {
89 a[i] or { 23.75 }
90 }
91 if i == 0 {
92 assert v == -12.5
93 } else if i == 1 {
94 assert v == 6.25
95 } else {
96 assert v == 23.75
97 }
98 }
99}
100
101fn test_shared_lock_array_slice_expr() {
102 // Test slicing shared arrays in rlock expressions (fixes issue #26663)
103 // Note: slicing a shared array automatically clones for safety,
104 // since a slice is a view over the same memory buffer.
105 shared a := ['a', 'b', 'c', 'd']
106
107 // Basic slice - implicit clone happens (safe independent copy)
108 slice1 := lock {
109 a[1..3]
110 }
111 assert slice1.len == 2
112 assert slice1[0] == 'b'
113 assert slice1[1] == 'c'
114
115 // Full slice
116 slice2 := lock {
117 a[..]
118 }
119 assert slice2.len == 4
120 assert slice2 == ['a', 'b', 'c', 'd']
121
122 // Slice from start
123 slice3 := lock {
124 a[..2]
125 }
126 assert slice3.len == 2
127 assert slice3[0] == 'a'
128 assert slice3[1] == 'b'
129
130 // Slice to end
131 slice4 := lock {
132 a[2..]
133 }
134 assert slice4.len == 2
135 assert slice4[0] == 'c'
136 assert slice4[1] == 'd'
137
138 // Test with int array
139 shared arr := [1, 2, 3, 4, 5]
140 slice5 := lock {
141 arr[1..4]
142 }
143 assert slice5.len == 3
144 assert slice5[0] == 2
145 assert slice5[1] == 3
146 assert slice5[2] == 4
147
148 // Explicit clone - same behavior, no warning
149 slice6 := lock {
150 a[1..3].clone()
151 }
152 assert slice6 == ['b', 'c']
153
154 // Unsafe block - get a view (user takes responsibility)
155 slice7 := lock {
156 unsafe { a[1..3] }
157 }
158 assert slice7 == ['b', 'c']
159}
160
161struct DummySt {
162 a int
163}
164
165fn test_shared_lock_chan_rec_expr() {
166 ch := chan int{cap: 10}
167 shared st := DummySt{}
168 ch <- 7
169 ch <- -13
170 ch.close()
171 for i in 0 .. 3 {
172 v := rlock st {
173 <-ch or { -17 }
174 }
175 if i == 0 {
176 assert v == 7
177 } else if i == 1 {
178 assert v == -13
179 } else {
180 assert v == -17
181 }
182 }
183}
184