Example #1
0
 def test_attribute_get_name_and_classifier(self):
     m = CMetaclass("M", attributes={"isBoolean": True})
     a = m.get_attribute("isBoolean")
     eq_(a.name, "isBoolean")
     eq_(a.classifier, m)
     m.delete()
     eq_(a.name, None)
     eq_(a.classifier, None)
 def test_super_metaclasses_that_are_deleted(self):
     m1 = CMetaclass("M1")
     m1.delete()
     try:
         CMetaclass(superclasses=[m1])
         exception_expected_()
     except CException as e:
         eq_(e.value, "cannot access named element that has been deleted")
Example #3
0
 def test_extended_metaclass_that_is_deleted(self):
     m1 = CMetaclass("M1")
     m1.delete()
     try:
         CStereotype(extended=[m1])
         exception_expected_()
     except CException as e:
         eq_(e.value, "cannot access named element that has been deleted")
Example #4
0
 def test_metaclass_is_deleted_in_constructor(self):
     m1 = CMetaclass("M1")
     m1.delete()
     try:
         CClass(m1, "C1")
         exception_expected_()
     except CException as e:
         ok_(e.value.endswith("cannot access named element that has been deleted"))
Example #5
0
    def test_attribute_values_inheritance_after_delete_superclass(self):
        t1 = CMetaclass("T1")
        t2 = CMetaclass("T2")
        c = CMetaclass("C", superclasses=[t1, t2])
        sc = CMetaclass("C", superclasses=c)

        t1.attributes = {"i0": 0}
        t2.attributes = {"i1": 1}
        c.attributes = {"i2": 2}
        sc.attributes = {"i3": 3}

        cl = CClass(sc, "C")

        t2.delete()

        for name, value in {"i0": 0, "i2": 2, "i3": 3}.items():
            eq_(cl.get_value(name), value)
        try:
            cl.get_value("i1")
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'i1' unknown for 'C'")

        eq_(cl.get_value("i0", t1), 0)
        try:
            cl.get_value("i1", t2)
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'i1' unknown for ''")
        eq_(cl.get_value("i2", c), 2)
        eq_(cl.get_value("i3", sc), 3)

        for name, value in {"i0": 10, "i2": 12, "i3": 13}.items():
            cl.set_value(name, value)
        try:
            cl.set_value("i1", 11)
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'i1' unknown for 'C'")

        for name, value in {"i0": 10, "i2": 12, "i3": 13}.items():
            eq_(cl.get_value(name), value)
        try:
            cl.get_value("i1")
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'i1' unknown for 'C'")

        eq_(cl.get_value("i0", t1), 10)
        try:
            cl.get_value("i1", t2)
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'i1' unknown for ''")
        eq_(cl.get_value("i2", c), 12)
        eq_(cl.get_value("i3", sc), 13)
 def test_delete_metaclass_having_two_bundles(self):
     b1 = CBundle("B1")
     b2 = CBundle("B2")
     m1 = CMetaclass("m1", bundles=[b1, b2])
     m2 = CMetaclass("m2", bundles=[b2])
     m1.delete()
     eq_(set(b1.get_elements(type=CMetaclass)), set())
     eq_(set(b2.get_elements(type=CMetaclass)), {m2})
     eq_(set(m1.bundles), set())
     eq_(set(m2.bundles), {b2})
Example #7
0
 def test_metaclass_is_deleted_in_metaclass_method(self):
     m1 = CMetaclass("M1")
     m2 = CMetaclass("M2")
     c1 = CClass(m2, "C1")
     m1.delete()
     try:
         c1.metaclass = m1
         exception_expected_()
     except CException as e:
         ok_(e.value.endswith("cannot access named element that has been deleted"))
