v2 / vlib / v / tests / or_block_result_cast_test.v
132 lines · 103 sloc · 2.32 KB · 4ad633a3338f53009f71025a1e2cd51dea424556
Raw
1type MyF64 = f64
2
3struct SelectorCastHolder {
4 x ?f64
5 ax ?MyF64
6}
7
8struct GenericSelectorCastHolder[T] {
9 x ?T
10}
11
12fn result_f64() !f64 {
13 return error('no f64')
14}
15
16fn result_f32() !f32 {
17 return error('no f32')
18}
19
20fn option_f64() ?f64 {
21 return none
22}
23
24fn result_my_f64() !MyF64 {
25 return error('no MyF64')
26}
27
28fn option_my_f64() ?MyF64 {
29 return none
30}
31
32fn result_generic[T]() !T {
33 return error('no generic')
34}
35
36fn cast_or_block_return() int {
37 return int(result_f64() or { return 7 })
38}
39
40fn keep_none() ?f64 {
41 return option_f64() or { none }
42}
43
44fn keep_error() !f64 {
45 return result_f64() or { error('fallback') }
46}
47
48fn selector_cast_return(h SelectorCastHolder) int {
49 return int(h.x or { return 7 })
50}
51
52fn selector_keep_none(h SelectorCastHolder) ?f64 {
53 return h.x or { none }
54}
55
56fn selector_keep_error(h SelectorCastHolder) !f64 {
57 return h.x or { error('fallback') }
58}
59
60fn test_or_block_result_cast() {
61 a := int(result_f64() or { 256.0 })
62 b := int(result_f64() or { f64(256.0) })
63 c := int(result_f32() or { f32(42.0) })
64 d := int(option_f64() or { 128.0 })
65 e := int(option_f64() or { f64(128.0) })
66
67 assert a == 256
68 assert b == 256
69 assert c == 42
70 assert d == 128
71 assert e == 128
72}
73
74fn test_or_block_result_cast_alias_payload() {
75 a := int(result_my_f64() or { MyF64(64.0) })
76 b := int(option_my_f64() or { MyF64(32.0) })
77
78 assert a == 64
79 assert b == 32
80}
81
82fn test_or_block_result_cast_generic_call() {
83 a := int(result_generic[f64]() or { f64(16.0) })
84
85 assert a == 16
86}
87
88fn test_or_block_cast_preserves_parent_exits() {
89 assert cast_or_block_return() == 7
90 assert keep_none() == none
91
92 if _ := keep_error() {
93 assert false
94 } else {
95 assert err.msg() == 'fallback'
96 }
97}
98
99fn test_or_block_selector_cast() {
100 h := SelectorCastHolder{}
101 gh := GenericSelectorCastHolder[f64]{}
102
103 a := int(h.x or { 3.0 })
104 b := int(h.x or { f64(4.0) })
105 c := int(h.ax or { MyF64(5.0) })
106 d := int(gh.x or { f64(6.0) })
107
108 assert a == 3
109 assert b == 4
110 assert c == 5
111 assert d == 6
112}
113
114fn test_or_block_selector_cast_preserves_parent_exits() {
115 h := SelectorCastHolder{}
116 assert selector_cast_return(h) == 7
117 assert selector_keep_none(h) == none
118
119 if _ := selector_keep_error(h) {
120 assert false
121 } else {
122 assert err.msg() == 'fallback'
123 }
124}
125
126fn test_or_block_result_void_context() {
127 mut seen := false
128 result_f64() or { seen = true }
129 assert seen
130
131 result_f64() or {}
132}
133