restructure + syntactic sugar implementation
This commit is contained in:
121
tests/test_interpreter.py
Normal file
121
tests/test_interpreter.py
Normal file
@ -0,0 +1,121 @@
|
||||
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
|
Reference in New Issue
Block a user