| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699 |
- #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, _PIKA_INT_ERR);
- 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, _PIKA_INT_ERR);
- /* b is local, should not be exist in globals */
- EXPECT_EQ(b, _PIKA_INT_ERR);
- 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, _PIKA_INT_ERR);
- /* 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_getBool(self, "res1"), PIKA_TRUE);
- EXPECT_EQ(obj_getBool(self, "res2"), PIKA_TRUE);
- EXPECT_EQ(obj_getBool(self, "res3"), PIKA_TRUE);
- EXPECT_EQ(obj_getBool(self, "res4"), PIKA_FALSE);
- /* 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[7], "__init__\r\n");
- EXPECT_STREQ(log_buff[5], "a\r\n");
- EXPECT_STREQ(log_buff[4], "a\r\n");
- EXPECT_STREQ(log_buff[3], "b\r\n");
- EXPECT_STREQ(log_buff[2], "b\r\n");
- EXPECT_STREQ(log_buff[1], "ppp\r\n");
- EXPECT_STREQ(log_buff[0], "ppp\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, cb_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");
- pikaVM_runSingleFile(pikaMain, "test/python/callback/test3.py");
- /* collect */
- /* 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);
- }
- TEST(vm, fn_pos_kw_issue1) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def new(a=1, b=2):\n"
- " print(a, b)\n"
- "new(3, b = 2)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "3 2\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_pos_kw_issue2) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "def new(key:any, msg=None, digestmod=\"md5\"):\n"
- " print(key, msg, digestmod)\n"
- "new('123','456',digestmod=\"md5\")\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "123 456 md5\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, num_issue_lakj) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain, "a = 1/2*3\n");
- /* collect */
- /* assert */
- EXPECT_DOUBLE_EQ(obj_getFloat(pikaMain, "a"), 1.5);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, dir_issue) {
- /* init */
- pikaMemInfo.heapUsedMax = 0;
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- /* run */
- __platform_printf("BEGIN\r\n");
- obj_run(pikaMain,
- "class test:\n"
- " pass\n"
- "dir(test)\n");
- /* collect */
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, dir_issue1lk) {
- /* 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 requests\n"
- "dir(requests)\n");
- /* collect */
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, type_int) {
- /* 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 = type(1)\n"
- "ii = i(10)\n");
- /* collect */
- EXPECT_EQ(obj_getInt(pikaMain, "ii"), 10);
- /* assert */
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, method_int) {
- /* 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 = int\n"
- "ii = i(10)\n");
- /* collect */
- /* assert */
- EXPECT_EQ(obj_getInt(pikaMain, "ii"), 10);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, fn_method_int) {
- /* 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"
- " i = int\n"
- " ii = i(10)\n"
- " return ii\n"
- "ii = test()\n");
- /* collect */
- /* assert */
- EXPECT_EQ(obj_getInt(pikaMain, "ii"), 10);
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, kw_no_empty) {
- /* 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=None, b=None, c=None):\n"
- " print(a, b, c)\n"
- "test(1, 2)\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "1 2 None\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, tuple_void) {
- /* 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, "()\n");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "()\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, run_file) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- pikaVM_runFile(pikaMain, "package/pikascript/main.py");
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, bool_) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- obj_run(pikaMain, "print(True)\n");
- obj_deinit(pikaMain);
- EXPECT_STREQ(log_buff[0], "True\r\n");
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, method_cb) {
- PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
- obj_run(pikaMain,
- "class Test:\n"
- " _cb = None\n"
- " def callback(self):\n"
- " print('test')\n"
- " def addcb(self, cb):\n"
- " self._cb = cb\n"
- " def runcb(self):\n"
- " self._cb()\n"
- " def __init__(self):\n"
- " self.addcb(self.callback)\n"
- "t = Test()\n"
- "t.runcb()");
- obj_deinit(pikaMain);
- EXPECT_STREQ(log_buff[0], "test\r\n");
- EXPECT_EQ(pikaMemNow(), 0);
- }
- TEST(vm, class_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");
- pikaVM_runSingleFile(pikaMain, "test/python/callback/class_getattr.py");
- /* collect */
- /* assert */
- EXPECT_STREQ(log_buff[0], "2\r\n");
- EXPECT_STREQ(log_buff[1], "1\r\n");
- /* deinit */
- obj_deinit(pikaMain);
- EXPECT_EQ(pikaMemNow(), 0);
- }
- #endif
- TEST_END
|