diff --git a/mytests/test_boolean.py b/mytests/test_boolean.py index 3078672..75482a4 100644 --- a/mytests/test_boolean.py +++ b/mytests/test_boolean.py @@ -3,7 +3,7 @@ from rply import Token from simpleast import Program, ExprStatement, BooleanLiteral, Assignment, ImplicitSelf from simplelexer import lex from simpleparser import parse -from objmodel import W_NormalObject, W_Integer, W_Boolean +from objmodel import W_Integer, W_Boolean from interpreter import Interpreter diff --git a/mytests/test_builtins_additions.py b/mytests/test_builtins_additions.py deleted file mode 100644 index 8121d64..0000000 --- a/mytests/test_builtins_additions.py +++ /dev/null @@ -1,22 +0,0 @@ -from bytecodeinterpreter import Interpreter -from simpleparser import parse - - -def builtin_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_sugar_builtins(): - assert builtin_test_helper("2 add(5)") == 7 - assert builtin_test_helper("2 mul(5)") == 10 - assert builtin_test_helper("2 div(5)") == 0 - assert builtin_test_helper("10 div(5)") == 2 - assert builtin_test_helper("10 div(3)") == 3 - assert builtin_test_helper("5 mod(3)") == 2 - assert builtin_test_helper("4 mod(2)") == 0 - assert builtin_test_helper("2 inc") == 3 diff --git a/mytests/test_double.py b/mytests/test_double.py index 2547e93..e1011be 100644 --- a/mytests/test_double.py +++ b/mytests/test_double.py @@ -1,6 +1,6 @@ from rply import Token -from simpleast import Program, ExprStatement, StringLiteral, ImplicitSelf, Assignment, DoubleLiteral +from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, DoubleLiteral from simplelexer import lex from simpleparser import parse from objmodel import W_Integer, W_Double diff --git a/mytests/test_string.py b/mytests/test_string.py index 782171e..3e23fc5 100644 --- a/mytests/test_string.py +++ b/mytests/test_string.py @@ -1,10 +1,10 @@ from rply import Token -from simpleast import Program, ExprStatement, BooleanLiteral, ImplicitSelf, Assignment, StringLiteral +from interpreter import Interpreter +from objmodel import W_Integer, W_String, W_Boolean +from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, StringLiteral from simplelexer import lex from simpleparser import parse -from objmodel import W_NormalObject, W_Integer, W_String, W_Boolean -from interpreter import Interpreter def test_basic_string_lexing(): diff --git a/mytests/test_sugar.py b/mytests/test_sugar.py index c218e52..ad400f9 100644 --- a/mytests/test_sugar.py +++ b/mytests/test_sugar.py @@ -1,8 +1,8 @@ -import py +from rply import Token -from simpleparser import parse -from objmodel import W_NormalObject from interpreter import Interpreter +from simplelexer import lex +from simpleparser import parse def sugar_test_helper(expr): @@ -14,6 +14,41 @@ def sugar_test_helper(expr): return w_module.getvalue("x").value +def test_lexing(): + token = lex("+ - * / ++ %") + + assert Token("Plus", "+") == token[0] + assert Token("Minus", "-") == token[1] + assert Token("Multiply", "*") == token[2] + assert Token("Divide", "/") == token[3] + assert Token("Increment", "++") == token[4] + assert Token("Modulo", "%") == token[5] + + +def test_parsing(): + assert parse("1 + 2") == parse("1 add(2)") + assert parse("1 + 2 + 3") == parse("1 add(2) add(3)") + assert parse("1 + 2 * 3") == parse("1 add(2 mul(3))") + assert parse("1 - 2 - 3") == parse("1 sub(2) sub(3)") + assert parse("1 + 2 % 3 / 4 - 5 * 6 + 7++") == parse("1 add(2 mod(3) div(4)) sub(5 mul(6)) add(7 inc)") + + +def test_parsing_parenthesis(): + assert parse("(1 + 2)") == parse("1 add(2)") + assert parse("1 * (2 + 3)") == parse("1 mul(2 add(3))") + + +def test_sugar_builtins(): + assert sugar_test_helper("2 add(5)") == 7 + assert sugar_test_helper("2 mul(5)") == 10 + assert sugar_test_helper("2 div(5)") == 0 + assert sugar_test_helper("10 div(5)") == 2 + assert sugar_test_helper("10 div(3)") == 3 + assert sugar_test_helper("5 mod(3)") == 2 + assert sugar_test_helper("4 mod(2)") == 0 + assert sugar_test_helper("2 inc") == 3 + + def test_plus(): assert sugar_test_helper("1 + 1 + 1") == 3 assert sugar_test_helper("1 + 1") == 2 @@ -40,9 +75,77 @@ def test_mod(): def test_inc(): assert sugar_test_helper("1 ++") == 2 - assert sugar_test_helper("1 ++ + 1") == 3 # Is this allowed? + assert sugar_test_helper("1 ++ + 1") == 3 assert sugar_test_helper("2 * 2 ++") == 6 + ast = parse(""" +i = 1 +i++ +x = i +""") + interpreter = Interpreter() + w_module = interpreter.make_module() + interpreter.eval(ast, w_module) + + assert w_module.getvalue("x").value == 2 + + +def test_inplace_arithmetic(): + ast = parse(""" +w = 5 +x = 5 +y = 5 +z = 5 +w += 1 +x -= 2 +y *= 5 +z /= 2 +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert w_model.getvalue("w").value == 6 + assert w_model.getvalue("x").value == 3 + assert w_model.getvalue("y").value == 25 + assert w_model.getvalue("z").value == 2 + + +def test_comparisons(): + ast = parse(""" +u = 5 < 3 +v = 5 <= 5 +w = 5 > 3 +x = 5 >= 3 +y = 5 == 6 +z = 5 != 6 +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert w_model.getvalue("u").istrue() is False + assert w_model.getvalue("v").istrue() is True + assert w_model.getvalue("w").istrue() is True + assert w_model.getvalue("x").istrue() is True + assert w_model.getvalue("y").istrue() is False + assert w_model.getvalue("z").istrue() is True + + +def test_logical(): + ast = parse(""" +x = true && false +y = true || false +z = !true +""") + interpreter = Interpreter() + w_model = interpreter.make_module() + interpreter.eval(ast, w_model) + + assert w_model.getvalue("x").istrue() is False + assert w_model.getvalue("y").istrue() is True + assert w_model.getvalue("z").istrue() is False + def test_mixed_precedence(): assert sugar_test_helper("2 * 3 / 2") == 3 diff --git a/mytests/test_sugar_lex.py b/mytests/test_sugar_lex.py deleted file mode 100644 index 0ffc301..0000000 --- a/mytests/test_sugar_lex.py +++ /dev/null @@ -1,13 +0,0 @@ -from rply import Token -from simplelexer import lex - - -def test_lexing(): - token = lex("+ - * / ++ %") - - assert Token("Plus", "+") == token[0] - assert Token("Minus", "-") == token[1] - assert Token("Multiply", "*") == token[2] - assert Token("Divide", "/") == token[3] - assert Token("Increment", "++") == token[4] - assert Token("Modulo", "%") == token[5] diff --git a/mytests/test_sugar_parse.py b/mytests/test_sugar_parse.py deleted file mode 100644 index 4d1ef0d..0000000 --- a/mytests/test_sugar_parse.py +++ /dev/null @@ -1,15 +0,0 @@ -from simpleparser import parse - - -def test_parsing(): - assert parse("1 + 2") == parse("1 $int_add(2)") - assert parse("1 + 2 + 3") == parse("1 $int_add(2) $int_add(3)") - assert parse("1 + 2 * 3") == parse("1 $int_add(2 $int_mul(3))") - assert parse("1 - 2 - 3") == parse("1 $int_sub(2) $int_sub(3)") - assert parse("1 + 2 % 3 / 4 - 5 * 6 + 7++") \ - == parse("1 $int_add(2 $int_mod(3) $int_div(4)) $int_sub(5 $int_mul(6)) $int_add(7 $int_inc)") - - -def test_parsing_parenthesis(): - assert parse("(1 + 2)") == parse("1 $int_add(2)") - assert parse("1 * (2 + 3)") == parse("1 $int_mul(2 $int_add(3))")