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_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_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_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
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
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_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_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_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)
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
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_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_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
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(): 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
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)
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_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_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
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
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
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
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
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