205 lines
4.4 KiB
Python
205 lines
4.4 KiB
Python
import py
|
|
|
|
from simpleparser import parse
|
|
from interpreter import Interpreter
|
|
|
|
|
|
def test_implicit_parent():
|
|
ast = parse("""
|
|
k = 10
|
|
object a:
|
|
z = k
|
|
az = a z
|
|
""")
|
|
interpreter = Interpreter()
|
|
# make_module creates a new empty W_NormalObject for now
|
|
# this will change later
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
assert w_module.getvalue("a").getvalue('__parent__') is w_module
|
|
assert w_module.getvalue("a").getparents() == [w_module]
|
|
assert w_module.getvalue("az").value == 10
|
|
|
|
|
|
def test_implicit_parent_method():
|
|
ast = parse("""
|
|
k = 10
|
|
def f(x):
|
|
if x:
|
|
k
|
|
else:
|
|
1
|
|
f1 = f(1)
|
|
f0 = f(0)
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
assert w_module.getvalue("f1").value == 10
|
|
assert w_module.getvalue("f0").value == 1
|
|
|
|
|
|
def test_shadow_parent_attribute():
|
|
ast = parse("""
|
|
k = 10
|
|
def f(x):
|
|
if x:
|
|
k = 41
|
|
k
|
|
f1 = f(1)
|
|
f0 = f(0)
|
|
|
|
object a:
|
|
k = 11
|
|
|
|
ak = a k
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
assert w_module.getvalue("f1").value == 41
|
|
assert w_module.getvalue("f0").value == 10
|
|
assert w_module.getvalue("ak").value == 11
|
|
assert w_module.getvalue("k").value == 10
|
|
|
|
|
|
def test_capture():
|
|
ast = parse("""
|
|
k = 10
|
|
object a:
|
|
j = k
|
|
k = 11
|
|
aj = a j
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
assert w_module.getvalue("aj").value == 10
|
|
|
|
|
|
def test_override__parent__():
|
|
ast = parse("""
|
|
k = 10
|
|
object a:
|
|
x = 1
|
|
y = 2
|
|
z = k
|
|
object b:
|
|
__parent__ = a
|
|
y = 5
|
|
z = y
|
|
|
|
ax = a x
|
|
ay = a y
|
|
az = a z
|
|
bx = b x
|
|
by = b y
|
|
bz = b z
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
a = w_module.getvalue("a")
|
|
assert a.getvalue('__parent__') is w_module
|
|
assert w_module.getvalue("b").getvalue('__parent__') is a
|
|
assert w_module.getvalue("b").getparents() == [a]
|
|
assert w_module.getvalue("ax").value == 1
|
|
assert w_module.getvalue("ay").value == 2
|
|
assert w_module.getvalue("az").value == 10
|
|
assert w_module.getvalue("bx").value == 1
|
|
assert w_module.getvalue("by").value == 5
|
|
assert w_module.getvalue("bz").value == 5
|
|
|
|
|
|
def test_parent_syntax():
|
|
ast = parse("""
|
|
object a:
|
|
x = 11
|
|
object b(parent=a):
|
|
x = 22
|
|
af = a x
|
|
bf = b x
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
a = w_module.getvalue("a")
|
|
b = w_module.getvalue("b")
|
|
assert a.getvalue('__parent__') is w_module
|
|
assert b.getvalue('__parent__') is w_module
|
|
assert b.getvalue('parent') is a
|
|
assert a.getparents() == [w_module]
|
|
assert b.getparents() == [a, w_module]
|
|
assert w_module.getvalue("af").value == 11
|
|
assert w_module.getvalue("bf").value == 22
|
|
|
|
|
|
def test_parent_syntax_multiple():
|
|
ast = parse("""
|
|
a = 1
|
|
b = 2
|
|
c = 3
|
|
d = 4
|
|
object x:
|
|
b = 5
|
|
c = 6
|
|
d = 7
|
|
object y:
|
|
c = 8
|
|
d = 9
|
|
object z(p1=y, p2=x):
|
|
d = 10
|
|
za = z a
|
|
zb = z b
|
|
zc = z c
|
|
zd = z d
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
interpreter.eval(ast, w_module)
|
|
x = w_module.getvalue("x")
|
|
y = w_module.getvalue("y")
|
|
z = w_module.getvalue("z")
|
|
assert x.getvalue('__parent__') is w_module
|
|
assert y.getvalue('__parent__') is w_module
|
|
assert z.getvalue('__parent__') is w_module
|
|
assert z.getvalue('p1') is y
|
|
assert z.getvalue('p2') is x
|
|
assert x.getparents() == [w_module]
|
|
assert y.getparents() == [w_module]
|
|
assert z.getparents() == [y, x, w_module]
|
|
assert w_module.getvalue("za").value == 1
|
|
assert w_module.getvalue("zb").value == 5
|
|
assert w_module.getvalue("zc").value == 8
|
|
assert w_module.getvalue("zd").value == 10
|
|
|
|
|
|
def test_wrong_hierarchy_error():
|
|
ast = parse("""
|
|
object base:
|
|
x = 1
|
|
object sub(p1=base):
|
|
x = 2
|
|
def mayhem:
|
|
object bad(p1=base, p2=sub):
|
|
x = 3
|
|
bad x
|
|
result = mayhem
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
py.test.raises(TypeError, interpreter.eval, ast, w_module)
|
|
|
|
|
|
def test_duplicate_base_error():
|
|
ast = parse("""
|
|
object base:
|
|
x = 1
|
|
object sub(p1=base, p2=base):
|
|
x = 2
|
|
y = sub x
|
|
""")
|
|
interpreter = Interpreter()
|
|
w_module = interpreter.make_module()
|
|
py.test.raises(TypeError, interpreter.eval, ast, w_module)
|