|
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 }
|