示例#1
0
    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))
示例#2
0
    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))
示例#3
0
    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))
示例#4
0
    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))
示例#5
0
    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))
示例#6
0
    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))
示例#7
0
 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))
示例#8
0
 def test_ancestors(self):
     self.assertEqual(
         get_ancestors_matrix(Matrix(7, -5, 10, -7)),
         [Matrix(5, -3, 7, -4), Matrix(3, -1, 4, -1)])
示例#9
0
def get_abs_matrix(instance):
    return Matrix(*tuple(abs(num) for num in get_matrix(instance)))
示例#10
0
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]))
    )