128 lines
5.9 KiB
Python
128 lines
5.9 KiB
Python
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
|