def test_link_and_get_links_by_association(self): a1 = self.c1.association(self.c2, name="a1", multiplicity="*") a2 = self.c1.association(self.c2, name="a2", multiplicity="*") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o3 = CObject(self.c2, "o3") links_a1 = set_links({o1: o2}, association=a1) links_a2 = set_links({o1: [o2, o3]}, association=a2) eq_(o1.get_linked(), [o2, o2, o3]) eq_(o1.linked, [o2, o2, o3]) eq_(o1.get_linked(association=a1), [o2]) eq_(o1.get_linked(association=a2), [o2, o3]) eq_(o1.get_links_for_association(a1), links_a1) eq_(o1.get_links_for_association(a2), links_a2)
def test_reference_to_link(self): code = CClass(self.mcl, "Code") source = CClass(self.mcl, "Source") code_association = code.association( source, "[contained_code] * -> [source] *") code_a = CClass(self.mcl, "Code A", superclasses=code) code_b = CClass(self.mcl, "Code B", superclasses=code) a_b_association = code_a.association(code_b, "a_b: [code_a] * -> [code_b] *", superclasses=code) source_1 = CObject(source, "source_1") code_a1 = CObject(code_a, "code_a1") code_b1 = CObject(code_b, "code_b1") code_b2 = CObject(code_b, "code_b2") code_b3 = CObject(code_b, "code_b3") a_b_links = add_links({code_a1: [code_b1, code_b2]}, association=a_b_association) code_links = add_links( { source_1: [code_a1, code_b2, code_b1, a_b_links[0], a_b_links[1]] }, role_name="contained_code") eq_(len(code_links), 5) # test getter methods on object eq_(set(source_1.get_linked(role_name="contained_code")), {code_a1, code_b2, code_b1, a_b_links[0], a_b_links[1]}) eq_(set(source_1.linked), {code_a1, code_b2, code_b1, a_b_links[0], a_b_links[1]}) eq_(set(source_1.links), set(code_links)) eq_(set(source_1.get_links_for_association(code_association)), set(code_links)) eq_(set(get_links([source_1])), set(code_links)) # test getter methods on link eq_(a_b_links[0].get_linked(role_name="source"), [source_1]) eq_(a_b_links[0].linked, [source_1]) eq_(a_b_links[0].links, [code_links[3]]) eq_(a_b_links[0].get_links_for_association(code_association), [code_links[3]]) eq_(set(get_links([a_b_links[0]])), {code_links[3]}) eq_( set(get_links([code_a1, a_b_links[0], a_b_links[1]])), { code_links[0], a_b_links[0], a_b_links[1], code_links[3], code_links[4] }) # test add/delete links code_b3_link = code_a1.add_links(code_b3)[0] source_1.add_links(code_b3_link) eq_(set(code_a1.linked), {code_b1, code_b2, source_1, code_b3}) eq_(set(source_1.linked), { code_a1, code_b2, code_b1, a_b_links[0], a_b_links[1], code_b3_link }) eq_(code_b3_link.linked, [source_1]) a_b_links[1].delete_links([source_1]) eq_(set(source_1.linked), {code_a1, code_b2, code_b1, a_b_links[0], code_b3_link}) source_1.delete_links([code_a1, a_b_links[0]]) eq_(set(source_1.linked), {code_b2, code_b1, code_b3_link}) # test whether metaclass links fail on class mcl_a = CMetaclass("M") mcl_b = CMetaclass("Source") mcl_association = mcl_a.association(mcl_b, "[a] * -> [b] *") cl_a = CClass(mcl_a, "cla") cl_b = CClass(mcl_a, "clb") class_link = add_links({cl_a: [cl_b]}, association=mcl_association)[0] try: add_links({source_1: [code_a1, code_b2, code_b1, class_link]}, role_name="contained_code") exception_expected_() except CException as e: eq_("link target is a class link, but source is an object", e.value)