Exemple #1
0
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
Exemple #2
0
def test_args_order():
    ast = parse("""
def f(a, b, c):
    if a:
        4
    else:
        if b:
            8
        else:
            if c:
                15
            else:
                16
w = f(1, 1, 1)
x = f(0, 1, 1)
y = f(0, 0, 1)
z = f(0, 0, 0)
""")

    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    assert w_module.getvalue("w").value == 4
    assert w_module.getvalue("x").value == 8
    assert w_module.getvalue("y").value == 15
    assert w_module.getvalue("z").value == 16
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
Exemple #4
0
 def __init__(self, builtins = None, use_bytecode = True):
     self.use_bytecode = use_bytecode
     self.builtins = W_NormalObject()
     self.debug = False
     if not builtins:
         builtins = self.read_builtins('slflib/builtins.slf')
     self.eval(parse(builtins), self.builtins)
Exemple #5
0
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_primitive():
    ast = parse("""
k = 10 $int_add(31)
""")
    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    assert w_module.getvalue("k").value == 41
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
def do_the_twist(code):
    from simpleparser import parse

    ast = parse(code)
    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    return w_module
Exemple #10
0
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
Exemple #11
0
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_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)
Exemple #13
0
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_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
Exemple #15
0
def test_integer_asignment():
    ast = parse("""
x = 42
y = x
x = 4
""")

    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)

    assert w_module.getvalue("x").value == 4
    assert w_module.getvalue("y").value == 42
def test_loop():
    ast = parse("""
def f(x):
    r = 0
    while x:
        r = r $int_add(x)
        x = x $int_add(-1)
    r
y = f(100)
""")
    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    assert w_module.getvalue("y").value == 5050
Exemple #17
0
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_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 on Blatt 9
    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
Exemple #19
0
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_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)
Exemple #21
0
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_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
Exemple #23
0
def test_object_asignment():
    ast = parse("""
object foo:
    x = 42
x = foo x
y = x
foo x = 4
z = foo x
""")

    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)

    assert w_module.getvalue("x").value == 42
    assert w_module.getvalue("y").value == 42
    assert w_module.getvalue("z").value == 4
Exemple #24
0
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
Exemple #25
0
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
Exemple #26
0
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()
    # test 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
Exemple #27
0
def test_method_simple():
    ast = parse("""
object a:
    x = 11
    def f:
        self x
object b:
    __parent__ = a
    x = 22
af = a f # a is the receiver, therefore self is a in the method
bf = b f # b is the receiver, therefore self is b in the method

""")
    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    assert w_module.getvalue("af").value == 11
    assert w_module.getvalue("bf").value == 22
Exemple #28
0
def test_method_complex():
    ast = parse("""
k = 10
object a:
    x = 11
    y = 22
    def f(a, b):
        if a:
            if b:
                a
            else:
                k
        else:
            if b:
                self x
            else:
                self y
object b:
    __parent__ = a
    y = 55
af11 = a f(1, 1)
af10 = a f(1, 0)
af01 = a f(0, 1)
af00 = a f(0, 0)
k = 908
bf11 = b f(1, 1)
bf10 = b f(1, 0)
bf01 = b f(0, 1)
bf00 = b f(0, 0)
""")
    interpreter = Interpreter()
    w_module = interpreter.make_module()
    interpreter.eval(ast, w_module)
    assert w_module.getvalue("af11").value == 1
    assert w_module.getvalue("af10").value == 10
    assert w_module.getvalue("af01").value == 11
    assert w_module.getvalue("af00").value == 22
    assert w_module.getvalue("bf11").value == 1
    assert w_module.getvalue("bf10").value == 908
    assert w_module.getvalue("bf01").value == 11
    assert w_module.getvalue("bf00").value == 55
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_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