Parent Directory
|
Revision Log
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 |