from core.builtin_concepts import ReturnValueConcept, BuiltinConcepts from core.concept import Concept from evaluators.BaseEvaluator import BaseEvaluator from evaluators.MutipleSameSuccessEvaluator import MultipleSameSuccessEvaluator from parsers.BaseParser import BaseParser from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka class TestMultipleSameSuccessEvaluator(TestUsingMemoryBasedSheerka): def test_i_can_match_and_eval(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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(self): context = self.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)