Example #8
0
    def test_default_values_from_stereotype__metaclass_delete(self):
        mcl = CMetaclass("MCL",
                         attributes={
                             "aStr2": "def",
                             "aList2": ["d1", "d2"],
                             "b": bool
                         })
        mcl2 = CMetaclass("MCL2",
                          superclasses=mcl,
                          attributes={
                              "aStr1": str,
                              "aList1": list
                          })
        s1 = CStereotype("S1",
                         extended=mcl2,
                         default_values={
                             "aStr1": "a",
                             "aList2": []
                         })
        s2 = CStereotype("S2",
                         superclasses=s1,
                         extended=mcl2,
                         default_values={
                             "aList1": ["a"],
                             "aStr2": "def2"
                         })
        c1 = CClass(mcl2, "C1", stereotype_instances=s2)
        mcl.delete()
        c2 = CClass(mcl2, "C2", stereotype_instances=s1)
        c3 = CClass(mcl2, "C3", stereotype_instances=s2)

        eq_(c1.get_value("aStr1"), "a")
        eq_(c1.get_value("aList1"), ["a"])
        try:
            eq_(c1.get_value("aStr2"), "def2")
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'aStr2' unknown for 'C1'")

        eq_(c2.get_value("aStr1"), "a")
        eq_(c2.get_value("aList1"), None)
        try:
            eq_(c2.get_value("aStr2"), "def2")
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'aStr2' unknown for 'C2'")

        eq_(c3.get_value("aStr1"), "a")
        eq_(c3.get_value("aList1"), ["a"])
        try:
            eq_(c3.get_value("aStr2"), "def2")
            exception_expected_()
        except CException as e:
            eq_(e.value, "attribute 'aStr2' unknown for 'C3'")
Example #9
0
 def test_stereotype_remove_stereotype_or_metaclass(self):
     mcl = CMetaclass("MCL1")
     s1 = CStereotype("S1", extended=[mcl])
     s2 = CStereotype("S2", extended=[mcl])
     s3 = CStereotype("S3", extended=[mcl])
     s4 = CStereotype("S4", extended=[mcl])
     eq_(set(mcl.stereotypes), {s1, s2, s3, s4})
     s2.delete()
     eq_(set(mcl.stereotypes), {s1, s3, s4})
     eq_(set(s2.extended), set())
     eq_(set(s1.extended), {mcl})
     mcl.delete()
     eq_(set(mcl.stereotypes), set())
     eq_(set(s1.extended), set())
Example #10
0
    def test_delete_metaclass_classes_relation(self):
        m1 = CMetaclass()
        m2 = CMetaclass()
        cl1 = CClass(m1)
        cl2 = CClass(m1)
        cl3 = CClass(m2)

        m1.delete()

        eq_(cl1.metaclass, None)
        eq_(cl2.metaclass, None)
        eq_(cl3.metaclass, m2)
        eq_(set(m2.classes), {cl3})
        eq_(m1.classes, [])
Example #11
0
    def test_default_values_on_stereotype__metaclass_delete(self):
        mcl = CMetaclass("MCL",
                         attributes={
                             "aStr2": "def",
                             "aList2": ["d1", "d2"],
                             "b": bool
                         })
        mcl2 = CMetaclass("MCL2",
                          superclasses=mcl,
                          attributes={
                              "aStr1": str,
                              "aList1": list
                          })
        s1 = CStereotype("S1",
                         extended=mcl2,
                         default_values={
                             "aStr1": "a",
                             "aList2": []
                         })
        s2 = CStereotype("S2",
                         superclasses=s1,
                         extended=mcl2,
                         default_values={
                             "aList1": ["a"],
                             "aStr2": "def2"
                         })
        mcl.delete()

        eq_(s1.default_values, {"aStr1": "a"})
        eq_(s2.default_values, {"aList1": ["a"]})
        eq_(s1.get_default_value("aStr1"), "a")
        try:
            eq_(s2.get_default_value("aStr2"), "def2")
            exception_expected_()
        except CException as e:
            eq_(
                e.value,
                "attribute 'aStr2' unknown for metaclasses extended by stereotype 'S2'"
            )
        eq_(s2.get_default_value("aStr1"), None)
