|
ferencd@0
|
1 #include "tests.h"
|
|
ferencd@0
|
2 #include "gtest/gtest.h"
|
|
ferencd@0
|
3
|
|
ferencd@0
|
4 /*
|
|
ferencd@0
|
5 * This file has the tests that are related to code execution in a
|
|
ferencd@0
|
6 * virtual machine as triggered by the "outsisde" world (ie: C runtime)
|
|
ferencd@0
|
7 */
|
|
ferencd@0
|
8
|
|
ferencd@0
|
9 /* Have some code in a VM.
|
|
ferencd@0
|
10 * Execute some other code in the VM.
|
|
ferencd@0
|
11 */
|
|
ferencd@0
|
12 TEST(CodeExecution, ExecuteSomeCodeInAVm)
|
|
ferencd@0
|
13 {
|
|
ferencd@0
|
14 nap_runtime* runtime = nap_runtime_create(0);
|
|
ferencd@0
|
15 int found_indicator = 0;
|
|
ferencd@0
|
16
|
|
ferencd@0
|
17 ASSERT_FALSE(runtime == NULL);
|
|
ferencd@0
|
18
|
|
ferencd@0
|
19 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
|
|
ferencd@0
|
20 "int c = 0; \
|
|
ferencd@0
|
21 int a = 1; \
|
|
ferencd@0
|
22 int b = 2; \
|
|
ferencd@0
|
23 "
|
|
ferencd@0
|
24 ,0);
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26 ASSERT_FALSE(bytecode == NULL);
|
|
ferencd@0
|
27 nap_runtime_execute(runtime, bytecode);
|
|
ferencd@0
|
28 nap_execute_code(runtime, "c = a + b");
|
|
ferencd@0
|
29 ASSERT_EQ(3, VAR_INT(c));
|
|
ferencd@0
|
30
|
|
ferencd@0
|
31 nap_runtime_shutdown(&runtime);
|
|
ferencd@0
|
32 ASSERT_TRUE(runtime == NULL);
|
|
ferencd@0
|
33 }
|
|
ferencd@0
|
34
|
|
ferencd@0
|
35
|
|
ferencd@0
|
36 /* Define a function. Call it via the runtime API
|
|
ferencd@0
|
37 * Use the function, see that it returns the default return value (0).
|
|
ferencd@0
|
38 */
|
|
ferencd@0
|
39 TEST(CodeExecution, ExternalCallingOfInternalMethod)
|
|
ferencd@0
|
40 {
|
|
ferencd@0
|
41 nap_runtime* runtime = nap_runtime_create(0);
|
|
ferencd@0
|
42 int found_indicator = 0;
|
|
ferencd@0
|
43
|
|
ferencd@0
|
44 ASSERT_FALSE(runtime == NULL);
|
|
ferencd@0
|
45
|
|
ferencd@0
|
46 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
|
|
ferencd@0
|
47 "int c = 0; \
|
|
ferencd@0
|
48 int some_fun(int a , int b) \
|
|
ferencd@0
|
49 { \
|
|
ferencd@0
|
50 c = a + b; \
|
|
ferencd@0
|
51 }" ,0);
|
|
ferencd@0
|
52
|
|
ferencd@0
|
53 ASSERT_FALSE(bytecode == NULL);
|
|
ferencd@0
|
54 nap_runtime_execute(runtime, bytecode);
|
|
ferencd@0
|
55 nap_int_t p1 = 1;
|
|
ferencd@0
|
56 nap_int_t p2 = 2;
|
|
ferencd@0
|
57 nap_execute_method(runtime, 0, "some_fun", p1, p2);
|
|
ferencd@0
|
58 ASSERT_EQ(3, VAR_INT(c));
|
|
ferencd@0
|
59
|
|
ferencd@0
|
60 nap_runtime_shutdown(&runtime);
|
|
ferencd@0
|
61 ASSERT_TRUE(runtime == NULL);
|
|
ferencd@0
|
62 }
|
|
ferencd@0
|
63
|
|
ferencd@0
|
64
|
|
ferencd@0
|
65 /* Define a function. Call it via the runtime API
|
|
ferencd@0
|
66 * Use the function, see that it returns the default return value (0).
|
|
ferencd@0
|
67 */
|
|
ferencd@0
|
68 TEST(CodeExecution, ExternalCallingOfInternalMethodWithIntReturnType)
|
|
ferencd@0
|
69 {
|
|
ferencd@0
|
70 nap_runtime* runtime = nap_runtime_create(0);
|
|
ferencd@0
|
71 int found_indicator = 0;
|
|
ferencd@0
|
72
|
|
ferencd@0
|
73 ASSERT_FALSE(runtime == NULL);
|
|
ferencd@0
|
74
|
|
ferencd@0
|
75 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
|
|
ferencd@0
|
76 "int c = 0; \
|
|
ferencd@0
|
77 int some_fun(int a , int b) \
|
|
ferencd@0
|
78 { \
|
|
ferencd@0
|
79 c = a + b; \
|
|
ferencd@0
|
80 return c; \
|
|
ferencd@0
|
81 }" ,0);
|
|
ferencd@0
|
82
|
|
ferencd@0
|
83 ASSERT_FALSE(bytecode == NULL);
|
|
ferencd@0
|
84 nap_runtime_execute(runtime, bytecode);
|
|
ferencd@0
|
85 nap_int_t p1 = 1;
|
|
ferencd@0
|
86 nap_int_t p2 = 2;
|
|
ferencd@0
|
87 nap_int_t ret = 0;
|
|
ferencd@0
|
88 nap_execute_method(runtime, &ret, "some_fun", p1, p2);
|
|
ferencd@0
|
89 ASSERT_EQ(3, VAR_INT(c));
|
|
ferencd@0
|
90 ASSERT_EQ(3, ret);
|
|
ferencd@0
|
91
|
|
ferencd@0
|
92 nap_runtime_shutdown(&runtime);
|
|
ferencd@0
|
93 ASSERT_TRUE(runtime == NULL);
|
|
ferencd@0
|
94 }
|
|
ferencd@0
|
95
|
|
ferencd@0
|
96 /* Define a function. Call it via the runtime API
|
|
ferencd@0
|
97 * Use the function, see that it returns the default return value (0).
|
|
ferencd@0
|
98 */
|
|
ferencd@0
|
99 TEST(CodeExecution, ExternalCallingOfInternalMethodWithStringReturnType)
|
|
ferencd@0
|
100 {
|
|
ferencd@0
|
101 nap_runtime* runtime = nap_runtime_create(0);
|
|
ferencd@0
|
102 int found_indicator = 0;
|
|
ferencd@0
|
103
|
|
ferencd@0
|
104 ASSERT_FALSE(runtime == NULL);
|
|
ferencd@0
|
105
|
|
ferencd@0
|
106 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
|
|
ferencd@0
|
107 "string c = \"ABC\"; \
|
|
ferencd@0
|
108 string some_fun(string a, string b) \
|
|
ferencd@0
|
109 { \
|
|
ferencd@0
|
110 c = a + b; \
|
|
ferencd@0
|
111 return c; \
|
|
ferencd@0
|
112 }" ,0);
|
|
ferencd@0
|
113
|
|
ferencd@0
|
114 ASSERT_FALSE(bytecode == NULL);
|
|
ferencd@0
|
115 nap_runtime_execute(runtime, bytecode);
|
|
ferencd@0
|
116 nap_string_t p1 = (nap_string_t)"DEF";
|
|
ferencd@0
|
117 nap_string_t p2 = (nap_string_t)"GHI";
|
|
ferencd@0
|
118 nap_string_t ret = 0;
|
|
ferencd@0
|
119 nap_execute_method(runtime, &ret, "some_fun", p1, p2);
|
|
ferencd@0
|
120 char *c = VAR_STRING(c);
|
|
ferencd@0
|
121 ASSERT_STREQ("DEFGHI", c);
|
|
ferencd@0
|
122 ASSERT_STREQ("DEFGHI", ret);
|
|
ferencd@0
|
123 free(ret);
|
|
ferencd@0
|
124 free(c);
|
|
ferencd@0
|
125
|
|
ferencd@0
|
126 nap_runtime_shutdown(&runtime);
|
|
ferencd@0
|
127 ASSERT_TRUE(runtime == NULL);
|
|
ferencd@0
|
128 }
|