v2 / vlib / v / tests / fns / go_wait_option_test.v
141 lines · 124 sloc · 2.34 KB · d61022c346c1f14e301db28885804f2dbe4a1ef7
Raw
1// vtest retry: 3
2
3fn f(n int) ?f64 {
4 if n < 0 {
5 return none
6 }
7 return n + f64(n) / 2
8}
9
10fn g(n int) ? {
11 if n % 2 == 0 {
12 return none
13 } else {
14 return
15 }
16}
17
18fn test_opt_val_wait() {
19 h1 := spawn f(-1)
20 h2 := spawn f(3)
21 r1 := h1.wait() or { 17.0 }
22 r2 := h2.wait() or { 23.0 }
23 assert r1 == 17.0
24 assert r2 == 4.5
25}
26
27fn test_opt_void_wait() {
28 h1 := spawn g(2)
29 h2 := spawn g(3)
30 mut x := 0
31 mut y := 0
32 h1.wait() or { x = 1 }
33 h2.wait() or { y = 1 }
34 assert x == 1
35 assert y == 0
36}
37
38fn propagate(n int, m int) ?f64 {
39 h1 := spawn f(n)
40 h2 := spawn g(m)
41 r := h1.wait()?
42 h2.wait()?
43 return r
44}
45
46fn test_propagate() {
47 x := propagate(5, 3) or { 27.0 }
48 y := propagate(-3, 3) or { 29.0 }
49 z := propagate(5, 2) or { 31.0 }
50 assert x == 7.5
51 assert y == 29.0
52 assert z == 31.0
53}
54
55fn test_array_void_iter() {
56 mut r := []thread ?{}
57 for i in 0 .. 3 {
58 r << spawn g(i)
59 }
60 mut res := []int{len: 3, init: 17}
61 for i, t in r {
62 t.wait() or { res[i] = i }
63 }
64 assert res[0] == 0
65 assert res[1] == 17
66 assert res[2] == 2
67}
68
69fn test_array_val_iter() {
70 mut r := []thread ?f64{}
71 for i in -1 .. 2 {
72 r << spawn f(i)
73 }
74 mut res := []f64{len: 3}
75 for i, t in r {
76 res[i] = t.wait() or { 17.0 }
77 }
78 assert res[0] == 17.0
79 assert res[1] == 0.0
80 assert res[2] == 1.5
81}
82
83fn wait_array_option_values() ?[]f64 {
84 mut threads := []thread ?f64{}
85 for i in 0 .. 3 {
86 threads << spawn f(i)
87 }
88 values := threads.wait()?
89 return values
90}
91
92fn wait_array_result_void() ! {
93 mut threads := []thread !{}
94 threads << spawn ok_result_void(true)
95 threads << spawn ok_result_void(false)
96 threads.wait()!
97}
98
99fn ok_result_void(ok bool) ! {
100 if !ok {
101 return error('boom')
102 }
103}
104
105fn test_array_wait_option_propagates() {
106 assert wait_array_option_values() or { []f64{} } == [0.0, 1.5, 3.0]
107}
108
109fn test_array_wait_result_void_propagates() {
110 wait_array_result_void() or {
111 assert err.msg() == 'boom'
112 return
113 }
114 assert false
115}
116
117// For issue 16065
118fn get_only_a_option_return(return_none bool) ? {
119 if return_none {
120 return
121 }
122 return none
123}
124
125fn get_only_a_result_return() ! {
126 return error('msg')
127}
128
129fn test_only_a_option_return() {
130 t1 := spawn get_only_a_option_return(true)
131 t1.wait() or { assert false }
132 t2 := spawn get_only_a_option_return(false)
133 t2.wait() or { assert true }
134 assert true
135}
136
137fn test_only_a_result_return() {
138 t := spawn get_only_a_result_return()
139 t.wait() or { assert true }
140 assert true
141}
142