def test_add_one_to_one_link(self): self.c1.association(self.c2, "l: 1 -> [target] 0..1") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o3 = CObject(self.c2, "o3") eq_(o1.linked, []) add_links({o1: o3}) eq_(o1.linked, [o3]) eq_(o3.linked, [o1]) set_links({o1: []}, role_name="target") eq_(o1.linked, []) o1.add_links(o2) eq_(o1.linked, [o2]) eq_(o2.linked, [o1]) try: add_links({o1: o3}) exception_expected_() except CException as e: eq_( e.value, "links of object 'o1' have wrong multiplicity '2': should be '0..1'" ) eq_(o1.linked, [o2]) eq_(o2.linked, [o1]) eq_(o3.linked, [])
def test_add_links_one_to_n_link(self): self.c1.association(self.c2, name="l") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o3 = CObject(self.c2, "o3") o4 = CObject(self.c2, "o4") o5 = CObject(self.c2, "o5") o6 = CObject(self.c2, "o6") add_links({o1: [o2, o3]}) eq_(o1.linked, [o2, o3]) eq_(o2.linked, [o1]) eq_(o3.linked, [o1]) add_links({o1: o4}) eq_(o1.linked, [o2, o3, o4]) eq_(o2.linked, [o1]) eq_(o3.linked, [o1]) eq_(o4.linked, [o1]) o1.add_links([o5, o6]) eq_(o1.linked, [o2, o3, o4, o5, o6]) eq_(o2.linked, [o1]) eq_(o3.linked, [o1]) eq_(o4.linked, [o1]) eq_(o5.linked, [o1]) eq_(o6.linked, [o1])
def test_delete_links_wrong_association(self): self.c1.association(self.c2, "a: [sourceA] * -> [targetA] *") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o1.add_links(o2) try: o1.delete_links(o2, association=o1) exception_expected_() except CException as e: eq_(e.value, "'o1' is not a association") b = self.c1.association(self.c2, "b: [sourceB] * -> [targetB] *") try: o1.delete_links(o2, association=b) exception_expected_() except CException as e: eq_( e.value, "no link found for 'o1 -> o2' in delete links for given association" ) try: o1.delete_links(o2, association=b, role_name="x") exception_expected_() except CException as e: eq_( e.value, "no link found for 'o1 -> o2' in delete links for given role name 'x' and for given association" )
def test_delete_one_to_n_links(self): self.c1.association(self.c2, "l: 0..1 -> *") o1 = CObject(self.c1, "o1") o2 = CObject(self.c1, "o2") o3 = CObject(self.c2, "o3") o4 = CObject(self.c2, "o4") o5 = CObject(self.c2, "o5") add_links({o1: [o3, o4], o2: [o5]}) o4.delete_links([o1]) eq_(o1.linked, [o3]) eq_(o2.linked, [o5]) eq_(o3.linked, [o1]) eq_(o4.linked, []) eq_(o5.linked, [o2]) o4.add_links([o2]) eq_(o2.linked, [o5, o4]) delete_links({o1: o3, o2: o2.linked}) eq_(o1.linked, []) eq_(o2.linked, []) eq_(o3.linked, []) eq_(o4.linked, []) eq_(o5.linked, [])
def test_get_links_self_link(self): a1 = self.c1.association(self.c1, role_name="to", source_role_name="from", source_multiplicity="*", multiplicity="*") o1 = CObject(self.c1, "o1") o2 = CObject(self.c1, "o2") o3 = CObject(self.c1, "o3") o4 = CObject(self.c1, "o4") set_links({o1: [o2, o3, o1]}) o4.add_links([o1, o3]) link1 = o1.links[0] link2 = [o for o in o1.links if o.association == a1][0] link3 = [o for o in o1.links if o.role_name == "to"][0] link4 = [o for o in o1.links if o.source_role_name == "from"][0] eq_(link1, link2) eq_(link1, link3) eq_(link1, link4) eq_(link1.association, a1) eq_(link1.source, o1) eq_(link1.target, o2) eq_(len(o1.links), 4) eq_(len(o2.links), 1) eq_(len(o3.links), 2) eq_(len(o4.links), 2)
def test_delete_link_select_by_association(self): a = self.c1.association(self.c2, "a: * -> *") b = self.c1.association(self.c2, "b: * -> *") o1 = CObject(self.c1, "o1") o2 = CObject(self.c1, "o2") o3 = CObject(self.c2, "o3") o4 = CObject(self.c2, "o4") add_links({o1: [o3], o2: [o3, o4]}, association=b) delete_links({o2: o3}) eq_(o1.linked, [o3]) eq_(o2.linked, [o4]) eq_(o3.linked, [o1]) eq_(o4.linked, [o2]) add_links({o1: [o3], o2: [o3, o4]}, association=a) try: delete_links({o1: o3}) exception_expected_() except CException as e: eq_( e.value, "link definition in delete links ambiguous for link 'o1->o3': found multiple matches" ) delete_links({o1: o3, o2: o4}, association=b) eq_(o1.linked, [o3]) eq_(o2.linked, [o3, o4]) eq_(o3.linked, [o1, o2]) eq_(o4.linked, [o2]) for o in [o1, o2, o3, o4]: for lo in o.links: eq_(lo.association, a) o1.add_links(o3, association=b) try: o1.delete_links(o3) exception_expected_() except CException as e: eq_( e.value, "link definition in delete links ambiguous for link 'o1->o3': found multiple matches" ) eq_(o1.linked, [o3, o3]) eq_(o2.linked, [o3, o4]) eq_(o3.linked, [o1, o2, o1]) eq_(o4.linked, [o2]) o1.delete_links(o3, association=a) eq_(o1.linked, [o3]) eq_(o2.linked, [o3, o4]) eq_(o3.linked, [o2, o1]) eq_(o4.linked, [o2])
def test_delete_links_wrong_role_name(self): self.c1.association(self.c2, "a: [sourceA] * -> [targetA] *") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o1.add_links(o2) try: o1.delete_links(o2, role_name="target") exception_expected_() except CException as e: eq_( e.value, "no link found for 'o1 -> o2' in delete links for given role name 'target'" )
def test_wrong_types_add_links(self): self.c1.association(self.c2, name="l", multiplicity="1") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") try: add_links({o1: self.mcl}) exception_expected_() except CException as e: eq_(e.value, "link target 'MCL' is not an object, class, or link") try: o1.add_links([o2, self.mcl]) exception_expected_() except CException as e: eq_(e.value, "link target 'MCL' is not an object, class, or link")
def add_items_to_cart(a_cart, items_list): items = [] for element in items_list: item_product = element[0] item_quantity = element[1] price = item_product.get_value("price") * item_quantity new_item = CObject(item, values={ "quantity": item_quantity, "price": price }) new_item.add_links(item_product, role_name="product") items.append(new_item) a_cart.add_links(new_item, role_name="item in cart") return items
def test_duplicate_assignment(self): a = self.c1.association(self.c2, "l: *->*") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") try: set_links({o1: [o2, o2]}) exception_expected_() except CException as e: eq_( e.value, "trying to link the same link twice 'o1 -> o2'' twice for the same association" ) eq_(o1.get_linked(), []) eq_(o2.get_linked(), []) b = self.c1.association(self.c2, "l: *->*") o1.add_links(o2, association=a) o1.add_links(o2, association=b) eq_(o1.get_linked(), [o2, o2]) eq_(o2.get_linked(), [o1, o1])
def test_add_links(self): self.c1.association(self.c2, "1 -> [role1] *") self.c1.association(self.c2, "* -> [role2] *") self.c1.association(self.c2, "1 -> [role3] 1") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o3 = CObject(self.c2, "o3") o4 = CObject(self.c2, "o4") add_links({o1: o2}, role_name="role1") eq_(o1.get_linked(role_name="role1"), [o2]) add_links({o1: [o3, o4]}, role_name="role1") o1.get_linked(role_name="role1") eq_(o1.get_linked(role_name="role1"), [o2, o3, o4]) o1.add_links(o2, role_name="role2") eq_(o1.get_linked(role_name="role2"), [o2]) o1.add_links([o3, o4], role_name="role2") o1.get_linked(role_name="role2") eq_(o1.get_linked(role_name="role2"), [o2, o3, o4]) add_links({o1: o2}, role_name="role3") eq_(o1.get_linked(role_name="role3"), [o2]) try: add_links({o1: [o3, o4]}, role_name="role3") exception_expected_() except CException as e: eq_( e.value, "links of object 'o1' have wrong multiplicity '3': should be '1'" ) try: add_links({o1: [o3]}, role_name="role3") exception_expected_() except CException as e: eq_( e.value, "links of object 'o1' have wrong multiplicity '2': should be '1'" ) eq_(o1.get_linked(role_name="role3"), [o2])
def test_link_methods_wrong_keyword_args(self): o1 = CObject(self.c1, "o1") try: add_links({o1: o1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: o1.add_links(o1, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: set_links({o1: o1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: delete_links({o1: o1}, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: o1.delete_links(o1, associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: o1.get_linked(associationX=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: delete_links({o1: o1}, stereotype_instances=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument") try: delete_links({o1: o1}, tagged_values=None) exception_expected_() except CException as e: eq_(e.value, "unknown keywords argument")
def test_link_label_get_set(self): a1 = self.c1.association(self.c2, name="a1", multiplicity="*") a2 = self.c1.association(self.c2, multiplicity="*") o1 = CObject(self.c1, "o1") o2 = CObject(self.c2, "o2") o3 = CObject(self.c2, "o3") l1 = set_links({o1: o2}, association=a1, label="l1") l2 = add_links({o1: [o2, o3]}, 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 = o1.add_links(o3, association=a1, label="x1") eq_(l3[0].label, "x1")
"last name": "Test", "address": thomas_home_address, "email": "*****@*****.**", "phone": "+43111111222333", "shipping addresses": [thomas_home_address] }) basic_pen = new_product(values={"name": "Basic Pen", "price": 1.50}) premium_pen = new_product(values={"name": "Premium Pen", "price": 2.50}) basic_paper = new_product(values={"name": "Basic Paper", "price": 2.75}) premium_paper = new_product(values={"name": "Premium Paper", "price": 5.50}) cart1 = CObject(cart) add_items_to_cart(cart1, [[premium_paper, 2], [basic_paper, 1], [premium_pen, 3]]) cart1.add_links(thomas_customer, association=customer_cart_relation) order1 = place_order(cart1) ship_order(order1) shopping_instance2_all = CBundle("shopping_instance2_all", elements=(order1.get_connected_elements() + [thomas_home_address, today])) def run(): print( "***************** Shopping Model Instance Model 1 (Using Shopping Model 4) *****************" ) print('*** Plant UML Generation') generator = PlantUMLGenerator()
values={ "id": "P001", "name": "Basic Paper", "price": 2.75 }) premium_paper = CObject(product, values={ "id": "P001", "name": "Premium Paper", "price": 5.50 }) cart1 = CObject(cart, "Thomas Cart") # add links can optionally specify the association. # cart1.add_links(thomas_customer, association=customer_cart_relation) cart1.add_links(thomas_customer) item1 = CObject(item, "Premium Paper Item", values={ "quantity": 2, "price": 11.00 }) item1.add_links(premium_paper, association=item_product_relation) item2 = CObject(item, "Basic Pen Item", values={"quantity": 1, "price": 1.50}) item2.add_links(basic_pen, role_name="product") add_links({cart1: [item1, item2]}, role_name="item in cart") order1 = CObject(order, values={
cart1.delete() order1.delete() for item_object in item.objects: item_object.delete() # define a new cart and order, as they would be created in the shopping session cart1 = CObject(cart) cart1_items = add_items_to_cart(cart1, [[premium_pen, 3]]) set_links({cart1: thomas_customer}, association=customer_cart_relation) order1 = place_order(cart1) # create and link the objects which have attributes or links search_obj = CObject(search_item) search_obj.set_value("search string", "pens") view_shopping_cart_obj = CObject(view_shopping_cart) view_shopping_cart_obj.add_links(cart1, role_name="cart") add_to_shopping_cart_obj = CObject(add_to_shopping_cart) add_to_shopping_cart_obj.add_links(cart1_items, role_name="item") checkout_obj = CObject(checkout) checkout_obj.add_links(order1, role_name="order") view_item_obj = CObject(view_item) view_item_obj.add_links(premium_pen, role_name="product") # pass the full trace to create_trace to filter out the meaningful objects in the trace and link them a_trace = create_trace([ CObject(initial_node_shopping_cart), CObject(decision_node_search_browse), CObject(merge_node_search), search_obj, CObject(decision_node_found), CObject(merge_node_view_item), view_item_obj, CObject(decision_node_decision_made), add_to_shopping_cart_obj,
def test_reference_to_link(self): code = CClass(self.mcl, "Code") source = CClass(self.mcl, "Source") code_association = 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] *", superclasses=code) 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") code_b3 = CObject(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 object 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 metaclass links fail on class mcl_a = CMetaclass("M") mcl_b = CMetaclass("Source") mcl_association = mcl_a.association(mcl_b, "[a] * -> [b] *") cl_a = CClass(mcl_a, "cla") cl_b = CClass(mcl_a, "clb") class_link = add_links({cl_a: [cl_b]}, association=mcl_association)[0] try: add_links({source_1: [code_a1, code_b2, code_b1, class_link]}, role_name="contained_code") exception_expected_() except CException as e: eq_("link target is a class link, but source is an object", e.value)