import pytest from core.builtin_concepts import BuiltinConcepts from core.sheerka.services.SheerkaExecute import ParserInput from parsers.BaseCustomGrammarParser import KeywordNotFound from parsers.FormatRuleParser import FormatRuleParser, FormatAstRawText, FormatRuleNode from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka cmap = {} class TestFormatRuleParser(TestUsingMemoryBasedSheerka): sheerka = None @classmethod def setup_class(cls): t = cls() cls.sheerka, context, _ = t.init_parser(cmap) def init_parser(self, concepts_map=None): if concepts_map is not None: sheerka, context, *concepts = self.init_concepts(*concepts_map.values(), create_new=True) else: sheerka = TestFormatRuleParser.sheerka context = self.get_context(sheerka) parser = FormatRuleParser() return sheerka, context, parser def test_i_can_detect_empty_expression(self): sheerka, context, parser = self.init_parser() res = parser.parse(context, ParserInput("")) assert not res.status assert sheerka.isinstance(res.body, BuiltinConcepts.IS_EMPTY) def test_input_must_be_a_parser_input(self): sheerka, context, parser = self.init_parser() parser.parse(context, "not a parser input") is None def test_i_can_parse_a_simple_rule(self): sheerka, context, parser = self.init_parser() text = "when isinstance(last_value(), Concept) print hello world!" res = parser.parse(context, ParserInput(text)) parser_result = res.body format_rule = res.body.body rule = format_rule.rule format_ast = format_rule.format_ast assert res.status assert sheerka.isinstance(parser_result, BuiltinConcepts.PARSER_RESULT) assert isinstance(format_rule, FormatRuleNode) assert sheerka.isinstance(rule, BuiltinConcepts.RETURN_VALUE) assert format_ast == FormatAstRawText("hello world!") @pytest.mark.parametrize("text, error", [ ("hello world", [KeywordNotFound(None, keywords=['when', 'print'])]), ("when True", [KeywordNotFound([], keywords=['print'])]), ("print True", [KeywordNotFound([], keywords=['when'])]), ]) def test_cannot_parse_when_not_for_me(self, text, error): sheerka, context, parser = self.init_parser() res = parser.parse(context, ParserInput(text)) not_for_me = res.body assert not res.status assert sheerka.isinstance(not_for_me, BuiltinConcepts.NOT_FOR_ME) assert not_for_me.reason == error