示例#1
0
    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, [])
示例#2
0
    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, [])
示例#3
0
    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])
示例#4
0
    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])
示例#5
0
 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'")
示例#6
0
 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")
示例#7
0
    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])
示例#8
0
    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, [])
示例#11
0
 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")
示例#12
0
 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")
示例#13
0
    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")
示例#14
0
    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)