224 lines
7.7 KiB
Python
224 lines
7.7 KiB
Python
import pytest
|
|
|
|
from common.global_symbols import NotInit
|
|
from core.concept import Concept, ConceptMetadata, DefinitionType
|
|
from helpers import GetNextId, get_concept, get_concepts, get_metadata, get_metadatas
|
|
|
|
|
|
def test_i_can_get_default_value_when_get_metadata():
|
|
metadata = get_metadata()
|
|
assert metadata.id is None
|
|
assert metadata.name is None
|
|
assert metadata.name is None
|
|
assert metadata.body is None
|
|
assert metadata.id is None
|
|
assert metadata.key is None
|
|
assert metadata.where is None
|
|
assert metadata.pre is None
|
|
assert metadata.post is None
|
|
assert metadata.ret is None
|
|
assert metadata.definition is None
|
|
assert metadata.definition_type == DefinitionType.DEFAULT
|
|
assert metadata.desc is None
|
|
assert metadata.props == {}
|
|
assert metadata.variables == tuple()
|
|
assert metadata.parameters == []
|
|
assert metadata.bound_body is None
|
|
assert metadata.is_builtin is False
|
|
assert metadata.is_unique is False
|
|
assert metadata.autouse is False
|
|
|
|
|
|
def test_i_can_use_shortcut_to_declare_variables():
|
|
metadata = get_metadata(variables=(("var1", NotInit), ("var2", "value")))
|
|
assert metadata.variables == (("var1", NotInit), ("var2", "value")) # default behaviour
|
|
|
|
metadata = get_metadata(variables=[("var1", NotInit), ("var2", "value")])
|
|
assert metadata.variables == (("var1", NotInit), ("var2", "value")) # lists are transformed into tuples
|
|
|
|
metadata = get_metadata(variables=["var1", "var2"])
|
|
assert metadata.variables == (("var1", NotInit), ("var2", NotInit)) # expanded
|
|
|
|
|
|
def test_i_can_clone():
|
|
metadata = ConceptMetadata(
|
|
"id",
|
|
"name",
|
|
"key",
|
|
True,
|
|
True,
|
|
"body",
|
|
"where",
|
|
"pre",
|
|
"post",
|
|
"ret",
|
|
"definition",
|
|
DefinitionType.BNF,
|
|
"desc",
|
|
True,
|
|
"bound_body",
|
|
{"prop": "value"},
|
|
(("variable", "value"),),
|
|
("p1",),
|
|
"digest",
|
|
("all_attr",),
|
|
)
|
|
|
|
clone = metadata.clone()
|
|
for attr, value in vars(metadata).items():
|
|
clone_value = getattr(clone, attr)
|
|
assert clone_value == value
|
|
|
|
|
|
def test_i_can_override_values_when_i_clone_metadata():
|
|
metadata = get_metadata()
|
|
assert metadata.clone(name="new_name").name == "new_name"
|
|
assert metadata.clone(body="new_body").body == "new_body"
|
|
assert metadata.clone(key="new_key").key == "new_key"
|
|
assert metadata.clone(where="new_where").where == "new_where"
|
|
assert metadata.clone(pre="new_pre").pre == "new_pre"
|
|
assert metadata.clone(post="new_post").post == "new_post"
|
|
assert metadata.clone(ret="new_ret").ret == "new_ret"
|
|
assert metadata.clone(definition="new_definition").definition == "new_definition"
|
|
assert metadata.clone(definition_type="new_definition_type").definition_type == "new_definition_type"
|
|
assert metadata.clone(desc="new_desc").desc == "new_desc"
|
|
assert metadata.clone(props="new_props").props == "new_props"
|
|
assert metadata.clone(variables="new_variables").variables == "new_variables"
|
|
assert metadata.clone(parameters="new_parameters").parameters == "new_parameters"
|
|
assert metadata.clone(bound_body="new_bound_body").bound_body == "new_bound_body"
|
|
assert metadata.clone(is_builtin="new_is_builtin").is_builtin == "new_is_builtin"
|
|
assert metadata.clone(is_unique="new_is_unique").is_unique == "new_is_unique"
|
|
assert metadata.clone(autouse="new_autouse").autouse == "new_autouse"
|
|
assert metadata.clone(digest="new_digest").digest == "new_digest"
|
|
assert metadata.clone(all_attrs="new_all_attrs").all_attrs == "new_all_attrs"
|
|
|
|
|
|
def test_i_cannot_change_the_id_when_cloning():
|
|
with pytest.raises(TypeError):
|
|
metadata = get_metadata()
|
|
metadata.clone(id="new_id")
|
|
|
|
|
|
def test_i_can_auto_init():
|
|
next_id = GetNextId()
|
|
metadata = get_metadata("a plus b", body="a + b", variables=["a", "b"]).auto_init(next_id)
|
|
|
|
assert metadata.name == "a plus b"
|
|
assert metadata.id == "1001"
|
|
assert metadata.key == "__var__0 plus __var__1"
|
|
assert metadata.all_attrs == ('#where#', '#pre#', '#post#', '#body#', '#ret#', 'a', 'b')
|
|
assert metadata.is_unique is False
|
|
assert metadata.is_builtin is False
|
|
assert metadata.definition_type is DefinitionType.DEFAULT
|
|
assert metadata.digest == '9e058bc1261d1e2c785889147066ce89960fd6844db5bb6f1d1d809a8eb790b7'
|
|
|
|
|
|
def test_sequences_are_incremented_when_multiples_call():
|
|
next_id = GetNextId()
|
|
assert get_metadata("foo").auto_init(next_id).id == "1001"
|
|
assert get_metadata("bar").auto_init(next_id).id == "1002"
|
|
|
|
|
|
def test_i_can_get_multiple_metadatas():
|
|
res = get_metadatas("foo", get_metadata("bar", body="body"))
|
|
|
|
assert len(res) == 2
|
|
|
|
metadata = res[0]
|
|
assert isinstance(metadata, ConceptMetadata)
|
|
assert metadata.name == "foo"
|
|
assert metadata.body is None
|
|
assert metadata.key is None
|
|
assert metadata.id is None
|
|
|
|
metadata = res[1]
|
|
assert isinstance(metadata, ConceptMetadata)
|
|
assert metadata.name == "bar"
|
|
assert metadata.body == "body"
|
|
assert metadata.key is None
|
|
assert metadata.id is None
|
|
|
|
|
|
def test_i_can_get_multiple_already_initialized_metadatas():
|
|
res = get_metadatas("foo", get_metadata("bar", body="body"), next_id=GetNextId())
|
|
|
|
assert len(res) == 2
|
|
|
|
metadata = res[0]
|
|
assert isinstance(metadata, ConceptMetadata)
|
|
assert metadata.name == "foo"
|
|
assert metadata.body is None
|
|
assert metadata.key == "foo"
|
|
assert metadata.id == "1001"
|
|
|
|
metadata = res[1]
|
|
assert isinstance(metadata, ConceptMetadata)
|
|
assert metadata.name == "bar"
|
|
assert metadata.body == "body"
|
|
assert metadata.key == "bar"
|
|
assert metadata.id == "1002"
|
|
|
|
|
|
def test_i_can_get_a_concept():
|
|
foo = get_concept("foo", variables=("var1",))
|
|
|
|
assert isinstance(foo, Concept)
|
|
assert foo.name == "foo"
|
|
assert foo.key is None
|
|
assert foo.id is None
|
|
assert foo.all_attrs() == ('#where#', '#pre#', '#post#', '#body#', '#ret#', 'var1')
|
|
|
|
|
|
def test_i_can_request_basic_initialization_when_getting_a_concept():
|
|
next_id = GetNextId()
|
|
foo = get_concept("foo", variables=("var1",), sequence=next_id)
|
|
|
|
assert foo.name == "foo"
|
|
assert foo.key == "foo"
|
|
assert foo.id == "1001"
|
|
assert foo.all_attrs() == ('#where#', '#pre#', '#post#', '#body#', '#ret#', 'var1')
|
|
|
|
|
|
def test_i_can_get_multiple_concepts(context):
|
|
next_id = GetNextId()
|
|
|
|
foo, bar, baz = get_concepts(context,
|
|
"foo",
|
|
"bar",
|
|
get_concept("baz", definition="baz var1", variables=("var1",)),
|
|
sequence=next_id)
|
|
assert foo.name == "foo"
|
|
assert foo.id == "1001"
|
|
assert foo.key == "foo"
|
|
assert bar.name == "bar"
|
|
assert bar.id == "1002"
|
|
assert bar.key == "bar"
|
|
assert baz.name == "baz"
|
|
assert baz.id == "1003"
|
|
assert baz.key == "baz __var__0"
|
|
|
|
|
|
def test_i_can_get_multiple_concepts_using_sheerka(sheerka, context):
|
|
foo, bar, baz = get_concepts(context,
|
|
"foo",
|
|
"bar",
|
|
get_concept("baz", definition="baz var1", variables=("var1",)),
|
|
use_sheerka=True)
|
|
assert foo.name == "foo"
|
|
assert foo.id == "1001"
|
|
assert foo.key == "foo"
|
|
assert bar.name == "bar"
|
|
assert bar.id == "1002"
|
|
assert bar.key == "bar"
|
|
assert baz.name == "baz"
|
|
assert baz.id == "1003"
|
|
assert baz.key == "baz __var__0"
|
|
assert baz.get_value("var1") is NotInit
|
|
|
|
# the concepts are defined in Sheerka, so we can instantiate them
|
|
baz2 = sheerka.newn("baz", var1="value for var1")
|
|
assert baz2.name == "baz"
|
|
assert baz2.id == "1003"
|
|
assert baz2.key == "baz __var__0"
|
|
assert baz2.get_value("var1") == "value for var1"
|