Files
Sheerka-Old/tests/evaluators/test_ConceptEvaluator.py
T
kodjo 7dcaa9c111 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)
2021-06-07 21:14:03 +02:00

119 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.value.key == "foo"
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