95 lines
2.0 KiB
Python
95 lines
2.0 KiB
Python
from bytecodeinterpreter import Interpreter
|
|
from simpleparser import parse
|
|
|
|
|
|
def eval_test_program(name):
|
|
import os
|
|
program = os.path.join(os.path.dirname(__file__),
|
|
"..",
|
|
"examples",
|
|
name + ".simple")
|
|
|
|
with open(program, "r") as f:
|
|
ast = parse(f.read())
|
|
interpreter = Interpreter()
|
|
w_model = interpreter.make_module()
|
|
interpreter.eval(ast, w_model)
|
|
|
|
return w_model, interpreter
|
|
|
|
|
|
def test_fibonacci_rec():
|
|
w_model, interpreter = eval_test_program("fibonacci")
|
|
|
|
ast = parse("""
|
|
x = fibonacci_rec(5)
|
|
y = fibonacci_rec(10)
|
|
""")
|
|
interpreter.eval(ast, w_model)
|
|
|
|
assert w_model.getvalue("x").value == 5
|
|
assert w_model.getvalue("y").value == 55
|
|
|
|
ast = parse("""
|
|
x = fibonacci_it(5)
|
|
y = fibonacci_it(10)
|
|
""")
|
|
interpreter.eval(ast, w_model)
|
|
|
|
assert w_model.getvalue("x").value == 5
|
|
assert w_model.getvalue("y").value == 55
|
|
|
|
|
|
def test_inheritance():
|
|
w_model, interpreter = eval_test_program("inheritance")
|
|
|
|
ast = parse("""
|
|
x = square
|
|
x size = 5
|
|
xa = x area
|
|
|
|
y = circle
|
|
ya = y area
|
|
""")
|
|
interpreter.eval(ast, w_model)
|
|
|
|
assert w_model.getvalue("xa").value == 25
|
|
assert w_model.getvalue("ya").value == 3.1415
|
|
|
|
|
|
def test_rotation():
|
|
w_model, interpreter = eval_test_program("rotations")
|
|
|
|
ast = parse("""
|
|
x = "Hallo"
|
|
y = rotate(x, 2)
|
|
z = rotate(x, 4)
|
|
""")
|
|
interpreter.eval(ast, w_model)
|
|
|
|
assert w_model.getvalue("y").value == "lloHa"
|
|
assert w_model.getvalue("z").value == "oHall"
|
|
|
|
|
|
def test_numbers():
|
|
w_model, interpreter = eval_test_program("numbers")
|
|
|
|
ast = parse("""
|
|
x = generate_list(5)
|
|
|
|
def function(n):
|
|
n * n
|
|
|
|
y = generate_list(5)
|
|
|
|
def function(n):
|
|
n + 1
|
|
|
|
z = generate_list(5)
|
|
""")
|
|
interpreter.eval(ast, w_model)
|
|
|
|
assert w_model.getvalue("x").value == "1 2 3 4 5"
|
|
assert w_model.getvalue("y").value == "1 4 9 16 25"
|
|
assert w_model.getvalue("z").value == "2 3 4 5 6"
|