Files
Sheerka-Old/tests/test_ConceptEvaluator.py
T

210 lines
7.4 KiB
Python

import pytest
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
from core.concept import Concept
from core.sheerka import Sheerka, ExecutionContext
from evaluators.ConceptEvaluator import ConceptEvaluator
from parsers.BaseParser import BaseParser
from parsers.ExactConceptParser import ExactConceptParser
def get_context():
sheerka = Sheerka(skip_builtins_in_db=True)
sheerka.initialize("mem://")
return ExecutionContext("test", "xxx", sheerka)
def get_return_value(concept, source=None):
return ReturnValueConcept(
"some_name",
True,
ParserResultConcept(parser=ExactConceptParser(),
source=source or concept.name,
value=concept,
try_parsed=concept))
@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(ret_val, expected):
context = get_context()
assert ConceptEvaluator().matches(context, ret_val) == expected
def test_concept_is_returned_when_no_body():
context = get_context()
concept = Concept(name="one").init_key()
evaluator = ConceptEvaluator()
item = get_return_value(concept)
result = evaluator.eval(context, item)
assert result.who == evaluator.name
assert result.status
assert result.value == concept
assert result.parents == [item]
def test_body_is_evaluated_when_python_body():
context = get_context()
concept = Concept(name="one", body="1").init_key()
evaluator = ConceptEvaluator()
item = get_return_value(concept)
result = evaluator.eval(context, item)
assert result.who == evaluator.name
assert result.status
assert result.value == 1
assert result.parents == [item]
def test_body_is_evaluated_when_concept_body():
context = get_context()
concept_one = Concept(name="one").init_key()
context.sheerka.add_in_cache(concept_one)
concept_un = Concept(name="un", body="one").init_key()
evaluator = ConceptEvaluator()
item = get_return_value(concept_un)
result = evaluator.eval(context, item)
assert result.who == evaluator.name
assert result.status
assert result.value == concept_one
assert result.parents == [item]
def test_body_is_evaluated_when_concept_body_with_a_body():
"""
The concept refers to another concept which has a body
:return:
"""
context = get_context()
concept_one = Concept(name="one", body="1").init_key()
context.sheerka.add_in_cache(concept_one)
concept_un = Concept(name="un", body="one").init_key()
evaluator = ConceptEvaluator()
item = get_return_value(concept_un)
result = evaluator.eval(context, item)
assert result.who == evaluator.name
assert result.status
assert result.value == 1
assert result.parents == [item]
def test_i_can_evaluate_longer_chains():
context = get_context()
context.sheerka.add_in_cache(Concept(name="a", body="'a'").init_key())
context.sheerka.add_in_cache(Concept(name="b", body="a").init_key())
context.sheerka.add_in_cache(Concept(name="c", body="b").init_key())
concept_d = context.sheerka.add_in_cache(Concept(name="d", body="c").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_d)
result = evaluator.eval(context, item)
assert result.status
assert result.value == 'a'
def test_i_can_evaluate_longer_chains_2():
context = get_context()
concept_a = context.sheerka.add_in_cache(Concept(name="a").init_key())
context.sheerka.add_in_cache(Concept(name="b", body="a").init_key())
context.sheerka.add_in_cache(Concept(name="c", body="b").init_key())
concept_d = context.sheerka.add_in_cache(Concept(name="d", body="c").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_d)
result = evaluator.eval(context, item)
assert result.status
assert result.value == concept_a
def test_i_can_recognize_concept_properties():
"""
The concept 'plus' has some properties.
Let's check if they are recognized as concepts
:return:
"""
context = get_context()
concept_one = context.sheerka.add_in_cache(Concept(name="one").init_key())
concept_two = context.sheerka.add_in_cache(Concept(name="two").init_key())
concept_plus = context.sheerka.add_in_cache(Concept(name="a plus b")
.set_prop("a", "one")
.set_prop("b", "two").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_plus)
result = evaluator.eval(context, item)
assert result.status
assert context.sheerka.isinstance(result.value, concept_plus)
assert result.value.props["a"].value == concept_one
assert result.value.props["b"].value == concept_two
def test_i_can_recognize_concept_properties_with_body():
"""
The concept 'plus' has some properties.
Let's check if they are recognized as concepts with Python code
:return:
"""
context = get_context()
context.sheerka.add_in_cache(Concept(name="one", body="1").init_key())
context.sheerka.add_in_cache(Concept(name="two", body="2").init_key())
concept_plus = context.sheerka.add_in_cache(Concept(name="a plus b")
.set_prop("a", "one")
.set_prop("b", "two").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_plus)
result = evaluator.eval(context, item)
assert result.status
assert context.sheerka.isinstance(result.value, concept_plus)
assert result.value.props["a"].value == 1
assert result.value.props["b"].value == 2
def test_i_can_recognize_concept_properties_with_body_when_concept_has_a_body():
context = get_context()
context.sheerka.add_in_cache(Concept(name="one", body="1").init_key())
context.sheerka.add_in_cache(Concept(name="two", body="2").init_key())
concept_plus = context.sheerka.add_in_cache(Concept(name="a plus b", body="a + b")
.set_prop("a", "one")
.set_prop("b", "two").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_plus)
result = evaluator.eval(context, item)
assert result.status
assert result.value == 3
def test_i_cannot_recognize_a_concept_if_one_of_the_prop_is_unknown():
context = get_context()
context.sheerka.add_in_cache(Concept(name="one").init_key())
concept_plus = context.sheerka.add_in_cache(Concept(name="a plus b")
.set_prop("a", "one")
.set_prop("b", "two").init_key())
evaluator = ConceptEvaluator()
item = get_return_value(concept_plus)
result = evaluator.eval(context, item)
assert not result.status
assert context.sheerka.isinstance(result.value, BuiltinConcepts.PROPERTY_EVAL_ERROR)
assert result.value.property_name == "b"
assert context.sheerka.isinstance(result.value.error, BuiltinConcepts.TOO_MANY_ERRORS)
assert result.value.concept == concept_plus