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

207 lines
4.3 KiB
Python

import py
from simpleparser import parse
from objmodel import W_NormalObject
from interpreter import Interpreter
empty_builtins = """
1
"""
def test_assignment():
ast = parse("""
x = 1
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 1
def test_negative_intliteral():
ast = parse("""
x = -1
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == -1
def test_huge_intliteral():
ast = parse("""
x = 10000
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 10000
def test_huge_negative_intliteral():
ast = parse("""
x = -10000
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == -10000
def test_primitive():
ast = parse("""
x = 1 $int_add(2)
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 3
def test_pop():
ast = parse("""
x = 1 # the result of this will be popped from the stack
x = 2
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 2
def test_condition():
ast = parse("""
x = 1
if x:
x = 2
else:
x = 3
if 0:
y = 3
else:
y = 4
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 2
assert w_module.getvalue("y").value == 4
def test_objectdefinition_simple():
ast = parse("""
object x:
a = 1
b = 2
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").getvalue("a").value == 1
assert w_module.getvalue("x").getvalue("b").value == 2
def test_objectdefinition_parents():
ast = parse("""
object x:
a = 1
b = 2
object y(parent=x):
b = 3
a = y a
b = y b
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("a").value == 1
assert w_module.getvalue("b").value == 3
def test_objectdefinition___parent__():
ast = parse("""
object x:
a = 1
b = 2
object y(__parent__=x):
b = 3
a = y a
b = y b
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("a").value == 1
assert w_module.getvalue("b").value == 3
def test_functiondefinition_noargs():
ast = parse("""
def f:
if x:
1
else:
2
x = 0
x = f
y = f
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 2
assert w_module.getvalue("y").value == 1
def test_functiondefinition_args():
ast = parse("""
def f(x):
if x:
1
else:
2
x = f(0)
y = f(1)
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 2
assert w_module.getvalue("y").value == 1
def test_whileloop():
ast = parse("""
def f(x):
sum = 0
while x:
sum = sum $int_add(x)
x = x $int_add(-1)
sum
x = f(100)
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 5050
def test_method_cascade():
ast = parse("""
object x:
a = 1
object y:
a = 2
x next = y
y next = x
a = x next next next next next next a
b = x next next next next next next next a
""")
interpreter = Interpreter(empty_builtins)
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("a").value == 1
assert w_module.getvalue("b").value == 2