VM-test.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. #include "gtest/gtest.h"
  2. extern "C" {
  3. #include "BaseObj.h"
  4. #include "PikaMain.h"
  5. #include "PikaMath_Operator.h"
  6. #include "PikaParser.h"
  7. #include "PikaStdLib_SysObj.h"
  8. #include "PikaVM.h"
  9. #include "dataMemory.h"
  10. #include "dataQueue.h"
  11. #include "dataStrs.h"
  12. #include "pika_config_gtest.h"
  13. extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
  14. /* test head */
  15. VMParameters* pikaVM_runAsmWithPars(PikaObj* self,
  16. VMParameters* locals,
  17. VMParameters* globals,
  18. char* pikaAsm);
  19. char* Parser_LineToAsm(Args* buffs, char* line, Stack* blockStack);
  20. char* Parser_multiLineToAsm(Args* outBuffs, char* multiLine);
  21. int32_t __clearInvokeQueues(VMParameters* locals);
  22. int32_t pikaVM_runAsmLine(PikaObj* self,
  23. VMParameters* locals,
  24. VMParameters* globals,
  25. char* pikaAsm,
  26. int32_t lineAddr);
  27. }
  28. TEST(VM, num1) {
  29. char* line = (char*)"1";
  30. Args* buffs = New_strBuff();
  31. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  32. printf("%s", pikaAsm);
  33. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  34. pikaVM_runAsm(self, pikaAsm);
  35. obj_deinit(self);
  36. args_deinit(buffs);
  37. EXPECT_EQ(pikaMemNow(), 0);
  38. }
  39. TEST(VM, a_1) {
  40. char* line = (char*)"a = 1";
  41. Args* buffs = New_strBuff();
  42. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  43. printf("%s", pikaAsm);
  44. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  45. pikaVM_runAsm(self, pikaAsm);
  46. ASSERT_EQ(args_getInt(self->list, (char*)"a"), 1);
  47. obj_deinit(self);
  48. args_deinit(buffs);
  49. EXPECT_EQ(pikaMemNow(), 0);
  50. }
  51. TEST(VM, a_1d1) {
  52. char* line = (char*)"a = 1.1";
  53. Args* buffs = New_strBuff();
  54. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  55. printf("%s", pikaAsm);
  56. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  57. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  58. ASSERT_FLOAT_EQ(args_getFloat(globals->list, (char*)"a"), 1.1);
  59. obj_deinit(self);
  60. // obj_deinit(globals);
  61. args_deinit(buffs);
  62. EXPECT_EQ(pikaMemNow(), 0);
  63. }
  64. TEST(VM, str_xy) {
  65. char* line = (char*)"a = 'xy'";
  66. Args* buffs = New_strBuff();
  67. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  68. printf("%s", pikaAsm);
  69. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  70. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  71. ASSERT_STREQ(args_getStr(globals->list, (char*)"a"), (char*)"xy");
  72. obj_deinit(self);
  73. // obj_deinit(globals);
  74. args_deinit(buffs);
  75. EXPECT_EQ(pikaMemNow(), 0);
  76. }
  77. TEST(VM, str_xy_space) {
  78. char* line = (char*)"a = 'xy '";
  79. Args* buffs = New_strBuff();
  80. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  81. printf("%s", pikaAsm);
  82. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  83. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  84. ASSERT_STREQ(args_getStr(globals->list, (char*)"a"), (char*)"xy ");
  85. obj_deinit(self);
  86. args_deinit(buffs);
  87. // obj_deinit(globals);
  88. EXPECT_EQ(pikaMemNow(), 0);
  89. }
  90. TEST(VM, ref_a_b) {
  91. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  92. Args* buffs = New_strBuff();
  93. VMParameters* globals =
  94. pikaVM_runAsm(self, Parser_LineToAsm(buffs, (char*)"a = 'xy '", NULL));
  95. globals = pikaVM_runAsmWithPars(
  96. self, globals, globals, Parser_LineToAsm(buffs, (char*)"b = a", NULL));
  97. args_deinit(buffs);
  98. ASSERT_STREQ(args_getStr(globals->list, (char*)"b"), (char*)"xy ");
  99. obj_deinit(self);
  100. // obj_deinit(globals);
  101. EXPECT_EQ(pikaMemNow(), 0);
  102. }
  103. TEST(VM, Run_add) {
  104. PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
  105. Args* buffs = New_strBuff();
  106. VMParameters* globals = pikaVM_runAsm(
  107. self, Parser_LineToAsm(buffs, (char*)"a = plusInt(1,2)", NULL));
  108. args_deinit(buffs);
  109. int a = args_getInt(globals->list, (char*)"a");
  110. ASSERT_EQ(a, 3);
  111. obj_deinit(self);
  112. // obj_deinit(globals);
  113. EXPECT_EQ(pikaMemNow(), 0);
  114. }
  115. TEST(VM, Run_add_multy) {
  116. PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
  117. Args* buffs = New_strBuff();
  118. VMParameters* globals =
  119. pikaVM_runAsm(self, Parser_LineToAsm(buffs, (char*)"b = 2", NULL));
  120. globals = pikaVM_runAsmWithPars(
  121. self, globals, globals,
  122. Parser_LineToAsm(buffs, (char*)"a = plusInt(1,b)", NULL));
  123. args_deinit(buffs);
  124. int a = args_getInt(globals->list, (char*)"a");
  125. ASSERT_EQ(a, 3);
  126. obj_deinit(self);
  127. // obj_deinit(globals);
  128. EXPECT_EQ(pikaMemNow(), 0);
  129. }
  130. TEST(VM, Run_add_1_2_3) {
  131. PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
  132. Args* buffs = New_strBuff();
  133. VMParameters* globals = pikaVM_runAsm(
  134. self,
  135. Parser_LineToAsm(buffs, (char*)"a = plusInt(1, plusInt(2,3) )", NULL));
  136. args_deinit(buffs);
  137. int a = args_getInt(globals->list, (char*)"a");
  138. ASSERT_EQ(a, 6);
  139. obj_deinit(self);
  140. // obj_deinit(globals);
  141. EXPECT_EQ(pikaMemNow(), 0);
  142. }
  143. TEST(VM, JEZ) {
  144. char* pikaAsm = (char*)
  145. "B0\n"
  146. "0 REF False\n"
  147. "0 JEZ 2\n"
  148. "B0\n"
  149. "B0\n";
  150. PikaObj* self = New_TinyObj(NULL);
  151. int lineAddr = 0;
  152. Args* sysRes = New_args(NULL);
  153. args_setErrorCode(sysRes, 0);
  154. args_setSysOut(sysRes, (char*)"");
  155. VMParameters* globals = self;
  156. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  157. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  158. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  159. __clearInvokeQueues(globals);
  160. obj_deinit(self);
  161. args_deinit(sysRes);
  162. // obj_deinit(globals);
  163. EXPECT_EQ(lineAddr, 26);
  164. EXPECT_EQ(pikaMemNow(), 0);
  165. }
  166. TEST(VM, JMP) {
  167. char* pikaAsm = (char*)
  168. "B0\n"
  169. "0 JMP 2\n"
  170. "B0\n"
  171. "B0\n";
  172. PikaObj* self = New_TinyObj(NULL);
  173. int lineAddr = 0;
  174. Args* sysRes = New_args(NULL);
  175. args_setErrorCode(sysRes, 0);
  176. args_setSysOut(sysRes, (char*)"");
  177. VMParameters* globals = self;
  178. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  179. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  180. __clearInvokeQueues(globals);
  181. obj_deinit(self);
  182. args_deinit(sysRes);
  183. // obj_deinit(globals);
  184. EXPECT_EQ(lineAddr, 14);
  185. EXPECT_EQ(pikaMemNow(), 0);
  186. }
  187. TEST(VM, JMP_back1) {
  188. char* pikaAsm = (char*)
  189. "B0\n"
  190. "B0\n"
  191. "0 JMP -1\n"
  192. "B0\n"
  193. "B0\n";
  194. PikaObj* self = New_TinyObj(NULL);
  195. int lineAddr = 0;
  196. Args* sysRes = New_args(NULL);
  197. args_setErrorCode(sysRes, 0);
  198. args_setSysOut(sysRes, (char*)"");
  199. VMParameters* globals = self;
  200. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  201. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  202. lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
  203. __clearInvokeQueues(globals);
  204. obj_deinit(self);
  205. args_deinit(sysRes);
  206. // obj_deinit(globals);
  207. EXPECT_EQ(lineAddr, 0);
  208. EXPECT_EQ(pikaMemNow(), 0);
  209. }
  210. extern PikaMemInfo pikaMemInfo;
  211. TEST(VM, WHILE) {
  212. pikaMemInfo.heapUsedMax = 0;
  213. Args* buffs = New_strBuff();
  214. char* lines =(char *)
  215. "a = 1\n"
  216. "b = 0\n"
  217. "while a:\n"
  218. " b = 1\n"
  219. " a = 0\n"
  220. "\n";
  221. printf("%s", lines);
  222. char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
  223. printf("%s", pikaAsm);
  224. pikaMemInfo.heapUsedMax = 0;
  225. PikaObj* self = New_TinyObj(NULL);
  226. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  227. EXPECT_EQ(args_getInt(globals->list, (char*)"a"), 0);
  228. EXPECT_EQ(args_getInt(globals->list, (char*)"b"), 1);
  229. // obj_deinit(globals);
  230. args_deinit(buffs);
  231. obj_deinit(self);
  232. EXPECT_EQ(pikaMemNow(), 0);
  233. }
  234. TEST(VM, a_1_1) {
  235. char* line = (char*)"a = 1 + 1";
  236. Args* buffs = New_strBuff();
  237. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  238. printf("%s", pikaAsm);
  239. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  240. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  241. int res = args_getInt(globals->list, (char*)"a");
  242. obj_deinit(self);
  243. // obj_deinit(globals);
  244. args_deinit(buffs);
  245. ASSERT_EQ(res, 2);
  246. EXPECT_EQ(pikaMemNow(), 0);
  247. }
  248. TEST(VM, a_1_1d1) {
  249. char* line = (char*)"a = 1 + 1.1";
  250. Args* buffs = New_strBuff();
  251. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  252. printf("%s", pikaAsm);
  253. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  254. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  255. float res = args_getFloat(globals->list, (char*)"a");
  256. obj_deinit(self);
  257. // obj_deinit(globals);
  258. args_deinit(buffs);
  259. ASSERT_FLOAT_EQ(res, 2.1);
  260. EXPECT_EQ(pikaMemNow(), 0);
  261. }
  262. TEST(VM, a_jjcc) {
  263. char* line = (char*)"a = (1 + 1.1) * 3 - 2 /4.0";
  264. Args* buffs = New_strBuff();
  265. char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
  266. printf("%s", pikaAsm);
  267. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  268. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  269. float res = args_getFloat(globals->list, (char*)"a");
  270. obj_deinit(self);
  271. args_deinit(buffs);
  272. // obj_deinit(globals);
  273. ASSERT_FLOAT_EQ(res, 5.8);
  274. EXPECT_EQ(pikaMemNow(), 0);
  275. }
  276. TEST(VM, while_a_1to10) {
  277. char* line = (char*)
  278. "a = 0\n"
  279. "while a < 10:\n"
  280. " a = a + 1\n"
  281. " print(a)\n"
  282. "\n";
  283. Args* buffs = New_strBuff();
  284. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  285. printf("%s", pikaAsm);
  286. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  287. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  288. int res = args_getInt(globals->list, (char*)"a");
  289. obj_deinit(self);
  290. args_deinit(buffs);
  291. // obj_deinit(globals);
  292. ASSERT_FLOAT_EQ(res, 10);
  293. EXPECT_EQ(pikaMemNow(), 0);
  294. }
  295. TEST(VM, mem_x) {
  296. char* line = (char*)
  297. "mem = PikaStdLib.MemChecker()\n"
  298. "mem.x = 1\n"
  299. "print(mem.x)\n"
  300. "mem.x = 2\n"
  301. "print(mem.x)\n"
  302. "\n";
  303. Args* buffs = New_strBuff();
  304. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  305. printf("%s", pikaAsm);
  306. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  307. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  308. int res = obj_getInt(globals, (char*)"mem.x");
  309. EXPECT_EQ(2, res);
  310. obj_deinit(self);
  311. // obj_deinit(globals);
  312. args_deinit(buffs);
  313. EXPECT_EQ(pikaMemNow(), 0);
  314. }
  315. TEST(VM, DEF_instruct) {
  316. char* pikaAsm = (char*)
  317. "B0\n"
  318. "0 DEF test()\n"
  319. "0 JMP 1\n"
  320. "B1\n"
  321. "0 NUM 1\n"
  322. "0 RET\n"
  323. "B0\n";
  324. char* methodCode = (char*)
  325. "B1\n"
  326. "0 NUM 1\n"
  327. "0 RET\n"
  328. "B0\n";
  329. PikaObj* self = New_TinyObj(NULL);
  330. pikaVM_runAsm(self, pikaAsm);
  331. char* methodPtr = (char*)obj_getPtr(self, (char*)"test");
  332. EXPECT_STREQ(methodCode, methodPtr);
  333. obj_deinit(self);
  334. // obj_deinit(globals);
  335. EXPECT_EQ(pikaMemNow(), 0);
  336. }
  337. TEST(VM, RET_instruct) {
  338. char* pikaAsm = (char*)
  339. "B1\n"
  340. "0 NUM 13\n"
  341. "0 RET\n"
  342. "0 NUM 2\n"
  343. "0 RET\n"
  344. "B0\n";
  345. PikaObj* self = New_TinyObj(NULL);
  346. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  347. Arg* returnArg = args_getArg(globals->list, (char*)"return");
  348. int num = arg_getInt(returnArg);
  349. EXPECT_EQ(num, 13);
  350. obj_deinit(self);
  351. // obj_deinit(globals);
  352. EXPECT_EQ(pikaMemNow(), 0);
  353. }
  354. TEST(VM, RUN_DEF) {
  355. char* pikaAsm = (char*)
  356. "B0\n"
  357. "0 DEF test()\n"
  358. "0 JMP 1\n"
  359. "B1\n"
  360. "0 NUM 1\n"
  361. "0 RET\n"
  362. "B0\n"
  363. "0 RUN test\n"
  364. "0 OUT a\n";
  365. PikaObj* self = New_TinyObj(NULL);
  366. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  367. int num = obj_getInt(globals, (char*)"a");
  368. EXPECT_EQ(num, 1);
  369. obj_deinit(self);
  370. // obj_deinit(globals);
  371. EXPECT_EQ(pikaMemNow(), 0);
  372. }
  373. TEST(VM, RUN_global) {
  374. char* pikaAsm = (char*)
  375. "B0\n"
  376. "0 NUM 1\n"
  377. "0 OUT a\n"
  378. "B0\n"
  379. "0 DEF test()\n"
  380. "0 JMP 1\n"
  381. "B1\n"
  382. "0 REF a\n"
  383. "0 RET\n"
  384. "B0\n"
  385. "0 RUN test\n"
  386. "0 OUT b\n";
  387. PikaObj* self = New_TinyObj(NULL);
  388. pikaVM_runAsm(self, pikaAsm);
  389. int a = obj_getInt(self, (char*)"a");
  390. int b = obj_getInt(self, (char*)"b");
  391. EXPECT_EQ(a, 1);
  392. EXPECT_EQ(b, 1);
  393. obj_deinit(self);
  394. // obj_deinit(globals);
  395. EXPECT_EQ(pikaMemNow(), 0);
  396. }
  397. TEST(VM, RUN_local_b) {
  398. char* pikaAsm = (char*)
  399. "B0\n"
  400. "0 NUM 1\n"
  401. "0 OUT a\n"
  402. "B0\n"
  403. "0 DEF test()\n"
  404. "0 JMP 1\n"
  405. "B1\n"
  406. "0 REF a\n"
  407. "0 OUT b\n"
  408. "1 REF b\n"
  409. "1 REF a\n"
  410. "0 OPT +\n"
  411. "0 RET\n"
  412. "B0\n"
  413. "0 RUN test\n"
  414. "0 OUT c\n";
  415. PikaObj* self = newRootObj((char*)"", New_BaseObj);
  416. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  417. int a = obj_getInt(globals, (char*)"a");
  418. int b = obj_getInt(globals, (char*)"b");
  419. int c = obj_getInt(globals, (char*)"c");
  420. EXPECT_EQ(a, 1);
  421. /* b is local, should not be exist in globals */
  422. EXPECT_EQ(b, -999999999);
  423. EXPECT_EQ(c, 2);
  424. obj_deinit(self);
  425. // obj_deinit(globals);
  426. EXPECT_EQ(pikaMemNow(), 0);
  427. }
  428. TEST(VM, RUN_DEF_add) {
  429. char* pikaAsm = (char*)
  430. "B0\n"
  431. "0 DEF add(a,b)\n"
  432. "0 JMP 1\n"
  433. "B1\n"
  434. "1 REF b\n"
  435. "1 REF a\n"
  436. "0 OPT +\n"
  437. "0 RET\n"
  438. "B0\n"
  439. "1 NUM 1\n"
  440. "1 NUM 2\n"
  441. "0 RUN add\n"
  442. "0 OUT c\n";
  443. PikaObj* self = newRootObj((char*)"", New_BaseObj);
  444. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  445. int a = obj_getInt(globals, (char*)"a");
  446. int b = obj_getInt(globals, (char*)"b");
  447. int c = obj_getInt(globals, (char*)"c");
  448. /* a is local, should not be exist in globals */
  449. EXPECT_EQ(a, -999999999);
  450. /* b is local, should not be exist in globals */
  451. EXPECT_EQ(b, -999999999);
  452. EXPECT_EQ(c, 3);
  453. obj_deinit(self);
  454. // obj_deinit(globals);
  455. EXPECT_EQ(pikaMemNow(), 0);
  456. }
  457. TEST(VM, run_def_add) {
  458. char* line = (char*)
  459. "def add(a, b):\n"
  460. " return a + b\n"
  461. "c = add(1,3)\n"
  462. "\n";
  463. Args* buffs = New_strBuff();
  464. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  465. printf("%s", pikaAsm);
  466. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  467. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  468. int c = args_getInt(globals->list, (char*)"c");
  469. obj_deinit(self);
  470. args_deinit(buffs);
  471. // obj_deinit(globals);
  472. ASSERT_FLOAT_EQ(c, 4);
  473. EXPECT_EQ(pikaMemNow(), 0);
  474. }
  475. TEST(VM, equ) {
  476. char* line = (char*)
  477. "if -1 == -1:\n"
  478. " a = 1\n"
  479. "\n"
  480. ;
  481. Args* buffs = New_strBuff();
  482. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  483. printf("%s", pikaAsm);
  484. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  485. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  486. int c = args_getInt(globals->list, (char*)"a");
  487. obj_deinit(self);
  488. args_deinit(buffs);
  489. // obj_deinit(globals);
  490. ASSERT_FLOAT_EQ(c, 1);
  491. EXPECT_EQ(pikaMemNow(), 0);
  492. }
  493. TEST(VM, if_elif) {
  494. char* line = (char*)
  495. "a = 2\n"
  496. "b = 0\n"
  497. "if a > 1:\n"
  498. " b = 1\n"
  499. "elif a > 0:\n"
  500. " b = 2\n"
  501. "\n"
  502. ;
  503. Args* buffs = New_strBuff();
  504. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  505. printf("%s", pikaAsm);
  506. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  507. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  508. int b = args_getInt(globals->list, (char*)"b");
  509. obj_deinit(self);
  510. args_deinit(buffs);
  511. // obj_deinit(globals);
  512. ASSERT_FLOAT_EQ(b, 1);
  513. EXPECT_EQ(pikaMemNow(), 0);
  514. }
  515. TEST(VM, if_else) {
  516. char* line = (char*)
  517. "a = 0\n"
  518. "b = 0\n"
  519. "if a > 1:\n"
  520. " b = 1\n"
  521. "else:\n"
  522. " b = 2\n"
  523. "\n"
  524. ;
  525. Args* buffs = New_strBuff();
  526. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  527. printf("%s", pikaAsm);
  528. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  529. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  530. int b = args_getInt(globals->list, (char*)"b");
  531. obj_deinit(self);
  532. args_deinit(buffs);
  533. // obj_deinit(globals);
  534. ASSERT_FLOAT_EQ(b, 2);
  535. EXPECT_EQ(pikaMemNow(), 0);
  536. }
  537. TEST(VM, if_else_) {
  538. char* line = (char*)
  539. "a = 2\n"
  540. "b = 0\n"
  541. "if a > 1:\n"
  542. " b = 1\n"
  543. "else:\n"
  544. " b = 2\n"
  545. "\n"
  546. ;
  547. Args* buffs = New_strBuff();
  548. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  549. printf("%s", pikaAsm);
  550. PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
  551. VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
  552. int b = args_getInt(globals->list, (char*)"b");
  553. obj_deinit(self);
  554. args_deinit(buffs);
  555. // obj_deinit(globals);
  556. ASSERT_FLOAT_EQ(b, 1);
  557. EXPECT_EQ(pikaMemNow(), 0);
  558. }
  559. TEST(VM, EST) {
  560. char* pikaAsm = (char*)
  561. "B0\n"
  562. "0 EST a\n"
  563. "0 OUT b\n"
  564. ;
  565. PikaObj* self = newRootObj((char*)"", New_BaseObj);
  566. pikaVM_runAsm(self, pikaAsm);
  567. int a = obj_getInt(self, (char*)"a");
  568. int b = obj_getInt(self, (char*)"b");
  569. /* a is local, should not be exist in globals */
  570. EXPECT_EQ(a, -999999999);
  571. /* b is local, should not be exist in globals */
  572. EXPECT_EQ(b, 0);
  573. obj_deinit(self);
  574. // obj_deinit(globals);
  575. EXPECT_EQ(pikaMemNow(), 0);
  576. }
  577. TEST(VM, RUN_AS) {
  578. char* pikaAsm = (char*)
  579. "B0\n"
  580. "0 RUN PikaStdLib.PikaObj\n"
  581. "0 OUT as\n"
  582. "B0\n"
  583. "0 RAS as\n"
  584. "B0\n"
  585. "0 NUM 1\n"
  586. "0 OUT x\n"
  587. "B0\n"
  588. "0 RAS $origin\n"
  589. "B0\n"
  590. "0 NUM 2\n"
  591. "0 OUT x\n"
  592. ;
  593. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  594. pikaVM_runAsm(self, pikaAsm);
  595. PikaObj* as = obj_getObj(self, (char*)"as", 0);
  596. int x_as_ = obj_getInt(as, (char*)"x");
  597. int x_as = obj_getInt(self, (char*)"as.x");
  598. int x_origin = obj_getInt(self, (char*)"x");
  599. EXPECT_EQ(x_as_, 1);
  600. EXPECT_EQ(x_as, 1);
  601. EXPECT_EQ(x_origin, 2);
  602. obj_deinit(self);
  603. // obj_deinit(globals);
  604. EXPECT_EQ(pikaMemNow(), 0);
  605. }
  606. TEST(VM, RUN_NEW) {
  607. char* pikaAsm = (char*)
  608. "B0\n"
  609. "0 RUN PikaStdLib.PikaObj\n"
  610. "0 OUT newObj\n"
  611. "0 NUM 1\n"
  612. "0 OUT newObj.x\n"
  613. "B0\n"
  614. "0 NEW newObj\n"
  615. "0 OUT outObj\n"
  616. ;
  617. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  618. pikaVM_runAsm(self, pikaAsm);
  619. Arg* newObj = obj_getArg(self, (char*)"newObj");
  620. Arg* outObj = obj_getArg(self, (char*)"outObj");
  621. void* newObj_ptr = arg_getPtr(newObj);
  622. void* outObj_ptr = arg_getPtr(outObj);
  623. EXPECT_EQ(newObj_ptr, outObj_ptr);
  624. int x = obj_getInt(self, (char*)"outObj.x");
  625. ArgType newObj_type = arg_getType(newObj);
  626. ArgType outObj_type = arg_getType(outObj);
  627. EXPECT_EQ(x, 1);
  628. EXPECT_EQ(newObj_type, ARG_TYPE_POINTER);
  629. EXPECT_EQ(outObj_type, ARG_TYPE_OBJECT);
  630. obj_deinit(self);
  631. // obj_deinit(globals);
  632. EXPECT_EQ(pikaMemNow(), 0);
  633. }
  634. TEST(VM, RUN_DEF_NEW) {
  635. char* pikaAsm = (char*)
  636. "B0\n"
  637. "0 DEF testnew()\n"
  638. "0 JMP 1\n"
  639. "B1\n"
  640. "0 RUN PikaStdLib.PikaObj\n"
  641. "0 OUT newObj\n"
  642. "B1\n"
  643. "0 NUM 1\n"
  644. "0 OUT newObj.x\n"
  645. "B1\n"
  646. "0 NEW newObj\n"
  647. "0 RET\n"
  648. "B1\n"
  649. "0 RET\n"
  650. "B0\n"
  651. "0 RUN testnew\n"
  652. "0 OUT outobj\n"
  653. ;
  654. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  655. pikaVM_runAsm(self, pikaAsm);
  656. /* assert */
  657. PikaObj* outobj = obj_getObj(self, (char*)"outobj", 0);
  658. int x = obj_getInt(outobj, (char*)"x");
  659. EXPECT_EQ(x, 1);
  660. /* deinit */
  661. obj_deinit(self);
  662. // obj_deinit(globals);
  663. EXPECT_EQ(pikaMemNow(), 0);
  664. }
  665. TEST(VM, class_x_1) {
  666. char* line = (char*)
  667. "class Test(PikaStdLib.PikaObj):\n"
  668. " x = 1\n"
  669. "test = Test()\n"
  670. "print('test.x: ' + str(test.x))\n"
  671. "\n"
  672. ;
  673. Args* buffs = New_strBuff();
  674. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  675. printf("%s", pikaAsm);
  676. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  677. pikaVM_runAsm(self, pikaAsm);
  678. PikaObj* test = obj_getObj(self, (char*)"test", 0);
  679. Arg* test_arg = obj_getArg(self, (char*)"test");
  680. ArgType test_arg_type = arg_getType(test_arg);
  681. EXPECT_EQ(test_arg_type, ARG_TYPE_OBJECT);
  682. int x = obj_getInt(test, (char*)"x");
  683. EXPECT_EQ(x, 1);
  684. obj_deinit(self);
  685. args_deinit(buffs);
  686. EXPECT_EQ(pikaMemNow(), 0);
  687. }
  688. TEST(VM, nag_a) {
  689. char* line = (char*)
  690. "a = 1\n"
  691. "print(-a)\n"
  692. "b = 0.5\n"
  693. "print(-b)\n"
  694. ;
  695. Args* buffs = New_strBuff();
  696. char* pikaAsm = Parser_multiLineToAsm(buffs, line);
  697. printf("%s", pikaAsm);
  698. PikaObj* self = newRootObj((char*)"", New_PikaMain);
  699. __platform_printf((char*)"BEGIN\r\n");
  700. pikaVM_runAsm(self, pikaAsm);
  701. /* assert */
  702. EXPECT_STREQ(log_buff[2], (char*)"BEGIN\r\n");
  703. EXPECT_STREQ(log_buff[1], (char*)"-1\r\n");
  704. EXPECT_STREQ(log_buff[0], (char*)"-0.500000\r\n");
  705. /* deinit */
  706. obj_deinit(self);
  707. args_deinit(buffs);
  708. /* check mem */
  709. EXPECT_EQ(pikaMemNow(), 0);
  710. }
  711. TEST(InstructUnit, base) {
  712. InstructUnit bu;
  713. instructUnit_init(&bu);
  714. instructUnit_setBlockDeepth(&bu, 2);
  715. instructUnit_setIsNewLine(&bu, 1);
  716. instructUnit_setInvokeDeepth(&bu, 3);
  717. instructUnit_setInstruct(&bu, (Instruct)4);
  718. instructUnit_setConstPoolIndex(&bu, 12);
  719. EXPECT_EQ(instructUnit_getBlockDeepth(&bu), 2);
  720. EXPECT_EQ(instructUnit_getIsNewLine(&bu), 1);
  721. EXPECT_EQ(instructUnit_getInvokeDeepth(&bu), 3);
  722. EXPECT_EQ(instructUnit_getInstruct(&bu), 4);
  723. EXPECT_EQ(instructUnit_getConstPoolIndex(&bu), 12);
  724. instructUnit_print(&bu);
  725. }
  726. // TEST(InstructUnit, new_) {
  727. // char data[] = "test";
  728. // InstructUnit* bu_p = New_instructUnit(strGetSize(data));
  729. // instructUnit_setData(bu_p, data);
  730. // EXPECT_STREQ(instructUnit_getData(bu_p), (char*)"test");
  731. // EXPECT_EQ(instructUnit_getTotleSize(bu_p), 8);
  732. // EXPECT_EQ(instructUnit_getTotleSize_withDataSize(strGetSize(data)), 8);
  733. // instructUnit_deinit(bu_p);
  734. // EXPECT_EQ(pikaMemNow(), 0);
  735. // }
  736. TEST(ConstPool, get) {
  737. __platform_printf((char*)"BEGIN\r\n");
  738. ConstPool cp;
  739. constPool_init(&cp);
  740. char* next_content;
  741. uint16_t next_offset;
  742. next_offset = constPool_getLastOffset(&cp);
  743. constPool_append(&cp, (char*)"hello");
  744. next_content = constPool_getByOffset(&cp, next_offset);
  745. EXPECT_STREQ(next_content, (char*)"hello");
  746. next_offset = constPool_getLastOffset(&cp);
  747. constPool_append(&cp, (char*)"world");
  748. next_content = constPool_getByOffset(&cp, next_offset);
  749. EXPECT_STREQ(next_content, (char*)"world");
  750. char* first = constPool_getNow(&cp);
  751. char* second = constPool_getNext(&cp);
  752. char* third = constPool_getNext(&cp);
  753. char* forth = constPool_getNext(&cp);
  754. EXPECT_STREQ(first, (char*)"");
  755. EXPECT_STREQ(second, (char*)"hello");
  756. EXPECT_STREQ(third, (char*)"world");
  757. EXPECT_EQ((uintptr_t)forth, (uintptr_t)NULL);
  758. EXPECT_STREQ(constPool_getByIndex(&cp, 0), (char*)"");
  759. EXPECT_STREQ(constPool_getByIndex(&cp, 1), (char*)"hello");
  760. EXPECT_STREQ(constPool_getByIndex(&cp, 2), (char*)"world");
  761. EXPECT_EQ((uintptr_t)constPool_getByIndex(&cp, 3), (uintptr_t)NULL);
  762. constPool_print(&cp);
  763. EXPECT_STREQ(log_buff[2], (char*)"BEGIN\r\n");
  764. EXPECT_STREQ(log_buff[1], (char*)"1: hello\r\n");
  765. EXPECT_STREQ(log_buff[0], (char*)"7: world\r\n");
  766. constPool_deinit(&cp);
  767. EXPECT_EQ(pikaMemNow(), 0);
  768. }
  769. TEST(InstructArray, set) {
  770. InstructArray ia;
  771. InstructUnit bu;
  772. instructUnit_init(&bu);
  773. instructUnit_setBlockDeepth(&bu, 2);
  774. instructUnit_setIsNewLine(&bu, 1);
  775. instructUnit_setInvokeDeepth(&bu, 3);
  776. instructUnit_setInstruct(&bu, (Instruct)4);
  777. instructUnit_setConstPoolIndex(&bu, 12);
  778. instructArray_init(&ia);
  779. instructArray_append(&ia, &bu);
  780. instructArray_deinit(&ia);
  781. EXPECT_EQ(pikaMemNow(), 0);
  782. }