Fixed #18 : Parsing and evaluating Python

This commit is contained in:
2023-05-14 12:12:29 +02:00
parent e41094f908
commit 09a0246420
46 changed files with 2084 additions and 165 deletions
+83 -4
View File
@@ -4,9 +4,9 @@ from base import BaseTest
from common.global_symbols import NotFound, NotInit
from conftest import NewOntology
from core.BuiltinConcepts import BuiltinConcepts
from core.ErrorContext import ErrorContext
from core.concept import ConceptMetadata
from core.services.SheerkaConceptManager import ConceptAlreadyDefined, ConceptManager
from core.error import ErrorContext
from services.SheerkaConceptManager import ConceptAlreadyDefined, ConceptManager
from helpers import get_metadata
@@ -24,7 +24,7 @@ class TestConceptManager(BaseTest):
"""
metadata = get_metadata("foo", "body")
digest = service.compute_metadata_digest(metadata)
assert digest == "21a1c2f420da62f4dc60f600c95b19dd9527b19dd28fd38e17f5c0e28963d176"
assert digest == "7c0f1708968e0312be622950d3f21d588f718f7ba568054ece64d077052a6476"
another_metadata = get_metadata("foo", "body")
other_digest = service.compute_metadata_digest(another_metadata)
@@ -86,7 +86,7 @@ class TestConceptManager(BaseTest):
assert metadata.name == "name"
assert metadata.key == "name"
assert metadata.body == "body"
assert metadata.digest == "eb0620bd4a317af8a403c0ae1e185a528f9b58f8b0878d990e62278f89cf10d5"
assert metadata.digest == "c75faa4efbc9ef9dbc5174c52786d5b066e2ece41486b81c27336e292917fecb"
assert metadata.all_attrs == ('#where#', '#pre#', '#post#', '#body#', '#ret#')
# is sorted in db
@@ -117,6 +117,11 @@ class TestConceptManager(BaseTest):
res = service.define_new_concept(context, "name", body="body")
assert res.status is True
def test_i_cannot_get_by_if_concept_does_not_exist(self, service):
assert service.get_by_id("unresolved_id") == NotFound
assert service.get_by_name("unresolved name") == NotFound
assert service.get_by_key("unresolved_hash") == NotFound
def test_i_can_get_a_newly_created_concept(self, context, service):
with NewOntology(context, "test_i_can_get_a_newly_created_concept"):
res = service.define_new_concept(context, "name", body="body")
@@ -141,6 +146,19 @@ class TestConceptManager(BaseTest):
assert foo.var1 == "value1"
assert foo.var2 == "value2"
def test_i_can_manage_when_concepts_with_the_same_name(self, context, service):
with NewOntology(context, "test_i_can_manage_when_concepts_with_the_same_name"):
service.define_new_concept(context, "foo", body="body1")
service.define_new_concept(context, "foo", body="body2")
concepts = service.newn("foo")
assert len(concepts) == 2
assert concepts[0].name == "foo"
assert concepts[0].get_metadata().body == "body1"
assert concepts[1].name == "foo"
assert concepts[1].get_metadata().body == "body2"
def test_i_can_instantiate_a_new_concept_by_its_id(self, context, service):
with NewOntology(context, "test_i_can_instantiate_a_new_concept_by_its_id"):
res = service.define_new_concept(context, "foo", variables=[("var1", None), ("var2", None)])
@@ -184,3 +202,64 @@ class TestConceptManager(BaseTest):
context.sheerka.om.pop_ontology(context)
assert service.get_by_id(res.value.metadata.id) is NotFound
def test_i_can_new(self, context, service):
with NewOntology(context, "test_i_can_new"):
res = service.define_new_concept(context, "name", body="body", variables=[("my_var", None)])
assert res.status
metadata = res.value.metadata
# I can create a new concept
res = service.new(metadata, my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
res = service.new((metadata.name, None), my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
res = service.new((None, metadata.id), my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
res = service.new("c:name:", my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
res = service.new("c:#1001:", my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
res = service.new("c:name#1001:", my_var="my_var_value")
assert res.id == metadata.id
assert res.my_var == "my_var_value"
# cannot new using id
assert service.new(f"1001").name == BuiltinConcepts.UNKNOWN_CONCEPT
def test_id_is_used_when_name_and_id_are_provided(self, context, service):
with NewOntology(context, "test_id_is_used_when_name_and_id_are_provided"):
res = service.define_new_concept(context, "name", body="body1")
metadata = res.value.metadata
service.define_new_concept(context, "name", body="body2")
assert service.new((metadata.name, metadata.id)).id == metadata.id
def test_unknown_concept_is_return_if_the_identifier_is_not_found(self, service):
assert service.new("unknown").name == BuiltinConcepts.UNKNOWN_CONCEPT
def test_can_get_all_concepts(self, context, service):
with NewOntology(context, "test_i_can_new"):
service.define_new_concept(context, "foo")
service.define_new_concept(context, "bar")
context.sheerka.om.push_ontology("another ontology")
service.define_new_concept(context, "baz")
service.define_new_concept(context, "qux")
all_concepts = service.get_all_concepts()
assert [c.name for c in all_concepts if not c.is_builtin] == ["foo", "bar", "baz", "qux"]
# sanity check. Concepts are discarded when ontology is popped
context.sheerka.om.pop_ontology(context)
all_concepts = service.get_all_concepts()
assert [c.name for c in all_concepts if not c.is_builtin] == ["foo", "bar"]