Added ExactConceptParser
This commit is contained in:
+27
-22
@@ -1,10 +1,11 @@
|
||||
import pytest
|
||||
|
||||
from parsers.ExactConceptParser import ExactConceptParser
|
||||
from parsers.PythonParser import PythonParser, PythonNode, PythonErrorNode
|
||||
from parsers.tokenizer import Tokenizer, Token, TokenKind, Keywords, LexerError
|
||||
from core.tokenizer import Tokenizer, Token, TokenKind, Keywords, LexerError
|
||||
from parsers.DefaultParser import DefaultParser
|
||||
from parsers.DefaultParser import NumberNode, StringNode, VariableNode, TrueNode, FalseNode, NullNode, BinaryNode
|
||||
from parsers.DefaultParser import Node, UnexpectedTokenErrorNode, DefConceptNode, NopNode
|
||||
from parsers.DefaultParser import UnexpectedTokenErrorNode, DefConceptNode, NopNode
|
||||
import ast
|
||||
|
||||
|
||||
@@ -39,6 +40,7 @@ def null():
|
||||
def b(operator, left, right):
|
||||
return BinaryNode([], operator, left, right)
|
||||
|
||||
|
||||
def compare_ast(left, right):
|
||||
left_as_string = ast.dump(left)
|
||||
left_as_string = left_as_string.replace(", ctx=Load()", "")
|
||||
@@ -51,9 +53,8 @@ def compare_ast(left, right):
|
||||
return left_as_string == right_as_string
|
||||
|
||||
|
||||
|
||||
def test_i_can_tokenize():
|
||||
source = "+*-/{}[]() ,;:.?\n\n\r\r\r\nidentifier_0\t \t10.15 10 'string\n' \"another string\"="
|
||||
source = "+*-/{}[]() ,;:.?\n\n\r\r\r\nidentifier_0\t \t10.15 10 'string\n' \"another string\"=|&"
|
||||
tokens = list(Tokenizer(source))
|
||||
assert tokens[0] == Token(TokenKind.PLUS, "+", 0, 1, 1)
|
||||
assert tokens[1] == Token(TokenKind.STAR, "*", 1, 1, 2)
|
||||
@@ -85,6 +86,8 @@ def test_i_can_tokenize():
|
||||
assert tokens[27] == Token(TokenKind.WHITESPACE, " ", 59, 6, 1)
|
||||
assert tokens[28] == Token(TokenKind.STRING, '"another string"', 60, 6, 2)
|
||||
assert tokens[29] == Token(TokenKind.EQUALS, '=', 76, 6, 18)
|
||||
assert tokens[30] == Token(TokenKind.VBAR, '|', 77, 6, 19)
|
||||
assert tokens[31] == Token(TokenKind.AMPER, '&', 78, 6, 20)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("text, expected", [
|
||||
@@ -220,8 +223,8 @@ def test_i_can_recognize_keywords(text, expected):
|
||||
("def concept h as 1 + 1", "h", ast.Expression(ast.BinOp(left=ast.Num(n=1), op=ast.Add(), right=ast.Num(n=1)))),
|
||||
])
|
||||
def test_i_can_parse_def_concept(text, expected_name, expected_expr):
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
assert tree.name == expected_name
|
||||
if isinstance(tree.body, PythonNode):
|
||||
@@ -230,8 +233,6 @@ def test_i_can_parse_def_concept(text, expected_name, expected_expr):
|
||||
assert tree.body == expected_expr
|
||||
|
||||
|
||||
|
||||
|
||||
def test_i_can_parse_complex_def_concept_statement():
|
||||
text = """def concept a plus b
|
||||
where a,b
|
||||
@@ -239,8 +240,8 @@ def test_i_can_parse_complex_def_concept_statement():
|
||||
post isinstance(res, int)
|
||||
as res = a + b
|
||||
"""
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert not parser.has_error
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
assert tree.name == "a plus b"
|
||||
@@ -261,19 +262,20 @@ def concept add one to a as:
|
||||
return x+1
|
||||
func(a)
|
||||
"""
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert not parser.has_error
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
|
||||
|
||||
def test_i_can_use_colon_to_declare_indentation2():
|
||||
text = """
|
||||
def concept add one to a as:
|
||||
def func(x):
|
||||
return x+1
|
||||
"""
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert not parser.has_error
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
|
||||
@@ -285,8 +287,8 @@ def concept add one to a as
|
||||
return x+1
|
||||
func(a)
|
||||
"""
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert parser.has_error
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
assert isinstance(parser.error_sink[0].exception, IndentationError)
|
||||
@@ -304,8 +306,8 @@ def concept add one to a as:
|
||||
func(a)
|
||||
func(b)
|
||||
"""
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
tree = parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
tree = parser.parse(None, text)
|
||||
assert parser.has_error
|
||||
assert isinstance(tree, DefConceptNode)
|
||||
assert isinstance(parser.error_sink[0], UnexpectedTokenErrorNode)
|
||||
@@ -319,8 +321,8 @@ func(b)
|
||||
("def concept as", Keywords.AS, ["<name>"]),
|
||||
])
|
||||
def test_i_can_detect_unexpected_token_error_in_def_concept(text, token_found, expected_tokens):
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
parser.parse(None, text)
|
||||
|
||||
assert parser.has_error
|
||||
assert isinstance(parser.error_sink[0], UnexpectedTokenErrorNode)
|
||||
@@ -335,7 +337,10 @@ def test_i_can_detect_unexpected_token_error_in_def_concept(text, token_found, e
|
||||
"def concept hello as 1+"
|
||||
])
|
||||
def test_i_can_detect_error_in_declaration(text):
|
||||
parser = DefaultParser(text, PythonParser)
|
||||
parser.parse()
|
||||
parser = DefaultParser(PythonParser)
|
||||
parser.parse(None, text)
|
||||
assert parser.has_error
|
||||
assert isinstance(parser.error_sink[0], PythonErrorNode)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user