v2 / vlib / v / tests / options / option_var_test.v
211 lines · 173 sloc · 2.87 KB · ebfa7d86cf9fbd172bf4f9652ef410b43b7b06d2
Raw
1import time
2
3type MyAlias = []int
4type MySumType = []f64 | []int
5
6struct Test {
7}
8
9struct StructType2 {
10 a ?time.Time
11}
12
13struct StructType {
14mut:
15 a string
16 b ?int
17 c ?f64
18 d ?[]string
19 e ?MyAlias
20 f ?MySumType
21}
22
23struct Decoder {}
24
25fn (d &Decoder) decode[T](mut typ T) T {
26 $for field in T.fields {
27 $if field.is_option {
28 if typ.$(field.name) != none {
29 dump(typ.$(field.name) ?.str())
30 }
31 typ.$(field.name) = none
32 }
33 }
34 return typ
35}
36
37fn test_comptime() {
38 d := Decoder{}
39 result := d.decode(mut StructType{
40 a: 'foo'
41 b: 3
42 })
43 println(result)
44}
45
46fn test_cast_option() {
47 mut x := ?int(123)
48 dump(x)
49 assert x != none
50 x = none
51 assert x == none
52 dump(x)
53}
54
55fn test_assign_from_option() {
56 mut x := ?int(123)
57 mut y := x
58 println(y)
59 assert x != none
60 assert y != none
61 assert x? == 123
62 assert y? == 123
63}
64
65fn test_blank_assign() {
66 _ := ?bool(false)
67}
68
69fn test_optional_value_assign() {
70 x := ?int(0)
71 assert x != none
72 assert x? == 0
73}
74
75fn test_assert_initialized() {
76 mut x := ?int(1)
77 mut y := ?int(1)
78 assert x != none
79 assert y != none
80}
81
82fn test_comptime_checks() {
83 val := StructType{
84 a: 'foo'
85 b: 3
86 }
87 $for field in StructType.fields {
88 value := val.$(field.name)
89 $if field.is_option {
90 var := val.$(field.name)
91 var2 := var
92 dump(var)
93 dump(var2)
94 }
95 }
96}
97
98fn test_none_initialization() {
99 mut var := ?int(none)
100 mut var2 := ?int(none)
101 mut var3 := ?int(none)
102
103 assert var == none
104 assert var2 == none
105 assert var3 == none
106
107 var = 1
108 var2 = 2
109 var3 = 3
110
111 assert var? == 1
112 assert var2? == 2
113 assert var3? == 3
114
115 assert var != none
116 assert var2 != none
117 assert var3 != none
118}
119
120fn test_as_cast() {
121 var := StructType2{}
122 b := var.a as ?time.Time
123}
124
125fn test_unwrap() {
126 var := ?int(1)
127 println(var)
128 assert var != none
129 assert var? == 1
130
131 var2 := var? + 1
132 println(var2)
133
134 assert var2 == 2
135}
136
137fn test_or_block() {
138 var1 := ?int(none)
139 var2 := var1 or { 0 }
140 var3 := var1 or { 1 }
141 assert var2 + var3 == 1
142 var4 := var1 or {
143 t := 1 + var3
144 t
145 }
146
147 assert var4 == 2
148}
149
150fn test_default_values() {
151 var_none := ?f64(none)
152 var_none2 := ?string(none)
153
154 var2 := var_none or { 1.0 }
155 println(var2)
156 assert var2 == 1.0
157
158 var3 := var_none2 or { 'foo' }
159 println(var3)
160 assert var3 == 'foo'
161}
162
163fn test_assert_option() {
164 var1 := ?int(none)
165 varz := ?f64(none)
166 assert var1 == none
167
168 var2 := var1 or { 1 }
169
170 assert var1 == none
171 assert var2 == 1
172
173 println(var2)
174
175 var3 := varz or { 0.0 }
176 assert var3 == 0
177
178 var4 := varz
179 assert var4 == none
180}
181
182fn test_opt_assign() {
183 mut var1 := ?int(none)
184 assert var1 == none
185 var1 = 1
186 assert var1 != none
187 var2 := var1
188 assert var2? == var1?
189}
190
191fn test_opt_none() {
192 mut t1 := ?int(none)
193 t2 := ?int(none)
194
195 t1 = t2
196 assert t1 == none
197 assert t2 == none
198
199 mut t3 := ?Test{}
200 t4 := t3
201 assert t4 == none
202 assert t3 == none
203
204 mut t5 := ?map[string]string{}
205 t7 := {
206 'foo': 'bar'
207 }
208 t6 := if t5 != none { t5.clone() } else { t7 }
209 assert t5 == none
210 assert t6.len == 1
211}
212