| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445 |
- #include "test_common.h"
- TEST_START
- extern "C" {
- 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_linesToAsm(Args* outBuffs, char* multiLine);
- int32_t __clearInvokeStackes(VMParameters* locals);
- int32_t pikaVM_runAsmLine(PikaObj* self,
- VMParameters* locals,
- VMParameters* globals,
- char* pikaAsm,
- int32_t lineAddr);
- }
- TEST(VM, num1) {
- char* line = "1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[0], "1\r\n");
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1) {
- char* line = "a = 1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- pikaVM_runAsm(self, pikaAsm);
- ASSERT_EQ(args_getInt(self->list, "a"), 1);
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1d1) {
- char* line = "a = 1.1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_FLOAT_EQ(args_getFloat(globals->list, "a"), 1.1);
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, str_xy) {
- char* line = "a = 'xy'";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_STREQ(args_getStr(globals->list, "a"), "xy");
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, str_xy_space) {
- char* line = "a = 'xy '";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- ASSERT_STREQ(args_getStr(globals->list, "a"), "xy ");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, ref_a_b) {
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- Args* buffs = New_strBuff();
- pikaVM_runAsm(self, Parser_LineToAsm(buffs, "a = 'xy '", NULL));
- args_deinit(buffs);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add) {
- PikaObj* self = newRootObj("root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, "a = plusInt(1,2)", NULL);
- __platform_printf("%s", pikaAsm);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- args_deinit(buffs);
- int a = args_getInt(globals->list, "a");
- ASSERT_EQ(a, 3);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add_multy) {
- PikaObj* self = newRootObj("root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- pikaVM_runAsm(self, Parser_LineToAsm(buffs, "b = 2", NULL));
- args_deinit(buffs);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, Run_add_1_2_3) {
- PikaObj* self = newRootObj("root", New_PikaMath_Operator);
- Args* buffs = New_strBuff();
- char* pikaAsm =
- Parser_LineToAsm(buffs, "a = plusInt(1, plusInt(2,3) )", NULL);
- __platform_printf("%s", pikaAsm);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- args_deinit(buffs);
- int a = args_getInt(globals->list, "a");
- ASSERT_EQ(a, 6);
- obj_deinit(self);
- // obj_deinit(globals);
- 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_linesToAsm(buffs, lines);
- printf("%s", pikaAsm);
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* self = newRootObj("root", New_TinyObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- EXPECT_EQ(args_getInt(globals->list, "a"), 0);
- EXPECT_EQ(args_getInt(globals->list, "b"), 1);
- // obj_deinit(globals);
- args_deinit(buffs);
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1_1) {
- char* line = "a = 1 + 1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = args_getInt(globals->list, "a");
- obj_deinit(self);
- args_deinit(buffs);
- ASSERT_EQ(res, 2);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_1_1d1) {
- char* line = "a = 1 + 1.1";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- float res = args_getFloat(globals->list, "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 = "a = (1 + 1.1) * 3 - 2 /4.0";
- printf("%s\r\n", line);
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- float res = args_getFloat(globals->list, "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 =
- "a = 0\n"
- "while a < 10:\n"
- " a += 1\n"
- " print(a)\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = args_getInt(globals->list, "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 =
- "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_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("", New_PikaMain);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int res = obj_getInt(globals, "mem.x");
- EXPECT_EQ(2, res);
- obj_deinit(self);
- // obj_deinit(globals);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RET_instruct) {
- char* pikaAsm =
- "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* return_arg = args_getArg(globals->list, "@rt");
- int num = arg_getInt(return_arg);
- EXPECT_EQ(num, 13);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_DEF) {
- char* pikaAsm =
- "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, "a");
- EXPECT_EQ(num, 1);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_global) {
- char* pikaAsm =
- "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, "a");
- int b = obj_getInt(self, "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 =
- "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("", New_BaseObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(globals, "a");
- int b = obj_getInt(globals, "b");
- int c = obj_getInt(globals, "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 =
- "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("", New_BaseObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(globals, "a");
- int b = obj_getInt(globals, "b");
- int c = obj_getInt(globals, "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 =
- "def add(a, b):\n"
- " return a + b\n"
- "c = add(1,3)\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int c = args_getInt(globals->list, "c");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(c, 4);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, equ) {
- char* line =
- "if -1 == -1:\n"
- " a = 1\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int c = args_getInt(globals->list, "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 =
- "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_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, "b");
- obj_deinit(self);
- args_deinit(buffs);
- ASSERT_FLOAT_EQ(b, 1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, if_else) {
- char* line =
- "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_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, "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 =
- "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_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- VMParameters* globals = pikaVM_runAsm(self, pikaAsm);
- int b = args_getInt(globals->list, "b");
- obj_deinit(self);
- args_deinit(buffs);
- // obj_deinit(globals);
- ASSERT_FLOAT_EQ(b, 1);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, EST) {
- char* pikaAsm =
- "B0\n"
- "0 EST a\n"
- "0 OUT b\n";
- PikaObj* self = newRootObj("", New_BaseObj);
- pikaVM_runAsm(self, pikaAsm);
- int a = obj_getInt(self, "a");
- int b = obj_getInt(self, "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 =
- "B0\n"
- "0 RUN TinyObj\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("", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- PikaObj* as = obj_getObj(self, "as");
- int x_as_ = obj_getInt(as, "x");
- int x_as = obj_getInt(self, "as.x");
- int x_origin = obj_getInt(self, "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 =
- "B0\n"
- "0 RUN TinyObj\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("", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- Arg* newObj = obj_getArg(self, "newObj");
- Arg* outObj = obj_getArg(self, "outObj");
- void* newObj_ptr = arg_getPtr(newObj);
- void* outObj_ptr = arg_getPtr(outObj);
- EXPECT_EQ(newObj_ptr, outObj_ptr);
- int x = obj_getInt(self, "outObj.x");
- ArgType newObj_type = arg_getType(newObj);
- ArgType outObj_type = arg_getType(outObj);
- EXPECT_EQ(x, 1);
- EXPECT_EQ(newObj_type, ARG_TYPE_OBJECT);
- EXPECT_EQ(outObj_type, ARG_TYPE_OBJECT);
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, RUN_DEF_NEW) {
- char* pikaAsm =
- "B0\n"
- "0 DEF testnew()\n"
- "0 JMP 1\n"
- "B1\n"
- "0 RUN TinyObj\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("", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- /* assert */
- PikaObj* outobj = obj_getObj(self, "outobj");
- int x = obj_getInt(outobj, "x");
- EXPECT_EQ(x, 1);
- /* deinit */
- obj_deinit(self);
- // obj_deinit(globals);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, class_x_1) {
- char* line =
- "class Test(TinyObj):\n"
- " x = 1\n"
- "test = Test()\n"
- "print('test.x: ' + str(test.x))\n"
- "\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("", New_PikaMain);
- pikaVM_runAsm(self, pikaAsm);
- PikaObj* test = obj_getObj(self, "test");
- Arg* test_arg = obj_getArg(self, "test");
- ArgType test_arg_type = arg_getType(test_arg);
- EXPECT_EQ(test_arg_type, ARG_TYPE_OBJECT);
- int x = obj_getInt(test, "x");
- EXPECT_EQ(x, 1);
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, nag_a) {
- char* line =
- "a = 1\n"
- "print(-a)\n"
- "b = 0.5\n"
- "print(-b)\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("", New_PikaMain);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* assert */
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], "-1\r\n");
- EXPECT_STREQ(log_buff[0], "-0.500000\r\n");
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- /* check mem */
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(InstructUnit, base) {
- __platform_printf("BEGIN\r\n");
- InstructUnit ins_unit;
- instructUnit_init(&ins_unit);
- instructUnit_setBlockDeepth(&ins_unit, 2);
- instructUnit_setIsNewLine(&ins_unit, 1);
- instructUnit_setInvokeDeepth(&ins_unit, 3);
- instructUnit_setInstruct(&ins_unit, (Instruct)4);
- instructUnit_setConstPoolIndex(&ins_unit, 12);
- EXPECT_EQ(instructUnit_getBlockDeepth(&ins_unit), 2);
- EXPECT_EQ(instructUnit_getIsNewLine(&ins_unit), 1);
- EXPECT_EQ(instructUnit_getInvokeDeepth(&ins_unit), 3);
- EXPECT_EQ(instructUnit_getInstruct(&ins_unit), 4);
- EXPECT_EQ(instructUnit_getConstPoolIndex(&ins_unit), 12);
- instructUnit_print(&ins_unit);
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], "B2\r\n");
- EXPECT_STREQ(log_buff[0], "3 OUT #12\r\n");
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(ConstPool, get) {
- __platform_printf("BEGIN\r\n");
- ConstPool cp;
- constPool_init(&cp);
- char* next_content;
- uint16_t next_offset;
- next_offset = constPool_getLastOffset(&cp);
- constPool_append(&cp, "hello");
- next_content = constPool_getByOffset(&cp, next_offset);
- EXPECT_STREQ(next_content, "hello");
- next_offset = constPool_getLastOffset(&cp);
- constPool_append(&cp, "world");
- next_content = constPool_getByOffset(&cp, next_offset);
- EXPECT_STREQ(next_content, "world");
- char* first = constPool_getNow(&cp);
- char* second = constPool_getNext(&cp);
- char* third = constPool_getNext(&cp);
- char* forth = constPool_getNext(&cp);
- EXPECT_STREQ(first, "");
- EXPECT_STREQ(second, "hello");
- EXPECT_STREQ(third, "world");
- EXPECT_EQ((uintptr_t)forth, (uintptr_t)NULL);
- EXPECT_STREQ(constPool_getByIndex(&cp, 0), "");
- EXPECT_STREQ(constPool_getByIndex(&cp, 1), "hello");
- EXPECT_STREQ(constPool_getByIndex(&cp, 2), "world");
- EXPECT_EQ((uintptr_t)constPool_getByIndex(&cp, 3), (uintptr_t)NULL);
- constPool_print(&cp);
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], "1: hello\r\n");
- EXPECT_STREQ(log_buff[0], "7: world\r\n");
- constPool_deinit(&cp);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(InstructArray, set) {
- __platform_printf("BEGIN\r\n");
- InstructUnit ins_unit;
- instructUnit_init(&ins_unit);
- instructUnit_setBlockDeepth(&ins_unit, 2);
- instructUnit_setIsNewLine(&ins_unit, 1);
- instructUnit_setInvokeDeepth(&ins_unit, 3);
- instructUnit_setInstruct(&ins_unit, (Instruct)4);
- instructUnit_setConstPoolIndex(&ins_unit, 12);
- InstructArray ins_array;
- instructArray_init(&ins_array);
- instructArray_append(&ins_array, &ins_unit);
- instructArray_print(&ins_array);
- instructArray_deinit(&ins_array);
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], "B2\r\n");
- EXPECT_STREQ(log_buff[0], "3 OUT #12\r\n");
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, bytecode_jjcc) {
- char* line = "a = (1 + 1.1) * 3 - 2 /4.0";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- ByteCodeFrame byte_frame;
- byteCodeFrame_init(&byte_frame);
- byteCodeFrame_appendFromAsm(&byte_frame, pikaAsm);
- byteCodeFrame_print(&byte_frame);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- // pikaVM_runAsm(self, pikaAsm);
- pikaVM_runByteCodeFrame(self, &byte_frame);
- float res = obj_getFloat(self, "a");
- obj_deinit(self);
- args_deinit(buffs);
- byteCodeFrame_deinit(&byte_frame);
- ASSERT_FLOAT_EQ(res, 5.8);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, WHILE_byte) {
- 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_linesToAsm(buffs, lines);
- printf("%s", pikaAsm);
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* self = newRootObj("root", New_TinyObj);
- pikaVM_run(self, lines);
- EXPECT_EQ(obj_getInt(self, "a"), 0);
- EXPECT_EQ(obj_getInt(self, "b"), 1);
- args_deinit(buffs);
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, for_break_byte) {
- pikaMemInfo.heapUsedMax = 0;
- Args* buffs = New_strBuff();
- char* lines =(char *)
- "a = 0\n"
- "for i in range(0, 10):\n"
- " if i == 5:\n"
- " break\n"
- " a = a + i\n"
- "\n";
- printf("%s", lines);
- char* pikaAsm = Parser_linesToAsm(buffs, lines);
- printf("%s", pikaAsm);
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* self = newRootObj("pikaMain", New_PikaMain);
- pikaVM_run(self, lines);
- /* assert */
- int a = obj_getInt(self, "a");
- EXPECT_EQ(a, 10);
- /* deinit */
- args_deinit(buffs);
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, load_static_bytes) {
- const uint8_t bytes[] = {
- 0x08, 0x02, 0x00, 0x00, /* instruct array size */
- 0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x0d, 0x00, 0x00, 0x83, 0x11, 0x00,
- 0x00, 0x04, 0x16, 0x00, 0x00, 0x85, 0x1b, 0x00, 0x00, 0x04, 0x1d, 0x00,
- 0x20, 0x85, 0x1b, 0x00, 0x20, 0x01, 0x0d, 0x00, 0x10, 0x02, 0x28, 0x00,
- 0x00, 0x02, 0x2e, 0x00, 0x00, 0x04, 0x33, 0x00, 0x00, 0x01, 0x37, 0x00,
- 0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x04, 0x43, 0x00,
- 0x00, 0x04, 0x4a, 0x00, 0x00, 0x04, 0x51, 0x00, 0x00, 0x82, 0x58, 0x00,
- 0x00, 0x04, 0x65, 0x00, 0x00, 0x0d, 0x65, 0x00, 0x00, 0x07, 0x67, 0x00,
- 0x11, 0x81, 0x0d, 0x00, 0x11, 0x05, 0x1b, 0x00, 0x01, 0x08, 0x69, 0x00,
- 0x01, 0x07, 0x6c, 0x00, 0x02, 0x8e, 0x6c, 0x00, 0x11, 0x81, 0x1d, 0x00,
- 0x11, 0x05, 0x1b, 0x00, 0x01, 0x08, 0x69, 0x00, 0x01, 0x07, 0x6c, 0x00,
- 0x12, 0x81, 0x6e, 0x00, 0x12, 0x01, 0x65, 0x00, 0x02, 0x02, 0x76, 0x00,
- 0x02, 0x04, 0x16, 0x00, 0x02, 0x85, 0x6c, 0x00, 0x02, 0x04, 0x1d, 0x00,
- 0x01, 0x8b, 0x6c, 0x00, 0x11, 0x01, 0x1d, 0x00, 0x11, 0x05, 0x6c, 0x00,
- 0x01, 0x08, 0x69, 0x00, 0x01, 0x07, 0x6c, 0x00, 0x12, 0x81, 0x16, 0x00,
- 0x12, 0x03, 0x7e, 0x00, 0x02, 0x08, 0x69, 0x00, 0x02, 0x07, 0x6c, 0x00,
- 0x13, 0x81, 0x6e, 0x00, 0x13, 0x01, 0x65, 0x00, 0x03, 0x02, 0x76, 0x00,
- 0x03, 0x04, 0x85, 0x00, 0x03, 0x82, 0x85, 0x00, 0x03, 0x85, 0x1b, 0x00,
- 0x03, 0x04, 0x1d, 0x00, 0x02, 0x8b, 0x6c, 0x00, 0x12, 0x01, 0x16, 0x00,
- 0x12, 0x03, 0x8a, 0x00, 0x02, 0x08, 0x69, 0x00, 0x02, 0x07, 0x6c, 0x00,
- 0x13, 0x81, 0x6e, 0x00, 0x13, 0x01, 0x65, 0x00, 0x03, 0x02, 0x76, 0x00,
- 0x03, 0x04, 0x8a, 0x00, 0x03, 0x85, 0x67, 0x00, 0x03, 0x04, 0x1d, 0x00,
- 0x02, 0x8b, 0x6c, 0x00, 0x12, 0x01, 0x16, 0x00, 0x12, 0x03, 0x8f, 0x00,
- 0x02, 0x08, 0x69, 0x00, 0x02, 0x07, 0x6c, 0x00, 0x13, 0x81, 0x6e, 0x00,
- 0x13, 0x01, 0x65, 0x00, 0x03, 0x02, 0x76, 0x00, 0x03, 0x04, 0x8f, 0x00,
- 0x03, 0x85, 0x67, 0x00, 0x03, 0x04, 0x1d, 0x00, 0x01, 0x8b, 0x6c, 0x00,
- 0x11, 0x01, 0x1d, 0x00, 0x11, 0x05, 0x67, 0x00, 0x01, 0x08, 0x69, 0x00,
- 0x01, 0x07, 0x6c, 0x00, 0x12, 0x81, 0x16, 0x00, 0x12, 0x03, 0x8a, 0x00,
- 0x02, 0x08, 0x69, 0x00, 0x02, 0x07, 0x6c, 0x00, 0x03, 0x82, 0x8a, 0x00,
- 0x03, 0x07, 0x6c, 0x00, 0x14, 0x81, 0x6e, 0x00, 0x14, 0x01, 0x65, 0x00,
- 0x04, 0x02, 0x76, 0x00, 0x04, 0x04, 0x85, 0x00, 0x04, 0x82, 0x85, 0x00,
- 0x03, 0x85, 0x1b, 0x00, 0x03, 0x04, 0x1d, 0x00, 0x02, 0x8b, 0x6c, 0x00,
- 0x12, 0x01, 0x16, 0x00, 0x12, 0x03, 0x8f, 0x00, 0x02, 0x08, 0x69, 0x00,
- 0x02, 0x07, 0x6c, 0x00, 0x13, 0x81, 0x6e, 0x00, 0x13, 0x01, 0x65, 0x00,
- 0x03, 0x02, 0x76, 0x00, 0x03, 0x04, 0x85, 0x00, 0x03, 0x85, 0x99, 0x00,
- 0x03, 0x04, 0x1d, 0x00, 0x01, 0x8b, 0x6c, 0x00, 0x11, 0x01, 0x1d, 0x00,
- 0x11, 0x05, 0x99, 0x00, 0x01, 0x08, 0x69, 0x00, 0x01, 0x07, 0x6c, 0x00,
- 0x12, 0x81, 0x16, 0x00, 0x12, 0x03, 0x8f, 0x00, 0x02, 0x08, 0x69, 0x00,
- 0x02, 0x07, 0x6c, 0x00, 0x13, 0x81, 0x9b, 0x00, 0x23, 0x01, 0x6e, 0x00,
- 0x23, 0x01, 0x65, 0x00, 0x13, 0x02, 0x76, 0x00, 0x03, 0x08, 0xa2, 0x00,
- 0x03, 0x07, 0x6c, 0x00, 0x04, 0x82, 0x85, 0x00, 0x14, 0x81, 0x6e, 0x00,
- 0x14, 0x01, 0x65, 0x00, 0x24, 0x01, 0x9b, 0x00, 0x24, 0x01, 0x8f, 0x00,
- 0x14, 0x08, 0xa4, 0x00, 0x14, 0x03, 0x6e, 0x00, 0x04, 0x02, 0xa6, 0x00,
- 0x03, 0x85, 0x1b, 0x00, 0x03, 0x04, 0x1d, 0x00, 0x00, 0x86, 0xae, 0x00,
- 0x00, 0x8c, 0x33, 0x00, /* instruct array */
- 0xb1, 0x00, 0x00, 0x00, /* const pool size */
- 0x00, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x2e, 0x6c, 0x65, 0x6e,
- 0x00, 0x6c, 0x65, 0x6e, 0x00, 0x6e, 0x6f, 0x6e, 0x65, 0x00, 0x6d, 0x6f,
- 0x64, 0x65, 0x00, 0x30, 0x00, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x69, 0x6e,
- 0x64, 0x65, 0x78, 0x00, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x69, 0x74,
- 0x65, 0x72, 0x00, 0x5f, 0x6c, 0x30, 0x00, 0x5f, 0x72, 0x31, 0x00, 0x5f,
- 0x72, 0x32, 0x00, 0x5f, 0x72, 0x33, 0x00, 0x5f, 0x6c, 0x30, 0x2e, 0x61,
- 0x31, 0x00, 0x5f, 0x6c, 0x30, 0x2e, 0x61, 0x32, 0x00, 0x5f, 0x6c, 0x30,
- 0x2e, 0x61, 0x33, 0x00, 0x5f, 0x6c, 0x30, 0x2e, 0x5f, 0x5f, 0x6e, 0x65,
- 0x78, 0x74, 0x5f, 0x5f, 0x00, 0x69, 0x00, 0x32, 0x00, 0x3d, 0x3d, 0x00,
- 0x31, 0x00, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x00, 0x5f, 0x5f,
- 0x67, 0x65, 0x74, 0x5f, 0x5f, 0x00, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73,
- 0x00, 0x74, 0x6f, 0x64, 0x6f, 0x00, 0x77, 0x68, 0x65, 0x6e, 0x00, 0x70,
- 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x6d, 0x73, 0x00, 0x33, 0x00, 0x5f,
- 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x00, 0x3e, 0x00, 0x2b, 0x00, 0x5f, 0x5f,
- 0x73, 0x65, 0x74, 0x5f, 0x5f, 0x00, 0x2d, 0x31, 0x00, /* const pool */
- };
- ByteCodeFrame bytecode_frame = {.const_pool =
- {
- .arg_buff = NULL,
- .content_offset_now = 0,
- .size = 0,
- .content_start = NULL,
- .output_redirect_fun = NULL,
- .output_f = NULL,
- },
- .instruct_array = {
- .arg_buff = NULL,
- .content_offset_now = 0,
- .size = 0,
- .content_start = NULL,
- .output_redirect_fun = NULL,
- .output_f = NULL,
- }};
- byteCodeFrame_loadByteCode(&bytecode_frame, (uint8_t*)bytes);
- byteCodeFrame_print(&bytecode_frame);
- EXPECT_EQ(instructArray_getSize(&(bytecode_frame.instruct_array)), 520);
- EXPECT_EQ(bytecode_frame.const_pool.size, 177);
- byteCodeFrame_deinit(&bytecode_frame);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, multi_jian) {
- pikaMemInfo.heapUsedMax = 0;
- Args* buffs = New_strBuff();
- char* lines = "a = (3-4) - 4\n";
- printf("%s", lines);
- char* pikaAsm = Parser_linesToAsm(buffs, lines);
- printf("%s", pikaAsm);
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* self = newRootObj("pikaMain", New_PikaMain);
- pikaVM_run(self, lines);
- /* assert */
- int a = obj_getInt(self, "a");
- EXPECT_EQ(a, -5);
- /* deinit */
- args_deinit(buffs);
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, _3_p_3) {
- char* line = "-3+3";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[0], "0\r\n");
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, _3_3) {
- char* line = "-3-3";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[0], "-6\r\n");
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, a_3) {
- char* line = "a-3";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[2], "NameError: name 'a' is not defined\r\n");
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, hex_str) {
- char* line = "a = '\\x33\\x35'";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* collect */
- char* a = obj_getStr(self, "a");
- /* assert */
- EXPECT_STREQ(a, "35");
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, hex_bytes) {
- char* line =
- "a = b'\\x03\\x05'\n"
- "a\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "b'\\x03\\x05'\r\n");
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, bytes_equ) {
- char* line =
- "a = b'\\x03\\x05'\n"
- "b = b'\\x03\\x05'\n"
- "if a == b:\n"
- " c = 1\n"
- "b = b'\\x02\\x05'\n"
- "if a != b:\n"
- " d = 1\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* collect */
- /* assert */
- int c = obj_getInt(self, "c");
- int d = obj_getInt(self, "d");
- EXPECT_EQ(c, 1);
- EXPECT_EQ(d, 1);
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if PIKA_BUILTIN_STRUCT_ENABLE
- TEST(VM, tuple_literal) {
- char* line = "(1,2,3)\n";
- Args* buffs = New_strBuff();
- char* pikaAsm = Parser_linesToAsm(buffs, line);
- printf("%s", pikaAsm);
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- __platform_printf("BEGIN\r\n");
- pikaVM_runAsm(self, pikaAsm);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "(1, 2, 3)\r\n");
- EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
- /* deinit */
- obj_deinit(self);
- args_deinit(buffs);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(VM, dvd_opt) {
- char* line = "a = 10%4\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- int a = obj_getInt(self, "a");
- /* assert */
- EXPECT_EQ(a, 2);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, del_) {
- char* line =
- "a = 1\n"
- "print(a)\n"
- "del a\n"
- "print(a)\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_EQ(obj_isArgExist(self, "a"), 0);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, is) {
- char* line =
- "a = 1\n"
- "b = a\n"
- "res1 = a is b\n"
- "res2 = 1 is 1\n"
- "c = TinyObj()\n"
- "d = c\n"
- "res3 = c is d\n"
- "res4 = c is None\n";
- ;
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_EQ(obj_getInt(self, "res1"), 1);
- EXPECT_EQ(obj_getInt(self, "res2"), 1);
- EXPECT_EQ(obj_getInt(self, "res3"), 1);
- EXPECT_EQ(obj_getInt(self, "res4"), 0);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, in) {
- char* line =
- "res1 = 'a' in 'aaa'\n"
- "res2 = 'aaa' in 'a'\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_EQ(obj_getInt(self, "res1"), 1);
- EXPECT_EQ(obj_getInt(self, "res2"), 0);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(VM, assert) {
- char* line =
- "assert True\n"
- "assert 1 == 1, 'testparser'\n"
- "res1 = 0\n"
- "try:\n"
- " assert False\n"
- "except:\n"
- " res1 = 1\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- int res1 = obj_getInt(self, "res1");
- /* assert */
- EXPECT_EQ(res1, 1);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(VM, issue_I5LHJG) {
- char* line =
- "res = (a, 2, 3)\n"
- "[a, 2, 3]\n"
- "{'x': a, 'y': 2, 'z': 3}\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_EQ(obj_isArgExist(self, "res"), 0);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, vars_runtime) {
- char* line =
- "def testvars(a, *b):\n"
- " sum = 0\n"
- " for i in b:\n"
- " sum += i\n"
- " return a * sum\n"
- "res = testvars(6, 2, 3, 4, 5)\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- int res = obj_getInt(self, "res");
- /* assert */
- EXPECT_EQ(res, 84);
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if PIKA_BUILTIN_STRUCT_ENABLE
- TEST(VM, list_add) {
- char* line = "[1, 2, 3] + [4, 5, 6]";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "[1, 2, 3, 4, 5, 6]\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(VM, science_num) {
- char* line =
- "a = 1.0e-3\n"
- "b = 2e-5\n"
- "c = -3e-5\n"
- "d = 0.4e2\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- double a = obj_getFloat(self, "a");
- double b = obj_getFloat(self, "b");
- double c = obj_getFloat(self, "c");
- double d = obj_getFloat(self, "d");
- /* assert */
- #if PIKA_FLOAT_TYPE_DOUBLE
- EXPECT_DOUBLE_EQ(a, 1.0e-3);
- EXPECT_DOUBLE_EQ(b, 2.0e-5);
- EXPECT_DOUBLE_EQ(c, -3e-5);
- EXPECT_DOUBLE_EQ(d, 0.4e2);
- #else
- EXPECT_FLOAT_EQ(a, 1.0e-3);
- EXPECT_FLOAT_EQ(b, 2.0e-5);
- EXPECT_FLOAT_EQ(c, -3e-5);
- EXPECT_FLOAT_EQ(d, 0.4e2);
- #endif
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, issue_I5OJQB) {
- char* line = "s = '\\\\'";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- char* s = obj_getStr(self, "s");
- /* assert */
- EXPECT_STREQ(s, "\\");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(vm, keyword_2) {
- char* line =
- "def test(a, b):\n"
- " print(a, b)\n"
- "test(a=1, b= 2)";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, keyword_3) {
- char* line =
- "def test(**keys):\n"
- " print(keys['a'], keys['b'])\n"
- "test(a=1, b= 2)";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, keyword_4) {
- char* line =
- "def test(a, b, **keys):\n"
- " print(keys['c'], keys['d'], a, b)\n"
- "test(3, 4, c=1, d= 2)";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2 3 4\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, class_keyword) {
- char* line =
- "class Test:\n"
- " def __init__(self, a, b = 1, c =2):\n"
- " print(a, b, c)\n"
- "t = Test(0, b = 3)\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "0 3 2\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, class_keyword_mqtt) {
- char* line =
- "class MQTT:\n"
- " def __init__(self,\n"
- " ip: str,\n"
- " port=1883,\n"
- " clinetID='mac',\n"
- " username='',\n"
- " password='',\n"
- " version='3.1.1',\n"
- " ca='',\n"
- " keepalive=60):\n"
- " print('ip:', ip)\n"
- " print('port:', port)\n"
- "c = MQTT('test')\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[1], "ip: test\r\n");
- EXPECT_STREQ(log_buff[0], "port: 1883\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, vars_keyward) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- pikaVM_runSingleFile(pikaMain, "../../examples/BuiltIn/function.py");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[1], "1 2 3 4 5 10\r\n");
- EXPECT_STREQ(log_buff[0], "1 2 3 4 5 12\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, cb_1) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- pikaVM_runSingleFile(pikaMain, "../../examples/Callback/test1.py");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[3], "__init__\r\n");
- EXPECT_STREQ(log_buff[1], "a\r\n");
- EXPECT_STREQ(log_buff[0], "b\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, cb_2) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- pikaVM_runSingleFile(pikaMain, "../../examples/Callback/test2.py");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[4], "__init__\r\n");
- EXPECT_STREQ(log_buff[2], "a\r\n");
- EXPECT_STREQ(log_buff[1], "b\r\n");
- EXPECT_STREQ(log_buff[0], "ppp\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- #if !PIKA_NANO_ENABLE
- TEST(vm, default_no_input) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a = 1):\n"
- " print(a)\n"
- "test()");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, default_1) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a = 1):\n"
- " print(a)\n"
- "test(a = 2)");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "2\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, default_2) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a, b = 1):\n"
- " print(a, b)\n"
- "test(1, b = 2)");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, default_3) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def myprint(end='\\n', *var):\n"
- " for v in var:\n"
- " print(v, end = end)\n"
- "myprint(1, 2)\n"
- "myprint(1, 2, end=';\\n')\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[3], "1\n");
- EXPECT_STREQ(log_buff[2], "2\n");
- EXPECT_STREQ(log_buff[1], "1;\n");
- EXPECT_STREQ(log_buff[0], "2;\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, default_4) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(end=5, *var):\n"
- " res = end\n"
- " print('end', end)\n"
- " for v in var:\n"
- " res += v\n"
- " return res\n"
- "test(1, 2, 3)\n"
- "test(1, 2, 3, end=6)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[3], "end 5\r\n");
- EXPECT_STREQ(log_buff[2], "11\r\n");
- EXPECT_STREQ(log_buff[1], "end 6\r\n");
- EXPECT_STREQ(log_buff[0], "12\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, default_no_kw) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a, b=3):\n"
- " print(a ,b)\n"
- "test(1, 2)\n"
- "test(1, b=2)\n"
- "test(1)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[2], "1 2\r\n");
- EXPECT_STREQ(log_buff[1], "1 2\r\n");
- EXPECT_STREQ(log_buff[0], "1 3\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(vm, none) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain, "GTestTask.test(1, None)");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "GTestTask_test: 1, 0\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(vm, super_) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " def __init__(self):\n"
- " print('in test init')\n"
- "class test2(test):\n"
- " def __init__(self):\n"
- " super().__init__()\n"
- " print('in test2 init')\n"
- "t = test2()");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "in test2 init\r\n");
- EXPECT_STREQ(log_buff[1], "in test init\r\n");
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, super_val) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " def __init__(self):\n"
- " self.a = 1\n"
- " self.b = 2\n"
- "class test2(test):\n"
- " def __init__(self):\n"
- " super().__init__()\n"
- " self.c = 3\n"
- " self.d = 4\n"
- "t = test2()\n"
- "print(t.a, t.b, t.c, t.d)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[0], "1 2 3 4\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, super_val_) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " def test(self, a):\n"
- " self.a = a\n"
- "class test2(test):\n"
- " def test(self, a):\n"
- " super().test(str(a))\n"
- "t1 = test()\n"
- "t2 = test2()\n"
- "t1.test(1)\n"
- "t2.test(1)\n");
- /* collect */
- int t1_a = obj_getInt(pikaMain, "t1.a");
- char* t2_a = obj_getStr(pikaMain, "t2.a");
- /* assert */
- EXPECT_EQ(t1_a, 1);
- EXPECT_STREQ(t2_a, "1");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- #if !PIKA_NANO_ENABLE
- TEST(vm, multi_return) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain, "a,b = (1,2)");
- /* collect */
- int a = obj_getInt(pikaMain, "a");
- int b = obj_getInt(pikaMain, "b");
- /* assert */
- EXPECT_EQ(a, 1);
- EXPECT_EQ(b, 2);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- #if !PIKA_NANO_ENABLE
- TEST(vm, multi_return_fn) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test():\n"
- " return 1,2\n"
- "a,b = test()");
- /* collect */
- int a = obj_getInt(pikaMain, "a");
- int b = obj_getInt(pikaMain, "b");
- /* assert */
- EXPECT_EQ(a, 1);
- EXPECT_EQ(b, 2);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(vm, range_1) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "sum = 0\n"
- "for i in range(10):\n"
- " sum += i\n");
- /* collect */
- int sum = obj_getInt(pikaMain, "sum");
- /* assert */
- EXPECT_EQ(sum, 45);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, rang_3) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "sum = 0\n"
- "for i in range(-5, 20, 2):\n"
- " sum += i\n");
- /* collect */
- int sum = obj_getInt(pikaMain, "sum");
- /* assert */
- EXPECT_EQ(sum, 91);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, test64) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "import GTestTask\n"
- "res = GTestTask.test64(4294967295, 20)\n");
- /* collect */
- int64_t res = obj_getInt(pikaMain, "res");
- /* assert */
- EXPECT_EQ(res, 4294967295 * 20);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(vm, exit) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "i = 0\n"
- "while True:\n"
- " i += 1\n"
- " print(i)\n"
- " if i == 10:\n"
- " exit()\n");
- /* collect */
- int i = obj_getInt(pikaMain, "i");
- /* assert */
- EXPECT_EQ(i, 10);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, exit_fn) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "i = 0\n"
- "PikaStdLib.MemChecker.now()\n"
- "def test():\n"
- " global i\n"
- " while True:\n"
- " i += 1\n"
- " print(i)\n"
- " if i == 10:\n"
- " exit()\n"
- "while True:\n"
- " test()\n");
- obj_run(pikaMain, "PikaStdLib.MemChecker.now()\n");
- /* collect */
- int i = obj_getInt(pikaMain, "i");
- /* assert */
- EXPECT_EQ(i, 10);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- #if PIKA_INSTRUCT_HOOK_ENABLE
- typedef void (*hook_func)(void);
- extern volatile int g_hook_cnt;
- extern volatile hook_func g_hook_func;
- extern "C" {
- volatile int g_hook_cnt_triggle;
- void hook_func_exit_issue_1(void) {
- if (g_hook_cnt >= g_hook_cnt_triggle) {
- pks_vm_exit();
- }
- }
- void __gtest_hook_default_(void) {
- return;
- }
- }
- void _vm_exit_fn_issue_1_item(int hook_cnt) {
- g_hook_cnt_triggle = hook_cnt;
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "PikaStdLib.MemChecker.now()\n"
- "def task1():\n"
- " print('task1 hello')\n"
- "\n"
- "def task2():\n"
- " print('task2 hello')\n"
- "\n"
- "def fake_runtask():\n"
- " i = 0\n"
- " while True:\n"
- " i += 1\n"
- " print(i)\n"
- " task1()\n"
- " task2()\n"
- "fake_runtask()\n"
- "fake_runtask()\n"
- "\n");
- obj_run(pikaMain, "PikaStdLib.MemChecker.now()\n");
- /* collect */
- /* assert */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, exit_fn_issue_1) {
- g_hook_func = hook_func_exit_issue_1;
- for (int i = 0; i < 50; i++) {
- g_hook_cnt = 0;
- _vm_exit_fn_issue_1_item(i);
- }
- g_hook_func = __gtest_hook_default_;
- }
- #endif
- TEST(vm, pass_) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "pass\n"
- "def testpass():\n"
- " pass\n"
- "for i in range(10):\n"
- " pass\n"
- "testpass()\n"
- "print('after pass')\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "after pass\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, test64_hex) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "import GTestTask\n"
- "res = GTestTask.test64(0xffffffff, 20)\n");
- /* collect */
- int64_t res = obj_getInt(pikaMain, "res");
- /* assert */
- EXPECT_EQ(res, 4294967295 * 20);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, test64_hex_print) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "0xffffffff\n"
- "print(0xffffffff)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "4294967295\r\n");
- EXPECT_STREQ(log_buff[1], "4294967295\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(vm, call_dict_err) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "a = {'a': 1}\n"
- "a('a')\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[4], "TypeError: 'a' object is not callable\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, getattribute) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " def __getattribute__(self, name):\n"
- " return name\n"
- "t = test()\n"
- "t.a\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "'a'\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, getattr) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " a = 1\n"
- " def __getattr__(self, name):\n"
- " return name\n"
- "t = test()\n"
- "t.a\n"
- "t.b\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "'b'\r\n");
- EXPECT_STREQ(log_buff[1], "1\r\n");
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, setattr) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " a = 1\n"
- " def __setattr__(self, name, val):\n"
- " print((name, val))\n"
- "t = test()\n"
- "t.a = 1\n"
- "t.b = 'test'\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[2], "BEGIN\r\n");
- EXPECT_STREQ(log_buff[1], "('a', 1)\r\n");
- EXPECT_STREQ(log_buff[0], "('b', 'test')\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, c_module_get_set_attr) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "t = GTestTask.ProxyTest()\n"
- "t.a\n"
- "t.b\n"
- "t.a = 'test1'\n"
- "t.b = 'test2'\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[3], "'a'\r\n");
- EXPECT_STREQ(log_buff[2], "'b'\r\n");
- EXPECT_STREQ(log_buff[1], "GTestTask_ProxyTest___setattr__: a, test1\r\n");
- EXPECT_STREQ(log_buff[0], "GTestTask_ProxyTest___setattr__: b, test2\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, class_attr_ref) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " a = 1\n"
- " b = a\n"
- "t = test()\n");
- /* collect */
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, getattr_native) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "mem = PikaStdLib.MemChecker()\n"
- "if hasattr(mem, 'max'):\n"
- " max = getattr(mem, 'max')\n"
- " max()\n");
- /* collect */
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, issue_dict_update) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- pikaVM_runSingleFile(pikaMain, "test/python/issue/issue_dict_update.py");
- /* collect */
- /* assert */
- EXPECT_STREQ(obj_getStr(pikaMain, "inner"), "widget5");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, issue_big_dict_update) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- pikaVM_runSingleFile(pikaMain,
- "test/python/issue/issue_big_dict_update.py");
- /* collect */
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(vm, i_pp) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- /* clang-format off */
- PIKA_PYTHON(
- i = 0
- while i < 10000:
- i += 1
- )
- /* clang-format on */
- const uint8_t bytes[] = {
- 0x30, 0x00, 0x00, 0x00, /* instruct array size */
- 0x00, 0x85, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x10, 0x81, 0x03, 0x00,
- 0x10, 0x05, 0x05, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x07, 0x0d, 0x00,
- 0x11, 0x81, 0x03, 0x00, 0x21, 0x05, 0x0f, 0x00, 0x11, 0x02, 0x00, 0x00,
- 0x01, 0x08, 0x11, 0x00, 0x01, 0x04, 0x03, 0x00, 0x00, 0x86, 0x13, 0x00,
- /* instruct array */
- 0x16, 0x00, 0x00, 0x00, /* const pool size */
- 0x00, 0x30, 0x00, 0x69, 0x00, 0x31, 0x30, 0x30, 0x30, 0x30, 0x00, 0x3c,
- 0x00, 0x32, 0x00, 0x31, 0x00, 0x2b, 0x00, 0x2d, 0x31,
- 0x00, /* const pool */
- };
- pikaVM_runByteCode(pikaMain, (uint8_t*)bytes);
- EXPECT_EQ(obj_getInt(pikaMain, "i"), 10000);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, benchmark) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- /* run */
- __platform_printf("BEGIN\r\n");
- /* clang-format off */
- PIKA_PYTHON(
- num = 0
- i = 2
- while i < 1000:
- is_prime = 1
- j = 2
- while j < i:
- if i%j==0 :
- is_prime = 0
- break
- j += 1
- if is_prime:
- num = num + i
- i += 1
- )
- /* clang-format on */
- const uint8_t bytes[] = {
- 0xac, 0x00, 0x00, 0x00, /* instruct array size */
- 0x00, 0x85, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x85, 0x07, 0x00,
- 0x00, 0x04, 0x09, 0x00, 0x10, 0x81, 0x09, 0x00, 0x10, 0x05, 0x0b, 0x00,
- 0x00, 0x08, 0x10, 0x00, 0x00, 0x07, 0x07, 0x00, 0x01, 0x85, 0x12, 0x00,
- 0x01, 0x04, 0x14, 0x00, 0x01, 0x85, 0x07, 0x00, 0x01, 0x04, 0x1d, 0x00,
- 0x11, 0x81, 0x1d, 0x00, 0x11, 0x01, 0x09, 0x00, 0x01, 0x08, 0x10, 0x00,
- 0x01, 0x07, 0x07, 0x00, 0x22, 0x81, 0x09, 0x00, 0x22, 0x01, 0x1d, 0x00,
- 0x12, 0x08, 0x1f, 0x00, 0x12, 0x05, 0x01, 0x00, 0x02, 0x08, 0x21, 0x00,
- 0x02, 0x07, 0x12, 0x00, 0x03, 0x85, 0x01, 0x00, 0x03, 0x04, 0x14, 0x00,
- 0x03, 0x8e, 0x00, 0x00, 0x12, 0x81, 0x1d, 0x00, 0x22, 0x05, 0x12, 0x00,
- 0x12, 0x02, 0x00, 0x00, 0x02, 0x08, 0x24, 0x00, 0x02, 0x04, 0x1d, 0x00,
- 0x01, 0x86, 0x26, 0x00, 0x01, 0x81, 0x14, 0x00, 0x01, 0x07, 0x12, 0x00,
- 0x12, 0x81, 0x03, 0x00, 0x12, 0x01, 0x09, 0x00, 0x02, 0x08, 0x24, 0x00,
- 0x02, 0x04, 0x03, 0x00, 0x11, 0x81, 0x09, 0x00, 0x21, 0x05, 0x12, 0x00,
- 0x11, 0x02, 0x00, 0x00, 0x01, 0x08, 0x24, 0x00, 0x01, 0x04, 0x09, 0x00,
- 0x00, 0x86, 0x26, 0x00, /* instruct array */
- 0x29, 0x00, 0x00, 0x00, /* const pool size */
- 0x00, 0x30, 0x00, 0x6e, 0x75, 0x6d, 0x00, 0x32, 0x00, 0x69, 0x00, 0x31,
- 0x30, 0x30, 0x30, 0x00, 0x3c, 0x00, 0x31, 0x00, 0x69, 0x73, 0x5f, 0x70,
- 0x72, 0x69, 0x6d, 0x65, 0x00, 0x6a, 0x00, 0x25, 0x00, 0x3d, 0x3d, 0x00,
- 0x2b, 0x00, 0x2d, 0x31, 0x00, /* const pool */
- };
- pikaVM_runByteCode(pikaMain, (uint8_t*)bytes);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, print_None) {
- char* line = "print(None)\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "None\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, bc_fn) {
- PikaObj* self = newRootObj("root", New_PikaMain);
- obj_run(self, "print('hello world')\n");
- /* clang-format off */
- PIKA_PYTHON(
- def test():
- print('test')
- )
- /* clang-format on */
- const uint8_t
- bytes[] =
- {
- 0x14, 0x00, 0x00, 0x00, /* instruct array size */
- 0x00, 0x89, 0x01, 0x00, 0x00, 0x06, 0x08,
- 0x00, 0x11, 0x83, 0x0a, 0x00, 0x01, 0x02,
- 0x0f, 0x00, 0x01, 0x8a, 0x00, 0x00, /* instruct array */
- 0x15, 0x00, 0x00, 0x00, /* const pool size */
- 0x00, 0x74, 0x65, 0x73, 0x74, 0x28, 0x29,
- 0x00, 0x31, 0x00, 0x74, 0x65, 0x73, 0x74,
- 0x00, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x00, /* const pool */
- };
- pikaVM_runByteCode(self, (uint8_t*)bytes);
- obj_run(self, "test()\n");
- EXPECT_STREQ(log_buff[1], "hello world\r\n");
- EXPECT_STREQ(log_buff[0], "test\r\n");
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(VM, default_num_err) {
- char* line =
- "def test(a, b=1):\n"
- " print(a, b)\n"
- "test(1, 2, 3)\n";
- PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
- obj_run(self, line);
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[8],
- "TypeError: test() takes from 1 to 2 positional arguments but "
- "3 were given\r\n");
- /* deinit */
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST(VM, bc_fn_file_cb0) {
- PikaObj* self = newRootObj("root", New_PikaMain);
- pikaVM_runByteCodeFile(self,
- "package/pikascript/pikascript-api/cb_test.py.o");
- obj_run(self, "test()\n");
- EXPECT_STREQ(log_buff[0], "test\r\n");
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(VM, bc_fn_file_cb2) {
- PikaObj* self = newRootObj("root", New_PikaMain);
- obj_run(self, "print('hello world')\n");
- pikaVM_runByteCodeFile(self,
- "package/pikascript/pikascript-api/cb_test.py.o");
- obj_run(self, "test()\n");
- EXPECT_STREQ(log_buff[1], "hello world\r\n");
- EXPECT_STREQ(log_buff[0], "test\r\n");
- obj_deinit(self);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #if !PIKA_NANO_ENABLE
- TEST(vm, slice_str_end) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain, "'test'[:-1]");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "'tes'\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- #if !PIKA_NANO_ENABLE
- TEST(vm, fn_pos_kw) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a, b):\n"
- " print(a, b)\n"
- "test(b=1,a=2)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "2 1\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_pos_kw2) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(a, b):\n"
- " print(a, b)\n"
- "test(1, b=2)\n"
- "test(1, a=2)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[1], "1 2\r\n");
- EXPECT_STREQ(log_buff[0], "2 1\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_star) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "a = (1,2,3)\n"
- "print(*a)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2 3\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_star_pos) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "a = (1,2,3)\n"
- "print(*a, 4)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2 3 4\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_star_pos_2) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "a = (1,2,3)\n"
- "print(0, *a, 4)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "0 1 2 3 4\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_star_star) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def test(**kw):\n"
- " print(kw['a'], kw['b'], kw['c'])\n"
- "a = {'a':1,'b':2,'c':3}\n"
- "test(**a)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2 3\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, issue_keyword_mem_leak) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- pikaVM_runSingleFile(pikaMain,
- "test/python/issue/issue_keyword_mem_leak.py");
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, issue_not_in) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- obj_run(pikaMain,
- "a = [1,2,3]\n"
- "print(1 not in a)\n"
- "print(4 not in a)\n");
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, def_not_in) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- extern unsigned char pikaModules_py_a[];
- obj_linkLibrary(pikaMain, pikaModules_py_a);
- obj_run(pikaMain,
- "t = ['hmac-md5', 'other']\n"
- "def test(a=\"hmac-md5\"):\n"
- " print(\"input:\", a)\n"
- " print(\"table:\", t)\n"
- " if a not in t:\n"
- " print(\"a not in t\")\n"
- " else:\n"
- " print(\"a in t\")\n"
- "test()\n");
- /* assert */
- EXPECT_STREQ(log_buff[0], "a in t\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST_END
|