Fixed #18 : Parsing and evaluating Python
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
import pytest
|
||||
|
||||
from base import BaseTest
|
||||
from common.global_symbols import NotInit
|
||||
from conftest import NewOntology
|
||||
from core.concept import ConceptDefaultProps
|
||||
from core.python_fragment import PythonFragment
|
||||
from helpers import define_new_concept, get_metadata
|
||||
from services.SheerkaConceptEvaluator import ConceptEvaluator
|
||||
from services.SheerkaPython import EvaluationRef
|
||||
|
||||
|
||||
class TestConceptManager(BaseTest):
|
||||
|
||||
@pytest.fixture()
|
||||
def service(self, sheerka) -> ConceptEvaluator:
|
||||
return sheerka.services[ConceptEvaluator.NAME]
|
||||
|
||||
def test_i_can_build_concept(self, context, service):
|
||||
metadata = get_metadata(
|
||||
name="foo",
|
||||
where="isinstance(x, Concept)",
|
||||
pre="in_context(IS_QUESTION)",
|
||||
body="one + a",
|
||||
post="'post parameter'",
|
||||
ret="self",
|
||||
variables=(("a", "1"), ("b", "NotInit"))
|
||||
)
|
||||
|
||||
compiled = service.build(context, metadata)
|
||||
pf = getattr(compiled, ConceptDefaultProps.WHERE)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.where
|
||||
|
||||
pf = getattr(compiled, ConceptDefaultProps.PRE)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.pre
|
||||
|
||||
pf = getattr(compiled, ConceptDefaultProps.BODY)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.body
|
||||
|
||||
pf = getattr(compiled, ConceptDefaultProps.POST)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.post
|
||||
|
||||
pf = getattr(compiled, ConceptDefaultProps.RET)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.ret
|
||||
|
||||
pf = getattr(compiled, "a")
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.variables[0][1]
|
||||
|
||||
pf = getattr(compiled, "b")
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.source_code == metadata.variables[1][1]
|
||||
|
||||
def test_i_can_manage_when_no_source_code(self, context, service):
|
||||
metadata = get_metadata(name="foo")
|
||||
|
||||
compiled = service.build(context, metadata)
|
||||
assert getattr(compiled, ConceptDefaultProps.WHERE) is None
|
||||
assert getattr(compiled, ConceptDefaultProps.PRE) is None
|
||||
assert getattr(compiled, ConceptDefaultProps.BODY) is None
|
||||
assert getattr(compiled, ConceptDefaultProps.POST) is None
|
||||
assert getattr(compiled, ConceptDefaultProps.RET) is None
|
||||
|
||||
def test_i_can_detect_when_requested_names_are_concept_variables(self, context, service):
|
||||
metadata = get_metadata(
|
||||
name="foo",
|
||||
body="one + a",
|
||||
variables=(("a", "1"), ("b", "NotInit")))
|
||||
|
||||
compiled = service.build(context, metadata)
|
||||
pf = getattr(compiled, ConceptDefaultProps.BODY)
|
||||
assert isinstance(pf, PythonFragment)
|
||||
assert pf.namespace == {"a": EvaluationRef("self", "a"),
|
||||
"b": EvaluationRef("self", "b")}
|
||||
|
||||
def test_i_can_eval_concept_attributes(self, context, service):
|
||||
with NewOntology(context, "test_i_can_eval_concept_attributes"):
|
||||
foo_metadata = get_metadata(name="foo",
|
||||
where="isinstance(a, int)",
|
||||
pre="True",
|
||||
body="2 + a",
|
||||
post="'post parameter'",
|
||||
ret="self",
|
||||
variables=(("a", "1"), ("b", "NotInit")))
|
||||
foo = define_new_concept(context, foo_metadata)
|
||||
|
||||
res = service.evaluate_concept(context, foo)
|
||||
|
||||
assert context.sheerka.isinstance(res, foo)
|
||||
assert res.get_value("a") == 1
|
||||
assert res.get_value("b") == NotInit
|
||||
assert res.get_value(ConceptDefaultProps.WHERE) is True
|
||||
assert res.get_value(ConceptDefaultProps.PRE) is True
|
||||
assert res.get_value(ConceptDefaultProps.BODY) == 3
|
||||
assert res.get_value(ConceptDefaultProps.POST) == "post parameter"
|
||||
assert res.get_value(ConceptDefaultProps.RET) == res
|
||||
Reference in New Issue
Block a user