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

74 lines
2.3 KiB
Python

from rply import Token
from interpreter import Interpreter
from objmodel import W_Integer, W_String, W_Boolean
from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, StringLiteral
from simplelexer import lex
from simpleparser import parse
def test_basic_string_lexing():
assert lex("\"Hallo\"")[0] == Token("String", "\"Hallo\"")
assert lex("\'Hallo\'")[0] == Token("String", "\'Hallo\'")
assert lex("x = \"true\"")[:3] == [Token("Name", "x"), Token("Assign", "="), Token("String", "\"true\"")]
def test_basic_string_parsing():
assert parse("\"false\"") == Program([ExprStatement(StringLiteral("false"))])
assert parse("x = \"false\"") == Program([Assignment(ImplicitSelf(), "x", StringLiteral("false"))])
def test_string_assignment():
ast = parse("""
x = "Hallo"
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_String)
assert w_model.getvalue("x").value == "Hallo"
def test_string_operations():
ast = parse("""
w = "Hallo" eq("Hallo")
x = "Hallo" add("ollaH")
y = "Hallo" rev
z = "Hallo" len
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("w"), W_Boolean)
assert w_model.getvalue("w").istrue() is True
assert isinstance(w_model.getvalue("x"), W_String)
assert w_model.getvalue("x").value == "HalloollaH"
assert isinstance(w_model.getvalue("y"), W_String)
assert w_model.getvalue("y").value == "ollaH"
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 5
def test_string_conversion():
ast = parse("""
w = "true" tobool
x = true tostr
y = 25 tostr
z = "25" toint
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("w"), W_Boolean)
assert w_model.getvalue("w").istrue() is True
assert isinstance(w_model.getvalue("x"), W_String)
assert w_model.getvalue("x").value == "true"
assert isinstance(w_model.getvalue("y"), W_String)
assert w_model.getvalue("y").value == "25"
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 25