Example #12
0
    def test_delete_metaclass(self):
        m = CMetaclass("M1")
        cl = CClass(m, "C")
        m.delete()
        eq_(cl.metaclass, None)

        m1 = CMetaclass("M1")
        m2 = CMetaclass("M2")
        m3 = CMetaclass("M3",
                        superclasses=m2,
                        attributes={"i": 1},
                        stereotypes=CStereotype("S"))
        cl = CClass(m3, "C")
        m1.delete()
        eq_(cl.metaclass, m3)
        m3.delete()
        eq_(cl.metaclass, None)

        eq_(m3.superclasses, [])
        eq_(m2.subclasses, [])
        eq_(m3.attributes, [])
        eq_(m3.attribute_names, [])
        eq_(m3.stereotypes, [])
        eq_(m3.classes, [])
        eq_(m3.name, None)
        eq_(m3.bundles, [])
    def test_metaclass_inheritance_delete_top_class(self):
        t = CMetaclass("T")
        m1 = CMetaclass("M1", superclasses=[t])
        m2 = CMetaclass("M2", superclasses=[t])
        b1 = CMetaclass("B1", superclasses=[m1])
        b2 = CMetaclass("B2", superclasses=[m1])
        b3 = CMetaclass("B3", superclasses=[t])

        t.delete()

        eq_(t.name, None)
        eq_(set(t.superclasses), set())
        eq_(set(t.subclasses), set())
        eq_(set(t.all_superclasses), set())
        eq_(set(t.all_subclasses), set())

        eq_(set(m1.superclasses), set())
        eq_(set(m1.subclasses), {b1, b2})
        eq_(set(m1.all_superclasses), set())
        eq_(set(m1.all_subclasses), {b1, b2})

        eq_(set(m2.superclasses), set())
        eq_(set(m2.subclasses), set())
        eq_(set(m2.all_superclasses), set())
        eq_(set(m2.all_subclasses), set())

        eq_(set(b1.superclasses), {m1})
        eq_(set(b1.subclasses), set())
        eq_(set(b1.all_superclasses), {m1})
        eq_(set(b1.all_subclasses), set())

        eq_(set(b2.superclasses), {m1})
        eq_(set(b2.subclasses), set())
        eq_(set(b2.all_superclasses), {m1})
        eq_(set(b2.all_subclasses), set())

        eq_(set(b3.superclasses), set())
        eq_(set(b3.subclasses), set())
        eq_(set(b3.all_superclasses), set())
        eq_(set(b3.all_subclasses), set())
    def test_metaclass_inheritance_delete_inner_class(self):
        t = CMetaclass("T")
        m1 = CMetaclass("M1", superclasses=[t])
        m2 = CMetaclass("M2", superclasses=[t])
        b1 = CMetaclass("B1", superclasses=[m1])
        b2 = CMetaclass("B2", superclasses=[m1])
        b3 = CMetaclass("B3", superclasses=[t])

        m1.delete()

        eq_(set(t.superclasses), set())
        eq_(set(t.subclasses), {m2, b3})
        eq_(set(t.all_superclasses), set())
        eq_(set(t.all_subclasses), {m2, b3})

        eq_(set(m1.superclasses), set())
        eq_(set(m1.subclasses), set())
        eq_(set(m1.all_superclasses), set())
        eq_(set(m1.all_subclasses), set())

        eq_(set(m2.superclasses), {t})
        eq_(set(m2.subclasses), set())
        eq_(set(m2.all_superclasses), {t})
        eq_(set(m2.all_subclasses), set())

        eq_(set(b1.superclasses), set())
        eq_(set(b1.subclasses), set())
        eq_(set(b1.all_superclasses), set())
        eq_(set(b1.all_subclasses), set())

        eq_(set(b2.superclasses), set())
        eq_(set(b2.subclasses), set())
        eq_(set(b2.all_superclasses), set())
        eq_(set(b2.all_subclasses), set())

        eq_(set(b3.superclasses), {t})
        eq_(set(b3.subclasses), set())
        eq_(set(b3.all_superclasses), {t})
        eq_(set(b3.all_subclasses), set())
    def test_delete_metaclass_from_bundle(self):
        b1 = CBundle("B1")
        CBundle("B2")
        m1 = CMetaclass("M1", bundles=b1)
        m1.delete()
        eq_(set(b1.get_elements(type=CMetaclass)), set())

        m1 = CMetaclass("M1", bundles=b1)
        m2 = CMetaclass("M1", bundles=b1)
        m3 = CMetaclass("M1", superclasses=m2, attributes={"i": 1}, bundles=b1)
        CClass(m3, bundles=b1)
        m1.delete()
        eq_(set(b1.get_elements(type=CMetaclass)), {m2, m3})
        m3.delete()
        eq_(set(b1.get_elements(type=CMetaclass)), {m2})

        eq_(m3.superclasses, [])
        eq_(m2.subclasses, [])
        eq_(m3.attributes, [])
        eq_(m3.attribute_names, [])
        eq_(m3.classes, [])
        eq_(m3.name, None)
        eq_(m3.bundles, [])
        eq_(b1.get_elements(type=CClass), [])
