| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850 |
- #include "gtest/gtest.h"
- extern "C" {
- #include "BaseObj.h"
- #include "PikaMain.h"
- #include "PikaMath_Operator.h"
- #include "PikaParser.h"
- #include "PikaStdLib_SysObj.h"
- #include "PikaVM.h"
- #include "dataMemory.h"
- #include "dataQueue.h"
- #include "dataStrs.h"
- #include "pika_config_gtest.h"
- extern char log_buff[LOG_BUFF_MAX][LOG_SIZE];
- /* test head */
- VMParameters* pikaVM_runAsmWithPars(PikaObj* self,
- VMParameters* locals,
- VMParameters* globals,
- char* pikaAsm);
- char* Parser_LineToAsm(Args* buffs, char* line, Stack* blockStack);
- char* Parser_multiLineToAsm(Args* outBuffs, char* multiLine);
- int32_t __clearInvokeQueues(VMParameters* locals);
- int32_t pikaVM_runAsmLine(PikaObj* self,
- VMParameters* locals,
- VMParameters* globals,
- char* pikaAsm,
- int32_t lineAddr);
- }
- TEST(VM, num1) {
- char* line = (char*)"1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- pikaVM_runAsm(self, pikaAsm);
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1) {
- char* line = (char*)"a = 1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- pikaVM_runAsm(self, pikaAsm);
- ASSERT_EQ(args_getInt(self->list, (char*)"a"), 1);
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1d1) {
- char* line = (char*)"a = 1.1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_FLOAT_EQ(args_getFloat(globals->list, (char*)"a"), 1.1);
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, str_xy) {
- char* line = (char*)"a = 'xy'";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_STREQ(args_getStr(globals->list, (char*)"a"), (char*)"xy");
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, str_xy_space) {
- char* line = (char*)"a = 'xy '";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_STREQ(args_getStr(globals->list, (char*)"a"), (char*)"xy ");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, ref_a_b) {
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- Args* buffs = New_strBuff();
- VMParameters* globals =
- pikaVM_runAsm(self, Parser_LineToAsm(buffs, (char*)"a = 'xy '", NULL));
- globals = pikaVM_runAsmWithPars(
- self, globals, globals, Parser_LineToAsm(buffs, (char*)"b = a", NULL));
- args_deinit(buffs);
- ASSERT_STREQ(args_getStr(globals->list, (char*)"b"), (char*)"xy ");
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add) {
- PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- VMParameters* globals = pikaVM_runAsm(
- self, Parser_LineToAsm(buffs, (char*)"a = plusInt(1,2)", NULL));
- args_deinit(buffs);
- int a = args_getInt(globals->list, (char*)"a");
- ASSERT_EQ(a, 3);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add_multy) {
- PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- VMParameters* globals =
- pikaVM_runAsm(self, Parser_LineToAsm(buffs, (char*)"b = 2", NULL));
- globals = pikaVM_runAsmWithPars(
- self, globals, globals,
- Parser_LineToAsm(buffs, (char*)"a = plusInt(1,b)", NULL));
- args_deinit(buffs);
- int a = args_getInt(globals->list, (char*)"a");
- ASSERT_EQ(a, 3);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add_1_2_3) {
- PikaObj* self = newRootObj((char*)"root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- VMParameters* globals = pikaVM_runAsm(
- self,
- Parser_LineToAsm(buffs, (char*)"a = plusInt(1, plusInt(2,3) )", NULL));
- args_deinit(buffs);
- int a = args_getInt(globals->list, (char*)"a");
- ASSERT_EQ(a, 6);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, JEZ) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 REF False\n"
- "0 JEZ 2\n"
- "B0\n"
- "B0\n";
- PikaObj* self = New_TinyObj(NULL);
- int lineAddr = 0;
- Args* sysRes = New_args(NULL);
- args_setErrorCode(sysRes, 0);
- args_setSysOut(sysRes, (char*)"");
- VMParameters* globals = self;
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- __clearInvokeQueues(globals);
- obj_deinit(self);
- args_deinit(sysRes);
- // obj_deinit(globals);
- EXPECT_EQ(lineAddr, 26);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, JMP) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 JMP 2\n"
- "B0\n"
- "B0\n";
- PikaObj* self = New_TinyObj(NULL);
- int lineAddr = 0;
- Args* sysRes = New_args(NULL);
- args_setErrorCode(sysRes, 0);
- args_setSysOut(sysRes, (char*)"");
- VMParameters* globals = self;
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- __clearInvokeQueues(globals);
- obj_deinit(self);
- args_deinit(sysRes);
- // obj_deinit(globals);
- EXPECT_EQ(lineAddr, 14);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, JMP_back1) {
- char* pikaAsm = (char*)
- "B0\n"
- "B0\n"
- "0 JMP -1\n"
- "B0\n"
- "B0\n";
- PikaObj* self = New_TinyObj(NULL);
- int lineAddr = 0;
- Args* sysRes = New_args(NULL);
- args_setErrorCode(sysRes, 0);
- args_setSysOut(sysRes, (char*)"");
- VMParameters* globals = self;
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- lineAddr = pikaVM_runAsmLine(self, globals, globals, pikaAsm, lineAddr);
- __clearInvokeQueues(globals);
- obj_deinit(self);
- args_deinit(sysRes);
- // obj_deinit(globals);
- EXPECT_EQ(lineAddr, 0);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- extern PikaMemInfo pikaMemInfo;
- TEST(VM, WHILE) {
- pikaMemInfo.heapUsedMax = 0;
- Args* buffs = New_strBuff();
- char* lines =(char *)
- "a = 1\n"
- "b = 0\n"
- "while a:\n"
- " b = 1\n"
- " a = 0\n"
- "\n";
- printf("%s", lines);
- char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
- printf("%s", pikaAsm);
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* self = New_TinyObj(NULL);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- EXPECT_EQ(args_getInt(globals->list, (char*)"a"), 0);
- EXPECT_EQ(args_getInt(globals->list, (char*)"b"), 1);
- // obj_deinit(globals);
- args_deinit(buffs);
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1_1) {
- char* line = (char*)"a = 1 + 1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = args_getInt(globals->list, (char*)"a");
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- ASSERT_EQ(res, 2);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1_1d1) {
- char* line = (char*)"a = 1 + 1.1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- float res = args_getFloat(globals->list, (char*)"a");
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- ASSERT_FLOAT_EQ(res, 2.1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_jjcc) {
- char* line = (char*)"a = (1 + 1.1) * 3 - 2 /4.0";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- float res = args_getFloat(globals->list, (char*)"a");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(res, 5.8);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, while_a_1to10) {
- char* line = (char*)
- "a = 0\n"
- "while a < 10:\n"
- " a = a + 1\n"
- " print(a)\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = args_getInt(globals->list, (char*)"a");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(res, 10);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, mem_x) {
- char* line = (char*)
- "mem = PikaStdLib.MemChecker()\n"
- "mem.x = 1\n"
- "print(mem.x)\n"
- "mem.x = 2\n"
- "print(mem.x)\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = obj_getInt(globals, (char*)"mem.x");
- EXPECT_EQ(2, res);
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, DEF_instruct) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 DEF test()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 NUM 1\n"
- "0 RET\n"
- "B0\n";
- char* methodCode = (char*)
- "B1\n"
- "0 NUM 1\n"
- "0 RET\n"
- "B0\n";
- PikaObj* self = New_TinyObj(NULL);
- pikaVM_runAsm(self, pikaAsm);
- char* methodPtr = (char*)obj_getPtr(self, (char*)"test");
- EXPECT_STREQ(methodCode, methodPtr);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RET_instruct) {
- char* pikaAsm = (char*)
- "B1\n"
- "0 NUM 13\n"
- "0 RET\n"
- "0 NUM 2\n"
- "0 RET\n"
- "B0\n";
- PikaObj* self = New_TinyObj(NULL);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- Arg* returnArg = args_getArg(globals->list, (char*)"return");
- int num = arg_getInt(returnArg);
- EXPECT_EQ(num, 13);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_DEF) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 DEF test()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 NUM 1\n"
- "0 RET\n"
- "B0\n"
- "0 RUN test\n"
- "0 OUT a\n";
- PikaObj* self = New_TinyObj(NULL);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int num = obj_getInt(globals, (char*)"a");
- EXPECT_EQ(num, 1);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_global) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 NUM 1\n"
- "0 OUT a\n"
- "B0\n"
- "0 DEF test()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 REF a\n"
- "0 RET\n"
- "B0\n"
- "0 RUN test\n"
- "0 OUT b\n";
- PikaObj* self = New_TinyObj(NULL);
- pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(self, (char*)"a");
- int b = obj_getInt(self, (char*)"b");
- EXPECT_EQ(a, 1);
- EXPECT_EQ(b, 1);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_local_b) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 NUM 1\n"
- "0 OUT a\n"
- "B0\n"
- "0 DEF test()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 REF a\n"
- "0 OUT b\n"
- "1 REF b\n"
- "1 REF a\n"
- "0 OPT +\n"
- "0 RET\n"
- "B0\n"
- "0 RUN test\n"
- "0 OUT c\n";
- PikaObj* self = newRootObj((char*)"", New_BaseObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(globals, (char*)"a");
- int b = obj_getInt(globals, (char*)"b");
- int c = obj_getInt(globals, (char*)"c");
- EXPECT_EQ(a, 1);
- /* b is local, should not be exist in globals */
- EXPECT_EQ(b, -999999999);
- EXPECT_EQ(c, 2);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_DEF_add) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 DEF add(a,b)\n"
- "0 JMP 1\n"
- "B1\n"
- "1 REF b\n"
- "1 REF a\n"
- "0 OPT +\n"
- "0 RET\n"
- "B0\n"
- "1 NUM 1\n"
- "1 NUM 2\n"
- "0 RUN add\n"
- "0 OUT c\n";
- PikaObj* self = newRootObj((char*)"", New_BaseObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(globals, (char*)"a");
- int b = obj_getInt(globals, (char*)"b");
- int c = obj_getInt(globals, (char*)"c");
- /* a is local, should not be exist in globals */
- EXPECT_EQ(a, -999999999);
- /* b is local, should not be exist in globals */
- EXPECT_EQ(b, -999999999);
- EXPECT_EQ(c, 3);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, run_def_add) {
- char* line = (char*)
- "def add(a, b):\n"
- " return a + b\n"
- "c = add(1,3)\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int c = args_getInt(globals->list, (char*)"c");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(c, 4);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, equ) {
- char* line = (char*)
- "if -1 == -1:\n"
- " a = 1\n"
- "\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int c = args_getInt(globals->list, (char*)"a");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(c, 1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, if_elif) {
- char* line = (char*)
- "a = 2\n"
- "b = 0\n"
- "if a > 1:\n"
- " b = 1\n"
- "elif a > 0:\n"
- " b = 2\n"
- "\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, (char*)"b");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(b, 1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, if_else) {
- char* line = (char*)
- "a = 0\n"
- "b = 0\n"
- "if a > 1:\n"
- " b = 1\n"
- "else:\n"
- " b = 2\n"
- "\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, (char*)"b");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(b, 2);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, if_else_) {
- char* line = (char*)
- "a = 2\n"
- "b = 0\n"
- "if a > 1:\n"
- " b = 1\n"
- "else:\n"
- " b = 2\n"
- "\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, (char*)"b");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(b, 1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, EST) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 EST a\n"
- "0 OUT b\n"
- ;
- PikaObj* self = newRootObj((char*)"", New_BaseObj);
- pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(self, (char*)"a");
- int b = obj_getInt(self, (char*)"b");
- /* a is local, should not be exist in globals */
- EXPECT_EQ(a, -999999999);
- /* b is local, should not be exist in globals */
- EXPECT_EQ(b, 0);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_AS) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 RUN PikaStdLib.PikaObj\n"
- "0 OUT as\n"
- "B0\n"
- "0 RAS as\n"
- "B0\n"
- "0 NUM 1\n"
- "0 OUT x\n"
- "B0\n"
- "0 RAS $origin\n"
- "B0\n"
- "0 NUM 2\n"
- "0 OUT x\n"
- ;
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- PikaObj* as = obj_getObj(self, (char*)"as", 0);
- int x_as_ = obj_getInt(as, (char*)"x");
- int x_as = obj_getInt(self, (char*)"as.x");
- int x_origin = obj_getInt(self, (char*)"x");
- EXPECT_EQ(x_as_, 1);
- EXPECT_EQ(x_as, 1);
- EXPECT_EQ(x_origin, 2);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_NEW) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 RUN PikaStdLib.PikaObj\n"
- "0 OUT newObj\n"
- "0 NUM 1\n"
- "0 OUT newObj.x\n"
- "B0\n"
- "0 NEW newObj\n"
- "0 OUT outObj\n"
- ;
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- Arg* newObj = obj_getArg(self, (char*)"newObj");
- Arg* outObj = obj_getArg(self, (char*)"outObj");
- void* newObj_ptr = arg_getPtr(newObj);
- void* outObj_ptr = arg_getPtr(outObj);
- EXPECT_EQ(newObj_ptr, outObj_ptr);
- int x = obj_getInt(self, (char*)"outObj.x");
- ArgType newObj_type = arg_getType(newObj);
- ArgType outObj_type = arg_getType(outObj);
- EXPECT_EQ(x, 1);
- EXPECT_EQ(newObj_type, ARG_TYPE_POINTER);
- EXPECT_EQ(outObj_type, ARG_TYPE_OBJECT);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_DEF_NEW) {
- char* pikaAsm = (char*)
- "B0\n"
- "0 DEF testnew()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 RUN PikaStdLib.PikaObj\n"
- "0 OUT newObj\n"
- "B1\n"
- "0 NUM 1\n"
- "0 OUT newObj.x\n"
- "B1\n"
- "0 NEW newObj\n"
- "0 RET\n"
- "B1\n"
- "0 RET\n"
- "B0\n"
- "0 RUN testnew\n"
- "0 OUT outobj\n"
- ;
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- /* assert */
- PikaObj* outobj = obj_getObj(self, (char*)"outobj", 0);
- int x = obj_getInt(outobj, (char*)"x");
- EXPECT_EQ(x, 1);
- /* deinit */
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, class_x_1) {
- char* line = (char*)
- "class Test(PikaStdLib.PikaObj):\n"
- " x = 1\n"
- "test = Test()\n"
- "print('test.x: ' + str(test.x))\n"
- "\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- PikaObj* test = obj_getObj(self, (char*)"test", 0);
- Arg* test_arg = obj_getArg(self, (char*)"test");
- ArgType test_arg_type = arg_getType(test_arg);
- EXPECT_EQ(test_arg_type, ARG_TYPE_OBJECT);
- int x = obj_getInt(test, (char*)"x");
- EXPECT_EQ(x, 1);
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, nag_a) {
- char* line = (char*)
- "a = 1\n"
- "print(-a)\n"
- "b = 0.5\n"
- "print(-b)\n"
- ;
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_multiLineToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj((char*)"", New_PikaMain);
- __platform_printf((char*)"BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* assert */
- EXPECT_STREQ(log_buff[2], (char*)"BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], (char*)"-1\r\n");
- EXPECT_STREQ(log_buff[0], (char*)"-0.500000\r\n");
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- /* check mem */
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(InstructUnit, base) {
- InstructUnit bu;
- instructUnit_init(&bu);
- instructUnit_setBlockDeepth(&bu, 2);
- instructUnit_setIsNewLine(&bu, 1);
- instructUnit_setInvokeDeepth(&bu, 3);
- instructUnit_setInstruct(&bu, (Instruct)4);
- instructUnit_setConstPoolIndex(&bu, 12);
- EXPECT_EQ(instructUnit_getBlockDeepth(&bu), 2);
- EXPECT_EQ(instructUnit_getIsNewLine(&bu), 1);
- EXPECT_EQ(instructUnit_getInvokeDeepth(&bu), 3);
- EXPECT_EQ(instructUnit_getInstruct(&bu), 4);
- EXPECT_EQ(instructUnit_getConstPoolIndex(&bu), 12);
- instructUnit_print(&bu);
- }
- // TEST(InstructUnit, new_) {
- // char data[] = "test";
- // InstructUnit* bu_p = New_instructUnit(strGetSize(data));
- // instructUnit_setData(bu_p, data);
- // EXPECT_STREQ(instructUnit_getData(bu_p), (char*)"test");
- // EXPECT_EQ(instructUnit_getTotleSize(bu_p), 8);
- // EXPECT_EQ(instructUnit_getTotleSize_withDataSize(strGetSize(data)), 8);
- // instructUnit_deinit(bu_p);
- // EXPECT_EQ(pikaMemNow(), 0);
- // }
- TEST(ConstPool, get) {
- __platform_printf((char*)"BEGIN\r\n");
- ConstPool cp;
- constPool_init(&cp);
- char* next_content;
- uint16_t next_offset;
- next_offset = constPool_getLastOffset(&cp);
- constPool_append(&cp, (char*)"hello");
- next_content = constPool_getByOffset(&cp, next_offset);
- EXPECT_STREQ(next_content, (char*)"hello");
- next_offset = constPool_getLastOffset(&cp);
- constPool_append(&cp, (char*)"world");
- next_content = constPool_getByOffset(&cp, next_offset);
- EXPECT_STREQ(next_content, (char*)"world");
- char* first = constPool_getNow(&cp);
- char* second = constPool_getNext(&cp);
- char* third = constPool_getNext(&cp);
- char* forth = constPool_getNext(&cp);
- EXPECT_STREQ(first, (char*)"");
- EXPECT_STREQ(second, (char*)"hello");
- EXPECT_STREQ(third, (char*)"world");
- EXPECT_EQ((uintptr_t)forth, (uintptr_t)NULL);
- EXPECT_STREQ(constPool_getByIndex(&cp, 0), (char*)"");
- EXPECT_STREQ(constPool_getByIndex(&cp, 1), (char*)"hello");
- EXPECT_STREQ(constPool_getByIndex(&cp, 2), (char*)"world");
- EXPECT_EQ((uintptr_t)constPool_getByIndex(&cp, 3), (uintptr_t)NULL);
- constPool_print(&cp);
- EXPECT_STREQ(log_buff[2], (char*)"BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], (char*)"1: hello\r\n");
- EXPECT_STREQ(log_buff[0], (char*)"7: world\r\n");
- constPool_deinit(&cp);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(InstructArray, set) {
- InstructArray ia;
- InstructUnit bu;
- instructUnit_init(&bu);
- instructUnit_setBlockDeepth(&bu, 2);
- instructUnit_setIsNewLine(&bu, 1);
- instructUnit_setInvokeDeepth(&bu, 3);
- instructUnit_setInstruct(&bu, (Instruct)4);
- instructUnit_setConstPoolIndex(&bu, 12);
- instructArray_init(&ia);
- instructArray_append(&ia, &bu);
- instructArray_deinit(&ia);
- EXPECT_EQ(pikaMemNow(), 0);
- }
|