1
Files
lecture-interpreters/mytests/test_double.py
Christoph 6d9a2d1ff6 tests
2021-09-01 22:48:29 +02:00

106 lines
3.1 KiB
Python

from rply import Token
from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, DoubleLiteral
from simplelexer import lex
from simpleparser import parse
from objmodel import W_Integer, W_Double
from interpreter import Interpreter
def test_basic_double_lexing():
assert lex("0.1")[0] == Token("Double", "0.1")
assert lex(".1")[0] == Token("Double", ".1")
assert lex("1.")[0] == Token("Double", "1.")
assert lex("-5.5")[0] == Token("Double", "-5.5")
assert lex("-.5")[0] == Token("Double", "-.5")
assert lex("x = 0.0005")[:3] == [Token("Name", "x"), Token("Assign", "="), Token("Double", "0.0005")]
def test_basic_double_parsing():
assert parse("1.0") == Program([ExprStatement(DoubleLiteral("1.0"))])
assert parse("x = -.1") == Program([Assignment(ImplicitSelf(), "x", DoubleLiteral("-0.1"))])
def test_double_assignment():
ast = parse("""
x = 1.5
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Double)
assert w_model.getvalue("x").value == 1.5
def test_double_addition_subtraction():
ast = parse("""
x = 2.5 sub(2.4)
y = 2.5 add(2.4)
z = 3 sub(2.5)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Double)
assert w_model.getvalue("x").value == (2.5 - 2.4)
assert isinstance(w_model.getvalue("y"), W_Double)
assert w_model.getvalue("y").value == (2.5 + 2.4)
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 0
def test_double_division():
ast = parse("""
x = 3 div(2)
y = 3 div(2.0)
z = 3.0 div(2.0)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Integer)
assert w_model.getvalue("x").value == 1
assert isinstance(w_model.getvalue("y"), W_Integer)
assert w_model.getvalue("y").value == 1
assert isinstance(w_model.getvalue("z"), W_Double)
assert w_model.getvalue("z").value == 1.5
def test_double_multiplication():
ast = parse("""
x = 3.3 mul(3.0)
y = 3.3 mul(3)
z = 3 mul(3.3)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Double)
assert w_model.getvalue("x").value == (3.3 * 3.0)
assert isinstance(w_model.getvalue("y"), W_Double)
assert w_model.getvalue("y").value == (3.3 * 3)
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 9
def test_double_conversion():
ast = parse("""
x = 1.5 toint
y = 2.0 toint
z = 3 todouble
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Integer)
assert w_model.getvalue("x").value == 1
assert isinstance(w_model.getvalue("y"), W_Integer)
assert w_model.getvalue("y").value == 2
assert isinstance(w_model.getvalue("z"), W_Double)
assert w_model.getvalue("z").value == 3.0