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)
Example #3
0
    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)