1
Files
lecture-interpreters/tests/test_interpreter.py
2021-08-11 21:11:35 +02:00

122 lines
2.5 KiB
Python

from simpleparser import parse
from objmodel import W_NormalObject
from interpreter import Interpreter
#
# The Interpreter class needs a method 'eval(ast, w_context)' that is
# doing "AST visiting", as follows:
#
# def eval(self, ast, w_context):
# method = getattr(self, "eval_" + ast.__class__.__name__)
# return method(ast, w_context)
#
# This calls a method called "eval_Xxx" on self for every class
# called Xxx of the simpleast.py module.
#
def test_simplxe():
ast = parse("""
10
11
12
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
def test_simple():
ast = parse("""
k = 10
j = 11
i = 12
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("i").value == 12
assert w_module.getvalue("j").value == 11
assert w_module.getvalue("k").value == 10
def test_if():
ast = parse("""
k = 10
if k:
j = 11
else:
i = 12
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("i") is None
assert w_module.getvalue("j").value == 11
assert w_module.getvalue("k").value == 10
def test_def():
ast = parse("""
def f(x, y):
if x:
x
else:
y
i = f(6, 3)
j = f(0, 9)
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("i").value == 6
assert w_module.getvalue("j").value == 9
def test_object():
ast = parse("""
object x:
i = 4
j = i
object z:
i = 5
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").getvalue("i").value == 4
assert w_module.getvalue("x").getvalue("j").value == 4
assert w_module.getvalue("x").getvalue("z").getvalue("i").value == 5
def test_obscure_recursion():
ast = parse("""
object a:
def f(a):
if a:
x = 5
a f(0)
else:
x = 7
x
i = a f(a)
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("i").value == 5
def test_assign():
ast = parse("""
object a:
b = 5
def set(n):
self b = n
a set(7)
i = a b
""")
w_module = W_NormalObject()
interpreter = Interpreter()
interpreter.eval(ast, w_module)
assert w_module.getvalue("i").value == 7