74 lines
2.3 KiB
Python
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
|