From 7365c41e11c7971cad07e951769e85b8c3efd111 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 9 Aug 2021 16:37:33 +0200 Subject: [PATCH] vorschlag tests --- mytest/test_boolean.py | 71 +++++++++++++++++++++++++++ mytest/test_double.py | 53 ++++++++++++++++++++ mytest/test_gc.py | 109 +++++++++++++++++++++++++++++++++++++++++ mytest/test_string.py | 35 +++++++++++++ mytest/test_sugar.py | 49 ++++++++++++++++++ mytest/testcases.zip | Bin 0 -> 2502 bytes 6 files changed, 317 insertions(+) create mode 100644 mytest/test_boolean.py create mode 100644 mytest/test_double.py create mode 100644 mytest/test_gc.py create mode 100644 mytest/test_string.py create mode 100644 mytest/test_sugar.py create mode 100644 mytest/testcases.zip diff --git a/mytest/test_boolean.py b/mytest/test_boolean.py new file mode 100644 index 0000000..9f98c3b --- /dev/null +++ b/mytest/test_boolean.py @@ -0,0 +1,71 @@ +import py + +from simpleparser import parse +from objmodel import W_NormalObject, W_Integer +from interpreter import Interpreter + + +def test_boolean_assignment(): + ast = parse(""" +x = true +y = false +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Boolean) + assert w_model.getvalue("x").istrue() is True + assert isinstance(w_model.getvalue("y"), W_Boolean) + assert w_model.getvalue("y").istrue() is False + + +def test_boolean_operations(): + ast = parse(""" +x = true and(false) +y = true or(false) +z = not(true) +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Boolean) + assert w_model.getvalue("x").istrue() is False + assert isinstance(w_model.getvalue("y"), W_Boolean) + assert w_model.getvalue("y").istrue() is True + assert isinstance(w_model.getvalue("z"), W_Boolean) + assert w_model.getvalue("z").istrue() is False + + +def test_boolean_result(): + ast = parse(""" +x = 1 eq(2) +y = 1 leq(2) +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Boolean) + assert w_model.getvalue("x").istrue() is False + assert isinstance(w_model.getvalue("y"), W_Boolean) + assert w_model.getvalue("y").istrue() is True + + +def test_boolean_conversion(): + ast = parse(""" +x = 1 toboolean +y = true toint +z = false toint +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Boolean) + assert w_model.getvalue("x").istrue() is True + assert isinstance(w_model.getvalue("y"), W_Integer) + assert w_model.getvalue("y").value == 1 + assert isinstance(w_model.getvalue("z"), W_Integer) + assert w_model.getvalue("z").value == 0 diff --git a/mytest/test_double.py b/mytest/test_double.py new file mode 100644 index 0000000..9883744 --- /dev/null +++ b/mytest/test_double.py @@ -0,0 +1,53 @@ +import py + +from simpleparser import parse +from objmodel import W_NormalObject, W_Integer +from interpreter import Interpreter + + +def test_double_assignment(): + ast = parse(""" +x = 1.5 +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Double) + assert w_model.getvalue("x").value == 1.5 + + +def test_double_operations(): + ast = parse(""" +x = 3 div(2) +y = 3 div(2.0) +z = 3.0 div(2.0) +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Integer) + assert w_model.getvalue("x").value == 1 + assert isinstance(w_model.getvalue("y"), W_Integer) + assert w_model.getvalue("y").value == 1 + assert isinstance(w_model.getvalue("z"), W_Double) + assert w_model.getvalue("z").value == 1.5 + + +def test_double_conversion(): + ast = parse(""" +x = 1.5 toint +y = 2.0 toint +z = 3 todouble +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_Integer) + assert w_model.getvalue("x").value == 1 + assert isinstance(w_model.getvalue("y"), W_Integer) + assert w_model.getvalue("y").value == 2 + assert isinstance(w_model.getvalue("z"), W_Double) + assert w_model.getvalue("z").value == 3.0 diff --git a/mytest/test_gc.py b/mytest/test_gc.py new file mode 100644 index 0000000..153654a --- /dev/null +++ b/mytest/test_gc.py @@ -0,0 +1,109 @@ +import py + +from simpleparser import parse +from objmodel import W_NormalObject, W_Integer +from interpreter import Interpreter + + +def test_reassignment_gc(): + ast = parse(""" +x = 2 +y = 3 +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + x = w_model.getvalue("x") + y = w_model.getvalue("y") + assert x in interpreter.space.realm # Wo alle Objekte leben + assert y in interpreter.space.realm + + ast = parse(""" +x = y +""") + interpreter.eval(ast, w_model) + interpreter.space.gc() + assert x not in interpreter.space.realm + assert y in interpreter.space.realm + + ast = parse(""" +x = 0 +""") + interpreter.eval(ast, w_model) + interpreter.space.gc() + assert x not in interpreter.space.realm + assert y not in interpreter.space.realm + + +def test_chain_gc(): + ast = parse(""" +x = 1 +y = x +z = y +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + x = w_model.getvalue("x") + assert x in interpreter.space.realm + + ast = parse(""" +x = 0 +""") + interpreter.eval(ast, w_model) + interpreter.space.gc() + assert x in interpreter.space.realm + + ast = parse(""" +y = x +z = y +""") + interpreter.eval(ast, w_model) + interpreter.space.gc() + assert x not in interpreter.space.realm + + +def test_while_gc(): + ast = parse(""" +x = 10 +while x: + x = x $int_add(-1) +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + count = len(interpreter.space.realm) + interpreter.space.gc() + + assert count - len(interpreter.space.realm) == 10 + + +def test_object_gc(): + ast = parse(""" +object x: + a = 1 + b = 2 + c = 3 +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + a = w_model.getvalue("x").getvalue("a") + b = w_model.getvalue("x").getvalue("b") + c = w_model.getvalue("x").getvalue("c") + assert a in interpreter.space.realm + assert b in interpreter.space.realm + assert c in interpreter.space.realm + + ast = parse(""" +x = 0 +""") + interpreter.eval(ast, w_model) + interpreter.space.gc() + assert a not in interpreter.space.realm + assert b not in interpreter.space.realm + assert c not in interpreter.space.realm diff --git a/mytest/test_string.py b/mytest/test_string.py new file mode 100644 index 0000000..a3e6622 --- /dev/null +++ b/mytest/test_string.py @@ -0,0 +1,35 @@ +import py + +from simpleparser import parse +from objmodel import W_NormalObject, W_Integer +from interpreter import Interpreter + + +def test_string_assignment(): + ast = parse(""" +x = "Hallo" +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_String) + assert w_model.getvalue("x").value == "Hallo" + + +def test_string_operations(): + ast = parse(""" +x = "Hallo" add("ollaH") +y = "Hallo" rev +z = "Hallo" len +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert isinstance(w_model.getvalue("x"), W_String) + assert w_model.getvalue("x").value == "HalloollaH" + assert isinstance(w_model.getvalue("y"), W_String) + assert w_model.getvalue("y").value == "ollaH" + assert isinstance(w_model.getvalue("z"), W_Integer) + assert w_model.getvalue("z").value == 5 diff --git a/mytest/test_sugar.py b/mytest/test_sugar.py new file mode 100644 index 0000000..0266283 --- /dev/null +++ b/mytest/test_sugar.py @@ -0,0 +1,49 @@ +import py + +from simpleparser import parse +from objmodel import W_NormalObject +from interpreter import Interpreter + + +def sugar_test_helper(expr): + ast = parse("x = " + expr) + interpreter = Interpreter() + w_module = interpreter.make_module() + interpreter.eval(ast, w_module) + + return w_module.getvalue("x").value + + +def test_plus(): + assert sugar_test_helper("1 + 1 + 1") == 3 + assert sugar_test_helper("1 + 1") == 2 + + +def test_minus(): + assert sugar_test_helper("2 - 1") == 1 + assert sugar_test_helper("3 - 1 - 1") == 1 + + +def test_mult(): + assert sugar_test_helper("2 * 5") == 10 + assert sugar_test_helper("2 * 3 * 4") == 24 + + +def test_div(): + assert sugar_test_helper("10 / 2") == 5 + assert sugar_test_helper("24 / 3 / 2") == 4 + + +def test_mod(): + assert sugar_test_helper("11 % 2") == 1 + + +def test_inc(): + assert sugar_test_helper("1 ++") == 2 + + +def test_mixed_precedence(): + assert sugar_test_helper("2 * 3 / 2") == 3 + assert sugar_test_helper("1 + 2 + 3 - 5") == 1 + assert sugar_test_helper("10 - 2 * 5") == 0 + assert sugar_test_helper("1 + 2 * 2 * 3 - 3 * 4") == 1 diff --git a/mytest/testcases.zip b/mytest/testcases.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9d3c09ba73a52c300b54c21c5abc4d577efebbc GIT binary patch literal 2502 zcmaKudpK148pjvIj3Ldqg+a)a7zt5|A@|7;MlMB(aT_#Km=Fq+P{=j54n{*lVt1L! zC5%#TyX`(@4~lW8L{1UyrE~1<+0N-%|E%>qzxDa!^L>Bs``Y3meBuBA2mqq7tAt!N zSb;bX08~N%U@IUC1bYPqy9EUYlE^;lXTuzh!2t*n!RH<#$>&ZD6#{tp#=(Ppp5XtS zbVCYD1NkE4l3;7PQbE8;Rj;@rxkDP}S7cL5zE4EhrrEeDZ)Hhj3i@NYT+Y{!f1~|n z^hFU6B5dJ?#Ti;OU4u8UHaoqAIVe~Dq29Ip%<^c5>ijc3R-WS#imVYLyOk;`g&aTs zW_0nIW^Y5Zn5myq!THECkM7zBLpaBZ#A3#dxn0*4Vv*Bn8O|7D&FLdfL3Yg~%gb%6 zPB)9mEiG?LZL$;7dBQ?$gnhg`Z&lpmNVq^PJCJ>L)wq@!BlU|MNKu}B&isy2m220- zN=gHkA2IU`!-D#!4W#7(3DSr6kmj>JR6;1R`_N8paVYDTq}csKt7j6!zQ>Uo#U8$c z%^dkX+o%=)m8N~8P;yb&_Aj^Ypxfgo%HEy@-PXbY0I}}YgF*@Lawo6LT?FM`+AMd* z0c+E!f#j@U?ph@uGs_TB5rPmTol~Tg9@jdmC(BLaNuQ>kvP)1#4x*Q(RJFbu405pf zjFy%|BMy!1rZ;Kf4vr|*34Psr7l_Jc4^GZnRzoATYsIhkW)ckdgjBMmn}ukV{E{3A z_`SfWV$W;oS2dYege^WgtCjaCSS!{#x!A`Tr4DEw&0lym?@Ys`U6#WcJ3;)%D^qhU zm8htQxX`aiOVj0Wk+RoudB;`U3ifrQo@ePxPZw=F_Iz3@_x>|=lt>^qb8dILpef}w zGfLdv{%IU~#ye2{CO+<*PwqZ$b+4%<>1$Bmh;yO0AYmRpp=dR?MTW_%Y)E%F%u#UcHfNw1^7FNzfFnBh&fU{K6QSrzFe`TC_Rd(ZIMy?YguGv7TU8`rT_ zlgx(w9h?>zT$3hRSqBX68vlk%;Yp!-1bD6IMhA0?{2#g5WBu21`;57)43ELtSBck9 zo70lzl0@BN2zaf|gGuvK;Y`^894Y5;feDt=RlT>?N7`jMs)j7x52b`@Gw;!R6^)0y z74$NE>jqrhjH$N=u4W<}ohqiV0cXuaCy?ingepbkB%r(BCD|hJS5c;{qKDm*_erAy zqPCt-LqW>x#I9ncPx|Ew_tl6N#)!!TJGJG@6NwRTPoY;CIGM37E3eOb!KU`nPsSNT zbc|8D&zN8H6))VjkzFWByK3S1XeYhHr6k{%#9exFraZj2z0yNw}K?;1ewk z?r+9s`?Ipp!?7uXk~+pRD!S_XPHF6pS2KEl*Lr`d^|jEKX1voGCoJ|F2eM8L%h~Gm z%&9u1#60|H1-qX@|Luk2n2kUI-+pJKk{$3uwFlZ`DP_Bh^6E^T4GWLyKIE%u_KZ=L z!xo(QZlEN$3>`TS=Rot?<&|0w2B-2Uhx>}cpaYK&@zjWnPRw?7)kS)02uCmCQ(`*r z(7YWVSxuI`scN5u8)0lG%q44EVr&H-@+K0$MfLHDH30{5W+hHTHAl$NRScj?#U;|A z(w}xQmi?*ymTPjVP|u5zmx*Hxt=Wb{14S-rT^bCS!VfF zb>pa)@Rw(r=&#{Ho~NIjxTubgm8X7=M<*O``7+F=T{Rh~^hyaoU_O)4*3;ITL+xc1 zbg=Afvhjr`212@Ui#Dd;fJYD}Td}EH`c?T1*R+r;fv9iVb7O0LXREapbbH|3Vc8YQ zINqnjUy?u6cN$D@xMTI;9s8qBXOAryvnL+_2(QN+MD=kGTu=HAlFwaGY}4FHBD9ie z8pxVuj3X{nf#e%HLP$W27hxCU1p)}g`<DuBy?comju2eY&g1pY(6{?4#?N=QfVRw_bAA9MJsP;#V{h#ACdxy3z zxw}nto~E?y6&Iw&D;F`GpbHMQ(X5s$4GByhHFuUWTVnSg0|hTGSyl}zq#TYzwNA?T zpuhF)ZX)h97QOf^!y;gZi2nFuAnHR0k}5^nW;*vU7i&$SScnGoEdi)V&b4-3M_nvFx_3bp*MxjDx z#5`_~GWk4r@Qz*8c0ag&ZW+bAvHvY*fy+VKurn66_y<&$cTk=uBl7#wJ5difU$79= zl;FS6^8BQo+fGxMfhN{$d0RXW?{>)l+X$qaV~<;wYm5c=;kiH5h?-hC_kVZdN#;h>)AhHZf-ssnQ361{$T#M6@k39 nR`e6z<|^OF3xlr9{Hx|c