122 lines
2.5 KiB
Python
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
|