implement string
This commit is contained in:
@ -1,10 +1,24 @@
|
||||
import py
|
||||
from rply import Token
|
||||
|
||||
from simpleast import Program, ExprStatement, BooleanLiteral, ImplicitSelf, Assignment, StringLiteral
|
||||
from simplelexer import lex
|
||||
from simpleparser import parse
|
||||
from objmodel import W_NormalObject, W_Integer
|
||||
from objmodel import W_NormalObject, W_Integer, W_String, W_Boolean
|
||||
from interpreter import Interpreter
|
||||
|
||||
|
||||
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"
|
||||
@ -19,6 +33,7 @@ x = "Hallo"
|
||||
|
||||
def test_string_operations():
|
||||
ast = parse("""
|
||||
w = "Hallo" eq("Hallo")
|
||||
x = "Hallo" add("ollaH")
|
||||
y = "Hallo" rev
|
||||
z = "Hallo" len
|
||||
@ -27,9 +42,33 @@ z = "Hallo" len
|
||||
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
|
||||
|
Reference in New Issue
Block a user