import ast import os import shutil from os import path import pytest from core.builtin_concepts import ParserResultConcept from core.sheerka import Sheerka, ExecutionContext from core.tokenizer import Tokenizer from parsers.BaseParser import BaseParser from parsers.PythonParser import PythonNode, PythonParser, PythonErrorNode tests_root = path.abspath("../build/tests") root_folder = "init_folder" @pytest.fixture(autouse=True) def init_test(): if path.exists(tests_root): shutil.rmtree(tests_root) if not path.exists(tests_root): os.makedirs(tests_root) current_pwd = os.getcwd() os.chdir(tests_root) yield None os.chdir(current_pwd) def get_context(): sheerka = Sheerka() sheerka.initialize(root_folder) return ExecutionContext("test", "xxx", sheerka) @pytest.mark.parametrize("text, expected", [ ("1+1", PythonNode("1+1", ast.parse("1+1", mode="eval"))), ("a=10", PythonNode("a=10", ast.parse("a=10", mode="exec"))), ]) def test_i_can_parse_a_simple_expression(text, expected): parser = PythonParser() res = parser.parse(get_context(), text) assert res.status assert res.who == parser.name assert isinstance(res.value, ParserResultConcept) assert res.value.value == expected @pytest.mark.parametrize("text, expected", [ ("1+1", PythonNode("1+1", ast.parse("1+1", mode="eval"))), ("a=10", PythonNode("a=10", ast.parse("a=10", mode="exec"))), ]) def test_i_can_parse_from_tokens(text, expected): parser = PythonParser() tokens = list(Tokenizer(text)) res = parser.parse(get_context(), tokens) assert res.status assert res.who == parser.name assert isinstance(res.value, ParserResultConcept) assert res.value.value == expected def test_i_can_detect_error(): text = "1+" parser = PythonParser() res = parser.parse(get_context(), text) assert not res.status assert res.who == parser.name assert isinstance(res.value, ParserResultConcept) assert isinstance(res.value.value[0], PythonErrorNode) assert isinstance(res.value.value[0].exception, SyntaxError)