def test_move_nested_element(self):
     par = Container(1, 2)
     el = R(1, 2, 3, 4, par)
     cl = move(el, 20, 30, [el, par])
     assert cl == [
         Modify(el, R(21, 32, 3, 4, par))
     ]
 def test_move_two_unassociated_elements(self):
     el1 = R(1, 2, 3, 4)
     el2 = R(3, 4, 5, 6)
     cl = move([el1, el2], 20, 30, [el1, el2])
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(el1, R(21, 32, 3, 4)),
         Modify(el2, R(23, 34, 5, 6)),
     ])
 def test_move_nested_and_another_unassociated_element(self):
     par = Container(1, 2)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(3, 4, 5, 6)
     cl = move([el1, el2], 20, 30, [el1, par, el2])
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(el1, R(21, 32, 3, 4, par)),
         Modify(el2, R(23, 34, 5, 6)),
     ])
 def test_move_two_of_three_nested_elements(self):
     par = Container(1, 2)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(3, 4, 5, 6, par)
     el3 = R(5, 6, 7, 8, par)
     cl = move([el1, el3], 20, 30, [el1, el2, par, el3])
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(el1, R(21, 32, 3, 4, par)),
         Modify(el3, R(25, 36, 7, 8, par)),
     ])
 def test_move_parent_of_nested_element(self):
     par = Container(1, 2)
     el = R(1, 2, 3, 4, par)
     cl = move(par, 20, 30, [el, par])
     # only parent is moved but child must be updated to point to new parent
     exp_par = Container(21, 32)
     exp_el = R(1, 2, 3, 4, exp_par)
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el, exp_el),
     ])
 def test_move_one_linked_element(self):
     el1 = R(1, 2, 3, 4)
     el2 = R(3, 4, 5, 6)
     el3 = R(5, 6, 7, 8)
     l = Link(el1, el2)
     cl = move([el1], 20, 30, [l, el1, el2, el3])
     exp_el1 = R(21, 32, 3, 4)
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(el1, exp_el1),
         Modify(l, Link(exp_el1, el2)),
     ])
 def test_move_both_parent_and_nested_element(self):
     par = Container(1, 2)
     el = R(1, 2, 3, 4, par)
     cl = move([par, el], 20, 30, [el, par])
     # only parent is moved since child is moved along with the parent
     # but child has to be modified to point to new parent
     exp_par = Container(21, 32)
     exp_el = R(1, 2, 3, 4, exp_par)
     assert len(cl) == 2
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el, exp_el),
     ])
 def test_move_parent_linked_to_its_child(self):
     par = Container(1, 2)
     el = R(3, 4, 5, 6, par)
     l = Link(par, el)
     cl = move([par], 20, 30, [l, el, par])
     # it's allowed to have nested element linked to its parent
     exp_par = Container(21, 32)
     exp_el = R(3, 4, 5, 6, exp_par)
     exp_l = Link(exp_par, exp_el)
     assert len(cl) == 3
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el, exp_el),
         Modify(l, exp_l),
     ])
 def test_move_linked_parent_with_nested_element(self):
     par = Container(1, 2)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(3, 4, 5, 6)
     l = Link(par, el2)
     cl = move([par], 20, 30, [l, el1, el2, par])
     # link must be updated also
     exp_par = Container(21, 32)
     exp_el1 = R(1, 2, 3, 4, exp_par)
     exp_l = Link(exp_par, el2)
     assert len(cl) == 3
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el1, exp_el1),
         Modify(l, exp_l),
     ])
 def test_move_parent_of_multiple_nested_elements(self):
     par = Container(1, 2)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(2, 2, 3, 4, par)
     el3 = R(3, 2, 3, 4, par)
     cl = move(par, 20, 30, [el1, el2, el3, par])
     exp_par = Container(21, 32)
     exp_el1 = R(1, 2, 3, 4, exp_par)
     exp_el2 = R(2, 2, 3, 4, exp_par)
     exp_el3 = R(3, 2, 3, 4, exp_par)
     assert len(cl) == 4
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el1, exp_el1),
         Modify(el2, exp_el2),
         Modify(el3, exp_el3),
     ])
 def test_move_parent_and_two_of_three_nested_elements(self):
     par = Container(1, 2)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(3, 4, 5, 6, par)
     el3 = R(5, 6, 7, 8, par)
     cl = move([el1, el3, par], 20, 30, [el1, el2, par, el3])
     # moving of nested elements should be skipped if parent is moved
     # but all children must be updated to point to new parent
     exp_par = Container(21, 32)
     exp_el1 = R(1, 2, 3, 4, exp_par)
     exp_el2 = R(3, 4, 5, 6, exp_par)
     exp_el3 = R(5, 6, 7, 8, exp_par)
     assert len(cl) == 4
     assert set(cl) == set([
         Modify(par, exp_par),
         Modify(el1, exp_el1),
         Modify(el2, exp_el2),
         Modify(el3, exp_el3),
     ])
 def test_move_two_different_parents_containing_linked_elements(self):
     par1 = Container(1, 2)
     par2 = Container(2, 3)
     el1 = R(1, 2, 3, 4, par1)
     el2 = R(3, 4, 5, 6, par2)
     l = Link(el1, el2)
     cl = move([par1, par2], 20, 30, [l, el1, el2, par1, par2])
     exp_par1 = Container(21, 32)
     exp_par2 = Container(22, 33)
     exp_el1 = R(1, 2, 3, 4, exp_par1)
     exp_el2 = R(3, 4, 5, 6, exp_par2)
     exp_l = Link(exp_el1, exp_el2)
     assert len(cl) == 5
     assert set(cl) == set([
         Modify(par1, exp_par1),
         Modify(par2, exp_par2),
         Modify(el1, exp_el1),
         Modify(el2, exp_el2),
         Modify(l, exp_l),
     ])
 def test_move_two_different_parents(self):
     par1 = Container(1, 2)
     par2 = Container(2, 3)
     el1 = R(1, 2, 3, 4, par1)
     el2 = R(3, 4, 5, 6, par1)
     el3 = R(5, 6, 7, 8, par2)
     cl = move([par2, par1], 20, 30, [el1, el2, par1, el3, par2])
     exp_par1 = Container(21, 32)
     exp_par2 = Container(22, 33)
     exp_el1 = R(1, 2, 3, 4, exp_par1)
     exp_el2 = R(3, 4, 5, 6, exp_par1)
     exp_el3 = R(5, 6, 7, 8, exp_par2)
     assert len(cl) == 5
     assert set(cl) == set([
         Modify(par1, exp_par1),
         Modify(par2, exp_par2),
         Modify(el1, exp_el1),
         Modify(el2, exp_el2),
         Modify(el3, exp_el3),
     ])
 def test_move_root(self, tweak):
     root = Container(1, 2)
     par = Container(2, 3, root)
     el1 = R(1, 2, 3, 4, par)
     el2 = R(2, 3, 4, 5, par)
     what_to_move = {
         1: [root],
         2: [root, par],
         3: [root, par, el1],
         4: [root, el1],
     }
     cl = move(what_to_move[tweak], 20, 30, [root, par, el1, el2])
     # root is moved, rest are updated
     exp_root = Container(21, 32)
     exp_par = Container(2, 3, exp_root)
     exp_el1 = R(1, 2, 3, 4, exp_par)
     exp_el2 = R(2, 3, 4, 5, exp_par)
     assert len(cl) == 4
     assert set(cl) == set([
         Modify(root, exp_root),
         Modify(par, exp_par),
         Modify(el1, exp_el1),
         Modify(el2, exp_el2),
     ])
 def test_move_element(self):
     el = R(1, 2, 3, 4)
     cl = move(el, 20, 30, [el])
     assert cl == [
         Modify(el, R(21, 32, 3, 4))
     ]