| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653 |
- #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[6], "__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);
- }
- #endif
- TEST_END
|