Added SyaNodeParser (finally, after one month)

This commit is contained in:
2020-04-09 15:42:36 +02:00
parent c9acfa99a1
commit 6c7c529016
56 changed files with 5322 additions and 404 deletions
+111 -21
View File
@@ -1,9 +1,9 @@
import pytest
from core.builtin_concepts import BuiltinConcepts
from core.concept import Concept, PROPERTIES_TO_SERIALIZE, Property, simplec
from evaluators.MutipleSameSuccessEvaluator import MultipleSameSuccessEvaluator
from parsers.ConceptLexerParser import Sequence, StrMatch, OrderedChoice, Optional, ConceptExpression
from parsers.BaseNodeParser import SyaAssociativity
from parsers.BnfNodeParser import Sequence, StrMatch, OrderedChoice, Optional, ConceptExpression
from sdp.sheerkaDataProvider import SheerkaDataProvider
from tests.TestUsingFileBasedSheerka import TestUsingFileBasedSheerka
@@ -125,6 +125,17 @@ as:
assert sheerka.sdp.io.exists(
sheerka.sdp.io.get_obj_path(SheerkaDataProvider.ObjectsFolder, concept_saved.get_origin()))
def test_i_can_def_several_concepts(self):
sheerka = self.get_sheerka(use_dict=False)
sheerka.evaluate_user_input("def concept foo")
sheerka = self.get_sheerka(use_dict=False)
res = sheerka.evaluate_user_input("def concept bar")
assert len(res) == 1
assert res[0].status
assert res[0].body.body.id == "1002"
def test_i_can_evaluate_def_concept_part_when_one_part_is_a_ref_of_another_concept(self):
"""
In this test, we test that the properties of 'concept a xx b' (which are 'a' and 'b')
@@ -393,6 +404,7 @@ as:
assert concept_found.get_prop("a") is None
assert not concept_found.metadata.need_validation
# @pytest.mark.xfail
@pytest.mark.parametrize("desc, definitions", [
("Simple form", [
"def concept one as 1",
@@ -467,6 +479,7 @@ as:
assert res[0].status
assert res[0].body == 23
# @pytest.mark.xfail
def test_i_can_mix_bnf_and_isa(self):
"""
if 'one' isa 'number, twenty number should be recognized
@@ -531,7 +544,44 @@ as:
assert res[0].status
assert res[0].body == 21
def test_i_can_mix_concept_of_concept(self):
# @pytest.mark.xfail
def test_i_can_use_concepts_defined_with_from(self):
sheerka = self.get_sheerka()
init = [
"def concept plus from a plus b as a + b",
"def concept one as 1",
]
for exp in init:
sheerka.evaluate_user_input(exp)
res = sheerka.evaluate_user_input("eval one plus one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 2
res = sheerka.evaluate_user_input("eval 1 plus one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 2
res = sheerka.evaluate_user_input("eval one plus 1")
assert len(res) == 1
assert res[0].status
assert res[0].body == 2
res = sheerka.evaluate_user_input("eval 1 plus 2")
assert len(res) == 1
assert res[0].status
assert res[0].body == 3
res = sheerka.evaluate_user_input("eval 1 plus 1")
assert len(res) == 1
assert res[0].status
assert res[0].body == 2
def test_i_can_mix_bnf_concept_and_concept(self):
definitions = [
"def concept one as 1",
"def concept two as 2",
@@ -631,24 +681,6 @@ as:
assert res[1].status
assert res[1].body == "little blue(house)"
@pytest.mark.xfail
def test_i_can_recognize_composition_of_concept_with_priority(self):
sheerka = self.get_sheerka()
definitions = [
"def concept a plus b where a,b",
"def concept a times b where a,b",
"modify concept 1001 set priority = 1",
"modify concept 1002 set priority = 2",
]
for definition in definitions:
sheerka.evaluate_user_input(definition)
res = sheerka.evaluate_user_input("1 plus 2 times 3")
assert res[0].status
# check that the priority is applied
def test_i_can_say_that_a_concept_isa_another_concept(self):
sheerka = self.get_sheerka()
sheerka.evaluate_user_input("def concept foo")
@@ -768,6 +800,7 @@ as:
assert not res[0].status
assert sheerka.isinstance(res[0].body, BuiltinConcepts.WHERE_CLAUSE_FAILED)
# def test_i_can_detect_when_only_one_evaluator_is_in_error(self):
# sheerka = self.get_sheerka()
#
@@ -864,3 +897,60 @@ as:
twenties = sheerka.get("twenties")
number = sheerka.get("number")
assert sheerka.isa(twenties, number)
def test_i_can_mix_sya_concepts_and_bnf_concept(self):
definitions = [
"def concept one as 1",
"def concept two as 2",
"def concept three as 3",
"def concept plus from a plus b as a + b",
"def concept mult from a mult b as a * b",
"def concept twenties from bnf 'twenty' (one|two)=unit as 20 + unit",
]
sheerka = self.init_scenario(definitions)
context = self.get_context(sheerka)
sheerka.set_sya_def(context, [
(sheerka.get("mult").id, 20, SyaAssociativity.Right),
(sheerka.get("plus").id, 10, SyaAssociativity.Right),
])
res = sheerka.evaluate_user_input("eval one plus two mult three")
assert len(res) == 1
assert res[0].status
assert res[0].body == 7
res = sheerka.evaluate_user_input("eval two mult three plus one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 7
res = sheerka.evaluate_user_input("eval 1 plus two mult 3")
assert len(res) == 1
assert res[0].status
assert res[0].body == 7
res = sheerka.evaluate_user_input("eval 2 mult 3 plus one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 7
res = sheerka.evaluate_user_input("eval twenty two plus 1")
assert len(res) == 1
assert res[0].status
assert res[0].body == 23
res = sheerka.evaluate_user_input("eval 1 plus twenty two")
assert len(res) == 1
assert res[0].status
assert res[0].body == 23
res = sheerka.evaluate_user_input("eval twenty one plus twenty two")
assert len(res) == 1
assert res[0].status
assert res[0].body == 43
res = sheerka.evaluate_user_input("eval twenty two plus twenty one mult two")
assert len(res) == 1
assert res[0].status
assert res[0].body == 64