def test_derived_from_source_multiplicities_on_multiple_associations(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        a = self.m1.association(self.m2, "a: [m1] 1 -> [m2] *")
        try:
            c1.association(c2, "a1: [c1] 1 -> [c2] *", derived_from=a)
            c1.association(c2, "a1: [c1] 1 -> [c2] *", derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "source upper multiplicity '2' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' source upper " +
                "multiplicity '1' this association is derived from")
    def test_delete_derived_association(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        c = c1.association(c2, "ac: [c1] 1 -> [c2] *")
        c.delete()
        eq_(c.derived_from, None)

        b = c1.association(c2, "ac: [c1] 1 -> [c2] *", derived_from=self.a)

        b.delete()

        eq_(b.derived_from, None)
        eq_(self.a.derived_associations, [])
    def test_derived_from_target_multiplicities_on_multiple_associations_inheritance2(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        c3 = CClass(self.m1, "C3", superclasses=c1)

        a = self.m1.association(self.m2, "a: [m1] * -> [m2] 1")

        try:
            c3.association(c2, "a1: [c3] * -> [c2] 1", derived_from=a)
            c1.association(c2, "a2: [c1] * -> [c2] 1..*", derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "upper multiplicity '*' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' upper " +
                "multiplicity '1' this association is derived from")
    def test_stereotype_instances_on_derived_association(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")

        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)

        eq_(a1.stereotype_instances, [])
        eq_(s1.extended_instances, [])
        a1.stereotype_instances = [s1]
        eq_(s1.extended_instances, [a1])
        eq_(a1.stereotype_instances, [s1])
        a1.stereotype_instances = [s1, s2, s3]
        eq_(s1.extended_instances, [a1])
        eq_(s2.extended_instances, [a1])
        eq_(s3.extended_instances, [a1])
        eq_(set(a1.stereotype_instances), {s1, s2, s3})
        a1.stereotype_instances = s2
        eq_(a1.stereotype_instances, [s2])
        eq_(s1.extended_instances, [])
        eq_(s2.extended_instances, [a1])
        eq_(s3.extended_instances, [])

        eq_(c1.associations, [a1])
        eq_(c2.associations, [a1])
예제 #5
0
    def test_add_links_with_inherited_common_classifiers(self):
        mcl = CMetaclass("MCL")
        super_a = CClass(mcl, "SuperA")
        super_b = CClass(mcl, "SuperB")
        super_a.association(super_b, "[a] 1 -> [b] *")

        sub_b1 = CClass(mcl, "SubB1", superclasses=[super_b])
        sub_b2 = CClass(mcl, "SubB2", superclasses=[super_b])
        sub_a = CClass(mcl, "SubA", superclasses=[super_a])

        obj_a = CObject(sub_a, "a")
        obj_b1 = CObject(sub_b1, "b1")
        obj_b2 = CObject(sub_b2, "b2")

        add_links({obj_a: [obj_b1, obj_b2]}, role_name="b")
        eq_(set(obj_a.get_linked(role_name="b")), {obj_b1, obj_b2})
 def test_all_extended_instances(self):
     s1 = CStereotype("S1", extended=self.a)
     s2 = CStereotype("S2", superclasses=s1)
     c1 = CClass(self.m1, "C1")
     c2 = CClass(self.m2, "C2")
     c3 = CClass(self.m2, "C3")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a)
     a2 = c1.association(c3, name="a", multiplicity="*", role_name="c3",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a)
     a1.stereotype_instances = s1
     a2.stereotype_instances = s2
     eq_(s1.extended_instances, [a1])
     eq_(s2.extended_instances, [a2])
     eq_(s1.all_extended_instances, [a1, a2])
     eq_(s2.all_extended_instances, [a2])
    def test_derived_from_source_multiplicities_on_multiple_associations_inheritance3(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        c3 = CClass(self.m1, "C3", superclasses=c1)
        c4 = CClass(self.m2, "C4", superclasses=c2)

        a = self.m1.association(self.m2, "a: [m1] 1 -> [m2] *")

        c1_c2 = c1.association(c2, "a2: [c1] 1 -> [c2] *", derived_from=a)
        try:
            c3.association(c4, "a1: [c3] 1 -> [c4] *", derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "source upper multiplicity '2' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' source upper " +
                "multiplicity '1' this association is derived from")
        eq_(set(a.derived_associations), {c1_c2})
    def test_derived_from_getters(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1")
        eq_(a1.derived_from, None)
        eq_(self.a.derived_associations, [])

        a2 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1",
                            derived_from=self.a)
        eq_(a2.derived_from, self.a)
        eq_(set(self.a.derived_associations), {a2})

        a1.derived_from = self.a
        eq_(a1.derived_from, self.a)
        eq_(set(self.a.derived_associations), {a1, a2})
    def test_setting_derived_from_relation_to_none(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        a1 = c1.association(c2, "1 -> *", derived_from=self.a)
        a1.derived_from = None

        eq_(a1.derived_from, None)
        eq_(self.a.derived_associations, [])
 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")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a,
                         stereotype_instances=s2)
     eq_(s2.extended_instances, [a1])
     eq_(a1.stereotype_instances, [s2])
    def test_target_multiplicities_derived_from_metaclass(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        a = self.m1.association(self.m2, "* -> 1")
        try:
            c1.association(c2, name="a", multiplicity="*", role_name="c2",
                           source_multiplicity="*", source_role_name="c1",
                           derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "lower multiplicity '0' smaller than metaclass' lower " +
                "multiplicity '1' this association is derived from")
        try:
            c1.association(c2, name="a", multiplicity="1..*", role_name="c2",
                           source_multiplicity="*", source_role_name="c1",
                           derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "upper multiplicity '*' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' upper " +
                "multiplicity '1' this association is derived from")

        b = self.m1.association(self.m2, "a: * -> 2..4")

        c1.association(c2, "* -> 2..3", derived_from=b)

        try:
            c1.association(c2, name="a", multiplicity="1..*", role_name="c2",
                           source_multiplicity="*", source_role_name="c1",
                           derived_from=b)
            exception_expected_()
        except CException as e:
            eq_(e.value, "lower multiplicity '1' smaller than metaclass' lower " +
                "multiplicity '2' this association is derived from")
        try:
            c1.association(c2, "* -> 2..*", derived_from=b)
            exception_expected_()
        except CException as e:
            eq_(e.value, "upper multiplicity '*' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' upper " +
                "multiplicity '4' this association is derived from")
 def test_add_stereotype_of_inherited_metaclass(self):
     sub1 = CMetaclass("Sub1", superclasses=self.m1)
     sub2 = CMetaclass("Sub2", superclasses=self.m2)
     s = CStereotype("S1", extended=self.a)
     c1 = CClass(sub1, "C1")
     c2 = CClass(sub2, "C2")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a,
                         stereotype_instances=s)
     eq_(s.extended_instances, [a1])
     eq_(a1.stereotype_instances, [s])
예제 #13
0
    def test_attempt_to_define_stereotypes_on_class_association(self):
        a_class = CClass(self.m1, "AClass")
        b_class = CClass(self.m1, "BClass")
        s = CStereotype("S")
        try:
            a_class.association(b_class, "1 -> 1", stereotypes=s)
            exception_expected_()
        except CException as e:
            eq_(
                "stereotypes on associations can only be defined for metaclass associations",
                e.value)

        association = a_class.association(b_class, "1 -> 1")
        try:
            association.stereotypes = s
            exception_expected_()
        except CException as e:
            eq_(
                "stereotypes on associations can only be defined for metaclass associations",
                e.value)
    def test_setting_one_of_two_derived_from_relations_to_none(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        a1 = c1.association(c2, "1 -> *", derived_from=self.a)
        a2 = c1.association(c2, "1 -> *", derived_from=self.a)
        a1.derived_from = None

        eq_(a1.derived_from, None)
        eq_(a2.derived_from, self.a)
        eq_(set(self.a.derived_associations), {a2})
    def test_changing_single_derived_from_relation(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        ma = self.m1.association(self.m2, "a: [m1] 1 -> [m2] *")
        a1 = c1.association(c2, "1 -> *", derived_from=self.a)
        a1.derived_from = ma

        eq_(a1.derived_from, ma)
        eq_(self.a.derived_associations, [])
        eq_(set(ma.derived_associations), {a1})
    def test_delete_one_of_two_derived_association(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        b1 = c1.association(c2, "ac: [c1] 1 -> [c2] *", derived_from=self.a)
        b2 = c1.association(c2, "ac: [c1] 1 -> [c2] *", derived_from=self.a)

        b1.delete()

        eq_(b1.derived_from, None)
        eq_(b2.derived_from, self.a)
        eq_(set(self.a.derived_associations), {b2})
 def test_delete_stereotype_of_extended_instances(self):
     s1 = CStereotype("S1", extended=self.a)
     s1.delete()
     c1 = CClass(self.m1, "C1")
     c2 = CClass(self.m2, "C2")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a)
     try:
         a1.stereotype_instances = [s1]
         exception_expected_()
     except CException as e:
         eq_(e.value, "cannot access named element that has been deleted")
 def test_delete_stereotyped_element_instance(self):
     s1 = CStereotype("S1", extended=self.a)
     c1 = CClass(self.m1, "C1")
     c2 = CClass(self.m2, "C2")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=self.a,
                         stereotype_instances=[s1])
     eq_(s1.extended_instances, [a1])
     eq_(a1.stereotype_instances, [s1])
     a1.delete()
     eq_(s1.extended_instances, [])
     eq_(a1.stereotype_instances, [])
    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")

        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)
        a2 = c1.association(c3, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)
        a3 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)

        a1.stereotype_instances = [s1]
        eq_(s1.extended_instances, [a1])
        a2.stereotype_instances = [s1]
        eq_(set(s1.extended_instances), {a1, a2})
        a3.stereotype_instances = [s1, s2]
        eq_(set(s1.extended_instances), {a1, a2, a3})
        eq_(set(s2.extended_instances), {a3})
    def test_stereotype_instances_wrong_type_in_assignment(self):
        CStereotype("S1", extended=self.a)
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)

        try:
            a1.stereotype_instances = self.a
            exception_expected_()
        except CException as e:
            eq_(e.value, "a list or a stereotype is required as input")
        eq_(a1.stereotype_instances, [])
예제 #21
0
    def test_link_association_has_a_compatible_superclass(self):
        code = CClass(self.mcl, "Code")
        source = CClass(self.mcl, "Source")
        code.association(source, "[contained_code] * -> [source] *")
        code_a = CClass(self.mcl, "Code A", superclasses=code)
        code_b = CClass(self.mcl, "Code B", superclasses=code)
        a_b_association = code_a.association(code_b,
                                             "a_b: [code_a] * -> [code_b] *")

        source_1 = CObject(source, "source_1")

        code_a1 = CObject(code_a, "code_a1")
        code_b1 = CObject(code_b, "code_b1")
        code_b2 = CObject(code_b, "code_b2")
        links = add_links({code_a1: [code_b1, code_b2]},
                          association=a_b_association)

        try:
            add_links(
                {source_1: [code_a1, code_b2, code_b1, links[0], links[1]]},
                role_name="contained_code")
            exception_expected_()
        except CException as e:
            eq_("the link's association is missing a compatible classifier",
                e.value)

        a_b_association.superclasses = self.cl
        try:
            add_links(
                {source_1: [code_a1, code_b2, code_b1, links[0], links[1]]},
                role_name="contained_code")
            exception_expected_()
        except CException as e:
            eq_("the link's association is missing a compatible classifier",
                e.value)

        a_b_association.superclasses = code_b
        add_links({source_1: [code_a1, code_b2, code_b1, links[0], links[1]]},
                  role_name="contained_code")
    def test_derived_from_target_multiplicities_multiple_associations_from_different_sources(self):
        c1a = CClass(self.m1, "C1A")
        c1b = CClass(self.m1, "C1B")
        c1c = CClass(self.m1, "C1C")
        c2a = CClass(self.m2, "C2A")
        c2b = CClass(self.m2, "C2B")
        c2c = CClass(self.m2, "C2B")

        a = self.m1.association(self.m2, "a: [m1] * -> [m2] 1")

        # testing to check this does not raise an exception, as association sources/targets are different
        c1a.association(c2a, "a1: [c1a] * -> [c2a] 1", derived_from=a)
        c1b.association(c2a, "a2: [c1b] * -> [c2a] 1", derived_from=a)
        c1c.association(c2a, "a3: [c1c] * -> [c2a] 1", derived_from=a)
        c1a.association(c2b, "a4: [c1a] * -> [c2b] 1", derived_from=a)
        c1a.association(c2c, "a5: [c1a] * -> [c2c] 1", derived_from=a)
    def test_stereotype_instances_double_assignment(self):
        s1 = CStereotype("S1", extended=self.a)

        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)

        try:
            a1.stereotype_instances = [s1, s1]
            exception_expected_()
        except CException as e:
            eq_(e.value, "'S1' is already a stereotype instance on association from 'C1' to 'C2'")
        eq_(a1.stereotype_instances, [s1])
    def test_stereotype_instances_none_assignment(self):
        CStereotype("S1", extended=self.a)

        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)

        try:
            a1.stereotype_instances = [None]
            exception_expected_()
        except CException as e:
            eq_(e.value, "'None' is not a stereotype")
        eq_(a1.stereotype_instances, [])
 def test_add_stereotype_instance_wrong_association(self):
     other_association = self.m1.association(self.m2, name="b", multiplicity="*", role_name="m1",
                                             source_multiplicity="1", source_role_name="m2")
     s1 = CStereotype("S1", extended=self.a)
     c1 = CClass(self.m1, "C1")
     c2 = CClass(self.m2, "C2")
     a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                         source_multiplicity="1", source_role_name="c1", derived_from=other_association)
     try:
         a1.stereotype_instances = [s1]
         exception_expected_()
     except CException as e:
         eq_(e.value,
             "stereotype 'S1' cannot be added to association from 'C1' to 'C2': " +
             "no extension by this stereotype found")
 def test_adding_stereotype_before_derived_from_is_used(self):
     sub1 = CMetaclass("Sub1", superclasses=self.m1)
     sub2 = CMetaclass("Sub2", superclasses=self.m2)
     s = CStereotype("S1", extended=self.a)
     c1 = CClass(sub1, "C1")
     c2 = CClass(sub2, "C2")
     try:
         a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                             source_multiplicity="1", source_role_name="c1", stereotype_instances=s,
                             derived_from=self.a)
         exception_expected_()
     except CException as e:
         eq_(e.value,
             "stereotype 'S1' cannot be added to association from 'C1' to 'C2': " +
             "no extension by this stereotype found")
    def test_delete_derived_from_metaclass_association(self):
        m = self.m1.association(self.m2, "a: [m1] 1..2 -> [m2] *")
        m.delete()
        eq_(m.derived_associations, [])

        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")

        ma = self.m1.association(self.m2, "a: [m1] 1..2 -> [m2] *")
        b1 = c1.association(c2, "ac: [c1] 1 -> [c2] *", derived_from=ma)
        b2 = c1.association(c2, "ac: [c1] 1 -> [c2] *", derived_from=ma)

        ma.delete()

        eq_(b1.derived_from, None)
        eq_(b2.derived_from, None)
        eq_(ma.derived_associations, [])
    def test_stereotype_instances_on_derived_association_and_links_in_combination(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")
        a1 = c1.association(c2, name="a", multiplicity="*", role_name="c2",
                            source_multiplicity="1", source_role_name="c1", derived_from=self.a)
        links = set_links({c1: [c2, c3]})
        l1 = links[0]

        a1.stereotype_instances = [s1]
        l1.stereotype_instances = [s1]
        eq_(set(s1.extended_instances), {a1, l1})
        eq_(a1.stereotype_instances, [s1])
        eq_(l1.stereotype_instances, [s1])
        a1.stereotype_instances = [s1, s2, s3]
        eq_(set(s1.extended_instances), {a1, l1})
        eq_(s2.extended_instances, [a1])
        eq_(s3.extended_instances, [a1])
        eq_(set(a1.stereotype_instances), {s1, s2, s3})
        eq_(set(l1.stereotype_instances), {s1})
        l1.stereotype_instances = [s1, s2, s3]
        eq_(set(s1.extended_instances), {a1, l1})
        eq_(set(s2.extended_instances), {a1, l1})
        eq_(set(s3.extended_instances), {a1, l1})
        eq_(set(a1.stereotype_instances), {s1, s2, s3})
        eq_(set(l1.stereotype_instances), {s1, s2, s3})
        a1.stereotype_instances = s2
        eq_(a1.stereotype_instances, [s2])
        eq_(set(l1.stereotype_instances), {s1, s2, s3})
        eq_(s1.extended_instances, [l1])
        eq_(set(s2.extended_instances), {a1, l1})
        eq_(s3.extended_instances, [l1])
        l1.stereotype_instances = s3
        eq_(a1.stereotype_instances, [s2])
        eq_(l1.stereotype_instances, [s3])
        eq_(s1.extended_instances, [])
        eq_(s2.extended_instances, [a1])
        eq_(s3.extended_instances, [l1])
    def test_derived_from_target_multiplicities_on_multiple_associations_inheritance1(self):
        c1 = CClass(self.m1, "C1")
        c2 = CClass(self.m2, "C2")
        c3 = CClass(self.m1, "C3", superclasses=c1)
        c4 = CClass(self.m2, "C4", superclasses=c2)
        c5 = CClass(self.m3, "C5")

        a = self.m1.association(self.m2, "a: [m1] * -> [m2] 1")
        b = self.m1.association(self.m3, "b: [m1] * -> [m3] 1")

        try:
            c1.association(c5, "b1: * -> 1", derived_from=b)
            c3.association(c4, "a-c3-c4: [c3] * -> [c4] 1", derived_from=a)
            c1.association(c2, "a-c1-c2: [c1] * -> [c2] 1", derived_from=a)
            exception_expected_()
        except CException as e:
            eq_(e.value, "upper multiplicity '2' (of this association, maybe combined with other derived " +
                "associations of the same kind) is larger than metaclass' upper " +
                "multiplicity '1' this association is derived from")
예제 #30
0
item = CClass(domain_metaclass,
              "Item",
              attributes={
                  "quantity": int,
                  "price": float
              })

product = CClass(domain_metaclass,
                 "Product",
                 attributes={
                     "id": str,
                     "name": "",
                     "price": 0.0
                 })

cart_item_relation = cart.association(item,
                                      "in cart: [cart] 1 -> [item in cart] *")
item_product_relation = item.association(
    product, "product definition: [cart item] * -> [product] 1")

order_status = CEnum("Order Status",
                     values=["New", "Hold", "Shipped", "Delivered"])

order = CClass(domain_metaclass,
               "Order",
               attributes={
                   "id": str,
                   "ordered": today,
                   "shipped": date,
                   "ship to": address,
                   "status": CAttribute(type=order_status, default="New"),
                   "total": float