| 1 | enum Colors { |
| 2 | red |
| 3 | green |
| 4 | blue |
| 5 | yellow |
| 6 | } |
| 7 | |
| 8 | fn 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 | /* |
| 44 | not implemented |
| 45 | fn 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 | */ |
| 75 | fn 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 | |
| 110 | type MapAlias = map[string]int |
| 111 | type ArrayAlias = []int |
| 112 | |
| 113 | fn 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 | |
| 127 | fn 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 | |
| 137 | fn 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 | |
| 168 | fn 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 | |
| 199 | fn 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 | |
| 230 | fn test_in_array_init() { |
| 231 | assert 1 !in []int{} |
| 232 | assert [1] in [[1], [2]] |
| 233 | } |
| 234 | |
| 235 | fn 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 | |
| 268 | struct Foo1 {} |
| 269 | |
| 270 | struct Foo2 {} |
| 271 | |
| 272 | struct Foo3 {} |
| 273 | |
| 274 | type Foo = Foo1 | Foo2 | Foo3 |
| 275 | |
| 276 | fn 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 | |
| 291 | fn test_in_struct_array() { |
| 292 | assert Foo1{} == Foo1{} |
| 293 | } |
| 294 | |
| 295 | fn fn1() {} |
| 296 | |
| 297 | fn fn2() {} |
| 298 | |
| 299 | fn fn3() {} |
| 300 | |
| 301 | fn test_in_func_array() { |
| 302 | assert fn1 in [fn1, fn2, fn3] |
| 303 | } |
| 304 | |
| 305 | type Str = string |
| 306 | type Struct = Foo1 |
| 307 | |
| 308 | fn test_in_alias_array() { |
| 309 | assert Str('') in [Str(''), Str('a')] |
| 310 | assert Struct{} == Struct{} |
| 311 | } |
| 312 | |
| 313 | type TokenValue = rune | u64 |
| 314 | |
| 315 | fn 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 | |
| 323 | type StringOrNumber = int | string |
| 324 | |
| 325 | fn 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 |
| 332 | struct Bar {} |
| 333 | |
| 334 | fn in_both_mut_ref(mut arr []&Bar, mut bar &Bar) { |
| 335 | assert bar !in arr |
| 336 | } |
| 337 | |
| 338 | fn 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 | |