e69745adc8
Fixed #99 : SheerkaQueryManager: I can manage contains predicate when filtering objects Fixed #97 : ERROR: list indices must be integers or slices, not Concept Fixed #96 : SequenceNodeParser: SequenceNodeParser must correctly handle concept definition Fixed #95 : ResolveAmbiguity must not remove concepts that do not require evaluation Fixed #94 : Concepts with the same key are lost when new ontology Fixed #93 : Introduce BuiltinConcepts.EVAL_GLOBAL_TRUTH_REQUESTED Fixed #92 : ExpressionParser: Implement compile_disjunctions() Fixed #91 : Implement get_concepts_complexity(context, concepts, concept_parts) Fixed #90 : ResolveAmbiguity : where predicate is not used to resolve ambiguity Fixed #89 : ResolveAmbiguityEvaluator: Concepts embedded in ConceptNode are not resolved Fixed #88: SyaNodeParser: Parse multiple parameters when some of the are not recognized Fixed #87: SyaNodeParser : Parse the multiple parameters
85 lines
3.7 KiB
Python
85 lines
3.7 KiB
Python
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
|
|
global_truth_context = self.get_context(sheerka, global_truth=True)
|
|
sheerka.set_isa(global_truth_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",)
|