ferencd@0: #include "tests.h" ferencd@0: #include "nbci.h" ferencd@0: #include "gtest/gtest.h" ferencd@0: ferencd@0: #include "compiler.h" ferencd@0: #include "nap_runtime.h" ferencd@0: ferencd@0: TEST(Simple, Printing) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: print(\"Hello World\n\"); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: (void)found_indicator; ferencd@0: ferencd@0: } ferencd@0: ferencd@0: TEST(Assembly, PushPop) ferencd@0: { ferencd@0: nap_runtime* runtime = nap_runtime_create("$"); ferencd@0: ASSERT_FALSE(runtime == NULL); ferencd@0: int found_indicator; ferencd@0: nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime, ferencd@0: " \ ferencd@0: int a; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: push 23; \ ferencd@0: pop global.a; \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(23, VAR_INT(a)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Definitions, CodeBlocksWithScope) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a = 1; \ ferencd@0: { int c = 3;int a = 2;} \ ferencd@0: int b = 2; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_TRUE( 1 == VAR_INT(a)); ferencd@0: ASSERT_TRUE( 2 == VAR_INT(b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Floats, BasicRealOperations) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: real a = 5.6; \ ferencd@0: real b = a * 10; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: double _b = (double)VAR_REAL(b); ferencd@0: ASSERT_DOUBLE_EQ((double)56.0, _b); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, UnaryMathOperations) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a = 5; \ ferencd@0: int b = -5; \ ferencd@0: int c = +b; \ ferencd@0: int d = -a; \ ferencd@0: int e = 3 - (-2); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(5, VAR_INT(c)); ferencd@0: ASSERT_EQ(-5, VAR_INT(d)); ferencd@0: ASSERT_EQ(5, VAR_INT(e)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, BasicIntVariableOperations) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a; \ ferencd@0: int b; \ ferencd@0: int a_plus_b; \ ferencd@0: int a_minus_b; \ ferencd@0: int a_mul_b; \ ferencd@0: int a_div_b; \ ferencd@0: int a_mod_b; \ ferencd@0: a = 9; \ ferencd@0: b = 3; \ ferencd@0: a_plus_b = a + b; \ ferencd@0: a_minus_b = a - b; \ ferencd@0: a_mul_b = a * b; \ ferencd@0: a_div_b = a / b; \ ferencd@0: a_mod_b = a % b; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_TRUE( 9 == VAR_INT(a)); ferencd@0: ASSERT_TRUE( 3 == VAR_INT(b)); ferencd@0: ASSERT_TRUE(12 == VAR_INT(a_plus_b)); ferencd@0: ASSERT_TRUE( 6 == VAR_INT(a_minus_b)); ferencd@0: ASSERT_TRUE( 3 == VAR_INT(a_div_b)); ferencd@0: ASSERT_TRUE(27 == VAR_INT(a_mul_b)); ferencd@0: ASSERT_TRUE( 0 == VAR_INT(a_mod_b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, BasicBitwiseOperations) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a1 = 1; \ ferencd@0: int a2 = 2; \ ferencd@0: int a3 = 3; \ ferencd@0: int a4 = 1; \ ferencd@0: int a5 = 2; \ ferencd@0: int a6 = 2; \ ferencd@0: int b1 = a1 << 1; \ ferencd@0: int b2 = a2 >> 1; \ ferencd@0: int b3 = a3 & 1; \ ferencd@0: int b4 = a4 | 2; \ ferencd@0: int b5 = a5 ^ 1; \ ferencd@0: int b6 = ~a6; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_TRUE( 2 == VAR_INT(b1)); ferencd@0: ASSERT_TRUE( 1 == VAR_INT(b2)); ferencd@0: ASSERT_TRUE( 1 == VAR_INT(b3)); ferencd@0: ASSERT_TRUE( 3 == VAR_INT(b4)); ferencd@0: ASSERT_TRUE( 3 == VAR_INT(b5)); ferencd@0: ASSERT_TRUE(-3 == VAR_INT(b6)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: ferencd@0: TEST(Operations, BasicStringVariableOperations1) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: string a = \"AA\"; \ ferencd@0: string b = \"BB\"; \ ferencd@0: string a_plus_b; \ ferencd@0: a_plus_b = a + b; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("AABB", a_plus_b); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, BasicStringVariableOperations2) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: string a = \"A\"; \ ferencd@0: string b = a + \"B\"; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("AB", b); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, BasicStringVariableOperations4) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: string sa = \"A\"; \ ferencd@0: string sb ; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg string(0), global.sa \ ferencd@0: mov reg string(1), \"B\" \ ferencd@0: add reg string(0), reg string(1) \ ferencd@0: mov global.sb, reg string(0) \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("AB", sb); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a string variable, copy out one character from it into an int register ferencd@0: see that the conversion succeeded.*/ ferencd@0: TEST(Operations, BasicStringVariableOperations5) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: string sa = \"A123B\"; \ ferencd@0: int ib = 9; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg idx(0), 1 \ ferencd@0: mov reg int(0), @#ccidx(global.sa, 1)\ ferencd@0: mov global.ib, reg int (0) \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(1, VAR_INT(ib)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a string variable, copy out a substring from it into an int register ferencd@0: see that the conversion succeeded.*/ ferencd@0: TEST(Operations, BasicStringVariableOperations6) ferencd@0: { ferencd@0: ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: string sa = \"A123B\"; \ ferencd@0: int ib = 9; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg idx(0), 1 \ ferencd@0: mov reg idx(1), 3 \ ferencd@0: mov reg int(0), @#ccidx(global.sa, 2)\ ferencd@0: mov global.ib, reg int (0) \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(123, VAR_INT(ib)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: ferencd@0: TEST(Operations, BasicImmediateOperations) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a_plus_b; \ ferencd@0: int a_minus_b; \ ferencd@0: int a_mul_b; \ ferencd@0: int a_div_b; \ ferencd@0: int a_mod_b; \ ferencd@0: a_plus_b = 9 + 3; \ ferencd@0: a_minus_b = 9 - 3; \ ferencd@0: a_mul_b = 9 * 3; \ ferencd@0: a_div_b = 9 / 3; \ ferencd@0: a_mod_b = 9 % 3; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_TRUE(12 == VAR_INT(a_plus_b)); ferencd@0: ASSERT_TRUE( 6 == VAR_INT(a_minus_b)); ferencd@0: ASSERT_TRUE( 3 == VAR_INT(a_div_b)); ferencd@0: ASSERT_TRUE(27 == VAR_INT(a_mul_b)); ferencd@0: ASSERT_TRUE( 0 == VAR_INT(a_mod_b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Definitions, InvalidVariableName) ferencd@0: { ferencd@0: nap_runtime* runtime = nap_runtime_create(0); ferencd@0: ASSERT_TRUE(runtime != NULL); ferencd@0: nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime, ferencd@0: " \ ferencd@0: int a_ plus_b; \ ferencd@0: " ferencd@0: ,0); ferencd@0: ferencd@0: ASSERT_TRUE(bytecode == NULL); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(StringToIntConversion, DifferentBases) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int binary = 0; \ ferencd@0: int decimal = 0; \ ferencd@0: int zero = 1; \ ferencd@0: int hexa = 0; \ ferencd@0: int octal = 0; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg string 0, \"9877\" \ ferencd@0: mov reg int 0, reg string 0 \ ferencd@0: mov global.decimal, reg int 0 \ ferencd@0: mov reg string 0, \"0xABCDE\" \ ferencd@0: mov reg int 0, reg string 0 \ ferencd@0: mov global.hexa, reg int 0 \ ferencd@0: mov reg string 0, \"0665544\" \ ferencd@0: mov reg int 0, reg string 0 \ ferencd@0: mov global.octal, reg int 0 \ ferencd@0: mov reg string 0, \"0b1001001\" \ ferencd@0: mov reg int 0, reg string 0 \ ferencd@0: mov global.binary, reg int 0 \ ferencd@0: mov reg string 0, \"0\" \ ferencd@0: mov reg int 0, reg string 0 \ ferencd@0: mov global.zero, reg int 0 \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_TRUE(9877 == VAR_INT(decimal)); ferencd@0: ASSERT_TRUE(703710 == VAR_INT(hexa)); ferencd@0: ASSERT_TRUE(224100 == VAR_INT(octal)); ferencd@0: ASSERT_TRUE(73 == VAR_INT(binary)); ferencd@0: ASSERT_TRUE(0 == VAR_INT(zero)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Operations, PostPreIncrement) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int i=0; \ ferencd@0: int y = i++; \ ferencd@0: int z = ++i; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_TRUE(2 == VAR_INT(i)); ferencd@0: ASSERT_TRUE(0 == VAR_INT(y)); ferencd@0: ASSERT_TRUE(2 == VAR_INT(z)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(Keywords, Break) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int y = 1; \ ferencd@0: for(int i = 0; i< 11; i++) \ ferencd@0: { \ ferencd@0: int t = y ++; \ ferencd@0: if (t == 7) \ ferencd@0: { \ ferencd@0: break; \ ferencd@0: } \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(8, VAR_INT(y)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(InvalidSyntax, PostPreIncMess) ferencd@0: { ferencd@0: ferencd@0: nap_runtime* runtime = nap_runtime_create(0); ferencd@0: ASSERT_TRUE(runtime != NULL); ferencd@0: nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime, ferencd@0: " \ ferencd@0: int z = 3; \ ferencd@0: int g = z++ ++; \ ferencd@0: " ferencd@0: ,0); ferencd@0: ferencd@0: ASSERT_TRUE(bytecode == NULL); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(RuntimeCompilation, SimpleCheck) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a = 2; \ ferencd@0: int b = 3; \ ferencd@0: int c; \ ferencd@0: nap_execute(\"c = a + b\"); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(5, VAR_INT(c)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(RuntimeCompilation, CompoundedExpression) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a = 2; \ ferencd@0: int b = 3; \ ferencd@0: int c; \ ferencd@0: string sa = \"c=a\"; \ ferencd@0: string sb = \"+b\"; \ ferencd@0: nap_execute(sa + sb); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(5, VAR_INT(c)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* ferencd@0: * TESTS FOR FUNCTIONS AND THEIR ASSOCIATED BEHAVIOUR ferencd@0: */ ferencd@0: ferencd@0: /* Define a function returning an in which takes in an int parameter. Return the ferencd@0: next value of the parameter (ie: par + 1). Check in the calling code the ferencd@0: value. */ ferencd@0: TEST(Functions, SimpleFunctionCall) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int func(int a) \ ferencd@0: { \ ferencd@0: return a + 1; \ ferencd@0: } \ ferencd@0: int a = 5; \ ferencd@0: a = func(a); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ferencd@0: ASSERT_EQ(6, VAR_INT(a)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN; ferencd@0: } ferencd@0: ferencd@0: /* Define a function returning and int. Do not put return statements in the body. ferencd@0: * Use the function, see that it returns the default return value (0). ferencd@0: */ ferencd@0: TEST(Functions, DefaultReturnValue) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int func() \ ferencd@0: { \ ferencd@0: } \ ferencd@0: int z = func(); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(0, VAR_INT(z)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define an external function, also implement it in the test file. ferencd@0: * Use the function, see that it does not fail. ferencd@0: */ ferencd@0: TEST(Functions, ExternalCalling) ferencd@0: { ferencd@0: nap_runtime* runtime = nap_runtime_create("a"); ferencd@0: ASSERT_FALSE(runtime == NULL); ferencd@0: ferencd@0: int found_indicator; ferencd@0: nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime, " \ ferencd@0: extern void external_callee(int, int); \ ferencd@0: external_callee(1,2); \ ferencd@0: " ferencd@0: ,0); ferencd@0: ASSERT_FALSE(bytecode == NULL); ferencd@0: nap_runtime_execute(runtime, bytecode); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: ferencd@0: UNUSED(found_indicator); ferencd@0: } ferencd@0: ferencd@0: /* Define a function with an int reference as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller gets modified */ ferencd@0: TEST(Functions, IntReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(int& a) \ ferencd@0: { \ ferencd@0: a = 6; \ ferencd@0: } \ ferencd@0: int z = 7; func(z); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(6, VAR_INT(z)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with an byte reference as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller gets modified */ ferencd@0: TEST(Functions, ByteReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(byte& a) \ ferencd@0: { \ ferencd@0: a = 6; \ ferencd@0: } \ ferencd@0: byte z = 7; func(z); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(6, VAR_BYTE(z)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with an real reference as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller gets modified */ ferencd@0: TEST(Functions, RealReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(real& a) \ ferencd@0: { \ ferencd@0: a = 6.7; \ ferencd@0: } \ ferencd@0: real z = 7.8; func(z); \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: double _z = (double)VAR_REAL(z); ferencd@0: ASSERT_DOUBLE_EQ((double)6.7, _z); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with a real array as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does not get ferencd@0: * modified */ ferencd@0: TEST(Functions, RealArray) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(real a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6.7; \ ferencd@0: } \ ferencd@0: real z[10]; \ ferencd@0: z[0] = 7.8; func(z); \ ferencd@0: real b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: double _b = (double)VAR_REAL(b); ferencd@0: ASSERT_DOUBLE_EQ((double)7.8, _b); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with an int array as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does not get ferencd@0: * modified */ ferencd@0: TEST(Functions, IntArray) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(int a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6; \ ferencd@0: } \ ferencd@0: int z[10]; \ ferencd@0: z[0] = 8; func(z); \ ferencd@0: int b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(8, VAR_INT(b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with a byte array as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does not get ferencd@0: * modified */ ferencd@0: TEST(Functions, ByteArray) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(byte a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6; \ ferencd@0: } \ ferencd@0: byte z[10]; \ ferencd@0: z[0] = 8; func(z); \ ferencd@0: byte b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(8, VAR_BYTE(b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with a byte array reference parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does get ferencd@0: * modified */ ferencd@0: TEST(Functions, ByteArrayReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(byte& a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6; \ ferencd@0: } \ ferencd@0: byte z[10]; \ ferencd@0: z[0] = 8; func(z); \ ferencd@0: byte b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(6, VAR_BYTE(b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with an int array reference parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does get ferencd@0: * modified */ ferencd@0: TEST(Functions, IntArrayReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(int& a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6; \ ferencd@0: } \ ferencd@0: int z[10]; \ ferencd@0: z[0] = 8; func(z); \ ferencd@0: int b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(6, VAR_INT(b)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: /* Define a function with a real array as parameter. Assign a value to ferencd@0: * the parameter in the function body and see that the caller does not get ferencd@0: * modified */ ferencd@0: TEST(Functions, RealArrayReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void func(real& a[]) \ ferencd@0: { \ ferencd@0: a[0] = 6.7; \ ferencd@0: } \ ferencd@0: real z[10]; \ ferencd@0: z[0] = 7.8; func(z); \ ferencd@0: real b = z[0]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: double _b = (double)VAR_REAL(b); ferencd@0: ASSERT_DOUBLE_EQ((double)6.7, _b); ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(General, FibonacciAsIntArrayReference) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: void fibo1(int& res[], int n) \ ferencd@0: { \ ferencd@0: int first = 0, second = 1, next, c; \ ferencd@0: int i = 0; \ ferencd@0: for ( c = 0 ; c < n ; c++ ) \ ferencd@0: { \ ferencd@0: if ( c <= 1 ) \ ferencd@0: next = c; \ ferencd@0: else \ ferencd@0: { \ ferencd@0: next = first + second; \ ferencd@0: first = second; \ ferencd@0: second = next; \ ferencd@0: } \ ferencd@0: res[i++] = next; \ ferencd@0: } \ ferencd@0: } \ ferencd@0: \ ferencd@0: int cnt = 20, i; \ ferencd@0: \ ferencd@0: int fib_it[cnt]; \ ferencd@0: fibo1(fib_it, fib_it.len()); \ ferencd@0: int a = fib_it[9]; \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(34, VAR_INT(a)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: ferencd@0: /* ferencd@0: * Push an int, peek an int variable ferencd@0: */ ferencd@0: TEST(PushPeek, Ints) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int a; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: push 23; \ ferencd@0: peek int 0 global.a; \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(23, VAR_INT(a)); ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: ferencd@0: NAP_EXPORTS ferencd@0: void external_callee(nap_int_t a, nap_int_t b) ferencd@0: { ferencd@0: printf("%" PRINT_d " %" PRINT_d "\n", a, b); ferencd@0: if(a != 1 || b != 2) FAIL(); ferencd@0: } ferencd@0: ferencd@0: TEST(FeatureTable, RegisterIntToRegisterXAndRegisterXToVariableX) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int iv = 1; \ ferencd@0: real vrv = 1.0; \ ferencd@0: string sv = \"1\"; \ ferencd@0: byte bv = 1; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg int 0, 5; \ ferencd@0: /* RI->RI */ \ ferencd@0: mov reg int 1, reg int 0; \ ferencd@0: /* RI->VI */ \ ferencd@0: mov global.iv, reg int 1; \ ferencd@0: /* RI->RR */ \ ferencd@0: mov reg real 0, reg int 0; \ ferencd@0: /* RR->VR */ \ ferencd@0: mov global.vrv, reg real 0; \ ferencd@0: /* RI->RB */ \ ferencd@0: mov reg byte 0, reg int 0; \ ferencd@0: /* RB->VB */ \ ferencd@0: mov global.bv, reg byte 0; \ ferencd@0: /* RI-> RS*/ \ ferencd@0: mov reg string 0, reg int 0; \ ferencd@0: /* RS->VS */ \ ferencd@0: mov global.sv, reg string 0; \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(5, VAR_INT(iv)); ferencd@0: ASSERT_EQ(5, VAR_BYTE(bv)); ferencd@0: ferencd@0: double vrv = (double)VAR_REAL(vrv); ferencd@0: ASSERT_DOUBLE_EQ((double)5.0, vrv); ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("5", sv); ferencd@0: ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: ferencd@0: TEST(FeatureTable, RegisterByteToRegisterX) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int iv = 1; \ ferencd@0: real vrv = 1.0; \ ferencd@0: string sv = \"1\"; \ ferencd@0: byte bv = 1; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg byte 0, 5; \ ferencd@0: /* RB->RI */ \ ferencd@0: mov reg int 0, reg byte 0; \ ferencd@0: mov global.iv, reg int 0; \ ferencd@0: /* RB->RR */ \ ferencd@0: mov reg real 0, reg byte 0; \ ferencd@0: mov global.vrv, reg real 0; \ ferencd@0: /* RB->RB */ \ ferencd@0: mov reg byte 1, reg byte 0; \ ferencd@0: mov global.bv, reg byte 1; \ ferencd@0: /* RB-> RS*/ \ ferencd@0: mov reg string 0, reg byte 0; \ ferencd@0: mov global.sv, reg string 0; \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(5, VAR_INT(iv)); ferencd@0: ASSERT_EQ(5, VAR_BYTE(bv)); ferencd@0: ferencd@0: double vrv = (double)VAR_REAL(vrv); ferencd@0: ASSERT_DOUBLE_EQ((double)5.0, vrv); ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("5", sv); ferencd@0: ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: } ferencd@0: ferencd@0: TEST(FeatureTable, DISABLED_RegisterRealToRegisterX) ferencd@0: { ferencd@0: SCRIPT_START ferencd@0: " \ ferencd@0: int iv = 1; \ ferencd@0: real vrv = 1.0; \ ferencd@0: string sv = \"1\"; \ ferencd@0: byte bv = 1; \ ferencd@0: asm \ ferencd@0: { \ ferencd@0: mov reg real 0, 5.0; \ ferencd@0: /* RR->RI */ \ ferencd@0: mov reg int 0, reg real 0; \ ferencd@0: mov global.iv, reg int 0; \ ferencd@0: /* RR->RR */ \ ferencd@0: mov reg real 1, reg real 0; \ ferencd@0: mov global.vrv, reg real 1; \ ferencd@0: /* RR->RB */ \ ferencd@0: mov reg byte 1, reg real 0; \ ferencd@0: mov global.bv, reg byte 1; \ ferencd@0: /* RR-> RS*/ \ ferencd@0: mov reg string 0, reg real 0; \ ferencd@0: mov global.sv, reg string 0; \ ferencd@0: } \ ferencd@0: " ferencd@0: SCRIPT_END ferencd@0: ASSERT_EQ(5, VAR_INT(iv)); ferencd@0: ASSERT_EQ(5, VAR_BYTE(bv)); ferencd@0: ferencd@0: double vrv = (double)VAR_REAL(vrv); ferencd@0: ASSERT_DOUBLE_EQ((double)5.0, vrv); ferencd@0: ferencd@0: SCRIPT_ASSERT_STREQ("5", sv); ferencd@0: ferencd@0: ferencd@0: SCRIPT_SHUTDOWN ferencd@0: }