Fixed #32 : concept groups are not correctly updated
Fixed #35 : Refactor test helper class (CNC, CC, CIO) Fixed #36 : Concept values are not used when declared with variable expression Fixed #37 : Objects in memory lose their values are restart Fixed #38 : func(a=b, c) (which is not allowed) raise an exception
This commit is contained in:
+129
-123
@@ -2,18 +2,19 @@ import pytest
|
||||
|
||||
import tests.parsers.parsers_utils
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.concept import Concept, CIO, CMV
|
||||
from core.concept import Concept
|
||||
from core.global_symbols import CONCEPT_COMPARISON_CONTEXT
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from core.tokenizer import Tokenizer
|
||||
from core.utils import NextIdManager
|
||||
from parsers.BaseNodeParser import utnode, cnode, short_cnode, UnrecognizedTokensNode, \
|
||||
SCWC, CNC, UTN, SCN, CN
|
||||
from parsers.BaseNodeParser import UnrecognizedTokensNode
|
||||
from parsers.PythonParser import PythonNode
|
||||
from parsers.SyaNodeParser import SyaNodeParser, SyaConceptParserHelper, SyaAssociativity, \
|
||||
NoneAssociativeSequenceError, TooManyParametersFoundError, InFixToPostFix, ParenthesisMismatchError
|
||||
from tests.TestUsingFileBasedSheerka import TestUsingFileBasedSheerka
|
||||
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
||||
from tests.parsers.parsers_utils import UTN, SCWC, CNC, SCN, CIO, CN, compute_debug_array, CMV, get_test_obj, \
|
||||
compare_with_test_object
|
||||
|
||||
|
||||
def compute_expected_array(concepts_map, expression, expected):
|
||||
@@ -102,6 +103,16 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
parser.init_from_concepts(context, concepts, sya=sya_def_to_use)
|
||||
return sheerka, context, parser
|
||||
|
||||
@staticmethod
|
||||
def compare_results(res, expected_sequences, concept_map, expression, validate_errors=True):
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
if validate_errors:
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(concept_map, expression, expected)
|
||||
res_i_as_test_obj = get_test_obj(res_i.out, expected_array)
|
||||
assert res_i_as_test_obj == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one plus two", [["one", "two", "plus"]]),
|
||||
("1 + 1 plus two", [["1 + 1", "two", "plus"]]),
|
||||
@@ -110,7 +121,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
["one + two", "three", "plus"]]),
|
||||
("twenty one plus two", [
|
||||
["twenty ", "one", "two", "plus"],
|
||||
[short_cnode("twenties", "twenty one"), "two", "plus"]
|
||||
[CN("twenties", "twenty one"), "two", "plus"]
|
||||
]),
|
||||
("x$!# plus two", [["x$!#", "two", "plus"]]),
|
||||
|
||||
@@ -122,7 +133,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one plus 1 + 1", [
|
||||
["twenty ", "one", "1 + 1", "plus"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "1 + 1", "plus"]
|
||||
[CN("twenties", "twenty one", 0, 2), "1 + 1", "plus"]
|
||||
]),
|
||||
("x$!# plus 1 + 1", [["x$!#", "1 + 1", "plus"]]),
|
||||
|
||||
@@ -142,9 +153,9 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one plus two + three", [
|
||||
["twenty ", "one", "two", "plus", " + ", "three"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "two", "plus", " + ", "three"],
|
||||
[CN("twenties", "twenty one", 0, 2), "two", "plus", " + ", "three"],
|
||||
["twenty ", "one", "two + three", "plus"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "two + three", "plus"],
|
||||
[CN("twenties", "twenty one", 0, 2), "two + three", "plus"],
|
||||
]),
|
||||
("x$!# plus two + three", [
|
||||
["x$!#", "two", "plus", " + ", "three"],
|
||||
@@ -153,28 +164,28 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
("one plus twenty two", [
|
||||
["one", "twenty ", "plus", "two"],
|
||||
["one", cnode("twenties", 4, 6, "twenty two"), "plus"],
|
||||
["one", CN("twenties", "twenty two", 4, 6), "plus"],
|
||||
]),
|
||||
("1 + 1 plus twenty one", [
|
||||
["1 + 1", "twenty ", "plus", "one"],
|
||||
["1 + 1", cnode("twenties", 8, 10, "twenty one"), "plus"],
|
||||
["1 + 1", CN("twenties", "twenty one", 8, 10), "plus"],
|
||||
]),
|
||||
("one + two plus twenty one", [
|
||||
["one", " + ", "two", "twenty ", "plus", ("one", 1)],
|
||||
["one + two", "twenty ", "plus", ("one", 1)],
|
||||
["one", " + ", "two", cnode("twenties", 8, 10, "twenty one"), "plus"],
|
||||
["one + two", cnode("twenties", 8, 10, "twenty one"), "plus"],
|
||||
["one", " + ", "two", CN("twenties", "twenty one", 8, 10), "plus"],
|
||||
["one + two", CN("twenties", "twenty one", 8, 10), "plus"],
|
||||
]),
|
||||
("twenty one plus twenty two",
|
||||
[
|
||||
["twenty ", "one", ("twenty ", 1), "plus", "two"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), ("twenty ", 1), "plus", "two"],
|
||||
["twenty ", "one", cnode("twenties", 6, 8, "twenty two"), "plus"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), cnode("twenties", 6, 8, "twenty two"), "plus"],
|
||||
[CN("twenties", "twenty one", 0, 2), ("twenty ", 1), "plus", "two"],
|
||||
["twenty ", "one", CN("twenties", "twenty two", 6, 8), "plus"],
|
||||
[CN("twenties", "twenty one", 0, 2), CN("twenties", "twenty two", 6, 8), "plus"],
|
||||
]),
|
||||
("x$!# plus twenty two", [
|
||||
["x$!#", "twenty ", "plus", "two"],
|
||||
["x$!#", cnode("twenties", 7, 9, "twenty two"), "plus"]
|
||||
["x$!#", CN("twenties", "twenty two", 7, 9), "plus"]
|
||||
]),
|
||||
|
||||
("one plus z$!#", [["one", "z$!#", "plus"]]),
|
||||
@@ -185,7 +196,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one plus z$!#", [
|
||||
["twenty ", "one", "z$!#", "plus"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "z$!#", "plus"],
|
||||
[CN("twenties", "twenty one", 0, 2), "z$!#", "plus"],
|
||||
]),
|
||||
("x$!# plus z$!#", [["x$!#", "z$!#", "plus"]]),
|
||||
])
|
||||
@@ -194,17 +205,13 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, cmap, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one plus plus plus 1 + 1", [["one", "1 + 1", "plus plus plus"]]),
|
||||
("x$!# another long name infix twenty two", [
|
||||
["x$!#", "twenty ", "another long name infix", "two"],
|
||||
["x$!#", cnode("twenties", 13, 15, "twenty two"), "another long name infix"],
|
||||
["x$!#", CN("twenties", "twenty two", 13, 15), "another long name infix"],
|
||||
]),
|
||||
])
|
||||
def test_i_can_post_fix_infix_concepts_with_long_name(self, expression, expected_sequences):
|
||||
@@ -220,11 +227,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, concepts_map, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one prefixed", [["one", "prefixed"]]),
|
||||
@@ -235,7 +238,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one prefixed", [
|
||||
["twenty ", "one", "prefixed"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "prefixed"],
|
||||
[CN("twenties", "twenty one", 0, 2), "prefixed"],
|
||||
]),
|
||||
("x$!# prefixed", [["x$!#", "prefixed"]]),
|
||||
])
|
||||
@@ -244,11 +247,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, cmap, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one prefixed prefixed", [["one", "prefixed prefixed"]]),
|
||||
@@ -259,7 +258,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one prefixed prefixed", [
|
||||
["twenty ", "one", "prefixed prefixed"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "prefixed prefixed"],
|
||||
[CN("twenties", "twenty one", 0, 2), "prefixed prefixed"],
|
||||
]),
|
||||
("x$!# prefixed prefixed", [["x$!#", "prefixed prefixed"]]),
|
||||
|
||||
@@ -271,7 +270,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("twenty one long name prefixed", [
|
||||
["twenty ", "one", "long name prefixed"],
|
||||
[cnode("twenties", 0, 2, "twenty one"), "long name prefixed"],
|
||||
[CN("twenties", "twenty one", 0, 2), "long name prefixed"],
|
||||
]),
|
||||
("x$!# long name prefixed", [["x$!#", "long name prefixed"]]),
|
||||
])
|
||||
@@ -287,11 +286,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, concepts_map, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("suffixed one", [["one", "suffixed"]]),
|
||||
@@ -302,7 +297,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
]),
|
||||
("suffixed twenty one", [
|
||||
["twenty ", "suffixed", "one"],
|
||||
[cnode("twenties", 2, 4, "twenty one"), "suffixed"],
|
||||
[CN("twenties", "twenty one", 2, 4), "suffixed"],
|
||||
]),
|
||||
("suffixed x$!#", [["x$!#", "suffixed"]]),
|
||||
])
|
||||
@@ -311,11 +306,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, cmap, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("suffixed suffixed one", ["one", "suffixed suffixed"]),
|
||||
@@ -333,8 +324,10 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one ? two : three", [["one", "two", "three", "?"]]),
|
||||
@@ -342,14 +335,14 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
("1+1 ? one + two : twenty one", [
|
||||
["1+1", "one", " + ", "two"], # error is detected so the parsing has stopped
|
||||
["1+1", "one + two", "twenty ", "?", ("one", 1)],
|
||||
["1+1", "one + two", short_cnode("twenties", "twenty one"), "?"],
|
||||
["1+1", "one + two", CN("twenties", "twenty one"), "?"],
|
||||
]),
|
||||
("x$!# ? y$!# : z$!#", [["x$!#", "y$!#", "z$!#", "?"]]),
|
||||
|
||||
("if one then two else three end", [["one", "two", "three", "if"]]),
|
||||
("if 1+1 then x$!# else twenty one end", [
|
||||
["1+1", "x$!#", "twenty ", "one"], # an error is detected
|
||||
["1+1", "x$!#", short_cnode("twenties", "twenty one"), "if"],
|
||||
["1+1", "x$!#", CN("twenties", "twenty one"), "if"],
|
||||
]),
|
||||
("if x$!# then one + two else z$!# end", [
|
||||
["x$!#", "one", " + ", "two"], # error is detected so the parsing has stopped
|
||||
@@ -373,24 +366,20 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
# assert len(res_i.errors) == 0 # Do not validate errors
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, cmap, expression, validate_errors=False)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
("one ? ? two : : three", [["one", "two", "three", "? ?"]]),
|
||||
("1+1 ? ? one + two : : twenty one", [
|
||||
["1+1", "one", " + ", "two"], # error
|
||||
["1+1", "one + two", "twenty ", "? ?", ("one", 1)],
|
||||
["1+1", "one + two", short_cnode("twenties", "twenty one"), "? ?"],
|
||||
["1+1", "one + two", CN("twenties", "twenty one"), "? ?"],
|
||||
]),
|
||||
|
||||
("if if one then then two else else three end end ", [["one", "two", "three", "if if"]]),
|
||||
("if if 1+1 then then x$!# else else twenty one end end ", [
|
||||
["1+1", "x$!#", "twenty ", "one"], # error
|
||||
["1+1", "x$!#", short_cnode("twenties", "twenty one"), "if if"]]),
|
||||
["1+1", "x$!#", CN("twenties", "twenty one"), "if if"]]),
|
||||
])
|
||||
def test_i_can_post_fix_ternary_concept_with_long_names(self, expression, expected_sequences):
|
||||
concepts_map = {
|
||||
@@ -405,11 +394,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
# assert len(res_i.errors) == 0 # Do not validate errors
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, concepts_map, expression, validate_errors=False)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("foo bar baz", ["baz", "bar", "foo"]),
|
||||
@@ -428,7 +413,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("baz bar foo", ["baz", "bar", "foo"]),
|
||||
@@ -451,7 +437,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("one plus two mult three", ["one", "two", "three", "mult", "plus"]),
|
||||
@@ -466,7 +453,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_i_can_post_fix_unary_with_precedence(self):
|
||||
concepts_map = {
|
||||
@@ -487,7 +475,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
# change the precedence
|
||||
sya_def = {
|
||||
@@ -502,7 +491,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_i_can_post_fix_right_associated_binary(self):
|
||||
concepts_map = {
|
||||
@@ -524,7 +514,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_i_can_post_fix_left_associated_binary(self):
|
||||
concepts_map = {
|
||||
@@ -546,7 +537,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("x$!# ? y$!# : z$!# ? two : three", ["x$!#", "y$!#", "z$!#", "two", "three", ("?", 1), "?"]),
|
||||
@@ -572,8 +564,10 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("x$!# ? y$!# : z$!# ? two : three", ["x$!#", "y$!#", "z$!#", "?", "two", "three", ("?", 1)]),
|
||||
@@ -599,8 +593,10 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_i_can_post_fix_when_multiple_concepts_are_found(self):
|
||||
concepts_map = {
|
||||
@@ -617,11 +613,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
["baz", "foo bar"]
|
||||
]
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
assert len(res_i.errors) == 0
|
||||
expected_array = compute_expected_array(concepts_map, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, concepts_map, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
# ("function(one plus three) minus two",
|
||||
@@ -667,7 +659,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_sequences", [
|
||||
# composition
|
||||
@@ -681,20 +674,18 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
[[SCWC("function(", ")", CNC("prefixed", a=CIO("twenties", source="twenty two")))]]),
|
||||
("function(if one then twenty two else three end)",
|
||||
[[SCWC("function(", ")", CNC("if", a="one", b=CIO("twenties", source="twenty two"), c="three", end=16))]]),
|
||||
("func1(func2(one two) three)",
|
||||
[[SCWC("func1(", (")", 1), SCWC("func2(", ")", "one", "two"), "three")]]),
|
||||
|
||||
("twenty two(suffixed one)", [
|
||||
["twenty ", SCWC("two(", ")", CNC("suffixed", a="one"))],
|
||||
[CN("twenties", source="twenty two"), "one", "suffixed"],
|
||||
[CN("twenties", "twenty two"), "one", "suffixed"],
|
||||
]),
|
||||
("twenty two(one prefixed)", [
|
||||
["twenty ", SCWC("two(", ")", CNC("prefixed", a="one"))],
|
||||
[CN("twenties", source="twenty two"), "one", "prefixed"],
|
||||
[CN("twenties", "twenty two"), "one", "prefixed"],
|
||||
]),
|
||||
("f1(one plus two mult three) plus f2(suffixed x$!# prefixed)", [
|
||||
[SCWC("f1(", ")", CN("plus", source="one plus two mult three")),
|
||||
SCWC("f2(", (")", 1), CN("suffixed", source="suffixed x$!# prefixed")),
|
||||
("f1(one plus two mult three) plus f2(suffixed xxx prefixed)", [
|
||||
[SCWC("f1(", ")", CN("plus", "one plus two mult three")),
|
||||
SCWC("f2(", (")", 1), CN("suffixed", "suffixed xxx prefixed")),
|
||||
("plus", 1)]
|
||||
]),
|
||||
|
||||
@@ -706,8 +697,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
[SCWC("f1(", ")", "one"), SCWC("f2(", (")", 1), "two"), SCWC("f3(", (")", 2), "three"), "if"]]),
|
||||
|
||||
# Sequence
|
||||
("if one then two else three end function(x$!#)", [
|
||||
["one", "two", "three", "if", UTN(" ", start=13, end=13), SCWC("function(", ")", "x$!#")]]),
|
||||
("if one then two else three end function(xxx)", [
|
||||
["one", "two", "three", "if", UTN(" ", start=13, end=13), SCWC("function(", ")", "xxx")]]),
|
||||
("one prefixed function(two)", [["one", "prefixed", UTN(" ", start=3, end=3), SCWC("function(", ")", "two")]]),
|
||||
("suffixed one function(two)", [["one", "suffixed", UTN(" ", start=3, end=3), SCWC("function(", ")", "two")]]),
|
||||
("func(one, two, three)", [[SCWC("func(", ")", "one", ", ", "two", (", ", 1), "three")]]),
|
||||
@@ -717,10 +708,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
assert len(res) == len(expected_sequences)
|
||||
for res_i, expected in zip(res, expected_sequences):
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
assert res_i.out == expected_array
|
||||
self.compare_results(res, expected_sequences, cmap, expression)
|
||||
|
||||
@pytest.mark.parametrize("expression, expected", [
|
||||
("(", ("(", 0)),
|
||||
@@ -800,7 +788,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression", [
|
||||
"one ? two : three",
|
||||
@@ -818,7 +807,8 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_the_more_concepts_the_more_results(self):
|
||||
concepts_map = {
|
||||
@@ -837,7 +827,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
expression = "a plus plus equals b"
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
expected_array = tests.parsers.parsers_utils.compute_debug_array(res)
|
||||
expected_array = compute_debug_array(res)
|
||||
assert len(expected_array) == len([
|
||||
["T(a)", "C(a plus b)", "C(a plus b)", "T(equals)", "T(b)"],
|
||||
["T(a)", "C(a plus b)", "C(a plus plus)", "T(equals)", "T(b)"],
|
||||
@@ -861,14 +851,17 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
sheerka, context, parser = self.init_parser(concepts_map, None)
|
||||
|
||||
res = parser.infix_to_postfix(context, ParserInput("one ? ? two '::' three"))
|
||||
assert len(res) == 1
|
||||
assert res[0].out == [
|
||||
cnode("one", start=0, end=0, source="one"),
|
||||
cnode("two", start=6, end=6, source="two"),
|
||||
cnode("three", start=10, end=10, source="three"),
|
||||
expected_array = [
|
||||
CN("one", start=0, end=0, source="one"),
|
||||
CN("two", start=6, end=6, source="two"),
|
||||
CN("three", start=10, end=10, source="three"),
|
||||
SyaConceptParserHelper(concepts_map["ternary"], 2),
|
||||
]
|
||||
|
||||
assert len(res) == 1
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
def test_i_cannot_chain_non_associative(self):
|
||||
concepts_map = {
|
||||
"less than": Concept("a less than b").def_var("a").def_var("b"),
|
||||
@@ -897,10 +890,12 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expression = "suffixed twenties"
|
||||
res = parser.infix_to_postfix(context, ParserInput(expression))
|
||||
|
||||
expected = [cnode("twenties", 2, 2, "twenties"), "suffixed"]
|
||||
expected = [CN("twenties", "twenties", 2, 2), "suffixed"]
|
||||
expected_array = compute_expected_array(cmap, expression, expected)
|
||||
|
||||
assert len(res) == 1
|
||||
assert res[0].out == expected_array
|
||||
transformed_out = get_test_obj(res[0].out, expected_array)
|
||||
assert transformed_out == expected_array
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_debugs", [
|
||||
("one", [[" 0:one => PUSH_UNREC"]]),
|
||||
@@ -999,12 +994,12 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap["plus"], 0, 8, source=text)]
|
||||
compare_with_test_object(lexer_nodes, [CN(cmap["plus"], text, 0, 8)])
|
||||
|
||||
# check the compiled
|
||||
expected_concept = lexer_nodes[0].concept
|
||||
assert expected_concept.get_compiled()["a"] == cmap["one"]
|
||||
assert expected_concept.get_compiled()["b"] == CMV(cmap["mult"], a="two", b="three")
|
||||
compare_with_test_object(expected_concept.get_compiled()["b"], CMV(cmap["mult"], a="two", b="three"))
|
||||
assert expected_concept.get_compiled()["b"].get_compiled()["a"] == cmap["two"]
|
||||
assert expected_concept.get_compiled()["b"].get_compiled()["b"] == cmap["three"]
|
||||
|
||||
@@ -1023,7 +1018,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap["suffixed"], 0, 6, source=text)]
|
||||
compare_with_test_object(lexer_nodes, [CN(cmap["suffixed"], text, 0, 6)])
|
||||
|
||||
# check the compiled
|
||||
expected_concept = lexer_nodes[0].concept
|
||||
@@ -1051,7 +1046,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
lexer_nodes = res[1].body.body
|
||||
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap["suffixed"], 0, 4, source=text)]
|
||||
compare_with_test_object(lexer_nodes, [CN(cmap["suffixed"], text, 0, 4)])
|
||||
|
||||
# check the compiled
|
||||
expected_concept = lexer_nodes[0].concept
|
||||
@@ -1071,9 +1066,9 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [
|
||||
CN(cmap["plus"], 0, 9, source="one plus 1 + 1 "),
|
||||
CN(cmap["suffixed"], 10, 12, source="suffixed two")]
|
||||
compare_with_test_object(lexer_nodes, [
|
||||
CN(cmap["plus"], "one plus 1 + 1 ", 0, 9),
|
||||
CN(cmap["suffixed"], "suffixed two", 10, 12)])
|
||||
|
||||
# check the compiled
|
||||
concept_plus_a = lexer_nodes[0].concept.get_compiled()["a"]
|
||||
@@ -1105,7 +1100,9 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, text, expected_result)
|
||||
assert res.status == expected_status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == expected_array
|
||||
|
||||
transformed_nodes = get_test_obj(lexer_nodes, expected_array)
|
||||
assert transformed_nodes == expected_array
|
||||
|
||||
@pytest.mark.parametrize("text", [
|
||||
"function(suffixed one)",
|
||||
@@ -1166,11 +1163,15 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, text, expected_result)
|
||||
assert not res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == expected_array
|
||||
|
||||
transformed_nodes = get_test_obj(lexer_nodes, expected_array)
|
||||
assert transformed_nodes == expected_array
|
||||
|
||||
# assert lexer_nodes == expected_array
|
||||
|
||||
@pytest.mark.parametrize("text, expected_result", [
|
||||
("a plus b", [CN("plus", source="a plus b")]),
|
||||
("suffixed a plus b", [CN("suffixed", source="suffixed a plus b")]),
|
||||
("a plus b", [CN("plus", "a plus b")]),
|
||||
("suffixed a plus b", [CN("suffixed", "suffixed a plus b")]),
|
||||
])
|
||||
def test_i_can_almost_parse_concept_definition(self, text, expected_result):
|
||||
"""
|
||||
@@ -1190,7 +1191,9 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
expected_array = compute_expected_array(cmap, text, expected_result)
|
||||
assert not res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == expected_array
|
||||
transformed_nodes = get_test_obj(lexer_nodes, expected_array)
|
||||
assert transformed_nodes == expected_array
|
||||
# assert lexer_nodes == expected_array
|
||||
|
||||
@pytest.mark.parametrize("text, expected_concept, expected_unrecognized", [
|
||||
("x$!# prefixed", "prefixed", ["a"]),
|
||||
@@ -1209,15 +1212,18 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert not res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap[expected_concept], 0, expected_end, source=text)]
|
||||
expected_array = [CN(cmap[expected_concept], text, 0, expected_end)]
|
||||
transformed_nodes = get_test_obj(lexer_nodes, expected_array)
|
||||
assert transformed_nodes == expected_array
|
||||
# assert lexer_nodes == [CN(cmap[expected_concept], text, 0, expected_end)]
|
||||
|
||||
concept_found = lexer_nodes[0].concept
|
||||
for unrecognized in expected_unrecognized:
|
||||
assert isinstance(concept_found.get_compiled()[unrecognized], UnrecognizedTokensNode)
|
||||
|
||||
@pytest.mark.parametrize("text, expected", [
|
||||
("x$!# suffixed one", [utnode(0, 4, "x$!# "), cnode("suffixed __var__0", 5, 7, "suffixed one")]),
|
||||
("one prefixed x$!#", [cnode("__var__0 prefixed", 0, 2, "one prefixed"), utnode(3, 7, " x$!#")]),
|
||||
("x$!# suffixed one", [UTN("x$!# ", 0, 4), CN("suffixed __var__0", "suffixed one", 5, 7)]),
|
||||
("one prefixed x$!#", [CN("__var__0 prefixed", "one prefixed", 0, 2), UTN(" x$!#", 3, 7)]),
|
||||
])
|
||||
def test_i_cannot_parse_when_part_of_the_sequence_is_not_recognized(self, text, expected):
|
||||
sheerka, context, parser = self.init_parser()
|
||||
@@ -1228,7 +1234,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert not res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == expected
|
||||
compare_with_test_object(lexer_nodes, expected)
|
||||
|
||||
def test_i_cannot_parse_function_using_short_name(self):
|
||||
concepts_map = {
|
||||
@@ -1301,15 +1307,15 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert len(actual) == 1
|
||||
|
||||
assert actual[0].to_out == resolved_to_out
|
||||
compare_with_test_object(actual[0].to_out, resolved_to_out)
|
||||
actual[0].function.fix_source()
|
||||
assert actual[0].function == resolved_function_name[0]
|
||||
compare_with_test_object(actual[0].function, resolved_function_name[0])
|
||||
|
||||
@pytest.mark.parametrize("expression, expected_list", [
|
||||
("twenty two function(", [(["twenty ", "two", UTN(" ", 3, 3)], "function("),
|
||||
([CN("twenties", source="twenty two"), UTN(" ", 3, 3)], "function(")]),
|
||||
([CN("twenties", "twenty two"), UTN(" ", 3, 3)], "function(")]),
|
||||
("twenty two(", [(["twenty "], "two("),
|
||||
([CN("twenties", source="twenty two")], None)]),
|
||||
([CN("twenties", "twenty two")], None)]),
|
||||
])
|
||||
def test_i_can_get_functions_names_from_unrecognized_when_multiple_results(self, expression, expected_list):
|
||||
sheerka, context, parser = self.init_parser()
|
||||
@@ -1326,11 +1332,11 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
for actual, expected in zip(actual_list, expected_list):
|
||||
resolved_to_out = compute_expected_array(cmap, expression, expected[0])
|
||||
|
||||
assert actual.to_out == resolved_to_out
|
||||
compare_with_test_object(actual.to_out, resolved_to_out)
|
||||
if actual.function:
|
||||
actual.function.fix_source()
|
||||
resolved_function_name = compute_expected_array(cmap, expression, [expected[1]])
|
||||
assert actual.function == resolved_function_name[0]
|
||||
compare_with_test_object(actual.function, resolved_function_name[0])
|
||||
else:
|
||||
assert actual.function is None
|
||||
|
||||
@@ -1344,7 +1350,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap["suffixed"], 0, 6, source=text)]
|
||||
compare_with_test_object(lexer_nodes, [CN(cmap["suffixed"], text, 0, 6)])
|
||||
|
||||
# add an ontology layer and make sure will still can parse
|
||||
sheerka.push_ontology(context, "new ontology")
|
||||
@@ -1356,7 +1362,7 @@ class TestSyaNodeParser(TestUsingMemoryBasedSheerka):
|
||||
|
||||
assert res.status
|
||||
assert context.sheerka.isinstance(wrapper, BuiltinConcepts.PARSER_RESULT)
|
||||
assert lexer_nodes == [CN(cmap["suffixed"], 0, 6, source=text)]
|
||||
compare_with_test_object(lexer_nodes, [CN(cmap["suffixed"], text, 0, 6)])
|
||||
|
||||
|
||||
class TestFileBaseSyaNodeParser(TestUsingFileBasedSheerka):
|
||||
|
||||
Reference in New Issue
Block a user