import pytest from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts from core.sheerka import Sheerka, ExecutionContext from core.concept import Concept from evaluators.PythonEvaluator import PythonEvaluator from parsers.PythonParser import PythonNode, PythonParser from sdp.sheerkaDataProvider import Event def get_context(): sheerka = Sheerka(skip_builtins_in_db=True) sheerka.initialize("mem://") return ExecutionContext("test", Event(), sheerka) def get_context_name(context): return context.name @pytest.mark.parametrize("ret_val, expected", [ (ReturnValueConcept("some_name", True, ParserResultConcept(value=PythonNode("", None))), True), (ReturnValueConcept("some_name", True, ParserResultConcept(value="other thing")), False), (ReturnValueConcept("some_name", False, "not relevant"), False), (ReturnValueConcept("some_name", True, Concept()), False) ]) def test_i_can_match(ret_val, expected): context = get_context() assert PythonEvaluator().matches(context, ret_val) == expected @pytest.mark.parametrize("text, expected", [ ("1 + 1", 2), ("sheerka.test()", "I have access to Sheerka !"), ("a=10\na", 10), ]) def test_i_can_eval(text, expected): context = get_context() parsed = PythonParser().parse(context, text) evaluated = PythonEvaluator().eval(context, parsed) assert evaluated.status assert evaluated.value == expected @pytest.mark.parametrize("concept", [ Concept("foo"), Concept("foo", body="2"), Concept("foo").set_prop("prop", "'a'"), Concept("foo", body="bar") ]) def test_i_cannot_eval_simple_concept(concept): context = get_context() context.sheerka.add_in_cache(Concept("foo")) parsed = PythonParser().parse(context, "foo") evaluated = PythonEvaluator().eval(context, parsed) assert not evaluated.status assert context.sheerka.isinstance(evaluated.value, BuiltinConcepts.NOT_FOR_ME) def test_i_can_eval_expression_with_that_references_concepts(): """ I can test modules with variables :return: """ context = get_context() context.sheerka.add_in_cache(Concept("foo", body="1")) parsed = PythonParser().parse(context, "foo + 2") evaluated = PythonEvaluator().eval(context, parsed) assert evaluated.status assert evaluated.value == 3 def test_i_can_eval_module_with_that_references_concepts(): """ I can test modules with variables :return: """ context = get_context() context.sheerka.add_in_cache(Concept("foo")) parsed = PythonParser().parse(context, "def a(b):\n return b\na(foo)") evaluated = PythonEvaluator().eval(context, parsed) assert evaluated.status assert evaluated.value == Concept("foo").init_key() def test_i_can_eval_module_with_that_references_concepts_with_body(): """ I can test modules with variables :return: """ context = get_context() context.sheerka.add_in_cache(Concept("foo", body="2")) parsed = PythonParser().parse(context, "def a(b):\n return b\na(foo)") evaluated = PythonEvaluator().eval(context, parsed) assert evaluated.status assert evaluated.value == 2 def test_i_can_eval_concept_token(): context = get_context() context.sheerka.add_in_cache(Concept("foo", body="2")) parsed = PythonParser().parse(context, "get_context_name(c:foo:)") python_evaluator = PythonEvaluator() python_evaluator.locals["get_context_name"] = get_context_name evaluated = python_evaluator.eval(context, parsed) assert evaluated.status assert evaluated.value == "foo" # sanity, does not work otherwise parsed = PythonParser().parse(context, "get_context_name(foo)") python_evaluator = PythonEvaluator() python_evaluator.locals["get_context_name"] = get_context_name evaluated = python_evaluator.eval(context, parsed) assert not evaluated.status assert evaluated.body.body.args[0] == "'int' object has no attribute 'name'"