Files
Sheerka-Old/tests/evaluators/test_ExpressionEvaluator.py
T
kodjo e69745adc8 Fixed #100 : SheerkaAdmin: Add builtins() command
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
2021-07-31 08:52:00 +02:00

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",)