def test_save_child_as_new_root(self): tree = create_test_tree() self.assertEqual(tree['2.1'].get_matrix(), Matrix(3, -2, 8, -5)) self.assertEqual(tree['2.1.1'].get_matrix(), Matrix(4, -3, 11, -8)) update_for_test(ExampleModel, ('id', tree['2.1'].pk), {'parent_id': None}) self.assertEqual(tree['2.1'].get_matrix(), Matrix(2, -1, 3, -1)) self.assertEqual(tree['2.1.1'].get_matrix(), Matrix(3, -2, 5, -3))
def test_save_child_repeatedly(self): """ Saving the same child to the same parent will make the child younger and younger. """ create_for_test(ExampleModel, [{'name': 'Root'}]) root = ExampleModel.objects.all().get() create_for_test(ExampleModel, [{ 'name': 'Child 1', 'parent_id': root.pk }]) root, child1 = ExampleModel.objects.all().order_by('pk') self.assertEqual(child1.get_abs_matrix(), Matrix(1, 1, 3, 2)) update_for_test(ExampleModel, ('id', child1.pk), {'parent_id': root.pk}) root, child1 = ExampleModel.objects.all().order_by('pk') self.assertEqual(child1.get_abs_matrix(), Matrix(2, 1, 5, 2))
def test_set_child_after_deleting_sibling(self): create_for_test(ExampleModel, [{'name': 'Root'}]) # 1 1 2 1 root = ExampleModel.objects.all().get() create_for_test(ExampleModel, [{ 'name': 'Child 1', 'parent_id': root.pk }]) # 1 1 3 2 root, child1 = ExampleModel.objects.order_by('pk') create_for_test(ExampleModel, [{ 'name': 'Child 2', 'parent_id': root.pk }]) # 2 1 5 2 root, child1, child2 = ExampleModel.objects.order_by('pk') create_for_test(ExampleModel, [{ 'name': 'Child 3', 'parent_id': root.pk }]) # 3 1 7 2 root, child1, child2, child3 = ExampleModel.objects.order_by('pk') self.assertEqual(root.get_abs_matrix(), Matrix(1, 1, 2, 1)) self.assertEqual(child1.get_abs_matrix(), Matrix(1, 1, 3, 2)) self.assertEqual(child2.get_abs_matrix(), Matrix(2, 1, 5, 2)) self.assertEqual(child3.get_abs_matrix(), Matrix(3, 1, 7, 2)) child2.delete() self.assertEqual(last_child_of(root), child3) create_for_test(ExampleModel, [{ 'name': 'Child 4', 'parent_id': root.pk }]) # 4 1 9 2 root, child1, child3, child4 = ExampleModel.objects.order_by('pk') self.assertEqual(child3.name, 'Child 3') self.assertEqual(child4.get_abs_matrix(), Matrix(4, 1, 9, 2))
def test_save_children(self): root = create_for_test(ExampleModel, [{'name': 'Root'}]) root = ExampleModel.objects.all().get() self.assertEqual(root.get_abs_matrix(), Matrix(1, 1, 2, 1)) self.assertEqual(root.parent, None) create_for_test(ExampleModel, [{ 'name': 'Child 1', 'parent_id': root.pk }]) root, child1 = ExampleModel.objects.order_by('pk') self.assertEqual(child1.parent, root) self.assertEqual(child1.get_abs_matrix(), Matrix(1, 1, 3, 2)) create_for_test(ExampleModel, [{ 'name': 'Child 2', 'parent_id': root.pk }]) root, child1, child2 = ExampleModel.objects.order_by('pk') self.assertEqual(child2.get_abs_matrix(), Matrix(2, 1, 5, 2))
def test_move_child_to_new_parent_along_with_descendants(self): tree = create_test_tree() self.assertEqual(tree['2'].get_parent(), tree['0']) self.assertEqual(list(tree['2'].get_descendants().order_by('pk')), [tree[i] for i in ('2.1', '2.1.1', '2.2')]) # Make 2 child of 3 update_for_test(ExampleModel, ('id', tree['2'].pk), { 'parent_id': tree['3'].pk, }) self.assertEqual(tree['2'].get_parent(), tree['3']) self.assertEqual( [i.pk for i in tree['2'].get_descendants().order_by('pk')], [tree[i].pk for i in ('2.1', '2.1.1', '2.2')]) self.assertEqual(tree['2'].parent, tree['3']) self.assertEqual( [i.parent for i in tree['2'].get_descendants().order_by('pk')], [tree[i] for i in ('2', '2.1', '2')]) self.assertEqual( [i.pk for i in tree['3'].get_descendants().order_by('pk')], [tree[i].pk for i in ('2', '2.1', '2.1.1', '2.2', '3.1')]) self.assertEqual(tree['2'].get_matrix(), get_child_matrix(tree['3'].get_matrix(), 2)) self.assertEqual(tree['2'].get_matrix(), Matrix(8, -3, 19, -7)) self.assertEqual(tree['2.1'].get_matrix(), Matrix(13, -8, 31, -19)) self.assertEqual(tree['2.1.1'].get_matrix(), Matrix(18, -13, 43, -31)) self.assertEqual(tree['2.2'].get_matrix(), Matrix(21, -8, 50, -19)) # Make 2.1 child of 1.1 update_for_test(ExampleModel, ('id', tree['2.1'].pk), {'parent_id': tree['1.1'].pk}) self.assertEqual( [i.pk for i in tree['3'].get_descendants().order_by('pk')], [tree[i].pk for i in ('2', '2.2', '3.1')]) self.assertEqual( [i.pk for i in tree['1.1'].get_descendants().order_by('pk')], [tree[i].pk for i in ('2.1', '2.1.1')]) self.assertEqual(tree['2.1'].parent, tree['1.1']) self.assertEqual( [i.parent for i in tree['1.1'].get_descendants().order_by('pk')], [tree[i] for i in ('1.1', '2.1')]) self.assertEqual(tree['2.1'].get_matrix(), get_child_matrix(tree['1.1'].get_matrix(), 1)) self.assertEqual(tree['2.1.1'].get_matrix(), get_child_matrix(tree['2.1'].get_matrix(), 1)) self.assertEqual(tree['2.1.1'].get_matrix(), Matrix(1, -1, 6, -5)) # 2.2 remains unchanged self.assertEqual(tree['2.2'].get_matrix(), Matrix(21, -8, 50, -19))
def test_save_root_after_deleting_old_root(self): create_for_test(ExampleModel, [{ 'name': 'example {}'.format(i + 1) } for i in xrange(3)]) root1, root2, root3 = ExampleModel.objects.order_by('pk') self.assertEqual(root1.get_matrix(), Matrix(1, -1, 2, -1)) self.assertEqual(root2.get_matrix(), Matrix(2, -1, 3, -1)) self.assertEqual(root3.get_matrix(), Matrix(3, -1, 4, -1)) root2.delete() create_for_test(ExampleModel, [{'name': 'example 4'}]) root1, root3, root4 = ExampleModel.objects.order_by('pk') self.assertEqual(root1.get_matrix(), Matrix(1, -1, 2, -1)) self.assertEqual(root3.get_matrix(), Matrix(3, -1, 4, -1)) self.assertEqual(root4.get_matrix(), Matrix(4, -1, 5, -1))
def test_root_save(self): root = create_for_test(ExampleModel, [{'name': 'example 1'}]) root = ExampleModel.objects.all().get() self.assertEqual(root.get_matrix(), Matrix(1, -1, 2, -1))
def test_ancestors(self): self.assertEqual( get_ancestors_matrix(Matrix(7, -5, 10, -7)), [Matrix(5, -3, 7, -4), Matrix(3, -1, 4, -1)])
def get_abs_matrix(instance): return Matrix(*tuple(abs(num) for num in get_matrix(instance)))
def get_matrix(instance): return Matrix(*( getattr(instance, field_name) * (1 if (i % 2 == 0) else -1) for i, field_name in enumerate(instance._nested_intervals_field_names[0:-1])) )