class TestMetaclassAssociations:
    def setup(self):
        self.metaclassBundle = CBundle("P")
        self.m1 = CMetaclass("M1", bundles=self.metaclassBundle)
        self.m2 = CMetaclass("M2", bundles=self.metaclassBundle)
        self.m3 = CMetaclass("M3", bundles=self.metaclassBundle)
        self.m4 = CMetaclass("M4", bundles=self.metaclassBundle)
        self.m5 = CMetaclass("M5", bundles=self.metaclassBundle)

    def get_all_associations_in_bundle(self):
        associations = []
        for c in self.metaclassBundle.get_elements(type=CMetaclass):
            for a in c.all_associations:
                if a not in associations:
                    associations.append(a)
        return associations

    def test_association_creation(self):
        a1 = self.m1.association(self.m2,
                                 multiplicity="1",
                                 role_name="t",
                                 source_multiplicity="*",
                                 source_role_name="i")
        a2 = self.m1.association(self.m2, "[o]*->[s]1")
        a3 = self.m1.association(self.m3, "[a] 0..1 <*>- [n]*")
        a4 = self.m1.association(self.m3,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 composition=True)
        a5 = self.m4.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 aggregation=True)
        a6 = self.m3.association(self.m2, '[a] 3 <>- [e]*')

        eq_(len(self.get_all_associations_in_bundle()), 6)

        eq_(self.m1.associations[0].role_name, "t")
        eq_(a5.role_name, "n")
        eq_(a2.role_name, "s")
        eq_(a1.multiplicity, "1")
        eq_(a1.source_multiplicity, "*")
        eq_(a4.source_multiplicity, "0..1")
        eq_(a6.source_multiplicity, "3")

        eq_(a1.composition, False)
        eq_(a1.aggregation, False)
        eq_(a3.composition, True)
        eq_(a3.aggregation, False)
        eq_(a5.composition, False)
        eq_(a5.aggregation, True)

        a1.aggregation = True
        eq_(a1.composition, False)
        eq_(a1.aggregation, True)
        a1.composition = True
        eq_(a1.composition, True)
        eq_(a1.aggregation, False)

    def test_mixed_association_types(self):
        c1 = CClass(self.m1, "C1")
        s1 = CStereotype("S1")
        try:
            self.m1.association(s1,
                                multiplicity="1",
                                role_name="t",
                                source_multiplicity="*",
                                source_role_name="i")
            exception_expected_()
        except CException as e:
            eq_(
                "metaclass 'M1' is not compatible with association target 'S1'",
                e.value)

        try:
            self.m1.association(c1,
                                multiplicity="1",
                                role_name="t",
                                source_multiplicity="*",
                                source_role_name="i")
            exception_expected_()
        except CException as e:
            eq_(
                "metaclass 'M1' is not compatible with association target 'C1'",
                e.value)

    def test_get_association_by_role_name(self):
        self.m1.association(self.m2,
                            multiplicity="1",
                            role_name="t",
                            source_multiplicity="*",
                            source_role_name="i")
        self.m1.association(self.m2,
                            multiplicity="1",
                            role_name="s",
                            source_multiplicity="*",
                            source_role_name="o")
        self.m1.association(self.m3,
                            multiplicity="*",
                            role_name="n",
                            source_multiplicity="0..1",
                            source_role_name="a",
                            composition=True)

        a_2 = next(a for a in self.m1.associations if a.role_name == "s")
        eq_(a_2.multiplicity, "1")
        eq_(a_2.source_role_name, "o")
        eq_(a_2.source_multiplicity, "*")

    def test_get_association_by_name(self):
        self.m1.association(self.m2,
                            name="n1",
                            multiplicity="1",
                            role_name="t",
                            source_multiplicity="*",
                            source_role_name="i")
        self.m1.association(self.m2,
                            name="n2",
                            multiplicity="1",
                            role_name="s",
                            source_multiplicity="*",
                            source_role_name="o")
        self.m1.association(self.m3, "n3: [a] 0..1 <*>- [n] *")

        a_2 = next(a for a in self.m1.associations if a.name == "n2")
        eq_(a_2.multiplicity, "1")
        eq_(a_2.source_role_name, "o")
        eq_(a_2.source_multiplicity, "*")

        a_3 = next(a for a in self.m1.associations if a.name == "n3")
        eq_(a_3.multiplicity, "*")
        eq_(a_3.role_name, "n")
        eq_(a_3.source_multiplicity, "0..1")
        eq_(a_3.source_role_name, "a")
        eq_(a_3.composition, True)

    def test_get_associations(self):
        a1 = self.m1.association(self.m2,
                                 multiplicity="1",
                                 role_name="t",
                                 source_multiplicity="*",
                                 source_role_name="i")
        a2 = self.m1.association(self.m2,
                                 multiplicity="1",
                                 role_name="s",
                                 source_multiplicity="*",
                                 source_role_name="o")
        a3 = self.m1.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 composition=True)
        a4 = self.m1.association(self.m3,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 composition=True)
        a5 = self.m4.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 aggregation=True)
        a6 = self.m3.association(self.m2,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="3",
                                 source_role_name="a",
                                 aggregation=True)
        eq_(self.m1.associations, [a1, a2, a3, a4])
        eq_(self.m2.associations, [a1, a2, a6])
        eq_(self.m3.associations, [a3, a4, a5, a6])
        eq_(self.m4.associations, [a5])
        eq_(self.m5.associations, [])

    def test_delete_associations(self):
        a1 = self.m1.association(self.m2,
                                 multiplicity="1",
                                 role_name="t",
                                 source_multiplicity="*",
                                 source_role_name="i")
        a2 = self.m1.association(self.m2,
                                 multiplicity="1",
                                 role_name="s",
                                 source_multiplicity="*",
                                 source_role_name="o")
        a3 = self.m1.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 composition=True)
        a4 = self.m1.association(self.m3,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 composition=True)
        a5 = self.m4.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 aggregation=True)
        a6 = self.m3.association(self.m2,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="3",
                                 source_role_name="a",
                                 aggregation=True)
        a7 = self.m1.association(self.m1,
                                 multiplicity="*",
                                 role_name="x",
                                 source_multiplicity="3",
                                 source_role_name="y")

        eq_(len(self.get_all_associations_in_bundle()), 7)

        a2.delete()
        a4.delete()

        eq_(len(self.get_all_associations_in_bundle()), 5)

        eq_(self.m1.associations, [a1, a3, a7])
        eq_(self.m2.associations, [a1, a6])
        eq_(self.m3.associations, [a3, a5, a6])
        eq_(self.m4.associations, [a5])
        eq_(self.m5.associations, [])

    def test_delete_class_and_get_associations(self):
        self.m1.association(self.m2,
                            multiplicity="1",
                            role_name="t",
                            source_multiplicity="*",
                            source_role_name="i")
        self.m1.association(self.m2,
                            multiplicity="1",
                            role_name="s",
                            source_multiplicity="*",
                            source_role_name="o")
        self.m1.association(self.m3,
                            multiplicity="*",
                            role_name="n",
                            source_multiplicity="0..1",
                            source_role_name="a",
                            composition=True)
        self.m1.association(self.m3,
                            multiplicity="*",
                            role_name="e",
                            source_multiplicity="0..1",
                            source_role_name="a",
                            composition=True)
        a5 = self.m4.association(self.m3,
                                 multiplicity="*",
                                 role_name="n",
                                 source_multiplicity="0..1",
                                 source_role_name="a",
                                 aggregation=True)
        a6 = self.m3.association(self.m2,
                                 multiplicity="*",
                                 role_name="e",
                                 source_multiplicity="3",
                                 source_role_name="a",
                                 aggregation=True)
        self.m1.association(self.m1,
                            multiplicity="*",
                            role_name="x",
                            source_multiplicity="3",
                            source_role_name="y")

        eq_(len(self.get_all_associations_in_bundle()), 7)

        self.m1.delete()

        eq_(len(self.get_all_associations_in_bundle()), 2)

        eq_(self.m1.associations, [])
        eq_(self.m2.associations, [a6])
        eq_(self.m3.associations, [a5, a6])
        eq_(self.m4.associations, [a5])
        eq_(self.m5.associations, [])

    def test_all_associations(self):
        s = CMetaclass("S")
        d = CMetaclass("D", superclasses=s)
        a = s.association(d, "is next: [prior s] * -> [next d] *")
        eq_(d.all_associations, [a])
        eq_(s.all_associations, [a])

    def test_get_opposite_classifier(self):
        a = self.m1.association(self.m2, "[o]*->[s]1")
        eq_(a.get_opposite_classifier(self.m1), self.m2)
        eq_(a.get_opposite_classifier(self.m2), self.m1)
        try:
            a.get_opposite_classifier(self.m3)
            exception_expected_()
        except CException as e:
            eq_(
                "can only get opposite if either source or target classifier is provided",
                e.value)