Fixed #29: Parsers: Implement parsing memoization
Fixed #77 : Parser: ShortTermMemoryParser should be called separately Fixed #78 : Remove VariableNode usage Fixed #79 : ConceptManager: Implement compile caching Fixed #80 : SheerkaExecute : parsers_key is not correctly computed Fixed #81 : ValidateConceptEvaluator : Validate concept's where and pre clauses right after the parsing Fixed #82 : SheerkaIsAManager: isa() failed when the set as a body Fixed #83 : ValidateConceptEvaluator : Support BNF and SYA Concepts Fixed #84 : ExpressionParser: Implement the parser as a standard parser Fixed #85 : Services: Give order to services Fixed #86 : cannot manage smart_get_attr(the short, color)
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import pytest
|
||||
|
||||
from core.builtin_concepts_ids import BuiltinConcepts
|
||||
from core.concept import Concept
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from evaluators.BaseEvaluator import BaseEvaluator
|
||||
from evaluators.ExpressionEvaluator import ExpressionEvaluator
|
||||
from parsers.BaseExpressionParser import AndNode
|
||||
from parsers.ExpressionParser import ExpressionParser
|
||||
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
||||
from tests.evaluators.EvaluatorTestsUtils import pr_ret_val, e_ret_val_true
|
||||
|
||||
|
||||
class TestExpressionEvaluator(TestUsingMemoryBasedSheerka):
|
||||
|
||||
@pytest.mark.parametrize("return_value, expected", [
|
||||
(pr_ret_val(AndNode(0, 0, [])), True),
|
||||
(pr_ret_val(AndNode(0, 0, []), status=False), False),
|
||||
(pr_ret_val("not a ExprNode", status=True), False),
|
||||
(e_ret_val_true("no parser result"), False),
|
||||
])
|
||||
def test_i_can_match(self, return_value, expected):
|
||||
sheerka, context = self.init_concepts()
|
||||
evaluator = ExpressionEvaluator()
|
||||
|
||||
assert evaluator.matches(context, return_value) == expected
|
||||
|
||||
def test_i_can_eval(self):
|
||||
sheerka, context, one, number, isa = self.init_concepts(
|
||||
"one",
|
||||
"number",
|
||||
Concept("x is a y", body="isa(x,y)", pre="is_question()").def_var("x").def_var("y"))
|
||||
evaluator = ExpressionEvaluator()
|
||||
|
||||
context.add_to_protected_hints(BuiltinConcepts.EVAL_QUESTION_REQUESTED)
|
||||
|
||||
parsed_return_value = ExpressionParser().parse(context, ParserInput("one is a number"))
|
||||
|
||||
# first time, it returns False
|
||||
res = evaluator.eval(context, parsed_return_value)
|
||||
assert res.status
|
||||
assert res.who == BaseEvaluator.PREFIX + ExpressionEvaluator.NAME
|
||||
assert not res.body
|
||||
|
||||
# second time
|
||||
sheerka.set_isa(context, one, number)
|
||||
parsed_return_value = ExpressionParser().parse(context, ParserInput("one is a number"))
|
||||
res = evaluator.eval(context, parsed_return_value)
|
||||
assert res.status
|
||||
assert res.body
|
||||
|
||||
def test_i_do_not_mess_up_use_copy(self):
|
||||
sheerka, context, one, number, isa = self.init_concepts(
|
||||
"one",
|
||||
"number",
|
||||
Concept("x is a y", body="isa(x,y)", pre="is_question()").def_var("x").def_var("y"))
|
||||
evaluator = ExpressionEvaluator()
|
||||
|
||||
parsed_return_value = ExpressionParser().parse(context, ParserInput("one is a number"))
|
||||
concept = next(iter(parsed_return_value.body.body.compiled[0].return_value.body.body.objects.values()))
|
||||
assert concept.get_compiled()["x"][0].body.body.get_hints().use_copy
|
||||
assert concept.get_compiled()["y"][0].body.body.get_hints().use_copy
|
||||
|
||||
evaluator.eval(context, parsed_return_value)
|
||||
concept = next(iter(parsed_return_value.body.body.compiled[0].return_value.body.body.objects.values()))
|
||||
assert concept.get_compiled()["x"][0].body.body.get_hints().use_copy
|
||||
assert concept.get_compiled()["y"][0].body.body.get_hints().use_copy
|
||||
|
||||
def test_i_cannot_eval_when_variables_are_missing(self):
|
||||
sheerka, context, one, number, isa = self.init_concepts(
|
||||
"one",
|
||||
"number",
|
||||
Concept("x is a y", body="isa(x,y)", pre="is_question()").def_var("x").def_var("y"))
|
||||
evaluator = ExpressionEvaluator()
|
||||
|
||||
parsed_return_value = ExpressionParser().parse(context, ParserInput("self is a number"))
|
||||
res = evaluator.eval(context, parsed_return_value)
|
||||
|
||||
assert not res.status
|
||||
assert sheerka.isinstance(res.body, BuiltinConcepts.ERROR)
|
||||
assert len(res.body.body) == 1
|
||||
assert isinstance(res.body.body[0], NameError)
|
||||
assert res.body.body[0].args == ("self",)
|
||||
Reference in New Issue
Block a user