示例#1
0
    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, [])
示例#2
0
    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])
示例#3
0
 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"
         )
示例#4
0
    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, [])
示例#5
0
    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)
示例#6
0
    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])
示例#7
0
 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'"
         )
示例#8
0
 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")
示例#9
0
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
示例#10
0
 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])
示例#11
0
    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])
示例#12
0
 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")
示例#13
0
    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")
示例#14
0
                                   "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()
示例#15
0
                      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,
示例#17
0
    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)