def test_stereotype_instances_on_association_link(self): s1 = CStereotype("S1", extended=self.a) s2 = CStereotype("S2", extended=self.a) s3 = CStereotype("S3", extended=self.a) c1 = CClass(self.m1, "C1") c2 = CClass(self.m2, "C2") c3 = CClass(self.m2, "C3") links = set_links({c1: [c2, c3]}) l1 = links[0] eq_(l1.stereotype_instances, []) eq_(s1.extended_instances, []) l1.stereotype_instances = [s1] eq_(s1.extended_instances, [l1]) eq_(l1.stereotype_instances, [s1]) l1.stereotype_instances = [s1, s2, s3] eq_(s1.extended_instances, [l1]) eq_(s2.extended_instances, [l1]) eq_(s3.extended_instances, [l1]) eq_(set(l1.stereotype_instances), {s1, s2, s3}) l1.stereotype_instances = s2 eq_(l1.stereotype_instances, [s2]) eq_(s1.extended_instances, []) eq_(s2.extended_instances, [l1]) eq_(s3.extended_instances, []) eq_(c1.get_links_for_association(self.a), links) eq_(c2.get_links_for_association(self.a), [l1]) eq_(c3.get_links_for_association(self.a), [links[1]])
def test_multiple_extended_instances(self): s1 = CStereotype("S1", extended=self.a) s2 = CStereotype("S2", extended=self.a) c1 = CClass(self.m1, "C1") c2 = CClass(self.m2, "C2") c3 = CClass(self.m2, "C3") c4 = CClass(self.m2, "C4") links = set_links({c1: [c2, c3, c4]}) links[0].stereotype_instances = [s1] eq_(s1.extended_instances, [links[0]]) links[1].stereotype_instances = [s1] eq_(set(s1.extended_instances), {links[0], links[1]}) links[2].stereotype_instances = [s1, s2] eq_(set(s1.extended_instances), {links[0], links[1], links[2]}) eq_(set(s2.extended_instances), {links[2]}) eq_(c1.get_links_for_association(self.a), links)
def test_link_and_get_links_by_association(self): a1 = self.m1.association(self.m2, name="a1", multiplicity="*") a2 = self.m1.association(self.m2, name="a2", multiplicity="*") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c3 = CClass(self.m2, "c3") links_a1 = set_links({c1: c2}, association=a1) links_a2 = set_links({c1: [c2, c3]}, association=a2) eq_(c1.get_linked(), [c2, c2, c3]) eq_(c1.linked, [c2, c2, c3]) eq_(c1.get_linked(association=a1), [c2]) eq_(c1.get_linked(association=a2), [c2, c3]) eq_(c1.get_links_for_association(a1), links_a1) eq_(c1.get_links_for_association(a2), links_a2)
def test_reference_to_link(self): code = CMetaclass("Code") source = CMetaclass("Source") code_association = code.association(source, "[contained_code] * -> [source] *") code_a = CMetaclass("Code A", superclasses=code) code_b = CMetaclass("Code B", superclasses=code) a_b_association = code_a.association(code_b, "a_b: [code_a] * -> [code_b] *", superclasses=code) source_1 = CClass(source, "source_1") code_a1 = CClass(code_a, "code_a1") code_b1 = CClass(code_b, "code_b1") code_b2 = CClass(code_b, "code_b2") code_b3 = CClass(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 class 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 class links fail on metaclass cl_a = CClass(self.mcl, "CLA") cl_b = CClass(self.mcl, "CLB") cl_association = cl_a.association(cl_b, "[a] * -> [b] *") o_a = CObject(cl_a, "oa") o_b = CObject(cl_a, "ob") object_link = add_links({o_a: [o_b]}, association=cl_association)[0] try: add_links({source_1: [code_a1, code_b2, code_b1, object_link]}, role_name="contained_code") exception_expected_() except CException as e: eq_("link target is an object link, but source is a class", e.value)