from common.global_symbols import NotFound, NotInit from core.concept import ConceptDefaultProps from helpers import GetNextId, get_concept def test_i_can_retrieve_concept_properties(): foo = get_concept("a plus b", "a + b", variables=("a", "b"), id="1001") assert foo.name == "a plus b" assert foo.id == "1001" assert foo.str_id == "c:#1001:" assert foo.all_attrs() == ('#where#', '#pre#', '#post#', '#body#', '#ret#', 'a', 'b') assert foo.get_definition_digest() == "3a2cfcda8ffd0d99a7f8c7d2f1ffc4a99fc96162f3be7b9875f30751d3691af6" # sanity check to make sure that 'get_concept' works as expected assert foo.get_metadata().variables == (("a", NotInit), ("b", NotInit)) def test_i_can_set_and_get_value(): foo = get_concept("foo", variables=["a"]) foo.set_value("a", "some value") assert foo.get_value("a") == "some value" def test_i_can_set_and_get_value_from_bound_attr(): foo = get_concept("foo", variables=["a"], bound_body="a") foo.set_value("a", "some value") assert foo.get_value(ConceptDefaultProps.BODY) == "some value" foo.set_value(ConceptDefaultProps.BODY, "another value") assert foo.get_value("a") == "another value" def test_i_can_test_concept_equality(): foo1 = get_concept("foo", "a + b", variables=["a", "b"], id=5) foo2 = get_concept("foo", "a + b", variables=["a", "b"], id=6) foo1.set_value("a", 10).set_value("b", 20) foo2.set_value("a", 10).set_value("b", 20) assert foo1 == foo2 def test_i_can_detect_when_concepts_are_not_equal(): foo1 = get_concept("foo", "a + b", variables=["a", "b"], id=5) foo2 = get_concept("foo", "a + b", variables=["a", "b"], id=6) foo1.set_value("a", 10).set_value("b", 20) foo2.set_value("a", 10).set_value("b", 25) assert foo1 != foo2 def test_i_can_test_concept_equality_in_case_of_infinite_recursion(): foo1 = get_concept("foo", "a + b", variables=["a"], id=5) foo2 = get_concept("foo", "a + b", variables=["a"], id=6) # foo1 and foo2 are equals assert foo1 == foo2 foo1.set_value("a", foo1) foo2.set_value("a", foo2) assert foo1 == foo2 foo1.set_value("a", foo2) foo2.set_value("a", foo1) assert foo1 == foo2 def test_i_can_test_concept_equality_in_case_of_infinite_recursion_with_more_than_two_concepts(): foo1 = get_concept("foo", "a + b", variables=["a"], id=5) foo2 = get_concept("foo", "a + b", variables=["a"], id=6) foo3 = get_concept("foo", "a + b", variables=["a"], id=7) foo1.set_value("a", foo2) foo2.set_value("a", foo3) foo3.set_value("a", foo1) assert foo1 == foo2 foo1.set_value("a", foo2) foo2.set_value("a", foo3) foo3.set_value("a", foo3) assert foo1 == foo2 def test_i_cannot_get_an_attribute_which_is_not_defined(): next_id = GetNextId() foo = get_concept("add a b", definition="add", variables=["a", "b"], sequence=next_id) assert foo.get_value("a") is NotInit assert foo.get_value("b") is NotInit assert foo.get_value("c") is NotFound def test_i_can_repr_a_concept(): next_id = GetNextId() foo = get_concept("foo", sequence=next_id) assert repr(foo) == "(1001)foo" bar = get_concept("bar", pre="is an int", sequence=next_id) assert repr(bar) == "(1002)bar, #pre=is an int" baz = get_concept("baz", definition="add a b", variables=["a", "b"], sequence=next_id) assert repr(baz) == "(1003)baz, a=**NotInit**, b=**NotInit**"