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])
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])
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, [])
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")
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