annotate tests/scripttest.cpp @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
ferencd@0 1 #include "tests.h"
ferencd@0 2 #include "nbci.h"
ferencd@0 3 #include "gtest/gtest.h"
ferencd@0 4
ferencd@0 5 #include "compiler.h"
ferencd@0 6 #include "nap_runtime.h"
ferencd@0 7
ferencd@0 8 TEST(Simple, Printing)
ferencd@0 9 {
ferencd@0 10 SCRIPT_START
ferencd@0 11 " \
ferencd@0 12 print(\"Hello World\n\"); \
ferencd@0 13 "
ferencd@0 14 SCRIPT_END
ferencd@0 15
ferencd@0 16 SCRIPT_SHUTDOWN
ferencd@0 17 (void)found_indicator;
ferencd@0 18
ferencd@0 19 }
ferencd@0 20
ferencd@0 21 TEST(Assembly, PushPop)
ferencd@0 22 {
ferencd@0 23 nap_runtime* runtime = nap_runtime_create("$");
ferencd@0 24 ASSERT_FALSE(runtime == NULL);
ferencd@0 25 int found_indicator;
ferencd@0 26 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 27 " \
ferencd@0 28 int a; \
ferencd@0 29 asm \
ferencd@0 30 { \
ferencd@0 31 push 23; \
ferencd@0 32 pop global.a; \
ferencd@0 33 } \
ferencd@0 34 "
ferencd@0 35 SCRIPT_END
ferencd@0 36
ferencd@0 37 ASSERT_EQ(23, VAR_INT(a));
ferencd@0 38
ferencd@0 39 SCRIPT_SHUTDOWN
ferencd@0 40 }
ferencd@0 41
ferencd@0 42 TEST(Definitions, CodeBlocksWithScope)
ferencd@0 43 {
ferencd@0 44 SCRIPT_START
ferencd@0 45 " \
ferencd@0 46 int a = 1; \
ferencd@0 47 { int c = 3;int a = 2;} \
ferencd@0 48 int b = 2; \
ferencd@0 49 "
ferencd@0 50 SCRIPT_END
ferencd@0 51 ASSERT_TRUE( 1 == VAR_INT(a));
ferencd@0 52 ASSERT_TRUE( 2 == VAR_INT(b));
ferencd@0 53
ferencd@0 54 SCRIPT_SHUTDOWN
ferencd@0 55 }
ferencd@0 56
ferencd@0 57 TEST(Floats, BasicRealOperations)
ferencd@0 58 {
ferencd@0 59 SCRIPT_START
ferencd@0 60 " \
ferencd@0 61 real a = 5.6; \
ferencd@0 62 real b = a * 10; \
ferencd@0 63 "
ferencd@0 64 SCRIPT_END
ferencd@0 65 double _b = (double)VAR_REAL(b);
ferencd@0 66 ASSERT_DOUBLE_EQ((double)56.0, _b);
ferencd@0 67
ferencd@0 68 SCRIPT_SHUTDOWN
ferencd@0 69 }
ferencd@0 70
ferencd@0 71 TEST(Operations, UnaryMathOperations)
ferencd@0 72 {
ferencd@0 73 SCRIPT_START
ferencd@0 74 " \
ferencd@0 75 int a = 5; \
ferencd@0 76 int b = -5; \
ferencd@0 77 int c = +b; \
ferencd@0 78 int d = -a; \
ferencd@0 79 int e = 3 - (-2); \
ferencd@0 80 "
ferencd@0 81 SCRIPT_END
ferencd@0 82
ferencd@0 83 ASSERT_EQ(5, VAR_INT(c));
ferencd@0 84 ASSERT_EQ(-5, VAR_INT(d));
ferencd@0 85 ASSERT_EQ(5, VAR_INT(e));
ferencd@0 86
ferencd@0 87 SCRIPT_SHUTDOWN
ferencd@0 88
ferencd@0 89 }
ferencd@0 90
ferencd@0 91 TEST(Operations, BasicIntVariableOperations)
ferencd@0 92 {
ferencd@0 93
ferencd@0 94 SCRIPT_START
ferencd@0 95 " \
ferencd@0 96 int a; \
ferencd@0 97 int b; \
ferencd@0 98 int a_plus_b; \
ferencd@0 99 int a_minus_b; \
ferencd@0 100 int a_mul_b; \
ferencd@0 101 int a_div_b; \
ferencd@0 102 int a_mod_b; \
ferencd@0 103 a = 9; \
ferencd@0 104 b = 3; \
ferencd@0 105 a_plus_b = a + b; \
ferencd@0 106 a_minus_b = a - b; \
ferencd@0 107 a_mul_b = a * b; \
ferencd@0 108 a_div_b = a / b; \
ferencd@0 109 a_mod_b = a % b; \
ferencd@0 110 "
ferencd@0 111 SCRIPT_END
ferencd@0 112
ferencd@0 113 ASSERT_TRUE( 9 == VAR_INT(a));
ferencd@0 114 ASSERT_TRUE( 3 == VAR_INT(b));
ferencd@0 115 ASSERT_TRUE(12 == VAR_INT(a_plus_b));
ferencd@0 116 ASSERT_TRUE( 6 == VAR_INT(a_minus_b));
ferencd@0 117 ASSERT_TRUE( 3 == VAR_INT(a_div_b));
ferencd@0 118 ASSERT_TRUE(27 == VAR_INT(a_mul_b));
ferencd@0 119 ASSERT_TRUE( 0 == VAR_INT(a_mod_b));
ferencd@0 120
ferencd@0 121 SCRIPT_SHUTDOWN
ferencd@0 122 }
ferencd@0 123
ferencd@0 124 TEST(Operations, BasicBitwiseOperations)
ferencd@0 125 {
ferencd@0 126
ferencd@0 127 SCRIPT_START
ferencd@0 128 " \
ferencd@0 129 int a1 = 1; \
ferencd@0 130 int a2 = 2; \
ferencd@0 131 int a3 = 3; \
ferencd@0 132 int a4 = 1; \
ferencd@0 133 int a5 = 2; \
ferencd@0 134 int a6 = 2; \
ferencd@0 135 int b1 = a1 << 1; \
ferencd@0 136 int b2 = a2 >> 1; \
ferencd@0 137 int b3 = a3 & 1; \
ferencd@0 138 int b4 = a4 | 2; \
ferencd@0 139 int b5 = a5 ^ 1; \
ferencd@0 140 int b6 = ~a6; \
ferencd@0 141 "
ferencd@0 142 SCRIPT_END
ferencd@0 143
ferencd@0 144 ASSERT_TRUE( 2 == VAR_INT(b1));
ferencd@0 145 ASSERT_TRUE( 1 == VAR_INT(b2));
ferencd@0 146 ASSERT_TRUE( 1 == VAR_INT(b3));
ferencd@0 147 ASSERT_TRUE( 3 == VAR_INT(b4));
ferencd@0 148 ASSERT_TRUE( 3 == VAR_INT(b5));
ferencd@0 149 ASSERT_TRUE(-3 == VAR_INT(b6));
ferencd@0 150
ferencd@0 151 SCRIPT_SHUTDOWN
ferencd@0 152 }
ferencd@0 153
ferencd@0 154
ferencd@0 155 TEST(Operations, BasicStringVariableOperations1)
ferencd@0 156 {
ferencd@0 157
ferencd@0 158 SCRIPT_START
ferencd@0 159 " \
ferencd@0 160 string a = \"AA\"; \
ferencd@0 161 string b = \"BB\"; \
ferencd@0 162 string a_plus_b; \
ferencd@0 163 a_plus_b = a + b; \
ferencd@0 164 "
ferencd@0 165 SCRIPT_END
ferencd@0 166
ferencd@0 167 SCRIPT_ASSERT_STREQ("AABB", a_plus_b);
ferencd@0 168
ferencd@0 169 SCRIPT_SHUTDOWN
ferencd@0 170 }
ferencd@0 171
ferencd@0 172 TEST(Operations, BasicStringVariableOperations2)
ferencd@0 173 {
ferencd@0 174
ferencd@0 175 SCRIPT_START
ferencd@0 176 " \
ferencd@0 177 string a = \"A\"; \
ferencd@0 178 string b = a + \"B\"; \
ferencd@0 179 "
ferencd@0 180 SCRIPT_END
ferencd@0 181
ferencd@0 182 SCRIPT_ASSERT_STREQ("AB", b);
ferencd@0 183
ferencd@0 184 SCRIPT_SHUTDOWN
ferencd@0 185 }
ferencd@0 186
ferencd@0 187 TEST(Operations, BasicStringVariableOperations4)
ferencd@0 188 {
ferencd@0 189
ferencd@0 190 SCRIPT_START
ferencd@0 191 " \
ferencd@0 192 string sa = \"A\"; \
ferencd@0 193 string sb ; \
ferencd@0 194 asm \
ferencd@0 195 { \
ferencd@0 196 mov reg string(0), global.sa \
ferencd@0 197 mov reg string(1), \"B\" \
ferencd@0 198 add reg string(0), reg string(1) \
ferencd@0 199 mov global.sb, reg string(0) \
ferencd@0 200 } \
ferencd@0 201 "
ferencd@0 202 SCRIPT_END
ferencd@0 203
ferencd@0 204 SCRIPT_ASSERT_STREQ("AB", sb);
ferencd@0 205
ferencd@0 206 SCRIPT_SHUTDOWN
ferencd@0 207 }
ferencd@0 208
ferencd@0 209 /* Define a string variable, copy out one character from it into an int register
ferencd@0 210 see that the conversion succeeded.*/
ferencd@0 211 TEST(Operations, BasicStringVariableOperations5)
ferencd@0 212 {
ferencd@0 213
ferencd@0 214 SCRIPT_START
ferencd@0 215 " \
ferencd@0 216 string sa = \"A123B\"; \
ferencd@0 217 int ib = 9; \
ferencd@0 218 asm \
ferencd@0 219 { \
ferencd@0 220 mov reg idx(0), 1 \
ferencd@0 221 mov reg int(0), @#ccidx(global.sa, 1)\
ferencd@0 222 mov global.ib, reg int (0) \
ferencd@0 223 } \
ferencd@0 224 "
ferencd@0 225 SCRIPT_END
ferencd@0 226
ferencd@0 227 ASSERT_EQ(1, VAR_INT(ib));
ferencd@0 228
ferencd@0 229 SCRIPT_SHUTDOWN
ferencd@0 230 }
ferencd@0 231
ferencd@0 232 /* Define a string variable, copy out a substring from it into an int register
ferencd@0 233 see that the conversion succeeded.*/
ferencd@0 234 TEST(Operations, BasicStringVariableOperations6)
ferencd@0 235 {
ferencd@0 236
ferencd@0 237 SCRIPT_START
ferencd@0 238 " \
ferencd@0 239 string sa = \"A123B\"; \
ferencd@0 240 int ib = 9; \
ferencd@0 241 asm \
ferencd@0 242 { \
ferencd@0 243 mov reg idx(0), 1 \
ferencd@0 244 mov reg idx(1), 3 \
ferencd@0 245 mov reg int(0), @#ccidx(global.sa, 2)\
ferencd@0 246 mov global.ib, reg int (0) \
ferencd@0 247 } \
ferencd@0 248 "
ferencd@0 249 SCRIPT_END
ferencd@0 250
ferencd@0 251 ASSERT_EQ(123, VAR_INT(ib));
ferencd@0 252
ferencd@0 253 SCRIPT_SHUTDOWN
ferencd@0 254 }
ferencd@0 255
ferencd@0 256
ferencd@0 257 TEST(Operations, BasicImmediateOperations)
ferencd@0 258 {
ferencd@0 259 SCRIPT_START
ferencd@0 260 " \
ferencd@0 261 int a_plus_b; \
ferencd@0 262 int a_minus_b; \
ferencd@0 263 int a_mul_b; \
ferencd@0 264 int a_div_b; \
ferencd@0 265 int a_mod_b; \
ferencd@0 266 a_plus_b = 9 + 3; \
ferencd@0 267 a_minus_b = 9 - 3; \
ferencd@0 268 a_mul_b = 9 * 3; \
ferencd@0 269 a_div_b = 9 / 3; \
ferencd@0 270 a_mod_b = 9 % 3; \
ferencd@0 271 "
ferencd@0 272 SCRIPT_END
ferencd@0 273
ferencd@0 274 ASSERT_TRUE(12 == VAR_INT(a_plus_b));
ferencd@0 275 ASSERT_TRUE( 6 == VAR_INT(a_minus_b));
ferencd@0 276 ASSERT_TRUE( 3 == VAR_INT(a_div_b));
ferencd@0 277 ASSERT_TRUE(27 == VAR_INT(a_mul_b));
ferencd@0 278 ASSERT_TRUE( 0 == VAR_INT(a_mod_b));
ferencd@0 279
ferencd@0 280 SCRIPT_SHUTDOWN
ferencd@0 281 }
ferencd@0 282
ferencd@0 283 TEST(Definitions, InvalidVariableName)
ferencd@0 284 {
ferencd@0 285 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 286 ASSERT_TRUE(runtime != NULL);
ferencd@0 287 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 288 " \
ferencd@0 289 int a_ plus_b; \
ferencd@0 290 "
ferencd@0 291 ,0);
ferencd@0 292
ferencd@0 293 ASSERT_TRUE(bytecode == NULL);
ferencd@0 294 SCRIPT_SHUTDOWN
ferencd@0 295 }
ferencd@0 296
ferencd@0 297 TEST(StringToIntConversion, DifferentBases)
ferencd@0 298 {
ferencd@0 299 SCRIPT_START
ferencd@0 300 " \
ferencd@0 301 int binary = 0; \
ferencd@0 302 int decimal = 0; \
ferencd@0 303 int zero = 1; \
ferencd@0 304 int hexa = 0; \
ferencd@0 305 int octal = 0; \
ferencd@0 306 asm \
ferencd@0 307 { \
ferencd@0 308 mov reg string 0, \"9877\" \
ferencd@0 309 mov reg int 0, reg string 0 \
ferencd@0 310 mov global.decimal, reg int 0 \
ferencd@0 311 mov reg string 0, \"0xABCDE\" \
ferencd@0 312 mov reg int 0, reg string 0 \
ferencd@0 313 mov global.hexa, reg int 0 \
ferencd@0 314 mov reg string 0, \"0665544\" \
ferencd@0 315 mov reg int 0, reg string 0 \
ferencd@0 316 mov global.octal, reg int 0 \
ferencd@0 317 mov reg string 0, \"0b1001001\" \
ferencd@0 318 mov reg int 0, reg string 0 \
ferencd@0 319 mov global.binary, reg int 0 \
ferencd@0 320 mov reg string 0, \"0\" \
ferencd@0 321 mov reg int 0, reg string 0 \
ferencd@0 322 mov global.zero, reg int 0 \
ferencd@0 323 } \
ferencd@0 324 "
ferencd@0 325 SCRIPT_END
ferencd@0 326
ferencd@0 327 ASSERT_TRUE(9877 == VAR_INT(decimal));
ferencd@0 328 ASSERT_TRUE(703710 == VAR_INT(hexa));
ferencd@0 329 ASSERT_TRUE(224100 == VAR_INT(octal));
ferencd@0 330 ASSERT_TRUE(73 == VAR_INT(binary));
ferencd@0 331 ASSERT_TRUE(0 == VAR_INT(zero));
ferencd@0 332
ferencd@0 333 SCRIPT_SHUTDOWN
ferencd@0 334 }
ferencd@0 335
ferencd@0 336 TEST(Operations, PostPreIncrement)
ferencd@0 337 {
ferencd@0 338 SCRIPT_START
ferencd@0 339 " \
ferencd@0 340 int i=0; \
ferencd@0 341 int y = i++; \
ferencd@0 342 int z = ++i; \
ferencd@0 343 "
ferencd@0 344 SCRIPT_END
ferencd@0 345
ferencd@0 346 ASSERT_TRUE(2 == VAR_INT(i));
ferencd@0 347 ASSERT_TRUE(0 == VAR_INT(y));
ferencd@0 348 ASSERT_TRUE(2 == VAR_INT(z));
ferencd@0 349
ferencd@0 350 SCRIPT_SHUTDOWN
ferencd@0 351 }
ferencd@0 352
ferencd@0 353 TEST(Keywords, Break)
ferencd@0 354 {
ferencd@0 355 SCRIPT_START
ferencd@0 356 " \
ferencd@0 357 int y = 1; \
ferencd@0 358 for(int i = 0; i< 11; i++) \
ferencd@0 359 { \
ferencd@0 360 int t = y ++; \
ferencd@0 361 if (t == 7) \
ferencd@0 362 { \
ferencd@0 363 break; \
ferencd@0 364 } \
ferencd@0 365 } \
ferencd@0 366 "
ferencd@0 367 SCRIPT_END
ferencd@0 368 ASSERT_EQ(8, VAR_INT(y));
ferencd@0 369
ferencd@0 370 SCRIPT_SHUTDOWN
ferencd@0 371 }
ferencd@0 372
ferencd@0 373 TEST(InvalidSyntax, PostPreIncMess)
ferencd@0 374 {
ferencd@0 375
ferencd@0 376 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 377 ASSERT_TRUE(runtime != NULL);
ferencd@0 378 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 379 " \
ferencd@0 380 int z = 3; \
ferencd@0 381 int g = z++ ++; \
ferencd@0 382 "
ferencd@0 383 ,0);
ferencd@0 384
ferencd@0 385 ASSERT_TRUE(bytecode == NULL);
ferencd@0 386 SCRIPT_SHUTDOWN
ferencd@0 387 }
ferencd@0 388
ferencd@0 389 TEST(RuntimeCompilation, SimpleCheck)
ferencd@0 390 {
ferencd@0 391 SCRIPT_START
ferencd@0 392 " \
ferencd@0 393 int a = 2; \
ferencd@0 394 int b = 3; \
ferencd@0 395 int c; \
ferencd@0 396 nap_execute(\"c = a + b\"); \
ferencd@0 397 "
ferencd@0 398 SCRIPT_END
ferencd@0 399
ferencd@0 400 ASSERT_EQ(5, VAR_INT(c));
ferencd@0 401
ferencd@0 402 SCRIPT_SHUTDOWN
ferencd@0 403 }
ferencd@0 404
ferencd@0 405 TEST(RuntimeCompilation, CompoundedExpression)
ferencd@0 406 {
ferencd@0 407 SCRIPT_START
ferencd@0 408 " \
ferencd@0 409 int a = 2; \
ferencd@0 410 int b = 3; \
ferencd@0 411 int c; \
ferencd@0 412 string sa = \"c=a\"; \
ferencd@0 413 string sb = \"+b\"; \
ferencd@0 414 nap_execute(sa + sb); \
ferencd@0 415 "
ferencd@0 416 SCRIPT_END
ferencd@0 417
ferencd@0 418 ASSERT_EQ(5, VAR_INT(c));
ferencd@0 419
ferencd@0 420 SCRIPT_SHUTDOWN
ferencd@0 421 }
ferencd@0 422
ferencd@0 423 /*
ferencd@0 424 * TESTS FOR FUNCTIONS AND THEIR ASSOCIATED BEHAVIOUR
ferencd@0 425 */
ferencd@0 426
ferencd@0 427 /* Define a function returning an in which takes in an int parameter. Return the
ferencd@0 428 next value of the parameter (ie: par + 1). Check in the calling code the
ferencd@0 429 value. */
ferencd@0 430 TEST(Functions, SimpleFunctionCall)
ferencd@0 431 {
ferencd@0 432 SCRIPT_START
ferencd@0 433 " \
ferencd@0 434 int func(int a) \
ferencd@0 435 { \
ferencd@0 436 return a + 1; \
ferencd@0 437 } \
ferencd@0 438 int a = 5; \
ferencd@0 439 a = func(a); \
ferencd@0 440 "
ferencd@0 441 SCRIPT_END
ferencd@0 442
ferencd@0 443 ASSERT_EQ(6, VAR_INT(a));
ferencd@0 444
ferencd@0 445 SCRIPT_SHUTDOWN;
ferencd@0 446 }
ferencd@0 447
ferencd@0 448 /* Define a function returning and int. Do not put return statements in the body.
ferencd@0 449 * Use the function, see that it returns the default return value (0).
ferencd@0 450 */
ferencd@0 451 TEST(Functions, DefaultReturnValue)
ferencd@0 452 {
ferencd@0 453 SCRIPT_START
ferencd@0 454 " \
ferencd@0 455 int func() \
ferencd@0 456 { \
ferencd@0 457 } \
ferencd@0 458 int z = func(); \
ferencd@0 459 "
ferencd@0 460 SCRIPT_END
ferencd@0 461 ASSERT_EQ(0, VAR_INT(z));
ferencd@0 462
ferencd@0 463 SCRIPT_SHUTDOWN
ferencd@0 464 }
ferencd@0 465
ferencd@0 466 /* Define an external function, also implement it in the test file.
ferencd@0 467 * Use the function, see that it does not fail.
ferencd@0 468 */
ferencd@0 469 TEST(Functions, ExternalCalling)
ferencd@0 470 {
ferencd@0 471 nap_runtime* runtime = nap_runtime_create("a");
ferencd@0 472 ASSERT_FALSE(runtime == NULL);
ferencd@0 473
ferencd@0 474 int found_indicator;
ferencd@0 475 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime, " \
ferencd@0 476 extern void external_callee(int, int); \
ferencd@0 477 external_callee(1,2); \
ferencd@0 478 "
ferencd@0 479 ,0);
ferencd@0 480 ASSERT_FALSE(bytecode == NULL);
ferencd@0 481 nap_runtime_execute(runtime, bytecode);
ferencd@0 482 SCRIPT_SHUTDOWN
ferencd@0 483
ferencd@0 484 UNUSED(found_indicator);
ferencd@0 485 }
ferencd@0 486
ferencd@0 487 /* Define a function with an int reference as parameter. Assign a value to
ferencd@0 488 * the parameter in the function body and see that the caller gets modified */
ferencd@0 489 TEST(Functions, IntReference)
ferencd@0 490 {
ferencd@0 491 SCRIPT_START
ferencd@0 492 " \
ferencd@0 493 void func(int& a) \
ferencd@0 494 { \
ferencd@0 495 a = 6; \
ferencd@0 496 } \
ferencd@0 497 int z = 7; func(z); \
ferencd@0 498 "
ferencd@0 499 SCRIPT_END
ferencd@0 500 ASSERT_EQ(6, VAR_INT(z));
ferencd@0 501
ferencd@0 502 SCRIPT_SHUTDOWN
ferencd@0 503 }
ferencd@0 504
ferencd@0 505 /* Define a function with an byte reference as parameter. Assign a value to
ferencd@0 506 * the parameter in the function body and see that the caller gets modified */
ferencd@0 507 TEST(Functions, ByteReference)
ferencd@0 508 {
ferencd@0 509 SCRIPT_START
ferencd@0 510 " \
ferencd@0 511 void func(byte& a) \
ferencd@0 512 { \
ferencd@0 513 a = 6; \
ferencd@0 514 } \
ferencd@0 515 byte z = 7; func(z); \
ferencd@0 516 "
ferencd@0 517 SCRIPT_END
ferencd@0 518 ASSERT_EQ(6, VAR_BYTE(z));
ferencd@0 519
ferencd@0 520 SCRIPT_SHUTDOWN
ferencd@0 521 }
ferencd@0 522
ferencd@0 523 /* Define a function with an real reference as parameter. Assign a value to
ferencd@0 524 * the parameter in the function body and see that the caller gets modified */
ferencd@0 525 TEST(Functions, RealReference)
ferencd@0 526 {
ferencd@0 527 SCRIPT_START
ferencd@0 528 " \
ferencd@0 529 void func(real& a) \
ferencd@0 530 { \
ferencd@0 531 a = 6.7; \
ferencd@0 532 } \
ferencd@0 533 real z = 7.8; func(z); \
ferencd@0 534 "
ferencd@0 535 SCRIPT_END
ferencd@0 536 double _z = (double)VAR_REAL(z);
ferencd@0 537 ASSERT_DOUBLE_EQ((double)6.7, _z);
ferencd@0 538 SCRIPT_SHUTDOWN
ferencd@0 539 }
ferencd@0 540
ferencd@0 541 /* Define a function with a real array as parameter. Assign a value to
ferencd@0 542 * the parameter in the function body and see that the caller does not get
ferencd@0 543 * modified */
ferencd@0 544 TEST(Functions, RealArray)
ferencd@0 545 {
ferencd@0 546 SCRIPT_START
ferencd@0 547 " \
ferencd@0 548 void func(real a[]) \
ferencd@0 549 { \
ferencd@0 550 a[0] = 6.7; \
ferencd@0 551 } \
ferencd@0 552 real z[10]; \
ferencd@0 553 z[0] = 7.8; func(z); \
ferencd@0 554 real b = z[0]; \
ferencd@0 555 "
ferencd@0 556 SCRIPT_END
ferencd@0 557 double _b = (double)VAR_REAL(b);
ferencd@0 558 ASSERT_DOUBLE_EQ((double)7.8, _b);
ferencd@0 559 SCRIPT_SHUTDOWN
ferencd@0 560 }
ferencd@0 561
ferencd@0 562 /* Define a function with an int array as parameter. Assign a value to
ferencd@0 563 * the parameter in the function body and see that the caller does not get
ferencd@0 564 * modified */
ferencd@0 565 TEST(Functions, IntArray)
ferencd@0 566 {
ferencd@0 567 SCRIPT_START
ferencd@0 568 " \
ferencd@0 569 void func(int a[]) \
ferencd@0 570 { \
ferencd@0 571 a[0] = 6; \
ferencd@0 572 } \
ferencd@0 573 int z[10]; \
ferencd@0 574 z[0] = 8; func(z); \
ferencd@0 575 int b = z[0]; \
ferencd@0 576 "
ferencd@0 577 SCRIPT_END
ferencd@0 578 ASSERT_EQ(8, VAR_INT(b));
ferencd@0 579
ferencd@0 580 SCRIPT_SHUTDOWN
ferencd@0 581 }
ferencd@0 582
ferencd@0 583 /* Define a function with a byte array as parameter. Assign a value to
ferencd@0 584 * the parameter in the function body and see that the caller does not get
ferencd@0 585 * modified */
ferencd@0 586 TEST(Functions, ByteArray)
ferencd@0 587 {
ferencd@0 588 SCRIPT_START
ferencd@0 589 " \
ferencd@0 590 void func(byte a[]) \
ferencd@0 591 { \
ferencd@0 592 a[0] = 6; \
ferencd@0 593 } \
ferencd@0 594 byte z[10]; \
ferencd@0 595 z[0] = 8; func(z); \
ferencd@0 596 byte b = z[0]; \
ferencd@0 597 "
ferencd@0 598 SCRIPT_END
ferencd@0 599 ASSERT_EQ(8, VAR_BYTE(b));
ferencd@0 600
ferencd@0 601 SCRIPT_SHUTDOWN
ferencd@0 602 }
ferencd@0 603
ferencd@0 604 /* Define a function with a byte array reference parameter. Assign a value to
ferencd@0 605 * the parameter in the function body and see that the caller does get
ferencd@0 606 * modified */
ferencd@0 607 TEST(Functions, ByteArrayReference)
ferencd@0 608 {
ferencd@0 609 SCRIPT_START
ferencd@0 610 " \
ferencd@0 611 void func(byte& a[]) \
ferencd@0 612 { \
ferencd@0 613 a[0] = 6; \
ferencd@0 614 } \
ferencd@0 615 byte z[10]; \
ferencd@0 616 z[0] = 8; func(z); \
ferencd@0 617 byte b = z[0]; \
ferencd@0 618 "
ferencd@0 619 SCRIPT_END
ferencd@0 620 ASSERT_EQ(6, VAR_BYTE(b));
ferencd@0 621
ferencd@0 622 SCRIPT_SHUTDOWN
ferencd@0 623 }
ferencd@0 624
ferencd@0 625 /* Define a function with an int array reference parameter. Assign a value to
ferencd@0 626 * the parameter in the function body and see that the caller does get
ferencd@0 627 * modified */
ferencd@0 628 TEST(Functions, IntArrayReference)
ferencd@0 629 {
ferencd@0 630 SCRIPT_START
ferencd@0 631 " \
ferencd@0 632 void func(int& a[]) \
ferencd@0 633 { \
ferencd@0 634 a[0] = 6; \
ferencd@0 635 } \
ferencd@0 636 int z[10]; \
ferencd@0 637 z[0] = 8; func(z); \
ferencd@0 638 int b = z[0]; \
ferencd@0 639 "
ferencd@0 640 SCRIPT_END
ferencd@0 641 ASSERT_EQ(6, VAR_INT(b));
ferencd@0 642
ferencd@0 643 SCRIPT_SHUTDOWN
ferencd@0 644 }
ferencd@0 645
ferencd@0 646 /* Define a function with a real array as parameter. Assign a value to
ferencd@0 647 * the parameter in the function body and see that the caller does not get
ferencd@0 648 * modified */
ferencd@0 649 TEST(Functions, RealArrayReference)
ferencd@0 650 {
ferencd@0 651 SCRIPT_START
ferencd@0 652 " \
ferencd@0 653 void func(real& a[]) \
ferencd@0 654 { \
ferencd@0 655 a[0] = 6.7; \
ferencd@0 656 } \
ferencd@0 657 real z[10]; \
ferencd@0 658 z[0] = 7.8; func(z); \
ferencd@0 659 real b = z[0]; \
ferencd@0 660 "
ferencd@0 661 SCRIPT_END
ferencd@0 662 double _b = (double)VAR_REAL(b);
ferencd@0 663 ASSERT_DOUBLE_EQ((double)6.7, _b);
ferencd@0 664 SCRIPT_SHUTDOWN
ferencd@0 665 }
ferencd@0 666
ferencd@0 667 TEST(General, FibonacciAsIntArrayReference)
ferencd@0 668 {
ferencd@0 669 SCRIPT_START
ferencd@0 670 " \
ferencd@0 671 void fibo1(int& res[], int n) \
ferencd@0 672 { \
ferencd@0 673 int first = 0, second = 1, next, c; \
ferencd@0 674 int i = 0; \
ferencd@0 675 for ( c = 0 ; c < n ; c++ ) \
ferencd@0 676 { \
ferencd@0 677 if ( c <= 1 ) \
ferencd@0 678 next = c; \
ferencd@0 679 else \
ferencd@0 680 { \
ferencd@0 681 next = first + second; \
ferencd@0 682 first = second; \
ferencd@0 683 second = next; \
ferencd@0 684 } \
ferencd@0 685 res[i++] = next; \
ferencd@0 686 } \
ferencd@0 687 } \
ferencd@0 688 \
ferencd@0 689 int cnt = 20, i; \
ferencd@0 690 \
ferencd@0 691 int fib_it[cnt]; \
ferencd@0 692 fibo1(fib_it, fib_it.len()); \
ferencd@0 693 int a = fib_it[9]; \
ferencd@0 694 "
ferencd@0 695 SCRIPT_END
ferencd@0 696 ASSERT_EQ(34, VAR_INT(a));
ferencd@0 697
ferencd@0 698 SCRIPT_SHUTDOWN
ferencd@0 699 }
ferencd@0 700
ferencd@0 701
ferencd@0 702 /*
ferencd@0 703 * Push an int, peek an int variable
ferencd@0 704 */
ferencd@0 705 TEST(PushPeek, Ints)
ferencd@0 706 {
ferencd@0 707 SCRIPT_START
ferencd@0 708 " \
ferencd@0 709 int a; \
ferencd@0 710 asm \
ferencd@0 711 { \
ferencd@0 712 push 23; \
ferencd@0 713 peek int 0 global.a; \
ferencd@0 714 } \
ferencd@0 715 "
ferencd@0 716 SCRIPT_END
ferencd@0 717 ASSERT_EQ(23, VAR_INT(a));
ferencd@0 718
ferencd@0 719 SCRIPT_SHUTDOWN
ferencd@0 720 }
ferencd@0 721
ferencd@0 722
ferencd@0 723 NAP_EXPORTS
ferencd@0 724 void external_callee(nap_int_t a, nap_int_t b)
ferencd@0 725 {
ferencd@0 726 printf("%" PRINT_d " %" PRINT_d "\n", a, b);
ferencd@0 727 if(a != 1 || b != 2) FAIL();
ferencd@0 728 }
ferencd@0 729
ferencd@0 730 TEST(FeatureTable, RegisterIntToRegisterXAndRegisterXToVariableX)
ferencd@0 731 {
ferencd@0 732 SCRIPT_START
ferencd@0 733 " \
ferencd@0 734 int iv = 1; \
ferencd@0 735 real vrv = 1.0; \
ferencd@0 736 string sv = \"1\"; \
ferencd@0 737 byte bv = 1; \
ferencd@0 738 asm \
ferencd@0 739 { \
ferencd@0 740 mov reg int 0, 5; \
ferencd@0 741 /* RI->RI */ \
ferencd@0 742 mov reg int 1, reg int 0; \
ferencd@0 743 /* RI->VI */ \
ferencd@0 744 mov global.iv, reg int 1; \
ferencd@0 745 /* RI->RR */ \
ferencd@0 746 mov reg real 0, reg int 0; \
ferencd@0 747 /* RR->VR */ \
ferencd@0 748 mov global.vrv, reg real 0; \
ferencd@0 749 /* RI->RB */ \
ferencd@0 750 mov reg byte 0, reg int 0; \
ferencd@0 751 /* RB->VB */ \
ferencd@0 752 mov global.bv, reg byte 0; \
ferencd@0 753 /* RI-> RS*/ \
ferencd@0 754 mov reg string 0, reg int 0; \
ferencd@0 755 /* RS->VS */ \
ferencd@0 756 mov global.sv, reg string 0; \
ferencd@0 757 } \
ferencd@0 758 "
ferencd@0 759 SCRIPT_END
ferencd@0 760 ASSERT_EQ(5, VAR_INT(iv));
ferencd@0 761 ASSERT_EQ(5, VAR_BYTE(bv));
ferencd@0 762
ferencd@0 763 double vrv = (double)VAR_REAL(vrv);
ferencd@0 764 ASSERT_DOUBLE_EQ((double)5.0, vrv);
ferencd@0 765
ferencd@0 766 SCRIPT_ASSERT_STREQ("5", sv);
ferencd@0 767
ferencd@0 768
ferencd@0 769 SCRIPT_SHUTDOWN
ferencd@0 770 }
ferencd@0 771
ferencd@0 772
ferencd@0 773 TEST(FeatureTable, RegisterByteToRegisterX)
ferencd@0 774 {
ferencd@0 775 SCRIPT_START
ferencd@0 776 " \
ferencd@0 777 int iv = 1; \
ferencd@0 778 real vrv = 1.0; \
ferencd@0 779 string sv = \"1\"; \
ferencd@0 780 byte bv = 1; \
ferencd@0 781 asm \
ferencd@0 782 { \
ferencd@0 783 mov reg byte 0, 5; \
ferencd@0 784 /* RB->RI */ \
ferencd@0 785 mov reg int 0, reg byte 0; \
ferencd@0 786 mov global.iv, reg int 0; \
ferencd@0 787 /* RB->RR */ \
ferencd@0 788 mov reg real 0, reg byte 0; \
ferencd@0 789 mov global.vrv, reg real 0; \
ferencd@0 790 /* RB->RB */ \
ferencd@0 791 mov reg byte 1, reg byte 0; \
ferencd@0 792 mov global.bv, reg byte 1; \
ferencd@0 793 /* RB-> RS*/ \
ferencd@0 794 mov reg string 0, reg byte 0; \
ferencd@0 795 mov global.sv, reg string 0; \
ferencd@0 796 } \
ferencd@0 797 "
ferencd@0 798 SCRIPT_END
ferencd@0 799 ASSERT_EQ(5, VAR_INT(iv));
ferencd@0 800 ASSERT_EQ(5, VAR_BYTE(bv));
ferencd@0 801
ferencd@0 802 double vrv = (double)VAR_REAL(vrv);
ferencd@0 803 ASSERT_DOUBLE_EQ((double)5.0, vrv);
ferencd@0 804
ferencd@0 805 SCRIPT_ASSERT_STREQ("5", sv);
ferencd@0 806
ferencd@0 807
ferencd@0 808 SCRIPT_SHUTDOWN
ferencd@0 809 }
ferencd@0 810
ferencd@0 811 TEST(FeatureTable, DISABLED_RegisterRealToRegisterX)
ferencd@0 812 {
ferencd@0 813 SCRIPT_START
ferencd@0 814 " \
ferencd@0 815 int iv = 1; \
ferencd@0 816 real vrv = 1.0; \
ferencd@0 817 string sv = \"1\"; \
ferencd@0 818 byte bv = 1; \
ferencd@0 819 asm \
ferencd@0 820 { \
ferencd@0 821 mov reg real 0, 5.0; \
ferencd@0 822 /* RR->RI */ \
ferencd@0 823 mov reg int 0, reg real 0; \
ferencd@0 824 mov global.iv, reg int 0; \
ferencd@0 825 /* RR->RR */ \
ferencd@0 826 mov reg real 1, reg real 0; \
ferencd@0 827 mov global.vrv, reg real 1; \
ferencd@0 828 /* RR->RB */ \
ferencd@0 829 mov reg byte 1, reg real 0; \
ferencd@0 830 mov global.bv, reg byte 1; \
ferencd@0 831 /* RR-> RS*/ \
ferencd@0 832 mov reg string 0, reg real 0; \
ferencd@0 833 mov global.sv, reg string 0; \
ferencd@0 834 } \
ferencd@0 835 "
ferencd@0 836 SCRIPT_END
ferencd@0 837 ASSERT_EQ(5, VAR_INT(iv));
ferencd@0 838 ASSERT_EQ(5, VAR_BYTE(bv));
ferencd@0 839
ferencd@0 840 double vrv = (double)VAR_REAL(vrv);
ferencd@0 841 ASSERT_DOUBLE_EQ((double)5.0, vrv);
ferencd@0 842
ferencd@0 843 SCRIPT_ASSERT_STREQ("5", sv);
ferencd@0 844
ferencd@0 845
ferencd@0 846 SCRIPT_SHUTDOWN
ferencd@0 847 }