89e1f20975
Fixed #130 : ArithmeticOperatorParser Fixed #129 : python_wrapper : create_namespace Fixed #128 : ExpressionParser: Cannot parse func(x) infixed concept 'xxx'
87 lines
3.9 KiB
Python
87 lines
3.9 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"))
|
|
context.add_to_protected_hints(BuiltinConcepts.EVAL_QUESTION_REQUESTED)
|
|
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"))
|
|
context.add_to_protected_hints(BuiltinConcepts.EVAL_QUESTION_REQUESTED)
|
|
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",)
|