expr.ha (5608B)
1 // License: MPL-2.0 2 // (c) 2021 Alexey Yerin <yyp@disroot.org> 3 // (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net> 4 // (c) 2021 Drew DeVault <sir@cmpwn.com> 5 // (c) 2021 Ember Sawady <ecs@d2evs.net> 6 // (c) 2022 Sebastian <sebastian@sebsite.pw> 7 8 @test fn assignment() void = { 9 roundtrip("export fn main() void = { 10 x = y; 11 *x = *y + 10; 12 *x = *foo(); 13 *y() = bar(); 14 x += 10; 15 x -= 10; 16 x *= 10; 17 x /= 10; 18 x %= 10; 19 x &= 10; 20 x |= 10; 21 x ^= 10; 22 x >>= 10; 23 x <<= 10; 24 x &&= true; 25 x ||= true; 26 x ^^= true; 27 }; 28 "); 29 }; 30 31 @test fn binarithm() void = { 32 roundtrip("export fn main() void = *void + void * void / void;\n"); 33 }; 34 35 @test fn binding() void = { 36 roundtrip("export fn main() void = { 37 let x: int = 1337, y = 7331; 38 const z: int = 42, q: int = 24; 39 const (foo, bar): (int, bool) = (42, true); 40 const (foo, _, bar): (int, uint, bool) = (42, 12u, true); 41 static let p: int = 62893, o = 39826; 42 static const w: int = 62893, t = 39826; 43 }; 44 "); 45 }; 46 47 @test fn builtin() void = { 48 roundtrip(`export fn main() void = { 49 alloc(1234); 50 alloc(1234...); 51 alloc(4321, 1234); 52 append(x, 10); 53 append(x, 10...); 54 append(x, 10, 20, 30); 55 append(x, y, z, q...); 56 static append(x, 10); 57 abort(); 58 abort("surprize"); 59 static abort(); 60 static abort("surprize"); 61 assert(x == 12); 62 assert(x == 12, "number mismatch"); 63 static assert(x == 12); 64 static assert(x == 12, "number mismatch"); 65 delete(x[10]); 66 delete(x[10..20]); 67 delete(x[..]); 68 delete(x.y.z[..]); 69 static delete(x[10]); 70 free(x); 71 insert(x[0], foo); 72 insert(x[0], foo...); 73 insert(x[0], foo, bar...); 74 static insert(x[0], foo); 75 len([1, 2, 3, 4]); 76 offset(foo.bar); 77 size(u32); 78 vastart(); 79 vaarg(va); 80 vaend(va); 81 }; 82 `); 83 }; 84 85 @test fn call() void = { 86 roundtrip("export fn main() void = test();\n\n" 87 "export fn main() void = test(void, void, void);\n\n" 88 "export fn main() void = test(void, void, void...);\n\n" 89 "export fn main() void = test()()(void);\n"); 90 }; 91 92 @test fn cast() void = { 93 roundtrip("export fn main() void = void: int;\n\n" 94 "export fn main() void = void as int;\n\n" 95 "export fn main() void = void is int;\n\n" 96 "export fn main() void = void as null;\n\n" 97 "export fn main() void = void is null;\n\n" 98 "export fn main() void = void: int: uint: u16: u8;\n\n" 99 "export fn main() void = void: int as uint: u16 is u8;\n\n" 100 "export fn main() void = void: int as null: u16 is null;\n\n" 101 "export fn main() void = {\n\tyield void;\n}: int;\n"); 102 }; 103 104 @test fn constant() void = { 105 roundtrip(`export fn main() void = { 106 2 + (-4 + void) * true / ("hello" << '?'); 107 [1, 2, 3, 4]; 108 [1, 2, 3, 4...]; 109 (1, 2, 3); 110 struct { 111 x: int = 10, 112 y: int = 20, 113 }; 114 coords { 115 x: int = 10, 116 y: int = 20, 117 ... 118 }; 119 coords { 120 x = 10, 121 y = 20, 122 }; 123 struct { 124 x: int = 10, 125 struct { 126 y: int = 20, 127 }, 128 }; 129 struct { 130 x: int = 10, 131 coords { 132 y: int = 20, 133 }, 134 }; 135 struct { 136 x: int = 10, 137 namespace::coords { 138 y: int = 20, 139 }, 140 }; 141 coords { 142 ... 143 }; 144 13.37; 145 13.37f32; 146 13.37f64; 147 6.022e23; 148 1.616255e-35; 149 1337z; 150 1337u; 151 1337i8; 152 1337u8; 153 1337i16; 154 1337u16; 155 1337i32; 156 1337u32; 157 1337i64; 158 1337u64; 159 "backslashes\\and \"double quotes\""; 160 '\''; 161 '\\'; 162 }; 163 `); 164 }; 165 166 @test fn control() void = { 167 roundtrip("export fn main() void = { 168 break; 169 break :foo; 170 continue; 171 continue :foo; 172 return; 173 return 2 + 2; 174 }; 175 "); 176 }; 177 178 @test fn defer_expr() void = { 179 roundtrip("export fn main() void = defer foo();\n"); 180 }; 181 182 @test fn for_expr() void = { 183 roundtrip("export fn main() void = { 184 for (true) { 185 x; 186 }; 187 for (true) :label { 188 x; 189 }; 190 for (let x = 0; x < 10) { 191 x; 192 }; 193 for (x < 10; x) { 194 x; 195 }; 196 for (let x = 10; x < 10; x) { 197 x; 198 }; 199 for (static let x = 0; x < 10) { 200 x; 201 }; 202 }; 203 "); 204 }; 205 206 @test fn if_expr() void = { 207 roundtrip("export fn main() void = { 208 if (x == y) { 209 z; 210 }; 211 if (y == x) z; 212 if (z == q) r else p; 213 if (a == b) c else if (d == e) f else g; 214 }; 215 "); 216 }; 217 218 @test fn list() void = { 219 roundtrip("export fn main() void = { 220 2 + 2; 221 call(); 222 }; 223 "); 224 }; 225 226 @test fn postfix() void = { 227 roundtrip("export fn main() void = x.y;\n\n" 228 "export fn main() void = x.y.z.q;\n\n" 229 "export fn main() void = x().y;\n\n" 230 "export fn main() void = x.42;\n\n" 231 "export fn main() void = x().y.0.q;\n\n" 232 "export fn main() void = x?;\n\n" 233 "export fn main() void = x!;\n\n" 234 "export fn main() void = x()?.y;\n\n" 235 "export fn main() void = x[10];\n\n" 236 "export fn main() void = x[10 + 10][20];\n"); 237 }; 238 239 @test fn slice() void = { 240 roundtrip("export fn main() void = x[..];\n\n" 241 "export fn main() void = x[123..];\n\n" 242 "export fn main() void = x[123..321];\n\n" 243 "export fn main() void = x[..321];\n"); 244 }; 245 246 @test fn switch_expr() void = { 247 roundtrip("export fn main() void = { 248 switch (x) { 249 case 1234, 4321 => 250 return y; 251 case 1337 => 252 return z; 253 case => 254 return q; 255 }; 256 }; 257 "); 258 }; 259 260 @test fn match_expr() void = { 261 roundtrip("export fn main() void = { 262 match (x) { 263 case let i: size => 264 return y; 265 case foo => 266 return bar; 267 case let foo: int => 268 return bar; 269 case foo::bar => 270 return baz; 271 case null => void; 272 case *int => void; 273 }; 274 match (x) { 275 case let s: matchdata => 276 return y; 277 case str => 278 return z; 279 case => 280 return q; 281 }; 282 }; 283 "); 284 }; 285 286 @test fn unarithm() void = { 287 roundtrip("export fn main() void = +void;\n\n" 288 "export fn main() void = -void;\n\n" 289 "export fn main() void = *void;\n\n" 290 "export fn main() void = ~void;\n\n" 291 "export fn main() void = !void;\n\n" 292 "export fn main() void = &void;\n"); 293 }; 294 295 @test fn yield_expr() void = { 296 roundtrip("export fn main() void = yield;\n\n" 297 "export fn main() void = yield void;\n\n" 298 "export fn main() void = yield :foo;\n\n" 299 "export fn main() void = yield :foo, void;\n"); 300 };