/[svn]/linuxsampler/trunk/src/scriptvm/tests/NKSPCoreLangTest.cpp
ViewVC logotype

Contents of /linuxsampler/trunk/src/scriptvm/tests/NKSPCoreLangTest.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3803 - (show annotations) (download)
Thu Aug 6 11:45:24 2020 UTC (3 years, 4 months ago) by schoenebeck
File size: 230403 byte(s)
NKSP tests: If a test failed, show the test case's NKSP source
code and expectations of that test causing the failure.


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 #if !SILENT_TEST
1079 std::cout << std::endl;
1080 #endif
1081 }
1082
1083 static void testStringConcatOperator() {
1084 #if !SILENT_TEST
1085 std::cout << "UNIT TEST: string concatenation (&) operator\n";
1086 #endif
1087
1088 // strings only tests ...
1089
1090 runScript({
1091 .code = R"NKSP_CODE(
1092 on init
1093 declare @s := "foo" & " bar"
1094 exit(@s)
1095 end on
1096 )NKSP_CODE",
1097 .expectStringExitResult = "foo bar"
1098 });
1099
1100 // integer tests ...
1101
1102 runScript({
1103 .code = R"NKSP_CODE(
1104 on init
1105 declare @s := "foo" & " bar" & " " & 123
1106 exit(@s)
1107 end on
1108 )NKSP_CODE",
1109 .expectStringExitResult = "foo bar 123"
1110 });
1111
1112 runScript({
1113 .code = R"NKSP_CODE(
1114 on init
1115 declare $i := 123
1116 declare @s := "foo" & " bar" & " " & $i
1117 exit(@s)
1118 end on
1119 )NKSP_CODE",
1120 .expectStringExitResult = "foo bar 123"
1121 });
1122
1123 // real number tests ...
1124
1125 runScript({
1126 .code = R"NKSP_CODE(
1127 on init
1128 declare @s := "foo" & " bar" & " " & 1.23
1129 exit(@s)
1130 end on
1131 )NKSP_CODE",
1132 .expectStringExitResult = "foo bar 1.23"
1133 });
1134
1135 runScript({
1136 .code = R"NKSP_CODE(
1137 on init
1138 declare ~r := 3.14
1139 declare @s := "foo" & " bar" & " " & ~r
1140 exit(@s)
1141 end on
1142 )NKSP_CODE",
1143 .expectStringExitResult = "foo bar 3.14"
1144 });
1145
1146 // std unit tests ...
1147
1148 runScript({
1149 .code = R"NKSP_CODE(
1150 on init
1151 declare $i := 500Hz
1152 declare @s := "foo" & " bar" & " " & $i
1153 exit(@s)
1154 end on
1155 )NKSP_CODE",
1156 .expectStringExitResult = "foo bar 500Hz"
1157 });
1158
1159 runScript({
1160 .code = R"NKSP_CODE(
1161 on init
1162 declare ~r := 3.14s
1163 declare @s := "foo" & " bar" & " " & ~r
1164 exit(@s)
1165 end on
1166 )NKSP_CODE",
1167 .expectStringExitResult = "foo bar 3.14s"
1168 });
1169
1170 runScript({
1171 .code = R"NKSP_CODE(
1172 on init
1173 declare ~r := -22.3mdB
1174 declare @s := "foo" & " bar" & " " & ~r
1175 exit(@s)
1176 end on
1177 )NKSP_CODE",
1178 .expectStringExitResult = "foo bar -22.3mdB"
1179 });
1180
1181 runScript({
1182 .code = R"NKSP_CODE(
1183 on init
1184 declare $i := 20us
1185 declare @s := "foo" & " bar" & " " & $i
1186 exit(@s)
1187 end on
1188 )NKSP_CODE",
1189 .expectStringExitResult = "foo bar 20us"
1190 });
1191
1192 runScript({
1193 .code = R"NKSP_CODE(
1194 on init
1195 declare $i := 20kHz
1196 declare @s := "foo" & " bar" & " " & $i
1197 exit(@s)
1198 end on
1199 )NKSP_CODE",
1200 .expectStringExitResult = "foo bar 20kHz"
1201 });
1202
1203 runScript({
1204 .code = R"NKSP_CODE(
1205 on init
1206 declare $i := -6dB
1207 declare @s := "foo" & " bar" & " " & $i
1208 exit(@s)
1209 end on
1210 )NKSP_CODE",
1211 .expectStringExitResult = "foo bar -6dB"
1212 });
1213
1214 runScript({
1215 .code = R"NKSP_CODE(
1216 on init
1217 declare $i := 1us * 1d
1218 declare @s := "foo" & " bar" & " " & $i
1219 exit(@s)
1220 end on
1221 )NKSP_CODE",
1222 .expectStringExitResult = "foo bar 1*10^-7s"
1223 });
1224
1225 runScript({
1226 .code = R"NKSP_CODE(
1227 on init
1228 declare ~r := 12.4mc
1229 declare @s := "foo" & " bar" & " " & ~r
1230 exit(@s)
1231 end on
1232 )NKSP_CODE",
1233 .expectStringExitResult = "foo bar 12.4mc"
1234 });
1235
1236 #if !SILENT_TEST
1237 std::cout << std::endl;
1238 #endif
1239 }
1240
1241 static void testNegOperator() {
1242 #if !SILENT_TEST
1243 std::cout << "UNIT TEST: negate (-) operator\n";
1244 #endif
1245
1246 // integer tests ...
1247
1248 runScript({
1249 .code = R"NKSP_CODE(
1250 on init
1251 exit(-87)
1252 end on
1253 )NKSP_CODE",
1254 .expectIntExitResult = -87
1255 });
1256
1257 runScript({
1258 .code = R"NKSP_CODE(
1259 on init
1260 declare $foo := -87
1261 exit(-$foo)
1262 end on
1263 )NKSP_CODE",
1264 .expectIntExitResult = 87
1265 });
1266
1267 // real number tests ...
1268
1269 runScript({
1270 .code = R"NKSP_CODE(
1271 on init
1272 exit(-99.3)
1273 end on
1274 )NKSP_CODE",
1275 .expectRealExitResult = -99.3
1276 });
1277
1278 runScript({
1279 .code = R"NKSP_CODE(
1280 on init
1281 declare ~foo := -99.3
1282 exit(-~foo)
1283 end on
1284 )NKSP_CODE",
1285 .expectRealExitResult = 99.3
1286 });
1287
1288 // std unit tests
1289
1290 runScript({
1291 .code = R"NKSP_CODE(
1292 on init
1293 declare $foo := -87mdB
1294 exit(-$foo)
1295 end on
1296 )NKSP_CODE",
1297 .expectIntExitResult = 87,
1298 .expectExitResultUnitPrefix = { VM_MILLI, VM_DECI },
1299 .expectExitResultUnit = VM_BEL
1300 });
1301
1302 // 'final' ('!') operator tests ...
1303
1304 runScript({
1305 .code = R"NKSP_CODE(
1306 on init
1307 declare $foo := !-87
1308 exit(-$foo)
1309 end on
1310 )NKSP_CODE",
1311 .expectIntExitResult = 87,
1312 .expectExitResultFinal = true
1313 });
1314
1315 runScript({
1316 .code = R"NKSP_CODE(
1317 on init
1318 declare $foo := -87
1319 exit(-$foo)
1320 end on
1321 )NKSP_CODE",
1322 .expectIntExitResult = 87,
1323 .expectExitResultFinal = false
1324 });
1325
1326 //TODO: the following are unary '+' operator tests which should be moved to their own function (lazy me).
1327
1328 runScript({
1329 .code = R"NKSP_CODE(
1330 on init
1331 exit(+54)
1332 end on
1333 )NKSP_CODE",
1334 .expectIntExitResult = 54
1335 });
1336
1337 runScript({
1338 .code = R"NKSP_CODE(
1339 on init
1340 declare $foo := +54
1341 exit( $foo )
1342 end on
1343 )NKSP_CODE",
1344 .expectIntExitResult = 54
1345 });
1346
1347 runScript({
1348 .code = R"NKSP_CODE(
1349 on init
1350 exit(+0.45)
1351 end on
1352 )NKSP_CODE",
1353 .expectRealExitResult = 0.45
1354 });
1355
1356 runScript({
1357 .code = R"NKSP_CODE(
1358 on init
1359 declare ~foo := +0.29
1360 exit( ~foo )
1361 end on
1362 )NKSP_CODE",
1363 .expectRealExitResult = 0.29
1364 });
1365
1366 #if !SILENT_TEST
1367 std::cout << std::endl;
1368 #endif
1369 }
1370
1371 static void testPlusOperator() {
1372 #if !SILENT_TEST
1373 std::cout << "UNIT TEST: plus (+) operator\n";
1374 #endif
1375
1376 // integer tests ...
1377
1378 runScript({
1379 .code = R"NKSP_CODE(
1380 on init
1381 exit(4 + 3)
1382 end on
1383 )NKSP_CODE",
1384 .expectIntExitResult = 7
1385 });
1386
1387 runScript({
1388 .code = R"NKSP_CODE(
1389 on init
1390 exit(42 + 145)
1391 end on
1392 )NKSP_CODE",
1393 .expectIntExitResult = 187
1394 });
1395
1396 runScript({
1397 .code = R"NKSP_CODE(
1398 on init
1399 exit(-4 + 2)
1400 end on
1401 )NKSP_CODE",
1402 .expectIntExitResult = -2
1403 });
1404
1405 // real number tests ...
1406
1407 runScript({
1408 .code = R"NKSP_CODE(
1409 on init
1410 exit(4.0 + 3.0)
1411 end on
1412 )NKSP_CODE",
1413 .expectRealExitResult = 7.0
1414 });
1415
1416 runScript({
1417 .code = R"NKSP_CODE(
1418 on init
1419 exit(42.3 + 145.2)
1420 end on
1421 )NKSP_CODE",
1422 .expectRealExitResult = 187.5
1423 });
1424
1425 runScript({
1426 .code = R"NKSP_CODE(
1427 on init
1428 exit(-4.0 + 2.2)
1429 end on
1430 )NKSP_CODE",
1431 .expectRealExitResult = -1.8
1432 });
1433
1434 // std unit tests ...
1435
1436 runScript({
1437 .code = R"NKSP_CODE(
1438 on init
1439 exit(42ms + 145ms)
1440 end on
1441 )NKSP_CODE",
1442 .expectIntExitResult = 187,
1443 .expectExitResultUnitPrefix = { VM_MILLI },
1444 .expectExitResultUnit = VM_SECOND
1445 });
1446
1447 runScript({
1448 .code = R"NKSP_CODE(
1449 on init
1450 exit(1s + 145ms)
1451 end on
1452 )NKSP_CODE",
1453 .expectIntExitResult = 1145,
1454 .expectExitResultUnitPrefix = { VM_MILLI },
1455 .expectExitResultUnit = VM_SECOND
1456 });
1457
1458 runScript({
1459 .code = R"NKSP_CODE(
1460 on init
1461 exit(42ms + 145)
1462 end on
1463 )NKSP_CODE",
1464 .expectParseError = true // units must match for + operator
1465 });
1466
1467 runScript({
1468 .code = R"NKSP_CODE(
1469 on init
1470 exit(42 + 145ms)
1471 end on
1472 )NKSP_CODE",
1473 .expectParseError = true // units must match for + operator
1474 });
1475
1476 runScript({
1477 .code = R"NKSP_CODE(
1478 on init
1479 exit(42Hz + 145s)
1480 end on
1481 )NKSP_CODE",
1482 .expectParseError = true // units must match for + operator
1483 });
1484
1485 runScript({
1486 .code = R"NKSP_CODE(
1487 on init
1488 exit(42.1ms + 145.3ms)
1489 end on
1490 )NKSP_CODE",
1491 .expectRealExitResult = 187.4,
1492 .expectExitResultUnitPrefix = { VM_MILLI },
1493 .expectExitResultUnit = VM_SECOND
1494 });
1495
1496 runScript({
1497 .code = R"NKSP_CODE(
1498 on init
1499 exit(1.1s + 145.0ms)
1500 end on
1501 )NKSP_CODE",
1502 .expectRealExitResult = 1245.0,
1503 .expectExitResultUnitPrefix = { VM_MILLI },
1504 .expectExitResultUnit = VM_SECOND
1505 });
1506
1507 runScript({
1508 .code = R"NKSP_CODE(
1509 on init
1510 exit(42.1ms + 145.3)
1511 end on
1512 )NKSP_CODE",
1513 .expectParseError = true // units must match for + operator
1514 });
1515
1516 runScript({
1517 .code = R"NKSP_CODE(
1518 on init
1519 exit(42.0 + 145.0ms)
1520 end on
1521 )NKSP_CODE",
1522 .expectParseError = true // units must match for + operator
1523 });
1524
1525 runScript({
1526 .code = R"NKSP_CODE(
1527 on init
1528 exit(42.0Hz + 145.0s)
1529 end on
1530 )NKSP_CODE",
1531 .expectParseError = true // units must match for + operator
1532 });
1533
1534 // 'final' ('!') operator tests ...
1535
1536 runScript({
1537 .code = R"NKSP_CODE(
1538 on init
1539 exit(!4 + !3)
1540 end on
1541 )NKSP_CODE",
1542 .expectIntExitResult = 7,
1543 .expectExitResultFinal = true
1544 });
1545
1546 runScript({
1547 .code = R"NKSP_CODE(
1548 on init
1549 exit(4 + 3)
1550 end on
1551 )NKSP_CODE",
1552 .expectIntExitResult = 7,
1553 .expectExitResultFinal = false
1554 });
1555
1556 runScript({
1557 .code = R"NKSP_CODE(
1558 on init
1559 exit(!4.1 + !3.3)
1560 end on
1561 )NKSP_CODE",
1562 .expectRealExitResult = 7.4,
1563 .expectExitResultFinal = true
1564 });
1565
1566 runScript({
1567 .code = R"NKSP_CODE(
1568 on init
1569 exit(4.1 + 3.3)
1570 end on
1571 )NKSP_CODE",
1572 .expectRealExitResult = 7.4,
1573 .expectExitResultFinal = false
1574 });
1575
1576 #if !SILENT_TEST
1577 std::cout << std::endl;
1578 #endif
1579 }
1580
1581 static void testMinusOperator() {
1582 #if !SILENT_TEST
1583 std::cout << "UNIT TEST: minus (-) operator\n";
1584 #endif
1585
1586 // integer tests ...
1587
1588 runScript({
1589 .code = R"NKSP_CODE(
1590 on init
1591 exit(4 - 3)
1592 end on
1593 )NKSP_CODE",
1594 .expectIntExitResult = 1
1595 });
1596
1597 runScript({
1598 .code = R"NKSP_CODE(
1599 on init
1600 exit(139 - 74)
1601 end on
1602 )NKSP_CODE",
1603 .expectIntExitResult = 65
1604 });
1605
1606 runScript({
1607 .code = R"NKSP_CODE(
1608 on init
1609 exit(3 - 9)
1610 end on
1611 )NKSP_CODE",
1612 .expectIntExitResult = -6
1613 });
1614
1615 runScript({
1616 .code = R"NKSP_CODE(
1617 on init
1618 exit(-3 - 18)
1619 end on
1620 )NKSP_CODE",
1621 .expectIntExitResult = -21
1622 });
1623
1624 // real number tests ...
1625
1626 runScript({
1627 .code = R"NKSP_CODE(
1628 on init
1629 exit(4.0 - 0.2)
1630 end on
1631 )NKSP_CODE",
1632 .expectRealExitResult = 3.8
1633 });
1634
1635 runScript({
1636 .code = R"NKSP_CODE(
1637 on init
1638 exit(3.1 - 9.65)
1639 end on
1640 )NKSP_CODE",
1641 .expectRealExitResult = -6.55
1642 });
1643
1644 runScript({
1645 .code = R"NKSP_CODE(
1646 on init
1647 exit(-3.0 - 18.1)
1648 end on
1649 )NKSP_CODE",
1650 .expectRealExitResult = -21.1
1651 });
1652
1653 // std unit tests ...
1654
1655 runScript({
1656 .code = R"NKSP_CODE(
1657 on init
1658 exit(1000ms - 145ms)
1659 end on
1660 )NKSP_CODE",
1661 .expectIntExitResult = 855,
1662 .expectExitResultUnitPrefix = { VM_MILLI },
1663 .expectExitResultUnit = VM_SECOND
1664 });
1665
1666 runScript({
1667 .code = R"NKSP_CODE(
1668 on init
1669 exit(1s - 145ms)
1670 end on
1671 )NKSP_CODE",
1672 .expectIntExitResult = 855,
1673 .expectExitResultUnitPrefix = { VM_MILLI },
1674 .expectExitResultUnit = VM_SECOND
1675 });
1676
1677 runScript({
1678 .code = R"NKSP_CODE(
1679 on init
1680 exit(1s - 145)
1681 end on
1682 )NKSP_CODE",
1683 .expectParseError = true // units must match for - operator
1684 });
1685
1686 runScript({
1687 .code = R"NKSP_CODE(
1688 on init
1689 exit(1 - 145s)
1690 end on
1691 )NKSP_CODE",
1692 .expectParseError = true // units must match for - operator
1693 });
1694
1695 runScript({
1696 .code = R"NKSP_CODE(
1697 on init
1698 exit(1ms - 145mB)
1699 end on
1700 )NKSP_CODE",
1701 .expectParseError = true // units must match for - operator
1702 });
1703
1704 runScript({
1705 .code = R"NKSP_CODE(
1706 on init
1707 exit(1.0ms - 0.1ms)
1708 end on
1709 )NKSP_CODE",
1710 .expectRealExitResult = 0.9,
1711 .expectExitResultUnitPrefix = { VM_MILLI },
1712 .expectExitResultUnit = VM_SECOND
1713 });
1714
1715 runScript({
1716 .code = R"NKSP_CODE(
1717 on init
1718 exit(1.1s - 106.0ms)
1719 end on
1720 )NKSP_CODE",
1721 .expectRealExitResult = 994.0,
1722 .expectExitResultUnitPrefix = { VM_MILLI },
1723 .expectExitResultUnit = VM_SECOND
1724 });
1725
1726 runScript({
1727 .code = R"NKSP_CODE(
1728 on init
1729 exit(1100.0ms - 0.106s)
1730 end on
1731 )NKSP_CODE",
1732 .expectRealExitResult = 994.0,
1733 .expectExitResultUnitPrefix = { VM_MILLI },
1734 .expectExitResultUnit = VM_SECOND
1735 });
1736
1737 runScript({
1738 .code = R"NKSP_CODE(
1739 on init
1740 exit(1.0s - 145.0)
1741 end on
1742 )NKSP_CODE",
1743 .expectParseError = true // units must match for - operator
1744 });
1745
1746 runScript({
1747 .code = R"NKSP_CODE(
1748 on init
1749 exit(1.0 - 145.0s)
1750 end on
1751 )NKSP_CODE",
1752 .expectParseError = true // units must match for - operator
1753 });
1754
1755 runScript({
1756 .code = R"NKSP_CODE(
1757 on init
1758 exit(1.0ms - 145.0mB)
1759 end on
1760 )NKSP_CODE",
1761 .expectParseError = true // units must match for - operator
1762 });
1763
1764 // 'final' ('!') operator tests ...
1765
1766 runScript({
1767 .code = R"NKSP_CODE(
1768 on init
1769 exit(!5 - !3)
1770 end on
1771 )NKSP_CODE",
1772 .expectIntExitResult = 2,
1773 .expectExitResultFinal = true
1774 });
1775
1776 runScript({
1777 .code = R"NKSP_CODE(
1778 on init
1779 exit(5 - 3)
1780 end on
1781 )NKSP_CODE",
1782 .expectIntExitResult = 2,
1783 .expectExitResultFinal = false
1784 });
1785
1786 runScript({
1787 .code = R"NKSP_CODE(
1788 on init
1789 exit(!5.9 - !3.3)
1790 end on
1791 )NKSP_CODE",
1792 .expectRealExitResult = 2.6,
1793 .expectExitResultFinal = true
1794 });
1795
1796 runScript({
1797 .code = R"NKSP_CODE(
1798 on init
1799 exit(5.9 - 3.3)
1800 end on
1801 )NKSP_CODE",
1802 .expectRealExitResult = 2.6,
1803 .expectExitResultFinal = false
1804 });
1805
1806 #if !SILENT_TEST
1807 std::cout << std::endl;
1808 #endif
1809 }
1810
1811 static void testModuloOperator() {
1812 #if !SILENT_TEST
1813 std::cout << "UNIT TEST: modulo (mod) operator\n";
1814 #endif
1815
1816 // integer tests ...
1817
1818 runScript({
1819 .code = R"NKSP_CODE(
1820 on init
1821 exit(10 mod 8)
1822 end on
1823 )NKSP_CODE",
1824 .expectIntExitResult = 2
1825 });
1826
1827 runScript({
1828 .code = R"NKSP_CODE(
1829 on init
1830 declare $a := 10
1831 declare $b := 8
1832 exit($a mod $b)
1833 end on
1834 )NKSP_CODE",
1835 .expectIntExitResult = 2
1836 });
1837
1838 // real number tests ...
1839 // (mod operator prohibits real numbers ATM)
1840
1841 runScript({
1842 .code = R"NKSP_CODE(
1843 on init
1844 exit(10.0 mod 8.0)
1845 end on
1846 )NKSP_CODE",
1847 .expectParseError = true // mod operator prohibits real numbers ATM
1848 });
1849
1850 runScript({
1851 .code = R"NKSP_CODE(
1852 on init
1853 exit(10 mod 8.0)
1854 end on
1855 )NKSP_CODE",
1856 .expectParseError = true // mod operator prohibits real numbers ATM
1857 });
1858
1859 runScript({
1860 .code = R"NKSP_CODE(
1861 on init
1862 exit(10.0 mod 8)
1863 end on
1864 )NKSP_CODE",
1865 .expectParseError = true // mod operator prohibits real numbers ATM
1866 });
1867
1868 runScript({
1869 .code = R"NKSP_CODE(
1870 on init
1871 declare ~a := 10.0
1872 declare ~b := 8.0
1873 exit(~a mod ~b)
1874 end on
1875 )NKSP_CODE",
1876 .expectParseError = true // mod operator prohibits real numbers ATM
1877 });
1878
1879 // std unit tests ...
1880
1881 runScript({
1882 .code = R"NKSP_CODE(
1883 on init
1884 exit(10s mod 8)
1885 end on
1886 )NKSP_CODE",
1887 .expectParseError = true // mod operator prohibits std units ATM
1888 });
1889
1890 runScript({
1891 .code = R"NKSP_CODE(
1892 on init
1893 exit(10 mod 8s)
1894 end on
1895 )NKSP_CODE",
1896 .expectParseError = true // mod operator prohibits std units ATM
1897 });
1898
1899 runScript({
1900 .code = R"NKSP_CODE(
1901 on init
1902 exit(10s mod 8s)
1903 end on
1904 )NKSP_CODE",
1905 .expectParseError = true // mod operator prohibits std units ATM
1906 });
1907
1908 // 'final' ('!') operator tests ...
1909
1910 runScript({
1911 .code = R"NKSP_CODE(
1912 on init
1913 exit(!10 mod !8)
1914 end on
1915 )NKSP_CODE",
1916 .expectIntExitResult = 2,
1917 .expectExitResultFinal = true
1918 });
1919
1920 runScript({
1921 .code = R"NKSP_CODE(
1922 on init
1923 exit(10 mod 8)
1924 end on
1925 )NKSP_CODE",
1926 .expectIntExitResult = 2,
1927 .expectExitResultFinal = false
1928 });
1929
1930 #if !SILENT_TEST
1931 std::cout << std::endl;
1932 #endif
1933 }
1934
1935 static void testMultiplyOperator() {
1936 #if !SILENT_TEST
1937 std::cout << "UNIT TEST: multiply (*) operator\n";
1938 #endif
1939
1940 // integer tests ...
1941
1942 runScript({
1943 .code = R"NKSP_CODE(
1944 on init
1945 exit(10 * 8)
1946 end on
1947 )NKSP_CODE",
1948 .expectIntExitResult = 80
1949 });
1950
1951 runScript({
1952 .code = R"NKSP_CODE(
1953 on init
1954 exit(-3 * -4)
1955 end on
1956 )NKSP_CODE",
1957 .expectIntExitResult = 12
1958 });
1959
1960 runScript({
1961 .code = R"NKSP_CODE(
1962 on init
1963 exit(-52 * 63)
1964 end on
1965 )NKSP_CODE",
1966 .expectIntExitResult = -3276
1967 });
1968
1969 runScript({
1970 .code = R"NKSP_CODE(
1971 on init
1972 exit(123 * -59)
1973 end on
1974 )NKSP_CODE",
1975 .expectIntExitResult = -7257
1976 });
1977
1978 // real number tests ...
1979
1980 runScript({
1981 .code = R"NKSP_CODE(
1982 on init
1983 exit(10.2 * 8.4)
1984 end on
1985 )NKSP_CODE",
1986 .expectRealExitResult = 85.68
1987 });
1988
1989 runScript({
1990 .code = R"NKSP_CODE(
1991 on init
1992 exit(10.0 * -3.33)
1993 end on
1994 )NKSP_CODE",
1995 .expectRealExitResult = -33.3
1996 });
1997
1998 runScript({
1999 .code = R"NKSP_CODE(
2000 on init
2001 exit(-3.33 * 10.0)
2002 end on
2003 )NKSP_CODE",
2004 .expectRealExitResult = -33.3
2005 });
2006
2007 runScript({
2008 .code = R"NKSP_CODE(
2009 on init
2010 exit(-3.33 * -10.0)
2011 end on
2012 )NKSP_CODE",
2013 .expectRealExitResult = 33.3
2014 });
2015
2016 // mixed type tests ...
2017 // (mixed int * real forbidden ATM)
2018
2019 runScript({
2020 .code = R"NKSP_CODE(
2021 on init
2022 exit(2 * 3.0)
2023 end on
2024 )NKSP_CODE",
2025 .expectParseError = true // mixed int * real forbidden ATM
2026 });
2027
2028 runScript({
2029 .code = R"NKSP_CODE(
2030 on init
2031 exit(2.0 * 3)
2032 end on
2033 )NKSP_CODE",
2034 .expectParseError = true // mixed int * real forbidden ATM
2035 });
2036
2037 // std unit tests ...
2038
2039 runScript({
2040 .code = R"NKSP_CODE(
2041 on init
2042 exit(10ms * 8)
2043 end on
2044 )NKSP_CODE",
2045 .expectIntExitResult = 80,
2046 .expectExitResultUnitPrefix = { VM_MILLI },
2047 .expectExitResultUnit = VM_SECOND
2048 });
2049
2050 runScript({
2051 .code = R"NKSP_CODE(
2052 on init
2053 exit(10 * 8ms)
2054 end on
2055 )NKSP_CODE",
2056 .expectIntExitResult = 80,
2057 .expectExitResultUnitPrefix = { VM_MILLI },
2058 .expectExitResultUnit = VM_SECOND
2059 });
2060
2061 runScript({
2062 .code = R"NKSP_CODE(
2063 on init
2064 exit(10s * 8s)
2065 end on
2066 )NKSP_CODE",
2067 .expectParseError = true // units on both sides not allowed for * ATM
2068 });
2069
2070 runScript({
2071 .code = R"NKSP_CODE(
2072 on init
2073 exit(10cs * 8d)
2074 end on
2075 )NKSP_CODE",
2076 .expectIntExitResult = 80,
2077 .expectExitResultUnitPrefix = { VM_MILLI },
2078 .expectExitResultUnit = VM_SECOND
2079 });
2080
2081 runScript({
2082 .code = R"NKSP_CODE(
2083 on init
2084 exit(10m * 8ms)
2085 end on
2086 )NKSP_CODE",
2087 .expectIntExitResult = 80,
2088 .expectExitResultUnitPrefix = { VM_MICRO },
2089 .expectExitResultUnit = VM_SECOND
2090 });
2091
2092 runScript({
2093 .code = R"NKSP_CODE(
2094 on init
2095 exit(10ms * 8k)
2096 end on
2097 )NKSP_CODE",
2098 .expectIntExitResult = 80,
2099 .expectExitResultUnitPrefix = { VM_NO_PREFIX },
2100 .expectExitResultUnit = VM_SECOND
2101 });
2102
2103 runScript({
2104 .code = R"NKSP_CODE(
2105 on init
2106 exit(10.1ms * 8.0)
2107 end on
2108 )NKSP_CODE",
2109 .expectRealExitResult = 80.8,
2110 .expectExitResultUnitPrefix = { VM_MILLI },
2111 .expectExitResultUnit = VM_SECOND
2112 });
2113
2114 runScript({
2115 .code = R"NKSP_CODE(
2116 on init
2117 exit(10.1 * 8.0ms)
2118 end on
2119 )NKSP_CODE",
2120 .expectRealExitResult = 80.8,
2121 .expectExitResultUnitPrefix = { VM_MILLI },
2122 .expectExitResultUnit = VM_SECOND
2123 });
2124
2125 runScript({
2126 .code = R"NKSP_CODE(
2127 on init
2128 exit(10.0s * 8.0s)
2129 end on
2130 )NKSP_CODE",
2131 .expectParseError = true // units on both sides not allowed for * ATM
2132 });
2133
2134 runScript({
2135 .code = R"NKSP_CODE(
2136 on init
2137 exit(10.1ds * 8.0c)
2138 end on
2139 )NKSP_CODE",
2140 .expectRealExitResult = 80.8,
2141 .expectExitResultUnitPrefix = { VM_MILLI },
2142 .expectExitResultUnit = VM_SECOND
2143 });
2144
2145 runScript({
2146 .code = R"NKSP_CODE(
2147 on init
2148 exit(10.1m * 8.0ms)
2149 end on
2150 )NKSP_CODE",
2151 .expectRealExitResult = 80.8,
2152 .expectExitResultUnitPrefix = { VM_MICRO },
2153 .expectExitResultUnit = VM_SECOND
2154 });
2155
2156 runScript({
2157 .code = R"NKSP_CODE(
2158 on init
2159 exit(10.1m * 8.0ks)
2160 end on
2161 )NKSP_CODE",
2162 .expectRealExitResult = 80.8,
2163 .expectExitResultUnitPrefix = { VM_NO_PREFIX },
2164 .expectExitResultUnit = VM_SECOND
2165 });
2166
2167 runScript({
2168 .code = R"NKSP_CODE(
2169 on init
2170 declare ~foo := 1.0 { neutral }
2171 declare $bar := 7000ms
2172 exit(~foo * real($bar))
2173 end on
2174 )NKSP_CODE",
2175 .expectRealExitResult = 7000.0,
2176 .expectExitResultUnitPrefix = { VM_MILLI },
2177 .expectExitResultUnit = VM_SECOND
2178 });
2179
2180 runScript({
2181 .code = R"NKSP_CODE(
2182 on init
2183 declare $foo := 1 { neutral }
2184 declare $bar := 7000ms
2185 exit(real($foo) * real($bar))
2186 end on
2187 )NKSP_CODE",
2188 .expectRealExitResult = 7000.0,
2189 .expectExitResultUnitPrefix = { VM_MILLI },
2190 .expectExitResultUnit = VM_SECOND
2191 });
2192
2193 // 'final' ('!') operator tests ...
2194
2195 runScript({
2196 .code = R"NKSP_CODE(
2197 on init
2198 exit(!10 * !8)
2199 end on
2200 )NKSP_CODE",
2201 .expectIntExitResult = 80,
2202 .expectExitResultFinal = true
2203 });
2204
2205 runScript({
2206 .code = R"NKSP_CODE(
2207 on init
2208 exit(10 * 8)
2209 end on
2210 )NKSP_CODE",
2211 .expectIntExitResult = 80,
2212 .expectExitResultFinal = false
2213 });
2214
2215 runScript({
2216 .code = R"NKSP_CODE(
2217 on init
2218 exit(!10 * 8)
2219 end on
2220 )NKSP_CODE",
2221 .expectIntExitResult = 80,
2222 .expectExitResultFinal = true,
2223 .expectParseWarning = true // since final only on one side, result will be final though
2224 });
2225
2226 runScript({
2227 .code = R"NKSP_CODE(
2228 on init
2229 exit(10 * !8)
2230 end on
2231 )NKSP_CODE",
2232 .expectIntExitResult = 80,
2233 .expectExitResultFinal = true,
2234 .expectParseWarning = true // since final only on one side, result will be final though
2235 });
2236
2237 runScript({
2238 .code = R"NKSP_CODE(
2239 on init
2240 exit(!10.1 * !8.0)
2241 end on
2242 )NKSP_CODE",
2243 .expectRealExitResult = 80.8,
2244 .expectExitResultFinal = true
2245 });
2246
2247 runScript({
2248 .code = R"NKSP_CODE(
2249 on init
2250 exit(10.1 * 8.0)
2251 end on
2252 )NKSP_CODE",
2253 .expectRealExitResult = 80.8,
2254 .expectExitResultFinal = false
2255 });
2256
2257 runScript({
2258 .code = R"NKSP_CODE(
2259 on init
2260 exit(!10.1 * 8.0)
2261 end on
2262 )NKSP_CODE",
2263 .expectRealExitResult = 80.8,
2264 .expectExitResultFinal = true,
2265 .expectParseWarning = true // since final only on one side, result will be final though
2266 });
2267
2268 runScript({
2269 .code = R"NKSP_CODE(
2270 on init
2271 exit(10.1 * !8.0)
2272 end on
2273 )NKSP_CODE",
2274 .expectRealExitResult = 80.8,
2275 .expectExitResultFinal = true,
2276 .expectParseWarning = true // since final only on one side, result will be final though
2277 });
2278
2279 #if !SILENT_TEST
2280 std::cout << std::endl;
2281 #endif
2282 }
2283
2284 static void testDivideOperator() {
2285 #if !SILENT_TEST
2286 std::cout << "UNIT TEST: divide (/) operator\n";
2287 #endif
2288
2289 // integer tests ...
2290
2291 runScript({
2292 .code = R"NKSP_CODE(
2293 on init
2294 exit(9 / 3)
2295 end on
2296 )NKSP_CODE",
2297 .expectIntExitResult = 3
2298 });
2299
2300 runScript({
2301 .code = R"NKSP_CODE(
2302 on init
2303 exit(-27 / 3)
2304 end on
2305 )NKSP_CODE",
2306 .expectIntExitResult = -9
2307 });
2308
2309 runScript({
2310 .code = R"NKSP_CODE(
2311 on init
2312 exit(35 / -5)
2313 end on
2314 )NKSP_CODE",
2315 .expectIntExitResult = -7
2316 });
2317
2318 runScript({
2319 .code = R"NKSP_CODE(
2320 on init
2321 exit(39 / -5)
2322 end on
2323 )NKSP_CODE",
2324 .expectIntExitResult = -7
2325 });
2326
2327 // real number tests ...
2328
2329 runScript({
2330 .code = R"NKSP_CODE(
2331 on init
2332 exit(9.0 / 10.0)
2333 end on
2334 )NKSP_CODE",
2335 .expectRealExitResult = 0.9
2336 });
2337
2338 runScript({
2339 .code = R"NKSP_CODE(
2340 on init
2341 exit(-9.0 / 10.0)
2342 end on
2343 )NKSP_CODE",
2344 .expectRealExitResult = -0.9
2345 });
2346
2347 runScript({
2348 .code = R"NKSP_CODE(
2349 on init
2350 exit(9.0 / -10.0)
2351 end on
2352 )NKSP_CODE",
2353 .expectRealExitResult = -0.9
2354 });
2355
2356 runScript({
2357 .code = R"NKSP_CODE(
2358 on init
2359 exit(-9.0 / -10.0)
2360 end on
2361 )NKSP_CODE",
2362 .expectRealExitResult = 0.9
2363 });
2364
2365 // mixed type tests ...
2366 // (mixed int / real forbidden ATM)
2367
2368 runScript({
2369 .code = R"NKSP_CODE(
2370 on init
2371 exit(9 / 10.0)
2372 end on
2373 )NKSP_CODE",
2374 .expectParseError = true // mixed int / real forbidden ATM
2375 });
2376
2377 runScript({
2378 .code = R"NKSP_CODE(
2379 on init
2380 exit(9.0 / 10)
2381 end on
2382 )NKSP_CODE",
2383 .expectParseError = true // mixed int / real forbidden ATM
2384 });
2385
2386 // std unit tests ...
2387
2388 runScript({
2389 .code = R"NKSP_CODE(
2390 on init
2391 exit(-27us / 3)
2392 end on
2393 )NKSP_CODE",
2394 .expectIntExitResult = -9,
2395 .expectExitResultUnitPrefix = { VM_MICRO },
2396 .expectExitResultUnit = VM_SECOND
2397 });
2398
2399 runScript({
2400 .code = R"NKSP_CODE(
2401 on init
2402 exit(-27mdB / 3mdB)
2403 end on
2404 )NKSP_CODE",
2405 .expectIntExitResult = -9,
2406 .expectExitResultUnitPrefix = { VM_NO_PREFIX },
2407 .expectExitResultUnit = VM_NO_UNIT
2408 });
2409
2410 runScript({
2411 .code = R"NKSP_CODE(
2412 on init
2413 exit(-27s / 3m)
2414 end on
2415 )NKSP_CODE",
2416 .expectIntExitResult = -9,
2417 .expectExitResultUnitPrefix = { VM_KILO },
2418 .expectExitResultUnit = VM_SECOND
2419 });
2420
2421 runScript({
2422 .code = R"NKSP_CODE(
2423 on init
2424 exit(-27us / 3m)
2425 end on
2426 )NKSP_CODE",
2427 .expectIntExitResult = -9,
2428 .expectExitResultUnitPrefix = { VM_MILLI },
2429 .expectExitResultUnit = VM_SECOND
2430 });
2431
2432 runScript({
2433 .code = R"NKSP_CODE(
2434 on init
2435 exit(-27 / 3s)
2436 end on
2437 )NKSP_CODE",
2438 .expectParseError = true // illegal unit type arrangement for divisions
2439 });
2440
2441 runScript({
2442 .code = R"NKSP_CODE(
2443 on init
2444 exit(-27s / 3Hz)
2445 end on
2446 )NKSP_CODE",
2447 .expectParseError = true // unit types are not matching
2448 });
2449
2450 runScript({
2451 .code = R"NKSP_CODE(
2452 on init
2453 declare $foo := 1000000
2454 declare $bar := 7000ms
2455 exit(real($foo) / 1000000.0 * real($bar))
2456 end on
2457 )NKSP_CODE",
2458 .expectRealExitResult = 7000.0,
2459 .expectExitResultUnitPrefix = { VM_MILLI },
2460 .expectExitResultUnit = VM_SECOND
2461 });
2462
2463 // 'final' ('!') operator tests ...
2464
2465 runScript({
2466 .code = R"NKSP_CODE(
2467 on init
2468 exit(!-27 / !3)
2469 end on
2470 )NKSP_CODE",
2471 .expectIntExitResult = -9,
2472 .expectExitResultFinal = true
2473 });
2474
2475 runScript({
2476 .code = R"NKSP_CODE(
2477 on init
2478 exit(-27 / 3)
2479 end on
2480 )NKSP_CODE",
2481 .expectIntExitResult = -9,
2482 .expectExitResultFinal = false
2483 });
2484
2485 runScript({
2486 .code = R"NKSP_CODE(
2487 on init
2488 exit(!-27 / 3)
2489 end on
2490 )NKSP_CODE",
2491 .expectIntExitResult = -9,
2492 .expectExitResultFinal = true,
2493 .expectParseWarning = true // final only on one side, result will be final though
2494 });
2495
2496 runScript({
2497 .code = R"NKSP_CODE(
2498 on init
2499 exit(-27 / !3)
2500 end on
2501 )NKSP_CODE",
2502 .expectIntExitResult = -9,
2503 .expectExitResultFinal = true,
2504 .expectParseWarning = true // final only on one side, result will be final though
2505 });
2506
2507 #if !SILENT_TEST
2508 std::cout << std::endl;
2509 #endif
2510 }
2511
2512 static void testSmallerThanOperator() {
2513 #if !SILENT_TEST
2514 std::cout << "UNIT TEST: smaller than (<) operator\n";
2515 #endif
2516
2517 // integer tests ...
2518
2519 runScript({
2520 .code = R"NKSP_CODE(
2521 on init
2522 exit(3 < 4)
2523 end on
2524 )NKSP_CODE",
2525 .expectBoolExitResult = true
2526 });
2527
2528 runScript({
2529 .code = R"NKSP_CODE(
2530 on init
2531 exit(4 < 3)
2532 end on
2533 )NKSP_CODE",
2534 .expectBoolExitResult = false
2535 });
2536
2537 runScript({
2538 .code = R"NKSP_CODE(
2539 on init
2540 exit(-4 < 3)
2541 end on
2542 )NKSP_CODE",
2543 .expectBoolExitResult = true
2544 });
2545
2546 runScript({
2547 .code = R"NKSP_CODE(
2548 on init
2549 exit(3 < -4)
2550 end on
2551 )NKSP_CODE",
2552 .expectBoolExitResult = false
2553 });
2554
2555 runScript({
2556 .code = R"NKSP_CODE(
2557 on init
2558 exit(123 < -45)
2559 end on
2560 )NKSP_CODE",
2561 .expectBoolExitResult = false
2562 });
2563
2564 runScript({
2565 .code = R"NKSP_CODE(
2566 on init
2567 exit(-45 < 123)
2568 end on
2569 )NKSP_CODE",
2570 .expectBoolExitResult = true
2571 });
2572
2573 // real number tests ...
2574
2575 runScript({
2576 .code = R"NKSP_CODE(
2577 on init
2578 exit(3.0 < 4.0)
2579 end on
2580 )NKSP_CODE",
2581 .expectBoolExitResult = true
2582 });
2583
2584 runScript({
2585 .code = R"NKSP_CODE(
2586 on init
2587 exit(4.0 < 3.0)
2588 end on
2589 )NKSP_CODE",
2590 .expectBoolExitResult = false
2591 });
2592
2593 runScript({
2594 .code = R"NKSP_CODE(
2595 on init
2596 exit(1.2 < 1.23)
2597 end on
2598 )NKSP_CODE",
2599 .expectBoolExitResult = true
2600 });
2601
2602 runScript({
2603 .code = R"NKSP_CODE(
2604 on init
2605 exit(1.23 < 1.2)
2606 end on
2607 )NKSP_CODE",
2608 .expectBoolExitResult = false
2609 });
2610
2611 runScript({
2612 .code = R"NKSP_CODE(
2613 on init
2614 exit(-4.0 < 3.0)
2615 end on
2616 )NKSP_CODE",
2617 .expectBoolExitResult = true
2618 });
2619
2620 runScript({
2621 .code = R"NKSP_CODE(
2622 on init
2623 exit(3.0 < -4.0)
2624 end on
2625 )NKSP_CODE",
2626 .expectBoolExitResult = false
2627 });
2628
2629 runScript({
2630 .code = R"NKSP_CODE(
2631 on init
2632 exit(123.0 < -45.0)
2633 end on
2634 )NKSP_CODE",
2635 .expectBoolExitResult = false
2636 });
2637
2638 runScript({
2639 .code = R"NKSP_CODE(
2640 on init
2641 exit(-45.0 < 123.0)
2642 end on
2643 )NKSP_CODE",
2644 .expectBoolExitResult = true
2645 });
2646
2647 // mixed type tests ...
2648
2649 runScript({
2650 .code = R"NKSP_CODE(
2651 on init
2652 exit(9 < 9.1)
2653 end on
2654 )NKSP_CODE",
2655 .expectBoolExitResult = true
2656 });
2657
2658 runScript({
2659 .code = R"NKSP_CODE(
2660 on init
2661 exit(9.1 < 9)
2662 end on
2663 )NKSP_CODE",
2664 .expectBoolExitResult = false
2665 });
2666
2667 // std unit tests ...
2668
2669 runScript({
2670 .code = R"NKSP_CODE(
2671 on init
2672 exit(13ms < 14ms)
2673 end on
2674 )NKSP_CODE",
2675 .expectBoolExitResult = true
2676 });
2677
2678 runScript({
2679 .code = R"NKSP_CODE(
2680 on init
2681 exit(14ms < 13ms)
2682 end on
2683 )NKSP_CODE",
2684 .expectBoolExitResult = false
2685 });
2686
2687 runScript({
2688 .code = R"NKSP_CODE(
2689 on init
2690 exit(1s < 990ms)
2691 end on
2692 )NKSP_CODE",
2693 .expectBoolExitResult = false
2694 });
2695
2696 runScript({
2697 .code = R"NKSP_CODE(
2698 on init
2699 exit(990ms < 1s)
2700 end on
2701 )NKSP_CODE",
2702 .expectBoolExitResult = true
2703 });
2704
2705 runScript({
2706 .code = R"NKSP_CODE(
2707 on init
2708 exit(1000ms < 1s)
2709 end on
2710 )NKSP_CODE",
2711 .expectBoolExitResult = false
2712 });
2713
2714 runScript({
2715 .code = R"NKSP_CODE(
2716 on init
2717 exit(1s < 1000ms)
2718 end on
2719 )NKSP_CODE",
2720 .expectBoolExitResult = false
2721 });
2722
2723 runScript({
2724 .code = R"NKSP_CODE(
2725 on init
2726 exit(1s < 1)
2727 end on
2728 )NKSP_CODE",
2729 .expectParseError = true // units on both sides must match
2730 });
2731
2732 runScript({
2733 .code = R"NKSP_CODE(
2734 on init
2735 exit(1 < 1s)
2736 end on
2737 )NKSP_CODE",
2738 .expectParseError = true // units on both sides must match
2739 });
2740
2741 runScript({
2742 .code = R"NKSP_CODE(
2743 on init
2744 exit(1Hz < 1B)
2745 end on
2746 )NKSP_CODE",
2747 .expectParseError = true // units on both sides must match
2748 });
2749
2750 runScript({
2751 .code = R"NKSP_CODE(
2752 on init
2753 exit(13.0ms < 13.1ms)
2754 end on
2755 )NKSP_CODE",
2756 .expectBoolExitResult = true
2757 });
2758
2759 runScript({
2760 .code = R"NKSP_CODE(
2761 on init
2762 exit(13.1ms < 13.0ms)
2763 end on
2764 )NKSP_CODE",
2765 .expectBoolExitResult = false
2766 });
2767
2768 runScript({
2769 .code = R"NKSP_CODE(
2770 on init
2771 exit(0.9s < 600.0ms)
2772 end on
2773 )NKSP_CODE",
2774 .expectBoolExitResult = false
2775 });
2776
2777 runScript({
2778 .code = R"NKSP_CODE(
2779 on init
2780 exit(600.0ms < 0.9s)
2781 end on
2782 )NKSP_CODE",
2783 .expectBoolExitResult = true
2784 });
2785
2786 runScript({
2787 .code = R"NKSP_CODE(
2788 on init
2789 exit(5.1kHz < 5100.0Hz)
2790 end on
2791 )NKSP_CODE",
2792 .expectBoolExitResult = false
2793 });
2794
2795 runScript({
2796 .code = R"NKSP_CODE(
2797 on init
2798 exit(5100.0Hz < 5.1kHz)
2799 end on
2800 )NKSP_CODE",
2801 .expectBoolExitResult = false
2802 });
2803
2804 runScript({
2805 .code = R"NKSP_CODE(
2806 on init
2807 exit(1.0Hz < 1.1)
2808 end on
2809 )NKSP_CODE",
2810 .expectParseError = true // units on both sides must match
2811 });
2812
2813 runScript({
2814 .code = R"NKSP_CODE(
2815 on init
2816 exit(1.2 < 1.34mdB)
2817 end on
2818 )NKSP_CODE",
2819 .expectParseError = true // units on both sides must match
2820 });
2821
2822 runScript({
2823 .code = R"NKSP_CODE(
2824 on init
2825 exit(9.23us < 3.14kHz)
2826 end on
2827 )NKSP_CODE",
2828 .expectParseError = true // units on both sides must match
2829 });
2830
2831 // 'final' ('!') operator tests ...
2832 // (should always yield in false for relation operators)
2833
2834 runScript({
2835 .code = R"NKSP_CODE(
2836 on init
2837 exit(!-4 < !3)
2838 end on
2839 )NKSP_CODE",
2840 .expectBoolExitResult = true,
2841 .expectExitResultFinal = false
2842 });
2843
2844 runScript({
2845 .code = R"NKSP_CODE(
2846 on init
2847 exit(-4 < 3)
2848 end on
2849 )NKSP_CODE",
2850 .expectBoolExitResult = true,
2851 .expectExitResultFinal = false
2852 });
2853
2854 #if !SILENT_TEST
2855 std::cout << std::endl;
2856 #endif
2857 }
2858
2859 static void testGreaterThanOperator() {
2860 #if !SILENT_TEST
2861 std::cout << "UNIT TEST: greater than (>) operator\n";
2862 #endif
2863
2864 // integer tests ...
2865
2866 runScript({
2867 .code = R"NKSP_CODE(
2868 on init
2869 exit(3 > 4)
2870 end on
2871 )NKSP_CODE",
2872 .expectBoolExitResult = false
2873 });
2874
2875 runScript({
2876 .code = R"NKSP_CODE(
2877 on init
2878 exit(4 > 3)
2879 end on
2880 )NKSP_CODE",
2881 .expectBoolExitResult = true
2882 });
2883
2884 runScript({
2885 .code = R"NKSP_CODE(
2886 on init
2887 exit(-4 > 3)
2888 end on
2889 )NKSP_CODE",
2890 .expectBoolExitResult = false
2891 });
2892
2893 runScript({
2894 .code = R"NKSP_CODE(
2895 on init
2896 exit(3 > -4)
2897 end on
2898 )NKSP_CODE",
2899 .expectBoolExitResult = true
2900 });
2901
2902 runScript({
2903 .code = R"NKSP_CODE(
2904 on init
2905 exit(123 > -45)
2906 end on
2907 )NKSP_CODE",
2908 .expectBoolExitResult = true
2909 });
2910
2911 runScript({
2912 .code = R"NKSP_CODE(
2913 on init
2914 exit(-45 > 123)
2915 end on
2916 )NKSP_CODE",
2917 .expectBoolExitResult = false
2918 });
2919
2920 // real number tests ...
2921
2922 runScript({
2923 .code = R"NKSP_CODE(
2924 on init
2925 exit(3.0 > 4.0)
2926 end on
2927 )NKSP_CODE",
2928 .expectBoolExitResult = false
2929 });
2930
2931 runScript({
2932 .code = R"NKSP_CODE(
2933 on init
2934 exit(4.0 > 3.0)
2935 end on
2936 )NKSP_CODE",
2937 .expectBoolExitResult = true
2938 });
2939
2940 runScript({
2941 .code = R"NKSP_CODE(
2942 on init
2943 exit(1.2 > 1.23)
2944 end on
2945 )NKSP_CODE",
2946 .expectBoolExitResult = false
2947 });
2948
2949 runScript({
2950 .code = R"NKSP_CODE(
2951 on init
2952 exit(1.23 > 1.2)
2953 end on
2954 )NKSP_CODE",
2955 .expectBoolExitResult = true
2956 });
2957
2958 runScript({
2959 .code = R"NKSP_CODE(
2960 on init
2961 exit(-4.0 > 3.0)
2962 end on
2963 )NKSP_CODE",
2964 .expectBoolExitResult = false
2965 });
2966
2967 runScript({
2968 .code = R"NKSP_CODE(
2969 on init
2970 exit(3.0 > -4.0)
2971 end on
2972 )NKSP_CODE",
2973 .expectBoolExitResult = true
2974 });
2975
2976 runScript({
2977 .code = R"NKSP_CODE(
2978 on init
2979 exit(123.0 > -45.0)
2980 end on
2981 )NKSP_CODE",
2982 .expectBoolExitResult = true
2983 });
2984
2985 runScript({
2986 .code = R"NKSP_CODE(
2987 on init
2988 exit(-45.0 > 123.0)
2989 end on
2990 )NKSP_CODE",
2991 .expectBoolExitResult = false
2992 });
2993
2994 // mixed type tests ...
2995
2996 runScript({
2997 .code = R"NKSP_CODE(
2998 on init
2999 exit(9 > 9.1)
3000 end on
3001 )NKSP_CODE",
3002 .expectBoolExitResult = false
3003 });
3004
3005 runScript({
3006 .code = R"NKSP_CODE(
3007 on init
3008 exit(9.1 > 9)
3009 end on
3010 )NKSP_CODE",
3011 .expectBoolExitResult = true
3012 });
3013
3014 // std unit tests ...
3015
3016 runScript({
3017 .code = R"NKSP_CODE(
3018 on init
3019 exit(13ms > 14ms)
3020 end on
3021 )NKSP_CODE",
3022 .expectBoolExitResult = false
3023 });
3024
3025 runScript({
3026 .code = R"NKSP_CODE(
3027 on init
3028 exit(14ms > 13ms)
3029 end on
3030 )NKSP_CODE",
3031 .expectBoolExitResult = true
3032 });
3033
3034 runScript({
3035 .code = R"NKSP_CODE(
3036 on init
3037 exit(1s > 990ms)
3038 end on
3039 )NKSP_CODE",
3040 .expectBoolExitResult = true
3041 });
3042
3043 runScript({
3044 .code = R"NKSP_CODE(
3045 on init
3046 exit(990ms > 1s)
3047 end on
3048 )NKSP_CODE",
3049 .expectBoolExitResult = false
3050 });
3051
3052 runScript({
3053 .code = R"NKSP_CODE(
3054 on init
3055 exit(1000ms > 1s)
3056 end on
3057 )NKSP_CODE",
3058 .expectBoolExitResult = false
3059 });
3060
3061 runScript({
3062 .code = R"NKSP_CODE(
3063 on init
3064 exit(1s > 1000ms)
3065 end on
3066 )NKSP_CODE",
3067 .expectBoolExitResult = false
3068 });
3069
3070 runScript({
3071 .code = R"NKSP_CODE(
3072 on init
3073 exit(1s > 1)
3074 end on
3075 )NKSP_CODE",
3076 .expectParseError = true // units on both sides must match
3077 });
3078
3079 runScript({
3080 .code = R"NKSP_CODE(
3081 on init
3082 exit(1 > 1s)
3083 end on
3084 )NKSP_CODE",
3085 .expectParseError = true // units on both sides must match
3086 });
3087
3088 runScript({
3089 .code = R"NKSP_CODE(
3090 on init
3091 exit(1Hz > 1B)
3092 end on
3093 )NKSP_CODE",
3094 .expectParseError = true // units on both sides must match
3095 });
3096
3097 runScript({
3098 .code = R"NKSP_CODE(
3099 on init
3100 exit(13.0ms > 13.1ms)
3101 end on
3102 )NKSP_CODE",
3103 .expectBoolExitResult = false
3104 });
3105
3106 runScript({
3107 .code = R"NKSP_CODE(
3108 on init
3109 exit(13.1ms > 13.0ms)
3110 end on
3111 )NKSP_CODE",
3112 .expectBoolExitResult = true
3113 });
3114
3115 runScript({
3116 .code = R"NKSP_CODE(
3117 on init
3118 exit(0.9s > 600.0ms)
3119 end on
3120 )NKSP_CODE",
3121 .expectBoolExitResult = true
3122 });
3123
3124 runScript({
3125 .code = R"NKSP_CODE(
3126 on init
3127 exit(600.0ms > 0.9s)
3128 end on
3129 )NKSP_CODE",
3130 .expectBoolExitResult = false
3131 });
3132
3133 runScript({
3134 .code = R"NKSP_CODE(
3135 on init
3136 exit(5.1kHz > 5100.0Hz)
3137 end on
3138 )NKSP_CODE",
3139 .expectBoolExitResult = false
3140 });
3141
3142 runScript({
3143 .code = R"NKSP_CODE(
3144 on init
3145 exit(5100.0Hz > 5.1kHz)
3146 end on
3147 )NKSP_CODE",
3148 .expectBoolExitResult = false
3149 });
3150
3151 runScript({
3152 .code = R"NKSP_CODE(
3153 on init
3154 exit(1.0Hz > 1.1)
3155 end on
3156 )NKSP_CODE",
3157 .expectParseError = true // units on both sides must match
3158 });
3159
3160 runScript({
3161 .code = R"NKSP_CODE(
3162 on init
3163 exit(1.2 > 1.34mdB)
3164 end on
3165 )NKSP_CODE",
3166 .expectParseError = true // units on both sides must match
3167 });
3168
3169 runScript({
3170 .code = R"NKSP_CODE(
3171 on init
3172 exit(9.23us > 3.14kHz)
3173 end on
3174 )NKSP_CODE",
3175 .expectParseError = true // units on both sides must match
3176 });
3177
3178 // 'final' ('!') operator tests ...
3179 // (should always yield in false for relation operators)
3180
3181 runScript({
3182 .code = R"NKSP_CODE(
3183 on init
3184 exit(!-4 > !3)
3185 end on
3186 )NKSP_CODE",
3187 .expectBoolExitResult = false,
3188 .expectExitResultFinal = false
3189 });
3190
3191 runScript({
3192 .code = R"NKSP_CODE(
3193 on init
3194 exit(-4 > 3)
3195 end on
3196 )NKSP_CODE",
3197 .expectBoolExitResult = false,
3198 .expectExitResultFinal = false
3199 });
3200
3201 #if !SILENT_TEST
3202 std::cout << std::endl;
3203 #endif
3204 }
3205
3206 static void testSmallerOrEqualOperator() {
3207 #if !SILENT_TEST
3208 std::cout << "UNIT TEST: smaller-or-equal (<=) operator\n";
3209 #endif
3210
3211 // integer tests ...
3212
3213 runScript({
3214 .code = R"NKSP_CODE(
3215 on init
3216 exit(3 <= 3)
3217 end on
3218 )NKSP_CODE",
3219 .expectBoolExitResult = true
3220 });
3221
3222 runScript({
3223 .code = R"NKSP_CODE(
3224 on init
3225 exit(4 <= 4)
3226 end on
3227 )NKSP_CODE",
3228 .expectBoolExitResult = true
3229 });
3230
3231 runScript({
3232 .code = R"NKSP_CODE(
3233 on init
3234 exit(-23 <= -23)
3235 end on
3236 )NKSP_CODE",
3237 .expectBoolExitResult = true
3238 });
3239
3240 runScript({
3241 .code = R"NKSP_CODE(
3242 on init
3243 exit(23 <= -23)
3244 end on
3245 )NKSP_CODE",
3246 .expectBoolExitResult = false
3247 });
3248
3249 runScript({
3250 .code = R"NKSP_CODE(
3251 on init
3252 exit(3 <= 4)
3253 end on
3254 )NKSP_CODE",
3255 .expectBoolExitResult = true
3256 });
3257
3258 runScript({
3259 .code = R"NKSP_CODE(
3260 on init
3261 exit(4 <= 3)
3262 end on
3263 )NKSP_CODE",
3264 .expectBoolExitResult = false
3265 });
3266
3267 runScript({
3268 .code = R"NKSP_CODE(
3269 on init
3270 exit(-4 <= 3)
3271 end on
3272 )NKSP_CODE",
3273 .expectBoolExitResult = true
3274 });
3275
3276 runScript({
3277 .code = R"NKSP_CODE(
3278 on init
3279 exit(3 <= -4)
3280 end on
3281 )NKSP_CODE",
3282 .expectBoolExitResult = false
3283 });
3284
3285 runScript({
3286 .code = R"NKSP_CODE(
3287 on init
3288 exit(123 <= -45)
3289 end on
3290 )NKSP_CODE",
3291 .expectBoolExitResult = false
3292 });
3293
3294 runScript({
3295 .code = R"NKSP_CODE(
3296 on init
3297 exit(-45 <= 123)
3298 end on
3299 )NKSP_CODE",
3300 .expectBoolExitResult = true
3301 });
3302
3303 // real number tests ...
3304
3305 runScript({
3306 .code = R"NKSP_CODE(
3307 on init
3308 exit(3.0 <= 3.0)
3309 end on
3310 )NKSP_CODE",
3311 .expectBoolExitResult = true
3312 });
3313
3314 runScript({
3315 .code = R"NKSP_CODE(
3316 on init
3317 exit(4.33 <= 4.33)
3318 end on
3319 )NKSP_CODE",
3320 .expectBoolExitResult = true
3321 });
3322
3323 runScript({
3324 .code = R"NKSP_CODE(
3325 on init
3326 exit(-23.1 <= -23.1)
3327 end on
3328 )NKSP_CODE",
3329 .expectBoolExitResult = true
3330 });
3331
3332 runScript({
3333 .code = R"NKSP_CODE(
3334 on init
3335 exit(23.3 <= -23.3)
3336 end on
3337 )NKSP_CODE",
3338 .expectBoolExitResult = false
3339 });
3340
3341 runScript({
3342 .code = R"NKSP_CODE(
3343 on init
3344 exit(3.0 <= 4.0)
3345 end on
3346 )NKSP_CODE",
3347 .expectBoolExitResult = true
3348 });
3349
3350 runScript({
3351 .code = R"NKSP_CODE(
3352 on init
3353 exit(4.0 <= 3.0)
3354 end on
3355 )NKSP_CODE",
3356 .expectBoolExitResult = false
3357 });
3358
3359 runScript({
3360 .code = R"NKSP_CODE(
3361 on init
3362 exit(-4.0 <= 3.0)
3363 end on
3364 )NKSP_CODE",
3365 .expectBoolExitResult = true
3366 });
3367
3368 runScript({
3369 .code = R"NKSP_CODE(
3370 on init
3371 exit(3.0 <= -4.0)
3372 end on
3373 )NKSP_CODE",
3374 .expectBoolExitResult = false
3375 });
3376
3377 runScript({
3378 .code = R"NKSP_CODE(
3379 on init
3380 exit(123.0 <= -45.0)
3381 end on
3382 )NKSP_CODE",
3383 .expectBoolExitResult = false
3384 });
3385
3386 runScript({
3387 .code = R"NKSP_CODE(
3388 on init
3389 exit(-45.0 <= 123.0)
3390 end on
3391 )NKSP_CODE",
3392 .expectBoolExitResult = true
3393 });
3394
3395 // mixed type tests ...
3396
3397 runScript({
3398 .code = R"NKSP_CODE(
3399 on init
3400 exit(9 <= 9.1)
3401 end on
3402 )NKSP_CODE",
3403 .expectBoolExitResult = true
3404 });
3405
3406 runScript({
3407 .code = R"NKSP_CODE(
3408 on init
3409 exit(9.1 <= 9)
3410 end on
3411 )NKSP_CODE",
3412 .expectBoolExitResult = false
3413 });
3414
3415 runScript({
3416 .code = R"NKSP_CODE(
3417 on init
3418 exit(9 <= 9.0)
3419 end on
3420 )NKSP_CODE",
3421 .expectBoolExitResult = true
3422 });
3423
3424 runScript({
3425 .code = R"NKSP_CODE(
3426 on init
3427 exit(9.0 <= 9)
3428 end on
3429 )NKSP_CODE",
3430 .expectBoolExitResult = true
3431 });
3432
3433 // std unit tests ...
3434
3435 runScript({
3436 .code = R"NKSP_CODE(
3437 on init
3438 exit(13ms <= 14ms)
3439 end on
3440 )NKSP_CODE",
3441 .expectBoolExitResult = true
3442 });
3443
3444 runScript({
3445 .code = R"NKSP_CODE(
3446 on init
3447 exit(14ms <= 13ms)
3448 end on
3449 )NKSP_CODE",
3450 .expectBoolExitResult = false
3451 });
3452
3453 runScript({
3454 .code = R"NKSP_CODE(
3455 on init
3456 exit(1s <= 990ms)
3457 end on
3458 )NKSP_CODE",
3459 .expectBoolExitResult = false
3460 });
3461
3462 runScript({
3463 .code = R"NKSP_CODE(
3464 on init
3465 exit(990ms <= 1s)
3466 end on
3467 )NKSP_CODE",
3468 .expectBoolExitResult = true
3469 });
3470
3471 runScript({
3472 .code = R"NKSP_CODE(
3473 on init
3474 exit(1000ms <= 1s)
3475 end on
3476 )NKSP_CODE",
3477 .expectBoolExitResult = true
3478 });
3479
3480 runScript({
3481 .code = R"NKSP_CODE(
3482 on init
3483 exit(1s <= 1000ms)
3484 end on
3485 )NKSP_CODE",
3486 .expectBoolExitResult = true
3487 });
3488
3489 runScript({
3490 .code = R"NKSP_CODE(
3491 on init
3492 exit(1s <= 1)
3493 end on
3494 )NKSP_CODE",
3495 .expectParseError = true // units on both sides must match
3496 });
3497
3498 runScript({
3499 .code = R"NKSP_CODE(
3500 on init
3501 exit(1 <= 1s)
3502 end on
3503 )NKSP_CODE",
3504 .expectParseError = true // units on both sides must match
3505 });
3506
3507 runScript({
3508 .code = R"NKSP_CODE(
3509 on init
3510 exit(1Hz <= 1B)
3511 end on
3512 )NKSP_CODE",
3513 .expectParseError = true // units on both sides must match
3514 });
3515
3516 runScript({
3517 .code = R"NKSP_CODE(
3518 on init
3519 exit(13.0ms <= 13.1ms)
3520 end on
3521 )NKSP_CODE",
3522 .expectBoolExitResult = true
3523 });
3524
3525 runScript({
3526 .code = R"NKSP_CODE(
3527 on init
3528 exit(13.1ms <= 13.0ms)
3529 end on
3530 )NKSP_CODE",
3531 .expectBoolExitResult = false
3532 });
3533
3534 runScript({
3535 .code = R"NKSP_CODE(
3536 on init
3537 exit(0.9s <= 600.0ms)
3538 end on
3539 )NKSP_CODE",
3540 .expectBoolExitResult = false
3541 });
3542
3543 runScript({
3544 .code = R"NKSP_CODE(
3545 on init
3546 exit(600.0ms <= 0.9s)
3547 end on
3548 )NKSP_CODE",
3549 .expectBoolExitResult = true
3550 });
3551
3552 runScript({
3553 .code = R"NKSP_CODE(
3554 on init
3555 exit(5.1kHz <= 5100.0Hz)
3556 end on
3557 )NKSP_CODE",
3558 .expectBoolExitResult = true
3559 });
3560
3561 runScript({
3562 .code = R"NKSP_CODE(
3563 on init
3564 exit(5100.0Hz <= 5.1kHz)
3565 end on
3566 )NKSP_CODE",
3567 .expectBoolExitResult = true
3568 });
3569
3570 runScript({
3571 .code = R"NKSP_CODE(
3572 on init
3573 exit(1.0Hz <= 1.1)
3574 end on
3575 )NKSP_CODE",
3576 .expectParseError = true // units on both sides must match
3577 });
3578
3579 runScript({
3580 .code = R"NKSP_CODE(
3581 on init
3582 exit(1.2 <= 1.34mdB)
3583 end on
3584 )NKSP_CODE",
3585 .expectParseError = true // units on both sides must match
3586 });
3587
3588 runScript({
3589 .code = R"NKSP_CODE(
3590 on init
3591 exit(9.23us <= 3.14kHz)
3592 end on
3593 )NKSP_CODE",
3594 .expectParseError = true // units on both sides must match
3595 });
3596
3597 // 'final' ('!') operator tests ...
3598 // (should always yield in false for relation operators)
3599
3600 runScript({
3601 .code = R"NKSP_CODE(
3602 on init
3603 exit(!-4 <= !3)
3604 end on
3605 )NKSP_CODE",
3606 .expectBoolExitResult = true,
3607 .expectExitResultFinal = false
3608 });
3609
3610 runScript({
3611 .code = R"NKSP_CODE(
3612 on init
3613 exit(-4 <= 3)
3614 end on
3615 )NKSP_CODE",
3616 .expectBoolExitResult = true,
3617 .expectExitResultFinal = false
3618 });
3619
3620 #if !SILENT_TEST
3621 std::cout << std::endl;
3622 #endif
3623 }
3624
3625 static void testGreaterOrEqualOperator() {
3626 #if !SILENT_TEST
3627 std::cout << "UNIT TEST: greater-or-equal (>=) operator\n";
3628 #endif
3629
3630 // integer tests ...
3631
3632 runScript({
3633 .code = R"NKSP_CODE(
3634 on init
3635 exit(3 >= 3)
3636 end on
3637 )NKSP_CODE",
3638 .expectBoolExitResult = true
3639 });
3640
3641 runScript({
3642 .code = R"NKSP_CODE(
3643 on init
3644 exit(4 >= 4)
3645 end on
3646 )NKSP_CODE",
3647 .expectBoolExitResult = true
3648 });
3649
3650 runScript({
3651 .code = R"NKSP_CODE(
3652 on init
3653 exit(-23 >= -23)
3654 end on
3655 )NKSP_CODE",
3656 .expectBoolExitResult = true
3657 });
3658
3659 runScript({
3660 .code = R"NKSP_CODE(
3661 on init
3662 exit(23 >= -23)
3663 end on
3664 )NKSP_CODE",
3665 .expectBoolExitResult = true
3666 });
3667
3668 runScript({
3669 .code = R"NKSP_CODE(
3670 on init
3671 exit(3 >= 4)
3672 end on
3673 )NKSP_CODE",
3674 .expectBoolExitResult = false
3675 });
3676
3677 runScript({
3678 .code = R"NKSP_CODE(
3679 on init
3680 exit(4 >= 3)
3681 end on
3682 )NKSP_CODE",
3683 .expectBoolExitResult = true
3684 });
3685
3686 runScript({
3687 .code = R"NKSP_CODE(
3688 on init
3689 exit(-4 >= 3)
3690 end on
3691 )NKSP_CODE",
3692 .expectBoolExitResult = false
3693 });
3694
3695 runScript({
3696 .code = R"NKSP_CODE(
3697 on init
3698 exit(3 >= -4)
3699 end on
3700 )NKSP_CODE",
3701 .expectBoolExitResult = true
3702 });
3703
3704 runScript({
3705 .code = R"NKSP_CODE(
3706 on init
3707 exit(123 >= -45)
3708 end on
3709 )NKSP_CODE",
3710 .expectBoolExitResult = true
3711 });
3712
3713 runScript({
3714 .code = R"NKSP_CODE(
3715 on init
3716 exit(-45 >= 123)
3717 end on
3718 )NKSP_CODE",
3719 .expectBoolExitResult = false
3720 });
3721
3722 // real number tests ...
3723
3724 runScript({
3725 .code = R"NKSP_CODE(
3726 on init
3727 exit(3.0 >= 3.0)
3728 end on
3729 )NKSP_CODE",
3730 .expectBoolExitResult = true
3731 });
3732
3733 runScript({
3734 .code = R"NKSP_CODE(
3735 on init
3736 exit(3.1 >= 3.1)
3737 end on
3738 )NKSP_CODE",
3739 .expectBoolExitResult = true
3740 });
3741
3742 runScript({
3743 .code = R"NKSP_CODE(
3744 on init
3745 exit(3.1 >= 3.0)
3746 end on
3747 )NKSP_CODE",
3748 .expectBoolExitResult = true
3749 });
3750
3751 runScript({
3752 .code = R"NKSP_CODE(
3753 on init
3754 exit(3.0 >= 3.1)
3755 end on
3756 )NKSP_CODE",
3757 .expectBoolExitResult = false
3758 });
3759
3760 runScript({
3761 .code = R"NKSP_CODE(
3762 on init
3763 exit(-23.33 >= -23.33)
3764 end on
3765 )NKSP_CODE",
3766 .expectBoolExitResult = true
3767 });
3768
3769 runScript({
3770 .code = R"NKSP_CODE(
3771 on init
3772 exit(23.0 >= -23.0)
3773 end on
3774 )NKSP_CODE",
3775 .expectBoolExitResult = true
3776 });
3777
3778 runScript({
3779 .code = R"NKSP_CODE(
3780 on init
3781 exit(3.0 >= 4.0)
3782 end on
3783 )NKSP_CODE",
3784 .expectBoolExitResult = false
3785 });
3786
3787 runScript({
3788 .code = R"NKSP_CODE(
3789 on init
3790 exit(4.0 >= 3.0)
3791 end on
3792 )NKSP_CODE",
3793 .expectBoolExitResult = true
3794 });
3795
3796 runScript({
3797 .code = R"NKSP_CODE(
3798 on init
3799 exit(-4.0 >= 3.0)
3800 end on
3801 )NKSP_CODE",
3802 .expectBoolExitResult = false
3803 });
3804
3805 runScript({
3806 .code = R"NKSP_CODE(
3807 on init
3808 exit(3.0 >= -4.0)
3809 end on
3810 )NKSP_CODE",
3811 .expectBoolExitResult = true
3812 });
3813
3814 runScript({
3815 .code = R"NKSP_CODE(
3816 on init
3817 exit(123.0 >= -45.0)
3818 end on
3819 )NKSP_CODE",
3820 .expectBoolExitResult = true
3821 });
3822
3823 runScript({
3824 .code = R"NKSP_CODE(
3825 on init
3826 exit(-45.0 >= 123.0)
3827 end on
3828 )NKSP_CODE",
3829 .expectBoolExitResult = false
3830 });
3831
3832 // mixed type tests ...
3833
3834 runScript({
3835 .code = R"NKSP_CODE(
3836 on init
3837 exit(9 >= 9.1)
3838 end on
3839 )NKSP_CODE",
3840 .expectBoolExitResult = false
3841 });
3842
3843 runScript({
3844 .code = R"NKSP_CODE(
3845 on init
3846 exit(9.1 >= 9)
3847 end on
3848 )NKSP_CODE",
3849 .expectBoolExitResult = true
3850 });
3851
3852 runScript({
3853 .code = R"NKSP_CODE(
3854 on init
3855 exit(9 >= 9.0)
3856 end on
3857 )NKSP_CODE",
3858 .expectBoolExitResult = true
3859 });
3860
3861 runScript({
3862 .code = R"NKSP_CODE(
3863 on init
3864 exit(9.0 >= 9)
3865 end on
3866 )NKSP_CODE",
3867 .expectBoolExitResult = true
3868 });
3869
3870 // std unit tests ...
3871
3872 runScript({
3873 .code = R"NKSP_CODE(
3874 on init
3875 exit(13ms >= 14ms)
3876 end on
3877 )NKSP_CODE",
3878 .expectBoolExitResult = false
3879 });
3880
3881 runScript({
3882 .code = R"NKSP_CODE(
3883 on init
3884 exit(14ms >= 13ms)
3885 end on
3886 )NKSP_CODE",
3887 .expectBoolExitResult = true
3888 });
3889
3890 runScript({
3891 .code = R"NKSP_CODE(
3892 on init
3893 exit(1s >= 990ms)
3894 end on
3895 )NKSP_CODE",
3896 .expectBoolExitResult = true
3897 });
3898
3899 runScript({
3900 .code = R"NKSP_CODE(
3901 on init
3902 exit(990ms >= 1s)
3903 end on
3904 )NKSP_CODE",
3905 .expectBoolExitResult = false
3906 });
3907
3908 runScript({
3909 .code = R"NKSP_CODE(
3910 on init
3911 exit(1000ms >= 1s)
3912 end on
3913 )NKSP_CODE",
3914 .expectBoolExitResult = true
3915 });
3916
3917 runScript({
3918 .code = R"NKSP_CODE(
3919 on init
3920 exit(1s >= 1000ms)
3921 end on
3922 )NKSP_CODE",
3923 .expectBoolExitResult = true
3924 });
3925
3926 runScript({
3927 .code = R"NKSP_CODE(
3928 on init
3929 exit(1s >= 1)
3930 end on
3931 )NKSP_CODE",
3932 .expectParseError = true // units on both sides must match
3933 });
3934
3935 runScript({
3936 .code = R"NKSP_CODE(
3937 on init
3938 exit(1 >= 1s)
3939 end on
3940 )NKSP_CODE",
3941 .expectParseError = true // units on both sides must match
3942 });
3943
3944 runScript({
3945 .code = R"NKSP_CODE(
3946 on init
3947 exit(1Hz >= 1B)
3948 end on
3949 )NKSP_CODE",
3950 .expectParseError = true // units on both sides must match
3951 });
3952
3953 runScript({
3954 .code = R"NKSP_CODE(
3955 on init
3956 exit(13.0ms >= 13.1ms)
3957 end on
3958 )NKSP_CODE",
3959 .expectBoolExitResult = false
3960 });
3961
3962 runScript({
3963 .code = R"NKSP_CODE(
3964 on init
3965 exit(13.1ms >= 13.0ms)
3966 end on
3967 )NKSP_CODE",
3968 .expectBoolExitResult = true
3969 });
3970
3971 runScript({
3972 .code = R"NKSP_CODE(
3973 on init
3974 exit(0.9s >= 600.0ms)
3975 end on
3976 )NKSP_CODE",
3977 .expectBoolExitResult = true
3978 });
3979
3980 runScript({
3981 .code = R"NKSP_CODE(
3982 on init
3983 exit(600.0ms >= 0.9s)
3984 end on
3985 )NKSP_CODE",
3986 .expectBoolExitResult = false
3987 });
3988
3989 runScript({
3990 .code = R"NKSP_CODE(
3991 on init
3992 exit(5.1kHz >= 5100.0Hz)
3993 end on
3994 )NKSP_CODE",
3995 .expectBoolExitResult = true
3996 });
3997
3998 runScript({
3999 .code = R"NKSP_CODE(
4000 on init
4001 exit(5100.0Hz >= 5.1kHz)
4002 end on
4003 )NKSP_CODE",
4004 .expectBoolExitResult = true
4005 });
4006
4007 runScript({
4008 .code = R"NKSP_CODE(
4009 on init
4010 exit(1.0Hz >= 1.1)
4011 end on
4012 )NKSP_CODE",
4013 .expectParseError = true // units on both sides must match
4014 });
4015
4016 runScript({
4017 .code = R"NKSP_CODE(
4018 on init
4019 exit(1.2 >= 1.34mdB)
4020 end on
4021 )NKSP_CODE",
4022 .expectParseError = true // units on both sides must match
4023 });
4024
4025 runScript({
4026 .code = R"NKSP_CODE(
4027 on init
4028 exit(9.23us >= 3.14kHz)
4029 end on
4030 )NKSP_CODE",
4031 .expectParseError = true // units on both sides must match
4032 });
4033
4034 // 'final' ('!') operator tests ...
4035 // (should always yield in false for relation operators)
4036
4037 runScript({
4038 .code = R"NKSP_CODE(
4039 on init
4040 exit(!-4 >= !3)
4041 end on
4042 )NKSP_CODE",
4043 .expectBoolExitResult = false,
4044 .expectExitResultFinal = false
4045 });
4046
4047 runScript({
4048 .code = R"NKSP_CODE(
4049 on init
4050 exit(-4 >= 3)
4051 end on
4052 )NKSP_CODE",
4053 .expectBoolExitResult = false,
4054 .expectExitResultFinal = false
4055 });
4056
4057 #if !SILENT_TEST
4058 std::cout << std::endl;
4059 #endif
4060 }
4061
4062 static void testEqualOperator() {
4063 #if !SILENT_TEST
4064 std::cout << "UNIT TEST: equal (=) operator\n";
4065 #endif
4066
4067 // integer tests ...
4068
4069 runScript({
4070 .code = R"NKSP_CODE(
4071 on init
4072 exit(3 = 3)
4073 end on
4074 )NKSP_CODE",
4075 .expectBoolExitResult = true
4076 });
4077
4078 runScript({
4079 .code = R"NKSP_CODE(
4080 on init
4081 exit(4 = 4)
4082 end on
4083 )NKSP_CODE",
4084 .expectBoolExitResult = true
4085 });
4086
4087 runScript({
4088 .code = R"NKSP_CODE(
4089 on init
4090 exit(3 = 4)
4091 end on
4092 )NKSP_CODE",
4093 .expectBoolExitResult = false
4094 });
4095
4096 runScript({
4097 .code = R"NKSP_CODE(
4098 on init
4099 exit(23 = -23)
4100 end on
4101 )NKSP_CODE",
4102 .expectBoolExitResult = false
4103 });
4104
4105 // real number tests ...
4106
4107 runScript({
4108 .code = R"NKSP_CODE(
4109 on init
4110 exit(3.0 = 3.0)
4111 end on
4112 )NKSP_CODE",
4113 .expectBoolExitResult = true
4114 });
4115
4116 runScript({
4117 .code = R"NKSP_CODE(
4118 on init
4119 exit(4.33 = 4.33)
4120 end on
4121 )NKSP_CODE",
4122 .expectBoolExitResult = true
4123 });
4124
4125 runScript({
4126 .code = R"NKSP_CODE(
4127 on init
4128 exit(4.31 = 4.35)
4129 end on
4130 )NKSP_CODE",
4131 .expectBoolExitResult = false
4132 });
4133
4134 runScript({
4135 .code = R"NKSP_CODE(
4136 on init
4137 exit(3.0 = 4.0)
4138 end on
4139 )NKSP_CODE",
4140 .expectBoolExitResult = false
4141 });
4142
4143 runScript({
4144 .code = R"NKSP_CODE(
4145 on init
4146 exit(23.0 = -23.0)
4147 end on
4148 )NKSP_CODE",
4149 .expectBoolExitResult = false
4150 });
4151
4152 // deal with inaccuracy of float point
4153 runScript({
4154 .code = R"NKSP_CODE(
4155 on init
4156 declare ~a := 0.165
4157 declare ~b := 0.185
4158 declare ~x := 0.1
4159 declare ~y := 0.25
4160 exit(~a + ~b = ~x + ~y) { both sides should actually be 0.35, they slightly deviate both though }
4161 end on
4162 )NKSP_CODE",
4163 .expectBoolExitResult = true // our implementation of real number equal comparison should take care about floating point tolerance
4164 });
4165
4166 // deal with inaccuracy of float point
4167 runScript({
4168 .code = R"NKSP_CODE(
4169 on init
4170 declare ~a := 0.166
4171 declare ~b := 0.185
4172 declare ~x := 0.1
4173 declare ~y := 0.25
4174 exit(~a + ~b = ~x + ~y) { left side approx. 0.351, right side approx. 0.35 }
4175 end on
4176 )NKSP_CODE",
4177 .expectBoolExitResult = false
4178 });
4179
4180 // mixed type tests ...
4181
4182 runScript({
4183 .code = R"NKSP_CODE(
4184 on init
4185 exit(23 = 23.0)
4186 end on
4187 )NKSP_CODE",
4188 .expectBoolExitResult = true
4189 });
4190
4191 runScript({
4192 .code = R"NKSP_CODE(
4193 on init
4194 exit(23.0 = 23)
4195 end on
4196 )NKSP_CODE",
4197 .expectBoolExitResult = true
4198 });
4199
4200 runScript({
4201 .code = R"NKSP_CODE(
4202 on init
4203 exit(23 = 23.1)
4204 end on
4205 )NKSP_CODE",
4206 .expectBoolExitResult = false
4207 });
4208
4209 runScript({
4210 .code = R"NKSP_CODE(
4211 on init
4212 exit(23.1 = 23)
4213 end on
4214 )NKSP_CODE",
4215 .expectBoolExitResult = false
4216 });
4217
4218 // std unit tests ...
4219
4220 runScript({
4221 .code = R"NKSP_CODE(
4222 on init
4223 exit(13ms = 14ms)
4224 end on
4225 )NKSP_CODE",
4226 .expectBoolExitResult = false
4227 });
4228
4229 runScript({
4230 .code = R"NKSP_CODE(
4231 on init
4232 exit(14ms = 13ms)
4233 end on
4234 )NKSP_CODE",
4235 .expectBoolExitResult = false
4236 });
4237
4238 runScript({
4239 .code = R"NKSP_CODE(
4240 on init
4241 exit(1s = 1ms)
4242 end on
4243 )NKSP_CODE",
4244 .expectBoolExitResult = false
4245 });
4246
4247 runScript({
4248 .code = R"NKSP_CODE(
4249 on init
4250 exit(1ms = 1s)
4251 end on
4252 )NKSP_CODE",
4253 .expectBoolExitResult = false
4254 });
4255
4256 runScript({
4257 .code = R"NKSP_CODE(
4258 on init
4259 exit(3.14kHz = 3140Hz)
4260 end on
4261 )NKSP_CODE",
4262 .expectBoolExitResult = true
4263 });
4264
4265 runScript({
4266 .code = R"NKSP_CODE(
4267 on init
4268 exit(3140Hz = 3.14kHz)
4269 end on
4270 )NKSP_CODE",
4271 .expectBoolExitResult = true
4272 });
4273
4274 runScript({
4275 .code = R"NKSP_CODE(
4276 on init
4277 exit(1s = 1)
4278 end on
4279 )NKSP_CODE",
4280 .expectParseError = true // units on both sides must match
4281 });
4282
4283 runScript({
4284 .code = R"NKSP_CODE(
4285 on init
4286 exit(1 = 1s)
4287 end on
4288 )NKSP_CODE",
4289 .expectParseError = true // units on both sides must match
4290 });
4291
4292 runScript({
4293 .code = R"NKSP_CODE(
4294 on init
4295 exit(1Hz = 1B)
4296 end on
4297 )NKSP_CODE",
4298 .expectParseError = true // units on both sides must match
4299 });
4300
4301 // 'final' ('!') operator tests ...
4302 // (should always yield in false for relation operators)
4303
4304 runScript({
4305 .code = R"NKSP_CODE(
4306 on init
4307 exit(!-4 = !3)
4308 end on
4309 )NKSP_CODE",
4310 .expectBoolExitResult = false,
4311 .expectExitResultFinal = false
4312 });
4313
4314 runScript({
4315 .code = R"NKSP_CODE(
4316 on init
4317 exit(-4 = 3)
4318 end on
4319 )NKSP_CODE",
4320 .expectBoolExitResult = false,
4321 .expectExitResultFinal = false
4322 });
4323
4324 #if !SILENT_TEST
4325 std::cout << std::endl;
4326 #endif
4327 }
4328
4329 static void testUnequalOperator() {
4330