118 lines
5.0 KiB
Python
118 lines
5.0 KiB
Python
import pytest
|
|
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
|
|
from core.concept import Concept, ConceptParts
|
|
from evaluators.ConceptEvaluator import ConceptEvaluator
|
|
|
|
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
|
|
|
|
|
class TestAddConceptEvaluator(TestUsingMemoryBasedSheerka):
|
|
|
|
@pytest.mark.parametrize("ret_val, expected", [
|
|
(ReturnValueConcept("some_name", True, ParserResultConcept(value=Concept())), True),
|
|
(ReturnValueConcept("some_name", False, ParserResultConcept(value=Concept())), False),
|
|
(ReturnValueConcept("some_name", True, ParserResultConcept(value="Not a concept")), False),
|
|
(ReturnValueConcept("some_name", True, Concept()), False),
|
|
])
|
|
def test_i_can_match(self, ret_val, expected):
|
|
context = self.get_context()
|
|
assert ConceptEvaluator().matches(context, ret_val) == expected
|
|
|
|
def test_i_can_evaluate_concept(self):
|
|
context = self.get_context()
|
|
context.protected_hints.update({BuiltinConcepts.EVAL_BODY_REQUESTED, BuiltinConcepts.EVAL_WHERE_REQUESTED})
|
|
concept = Concept(name="foo",
|
|
where="True",
|
|
pre="2 > 1",
|
|
post="4").def_var("a", "5").def_var("b", "6")
|
|
|
|
evaluator = ConceptEvaluator()
|
|
item = self.pretval(concept)
|
|
result = evaluator.eval(context, item)
|
|
|
|
assert result.who == evaluator.name
|
|
assert result.status
|
|
assert result.value.name == "foo"
|
|
assert result.value.get_value(ConceptParts.WHERE) == True
|
|
assert result.value.get_value(ConceptParts.PRE) == True
|
|
assert result.value.get_value(ConceptParts.POST) == 4
|
|
assert result.value.get_value("a") == 5
|
|
assert result.value.get_value("b") == 6
|
|
assert result.parents == [item]
|
|
|
|
def test_body_is_returned_when_defined_and_requested(self):
|
|
context = self.get_context()
|
|
context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
|
concept = Concept(name="foo",
|
|
body="'I have a value'",
|
|
where="True",
|
|
pre="True",
|
|
post="3").set_value("a", "4").set_value("b", "5")
|
|
|
|
evaluator = ConceptEvaluator(return_body=True)
|
|
item = self.pretval(concept)
|
|
result = evaluator.eval(context, item)
|
|
|
|
assert result.who == evaluator.name
|
|
assert result.status
|
|
assert result.value == "I have a value"
|
|
assert result.parents == [item]
|
|
|
|
def test_body_is_not_returned_if_not_requested(self):
|
|
context = self.get_context()
|
|
concept = Concept(name="foo",
|
|
body="'I have a value'",
|
|
where="True",
|
|
pre="True",
|
|
post="3").set_value("a", "4").set_value("b", "5")
|
|
|
|
evaluator = ConceptEvaluator(return_body=False) # which is the default behaviour
|
|
item = self.pretval(concept)
|
|
result = evaluator.eval(context, item)
|
|
|
|
assert result.who == evaluator.name
|
|
assert result.status
|
|
assert result.value == concept
|
|
assert result.parents == [item]
|
|
|
|
def test_i_can_eval_if_with_the_same_name_is_defined_in_the_context(self):
|
|
# If we evaluate Concept("foo", body="a").set_value("a", "'property_a'")
|
|
# ConceptEvaluator will be called to resolve 'a' while we know that 'a' refers to the string 'property_a'
|
|
|
|
context = self.get_context()
|
|
context.obj = Concept("other").set_value("foo", "'some_other_value'")
|
|
concept = Concept(name="foo")
|
|
|
|
item = self.pretval(concept)
|
|
result = ConceptEvaluator().eval(context, item)
|
|
|
|
assert result.status
|
|
assert result.value == "'some_other_value'"
|
|
|
|
def test_i_cannot_recognize_a_concept_if_one_of_the_prop_is_unknown(self):
|
|
sheerka, context, one, concept_plus = self.init_concepts(
|
|
"one",
|
|
Concept(name="a plus b").def_var("a", "one").def_var("b", "two"))
|
|
context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
|
|
|
evaluator = ConceptEvaluator()
|
|
item = self.pretval(concept_plus)
|
|
result = evaluator.eval(context, item)
|
|
|
|
assert not result.status
|
|
assert context.sheerka.isinstance(result.value, BuiltinConcepts.CONCEPT_EVAL_ERROR)
|
|
assert result.value.concept == concept_plus
|
|
assert result.value.property_name == "b"
|
|
assert context.sheerka.isinstance(result.value.error, BuiltinConcepts.ERROR)
|
|
|
|
def test_that_error_concepts_are_transformed_into_errors_only_if_the_key_is_different(self):
|
|
context = self.get_context()
|
|
|
|
error_concept = context.sheerka.new(BuiltinConcepts.ERROR)
|
|
item = self.pretval(error_concept)
|
|
result = ConceptEvaluator().eval(context, item)
|
|
|
|
assert not context.sheerka.is_success(error_concept) # it's indeed an error
|
|
assert result.status
|
|
assert result.value == error_concept
|