import pytest from base import BaseTest, DummyObj from common.global_symbols import NoFirstToken, NotFound, NotInit, Removed from conftest import NewOntology from core.BuiltinConcepts import BuiltinConcepts from evaluators.PythonParser import PythonParser from helpers import _rv, define_new_concept, get_concepts, get_metadata from parsers.ParserInput import ParserInput from services.SheerkaPython import EvaluationRef, SheerkaPython def get_python_fragment(sheerka, context, command): pi = ParserInput(command) pi.init() parser_start = _rv(sheerka.newn(BuiltinConcepts.PARSER_INPUT, pi=pi)) ret = PythonParser().eval(context, None, parser_start) return ret.new[0].value.pf class TestSheerkaPython(BaseTest): @pytest.fixture() def service(self, sheerka) -> SheerkaPython: return sheerka.services[SheerkaPython.NAME] @pytest.mark.parametrize("text, expected", [ ("1 + 1", 2), ("echo('I have access to Sheerka !')", "I have access to Sheerka !"), ("sheerka.echo('I have access to Sheerka !')", "I have access to Sheerka !"), ("a=10\na", 10), ("NotInit", NotInit), ("NotFound", NotFound), ("Removed", Removed), ("NoFirstToken", NoFirstToken), ]) def test_i_can_evaluate_simple_expression(self, sheerka, context, service, text, expected): python_fragment = get_python_fragment(sheerka, context, text) ret = service.evaluate_python(context, python_fragment) assert ret == expected def test_i_can_eval_isinstance_for_type(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "isinstance('some string', str)") ret = service.evaluate_python(context, python_fragment) assert ret is True def test_i_can_eval_isinstance_for_concept(self, sheerka, context, service): with NewOntology(context, "test_i_can_eval_isinstance_for_concept"): get_concepts(context, "foo", use_sheerka=True) python_fragment = get_python_fragment(sheerka, context, "isinstance(foo, 'foo')") ret = service.evaluate_python(context, python_fragment) assert ret is True # 'foo' is also a Concept python_fragment = get_python_fragment(sheerka, context, "isinstance(foo, Concept)") ret = service.evaluate_python(context, python_fragment) assert ret is True def test_i_can_use_value_from_global_namespace(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "self.a") ret = service.evaluate_python(context, python_fragment, {"self": DummyObj("my dummy value")}) assert ret == "my dummy value" def test_i_can_eval_using_eval_ref(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "a") python_fragment.namespace = {"a": EvaluationRef("self", "a")} ret = service.evaluate_python(context, python_fragment, {"self": DummyObj("my dummy value")}) assert ret == "my dummy value" @pytest.mark.skip("Concept evaluation is not implemented") def test_i_can_eval_concept_properties(self, sheerka, context, service): with NewOntology(context, "test_i_can_eval_concept_properties"): foo_meta = get_metadata("foo", variables=[("a", "hello world")]) define_new_concept(context, foo_meta) python_fragment = get_python_fragment(sheerka, context, "foo.a") ret = service.evaluate_python(context, python_fragment) assert ret == "hello world" @pytest.mark.skip("Concept evaluation is not implemented") def test_i_can_eval_python_mixed_with_concept(self, sheerka, context, service): with NewOntology(context, "test_i_can_eval_python_mixed_with_concept"): foo_meta = get_metadata("foo", variables=[("a", "1")]) bar_meta = get_metadata("bar", body="2") get_concepts(context, foo_meta, bar_meta, use_sheerka=True) python_fragment = get_python_fragment(sheerka, context, "bar + foo.a") ret = service.evaluate_python(context, python_fragment) assert ret == "3" def test_i_can_remember_previous_results(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "a=10") ret = service.evaluate_python(context, python_fragment) assert ret is None python_fragment = get_python_fragment(sheerka, context, "a") ret = service.evaluate_python(context, python_fragment) assert ret == 10 def test_i_can_import_module(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "import math") ret = service.evaluate_python(context, python_fragment) assert ret is None python_fragment = get_python_fragment(sheerka, context, "math.sqrt(4)") ret = service.evaluate_python(context, python_fragment) assert ret == 2 def test_i_can_import_function_from_module(self, sheerka, context, service): python_fragment = get_python_fragment(sheerka, context, "from math import sqrt") ret = service.evaluate_python(context, python_fragment) assert ret is None python_fragment = get_python_fragment(sheerka, context, "sqrt(4)") ret = service.evaluate_python(context, python_fragment) assert ret == 2 def test_i_can_eval_when_context_is_needed(self, sheerka, context, service): with NewOntology(context, "test_i_can_eval_when_context_is_needed"): python_fragment = get_python_fragment(sheerka, context, "define_new_concept('foo')") ret = service.evaluate_python(context, python_fragment) assert sheerka.isinstance(ret.value, BuiltinConcepts.NEW_CONCEPT) # for info, there are two level of value # one for PythonEvaluator return value # one for the ConceptManager return value