v2 / vlib / v / tests / conditions / ifs / in_expression_test.v
342 lines · 289 sloc · 6.24 KB · 1c2f1a35040752af8aea8daf8226bd231d3bca19
Raw
1enum Colors {
2 red
3 green
4 blue
5 yellow
6}
7
8fn test_in_expression() {
9 mut a := false
10 arr1 := [1, 2]
11 arr2 := [0, 2]
12 arr3 := [1, 0]
13
14 a = true && 2 in arr1
15 assert a == true
16 a = false && 2 in arr1
17 assert a == false
18
19 a = true && 0 in arr2
20 assert a == true
21 a = false && 0 in arr3
22 assert a == false
23 a = true && 0 in arr1
24 assert a == false
25 a = true && 3 in arr1
26 assert a == false
27 a = true && 2 !in arr2
28 assert a == false
29 a = true && 3 !in arr2
30 assert a == true
31
32 a = true && 2 !in arr2
33 assert a == false
34 a = true && 3 !in arr2
35 assert a == true
36
37 a = 1 in arr1 && true
38 assert a == true
39 a = 1 in arr1 && false
40 assert a == false
41}
42
43/*
44not implemented
45fn test_in_expression_with_enum() {
46 mut a := false
47 arr1 := [Colors.green, .blue]
48 arr2 := [Colors.red, .blue]
49 arr3 := [Colors.green, .red]
50 a = true && Colors.blue in arr1
51 assert a == true
52 a = false && Colors.blue in arr1
53 assert a == false
54 a = true && Colors.red in arr2
55 assert a == true
56 a = false && Colors.red in arr3
57 assert a == false
58
59 a = true && Colors.red in arr1
60 assert a == false
61 a = true && Colors.yellow in arr1
62 assert a == false
63
64 a = true && !(Colors.blue in arr2)
65 assert a == false
66 a = true && !(Colors.yellow in arr2)
67 assert a == true
68
69 a = Colors.green in arr1 && true
70 assert a == true
71 a = Colors.green in arr1 && false
72 assert a == false
73}
74*/
75fn test_in_expression_with_string() {
76 mut a := false
77 arr1 := ['ab', 'bc']
78 arr2 := ['', 'bc']
79 arr3 := ['ab', '']
80
81 a = true && 'bc' in arr1
82 assert a == true
83 a = false && 'bc' in arr1
84 assert a == false
85
86 a = true && '' in arr2
87 assert a == true
88 a = false && '' in arr3
89 assert a == false
90 a = true && '' in arr1
91 assert a == false
92 a = true && 'abc' in arr1
93 assert a == false
94 a = true && 'bc' !in arr2
95 assert a == false
96 a = true && 'abc' !in arr2
97 assert a == true
98
99 a = true && 'bc' !in arr2
100 assert a == false
101 a = true && 'abc' !in arr2
102 assert a == true
103
104 a = 'ab' in arr1 && true
105 assert a == true
106 a = 'ab' in arr1 && false
107 assert a == false
108}
109
110type MapAlias = map[string]int
111type ArrayAlias = []int
112
113fn test_in_expression_in_alias() {
114 arr := ArrayAlias([0, 1])
115 assert 0 in arr
116 assert 100 !in arr
117
118 m := MapAlias({
119 'one': 1
120 'two': 2
121 'three': 3
122 })
123 assert 'one' in m
124 assert 'four' !in m
125}
126
127fn test_in_expression_in_map() {
128 m := {
129 'one': 1
130 'two': 2
131 'three': 3
132 }
133 assert 'one' in m
134 assert 'four' !in m
135}
136
137fn test_optimized_in_expression() {
138 mut a := false
139 a = true && 2 in [1, 2]
140 assert a == true
141 a = false && 2 in [1, 2]
142 assert a == false
143
144 a = true && 0 in [0, 2]
145 assert a == true
146 a = false && 0 in [1, 0]
147 assert a == false
148 a = true && 0 in [1, 2]
149 assert a == false
150 a = true && 3 in [1, 2]
151 assert a == false
152 a = true && 2 !in [0, 2]
153 assert a == false
154 a = true && 3 !in [0, 2]
155 assert a == true
156
157 a = true && 2 !in [0, 2]
158 assert a == false
159 a = true && 3 !in [0, 2]
160 assert a == true
161
162 a = 1 in [1, 2] && true
163 assert a == true
164 a = 1 in [1, 2] && false
165 assert a == false
166}
167
168fn test_optimized_in_expression_with_enum() {
169 mut a := false
170 a = true && Colors.blue in [.green, .blue]
171 assert a == true
172 a = false && Colors.blue in [.green, .blue]
173 assert a == false
174
175 a = true && Colors.red in [.red, .blue]
176 assert a == true
177 a = false && Colors.red in [.green, .red]
178 assert a == false
179 a = true && Colors.red in [.green, .blue]
180 assert a == false
181 a = true && Colors.yellow in [.green, .blue]
182 assert a == false
183 a = true && Colors.blue !in [.red, .blue]
184 assert a == false
185 a = true && Colors.yellow !in [.red, .blue]
186 assert a == true
187
188 a = true && Colors.blue !in [.red, .blue]
189 assert a == false
190 a = true && Colors.yellow !in [.red, .blue]
191 assert a == true
192
193 a = Colors.green in [.green, .blue] && true
194 assert a == true
195 a = Colors.green in [.green, .blue] && false
196 assert a == false
197}
198
199fn test_optimized_in_expression_with_string() {
200 mut a := false
201 a = true && 'bc' in ['ab', 'bc']
202 assert a == true
203 a = false && 'bc' in ['ab', 'bc']
204 assert a == false
205
206 a = true && '' in ['', 'bc']
207 assert a == true
208 a = false && '' in ['ab', '']
209 assert a == false
210 a = true && '' in ['ab', 'bc']
211 assert a == false
212 a = true && 'abc' in ['ab', 'bc']
213 assert a == false
214 a = true && 'bc' !in ['', 'bc']
215 assert a == false
216 a = true && 'abc' !in ['', 'bc']
217 assert a == true
218
219 a = true && 'bc' !in ['', 'bc']
220 assert a == false
221 a = true && 'abc' !in ['', 'bc']
222 assert a == true
223
224 a = 'ab' in ['ab', 'bc'] && true
225 assert a == true
226 a = 'ab' in ['ab', 'bc'] && false
227 assert a == false
228}
229
230fn test_in_array_init() {
231 assert 1 !in []int{}
232 assert [1] in [[1], [2]]
233}
234
235fn test_in_expression_numeric() {
236 b := [u8(2), 4, 7]
237 b2 := [i8(3), -4, 9]
238 s := [u16(6), 1, 0]
239 s2 := [i16(34), -17, 45]
240 i := [5, 7, 9]
241 i2 := [u32(65), 12, 9]
242 l := [u64(54), 23, 1]
243 l2 := [i64(-45), 8, 2]
244 f := [f32(12.5), 0, -17.25]
245 f2 := [1.0625, 3, 17.125]
246 assert u8(4) in b
247 assert 3 !in b
248 assert -4 in b2
249 assert i8(5) !in b2
250 assert 1 in s
251 assert u16(3) !in s
252 assert 45 in s2
253 assert i16(0) !in s2
254 assert 7 in i
255 assert 8 !in i
256 assert 12 in i2
257 assert u32(13) !in i2
258 assert u64(1) in l
259 assert 2 !in l
260 assert -45 in l2
261 assert i64(-17) !in l2
262 assert -17.25 in f
263 assert f32(1) !in f
264 assert 1.0625 in f2
265 assert 3.5 !in f2
266}
267
268struct Foo1 {}
269
270struct Foo2 {}
271
272struct Foo3 {}
273
274type Foo = Foo1 | Foo2 | Foo3
275
276fn test_in_sumtype_array() {
277 foo := Foo(Foo3{})
278
279 if foo in [Foo1, Foo3] {
280 println(foo)
281 assert true
282 }
283
284 // without sumtype cast
285 mut foos := []Foo{}
286 foos << Foo1{}
287 assert Foo1{} in foos
288 assert Foo2{} !in foos
289}
290
291fn test_in_struct_array() {
292 assert Foo1{} == Foo1{}
293}
294
295fn fn1() {}
296
297fn fn2() {}
298
299fn fn3() {}
300
301fn test_in_func_array() {
302 assert fn1 in [fn1, fn2, fn3]
303}
304
305type Str = string
306type Struct = Foo1
307
308fn test_in_alias_array() {
309 assert Str('') in [Str(''), Str('a')]
310 assert Struct{} == Struct{}
311}
312
313type TokenValue = rune | u64
314
315fn test_in_array_literal_of_sumtype() {
316 val1 := TokenValue(`+`)
317 assert val1 in [TokenValue(`+`), TokenValue(`-`)]
318
319 val2 := `+`
320 assert val2 in [TokenValue(`+`), TokenValue(`-`)]
321}
322
323type StringOrNumber = int | string
324
325fn test_in_array_of_sumtype() {
326 arr := [StringOrNumber(1), 2, 'test']
327 println(1 in arr)
328 assert 1 in arr
329}
330
331// for issue 20268
332struct Bar {}
333
334fn in_both_mut_ref(mut arr []&Bar, mut bar &Bar) {
335 assert bar !in arr
336}
337
338fn test_in_both_mut_and_ref() {
339 mut arr := []&Bar{}
340 mut bar := &Bar{}
341 in_both_mut_ref(mut &arr, mut &bar)
342}
343