| 1 | // vtest retry: 3 |
| 2 | |
| 3 | fn f(n int) ?f64 { |
| 4 | if n < 0 { |
| 5 | return none |
| 6 | } |
| 7 | return n + f64(n) / 2 |
| 8 | } |
| 9 | |
| 10 | fn g(n int) ? { |
| 11 | if n % 2 == 0 { |
| 12 | return none |
| 13 | } else { |
| 14 | return |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | fn 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 | |
| 27 | fn 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 | |
| 38 | fn 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 | |
| 46 | fn 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 | |
| 55 | fn 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 | |
| 69 | fn 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 | |
| 83 | fn 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 | |
| 92 | fn 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 | |
| 99 | fn ok_result_void(ok bool) ! { |
| 100 | if !ok { |
| 101 | return error('boom') |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | fn test_array_wait_option_propagates() { |
| 106 | assert wait_array_option_values() or { []f64{} } == [0.0, 1.5, 3.0] |
| 107 | } |
| 108 | |
| 109 | fn 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 |
| 118 | fn get_only_a_option_return(return_none bool) ? { |
| 119 | if return_none { |
| 120 | return |
| 121 | } |
| 122 | return none |
| 123 | } |
| 124 | |
| 125 | fn get_only_a_result_return() ! { |
| 126 | return error('msg') |
| 127 | } |
| 128 | |
| 129 | fn 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 | |
| 137 | fn test_only_a_result_return() { |
| 138 | t := spawn get_only_a_result_return() |
| 139 | t.wait() or { assert true } |
| 140 | assert true |
| 141 | } |
| 142 | |