Fixed #12
Fixed #13
Fixed #14
This commit is contained in:
2023-05-08 17:50:28 +02:00
parent 21a397861a
commit e41094f908
95 changed files with 12168 additions and 260 deletions
+186
View File
@@ -0,0 +1,186 @@
import pytest
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 helpers import get_metadata
class TestConceptManager(BaseTest):
@pytest.fixture()
def service(self, sheerka):
return sheerka.services[ConceptManager.NAME]
def test_i_can_compute_concept_digest(self, service):
"""
Two concepts with the same definition share the same digest
:return:
:rtype:
"""
metadata = get_metadata("foo", "body")
digest = service.compute_metadata_digest(metadata)
assert digest == "21a1c2f420da62f4dc60f600c95b19dd9527b19dd28fd38e17f5c0e28963d176"
another_metadata = get_metadata("foo", "body")
other_digest = service.compute_metadata_digest(another_metadata)
assert digest == other_digest
def test_id_is_not_part_of_the_digest(self, service):
metadata1 = get_metadata("foo", "body", id=1)
metadata2 = get_metadata("foo", "body", id=2)
assert service.compute_metadata_digest(metadata1) == service.compute_metadata_digest(metadata2)
def test_i_can_compute_concept_attributes_based_on_the_metadata(self, service):
compute_all_attrs = service.compute_all_attrs
m1 = get_metadata("foo")
assert compute_all_attrs(m1.variables) == ('#where#', '#pre#', '#post#', '#body#', '#ret#')
m2 = get_metadata("bar", variables=[("var1", None), ("var2", None)])
assert compute_all_attrs(m2.variables) == ('#where#', '#pre#', '#post#', '#body#', '#ret#', 'var1', 'var2')
@pytest.mark.parametrize("definition, variables, expected", [
("foo", [], "foo"),
("foo(bar)", [], "foo ( bar )"),
("foo a", ["a"], "foo __var__0"),
("a foo b", ["a", "b"], "__var__0 foo __var__1"),
("a foo b", ["b", "a"], "__var__1 foo __var__0"),
("foo", ["foo"], "foo"),
("foo a", ["foo"], "__var__0 a"),
("foo a b", ["a"], "foo __var__0 b"),
("'foo'", [], "'foo'"),
("my name is a", ["a"], "my name is __var__0"),
("a b c d", ["b", "c"], "a __var__0 __var__1 d"),
("a 'b c' d", ["b", "c"], "a 'b c' d"),
("a | b", ["a", "b"], "__var__0 | __var__1"),
("a b a c", ["a", "b"], "__var__0 __var__1 __var__0 c"),
("a b a c", ["b", "a"], "__var__1 __var__0 __var__1 c"),
("def concept a", ["a"], "def concept __var__0"),
])
def test_i_can_create_concept_key(self, service, definition, variables, expected):
expanded_variables = tuple((v, NotInit) for v in variables)
key = service.create_concept_key(definition, None, expanded_variables)
assert key == expected
def test_the_key_is_created_from_the_definition_if_it_is_set(self, service):
assert service.create_concept_key("from name", "from definition", None) == "from definition"
assert service.create_concept_key("from name", None, None) == "from name"
def test_i_can_define_a_new_concept(self, context, service):
with NewOntology(context, "test_i_can_define_a_new_concept"):
res = service.define_new_concept(context, "name", body="body")
assert res.status is True
metadata = res.value.metadata
assert isinstance(metadata, ConceptMetadata)
assert metadata.id == "1001"
assert metadata.name == "name"
assert metadata.key == "name"
assert metadata.body == "body"
assert metadata.digest == "eb0620bd4a317af8a403c0ae1e185a528f9b58f8b0878d990e62278f89cf10d5"
assert metadata.all_attrs == ('#where#', '#pre#', '#post#', '#body#', '#ret#')
# is sorted in db
om = context.sheerka.om
assert om.get(ConceptManager.CONCEPTS_BY_ID_ENTRY, metadata.id) == metadata
assert om.get(ConceptManager.CONCEPTS_BY_NAME_ENTRY, metadata.name) == metadata
assert om.get(ConceptManager.CONCEPTS_BY_KEY_ENTRY, metadata.key) == metadata
assert om.get(ConceptManager.CONCEPTS_BY_HASH_ENTRY, metadata.digest) == metadata
def test_i_cannot_create_the_same_concept_twice(self, context, service):
with NewOntology(context, "test_i_cannot_create_the_same_concept_twice"):
res = service.define_new_concept(context, "name", body="body")
assert res.status
res = service.define_new_concept(context, "name", body="body")
assert not res.status
assert isinstance(res.value, ErrorContext)
assert isinstance(res.value.value, ConceptAlreadyDefined)
def test_i_can_add_the_same_concept_on_different_ontologies(self, context, service):
with NewOntology(context, "test_i_can_add_the_same_concept_on_different_ontologies"):
res = service.define_new_concept(context, "name", body="body")
assert res.status
sheerka = context.sheerka
om = sheerka.om
om.push_ontology("my_new_ontology")
res = service.define_new_concept(context, "name", body="body")
assert res.status is True
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")
assert res.status
metadata = res.value.metadata
assert service.get_by_id(metadata.id).id == metadata.id
assert service.get_by_name(metadata.name).name == metadata.name
assert service.get_by_key(metadata.key).key == metadata.key
def test_i_can_instantiate_a_new_concept_by_its_name(self, context, service):
with NewOntology(context, "test_i_can_instantiate_a_new_concept_by_its_name"):
res = service.define_new_concept(context, "foo", variables=[("var1", None), ("var2", None)])
assert res.status
foo = service.newn("foo", var1="value1", var2="value2")
assert foo.id == "1001"
assert foo.key == "foo"
assert foo.name == "foo"
assert foo.str_id == "c:#1001:"
assert foo.var1 == "value1"
assert foo.var2 == "value2"
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)])
assert res.status
foo = service.newi("1001", var1="value1", var2="value2")
assert foo.id == "1001"
assert foo.key == "foo"
assert foo.name == "foo"
assert foo.str_id == "c:#1001:"
assert foo.var1 == "value1"
assert foo.var2 == "value2"
def test_i_cannot_instantiate_a_concept_which_does_not_exist(self, context, service):
foo = service.newn("foo", var1="value1", var2="value2")
assert foo.key == BuiltinConcepts.UNKNOWN_CONCEPT
assert foo.requested_name == "foo"
foo = service.newi("1001", var1="value1", var2="value2")
assert foo.key == BuiltinConcepts.UNKNOWN_CONCEPT
assert foo.requested_id == "1001"
def test_i_can_instantiate_by_name_when_multiple_results(self, context, service):
with NewOntology(context, "test_i_can_instantiate_by_name_when_multiple_results"):
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].id == "1001"
assert concepts[0].get_metadata().body == "body1"
assert concepts[1].id == "1002"
assert concepts[1].get_metadata().body == "body2"
def test_concepts_are_removed_when_ontology_is_popped(self, context, service):
context.sheerka.om.push_ontology("new ontology")
res = service.define_new_concept(context, "foo", body="body")
assert service.get_by_id(res.value.metadata.id) is not NotFound
context.sheerka.om.pop_ontology(context)
assert service.get_by_id(res.value.metadata.id) is NotFound