from core.builtin_concepts import ReturnValueConcept, BuiltinConcepts from core.concept import Concept from core.sheerka import Sheerka, ExecutionContext from evaluators.BaseEvaluator import BaseEvaluator from evaluators.MutipleSameSuccessEvaluator import MultipleSameSuccessEvaluator from parsers.BaseParser import BaseParser from sdp.sheerkaDataProvider import Event def get_context(): sheerka = Sheerka(skip_builtins_in_db=True) sheerka.initialize("mem://") return ExecutionContext("test", Event(), sheerka) def test_i_can_match_and_eval(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) evaluated = evaluator.eval(context, return_values) assert evaluated.status assert evaluated.value == Concept(name="1", body="value").auto_init() # the first concept is returned def test_i_can_match_and_eval_when_no_body(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) evaluated = evaluator.eval(context, return_values) assert evaluated.status assert evaluated.value == Concept(name="1").auto_init() def test_i_can_match_and_eval_when_value_is_not_a_concept(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, "value"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, "value"), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) evaluated = evaluator.eval(context, return_values) assert evaluated.status assert evaluated.value == "value" def test_i_can_match_and_eval_when_at_least_one_value_is_a_concept_concept_evaluator_first(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "Python", True, "value"), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, "value"), ReturnValueConcept(BaseEvaluator.PREFIX + "Python", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "Concept", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "Python", True, Concept(name="3", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, "value"), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) evaluated = evaluator.eval(context, return_values) assert evaluated.status assert evaluated.value == Concept(name="1", body="value").auto_init() # the concept is returned, not the value def test_i_can_match_and_eval_when_at_least_one_value_is_a_concept_python_evaluator_first(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "Python", True, "value"), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, "value"), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "Python", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, Concept(name="3", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "other", True, "value"), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) evaluated = evaluator.eval(context, return_values) assert evaluated.status assert evaluated.value == Concept(name="1", body="value").auto_init() # the concept is returned, not the value def test_i_can_match_even_if_the_value_are_not_the_same_but_eval_will_fail(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value2").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) assert evaluator.eval(context, return_values) is None def test_i_can_match_even_if_the_value_are_not_the_same_but_eval_will_fail_when_no_body(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] evaluator = MultipleSameSuccessEvaluator() assert evaluator.matches(context, return_values) assert evaluator.eval(context, return_values) is None def test_i_can_match_if_no_parser(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] assert MultipleSameSuccessEvaluator().matches(context, return_values) def test_i_cannot_match_if_not_reduced_requested(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept("some_name", True, Concept(name="2", body="value")), # ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] assert not MultipleSameSuccessEvaluator().matches(context, return_values) def test_i_cannot_match_if_only_one_successful_evaluator(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", False, "Not relevant"), # ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value")), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept("some_name", True, Concept(name="2", body="value")), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] assert not MultipleSameSuccessEvaluator().matches(context, return_values) def test_i_cannot_match_if_at_least_one_parser_is_successful(): context = get_context() sheerka = context.sheerka return_values = [ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "Not relevant"), ReturnValueConcept(BaseParser.PREFIX + "some_name2", True, "Not relevant"), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="1", body="value").auto_init()), ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, Concept(name="2", body="value").auto_init()), ReturnValueConcept("some_name", True, sheerka.new(BuiltinConcepts.REDUCE_REQUESTED)) ] assert not MultipleSameSuccessEvaluator().matches(context, return_values)