Parent Directory
|
Revision Log
* NKSP parser: Fixed crash if unary '-' operator was used on a non-number data type. * NKSP parser: Raise parser error if either unary '-' or '+' operator was used with a non-number data type. * Tests: Added test cases for the fixed issues described above. * Bumped version (2.1.1.svn63).
1 | /* |
2 | * Copyright (c) 2019 - 2020 Christian Schoenebeck |
3 | * |
4 | * http://www.linuxsampler.org |
5 | * |
6 | * This file is part of LinuxSampler and released under the same terms. |
7 | * See README file for details. |
8 | */ |
9 | |
10 | // This file contains automated test cases against the NKSP real-time |
11 | // instrument script engine. |
12 | |
13 | #include "../../common/global.h" |
14 | #include "../../common/optional.h" |
15 | #include "../../common/RTMath.h" |
16 | #include "../ScriptVM.h" |
17 | #include "../common.h" |
18 | #include <sstream> |
19 | #include <stdlib.h> |
20 | #include <time.h> |
21 | #include <assert.h> |
22 | #include <functional> |
23 | |
24 | #ifndef TEST_ASSERT |
25 | # define TEST_ASSERT assert |
26 | #endif |
27 | |
28 | #define TEST_VERIFY(...) \ |
29 | if (!(__VA_ARGS__)) { \ |
30 | fprintf(stderr, "\n[ERROR]: The following NKSP test has failed:\n%s\n", \ |
31 | opt.code.c_str()); \ |
32 | fprintf(stderr, "Violated expectation for this failure was: " #__VA_ARGS__ "\n\n"); \ |
33 | fprintf(stderr, "The overall expectations for this failed NKSP test were:\n\n"); \ |
34 | printExpectations(opt); \ |
35 | fprintf(stderr, "\n"); \ |
36 | } \ |
37 | TEST_ASSERT(__VA_ARGS__); \ |
38 | |
39 | #define TEST_PRINT_BOOL_EXPECTATION(e) \ |
40 | printf(#e ": %s\n", (opt.e) ? "Yes" : "No"); \ |
41 | |
42 | #define TEST_PRINT_BOOL_EXPECTATION_OR(e,alt) \ |
43 | printf(#e ": %s", (opt.e || opt.alt) ? "Yes" : "No"); \ |
44 | if (!opt.e && opt.alt) { \ |
45 | printf(" (implied by " #alt ")"); \ |
46 | } \ |
47 | printf("\n"); \ |
48 | |
49 | #define TEST_PRINT_BOOL_EXPECTATION_OR2(e,alt1,alt2) \ |
50 | printf(#e ": %s", (opt.e || opt.alt1 || opt.alt2) ? "Yes" : "No"); \ |
51 | if (!opt.e) { \ |
52 | if (opt.alt1 && opt.alt2) { \ |
53 | printf(" (implied by " #alt1 " and " #alt2 ")"); \ |
54 | } else if (opt.alt1) { \ |
55 | printf(" (implied by " #alt1 ")"); \ |
56 | } else if (opt.alt2) { \ |
57 | printf(" (implied by " #alt2 ")"); \ |
58 | } \ |
59 | } \ |
60 | printf("\n"); \ |
61 | |
62 | #define TEST_PRINT_OPTIONAL_EXPECTATION(e) \ |
63 | printf(#e ": %s\n", \ |
64 | (opt.e) ? std::to_string(*opt.e).c_str() : "Not expected"); \ |
65 | |
66 | #define TEST_PRINT_OPTIONAL_STRING_EXPECTATION(e) \ |
67 | printf(#e ": %s\n", \ |
68 | (opt.e) ? ("'" + *opt.e + "'").c_str() : "Not expected"); \ |
69 | |
70 | #define TEST_PRINT_VECTOR_EXPECTATION(e) \ |
71 | if (opt.e.empty()) { \ |
72 | printf(#e ": Not expected\n"); \ |
73 | } else { \ |
74 | for (size_t i = 0; i < opt.e.size(); ++i) { \ |
75 | printf(#e ": %s\n", std::to_string(opt.e[i]).c_str()); \ |
76 | if (i < opt.e.size() - 1) printf(", "); \ |
77 | } \ |
78 | } \ |
79 | |
80 | using namespace LinuxSampler; |
81 | using namespace std; |
82 | |
83 | struct RunScriptOpt { |
84 | String code; |
85 | bool expectParseError; |
86 | bool expectParseWarning; |
87 | bool expectRuntimeError; |
88 | bool expectNoExitResult; |
89 | bool expectExitResultIsInt; |
90 | bool expectExitResultIsReal; |
91 | bool prohibitExitFunctionArguments; |
92 | optional<vmint> expectIntExitResult; |
93 | optional<bool> expectBoolExitResult; |
94 | optional<vmfloat> expectRealExitResult; |
95 | optional<String> expectStringExitResult; |
96 | vector<MetricPrefix_t> expectExitResultUnitPrefix; |
97 | optional<StdUnit_t> expectExitResultUnit; |
98 | optional<bool> expectExitResultFinal; |
99 | }; |
100 | |
101 | static void printExpectations(RunScriptOpt opt) { |
102 | TEST_PRINT_BOOL_EXPECTATION(expectParseError); |
103 | TEST_PRINT_BOOL_EXPECTATION(expectParseWarning); |
104 | TEST_PRINT_BOOL_EXPECTATION(expectRuntimeError); |
105 | TEST_PRINT_BOOL_EXPECTATION(expectNoExitResult); |
106 | TEST_PRINT_BOOL_EXPECTATION_OR2(expectExitResultIsInt, /* Or: */ expectIntExitResult, expectBoolExitResult); |
107 | TEST_PRINT_BOOL_EXPECTATION_OR(expectExitResultIsReal, /* Or: */ expectRealExitResult); |
108 | TEST_PRINT_BOOL_EXPECTATION(prohibitExitFunctionArguments); |
109 | TEST_PRINT_OPTIONAL_EXPECTATION(expectIntExitResult); |
110 | TEST_PRINT_OPTIONAL_EXPECTATION(expectBoolExitResult); |
111 | TEST_PRINT_OPTIONAL_EXPECTATION(expectRealExitResult); |
112 | TEST_PRINT_OPTIONAL_STRING_EXPECTATION(expectStringExitResult); |
113 | TEST_PRINT_VECTOR_EXPECTATION(expectExitResultUnitPrefix); |
114 | TEST_PRINT_OPTIONAL_EXPECTATION(expectExitResultUnit); |
115 | TEST_PRINT_OPTIONAL_EXPECTATION(expectExitResultFinal); |
116 | } |
117 | |
118 | static void runScript(const RunScriptOpt& opt) { |
119 | ScriptVM vm; |
120 | vm.setAutoSuspendEnabled(false); |
121 | if (!opt.prohibitExitFunctionArguments) |
122 | vm.setExitResultEnabled(true); |
123 | unique_ptr<VMParserContext> parserCtx( |
124 | vm.loadScript(opt.code) |
125 | ); |
126 | vector<ParserIssue> errors = parserCtx->errors(); |
127 | vector<ParserIssue> warnings = parserCtx->warnings(); |
128 | if (opt.expectParseError) { |
129 | TEST_VERIFY(!errors.empty()); |
130 | return; |
131 | } else { |
132 | for (ParserIssue& err : errors) { |
133 | err.dump(); |
134 | } |
135 | TEST_VERIFY(errors.empty()); |
136 | } |
137 | if (opt.expectParseWarning) { |
138 | TEST_VERIFY(!warnings.empty()); |
139 | } else { |
140 | for (ParserIssue& wrn : warnings) { |
141 | wrn.dump(); |
142 | } |
143 | } |
144 | TEST_VERIFY(parserCtx->eventHandler(0)); |
145 | unique_ptr<VMExecContext> execCtx( |
146 | vm.createExecContext(&*parserCtx) |
147 | ); |
148 | for (int i = 0; parserCtx->eventHandler(i); ++i) { |
149 | VMEventHandler* handler = parserCtx->eventHandler(i); |
150 | VMExecStatus_t result = vm.exec(&*parserCtx, &*execCtx, handler); |
151 | if (opt.expectRuntimeError) { |
152 | TEST_VERIFY(result & VM_EXEC_ERROR); |
153 | } else { |
154 | TEST_VERIFY(!(result & VM_EXEC_ERROR)); |
155 | } |
156 | if (opt.expectNoExitResult) { |
157 | VMExpr* resExpr = execCtx->exitResult(); |
158 | TEST_VERIFY(!resExpr); |
159 | } |
160 | if (opt.expectExitResultIsInt) { |
161 | VMExpr* resExpr = execCtx->exitResult(); |
162 | TEST_VERIFY(resExpr); |
163 | TEST_VERIFY(resExpr->exprType() == INT_EXPR); |
164 | } |
165 | if (opt.expectExitResultIsReal) { |
166 | VMExpr* resExpr = execCtx->exitResult(); |
167 | TEST_VERIFY(resExpr); |
168 | TEST_VERIFY(resExpr->exprType() == REAL_EXPR); |
169 | } |
170 | if (opt.expectIntExitResult) { |
171 | VMExpr* resExpr = execCtx->exitResult(); |
172 | TEST_VERIFY(resExpr); |
173 | TEST_VERIFY(resExpr->exprType() == INT_EXPR); |
174 | TEST_VERIFY(resExpr->asInt()->evalInt() == *opt.expectIntExitResult); |
175 | } |
176 | if (opt.expectRealExitResult) { |
177 | VMExpr* resExpr = execCtx->exitResult(); |
178 | TEST_VERIFY(resExpr); |
179 | TEST_VERIFY(resExpr->exprType() == REAL_EXPR); |
180 | if (sizeof(vmfloat) == sizeof(float)) { |
181 | TEST_VERIFY(RTMath::fEqual32(resExpr->asReal()->evalReal(), *opt.expectRealExitResult)); |
182 | } else { |
183 | TEST_VERIFY(RTMath::fEqual64(resExpr->asReal()->evalReal(), *opt.expectRealExitResult)); |
184 | } |
185 | } |
186 | if (opt.expectBoolExitResult) { |
187 | VMExpr* resExpr = execCtx->exitResult(); |
188 | TEST_VERIFY(resExpr); |
189 | TEST_VERIFY(resExpr->exprType() == INT_EXPR); |
190 | TEST_VERIFY(bool(resExpr->asInt()->evalInt()) == *opt.expectBoolExitResult); |
191 | } |
192 | if (opt.expectStringExitResult) { |
193 | VMExpr* resExpr = execCtx->exitResult(); |
194 | TEST_VERIFY(resExpr); |
195 | TEST_VERIFY(resExpr->exprType() == STRING_EXPR); |
196 | TEST_VERIFY(resExpr->asString()->evalStr() == *opt.expectStringExitResult); |
197 | } |
198 | if (opt.expectExitResultUnit) { |
199 | VMExpr* resExpr = execCtx->exitResult(); |
200 | TEST_VERIFY(resExpr); |
201 | VMNumberExpr* numberExpr = resExpr->asNumber(); |
202 | TEST_VERIFY(numberExpr); |
203 | TEST_VERIFY(numberExpr->unitType() == *opt.expectExitResultUnit); |
204 | } |
205 | if (!opt.expectExitResultUnitPrefix.empty()) { |
206 | VMExpr* resExpr = execCtx->exitResult(); |
207 | TEST_VERIFY(resExpr); |
208 | VMNumberExpr* numberExpr = resExpr->asNumber(); |
209 | TEST_VERIFY(numberExpr); |
210 | auto prefixes = opt.expectExitResultUnitPrefix; |
211 | if (*prefixes.rbegin() != VM_NO_PREFIX) |
212 | prefixes.push_back(VM_NO_PREFIX); // VM_NO_PREFIX termination required by unitFactr() call |
213 | vmfloat expectedFactor = VMUnit::unitFactor(&prefixes[0]); |
214 | vmfloat actualFactor = numberExpr->unitFactor(); |
215 | if (sizeof(vmfloat) == sizeof(float)) { |
216 | TEST_VERIFY(RTMath::fEqual32(expectedFactor, actualFactor)); |
217 | } else { |
218 | TEST_VERIFY(RTMath::fEqual64(expectedFactor, actualFactor)); |
219 | } |
220 | } |
221 | if (opt.expectExitResultFinal) { |
222 | VMExpr* resExpr = execCtx->exitResult(); |
223 | TEST_VERIFY(resExpr); |
224 | VMNumberExpr* numberExpr = resExpr->asNumber(); |
225 | TEST_VERIFY(numberExpr); |
226 | TEST_VERIFY(numberExpr->isFinal() == *opt.expectExitResultFinal); |
227 | } |
228 | } |
229 | } |
230 | |
231 | static void testBuiltInExitFunction() { |
232 | #if !SILENT_TEST |
233 | std::cout << "UNIT TEST: built-in exit() function\n"; |
234 | #endif |
235 | |
236 | runScript({ |
237 | .code = R"NKSP_CODE( |
238 | on init |
239 | end on |
240 | )NKSP_CODE", |
241 | .expectNoExitResult = true |
242 | }); |
243 | |
244 | runScript({ |
245 | .code = R"NKSP_CODE( |
246 | on init |
247 | exit |
248 | end on |
249 | )NKSP_CODE", |
250 | .expectNoExitResult = true |
251 | }); |
252 | |
253 | runScript({ |
254 | .code = R"NKSP_CODE( |
255 | on init |
256 | exit() |
257 | end on |
258 | )NKSP_CODE", |
259 | .expectNoExitResult = true |
260 | }); |
261 | |
262 | // integer tests ... |
263 | |
264 | runScript({ |
265 | .code = R"NKSP_CODE( |
266 | on init |
267 | exit(42) |
268 | end on |
269 | )NKSP_CODE", |
270 | .expectIntExitResult = 42 |
271 | }); |
272 | |
273 | runScript({ |
274 | .code = R"NKSP_CODE( |
275 | on init |
276 | declare $foo := 1 |
277 | if ($foo) |
278 | exit(21) |
279 | end if |
280 | end on |
281 | )NKSP_CODE", |
282 | .expectIntExitResult = 21 |
283 | }); |
284 | |
285 | runScript({ |
286 | .code = R"NKSP_CODE( |
287 | on init |
288 | declare $foo := 0 |
289 | if ($foo) |
290 | exit(21) |
291 | end if |
292 | exit(99) |
293 | end on |
294 | )NKSP_CODE", |
295 | .expectIntExitResult = 99 |
296 | }); |
297 | |
298 | // string tests ... |
299 | |
300 | runScript({ |
301 | .code = R"NKSP_CODE( |
302 | on init |
303 | exit("fourtytwo!") |
304 | end on |
305 | )NKSP_CODE", |
306 | .expectStringExitResult = "fourtytwo!" |
307 | }); |
308 | |
309 | // in production environment we prohibit the built-in exit() function to |
310 | // accept any arguments |
311 | runScript({ |
312 | .code = R"NKSP_CODE( |
313 | on init |
314 | exit(42) |
315 | end on |
316 | )NKSP_CODE", |
317 | .expectParseError = true, // see comment above why |
318 | .prohibitExitFunctionArguments = true // simulate production environment |
319 | }); |
320 | |
321 | // real number tests ... |
322 | |
323 | runScript({ |
324 | .code = R"NKSP_CODE( |
325 | on init |
326 | exit(3.14) |
327 | end on |
328 | )NKSP_CODE", |
329 | .expectRealExitResult = 3.14 |
330 | }); |
331 | |
332 | runScript({ |
333 | .code = R"NKSP_CODE( |
334 | on init |
335 | declare $foo := 1 |
336 | if ($foo) |
337 | exit(3.14) |
338 | end if |
339 | end on |
340 | )NKSP_CODE", |
341 | .expectRealExitResult = 3.14 |
342 | }); |
343 | |
344 | runScript({ |
345 | .code = R"NKSP_CODE( |
346 | on init |
347 | declare $foo := 0 |
348 | if ($foo) |
349 | exit(3.14) |
350 | end if |
351 | exit(6.9) |
352 | end on |
353 | )NKSP_CODE", |
354 | .expectRealExitResult = 6.9 |
355 | }); |
356 | |
357 | // int array tests ... |
358 | |
359 | runScript({ |
360 | .code = R"NKSP_CODE( |
361 | on init |
362 | declare %foo[3] |
363 | %foo[0] := 21 |
364 | exit(%foo[0]) |
365 | end on |
366 | )NKSP_CODE", |
367 | .expectIntExitResult = 21 |
368 | }); |
369 | |
370 | runScript({ |
371 | .code = R"NKSP_CODE( |
372 | on init |
373 | declare %foo[3] := ( 12, 23, 34 ) |
374 | exit(%foo[0]) |
375 | end on |
376 | )NKSP_CODE", |
377 | .expectIntExitResult = 12 |
378 | }); |
379 | |
380 | runScript({ |
381 | .code = R"NKSP_CODE( |
382 | on init |
383 | declare %foo[3] := ( 12, 23, 34 ) |
384 | exit(%foo[1]) |
385 | end on |
386 | )NKSP_CODE", |
387 | .expectIntExitResult = 23 |
388 | }); |
389 | |
390 | runScript({ |
391 | .code = R"NKSP_CODE( |
392 | on init |
393 | declare %foo[3] := ( 12, 23, 34 ) |
394 | exit(%foo[2]) |
395 | end on |
396 | )NKSP_CODE", |
397 | .expectIntExitResult = 34 |
398 | }); |
399 | |
400 | runScript({ // make sure array is entirely initialized with zeroes |
401 | .code = R"NKSP_CODE( |
402 | on init |
403 | declare $i |
404 | declare $result |
405 | declare %foo[100] |
406 | while ($i < 100) |
407 | $result := $result .or. %foo[$i] |
408 | inc($i) |
409 | end while |
410 | exit($result) |
411 | end on |
412 | )NKSP_CODE", |
413 | .expectIntExitResult = 0 |
414 | }); |
415 | |
416 | // real array tests ... |
417 | |
418 | runScript({ |
419 | .code = R"NKSP_CODE( |
420 | on init |
421 | declare ?foo[3] |
422 | ?foo[0] := 34.9 |
423 | exit(?foo[0]) |
424 | end on |
425 | )NKSP_CODE", |
426 | .expectRealExitResult = 34.9 |
427 | }); |
428 | |
429 | runScript({ |
430 | .code = R"NKSP_CODE( |
431 | on init |
432 | declare ?foo[3] := ( 0.3, 23.5, 900.1 ) |
433 | exit(?foo[0]) |
434 | end on |
435 | )NKSP_CODE", |
436 | .expectRealExitResult = 0.3 |
437 | }); |
438 | |
439 | runScript({ |
440 | .code = R"NKSP_CODE( |
441 | on init |
442 | declare ?foo[3] := ( 0.3, 23.5, 900.1 ) |
443 | exit(?foo[1]) |
444 | end on |
445 | )NKSP_CODE", |
446 | .expectRealExitResult = 23.5 |
447 | }); |
448 | |
449 | runScript({ |
450 | .code = R"NKSP_CODE( |
451 | on init |
452 | declare ?foo[3] := ( 0.3, 23.5, 900.1 ) |
453 | exit(?foo[2]) |
454 | end on |
455 | )NKSP_CODE", |
456 | .expectRealExitResult = 900.1 |
457 | }); |
458 | |
459 | runScript({ // make sure array is entirely initialized with zeroes |
460 | .code = R"NKSP_CODE( |
461 | on init |
462 | declare $i |
463 | declare ?foo[100] |
464 | while ($i < 100) |
465 | if (?foo[$i] # 0.0) |
466 | exit(-1) { test failed } |
467 | end if |
468 | inc($i) |
469 | end while |
470 | exit(0) { test succeeded } |
471 | end on |
472 | )NKSP_CODE", |
473 | .expectIntExitResult = 0 |
474 | }); |
475 | |
476 | // std unit tests ... |
477 | |
478 | runScript({ |
479 | .code = R"NKSP_CODE( |
480 | on init |
481 | exit(42s) |
482 | end on |
483 | )NKSP_CODE", |
484 | .expectIntExitResult = 42, |
485 | .expectExitResultUnit = VM_SECOND |
486 | }); |
487 | |
488 | runScript({ |
489 | .code = R"NKSP_CODE( |
490 | on init |
491 | exit(42Hz) |
492 | end on |
493 | )NKSP_CODE", |
494 | .expectIntExitResult = 42, |
495 | .expectExitResultUnit = VM_HERTZ |
496 | }); |
497 | |
498 | runScript({ |
499 | .code = R"NKSP_CODE( |
500 | on init |
501 | exit(42B) |
502 | end on |
503 | )NKSP_CODE", |
504 | .expectIntExitResult = 42, |
505 | .expectExitResultUnit = VM_BEL |
506 | }); |
507 | |
508 | runScript({ |
509 | .code = R"NKSP_CODE( |
510 | on init |
511 | exit(42us) |
512 | end on |
513 | )NKSP_CODE", |
514 | .expectIntExitResult = 42, |
515 | .expectExitResultUnitPrefix = { VM_MICRO }, |
516 | .expectExitResultUnit = VM_SECOND |
517 | }); |
518 | |
519 | runScript({ |
520 | .code = R"NKSP_CODE( |
521 | on init |
522 | exit(42ms) |
523 | end on |
524 | )NKSP_CODE", |
525 | .expectIntExitResult = 42, |
526 | .expectExitResultUnitPrefix = { VM_MILLI }, |
527 | .expectExitResultUnit = VM_SECOND |
528 | }); |
529 | |
530 | runScript({ |
531 | .code = R"NKSP_CODE( |
532 | on init |
533 | exit(42cs) |
534 | end on |
535 | )NKSP_CODE", |
536 | .expectIntExitResult = 42, |
537 | .expectExitResultUnitPrefix = { VM_CENTI }, |
538 | .expectExitResultUnit = VM_SECOND |
539 | }); |
540 | |
541 | runScript({ |
542 | .code = R"NKSP_CODE( |
543 | on init |
544 | exit(42ds) |
545 | end on |
546 | )NKSP_CODE", |
547 | .expectIntExitResult = 42, |
548 | .expectExitResultUnitPrefix = { VM_DECI }, |
549 | .expectExitResultUnit = VM_SECOND |
550 | }); |
551 | |
552 | runScript({ |
553 | .code = R"NKSP_CODE( |
554 | on init |
555 | exit(42das) |
556 | end on |
557 | )NKSP_CODE", |
558 | .expectIntExitResult = 42, |
559 | .expectExitResultUnitPrefix = { VM_DECA }, |
560 | .expectExitResultUnit = VM_SECOND |
561 | }); |
562 | |
563 | runScript({ |
564 | .code = R"NKSP_CODE( |
565 | on init |
566 | exit(42hs) |
567 | end on |
568 | )NKSP_CODE", |
569 | .expectIntExitResult = 42, |
570 | .expectExitResultUnitPrefix = { VM_HECTO }, |
571 | .expectExitResultUnit = VM_SECOND |
572 | }); |
573 | |
574 | runScript({ |
575 | .code = R"NKSP_CODE( |
576 | on init |
577 | exit(42ks) |
578 | end on |
579 | )NKSP_CODE", |
580 | .expectIntExitResult = 42, |
581 | .expectExitResultUnitPrefix = { VM_KILO }, |
582 | .expectExitResultUnit = VM_SECOND |
583 | }); |
584 | |
585 | runScript({ |
586 | .code = R"NKSP_CODE( |
587 | on init |
588 | exit(42s) |
589 | end on |
590 | )NKSP_CODE", |
591 | .expectIntExitResult = 42, |
592 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
593 | .expectExitResultUnit = VM_SECOND |
594 | }); |
595 | |
596 | runScript({ |
597 | .code = R"NKSP_CODE( |
598 | on init |
599 | exit(42uHz) |
600 | end on |
601 | )NKSP_CODE", |
602 | .expectIntExitResult = 42, |
603 | .expectExitResultUnitPrefix = { VM_MICRO }, |
604 | .expectExitResultUnit = VM_HERTZ |
605 | }); |
606 | |
607 | runScript({ |
608 | .code = R"NKSP_CODE( |
609 | on init |
610 | exit(42mHz) |
611 | end on |
612 | )NKSP_CODE", |
613 | .expectIntExitResult = 42, |
614 | .expectExitResultUnitPrefix = { VM_MILLI }, |
615 | .expectExitResultUnit = VM_HERTZ |
616 | }); |
617 | |
618 | runScript({ |
619 | .code = R"NKSP_CODE( |
620 | on init |
621 | exit(42cHz) |
622 | end on |
623 | )NKSP_CODE", |
624 | .expectIntExitResult = 42, |
625 | .expectExitResultUnitPrefix = { VM_CENTI }, |
626 | .expectExitResultUnit = VM_HERTZ |
627 | }); |
628 | |
629 | runScript({ |
630 | .code = R"NKSP_CODE( |
631 | on init |
632 | exit(42dHz) |
633 | end on |
634 | )NKSP_CODE", |
635 | .expectIntExitResult = 42, |
636 | .expectExitResultUnitPrefix = { VM_DECI }, |
637 | .expectExitResultUnit = VM_HERTZ |
638 | }); |
639 | |
640 | runScript({ |
641 | .code = R"NKSP_CODE( |
642 | on init |
643 | exit(42daHz) |
644 | end on |
645 | )NKSP_CODE", |
646 | .expectIntExitResult = 42, |
647 | .expectExitResultUnitPrefix = { VM_DECA }, |
648 | .expectExitResultUnit = VM_HERTZ |
649 | }); |
650 | |
651 | runScript({ |
652 | .code = R"NKSP_CODE( |
653 | on init |
654 | exit(42hHz) |
655 | end on |
656 | )NKSP_CODE", |
657 | .expectIntExitResult = 42, |
658 | .expectExitResultUnitPrefix = { VM_HECTO }, |
659 | .expectExitResultUnit = VM_HERTZ |
660 | }); |
661 | |
662 | runScript({ |
663 | .code = R"NKSP_CODE( |
664 | on init |
665 | exit(42kHz) |
666 | end on |
667 | )NKSP_CODE", |
668 | .expectIntExitResult = 42, |
669 | .expectExitResultUnitPrefix = { VM_KILO }, |
670 | .expectExitResultUnit = VM_HERTZ |
671 | }); |
672 | |
673 | runScript({ |
674 | .code = R"NKSP_CODE( |
675 | on init |
676 | exit(42Hz) |
677 | end on |
678 | )NKSP_CODE", |
679 | .expectIntExitResult = 42, |
680 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
681 | .expectExitResultUnit = VM_HERTZ |
682 | }); |
683 | |
684 | runScript({ |
685 | .code = R"NKSP_CODE( |
686 | on init |
687 | exit(42uB) |
688 | end on |
689 | )NKSP_CODE", |
690 | .expectIntExitResult = 42, |
691 | .expectExitResultUnitPrefix = { VM_MICRO }, |
692 | .expectExitResultUnit = VM_BEL |
693 | }); |
694 | |
695 | runScript({ |
696 | .code = R"NKSP_CODE( |
697 | on init |
698 | exit(42mB) |
699 | end on |
700 | )NKSP_CODE", |
701 | .expectIntExitResult = 42, |
702 | .expectExitResultUnitPrefix = { VM_MILLI }, |
703 | .expectExitResultUnit = VM_BEL |
704 | }); |
705 | |
706 | runScript({ |
707 | .code = R"NKSP_CODE( |
708 | on init |
709 | exit(42cB) |
710 | end on |
711 | )NKSP_CODE", |
712 | .expectIntExitResult = 42, |
713 | .expectExitResultUnitPrefix = { VM_CENTI }, |
714 | .expectExitResultUnit = VM_BEL |
715 | }); |
716 | |
717 | runScript({ |
718 | .code = R"NKSP_CODE( |
719 | on init |
720 | exit(42dB) |
721 | end on |
722 | )NKSP_CODE", |
723 | .expectIntExitResult = 42, |
724 | .expectExitResultUnitPrefix = { VM_DECI }, |
725 | .expectExitResultUnit = VM_BEL |
726 | }); |
727 | |
728 | runScript({ |
729 | .code = R"NKSP_CODE( |
730 | on init |
731 | exit(42daB) |
732 | end on |
733 | )NKSP_CODE", |
734 | .expectIntExitResult = 42, |
735 | .expectExitResultUnitPrefix = { VM_DECA }, |
736 | .expectExitResultUnit = VM_BEL |
737 | }); |
738 | |
739 | runScript({ |
740 | .code = R"NKSP_CODE( |
741 | on init |
742 | exit(42hB) |
743 | end on |
744 | )NKSP_CODE", |
745 | .expectIntExitResult = 42, |
746 | .expectExitResultUnitPrefix = { VM_HECTO }, |
747 | .expectExitResultUnit = VM_BEL |
748 | }); |
749 | |
750 | runScript({ |
751 | .code = R"NKSP_CODE( |
752 | on init |
753 | exit(42kB) |
754 | end on |
755 | )NKSP_CODE", |
756 | .expectIntExitResult = 42, |
757 | .expectExitResultUnitPrefix = { VM_KILO }, |
758 | .expectExitResultUnit = VM_BEL |
759 | }); |
760 | |
761 | runScript({ |
762 | .code = R"NKSP_CODE( |
763 | on init |
764 | exit(42B) |
765 | end on |
766 | )NKSP_CODE", |
767 | .expectIntExitResult = 42, |
768 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
769 | .expectExitResultUnit = VM_BEL |
770 | }); |
771 | |
772 | runScript({ |
773 | .code = R"NKSP_CODE( |
774 | on init |
775 | exit(42udB) |
776 | end on |
777 | )NKSP_CODE", |
778 | .expectIntExitResult = 42, |
779 | .expectExitResultUnitPrefix = { VM_MICRO, VM_DECI }, |
780 | .expectExitResultUnit = VM_BEL |
781 | }); |
782 | |
783 | runScript({ |
784 | .code = R"NKSP_CODE( |
785 | on init |
786 | exit(42mdB) |
787 | end on |
788 | )NKSP_CODE", |
789 | .expectIntExitResult = 42, |
790 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
791 | .expectExitResultUnit = VM_BEL |
792 | }); |
793 | |
794 | runScript({ |
795 | .code = R"NKSP_CODE( |
796 | on init |
797 | exit(42cdB) |
798 | end on |
799 | )NKSP_CODE", |
800 | .expectIntExitResult = 42, |
801 | .expectExitResultUnitPrefix = { VM_CENTI, VM_DECI }, |
802 | .expectExitResultUnit = VM_BEL |
803 | }); |
804 | |
805 | runScript({ |
806 | .code = R"NKSP_CODE( |
807 | on init |
808 | exit(42ddB) |
809 | end on |
810 | )NKSP_CODE", |
811 | .expectIntExitResult = 42, |
812 | .expectExitResultUnitPrefix = { VM_DECI, VM_DECI }, |
813 | .expectExitResultUnit = VM_BEL |
814 | }); |
815 | |
816 | runScript({ |
817 | .code = R"NKSP_CODE( |
818 | on init |
819 | exit(42dadB) |
820 | end on |
821 | )NKSP_CODE", |
822 | .expectIntExitResult = 42, |
823 | .expectExitResultUnitPrefix = { VM_DECA, VM_DECI }, |
824 | .expectExitResultUnit = VM_BEL |
825 | }); |
826 | |
827 | runScript({ |
828 | .code = R"NKSP_CODE( |
829 | on init |
830 | exit(42hdB) |
831 | end on |
832 | )NKSP_CODE", |
833 | .expectIntExitResult = 42, |
834 | .expectExitResultUnitPrefix = { VM_HECTO, VM_DECI }, |
835 | .expectExitResultUnit = VM_BEL |
836 | }); |
837 | |
838 | runScript({ |
839 | .code = R"NKSP_CODE( |
840 | on init |
841 | exit(42kdB) |
842 | end on |
843 | )NKSP_CODE", |
844 | .expectIntExitResult = 42, |
845 | .expectExitResultUnitPrefix = { VM_KILO, VM_DECI }, |
846 | .expectExitResultUnit = VM_BEL |
847 | }); |
848 | |
849 | runScript({ |
850 | .code = R"NKSP_CODE( |
851 | on init |
852 | declare $foo := 42mdB |
853 | exit($foo) |
854 | end on |
855 | )NKSP_CODE", |
856 | .expectIntExitResult = 42, |
857 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
858 | .expectExitResultUnit = VM_BEL |
859 | }); |
860 | |
861 | runScript({ |
862 | .code = R"NKSP_CODE( |
863 | on init |
864 | exit(3.14s) |
865 | end on |
866 | )NKSP_CODE", |
867 | .expectRealExitResult = 3.14, |
868 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
869 | .expectExitResultUnit = VM_SECOND |
870 | }); |
871 | |
872 | runScript({ |
873 | .code = R"NKSP_CODE( |
874 | on init |
875 | exit(3.14us) |
876 | end on |
877 | )NKSP_CODE", |
878 | .expectRealExitResult = 3.14, |
879 | .expectExitResultUnitPrefix = { VM_MICRO }, |
880 | .expectExitResultUnit = VM_SECOND |
881 | }); |
882 | |
883 | runScript({ |
884 | .code = R"NKSP_CODE( |
885 | on init |
886 | exit(3.14ms) |
887 | end on |
888 | )NKSP_CODE", |
889 | .expectRealExitResult = 3.14, |
890 | .expectExitResultUnitPrefix = { VM_MILLI }, |
891 | .expectExitResultUnit = VM_SECOND |
892 | }); |
893 | |
894 | runScript({ |
895 | .code = R"NKSP_CODE( |
896 | on init |
897 | exit(-0.1B) |
898 | end on |
899 | )NKSP_CODE", |
900 | .expectRealExitResult = -0.1, |
901 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
902 | .expectExitResultUnit = VM_BEL |
903 | }); |
904 | |
905 | runScript({ |
906 | .code = R"NKSP_CODE( |
907 | on init |
908 | exit(-0.1dB) |
909 | end on |
910 | )NKSP_CODE", |
911 | .expectRealExitResult = -0.1, |
912 | .expectExitResultUnitPrefix = { VM_DECI }, |
913 | .expectExitResultUnit = VM_BEL |
914 | }); |
915 | |
916 | runScript({ |
917 | .code = R"NKSP_CODE( |
918 | on init |
919 | exit(-0.1mdB) |
920 | end on |
921 | )NKSP_CODE", |
922 | .expectRealExitResult = -0.1, |
923 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
924 | .expectExitResultUnit = VM_BEL |
925 | }); |
926 | |
927 | runScript({ |
928 | .code = R"NKSP_CODE( |
929 | on init |
930 | declare ~foo := -0.1mdB |
931 | exit(~foo) |
932 | end on |
933 | )NKSP_CODE", |
934 | .expectRealExitResult = -0.1, |
935 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
936 | .expectExitResultUnit = VM_BEL |
937 | }); |
938 | |
939 | runScript({ |
940 | .code = R"NKSP_CODE( |
941 | on init |
942 | declare ~foo := 0.0dB |
943 | ~foo := -0.1mdB |
944 | exit(~foo) |
945 | end on |
946 | )NKSP_CODE", |
947 | .expectRealExitResult = -0.1, |
948 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
949 | .expectExitResultUnit = VM_BEL |
950 | }); |
951 | |
952 | runScript({ |
953 | .code = R"NKSP_CODE( |
954 | on init |
955 | declare ~foo := 0.0dB |
956 | ~foo := -0.1Hz |
957 | exit(~foo) |
958 | end on |
959 | )NKSP_CODE", |
960 | .expectParseError = true // assigning different unit type to a variable is not allowed |
961 | }); |
962 | |
963 | // 'final' ('!') operator tests ... |
964 | |
965 | runScript({ |
966 | .code = R"NKSP_CODE( |
967 | on init |
968 | exit(!42) |
969 | end on |
970 | )NKSP_CODE", |
971 | .expectIntExitResult = 42, |
972 | .expectExitResultFinal = true |
973 | }); |
974 | |
975 | runScript({ |
976 | .code = R"NKSP_CODE( |
977 | on init |
978 | exit(42) |
979 | end on |
980 | )NKSP_CODE", |
981 | .expectIntExitResult = 42, |
982 | .expectExitResultFinal = false |
983 | }); |
984 | |
985 | runScript({ |
986 | .code = R"NKSP_CODE( |
987 | on init |
988 | declare $foo := !42 |
989 | exit($foo) |
990 | end on |
991 | )NKSP_CODE", |
992 | .expectIntExitResult = 42, |
993 | .expectExitResultFinal = true |
994 | }); |
995 | |
996 | runScript({ |
997 | .code = R"NKSP_CODE( |
998 | on init |
999 | declare $foo := 42 |
1000 | exit($foo) |
1001 | end on |
1002 | )NKSP_CODE", |
1003 | .expectIntExitResult = 42, |
1004 | .expectExitResultFinal = false |
1005 | }); |
1006 | |
1007 | runScript({ |
1008 | .code = R"NKSP_CODE( |
1009 | on init |
1010 | declare ~foo := !3.14 |
1011 | exit(~foo) |
1012 | end on |
1013 | )NKSP_CODE", |
1014 | .expectRealExitResult = 3.14, |
1015 | .expectExitResultFinal = true |
1016 | }); |
1017 | |
1018 | runScript({ |
1019 | .code = R"NKSP_CODE( |
1020 | on init |
1021 | declare ~foo := 3.14 |
1022 | exit(~foo) |
1023 | end on |
1024 | )NKSP_CODE", |
1025 | .expectRealExitResult = 3.14, |
1026 | .expectExitResultFinal = false |
1027 | }); |
1028 | |
1029 | runScript({ |
1030 | .code = R"NKSP_CODE( |
1031 | on init |
1032 | declare ~foo := !3.14mdB |
1033 | exit(~foo) |
1034 | end on |
1035 | )NKSP_CODE", |
1036 | .expectRealExitResult = 3.14, |
1037 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
1038 | .expectExitResultUnit = VM_BEL, |
1039 | .expectExitResultFinal = true |
1040 | }); |
1041 | |
1042 | runScript({ |
1043 | .code = R"NKSP_CODE( |
1044 | on init |
1045 | declare ~foo := !0.0mdB |
1046 | ~foo := !3.14mdB |
1047 | exit(~foo) |
1048 | end on |
1049 | )NKSP_CODE", |
1050 | .expectRealExitResult = 3.14, |
1051 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
1052 | .expectExitResultUnit = VM_BEL, |
1053 | .expectExitResultFinal = true |
1054 | }); |
1055 | |
1056 | runScript({ |
1057 | .code = R"NKSP_CODE( |
1058 | on init |
1059 | declare ~foo := !0.0mdB |
1060 | ~foo := 3.14mdB |
1061 | exit(~foo) |
1062 | end on |
1063 | )NKSP_CODE", |
1064 | .expectParseError = true // assigning non-final to a final variable not allowed |
1065 | }); |
1066 | |
1067 | runScript({ |
1068 | .code = R"NKSP_CODE( |
1069 | on init |
1070 | declare ~foo := 0.0mdB |
1071 | ~foo := !3.14mdB |
1072 | exit(~foo) |
1073 | end on |
1074 | )NKSP_CODE", |
1075 | .expectParseError = true // assigning final to a non-final variable not allowed |
1076 | }); |
1077 | |
1078 | // exit() acting as return statement ... |
1079 | |
1080 | runScript({ |
1081 | .code = R"NKSP_CODE( |
1082 | function doFoo |
1083 | exit(2) { just return from this user function, i.e. don't stop init handler } |
1084 | end function |
1085 | |
1086 | on init |
1087 | call doFoo |
1088 | exit(3) |
1089 | end on |
1090 | )NKSP_CODE", |
1091 | .expectIntExitResult = 3 |
1092 | }); |
1093 | |
1094 | runScript({ |
1095 | .code = R"NKSP_CODE( |
1096 | function doFoo1 |
1097 | exit(2) { just return from this user function, i.e. don't stop init handler } |
1098 | end function |
1099 | |
1100 | function doFoo2 |
1101 | call doFoo1 |
1102 | exit(3) { just return from this user function, i.e. don't stop init handler } |
1103 | end function |
1104 | |
1105 | on init |
1106 | call doFoo2 |
1107 | exit(4) |
1108 | end on |
1109 | )NKSP_CODE", |
1110 | .expectIntExitResult = 4 |
1111 | }); |
1112 | |
1113 | runScript({ |
1114 | .code = R"NKSP_CODE( |
1115 | function doFoo |
1116 | exit(2) { just return from this user function, i.e. don't stop init handler } |
1117 | end function |
1118 | |
1119 | on init |
1120 | call doFoo |
1121 | exit(3) |
1122 | { dead code ... } |
1123 | call doFoo |
1124 | exit(4) |
1125 | end on |
1126 | )NKSP_CODE", |
1127 | .expectIntExitResult = 3 |
1128 | }); |
1129 | |
1130 | runScript({ |
1131 | .code = R"NKSP_CODE( |
1132 | function doFoo |
1133 | exit(2) { just return from this user function, i.e. don't stop init handler } |
1134 | end function |
1135 | |
1136 | on init |
1137 | call doFoo |
1138 | exit(3) |
1139 | { dead code ... } |
1140 | call doFoo |
1141 | end on |
1142 | )NKSP_CODE", |
1143 | .expectIntExitResult = 3 |
1144 | }); |
1145 | |
1146 | #if !SILENT_TEST |
1147 | std::cout << std::endl; |
1148 | #endif |
1149 | } |
1150 | |
1151 | static void testStringConcatOperator() { |
1152 | #if !SILENT_TEST |
1153 | std::cout << "UNIT TEST: string concatenation (&) operator\n"; |
1154 | #endif |
1155 | |
1156 | // strings only tests ... |
1157 | |
1158 | runScript({ |
1159 | .code = R"NKSP_CODE( |
1160 | on init |
1161 | declare @s := "foo" & " bar" |
1162 | exit(@s) |
1163 | end on |
1164 | )NKSP_CODE", |
1165 | .expectStringExitResult = "foo bar" |
1166 | }); |
1167 | |
1168 | // integer tests ... |
1169 | |
1170 | runScript({ |
1171 | .code = R"NKSP_CODE( |
1172 | on init |
1173 | declare @s := "foo" & " bar" & " " & 123 |
1174 | exit(@s) |
1175 | end on |
1176 | )NKSP_CODE", |
1177 | .expectStringExitResult = "foo bar 123" |
1178 | }); |
1179 | |
1180 | runScript({ |
1181 | .code = R"NKSP_CODE( |
1182 | on init |
1183 | declare $i := 123 |
1184 | declare @s := "foo" & " bar" & " " & $i |
1185 | exit(@s) |
1186 | end on |
1187 | )NKSP_CODE", |
1188 | .expectStringExitResult = "foo bar 123" |
1189 | }); |
1190 | |
1191 | // real number tests ... |
1192 | |
1193 | runScript({ |
1194 | .code = R"NKSP_CODE( |
1195 | on init |
1196 | declare @s := "foo" & " bar" & " " & 1.23 |
1197 | exit(@s) |
1198 | end on |
1199 | )NKSP_CODE", |
1200 | .expectStringExitResult = "foo bar 1.23" |
1201 | }); |
1202 | |
1203 | runScript({ |
1204 | .code = R"NKSP_CODE( |
1205 | on init |
1206 | declare ~r := 3.14 |
1207 | declare @s := "foo" & " bar" & " " & ~r |
1208 | exit(@s) |
1209 | end on |
1210 | )NKSP_CODE", |
1211 | .expectStringExitResult = "foo bar 3.14" |
1212 | }); |
1213 | |
1214 | // std unit tests ... |
1215 | |
1216 | runScript({ |
1217 | .code = R"NKSP_CODE( |
1218 | on init |
1219 | declare $i := 500Hz |
1220 | declare @s := "foo" & " bar" & " " & $i |
1221 | exit(@s) |
1222 | end on |
1223 | )NKSP_CODE", |
1224 | .expectStringExitResult = "foo bar 500Hz" |
1225 | }); |
1226 | |
1227 | runScript({ |
1228 | .code = R"NKSP_CODE( |
1229 | on init |
1230 | declare ~r := 3.14s |
1231 | declare @s := "foo" & " bar" & " " & ~r |
1232 | exit(@s) |
1233 | end on |
1234 | )NKSP_CODE", |
1235 | .expectStringExitResult = "foo bar 3.14s" |
1236 | }); |
1237 | |
1238 | runScript({ |
1239 | .code = R"NKSP_CODE( |
1240 | on init |
1241 | declare ~r := -22.3mdB |
1242 | declare @s := "foo" & " bar" & " " & ~r |
1243 | exit(@s) |
1244 | end on |
1245 | )NKSP_CODE", |
1246 | .expectStringExitResult = "foo bar -22.3mdB" |
1247 | }); |
1248 | |
1249 | runScript({ |
1250 | .code = R"NKSP_CODE( |
1251 | on init |
1252 | declare $i := 20us |
1253 | declare @s := "foo" & " bar" & " " & $i |
1254 | exit(@s) |
1255 | end on |
1256 | )NKSP_CODE", |
1257 | .expectStringExitResult = "foo bar 20us" |
1258 | }); |
1259 | |
1260 | runScript({ |
1261 | .code = R"NKSP_CODE( |
1262 | on init |
1263 | declare $i := 20kHz |
1264 | declare @s := "foo" & " bar" & " " & $i |
1265 | exit(@s) |
1266 | end on |
1267 | )NKSP_CODE", |
1268 | .expectStringExitResult = "foo bar 20kHz" |
1269 | }); |
1270 | |
1271 | runScript({ |
1272 | .code = R"NKSP_CODE( |
1273 | on init |
1274 | declare $i := -6dB |
1275 | declare @s := "foo" & " bar" & " " & $i |
1276 | exit(@s) |
1277 | end on |
1278 | )NKSP_CODE", |
1279 | .expectStringExitResult = "foo bar -6dB" |
1280 | }); |
1281 | |
1282 | runScript({ |
1283 | .code = R"NKSP_CODE( |
1284 | on init |
1285 | declare $i := 1us * 1d |
1286 | declare @s := "foo" & " bar" & " " & $i |
1287 | exit(@s) |
1288 | end on |
1289 | )NKSP_CODE", |
1290 | .expectStringExitResult = "foo bar 1*10^-7s" |
1291 | }); |
1292 | |
1293 | runScript({ |
1294 | .code = R"NKSP_CODE( |
1295 | on init |
1296 | declare ~r := 12.4mc |
1297 | declare @s := "foo" & " bar" & " " & ~r |
1298 | exit(@s) |
1299 | end on |
1300 | )NKSP_CODE", |
1301 | .expectStringExitResult = "foo bar 12.4mc" |
1302 | }); |
1303 | |
1304 | #if !SILENT_TEST |
1305 | std::cout << std::endl; |
1306 | #endif |
1307 | } |
1308 | |
1309 | static void testNegOperator() { |
1310 | #if !SILENT_TEST |
1311 | std::cout << "UNIT TEST: negate (-) operator\n"; |
1312 | #endif |
1313 | |
1314 | // integer tests ... |
1315 | |
1316 | runScript({ |
1317 | .code = R"NKSP_CODE( |
1318 | on init |
1319 | exit(-87) |
1320 | end on |
1321 | )NKSP_CODE", |
1322 | .expectIntExitResult = -87 |
1323 | }); |
1324 | |
1325 | runScript({ |
1326 | .code = R"NKSP_CODE( |
1327 | on init |
1328 | declare $foo := -87 |
1329 | exit(-$foo) |
1330 | end on |
1331 | )NKSP_CODE", |
1332 | .expectIntExitResult = 87 |
1333 | }); |
1334 | |
1335 | // real number tests ... |
1336 | |
1337 | runScript({ |
1338 | .code = R"NKSP_CODE( |
1339 | on init |
1340 | exit(-99.3) |
1341 | end on |
1342 | )NKSP_CODE", |
1343 | .expectRealExitResult = -99.3 |
1344 | }); |
1345 | |
1346 | runScript({ |
1347 | .code = R"NKSP_CODE( |
1348 | on init |
1349 | declare ~foo := -99.3 |
1350 | exit(-~foo) |
1351 | end on |
1352 | )NKSP_CODE", |
1353 | .expectRealExitResult = 99.3 |
1354 | }); |
1355 | |
1356 | // std unit tests |
1357 | |
1358 | runScript({ |
1359 | .code = R"NKSP_CODE( |
1360 | on init |
1361 | declare $foo := -87mdB |
1362 | exit(-$foo) |
1363 | end on |
1364 | )NKSP_CODE", |
1365 | .expectIntExitResult = 87, |
1366 | .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI }, |
1367 | .expectExitResultUnit = VM_BEL |
1368 | }); |
1369 | |
1370 | // 'final' ('!') operator tests ... |
1371 | |
1372 | runScript({ |
1373 | .code = R"NKSP_CODE( |
1374 | on init |
1375 | declare $foo := !-87 |
1376 | exit(-$foo) |
1377 | end on |
1378 | )NKSP_CODE", |
1379 | .expectIntExitResult = 87, |
1380 | .expectExitResultFinal = true |
1381 | }); |
1382 | |
1383 | runScript({ |
1384 | .code = R"NKSP_CODE( |
1385 | on init |
1386 | declare $foo := -87 |
1387 | exit(-$foo) |
1388 | end on |
1389 | )NKSP_CODE", |
1390 | .expectIntExitResult = 87, |
1391 | .expectExitResultFinal = false |
1392 | }); |
1393 | |
1394 | // string tests ... |
1395 | |
1396 | runScript({ |
1397 | .code = R"NKSP_CODE( |
1398 | on init |
1399 | exit(-"text") |
1400 | end on |
1401 | )NKSP_CODE", |
1402 | .expectParseError = true // unary '-' operator requires number |
1403 | }); |
1404 | |
1405 | runScript({ |
1406 | .code = R"NKSP_CODE( |
1407 | on init |
1408 | declare @s := "text" |
1409 | exit(-@s) |
1410 | end on |
1411 | )NKSP_CODE", |
1412 | .expectParseError = true // unary '-' operator requires number |
1413 | }); |
1414 | |
1415 | //TODO: the following are unary '+' operator tests which should be moved to their own function (lazy me). |
1416 | |
1417 | runScript({ |
1418 | .code = R"NKSP_CODE( |
1419 | on init |
1420 | exit(+54) |
1421 | end on |
1422 | )NKSP_CODE", |
1423 | .expectIntExitResult = 54 |
1424 | }); |
1425 | |
1426 | runScript({ |
1427 | .code = R"NKSP_CODE( |
1428 | on init |
1429 | declare $foo := +54 |
1430 | exit( $foo ) |
1431 | end on |
1432 | )NKSP_CODE", |
1433 | .expectIntExitResult = 54 |
1434 | }); |
1435 | |
1436 | runScript({ |
1437 | .code = R"NKSP_CODE( |
1438 | on init |
1439 | exit(+0.45) |
1440 | end on |
1441 | )NKSP_CODE", |
1442 | .expectRealExitResult = 0.45 |
1443 | }); |
1444 | |
1445 | runScript({ |
1446 | .code = R"NKSP_CODE( |
1447 | on init |
1448 | declare ~foo := +0.29 |
1449 | exit( ~foo ) |
1450 | end on |
1451 | )NKSP_CODE", |
1452 | .expectRealExitResult = 0.29 |
1453 | }); |
1454 | |
1455 | // string tests ... |
1456 | |
1457 | runScript({ |
1458 | .code = R"NKSP_CODE( |
1459 | on init |
1460 | exit(+"text") |
1461 | end on |
1462 | )NKSP_CODE", |
1463 | .expectParseError = true // unary '+' operator requires number |
1464 | }); |
1465 | |
1466 | runScript({ |
1467 | .code = R"NKSP_CODE( |
1468 | on init |
1469 | declare @s := "text" |
1470 | exit(+@s) |
1471 | end on |
1472 | )NKSP_CODE", |
1473 | .expectParseError = true // unary '+' operator requires number |
1474 | }); |
1475 | |
1476 | #if !SILENT_TEST |
1477 | std::cout << std::endl; |
1478 | #endif |
1479 | } |
1480 | |
1481 | static void testPlusOperator() { |
1482 | #if !SILENT_TEST |
1483 | std::cout << "UNIT TEST: plus (+) operator\n"; |
1484 | #endif |
1485 | |
1486 | // integer tests ... |
1487 | |
1488 | runScript({ |
1489 | .code = R"NKSP_CODE( |
1490 | on init |
1491 | exit(4 + 3) |
1492 | end on |
1493 | )NKSP_CODE", |
1494 | .expectIntExitResult = 7 |
1495 | }); |
1496 | |
1497 | runScript({ |
1498 | .code = R"NKSP_CODE( |
1499 | on init |
1500 | exit(42 + 145) |
1501 | end on |
1502 | )NKSP_CODE", |
1503 | .expectIntExitResult = 187 |
1504 | }); |
1505 | |
1506 | runScript({ |
1507 | .code = R"NKSP_CODE( |
1508 | on init |
1509 | exit(-4 + 2) |
1510 | end on |
1511 | )NKSP_CODE", |
1512 | .expectIntExitResult = -2 |
1513 | }); |
1514 | |
1515 | // real number tests ... |
1516 | |
1517 | runScript({ |
1518 | .code = R"NKSP_CODE( |
1519 | on init |
1520 | exit(4.0 + 3.0) |
1521 | end on |
1522 | )NKSP_CODE", |
1523 | .expectRealExitResult = 7.0 |
1524 | }); |
1525 | |
1526 | runScript({ |
1527 | .code = R"NKSP_CODE( |
1528 | on init |
1529 | exit(42.3 + 145.2) |
1530 | end on |
1531 | )NKSP_CODE", |
1532 | .expectRealExitResult = 187.5 |
1533 | }); |
1534 | |
1535 | runScript({ |
1536 | .code = R"NKSP_CODE( |
1537 | on init |
1538 | exit(-4.0 + 2.2) |
1539 | end on |
1540 | )NKSP_CODE", |
1541 | .expectRealExitResult = -1.8 |
1542 | }); |
1543 | |
1544 | // std unit tests ... |
1545 | |
1546 | runScript({ |
1547 | .code = R"NKSP_CODE( |
1548 | on init |
1549 | exit(42ms + 145ms) |
1550 | end on |
1551 | )NKSP_CODE", |
1552 | .expectIntExitResult = 187, |
1553 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1554 | .expectExitResultUnit = VM_SECOND |
1555 | }); |
1556 | |
1557 | runScript({ |
1558 | .code = R"NKSP_CODE( |
1559 | on init |
1560 | exit(1s + 145ms) |
1561 | end on |
1562 | )NKSP_CODE", |
1563 | .expectIntExitResult = 1145, |
1564 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1565 | .expectExitResultUnit = VM_SECOND |
1566 | }); |
1567 | |
1568 | runScript({ |
1569 | .code = R"NKSP_CODE( |
1570 | on init |
1571 | exit(42ms + 145) |
1572 | end on |
1573 | )NKSP_CODE", |
1574 | .expectParseError = true // units must match for + operator |
1575 | }); |
1576 | |
1577 | runScript({ |
1578 | .code = R"NKSP_CODE( |
1579 | on init |
1580 | exit(42 + 145ms) |
1581 | end on |
1582 | )NKSP_CODE", |
1583 | .expectParseError = true // units must match for + operator |
1584 | }); |
1585 | |
1586 | runScript({ |
1587 | .code = R"NKSP_CODE( |
1588 | on init |
1589 | exit(42Hz + 145s) |
1590 | end on |
1591 | )NKSP_CODE", |
1592 | .expectParseError = true // units must match for + operator |
1593 | }); |
1594 | |
1595 | runScript({ |
1596 | .code = R"NKSP_CODE( |
1597 | on init |
1598 | exit(42.1ms + 145.3ms) |
1599 | end on |
1600 | )NKSP_CODE", |
1601 | .expectRealExitResult = 187.4, |
1602 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1603 | .expectExitResultUnit = VM_SECOND |
1604 | }); |
1605 | |
1606 | runScript({ |
1607 | .code = R"NKSP_CODE( |
1608 | on init |
1609 | exit(1.1s + 145.0ms) |
1610 | end on |
1611 | )NKSP_CODE", |
1612 | .expectRealExitResult = 1245.0, |
1613 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1614 | .expectExitResultUnit = VM_SECOND |
1615 | }); |
1616 | |
1617 | runScript({ |
1618 | .code = R"NKSP_CODE( |
1619 | on init |
1620 | exit(42.1ms + 145.3) |
1621 | end on |
1622 | )NKSP_CODE", |
1623 | .expectParseError = true // units must match for + operator |
1624 | }); |
1625 | |
1626 | runScript({ |
1627 | .code = R"NKSP_CODE( |
1628 | on init |
1629 | exit(42.0 + 145.0ms) |
1630 | end on |
1631 | )NKSP_CODE", |
1632 | .expectParseError = true // units must match for + operator |
1633 | }); |
1634 | |
1635 | runScript({ |
1636 | .code = R"NKSP_CODE( |
1637 | on init |
1638 | exit(42.0Hz + 145.0s) |
1639 | end on |
1640 | )NKSP_CODE", |
1641 | .expectParseError = true // units must match for + operator |
1642 | }); |
1643 | |
1644 | // 'final' ('!') operator tests ... |
1645 | |
1646 | runScript({ |
1647 | .code = R"NKSP_CODE( |
1648 | on init |
1649 | exit(!4 + !3) |
1650 | end on |
1651 | )NKSP_CODE", |
1652 | .expectIntExitResult = 7, |
1653 | .expectExitResultFinal = true |
1654 | }); |
1655 | |
1656 | runScript({ |
1657 | .code = R"NKSP_CODE( |
1658 | on init |
1659 | exit(4 + 3) |
1660 | end on |
1661 | )NKSP_CODE", |
1662 | .expectIntExitResult = 7, |
1663 | .expectExitResultFinal = false |
1664 | }); |
1665 | |
1666 | runScript({ |
1667 | .code = R"NKSP_CODE( |
1668 | on init |
1669 | exit(!4.1 + !3.3) |
1670 | end on |
1671 | )NKSP_CODE", |
1672 | .expectRealExitResult = 7.4, |
1673 | .expectExitResultFinal = true |
1674 | }); |
1675 | |
1676 | runScript({ |
1677 | .code = R"NKSP_CODE( |
1678 | on init |
1679 | exit(4.1 + 3.3) |
1680 | end on |
1681 | )NKSP_CODE", |
1682 | .expectRealExitResult = 7.4, |
1683 | .expectExitResultFinal = false |
1684 | }); |
1685 | |
1686 | #if !SILENT_TEST |
1687 | std::cout << std::endl; |
1688 | #endif |
1689 | } |
1690 | |
1691 | static void testMinusOperator() { |
1692 | #if !SILENT_TEST |
1693 | std::cout << "UNIT TEST: minus (-) operator\n"; |
1694 | #endif |
1695 | |
1696 | // integer tests ... |
1697 | |
1698 | runScript({ |
1699 | .code = R"NKSP_CODE( |
1700 | on init |
1701 | exit(4 - 3) |
1702 | end on |
1703 | )NKSP_CODE", |
1704 | .expectIntExitResult = 1 |
1705 | }); |
1706 | |
1707 | runScript({ |
1708 | .code = R"NKSP_CODE( |
1709 | on init |
1710 | exit(139 - 74) |
1711 | end on |
1712 | )NKSP_CODE", |
1713 | .expectIntExitResult = 65 |
1714 | }); |
1715 | |
1716 | runScript({ |
1717 | .code = R"NKSP_CODE( |
1718 | on init |
1719 | exit(3 - 9) |
1720 | end on |
1721 | )NKSP_CODE", |
1722 | .expectIntExitResult = -6 |
1723 | }); |
1724 | |
1725 | runScript({ |
1726 | .code = R"NKSP_CODE( |
1727 | on init |
1728 | exit(-3 - 18) |
1729 | end on |
1730 | )NKSP_CODE", |
1731 | .expectIntExitResult = -21 |
1732 | }); |
1733 | |
1734 | // real number tests ... |
1735 | |
1736 | runScript({ |
1737 | .code = R"NKSP_CODE( |
1738 | on init |
1739 | exit(4.0 - 0.2) |
1740 | end on |
1741 | )NKSP_CODE", |
1742 | .expectRealExitResult = 3.8 |
1743 | }); |
1744 | |
1745 | runScript({ |
1746 | .code = R"NKSP_CODE( |
1747 | on init |
1748 | exit(3.1 - 9.65) |
1749 | end on |
1750 | )NKSP_CODE", |
1751 | .expectRealExitResult = -6.55 |
1752 | }); |
1753 | |
1754 | runScript({ |
1755 | .code = R"NKSP_CODE( |
1756 | on init |
1757 | exit(-3.0 - 18.1) |
1758 | end on |
1759 | )NKSP_CODE", |
1760 | .expectRealExitResult = -21.1 |
1761 | }); |
1762 | |
1763 | // std unit tests ... |
1764 | |
1765 | runScript({ |
1766 | .code = R"NKSP_CODE( |
1767 | on init |
1768 | exit(1000ms - 145ms) |
1769 | end on |
1770 | )NKSP_CODE", |
1771 | .expectIntExitResult = 855, |
1772 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1773 | .expectExitResultUnit = VM_SECOND |
1774 | }); |
1775 | |
1776 | runScript({ |
1777 | .code = R"NKSP_CODE( |
1778 | on init |
1779 | exit(1s - 145ms) |
1780 | end on |
1781 | )NKSP_CODE", |
1782 | .expectIntExitResult = 855, |
1783 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1784 | .expectExitResultUnit = VM_SECOND |
1785 | }); |
1786 | |
1787 | runScript({ |
1788 | .code = R"NKSP_CODE( |
1789 | on init |
1790 | exit(1s - 145) |
1791 | end on |
1792 | )NKSP_CODE", |
1793 | .expectParseError = true // units must match for - operator |
1794 | }); |
1795 | |
1796 | runScript({ |
1797 | .code = R"NKSP_CODE( |
1798 | on init |
1799 | exit(1 - 145s) |
1800 | end on |
1801 | )NKSP_CODE", |
1802 | .expectParseError = true // units must match for - operator |
1803 | }); |
1804 | |
1805 | runScript({ |
1806 | .code = R"NKSP_CODE( |
1807 | on init |
1808 | exit(1ms - 145mB) |
1809 | end on |
1810 | )NKSP_CODE", |
1811 | .expectParseError = true // units must match for - operator |
1812 | }); |
1813 | |
1814 | runScript({ |
1815 | .code = R"NKSP_CODE( |
1816 | on init |
1817 | exit(1.0ms - 0.1ms) |
1818 | end on |
1819 | )NKSP_CODE", |
1820 | .expectRealExitResult = 0.9, |
1821 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1822 | .expectExitResultUnit = VM_SECOND |
1823 | }); |
1824 | |
1825 | runScript({ |
1826 | .code = R"NKSP_CODE( |
1827 | on init |
1828 | exit(1.1s - 106.0ms) |
1829 | end on |
1830 | )NKSP_CODE", |
1831 | .expectRealExitResult = 994.0, |
1832 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1833 | .expectExitResultUnit = VM_SECOND |
1834 | }); |
1835 | |
1836 | runScript({ |
1837 | .code = R"NKSP_CODE( |
1838 | on init |
1839 | exit(1100.0ms - 0.106s) |
1840 | end on |
1841 | )NKSP_CODE", |
1842 | .expectRealExitResult = 994.0, |
1843 | .expectExitResultUnitPrefix = { VM_MILLI }, |
1844 | .expectExitResultUnit = VM_SECOND |
1845 | }); |
1846 | |
1847 | runScript({ |
1848 | .code = R"NKSP_CODE( |
1849 | on init |
1850 | exit(1.0s - 145.0) |
1851 | end on |
1852 | )NKSP_CODE", |
1853 | .expectParseError = true // units must match for - operator |
1854 | }); |
1855 | |
1856 | runScript({ |
1857 | .code = R"NKSP_CODE( |
1858 | on init |
1859 | exit(1.0 - 145.0s) |
1860 | end on |
1861 | )NKSP_CODE", |
1862 | .expectParseError = true // units must match for - operator |
1863 | }); |
1864 | |
1865 | runScript({ |
1866 | .code = R"NKSP_CODE( |
1867 | on init |
1868 | exit(1.0ms - 145.0mB) |
1869 | end on |
1870 | )NKSP_CODE", |
1871 | .expectParseError = true // units must match for - operator |
1872 | }); |
1873 | |
1874 | // 'final' ('!') operator tests ... |
1875 | |
1876 | runScript({ |
1877 | .code = R"NKSP_CODE( |
1878 | on init |
1879 | exit(!5 - !3) |
1880 | end on |
1881 | )NKSP_CODE", |
1882 | .expectIntExitResult = 2, |
1883 | .expectExitResultFinal = true |
1884 | }); |
1885 | |
1886 | runScript({ |
1887 | .code = R"NKSP_CODE( |
1888 | on init |
1889 | exit(5 - 3) |
1890 | end on |
1891 | )NKSP_CODE", |
1892 | .expectIntExitResult = 2, |
1893 | .expectExitResultFinal = false |
1894 | }); |
1895 | |
1896 | runScript({ |
1897 | .code = R"NKSP_CODE( |
1898 | on init |
1899 | exit(!5.9 - !3.3) |
1900 | end on |
1901 | )NKSP_CODE", |
1902 | .expectRealExitResult = 2.6, |
1903 | .expectExitResultFinal = true |
1904 | }); |
1905 | |
1906 | runScript({ |
1907 | .code = R"NKSP_CODE( |
1908 | on init |
1909 | exit(5.9 - 3.3) |
1910 | end on |
1911 | )NKSP_CODE", |
1912 | .expectRealExitResult = 2.6, |
1913 | .expectExitResultFinal = false |
1914 | }); |
1915 | |
1916 | #if !SILENT_TEST |
1917 | std::cout << std::endl; |
1918 | #endif |
1919 | } |
1920 | |
1921 | static void testModuloOperator() { |
1922 | #if !SILENT_TEST |
1923 | std::cout << "UNIT TEST: modulo (mod) operator\n"; |
1924 | #endif |
1925 | |
1926 | // integer tests ... |
1927 | |
1928 | runScript({ |
1929 | .code = R"NKSP_CODE( |
1930 | on init |
1931 | exit(10 mod 8) |
1932 | end on |
1933 | )NKSP_CODE", |
1934 | .expectIntExitResult = 2 |
1935 | }); |
1936 | |
1937 | runScript({ |
1938 | .code = R"NKSP_CODE( |
1939 | on init |
1940 | declare $a := 10 |
1941 | declare $b := 8 |
1942 | exit($a mod $b) |
1943 | end on |
1944 | )NKSP_CODE", |
1945 | .expectIntExitResult = 2 |
1946 | }); |
1947 | |
1948 | // real number tests ... |
1949 | // (mod operator prohibits real numbers ATM) |
1950 | |
1951 | runScript({ |
1952 | .code = R"NKSP_CODE( |
1953 | on init |
1954 | exit(10.0 mod 8.0) |
1955 | end on |
1956 | )NKSP_CODE", |
1957 | .expectParseError = true // mod operator prohibits real numbers ATM |
1958 | }); |
1959 | |
1960 | runScript({ |
1961 | .code = R"NKSP_CODE( |
1962 | on init |
1963 | exit(10 mod 8.0) |
1964 | end on |
1965 | )NKSP_CODE", |
1966 | .expectParseError = true // mod operator prohibits real numbers ATM |
1967 | }); |
1968 | |
1969 | runScript({ |
1970 | .code = R"NKSP_CODE( |
1971 | on init |
1972 | exit(10.0 mod 8) |
1973 | end on |
1974 | )NKSP_CODE", |
1975 | .expectParseError = true // mod operator prohibits real numbers ATM |
1976 | }); |
1977 | |
1978 | runScript({ |
1979 | .code = R"NKSP_CODE( |
1980 | on init |
1981 | declare ~a := 10.0 |
1982 | declare ~b := 8.0 |
1983 | exit(~a mod ~b) |
1984 | end on |
1985 | )NKSP_CODE", |
1986 | .expectParseError = true // mod operator prohibits real numbers ATM |
1987 | }); |
1988 | |
1989 | // std unit tests ... |
1990 | |
1991 | runScript({ |
1992 | .code = R"NKSP_CODE( |
1993 | on init |
1994 | exit(10s mod 8) |
1995 | end on |
1996 | )NKSP_CODE", |
1997 | .expectParseError = true // mod operator prohibits std units ATM |
1998 | }); |
1999 | |
2000 | runScript({ |
2001 | .code = R"NKSP_CODE( |
2002 | on init |
2003 | exit(10 mod 8s) |
2004 | end on |
2005 | )NKSP_CODE", |
2006 | .expectParseError = true // mod operator prohibits std units ATM |
2007 | }); |
2008 | |
2009 | runScript({ |
2010 | .code = R"NKSP_CODE( |
2011 | on init |
2012 | exit(10s mod 8s) |
2013 | end on |
2014 | )NKSP_CODE", |
2015 | .expectParseError = true // mod operator prohibits std units ATM |
2016 | }); |
2017 | |
2018 | // 'final' ('!') operator tests ... |
2019 | |
2020 | runScript({ |
2021 | .code = R"NKSP_CODE( |
2022 | on init |
2023 | exit(!10 mod !8) |
2024 | end on |
2025 | )NKSP_CODE", |
2026 | .expectIntExitResult = 2, |
2027 | .expectExitResultFinal = true |
2028 | }); |
2029 | |
2030 | runScript({ |
2031 | .code = R"NKSP_CODE( |
2032 | on init |
2033 | exit(10 mod 8) |
2034 | end on |
2035 | )NKSP_CODE", |
2036 | .expectIntExitResult = 2, |
2037 | .expectExitResultFinal = false |
2038 | }); |
2039 | |
2040 | #if !SILENT_TEST |
2041 | std::cout << std::endl; |
2042 | #endif |
2043 | } |
2044 | |
2045 | static void testMultiplyOperator() { |
2046 | #if !SILENT_TEST |
2047 | std::cout << "UNIT TEST: multiply (*) operator\n"; |
2048 | #endif |
2049 | |
2050 | // integer tests ... |
2051 | |
2052 | runScript({ |
2053 | .code = R"NKSP_CODE( |
2054 | on init |
2055 | exit(10 * 8) |
2056 | end on |
2057 | )NKSP_CODE", |
2058 | .expectIntExitResult = 80 |
2059 | }); |
2060 | |
2061 | runScript({ |
2062 | .code = R"NKSP_CODE( |
2063 | on init |
2064 | exit(-3 * -4) |
2065 | end on |
2066 | )NKSP_CODE", |
2067 | .expectIntExitResult = 12 |
2068 | }); |
2069 | |
2070 | runScript({ |
2071 | .code = R"NKSP_CODE( |
2072 | on init |
2073 | exit(-52 * 63) |
2074 | end on |
2075 | )NKSP_CODE", |
2076 | .expectIntExitResult = -3276 |
2077 | }); |
2078 | |
2079 | runScript({ |
2080 | .code = R"NKSP_CODE( |
2081 | on init |
2082 | exit(123 * -59) |
2083 | end on |
2084 | )NKSP_CODE", |
2085 | .expectIntExitResult = -7257 |
2086 | }); |
2087 | |
2088 | // real number tests ... |
2089 | |
2090 | runScript({ |
2091 | .code = R"NKSP_CODE( |
2092 | on init |
2093 | exit(10.2 * 8.4) |
2094 | end on |
2095 | )NKSP_CODE", |
2096 | .expectRealExitResult = 85.68 |
2097 | }); |
2098 | |
2099 | runScript({ |
2100 | .code = R"NKSP_CODE( |
2101 | on init |
2102 | exit(10.0 * -3.33) |
2103 | end on |
2104 | )NKSP_CODE", |
2105 | .expectRealExitResult = -33.3 |
2106 | }); |
2107 | |
2108 | runScript({ |
2109 | .code = R"NKSP_CODE( |
2110 | on init |
2111 | exit(-3.33 * 10.0) |
2112 | end on |
2113 | )NKSP_CODE", |
2114 | .expectRealExitResult = -33.3 |
2115 | }); |
2116 | |
2117 | runScript({ |
2118 | .code = R"NKSP_CODE( |
2119 | on init |
2120 | exit(-3.33 * -10.0) |
2121 | end on |
2122 | )NKSP_CODE", |
2123 | .expectRealExitResult = 33.3 |
2124 | }); |
2125 | |
2126 | // mixed type tests ... |
2127 | // (mixed int * real forbidden ATM) |
2128 | |
2129 | runScript({ |
2130 | .code = R"NKSP_CODE( |
2131 | on init |
2132 | exit(2 * 3.0) |
2133 | end on |
2134 | )NKSP_CODE", |
2135 | .expectParseError = true // mixed int * real forbidden ATM |
2136 | }); |
2137 | |
2138 | runScript({ |
2139 | .code = R"NKSP_CODE( |
2140 | on init |
2141 | exit(2.0 * 3) |
2142 | end on |
2143 | )NKSP_CODE", |
2144 | .expectParseError = true // mixed int * real forbidden ATM |
2145 | }); |
2146 | |
2147 | // std unit tests ... |
2148 | |
2149 | runScript({ |
2150 | .code = R"NKSP_CODE( |
2151 | on init |
2152 | exit(10ms * 8) |
2153 | end on |
2154 | )NKSP_CODE", |
2155 | .expectIntExitResult = 80, |
2156 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2157 | .expectExitResultUnit = VM_SECOND |
2158 | }); |
2159 | |
2160 | runScript({ |
2161 | .code = R"NKSP_CODE( |
2162 | on init |
2163 | exit(10 * 8ms) |
2164 | end on |
2165 | )NKSP_CODE", |
2166 | .expectIntExitResult = 80, |
2167 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2168 | .expectExitResultUnit = VM_SECOND |
2169 | }); |
2170 | |
2171 | runScript({ |
2172 | .code = R"NKSP_CODE( |
2173 | on init |
2174 | exit(10s * 8s) |
2175 | end on |
2176 | )NKSP_CODE", |
2177 | .expectParseError = true // units on both sides not allowed for * ATM |
2178 | }); |
2179 | |
2180 | runScript({ |
2181 | .code = R"NKSP_CODE( |
2182 | on init |
2183 | exit(10cs * 8d) |
2184 | end on |
2185 | )NKSP_CODE", |
2186 | .expectIntExitResult = 80, |
2187 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2188 | .expectExitResultUnit = VM_SECOND |
2189 | }); |
2190 | |
2191 | runScript({ |
2192 | .code = R"NKSP_CODE( |
2193 | on init |
2194 | exit(10m * 8ms) |
2195 | end on |
2196 | )NKSP_CODE", |
2197 | .expectIntExitResult = 80, |
2198 | .expectExitResultUnitPrefix = { VM_MICRO }, |
2199 | .expectExitResultUnit = VM_SECOND |
2200 | }); |
2201 | |
2202 | runScript({ |
2203 | .code = R"NKSP_CODE( |
2204 | on init |
2205 | exit(10ms * 8k) |
2206 | end on |
2207 | )NKSP_CODE", |
2208 | .expectIntExitResult = 80, |
2209 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
2210 | .expectExitResultUnit = VM_SECOND |
2211 | }); |
2212 | |
2213 | runScript({ |
2214 | .code = R"NKSP_CODE( |
2215 | on init |
2216 | exit(10.1ms * 8.0) |
2217 | end on |
2218 | )NKSP_CODE", |
2219 | .expectRealExitResult = 80.8, |
2220 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2221 | .expectExitResultUnit = VM_SECOND |
2222 | }); |
2223 | |
2224 | runScript({ |
2225 | .code = R"NKSP_CODE( |
2226 | on init |
2227 | exit(10.1 * 8.0ms) |
2228 | end on |
2229 | )NKSP_CODE", |
2230 | .expectRealExitResult = 80.8, |
2231 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2232 | .expectExitResultUnit = VM_SECOND |
2233 | }); |
2234 | |
2235 | runScript({ |
2236 | .code = R"NKSP_CODE( |
2237 | on init |
2238 | exit(10.0s * 8.0s) |
2239 | end on |
2240 | )NKSP_CODE", |
2241 | .expectParseError = true // units on both sides not allowed for * ATM |
2242 | }); |
2243 | |
2244 | runScript({ |
2245 | .code = R"NKSP_CODE( |
2246 | on init |
2247 | exit(10.1ds * 8.0c) |
2248 | end on |
2249 | )NKSP_CODE", |
2250 | .expectRealExitResult = 80.8, |
2251 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2252 | .expectExitResultUnit = VM_SECOND |
2253 | }); |
2254 | |
2255 | runScript({ |
2256 | .code = R"NKSP_CODE( |
2257 | on init |
2258 | exit(10.1m * 8.0ms) |
2259 | end on |
2260 | )NKSP_CODE", |
2261 | .expectRealExitResult = 80.8, |
2262 | .expectExitResultUnitPrefix = { VM_MICRO }, |
2263 | .expectExitResultUnit = VM_SECOND |
2264 | }); |
2265 | |
2266 | runScript({ |
2267 | .code = R"NKSP_CODE( |
2268 | on init |
2269 | exit(10.1m * 8.0ks) |
2270 | end on |
2271 | )NKSP_CODE", |
2272 | .expectRealExitResult = 80.8, |
2273 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
2274 | .expectExitResultUnit = VM_SECOND |
2275 | }); |
2276 | |
2277 | runScript({ |
2278 | .code = R"NKSP_CODE( |
2279 | on init |
2280 | declare ~foo := 1.0 { neutral } |
2281 | declare $bar := 7000ms |
2282 | exit(~foo * real($bar)) |
2283 | end on |
2284 | )NKSP_CODE", |
2285 | .expectRealExitResult = 7000.0, |
2286 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2287 | .expectExitResultUnit = VM_SECOND |
2288 | }); |
2289 | |
2290 | runScript({ |
2291 | .code = R"NKSP_CODE( |
2292 | on init |
2293 | declare $foo := 1 { neutral } |
2294 | declare $bar := 7000ms |
2295 | exit(real($foo) * real($bar)) |
2296 | end on |
2297 | )NKSP_CODE", |
2298 | .expectRealExitResult = 7000.0, |
2299 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2300 | .expectExitResultUnit = VM_SECOND |
2301 | }); |
2302 | |
2303 | // 'final' ('!') operator tests ... |
2304 | |
2305 | runScript({ |
2306 | .code = R"NKSP_CODE( |
2307 | on init |
2308 | exit(!10 * !8) |
2309 | end on |
2310 | )NKSP_CODE", |
2311 | .expectIntExitResult = 80, |
2312 | .expectExitResultFinal = true |
2313 | }); |
2314 | |
2315 | runScript({ |
2316 | .code = R"NKSP_CODE( |
2317 | on init |
2318 | exit(10 * 8) |
2319 | end on |
2320 | )NKSP_CODE", |
2321 | .expectIntExitResult = 80, |
2322 | .expectExitResultFinal = false |
2323 | }); |
2324 | |
2325 | runScript({ |
2326 | .code = R"NKSP_CODE( |
2327 | on init |
2328 | exit(!10 * 8) |
2329 | end on |
2330 | )NKSP_CODE", |
2331 | .expectIntExitResult = 80, |
2332 | .expectExitResultFinal = true, |
2333 | .expectParseWarning = true // since final only on one side, result will be final though |
2334 | }); |
2335 | |
2336 | runScript({ |
2337 | .code = R"NKSP_CODE( |
2338 | on init |
2339 | exit(10 * !8) |
2340 | end on |
2341 | )NKSP_CODE", |
2342 | .expectIntExitResult = 80, |
2343 | .expectExitResultFinal = true, |
2344 | .expectParseWarning = true // since final only on one side, result will be final though |
2345 | }); |
2346 | |
2347 | runScript({ |
2348 | .code = R"NKSP_CODE( |
2349 | on init |
2350 | exit(!10.1 * !8.0) |
2351 | end on |
2352 | )NKSP_CODE", |
2353 | .expectRealExitResult = 80.8, |
2354 | .expectExitResultFinal = true |
2355 | }); |
2356 | |
2357 | runScript({ |
2358 | .code = R"NKSP_CODE( |
2359 | on init |
2360 | exit(10.1 * 8.0) |
2361 | end on |
2362 | )NKSP_CODE", |
2363 | .expectRealExitResult = 80.8, |
2364 | .expectExitResultFinal = false |
2365 | }); |
2366 | |
2367 | runScript({ |
2368 | .code = R"NKSP_CODE( |
2369 | on init |
2370 | exit(!10.1 * 8.0) |
2371 | end on |
2372 | )NKSP_CODE", |
2373 | .expectRealExitResult = 80.8, |
2374 | .expectExitResultFinal = true, |
2375 | .expectParseWarning = true // since final only on one side, result will be final though |
2376 | }); |
2377 | |
2378 | runScript({ |
2379 | .code = R"NKSP_CODE( |
2380 | on init |
2381 | exit(10.1 * !8.0) |
2382 | end on |
2383 | )NKSP_CODE", |
2384 | .expectRealExitResult = 80.8, |
2385 | .expectExitResultFinal = true, |
2386 | .expectParseWarning = true // since final only on one side, result will be final though |
2387 | }); |
2388 | |
2389 | #if !SILENT_TEST |
2390 | std::cout << std::endl; |
2391 | #endif |
2392 | } |
2393 | |
2394 | static void testDivideOperator() { |
2395 | #if !SILENT_TEST |
2396 | std::cout << "UNIT TEST: divide (/) operator\n"; |
2397 | #endif |
2398 | |
2399 | // integer tests ... |
2400 | |
2401 | runScript({ |
2402 | .code = R"NKSP_CODE( |
2403 | on init |
2404 | exit(9 / 3) |
2405 | end on |
2406 | )NKSP_CODE", |
2407 | .expectIntExitResult = 3 |
2408 | }); |
2409 | |
2410 | runScript({ |
2411 | .code = R"NKSP_CODE( |
2412 | on init |
2413 | exit(-27 / 3) |
2414 | end on |
2415 | )NKSP_CODE", |
2416 | .expectIntExitResult = -9 |
2417 | }); |
2418 | |
2419 | runScript({ |
2420 | .code = R"NKSP_CODE( |
2421 | on init |
2422 | exit(35 / -5) |
2423 | end on |
2424 | )NKSP_CODE", |
2425 | .expectIntExitResult = -7 |
2426 | }); |
2427 | |
2428 | runScript({ |
2429 | .code = R"NKSP_CODE( |
2430 | on init |
2431 | exit(39 / -5) |
2432 | end on |
2433 | )NKSP_CODE", |
2434 | .expectIntExitResult = -7 |
2435 | }); |
2436 | |
2437 | // real number tests ... |
2438 | |
2439 | runScript({ |
2440 | .code = R"NKSP_CODE( |
2441 | on init |
2442 | exit(9.0 / 10.0) |
2443 | end on |
2444 | )NKSP_CODE", |
2445 | .expectRealExitResult = 0.9 |
2446 | }); |
2447 | |
2448 | runScript({ |
2449 | .code = R"NKSP_CODE( |
2450 | on init |
2451 | exit(-9.0 / 10.0) |
2452 | end on |
2453 | )NKSP_CODE", |
2454 | .expectRealExitResult = -0.9 |
2455 | }); |
2456 | |
2457 | runScript({ |
2458 | .code = R"NKSP_CODE( |
2459 | on init |
2460 | exit(9.0 / -10.0) |
2461 | end on |
2462 | )NKSP_CODE", |
2463 | .expectRealExitResult = -0.9 |
2464 | }); |
2465 | |
2466 | runScript({ |
2467 | .code = R"NKSP_CODE( |
2468 | on init |
2469 | exit(-9.0 / -10.0) |
2470 | end on |
2471 | )NKSP_CODE", |
2472 | .expectRealExitResult = 0.9 |
2473 | }); |
2474 | |
2475 | // mixed type tests ... |
2476 | // (mixed int / real forbidden ATM) |
2477 | |
2478 | runScript({ |
2479 | .code = R"NKSP_CODE( |
2480 | on init |
2481 | exit(9 / 10.0) |
2482 | end on |
2483 | )NKSP_CODE", |
2484 | .expectParseError = true // mixed int / real forbidden ATM |
2485 | }); |
2486 | |
2487 | runScript({ |
2488 | .code = R"NKSP_CODE( |
2489 | on init |
2490 | exit(9.0 / 10) |
2491 | end on |
2492 | )NKSP_CODE", |
2493 | .expectParseError = true // mixed int / real forbidden ATM |
2494 | }); |
2495 | |
2496 | // std unit tests ... |
2497 | |
2498 | runScript({ |
2499 | .code = R"NKSP_CODE( |
2500 | on init |
2501 | exit(-27us / 3) |
2502 | end on |
2503 | )NKSP_CODE", |
2504 | .expectIntExitResult = -9, |
2505 | .expectExitResultUnitPrefix = { VM_MICRO }, |
2506 | .expectExitResultUnit = VM_SECOND |
2507 | }); |
2508 | |
2509 | runScript({ |
2510 | .code = R"NKSP_CODE( |
2511 | on init |
2512 | exit(-27mdB / 3mdB) |
2513 | end on |
2514 | )NKSP_CODE", |
2515 | .expectIntExitResult = -9, |
2516 | .expectExitResultUnitPrefix = { VM_NO_PREFIX }, |
2517 | .expectExitResultUnit = VM_NO_UNIT |
2518 | }); |
2519 | |
2520 | runScript({ |
2521 | .code = R"NKSP_CODE( |
2522 | on init |
2523 | exit(-27s / 3m) |
2524 | end on |
2525 | )NKSP_CODE", |
2526 | .expectIntExitResult = -9, |
2527 | .expectExitResultUnitPrefix = { VM_KILO }, |
2528 | .expectExitResultUnit = VM_SECOND |
2529 | }); |
2530 | |
2531 | runScript({ |
2532 | .code = R"NKSP_CODE( |
2533 | on init |
2534 | exit(-27us / 3m) |
2535 | end on |
2536 | )NKSP_CODE", |
2537 | .expectIntExitResult = -9, |
2538 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2539 | .expectExitResultUnit = VM_SECOND |
2540 | }); |
2541 | |
2542 | runScript({ |
2543 | .code = R"NKSP_CODE( |
2544 | on init |
2545 | exit(-27 / 3s) |
2546 | end on |
2547 | )NKSP_CODE", |
2548 | .expectParseError = true // illegal unit type arrangement for divisions |
2549 | }); |
2550 | |
2551 | runScript({ |
2552 | .code = R"NKSP_CODE( |
2553 | on init |
2554 | exit(-27s / 3Hz) |
2555 | end on |
2556 | )NKSP_CODE", |
2557 | .expectParseError = true // unit types are not matching |
2558 | }); |
2559 | |
2560 | runScript({ |
2561 | .code = R"NKSP_CODE( |
2562 | on init |
2563 | declare $foo := 1000000 |
2564 | declare $bar := 7000ms |
2565 | exit(real($foo) / 1000000.0 * real($bar)) |
2566 | end on |
2567 | )NKSP_CODE", |
2568 | .expectRealExitResult = 7000.0, |
2569 | .expectExitResultUnitPrefix = { VM_MILLI }, |
2570 | .expectExitResultUnit = VM_SECOND |
2571 | }); |
2572 | |
2573 | // 'final' ('!') operator tests ... |
2574 | |
2575 | runScript({ |
2576 | .code = R"NKSP_CODE( |
2577 | on init |
2578 | exit(!-27 / !3) |
2579 | end on |
2580 | )NKSP_CODE", |
2581 | .expectIntExitResult = -9, |
2582 | .expectExitResultFinal = true |
2583 | }); |
2584 | |
2585 | runScript({ |
2586 | .code = R"NKSP_CODE( |
2587 | on init |
2588 | exit(-27 / 3) |
2589 | end on |
2590 | )NKSP_CODE", |
2591 | .expectIntExitResult = -9, |
2592 | .expectExitResultFinal = false |
2593 | }); |
2594 | |
2595 | runScript({ |
2596 | .code = R"NKSP_CODE( |
2597 | on init |
2598 | exit(!-27 / 3) |
2599 | end on |
2600 | )NKSP_CODE", |
2601 | .expectIntExitResult = -9, |
2602 | .expectExitResultFinal = true, |
2603 | .expectParseWarning = true // final only on one side, result will be final though |
2604 | }); |
2605 | |
2606 | runScript({ |
2607 | .code = R"NKSP_CODE( |
2608 | on init |
2609 | exit(-27 / !3) |
2610 | end on |
2611 | )NKSP_CODE", |
2612 | .expectIntExitResult = -9, |
2613 | .expectExitResultFinal = true, |
2614 | .expectParseWarning = true // final only on one side, result will be final though |
2615 | }); |
2616 | |
2617 | #if !SILENT_TEST |
2618 | std::cout << std::endl; |
2619 | #endif |
2620 | } |
2621 | |
2622 | static void testSmallerThanOperator() { |
2623 | #if !SILENT_TEST |
2624 | std::cout << "UNIT TEST: smaller than (<) operator\n"; |
2625 | #endif |
2626 | |
2627 | // integer tests ... |
2628 | |
2629 | runScript({ |
2630 | .code = R"NKSP_CODE( |
2631 | on init |
2632 | exit(3 < 4) |
2633 | end on |
2634 | )NKSP_CODE", |
2635 | .expectBoolExitResult = true |
2636 | }); |
2637 | |
2638 | runScript({ |
2639 | .code = R"NKSP_CODE( |
2640 | on init |
2641 | exit(4 < 3) |
2642 | end on |
2643 | )NKSP_CODE", |
2644 | .expectBoolExitResult = false |
2645 | }); |
2646 | |
2647 | runScript({ |
2648 | .code = R"NKSP_CODE( |
2649 | on init |
2650 | exit(-4 < 3) |
2651 | end on |
2652 | )NKSP_CODE", |
2653 | .expectBoolExitResult = true |
2654 | }); |
2655 | |
2656 | runScript({ |
2657 | .code = R"NKSP_CODE( |
2658 | on init |
2659 | exit(3 < -4) |
2660 | end on |
2661 | )NKSP_CODE", |
2662 | .expectBoolExitResult = false |
2663 | }); |
2664 | |
2665 | runScript({ |
2666 | .code = R"NKSP_CODE( |
2667 | on init |
2668 | exit(123 < -45) |
2669 | end on |
2670 | )NKSP_CODE", |
2671 | .expectBoolExitResult = false |
2672 | }); |
2673 | |
2674 | runScript({ |
2675 | .code = R"NKSP_CODE( |
2676 | on init |
2677 | exit(-45 < 123) |
2678 | end on |
2679 | )NKSP_CODE", |
2680 | .expectBoolExitResult = true |
2681 | }); |
2682 | |
2683 | // real number tests ... |
2684 | |
2685 | runScript({ |
2686 | .code = R"NKSP_CODE( |
2687 | on init |
2688 | exit(3.0 < 4.0) |
2689 | end on |
2690 | )NKSP_CODE", |
2691 | .expectBoolExitResult = true |
2692 | }); |
2693 | |
2694 | runScript({ |
2695 | .code = R"NKSP_CODE( |
2696 | on init |
2697 | exit(4.0 < 3.0) |
2698 | end on |
2699 | )NKSP_CODE", |
2700 | .expectBoolExitResult = false |
2701 | }); |
2702 | |
2703 | runScript({ |
2704 | .code = R"NKSP_CODE( |
2705 | on init |
2706 | exit(1.2 < 1.23) |
2707 | end on |
2708 | )NKSP_CODE", |
2709 | .expectBoolExitResult = true |
2710 | }); |
2711 | |
2712 | runScript({ |
2713 | .code = R"NKSP_CODE( |
2714 | on init |
2715 | exit(1.23 < 1.2) |
2716 | end on |
2717 | )NKSP_CODE", |
2718 | .expectBoolExitResult = false |
2719 | }); |
2720 | |
2721 | runScript({ |
2722 | .code = R"NKSP_CODE( |
2723 | on init |
2724 | exit(-4.0 < 3.0) |
2725 | end on |
2726 | )NKSP_CODE", |
2727 | .expectBoolExitResult = true |
2728 | }); |
2729 | |
2730 | runScript({ |
2731 | .code = R"NKSP_CODE( |
2732 | on init |
2733 | exit(3.0 < -4.0) |
2734 | end on |
2735 | )NKSP_CODE", |
2736 | .expectBoolExitResult = false |
2737 | }); |
2738 | |
2739 | runScript({ |
2740 | .code = R"NKSP_CODE( |
2741 | on init |
2742 | exit(123.0 < -45.0) |
2743 | end on |
2744 | )NKSP_CODE", |
2745 | .expectBoolExitResult = false |
2746 | }); |
2747 | |
2748 | runScript({ |
2749 | .code = R"NKSP_CODE( |
2750 | on init |
2751 | exit(-45.0 < 123.0) |
2752 | end on |
2753 | )NKSP_CODE", |
2754 | .expectBoolExitResult = true |
2755 | }); |
2756 | |
2757 | // mixed type tests ... |
2758 | |
2759 | runScript({ |
2760 | .code = R"NKSP_CODE( |
2761 | on init |
2762 | exit(9 < 9.1) |
2763 | end on |
2764 | )NKSP_CODE", |
2765 | .expectBoolExitResult = true |
2766 | }); |
2767 | |
2768 | runScript({ |
2769 | .code = R"NKSP_CODE( |
2770 | on init |
2771 | exit(9.1 < 9) |
2772 | end on |
2773 | )NKSP_CODE", |
2774 | .expectBoolExitResult = false |
2775 | }); |
2776 | |
2777 | // std unit tests ... |
2778 | |
2779 | runScript({ |
2780 | .code = R"NKSP_CODE( |
2781 | on init |
2782 | exit(13ms < 14ms) |
2783 | end on |
2784 | )NKSP_CODE", |
2785 | .expectBoolExitResult = true |
2786 | }); |
2787 | |
2788 | runScript({ |
2789 | .code = R"NKSP_CODE( |
2790 | on init |
2791 | exit(14ms < 13ms) |
2792 | end on |
2793 | )NKSP_CODE", |
2794 | .expectBoolExitResult = false |
2795 | }); |
2796 | |
2797 | runScript({ |
2798 | .code = R"NKSP_CODE( |
2799 | on init |
2800 | exit(1s < 990ms) |
2801 | end on |
2802 | )NKSP_CODE", |
2803 | .expectBoolExitResult = false |
2804 | }); |
2805 | |
2806 | runScript({ |
2807 | .code = R"NKSP_CODE( |
2808 | on init |
2809 | exit(990ms < 1s) |
2810 | end on |
2811 | )NKSP_CODE", |
2812 | .expectBoolExitResult = true |
2813 | }); |
2814 | |
2815 | runScript({ |
2816 | .code = R"NKSP_CODE( |
2817 | on init |
2818 | exit(1000ms < 1s) |
2819 | end on |
2820 | )NKSP_CODE", |
2821 | .expectBoolExitResult = false |
2822 | }); |
2823 | |
2824 | runScript({ |
2825 | .code = R"NKSP_CODE( |
2826 | on init |
2827 | exit(1s < 1000ms) |
2828 | end on |
2829 | )NKSP_CODE", |
2830 | .expectBoolExitResult = false |
2831 | }); |
2832 | |
2833 | runScript({ |
2834 | .code = R"NKSP_CODE( |
2835 | on init |
2836 | exit(1s < 1) |
2837 | end on |
2838 | )NKSP_CODE", |
2839 | .expectParseError = true // units on both sides must match |
2840 | }); |
2841 | |
2842 | runScript({ |
2843 | .code = R"NKSP_CODE( |
2844 | on init |
2845 | exit(1 < 1s) |
2846 | end on |
2847 | )NKSP_CODE", |
2848 | .expectParseError = true // units on both sides must match |
2849 | }); |
2850 | |
2851 | runScript({ |
2852 | .code = R"NKSP_CODE( |
2853 | on init |
2854 | exit(1Hz < 1B) |
2855 | end on |
2856 | )NKSP_CODE", |
2857 | .expectParseError = true // units on both sides must match |
2858 | }); |
2859 | |
2860 | runScript({ |
2861 | .code = R"NKSP_CODE( |
2862 | on init |
2863 | exit(13.0ms < 13.1ms) |
2864 | end on |
2865 | )NKSP_CODE", |
2866 | .expectBoolExitResult = true |
2867 | }); |
2868 | |
2869 | runScript({ |
2870 | .code = R"NKSP_CODE( |
2871 | on init |
2872 | exit(13.1ms < 13.0ms) |
2873 | end on |
2874 | )NKSP_CODE", |
2875 | .expectBoolExitResult = false |
2876 | }); |
2877 | |
2878 | runScript({ |
2879 | .code = R"NKSP_CODE( |
2880 | on init |
2881 | exit(0.9s < 600.0ms) |
2882 | end on |
2883 | )NKSP_CODE", |
2884 | .expectBoolExitResult = false |
2885 | }); |
2886 | |
2887 | runScript({ |
2888 | .code = R"NKSP_CODE( |
2889 | on init |
2890 | exit(600.0ms < 0.9s) |
2891 | end on |
2892 | )NKSP_CODE", |
2893 | .expectBoolExitResult = true |
2894 | }); |
2895 | |
2896 | runScript({ |
2897 | .code = R"NKSP_CODE( |
2898 | on init |
2899 | exit(5.1kHz < 5100.0Hz) |
2900 | end on |
2901 | )NKSP_CODE", |
2902 | .expectBoolExitResult = false |
2903 | }); |
2904 | |
2905 | runScript({ |
2906 | .code = R"NKSP_CODE( |
2907 | on init |
2908 | exit(5100.0Hz < 5.1kHz) |
2909 | end on |
2910 | )NKSP_CODE", |
2911 | .expectBoolExitResult = false |
2912 | }); |
2913 | |
2914 | runScript({ |
2915 | .code = R"NKSP_CODE( |
2916 | on init |
2917 | exit(1.0Hz < 1.1) |
2918 | end on |
2919 | )NKSP_CODE", |
2920 | .expectParseError = true // units on both sides must match |
2921 | }); |
2922 | |
2923 | runScript({ |
2924 | .code = R"NKSP_CODE( |
2925 | on init |
2926 | exit(1.2 < 1.34mdB) |
2927 | end on |
2928 | )NKSP_CODE", |
2929 | .expectParseError = true // units on both sides must match |
2930 | }); |
2931 | |
2932 | runScript({ |
2933 | .code = R"NKSP_CODE( |
2934 | on init |
2935 | exit(9.23us < 3.14kHz) |
2936 | end on |
2937 | )NKSP_CODE", |
2938 | .expectParseError = true // units on both sides must match |
2939 | }); |
2940 | |
2941 | // 'final' ('!') operator tests ... |
2942 | // (should always yield in false for relation operators) |
2943 | |
2944 | runScript({ |
2945 | .code = R"NKSP_CODE( |
2946 | on init |
2947 | exit(!-4 < !3) |
2948 | end on |
2949 | )NKSP_CODE", |
2950 | .expectBoolExitResult = true, |
2951 | .expectExitResultFinal = false |
2952 | }); |
2953 | |
2954 | runScript({ |
2955 | .code = R"NKSP_CODE( |
2956 | on init |
2957 | exit(-4 < 3) |
2958 | end on |
2959 | )NKSP_CODE", |
2960 | .expectBoolExitResult = true, |
2961 | .expectExitResultFinal = false |
2962 | }); |
2963 | |
2964 | #if !SILENT_TEST |
2965 | std::cout << std::endl; |
2966 | #endif |
2967 | } |
2968 | |
2969 | static void testGreaterThanOperator() { |
2970 | #if !SILENT_TEST |
2971 | std::cout << "UNIT TEST: greater than (>) operator\n"; |
2972 | #endif |
2973 | |
2974 | // integer tests ... |
2975 | |
2976 | runScript({ |
2977 | .code = R"NKSP_CODE( |
2978 | on init |
2979 | exit(3 > 4) |
2980 | end on |
2981 | )NKSP_CODE", |
2982 | .expectBoolExitResult = false |
2983 | }); |
2984 | |
2985 | runScript({ |
2986 | .code = R"NKSP_CODE( |
2987 | on init |
2988 | exit(4 > 3) |
2989 | end on |
2990 | )NKSP_CODE", |
2991 | .expectBoolExitResult = true |
2992 | }); |
2993 | |
2994 | runScript({ |
2995 | .code = R"NKSP_CODE( |
2996 | on init |
2997 | exit(-4 > 3) |
2998 | end on |
2999 | )NKSP_CODE", |
3000 | .expectBoolExitResult = false |
3001 | }); |
3002 | |
3003 | runScript({ |
3004 | .code = R"NKSP_CODE( |
3005 | on init |
3006 | exit(3 > -4) |
3007 | end on |
3008 | )NKSP_CODE", |
3009 | .expectBoolExitResult = true |
3010 | }); |
3011 | |
3012 | runScript({ |
3013 | .code = R"NKSP_CODE( |
3014 | on init |
3015 | exit(123 > -45) |
3016 | end on |
3017 | )NKSP_CODE", |
3018 | .expectBoolExitResult = true |
3019 | }); |
3020 | |
3021 | runScript({ |
3022 | .code = R"NKSP_CODE( |
3023 | on init |
3024 | exit(-45 > 123) |
3025 | end on |
3026 | )NKSP_CODE", |
3027 | .expectBoolExitResult = false |
3028 | }); |
3029 | |
3030 | // real number tests ... |
3031 | |
3032 | runScript({ |
3033 | .code = R"NKSP_CODE( |
3034 | on init |
3035 | exit(3.0 > 4.0) |
3036 | end on |
3037 | )NKSP_CODE", |
3038 | .expectBoolExitResult = false |
3039 | }); |
3040 | |
3041 | runScript({ |
3042 | .code = R"NKSP_CODE( |
3043 | on init |
3044 | exit(4.0 > 3.0) |
3045 | end on |
3046 | )NKSP_CODE", |
3047 | .expectBoolExitResult = true |
3048 | }); |
3049 | |
3050 | runScript({ |
3051 | .code = R"NKSP_CODE( |
3052 | on init |
3053 | exit(1.2 > 1.23) |
3054 | end on |
3055 | )NKSP_CODE", |
3056 | .expectBoolExitResult = false |
3057 | }); |
3058 | |
3059 | runScript({ |
3060 | .code = R"NKSP_CODE( |
3061 | on init |
3062 | exit(1.23 > 1.2) |
3063 | end on |
3064 | )NKSP_CODE", |
3065 | .expectBoolExitResult = true |
3066 | }); |
3067 | |
3068 | runScript({ |
3069 | .code = R"NKSP_CODE( |
3070 | on init |
3071 | exit(-4.0 > 3.0) |
3072 | end on |
3073 | )NKSP_CODE", |
3074 | .expectBoolExitResult = false |
3075 | }); |
3076 | |
3077 | runScript({ |
3078 | .code = R"NKSP_CODE( |
3079 | on init |
3080 | exit(3.0 > -4.0) |
3081 | end on |
3082 | )NKSP_CODE", |
3083 | .expectBoolExitResult = true |
3084 | }); |
3085 | |
3086 | runScript({ |
3087 | .code = R"NKSP_CODE( |
3088 | on init |
3089 | exit(123.0 > -45.0) |
3090 | end on |
3091 | )NKSP_CODE", |
3092 | .expectBoolExitResult = true |
3093 | }); |
3094 | |
3095 | runScript({ |
3096 | .code = R"NKSP_CODE( |
3097 | on init |
3098 | exit(-45.0 > 123.0) |
3099 | end on |
3100 | )NKSP_CODE", |
3101 | .expectBoolExitResult = false |
3102 | }); |
3103 | |
3104 | // mixed type tests ... |
3105 | |
3106 | runScript({ |
3107 | .code = R"NKSP_CODE( |
3108 | on init |
3109 | exit(9 > 9.1) |
3110 | end on |
3111 | )NKSP_CODE", |
3112 | .expectBoolExitResult = false |
3113 | }); |
3114 | |
3115 | runScript({ |
3116 | .code = R"NKSP_CODE( |
3117 | on init |
3118 | exit(9.1 > 9) |
3119 | end on |
3120 | )NKSP_CODE", |
3121 | .expectBoolExitResult = true |
3122 | }); |
3123 | |
3124 | // std unit tests ... |
3125 | |
3126 | runScript({ |
3127 | .code = R"NKSP_CODE( |
3128 | on init |
3129 | exit(13ms > 14ms) |
3130 | end on |
3131 | )NKSP_CODE", |
3132 | .expectBoolExitResult = false |
3133 | }); |
3134 | |
3135 | runScript({ |
3136 | .code = R"NKSP_CODE( |
3137 | on init |
3138 | exit(14ms > 13ms) |
3139 | end on |
3140 | )NKSP_CODE", |
3141 | .expectBoolExitResult = true |
3142 | }); |
3143 | |
3144 | runScript({ |
3145 | .code = R"NKSP_CODE( |
3146 | on init |
3147 | exit(1s > 990ms) |
3148 | end on |
3149 | )NKSP_CODE", |
3150 | .expectBoolExitResult = true |
3151 | }); |
3152 | |
3153 | runScript({ |
3154 | .code = R"NKSP_CODE( |
3155 | on init |
3156 | exit(990ms > 1s) |
3157 | end on |
3158 | )NKSP_CODE", |
3159 | .expectBoolExitResult = false |
3160 | }); |
3161 | |
3162 | runScript({ |
3163 | .code = R"NKSP_CODE( |
3164 | on init |
3165 | exit(1000ms > 1s) |
3166 | end on |
3167 | )NKSP_CODE", |
3168 | .expectBoolExitResult = false |
3169 | }); |
3170 | |
3171 | runScript({ |
3172 | .code = R"NKSP_CODE( |
3173 | on init |
3174 | exit(1s > 1000ms) |
3175 | end on |
3176 | )NKSP_CODE", |
3177 | .expectBoolExitResult = false |
3178 | }); |
3179 | |
3180 | runScript({ |
3181 | .code = R"NKSP_CODE( |
3182 | on init |
3183 | exit(1s > 1) |
3184 | end on |
3185 | )NKSP_CODE", |
3186 | .expectParseError = true // units on both sides must match |
3187 | }); |
3188 | |
3189 | runScript({ |
3190 | .code = R"NKSP_CODE( |
3191 | on init |
3192 | exit(1 > 1s) |
3193 | end on |
3194 | )NKSP_CODE", |
3195 | .expectParseError = true // units on both sides must match |
3196 | }); |
3197 | |
3198 | runScript({ |
3199 | .code = R"NKSP_CODE( |
3200 | on init |
3201 | exit(1Hz > 1B) |
3202 | end on |
3203 | )NKSP_CODE", |
3204 | .expectParseError = true // units on both sides must match |
3205 | }); |
3206 | |
3207 | runScript({ |
3208 | .code = R"NKSP_CODE( |
3209 | on init |
3210 | exit(13.0ms > 13.1ms) |
3211 | end on |
3212 | )NKSP_CODE", |
3213 | .expectBoolExitResult = false |
3214 | }); |
3215 | |
3216 | runScript({ |
3217 | .code = R"NKSP_CODE( |
3218 | on init |
3219 | exit(13.1ms > 13.0ms) |
3220 | end on |
3221 | )NKSP_CODE", |
3222 | .expectBoolExitResult = true |
3223 | }); |
3224 | |
3225 | runScript({ |
3226 | .code = R"NKSP_CODE( |
3227 | on init |
3228 | exit(0.9s > 600.0ms) |
3229 | end on |
3230 | )NKSP_CODE", |
3231 | .expectBoolExitResult = true |
3232 | }); |
3233 | |
3234 | runScript({ |
3235 | .code = R"NKSP_CODE( |
3236 | on init |
3237 | exit(600.0ms > 0.9s) |
3238 | end on |
3239 | )NKSP_CODE", |
3240 | .expectBoolExitResult = false |
3241 | }); |
3242 | |
3243 | runScript({ |
3244 | .code = R"NKSP_CODE( |
3245 | on init |
3246 | exit(5.1kHz > 5100.0Hz) |
3247 | end on |
3248 | )NKSP_CODE", |
3249 | .expectBoolExitResult = false |
3250 | }); |
3251 | |
3252 | runScript({ |
3253 | .code = R"NKSP_CODE( |
3254 | on init |
3255 | exit(5100.0Hz > 5.1kHz) |
3256 | end on |
3257 | )NKSP_CODE", |
3258 | .expectBoolExitResult = false |
3259 | }); |
3260 | |
3261 | runScript({ |
3262 | .code = R"NKSP_CODE( |
3263 | on init |
3264 | exit(1.0Hz > 1.1) |
3265 | end on |
3266 | )NKSP_CODE", |
3267 | .expectParseError = true // units on both sides must match |
3268 | }); |
3269 | |
3270 | runScript({ |
3271 | .code = R"NKSP_CODE( |
3272 | on init |
3273 | exit(1.2 > 1.34mdB) |
3274 | end on |
3275 | )NKSP_CODE", |
3276 | .expectParseError = true // units on both sides must match |
3277 | }); |
3278 | |
3279 | runScript({ |
3280 | .code = R"NKSP_CODE( |
3281 | on init |
3282 | exit(9.23us > 3.14kHz) |
3283 | end on |
3284 | )NKSP_CODE", |
3285 | .expectParseError = true // units on both sides must match |
3286 | }); |
3287 | |
3288 | // 'final' ('!') operator tests ... |
3289 | // (should always yield in false for relation operators) |
3290 | |
3291 | runScript({ |
3292 | .code = R"NKSP_CODE( |
3293 | on init |
3294 | exit(!-4 > !3) |
3295 | end on |
3296 | )NKSP_CODE", |
3297 | .expectBoolExitResult = false, |
3298 | .expectExitResultFinal = false |
3299 | }); |
3300 | |
3301 | runScript({ |
3302 | .code = R"NKSP_CODE( |
3303 | on init |
3304 | exit(-4 > 3) |
3305 | end on |
3306 | )NKSP_CODE", |
3307 | .expectBoolExitResult = false, |
3308 | .expectExitResultFinal = false |
3309 | }); |
3310 | |
3311 | #if !SILENT_TEST |
3312 | std::cout << std::endl; |
3313 | #endif |
3314 | } |
3315 | |
3316 | static void testSmallerOrEqualOperator() { |
3317 | #if !SILENT_TEST |
3318 | std::cout << "UNIT TEST: smaller-or-equal (<=) operator\n"; |
3319 | #endif |
3320 | |
3321 | // integer tests ... |
3322 | |
3323 | runScript({ |
3324 | .code = R"NKSP_CODE( |
3325 | on init |
3326 | exit(3 <= 3) |
3327 | end on |
3328 | )NKSP_CODE", |
3329 | .expectBoolExitResult = true |
3330 | }); |
3331 | |
3332 | runScript({ |
3333 | .code = R"NKSP_CODE( |
3334 | on init |
3335 | exit(4 <= 4) |
3336 | end on |
3337 | )NKSP_CODE", |
3338 | .expectBoolExitResult = true |
3339 | }); |
3340 | |
3341 | runScript({ |
3342 | .code = R"NKSP_CODE( |
3343 | on init |
3344 | exit(-23 <= -23) |
3345 | end on |
3346 | )NKSP_CODE", |
3347 | .expectBoolExitResult = true |
3348 | }); |
3349 | |
3350 | runScript({ |
3351 | .code = R"NKSP_CODE( |
3352 | on init |
3353 | exit(23 <= -23) |
3354 | end on |
3355 | )NKSP_CODE", |
3356 | .expectBoolExitResult = false |
3357 | }); |
3358 | |
3359 | runScript({ |
3360 | .code = R"NKSP_CODE( |
3361 | on init |
3362 | exit(3 <= 4) |
3363 | end on |
3364 | )NKSP_CODE", |
3365 | .expectBoolExitResult = true |
3366 | }); |
3367 | |
3368 | runScript({ |
3369 | .code = R"NKSP_CODE( |
3370 | on init |
3371 | exit(4 <= 3) |
3372 | end on |
3373 | )NKSP_CODE", |
3374 | .expectBoolExitResult = false |
3375 | }); |
3376 | |
3377 | runScript({ |
3378 | .code = R"NKSP_CODE( |
3379 | on init |
3380 | exit(-4 <= 3) |
3381 | end on |
3382 | )NKSP_CODE", |
3383 | .expectBoolExitResult = true |
3384 | }); |
3385 | |
3386 | runScript({ |
3387 | .code = R"NKSP_CODE( |
3388 | on init |
3389 | exit(3 <= -4) |
3390 | end on |
3391 | )NKSP_CODE", |
3392 | .expectBoolExitResult = false |
3393 | }); |
3394 | |
3395 | runScript({ |
3396 | .code = R"NKSP_CODE( |
3397 | on init |
3398 | exit(123 <= -45) |
3399 | end on |
3400 | )NKSP_CODE", |
3401 | .expectBoolExitResult = false |
3402 | }); |
3403 | |
3404 | runScript({ |
3405 | .code = R"NKSP_CODE( |
3406 | on init |
3407 | exit(-45 <= 123) |
3408 | end on |
3409 | )NKSP_CODE", |
3410 | .expectBoolExitResult = true |
3411 | }); |
3412 | |
3413 | // real number tests ... |
3414 | |
3415 | runScript({ |
3416 | .code = R"NKSP_CODE( |
3417 | on init |
3418 | exit(3.0 <= 3.0) |
3419 | end on |
3420 | )NKSP_CODE", |
3421 | .expectBoolExitResult = true |
3422 | }); |
3423 | |
3424 | runScript({ |
3425 | .code = R"NKSP_CODE( |
3426 | on init |
3427 | exit(4.33 <= 4.33) |
3428 | end on |
3429 | )NKSP_CODE", |
3430 | .expectBoolExitResult = true |
3431 | }); |
3432 | |
3433 | runScript({ |
3434 | .code = R"NKSP_CODE( |
3435 | on init |
3436 | exit(-23.1 <= -23.1) |
3437 | end on |
3438 | )NKSP_CODE", |
3439 | .expectBoolExitResult = true |
3440 | }); |
3441 | |
3442 | runScript({ |
3443 | .code = R"NKSP_CODE( |
3444 | on init |
3445 | exit(23.3 <= -23.3) |
3446 | end on |
3447 | )NKSP_CODE", |
3448 | .expectBoolExitResult = false |
3449 | }); |
3450 | |
3451 | runScript({ |
3452 | .code = R"NKSP_CODE( |
3453 | on init |
3454 | exit(3.0 <= 4.0) |
3455 | end on |
3456 | )NKSP_CODE", |
3457 | .expectBoolExitResult = true |
3458 | }); |
3459 | |
3460 | runScript({ |
3461 | .code = R"NKSP_CODE( |
3462 | on init |
3463 | exit(4.0 <= 3.0) |
3464 | end on |
3465 | )NKSP_CODE", |
3466 | .expectBoolExitResult = false |
3467 | }); |
3468 | |
3469 | runScript({ |
3470 | .code = R"NKSP_CODE( |
3471 | on init |
3472 | exit(-4.0 <= 3.0) |
3473 | end on |
3474 | )NKSP_CODE", |
3475 | .expectBoolExitResult = true |
3476 | }); |
3477 | |
3478 | runScript({ |
3479 | .code = R"NKSP_CODE( |
3480 | on init |
3481 | exit(3.0 <= -4.0) |
3482 | end on |
3483 | )NKSP_CODE", |
3484 | .expectBoolExitResult = false |
3485 | }); |
3486 | |
3487 | runScript({ |
3488 | .code = R"NKSP_CODE( |
3489 | on init |
3490 | exit(123.0 <= -45.0) |
3491 | end on |
3492 | )NKSP_CODE", |
3493 | .expectBoolExitResult = false |
3494 | }); |
3495 | |
3496 | runScript({ |
3497 | .code = R"NKSP_CODE( |
3498 | on init |
3499 | exit(-45.0 <= 123.0) |
3500 | end on |
3501 | )NKSP_CODE", |
3502 | .expectBoolExitResult = true |
3503 | }); |
3504 | |
3505 | // mixed type tests ... |
3506 | |
3507 | runScript({ |
3508 | .code = R"NKSP_CODE( |
3509 | on init |
3510 | exit(9 <= 9.1) |
3511 | end on |
3512 | )NKSP_CODE", |
3513 | .expectBoolExitResult = true |
3514 | }); |
3515 | |
3516 | runScript({ |
3517 | .code = R"NKSP_CODE( |
3518 | on init |
3519 | exit(9.1 <= 9) |
3520 | end on |
3521 | )NKSP_CODE", |
3522 | .expectBoolExitResult = false |
3523 | }); |
3524 | |
3525 | runScript({ |
3526 | .code = R"NKSP_CODE( |
3527 | on init |
3528 | exit(9 <= 9.0) |
3529 | end on |
3530 | )NKSP_CODE", |
3531 | .expectBoolExitResult = true |
3532 | }); |
3533 | |
3534 | runScript({ |
3535 | .code = R"NKSP_CODE( |
3536 | on init |
3537 | exit(9.0 <= 9) |
3538 | end on |
3539 | )NKSP_CODE", |
3540 | .expectBoolExitResult = true |
3541 | }); |
3542 | |
3543 | // std unit tests ... |
3544 | |
3545 | runScript({ |
3546 | .code = R"NKSP_CODE( |
3547 | on init |
3548 | exit(13ms <= 14ms) |
3549 | end on |
3550 | )NKSP_CODE", |
3551 | .expectBoolExitResult = true |
3552 | }); |
3553 | |
3554 | runScript({ |
3555 | .code = R"NKSP_CODE( |
3556 | on init |
3557 | exit(14ms <= 13ms) |
3558 | end on |
3559 | )NKSP_CODE", |
3560 | .expectBoolExitResult = false |
3561 | }); |
3562 | |
3563 | runScript({ |
3564 | .code = R"NKSP_CODE( |
3565 | on init |
3566 | exit(1s <= 990ms) |
3567 | end on |
3568 | )NKSP_CODE", |
3569 | .expectBoolExitResult = false |
3570 | }); |
3571 | |
3572 | runScript({ |
3573 | .code = R"NKSP_CODE( |
3574 | on init |
3575 | exit(990ms <= 1s) |
3576 | end on |
3577 | )NKSP_CODE", |
3578 | .expectBoolExitResult = true |
3579 | }); |
3580 | |
3581 | runScript({ |
3582 | .code = R"NKSP_CODE( |
3583 | on init |
3584 | exit(1000ms <= 1s) |
3585 | end on |
3586 | )NKSP_CODE", |
3587 | .expectBoolExitResult = true |
3588 | }); |
3589 | |
3590 | runScript({ |
3591 | .code = R"NKSP_CODE( |
3592 | on init |
3593 | exit(1s <= 1000ms) |
3594 | end on |
3595 | )NKSP_CODE", |
3596 | .expectBoolExitResult = true |
3597 | }); |
3598 | |
3599 | runScript({ |
3600 | .code = R"NKSP_CODE( |
3601 | on init |
3602 | exit(1s <= 1) |
3603 | end on |
3604 | )NKSP_CODE", |
3605 | .expectParseError = true // units on both sides must match |
3606 | }); |
3607 | |
3608 | runScript({ |
3609 | .code = R"NKSP_CODE( |
3610 | on init |
3611 | exit(1 <= 1s) |
3612 | end on |
3613 | )NKSP_CODE", |
3614 | .expectParseError = true // units on both sides must match |
3615 | }); |
3616 | |
3617 | runScript({ |
3618 | .code = R"NKSP_CODE( |
3619 | on init |
3620 | exit(1Hz <= 1B) |
3621 | end on |
3622 | )NKSP_CODE", |
3623 | .expectParseError = true // units on both sides must match |
3624 | }); |
3625 | |
3626 | runScript({ |
3627 | .code = R"NKSP_CODE( |
3628 | on init |
3629 | exit(13.0ms <= 13.1ms) |
3630 | end on |
3631 | )NKSP_CODE", |
3632 | .expectBoolExitResult = true |
3633 | }); |
3634 | |
3635 | runScript({ |
3636 | .code = R"NKSP_CODE( |
3637 | on init |
3638 | exit(13.1ms <= 13.0ms) |
3639 | end on |
3640 | )NKSP_CODE", |
3641 | .expectBoolExitResult = false |
3642 | }); |
3643 | |
3644 | runScript({ |
3645 | .code = R"NKSP_CODE( |
3646 | on init |
3647 | exit(0.9s <= 600.0ms) |
3648 | end on |
3649 | )NKSP_CODE", |
3650 | .expectBoolExitResult = false |
3651 | }); |
3652 | |
3653 | runScript({ |
3654 | .code = R"NKSP_CODE( |
3655 | on init |
3656 | exit(600.0ms <= 0.9s) |
3657 | end on |
3658 | )NKSP_CODE", |
3659 | .expectBoolExitResult = true |
3660 | }); |
3661 | |
3662 | runScript({ |
3663 | .code = R"NKSP_CODE( |
3664 | on init |
3665 | exit(5.1kHz <= 5100.0Hz) |
3666 | end on |
3667 | )NKSP_CODE", |
3668 | .expectBoolExitResult = true |
3669 | }); |
3670 | |
3671 | runScript({ |
3672 | .code = R"NKSP_CODE( |
3673 | on init |
3674 | exit(5100.0Hz <= 5.1kHz) |
3675 | end on |
3676 | )NKSP_CODE", |
3677 | .expectBoolExitResult = true |
3678 | }); |
3679 | |
3680 | runScript({ |
3681 | .code = R"NKSP_CODE( |
3682 | on init |
3683 | exit(1.0Hz <= 1.1) |
3684 | end on |
3685 | )NKSP_CODE", |
3686 | .expectParseError = true // units on both sides must match |
3687 | }); |
3688 | |
3689 | runScript({ |
3690 | .code = R"NKSP_CODE( |
3691 | on init |
3692 | exit(1.2 <= 1.34mdB) |
3693 | end on |
3694 | )NKSP_CODE", |
3695 | .expectParseError = true // units on both sides must match |
3696 | }); |
3697 | |
3698 | runScript({ |
3699 | .code = R"NKSP_CODE( |
3700 | on init |
3701 | exit(9.23us <= 3.14kHz) |
3702 | end on |
3703 | )NKSP_CODE", |
3704 | .expectParseError = true // units on both sides must match |
3705 | }); |
3706 | |
3707 | // 'final' ('!') operator tests ... |
3708 | // (should always yield in false for relation operators) |
3709 | |
3710 | runScript({ |
3711 | .code = R"NKSP_CODE( |
3712 | on init |
3713 | exit(!-4 <= !3) |
3714 | end on |
3715 | )NKSP_CODE", |
3716 | .expectBoolExitResult = true, |
3717 | .expectExitResultFinal = false |
3718 | }); |
3719 | |
3720 | runScript({ |
3721 | .code = R"NKSP_CODE( |
3722 | on init |
3723 | exit(-4 <= 3) |
3724 | end on |
3725 | )NKSP_CODE", |
3726 | .expectBoolExitResult = true, |
3727 | .expectExitResultFinal = false |
3728 | }); |
3729 | |
3730 | #if !SILENT_TEST |
3731 | std::cout << std::endl; |
3732 | #endif |
3733 | } |
3734 | |
3735 | static void testGreaterOrEqualOperator() { |
3736 | #if !SILENT_TEST |
3737 | std::cout << "UNIT TEST: greater-or-equal (>=) operator\n"; |
3738 | #endif |
3739 | |
3740 | // integer tests ... |
3741 | |
3742 | runScript({ |
3743 | .code = R"NKSP_CODE( |
3744 | on init |
3745 | exit(3 >= 3) |
3746 | end on |
3747 | )NKSP_CODE", |
3748 | .expectBoolExitResult = true |
3749 | }); |
3750 | |
3751 | runScript({ |
3752 | .code = R"NKSP_CODE( |
3753 | on init |
3754 | exit(4 >= 4) |
3755 | end on |
3756 | )NKSP_CODE", |
3757 | .expectBoolExitResult = true |
3758 | }); |
3759 | |
3760 | runScript({ |
3761 | .code = R"NKSP_CODE( |
3762 | on init |
3763 | exit(-23 >= -23) |
3764 | end on |
3765 | )NKSP_CODE", |
3766 | .expectBoolExitResult = true |
3767 | }); |
3768 | |
3769 | runScript({ |
3770 | .code = R"NKSP_CODE( |
3771 | on init |
3772 | exit(23 >= -23) |
3773 | end on |
3774 | )NKSP_CODE", |
3775 | .expectBoolExitResult = true |
3776 | }); |
3777 | |
3778 | runScript({ |
3779 | .code = R"NKSP_CODE( |
3780 | on init |
3781 | exit(3 >= 4) |
3782 | end on |
3783 | )NKSP_CODE", |
3784 | .expectBoolExitResult = false |
3785 | }); |
3786 | |
3787 | runScript({ |
3788 | .code = R"NKSP_CODE( |
3789 | on init |
3790 | exit(4 >= 3) |
3791 | end on |
3792 | )NKSP_CODE", |
3793 | .expectBoolExitResult = true |
3794 | }); |
3795 | |
3796 | runScript({ |
3797 | .code = R"NKSP_CODE( |
3798 | on init |
3799 | exit(-4 >= 3) |
3800 | end on |
3801 | )NKSP_CODE", |
3802 | .expectBoolExitResult = false |
3803 | }); |
3804 | |
3805 | runScript({ |
3806 | .code = R"NKSP_CODE( |
3807 | on init |
3808 | exit(3 >= -4) |
3809 | end on |
3810 | )NKSP_CODE", |
3811 | .expectBoolExitResult = true |
3812 | }); |
3813 | |
3814 | runScript({ |
3815 | .code = R"NKSP_CODE( |
3816 | on init |
3817 | exit(123 >= -45) |
3818 | end on |
3819 | )NKSP_CODE", |
3820 | .expectBoolExitResult = true |
3821 | }); |
3822 | |
3823 | runScript({ |
3824 | .code = R"NKSP_CODE( |
3825 | on init |
3826 | exit(-45 >= 123) |
3827 | end on |
3828 | )NKSP_CODE", |
3829 | .expectBoolExitResult = false |
3830 | }); |
3831 | |
3832 | // real number tests ... |
3833 | |
3834 | runScript({ |
3835 | .code = R"NKSP_CODE( |
3836 | on init |
3837 | exit(3.0 >= 3.0) |
3838 | end on |
3839 | )NKSP_CODE", |
3840 | .expectBoolExitResult = true |
3841 | }); |
3842 | |
3843 | runScript({ |
3844 | .code = R"NKSP_CODE( |
3845 | on init |
3846 | exit(3.1 >= 3.1) |
3847 | end on |
3848 | )NKSP_CODE", |
3849 | .expectBoolExitResult = true |
3850 | }); |
3851 | |
3852 | runScript({ |
3853 | .code = R"NKSP_CODE( |
3854 | on init |
3855 | exit(3.1 >= 3.0) |
3856 | end on |
3857 | )NKSP_CODE", |
3858 | .expectBoolExitResult = true |
3859 | }); |
3860 | |
3861 | runScript({ |
3862 | .code = R"NKSP_CODE( |
3863 | on init |
3864 | exit(3.0 >= 3.1) |
3865 | end on |
3866 | )NKSP_CODE", |
3867 | .expectBoolExitResult = false |
3868 | }); |
3869 | |
3870 | runScript({ |
3871 | .code = R"NKSP_CODE( |
3872 | on init |
3873 | exit(-23.33 >= -23.33) |
3874 | end on |
3875 | )NKSP_CODE", |
3876 | .expectBoolExitResult = true |
3877 | }); |
3878 | |
3879 | runScript({ |
3880 | .code = R"NKSP_CODE( |
3881 | on init |
3882 | exit(23.0 >= -23.0) |
3883 | end on |
3884 | )NKSP_CODE", |
3885 | .expectBoolExitResult = true |
3886 | }); |
3887 | |
3888 | runScript({ |
3889 | .code = R"NKSP_CODE( |
3890 | on init |
3891 | exit(3.0 >= 4.0) |
3892 | end on |
3893 | )NKSP_CODE", |
3894 | .expectBoolExitResult = false |
3895 | }); |
3896 | |
3897 | runScript({ |
3898 | .code = R"NKSP_CODE( |
3899 | on init |
3900 | exit(4.0 >= 3.0) |
3901 | end on |
3902 | )NKSP_CODE", |
3903 | .expectBoolExitResult = true |
3904 | }); |
3905 | |
3906 | runScript({ |
3907 | .code = R"NKSP_CODE( |
3908 | on init |
3909 | exit(-4.0 >= 3.0) |
3910 | end on |
3911 | )NKSP_CODE", |
3912 | .expectBoolExitResult = false |
3913 | }); |
3914 | |
3915 | runScript({ |
3916 | .code = R"NKSP_CODE( |
3917 | on init |
3918 | exit(3.0 >= -4.0) |
3919 | end on |
3920 | )NKSP_CODE", |
3921 | .expectBoolExitResult = true |
3922 | }); |
3923 | |
3924 | runScript({ |
3925 | .code = R"NKSP_CODE( |
3926 | on init |
3927 | exit(123.0 >= -45.0) |
3928 | end on |
3929 | )NKSP_CODE", |
3930 | .expectBoolExitResult = true |
3931 | }); |
3932 | |
3933 | runScript({ |
3934 | .code = R"NKSP_CODE( |
3935 | on init |
3936 | exit(-45.0 >= 123.0) |
3937 | end on |
3938 | )NKSP_CODE", |
3939 | .expectBoolExitResult = false |
3940 | }); |
3941 | |
3942 | // mixed type tests ... |
3943 | |
3944 | runScript({ |
3945 | .code = R"NKSP_CODE( |
3946 | on init |
3947 | exit(9 >= 9.1) |
3948 | end on |
3949 | )NKSP_CODE", |
3950 | .expectBoolExitResult = false |
3951 | }); |
3952 | |
3953 | runScript({ |
3954 | .code = R"NKSP_CODE( |
3955 | on init |
3956 | exit(9.1 >= 9) |
3957 | end on |
3958 | )NKSP_CODE", |
3959 | .expectBoolExitResult = true |
3960 | }); |
3961 | |
3962 | runScript({ |
3963 | .code = R"NKSP_CODE( |
3964 | on init |
3965 | exit(9 >= 9.0) |
3966 | end on |
3967 | )NKSP_CODE", |
3968 | .expectBoolExitResult = true |
3969 | }); |
3970 | |
3971 | runScript({ |
3972 | .code = R"NKSP_CODE( |
3973 | on init |
3974 | exit(9.0 >= 9) |
3975 | end on |
3976 | )NKSP_CODE", |
3977 | .expectBoolExitResult = true |
3978 | }); |
3979 | |
3980 | // std unit tests ... |
3981 | |
3982 | runScript({ |
3983 | .code = R"NKSP_CODE( |
3984 | on init |
3985 | exit(13ms >= 14ms) |
3986 | end on |
3987 | )NKSP_CODE", |
3988 | .expectBoolExitResult = false |
3989 | }); |
3990 | |
3991 | runScript({ |
3992 | .code = R"NKSP_CODE( |
3993 | on init |
3994 | exit(14ms >= 13ms) |
3995 | end on |
3996 | )NKSP_CODE", |
3997 | .expectBoolExitResult = true |
3998 | }); |
3999 | |
4000 | runScript({ |
4001 | .code = R"NKSP_CODE( |
4002 | on init |
4003 | exit(1s >= 990ms) |
4004 | end on |
4005 | )NKSP_CODE", |
4006 | .expectBoolExitResult = true |
4007 | }); |
4008 | |
4009 | runScript({ |
4010 | .code = R"NKSP_CODE( |
4011 | on init |
4012 | exit(990ms >= 1s) |
4013 | end on |
4014 | )NKSP_CODE", |
4015 | .expectBoolExitResult = false |
4016 | }); |
4017 | |
4018 | runScript({ |
4019 | .code = R"NKSP_CODE( |
4020 | on init |
4021 | exit(1000ms >= 1s) |
4022 | end on |
4023 | )NKSP_CODE", |
4024 | .expectBoolExitResult = true |
4025 | }); |
4026 | |
4027 | runScript({ |
4028 | .code = R"NKSP_CODE( |
4029 | on init |
4030 | exit(1s >= 1000ms) |
4031 | end on |
4032 | )NKSP_CODE", |
4033 | .expectBoolExitResult = true |
4034 | }); |
4035 | |
4036 | runScript({ |
4037 | .code = R"NKSP_CODE( |
4038 | on init |
4039 | exit(1s >= 1) |
4040 | end on |
4041 | )NKSP_CODE", |
4042 | .expectParseError = true // units on both sides must match |
4043 | }); |
4044 | |
4045 | runScript({ |
4046 | .code = R"NKSP_CODE( |
4047 | on init |
4048 | exit(1 >= 1s) |
4049 | end on |
4050 | )NKSP_CODE", |
4051 | .expectParseError = true // units on both sides must match |
4052 | }); |
4053 | |
4054 | runScript({ |
4055 | .code = R"NKSP_CODE( |
4056 | on init |
4057 | exit(1Hz >= 1B) |
4058 | end on |
4059 | )NKSP_CODE", |
4060 | .expectParseError = true // units on both sides must match |
4061 | }); |
4062 | |
4063 | runScript({ |
4064 | .code = R"NKSP_CODE( |
4065 | on init |
4066 | exit(13.0ms >= 13.1ms) |
4067 | end on |
4068 | )NKSP_CODE", |
4069 | .expectBoolExitResult = false |
4070 | }); |
4071 | |
4072 | runScript({ |
4073 | .code = R"NKSP_CODE( |
4074 | on init |
4075 | exit(13.1ms >= 13.0ms) |
4076 | end on |
4077 | )NKSP_CODE", |
4078 | .expectBoolExitResult = true |
4079 | }); |
4080 | |
4081 | runScript({ |
4082 | .code = R"NKSP_CODE( |
4083 | on init |
4084 | exit(0.9s >= 600.0ms) |
4085 | end on |
4086 | )NKSP_CODE", |
4087 | .expectBoolExitResult = true |
4088 | }); |
4089 | |
4090 | runScript({ |
4091 | .code = R"NKSP_CODE( |
4092 | on init |
4093 | exit(600.0ms >= 0.9s) |
4094 | end on |
4095 | )NKSP_CODE", |
4096 | .expectBoolExitResult = false |
4097 | }); |
4098 | |
4099 | runScript({ |
4100 | .code = R"NKSP_CODE( |
4101 | on init |
4102 | exit(5.1kHz >= 5100.0Hz) |
4103 | end on |
4104 | )NKSP_CODE", |
4105 | .expectBoolExitResult = true |
4106 | }); |
4107 | |
4108 | runScript({ |
4109 | .code = R"NKSP_CODE( |
4110 | on init |
4111 | exit(5100.0Hz >= 5.1kHz) |
4112 | end on |
4113 | )NKSP_CODE", |
4114 | .expectBoolExitResult = true |
4115 | }); |
4116 | |
4117 | runScript({ |
4118 | .code = R"NKSP_CODE( |
4119 | on init |
4120 | exit(1.0Hz >= 1.1) |
4121 | end on |
4122 | )NKSP_CODE", |
4123 | .expectParseError = true // units on both sides must match |
4124 | }); |
4125 | |
4126 | runScript({ |
4127 | .code = R"NKSP_CODE( |
4128 | on init |
4129 | exit(1.2 >= 1.34mdB) |
4130 | end on |
4131 | )NKSP_CODE", |
4132 | .expectParseError = true // units on both sides must match |
4133 | }); |
4134 | |
4135 | runScript({ |
4136 | .code = R"NKSP_CODE( |
4137 | on init |
4138 | exit(9.23us >= 3.14kHz) |
4139 | end on |
4140 | )NKSP_CODE", |
4141 | .expectParseError = true // units on both sides must match |
4142 | }); |
4143 | |
4144 | // 'final' ('!') operator tests ... |
4145 | // (should always yield in false for relation operators) |
4146 | |
4147 | runScript({ |
4148 | .code = R"NKSP_CODE( |
4149 | on init |
4150 | exit(!-4 >= !3) |
4151 | end on |
4152 | )NKSP_CODE", |
4153 | .expectBoolExitResult = false, |
4154 | .expectExitResultFinal = false |
4155 | }); |
4156 | |
4157 | runScript({ |
4158 | .code = R"NKSP_CODE( |
4159 | on init |
4160 | exit(-4 >= 3) |
4161 | end on |
4162 | )NKSP_CODE", |
4163 | .expectBoolExitResult = false, |
4164 | .expectExitResultFinal = false |
4165 | }); |
4166 | |
4167 | #if !SILENT_TEST |
4168 | std::cout << std::endl; |
4169 | #endif |
4170 | } |
4171 | |
4172 | static void testEqualOperator() { |
4173 | #if !SILENT_TEST |
4174 | std::cout << "UNIT TEST: equal (=) operator\n"; |
4175 | #endif |
4176 | |
4177 | // integer tests ... |
4178 | |
4179 | runScript({ |
4180 | .code = R"NKSP_CODE( |
4181 | on init |
4182 | exit(3 = 3) |
4183 | end on |
4184 | )NKSP_CODE", |
4185 | .expectBoolExitResult = true |
4186 | }); |
4187 | |
4188 | runScript({ |
4189 | .code = R"NKSP_CODE( |
4190 | on init |
4191 | exit(4 = 4) |
4192 | end on |
4193 | )NKSP_CODE", |
4194 | .expectBoolExitResult = true |
4195 | }); |
4196 | |
4197 | runScript({ |
4198 | .code = R"NKSP_CODE( |
4199 | on init |
4200 | exit(3 = 4) |
4201 | end on |
4202 | )NKSP_CODE", |
4203 | .expectBoolExitResult = false |
4204 | }); |
4205 | |
4206 | runScript({ |
4207 | .code = R"NKSP_CODE( |
4208 | on init |
4209 | exit(23 = -23) |
4210 | end on |
4211 | )NKSP_CODE", |
4212 | .expectBoolExitResult = false |
4213 | }); |
4214 | |
4215 | // real number tests ... |
4216 | |
4217 | runScript({ |
4218 | .code = R"NKSP_CODE( |
4219 | on init |
4220 | exit(3.0 = 3.0) |
4221 | end on |
4222 | )NKSP_CODE", |
4223 | .expectBoolExitResult = true |
4224 | }); |
4225 | |
4226 | runScript({ |
4227 | .code = R"NKSP_CODE( |
4228 | on init |
4229 | exit(4.33 = 4.33) |
4230 | end on |
4231 | )NKSP_CODE", |
4232 | .expectBoolExitResult = true |
4233 | }); |
4234 | |
4235 | runScript({ |
4236 | .code = R"NKSP_CODE( |
4237 | on init |
4238 | exit(4.31 = 4.35) |
4239 | end on |
4240 | )NKSP_CODE", |
4241 | .expectBoolExitResult = false |
4242 | }); |
4243 | |
4244 | runScript({ |
4245 | .code = R"NKSP_CODE( |
4246 | on init |
4247 | exit(3.0 = 4.0) |
4248 | end on |
4249 | )NKSP_CODE", |
4250 | .expectBoolExitResult = false |
4251 | }); |
4252 | |
4253 | runScript({ |
4254 | .code = R"NKSP_CODE( |
4255 | on init |
4256 | exit(23.0 = -23.0) |
4257 | end on |
4258 | )NKSP_CODE", |
4259 | .expectBoolExitResult = false |
4260 | }); |
4261 | |
4262 | // deal with inaccuracy of float point |
4263 | runScript({ |
4264 | .code = R"NKSP_CODE( |
4265 | on init |
4266 | declare ~a := 0.165 |
4267 | declare ~b := 0.185 |
4268 | declare ~x := 0.1 |
4269 | declare ~y := 0.25 |
4270 | exit(~a + ~b = ~x + ~y) { both sides should actually be 0.35, they slightly deviate both though } |
4271 | end on |
4272 | )NKSP_CODE", |
4273 | .expectBoolExitResult = true // our implementation of real number equal comparison should take care about floating point tolerance |
4274 | }); |
4275 | |
4276 | // deal with inaccuracy of float point |
4277 | runScript({ |
4278 | .code = R"NKSP_CODE( |
4279 | on init |
4280 | declare ~a := 0.166 |
4281 | declare ~b := 0.185 |
4282 | declare ~x := 0.1 |
4283 | declare ~y := 0.25 |
4284 | exit(~a + ~b = ~x + ~y) { left side approx. 0.351, right side approx. 0.35 } |
4285 | end on |
4286 | )NKSP_CODE", |
4287 | .expectBoolExitResult = false |
4288 | }); |
4289 | |
4290 | // mixed type tests ... |
4291 | |
4292 | runScript({ |
4293 | .code = R"NKSP_CODE( |
4294 | on init |
4295 | exit(23 = 23.0) |
4296 | end on |
4297 | )NKSP_CODE", |
4298 | .expectBoolExitResult = true |
4299 | }); |
4300 | |
4301 | runScript({ |
4302 | .code = R"NKSP_CODE( |
4303 | on init |
4304 | exit(23.0 = 23) |
4305 | end on |
4306 | )NKSP_CODE", |
4307 | .expectBoolExitResult = true |
4308 | }); |
4309 | |
4310 | runScript({ |
4311 | .code = R"NKSP_CODE( |
4312 | on init |
4313 | exit(23 = 23.1) |
4314 | end on |
4315 | )NKSP_CODE", |
4316 | .expectBoolExitResult = false |
4317 | }); |
4318 | |
4319 | runScript({ |
4320 | .code = R"NKSP_CODE( |
4321 | on init |
4322 | exit(23.1 = 23) |
4323 | end on |
4324 | )NKSP_CODE", |
4325 | .expectBoolExitResult = false |
4326 | }); |
4327 | |
4328 | // std unit tests ... |
4329 | |
4330 | runScript({ |
4331 | .code = R"NKSP_CODE( |
4332 | on init |
4333 | exit(13ms = 14ms) |
4334 | end on |
4335 | )NKSP_CODE", |
4336 | .expectBoolExitResult = false |