import pytest from core.builtin_concepts import ReturnValueConcept, ParserResultConcept from core.concept import Concept from core.sheerka import Sheerka, ExecutionContext from evaluators.BaseEvaluator import BaseEvaluator from evaluators.ConceptComposerEvaluator import ConceptComposerEvaluator from parsers.BaseParser import BaseParser from parsers.ConceptLexerParser import ConceptNode, ConceptLexerParser, Sequence from sdp.sheerkaDataProvider import Event concept_lexer_name = ConceptLexerParser().name def get_context(): sheerka = Sheerka(skip_builtins_in_db=True) sheerka.initialize("mem://") return ExecutionContext("test", Event(), sheerka) def get_return_values(context, grammar, expression): parser = ConceptLexerParser() parser.initialize(context, grammar) ret_val = parser.parse(context, expression) assert not ret_val.status return [ret_val] def init(concepts, grammar, expression): context = get_context() for c in concepts: context.sheerka.add_in_cache(c) return_values = get_return_values(context, grammar, expression) return context, return_values @pytest.mark.parametrize("return_values, expected", [ ([ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "in error"), ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ReturnValueConcept("not a parser", True, "some value"), ], True), ([ ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ], True), ([ ReturnValueConcept(BaseParser.PREFIX + "some_name", True, "not in error"), ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ], False), ([ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "in error"), ReturnValueConcept(concept_lexer_name, True, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ], False), ([ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "in error"), ReturnValueConcept(concept_lexer_name, False, "some value"), ], False), ([ ReturnValueConcept(BaseParser.PREFIX + "some_name", False, "in error"), ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=["not a concept"])), ], False), ([ ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", False, "evaluator in error"), ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ReturnValueConcept("not a parser", True, "some value"), ], False), ([ ReturnValueConcept(BaseEvaluator.PREFIX + "some_name", True, "evaluator"), ReturnValueConcept(concept_lexer_name, False, ParserResultConcept(value=[ConceptNode(Concept(), 0, 0)])), ReturnValueConcept("not a parser", True, "some value"), ], False), ]) def test_i_can_match(return_values, expected): context = get_context() assert ConceptComposerEvaluator().matches(context, return_values) == expected def test_i_can_eval_simple_concepts(): foo = Concept("foo", body="'foo'") bar = Concept("bar", body="'bar'") grammar = {} context, return_values = init([foo, bar], grammar, "bar foo") composer = ConceptComposerEvaluator() assert composer.matches(context, return_values) ret_val = composer.eval(context, return_values) assert ret_val.status assert ret_val.who == composer.name assert ret_val.value == [Concept("bar", body="bar").init_key(), Concept("foo", body="foo").init_key()] assert ret_val.value[0].metadata.is_evaluated assert ret_val.value[1].metadata.is_evaluated assert ret_val.parents == [return_values[0]] def test_i_can_eval_simple_concepts_when_some_are_bnf(): foo = Concept("foo", body="'foo'") bar = Concept("bar", body="'bar'") grammar = {foo: "foo"} context, return_values = init([foo, bar], grammar, "bar foo") composer = ConceptComposerEvaluator() assert composer.matches(context, return_values) ret_val = composer.eval(context, return_values) assert ret_val.status assert ret_val.who == composer.name assert ret_val.value == [Concept("bar", body="bar").init_key(), Concept("foo", body="foo").init_key()] assert ret_val.value[0].metadata.is_evaluated assert ret_val.value[1].metadata.is_evaluated assert ret_val.parents == [return_values[0]] def test_i_can_eval_simple_concept_and_text(): foo = Concept("foo", body="'foo'") grammar = {} context, return_values = init([foo], grammar, "'bar' foo") composer = ConceptComposerEvaluator() assert composer.matches(context, return_values) ret_val = composer.eval(context, return_values) assert ret_val.status assert ret_val.who == composer.name assert ret_val.value == "bar foo" assert ret_val.parents == [return_values[0]]