import pytest from core.builtin_concepts import ReturnValueConcept, BuiltinConcepts from core.concept import Concept from evaluators.OneSuccessEvaluator import OneSuccessEvaluator from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka def r(value, status=True): return ReturnValueConcept(value, status, value) reduce_requested = ReturnValueConcept("some_name", True, Concept(key=BuiltinConcepts.REDUCE_REQUESTED)) class TestOneSuccessEvaluator(TestUsingMemoryBasedSheerka): @pytest.mark.parametrize("return_values, expected", [ ([r("evaluators.one success"), reduce_requested], True), ([r("evaluators.one success"), r("failed", False), r("failed", False), reduce_requested], True), ([r("evaluators.no reduce required"), r("failed", False), r("failed", False)], False), ([r("evaluators.no reduce required")], False), ([r("evaluators.failed", False), r("failed", False), r("failed", False), reduce_requested], False), ([r("evaluators.failed", False), r("not evaluator success"), reduce_requested], False), ([r("evaluators.success"), r("evaluators.another success"), reduce_requested], False), ([r("evaluators.one success"), r("other success"), r("failed", False), reduce_requested], True), ([r("evaluators.one success"), r("parsers.success"), reduce_requested], False), ]) def test_i_can_match(self, return_values, expected): context = self.get_context() assert OneSuccessEvaluator().matches(context, return_values) == expected def test_i_can_eval(self): context = self.get_context() return_values = [ r("evaluators.one success"), r("failed", False), r("failed", False), reduce_requested ] evaluator = OneSuccessEvaluator() matches = evaluator.matches(context, return_values) res = evaluator.eval(context, return_values) assert matches assert res.status assert res.body == "evaluators.one success" assert len(res.parents) == 4 def test_i_do_not_eat_the_other_success(self): context = self.get_context() not_a_parser_success = r("other success") return_values = [ r("evaluators.one success"), not_a_parser_success, r("failed", False), reduce_requested ] evaluator = OneSuccessEvaluator() matches = evaluator.matches(context, return_values) res = evaluator.eval(context, return_values) assert matches assert res.status assert res.body == "evaluators.one success" assert len(res.parents) == 3 assert not_a_parser_success not in res.parents