restructure + syntactic sugar implementation
This commit is contained in:
85
tests/test_builtin.py
Normal file
85
tests/test_builtin.py
Normal file
@ -0,0 +1,85 @@
|
||||
from simpleparser import parse
|
||||
from interpreter import Interpreter
|
||||
|
||||
|
||||
def test_builtin_simple():
|
||||
builtincode = """
|
||||
x = 1
|
||||
object None:
|
||||
1
|
||||
def pass:
|
||||
None
|
||||
"""
|
||||
# construct the builtin module by running builtincode within the context of
|
||||
# a new empty module
|
||||
interpreter = Interpreter(builtincode)
|
||||
w_module = interpreter.make_module()
|
||||
# the parent of a normal module is the builtin module
|
||||
builtins = w_module.getparents()[0]
|
||||
assert builtins.getvalue('x').value == 1
|
||||
|
||||
ast = parse("""
|
||||
tx = x
|
||||
object a:
|
||||
pass
|
||||
ax = a x
|
||||
""")
|
||||
interpreter.eval(ast, w_module)
|
||||
assert w_module.getvalue("ax").value == 1
|
||||
assert w_module.getvalue("tx").value == 1
|
||||
|
||||
|
||||
def test_inttrait():
|
||||
builtincode = """
|
||||
object inttrait:
|
||||
x = 1
|
||||
def maybe_fortytwo:
|
||||
if self:
|
||||
42
|
||||
else:
|
||||
x
|
||||
"""
|
||||
interpreter = Interpreter(builtincode)
|
||||
w_module = interpreter.make_module()
|
||||
# the parent of a normal module is the builtin module
|
||||
builtins = w_module.getparents()[0]
|
||||
inttrait = builtins.getvalue("inttrait")
|
||||
|
||||
ast = parse("""
|
||||
x = 5 x # this returns 1, because it looks in the inttrait defined above
|
||||
m0 = 0 maybe_fortytwo
|
||||
m1 = x maybe_fortytwo
|
||||
inttrait x = 2
|
||||
m2 = 0 maybe_fortytwo
|
||||
tr = inttrait
|
||||
""")
|
||||
interpreter.eval(ast, w_module)
|
||||
x = w_module.getvalue("x")
|
||||
assert w_module.getvalue("tr") is inttrait
|
||||
# the inttrait is defined in the builtin module, so its __parent__ is that
|
||||
# module
|
||||
assert inttrait.getparents() == [builtins]
|
||||
assert x.value == 1
|
||||
assert x.getparents() == [inttrait]
|
||||
assert w_module.getvalue("m0").value == 1
|
||||
assert w_module.getvalue("m1").value == 42
|
||||
assert w_module.getvalue("m2").value == 2
|
||||
|
||||
|
||||
def test_builtin_default():
|
||||
ast = parse("""
|
||||
def sumupto(x):
|
||||
r = 0
|
||||
while x:
|
||||
r = r add(x)
|
||||
x = x add(-1)
|
||||
r
|
||||
x = sumupto(100)
|
||||
""")
|
||||
# the constructor is called without arguments, so the default builtins are
|
||||
# used
|
||||
interpreter = Interpreter()
|
||||
# tests that the default inttrait defines a method ``add``
|
||||
w_module = interpreter.make_module()
|
||||
interpreter.eval(ast, w_module)
|
||||
assert w_module.getvalue("x").value == 5050
|
||||
Reference in New Issue
Block a user