def test_delete_one_to_n_links(self): self.m1.association(self.m2, "l: 0..1 -> *") c1 = CClass(self.m1, "c1") c2 = CClass(self.m1, "c2") c3 = CClass(self.m2, "c3") c4 = CClass(self.m2, "c4") c5 = CClass(self.m2, "c5") add_links({c1: [c3, c4], c2: [c5]}) c4.delete_links([c1]) eq_(c1.linked, [c3]) eq_(c2.linked, [c5]) eq_(c3.linked, [c1]) eq_(c4.linked, []) eq_(c5.linked, [c2]) c4.add_links([c2]) eq_(c2.linked, [c5, c4]) delete_links({c1: c3, c2: c2.linked}) eq_(c1.linked, []) eq_(c2.linked, []) eq_(c3.linked, []) eq_(c4.linked, []) eq_(c5.linked, [])
def test_add_one_to_one_link(self): self.m1.association(self.m2, "l: 1 -> [target] 0..1") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c3 = CClass(self.m2, "c3") eq_(c1.linked, []) add_links({c1: c3}) eq_(c1.linked, [c3]) eq_(c3.linked, [c1]) set_links({c1: []}, role_name="target") eq_(c1.linked, []) c1.add_links(c2) eq_(c1.linked, [c2]) eq_(c2.linked, [c1]) try: add_links({c1: c3}) exception_expected_() except CException as e: eq_(e.value, "links of object 'c1' have wrong multiplicity '2': should be '0..1'") eq_(c1.linked, [c2]) eq_(c2.linked, [c1]) eq_(c3.linked, [])
def test_n_to_n_set_self_link(self): self.m1.association(self.m1, name="a", source_multiplicity="*", multiplicity="*", source_role_name="super", role_name="sub") top = CClass(self.m1, "Top") mid1 = CClass(self.m1, "Mid1") mid2 = CClass(self.m1, "Mid2") mid3 = CClass(self.m1, "Mid3") bottom1 = CClass(self.m1, "Bottom1") bottom2 = CClass(self.m1, "Bottom2") set_links({top: [mid1, mid2, mid3]}, role_name="sub") mid1.add_links([bottom1, bottom2], role_name="sub") eq_(top.linked, [mid1, mid2, mid3]) eq_(mid1.linked, [top, bottom1, bottom2]) eq_(mid2.linked, [top]) eq_(mid3.linked, [top]) eq_(bottom1.linked, [mid1]) eq_(bottom2.linked, [mid1]) eq_(top.get_linked(role_name="sub"), [mid1, mid2, mid3]) eq_(mid1.get_linked(role_name="sub"), [bottom1, bottom2]) eq_(mid2.get_linked(role_name="sub"), []) eq_(mid3.get_linked(role_name="sub"), []) eq_(bottom1.get_linked(role_name="sub"), []) eq_(bottom2.get_linked(role_name="sub"), []) eq_(top.get_linked(role_name="super"), []) eq_(mid1.get_linked(role_name="super"), [top]) eq_(mid2.get_linked(role_name="super"), [top]) eq_(mid3.get_linked(role_name="super"), [top]) eq_(bottom1.get_linked(role_name="super"), [mid1]) eq_(bottom2.get_linked(role_name="super"), [mid1])
def test_add_links_one_to_n_link(self): self.m1.association(self.m2, name="l") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c3 = CClass(self.m2, "c3") c4 = CClass(self.m2, "c4") c5 = CClass(self.m2, "c5") c6 = CClass(self.m2, "c6") add_links({c1: [c2, c3]}) eq_(c1.linked, [c2, c3]) eq_(c2.linked, [c1]) eq_(c3.linked, [c1]) add_links({c1: c4}) eq_(c1.linked, [c2, c3, c4]) eq_(c2.linked, [c1]) eq_(c3.linked, [c1]) eq_(c4.linked, [c1]) c1.add_links([c5, c6]) eq_(c1.linked, [c2, c3, c4, c5, c6]) eq_(c2.linked, [c1]) eq_(c3.linked, [c1]) eq_(c4.linked, [c1]) eq_(c5.linked, [c1]) eq_(c6.linked, [c1])
def test_delete_links_wrong_role_name(self): self.m1.association(self.m2, "a: [sourceA] * -> [targetA] *") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c1.add_links(c2) try: c1.delete_links(c2, role_name="target") exception_expected_() except CException as e: eq_(e.value, "no link found for 'c1 -> c2' in delete links for given role name 'target'")
def test_wrong_types_add_links(self): self.m1.association(self.m2, name="l", multiplicity="1") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") try: add_links({c1: self.mcl}) exception_expected_() except CException as e: eq_(e.value, "link target 'MCL' is not an object, class, or link") try: c1.add_links([c2, self.mcl]) exception_expected_() except CException as e: eq_(e.value, "link target 'MCL' is not an object, class, or link")
def test_delete_link_select_by_association(self): a = self.m1.association(self.m2, "a: * -> *") b = self.m1.association(self.m2, "b: * -> *") c1 = CClass(self.m1, "c1") c2 = CClass(self.m1, "c2") c3 = CClass(self.m2, "c3") c4 = CClass(self.m2, "c4") add_links({c1: [c3], c2: [c3, c4]}, association=b) delete_links({c2: c3}) eq_(c1.linked, [c3]) eq_(c2.linked, [c4]) eq_(c3.linked, [c1]) eq_(c4.linked, [c2]) add_links({c1: [c3], c2: [c3, c4]}, association=a) try: delete_links({c1: c3}) exception_expected_() except CException as e: eq_(e.value, "link definition in delete links ambiguous for link 'c1->c3': found multiple matches") delete_links({c1: c3, c2: c4}, association=b) eq_(c1.linked, [c3]) eq_(c2.linked, [c3, c4]) eq_(c3.linked, [c1, c2]) eq_(c4.linked, [c2]) for o in [c1, c2, c3, c4]: for lo in o.links: eq_(lo.association, a) c1.add_links(c3, association=b) try: c1.delete_links(c3) exception_expected_() except CException as e: eq_(e.value, "link definition in delete links ambiguous for link 'c1->c3': found multiple matches") eq_(c1.linked, [c3, c3]) eq_(c2.linked, [c3, c4]) eq_(c3.linked, [c1, c2, c1]) eq_(c4.linked, [c2]) c1.delete_links(c3, association=a) eq_(c1.linked, [c3]) eq_(c2.linked, [c3, c4]) eq_(c3.linked, [c2, c1]) eq_(c4.linked, [c2])
def test_duplicate_assignment(self): a = self.m1.association(self.m2, "l: *->*") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") try: set_links({c1: [c2, c2]}) exception_expected_() except CException as e: eq_(e.value, "trying to link the same link twice 'c1 -> c2'' twice for the same association") eq_(c1.get_linked(), []) eq_(c2.get_linked(), []) b = self.m1.association(self.m2, "l: *->*") c1.add_links(c2, association=a) c1.add_links(c2, association=b) eq_(c1.get_linked(), [c2, c2]) eq_(c2.get_linked(), [c1, c1])
def test_add_stereotype_instance_correct_by_inheritance_of_stereotype( self): s1 = CStereotype("S1", extended=self.a) s2 = CStereotype("S2", superclasses=s1) c1 = CClass(self.m1, "C1") c2 = CClass(self.m2, "C2") links = c1.add_links(c2, stereotype_instances=[s2])[0] eq_(s2.extended_instances, [links]) eq_(links.stereotype_instances, [s2])
def test_stereotype_instances_wrong_type_in_assignment(self): CStereotype("S1", extended=self.a) c1 = CClass(self.m1, "C1") c2 = CClass(self.m2, "C2") links = c1.add_links(c2)[0] try: links.stereotype_instances = self.a exception_expected_() except CException as e: eq_(e.value, "a list or a stereotype is required as input") eq_(links.stereotype_instances, [])
def test_delete_links_wrong_association(self): self.m1.association(self.m2, "a: [sourceA] * -> [targetA] *") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c1.add_links(c2) try: c1.delete_links(c2, association=c1) exception_expected_() except CException as e: eq_(e.value, "'c1' is not a association") b = self.m1.association(self.m2, "b: [sourceB] * -> [targetB] *") try: c1.delete_links(c2, association=b) exception_expected_() except CException as e: eq_(e.value, "no link found for 'c1 -> c2' in delete links for given association") try: c1.delete_links(c2, association=b, role_name="x") exception_expected_() except CException as e: eq_(e.value, "no link found for 'c1 -> c2' in delete links for given role name 'x' and for given association")
def test_link_methods_wrong_keyword_args(self): c1 = CClass(self.m1, "C1") try: add_links({c1: c1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: c1.add_links(c1, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: set_links({c1: c1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: c1.delete_links(c1, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: delete_links({c1: c1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: c1.get_linked(associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: delete_links({c1: c1}, stereotype_instances=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument")
def test_link_label_get_set(self): a1 = self.m1.association(self.m2, name="a1", multiplicity="*") a2 = self.m1.association(self.m2, multiplicity="*") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c3 = CClass(self.m2, "c3") l1 = set_links({c1: c2}, association=a1, label="l1") l2 = add_links({c1: [c2, c3]}, association=a2, label="l2") eq_(l1[0].label, "l1") eq_(l2[0].label, "l2") eq_(l2[1].label, "l2") l2[1].label = "l3" eq_(l2[0].label, "l2") eq_(l2[1].label, "l3") l3 = c1.add_links(c3, association=a1, label="x1") eq_(l3[0].label, "x1")
def test_add_links(self): self.m1.association(self.m2, "1 -> [role1] *") self.m1.association(self.m2, "* -> [role2] *") self.m1.association(self.m2, "1 -> [role3] 1") c1 = CClass(self.m1, "c1") c2 = CClass(self.m2, "c2") c3 = CClass(self.m2, "c3") c4 = CClass(self.m2, "c4") add_links({c1: c2}, role_name="role1") eq_(c1.get_linked(role_name="role1"), [c2]) add_links({c1: [c3, c4]}, role_name="role1") c1.get_linked(role_name="role1") eq_(c1.get_linked(role_name="role1"), [c2, c3, c4]) c1.add_links(c2, role_name="role2") eq_(c1.get_linked(role_name="role2"), [c2]) c1.add_links([c3, c4], role_name="role2") c1.get_linked(role_name="role2") eq_(c1.get_linked(role_name="role2"), [c2, c3, c4]) c1.add_links(c2, role_name="role3") eq_(c1.get_linked(role_name="role3"), [c2]) try: add_links({c1: [c3, c4]}, role_name="role3") exception_expected_() except CException as e: eq_(e.value, "links of object 'c1' have wrong multiplicity '3': should be '1'") try: add_links({c1: [c3]}, role_name="role3") exception_expected_() except CException as e: eq_(e.value, "links of object 'c1' have wrong multiplicity '2': should be '1'") eq_(c1.get_linked(role_name="role3"), [c2])
merge_node_view_item: [decision_node_search_browse, view_item], view_item: decision_node_decision_made, decision_node_decision_made: [merge_node_search, merge_node_browse], add_to_shopping_cart: decision_node_proceed, update_shopping_cart: decision_node_proceed, merge_node_view_shopping_cart: view_shopping_cart, view_shopping_cart: decision_node_done, check_shopping_cart: merge_node_view_shopping_cart, proceed_to_checkout: checkout_merge_node, checkout_merge_node: checkout, checkout: final_node_shopping_cart, }, role_name="target") decision_node_search_browse.add_links(merge_node_search, label="[search]", role_name="target") decision_node_search_browse.add_links(merge_node_browse, label="[browse]", role_name="target") decision_node_found.add_links(merge_node_view_item, label="[found]", role_name="target") decision_node_found.add_links(decision_node_search_browse, label="[not found]", role_name="target") decision_node_decision_made.add_links(add_to_shopping_cart, label="[made decision]", role_name="target") decision_node_proceed.add_links(merge_node_view_shopping_cart, label="[view cart]",
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)