Test for copy() compatibility
[dbsrgits/DBIx-Class-Tree.git] / t / lib / TreeTest.pm
1 package TreeTest;
2 use strict;
3 use warnings;
4
5 use Test::More;
6 use Test::Exception;
7 use TreeTest::Schema;
8
9 our $NODE_COUNT = 80;
10
11 sub count_tests {
12     my $count = 14;
13     if( TreeTest::Schema::Node->can('position_column') ){
14         $count ++;
15     }
16     return $count;
17 }
18
19 sub run_tests {
20     my $schema = TreeTest::Schema->connect();
21     my $nodes = $schema->resultset('Node');
22     my $root = $nodes->create({ name=>'root' });
23     my @parents = (
24         1,1,3,4,4,3,3,8,8,10,10,8,8,3,3,16,3,3,1,20,1,22,22,24,24,22,27,27,29,29,27,32,32,34,34,36,34,38,38,40,40,42,42,44,44,46,44,44,49,44,51,51,53,51,55,55,57,57,55,60,55,62,55,64,64,55,67,67,55,70,70,55,55,51,51,76,76,78,78,76
25     );
26
27     foreach my $parent_id (@parents) {
28         my $node = $nodes->create({ name=>'child' });
29         $node->parent( $parent_id );
30     }
31
32     lives_and ( sub {
33       warn "BEGIN!!!!!\n\n";
34       is( $nodes->find(3)->copy({name => 'special'})->name,'special','copy test');
35     }, 'copy does not throw');
36
37     ok( ($nodes->count()==81), 'correct number of nodes in random tree' );
38     ok( ($nodes->find(3)->children->count()==7), 'node 3 has correct number of children' );
39     ok( ($nodes->find(22)->children->count()==3), 'node 22 has correct number of children' );
40
41     my $child = ($nodes->find(22)->children->all())[0];
42     $child->parent( $nodes->find(3) );
43     ok( ($nodes->find(3)->children->count()==8), 'node 3 has correct number of children' );
44     ok( ($nodes->find(3)->siblings->count()==3), 'node 3 has correct number of siblings' );
45     ok( ($nodes->find(22)->children->count()==2), 'node 22 has correct number of children' );
46     ok( ($nodes->find(22)->siblings->count()==3), 'node 22 has correct number of siblings' );
47
48     $nodes->find(22)->attach_child( $nodes->find(3) );
49     ok( ($nodes->find(22)->children->count()==3), 'node 22 has correct number of children' );
50     ok( ($nodes->find(22)->siblings->count()==2), 'node 22 has correct number of siblings' );
51
52     $nodes->find(22)->attach_sibling( $nodes->find(3) );
53     ok( ($nodes->find(22)->children->count()==2), 'node 22 has correct number of children' );
54     ok( ($nodes->find(22)->siblings->count()==3), 'node 22 has correct number of siblings' );
55
56     ok( ($nodes->find(22)->parents->count()==1), 'node 22 has correct number of parents' );
57     ok( (($nodes->find(22)->parents->all())[0]->id()==$nodes->find(22)->parent->id()), 'node 22 parent matches parents' );
58
59     if( TreeTest::Schema::Node->can('position_column') ){
60         ok( check_positions(scalar $root->children()), 'positions are correct' );
61     }
62 }
63
64 sub check_positions {
65     my $nodes = shift;
66     my $position = 0;
67     while (my $node = $nodes->next()) {
68         $position ++;
69         return 0 if ($node->position() != $position);
70         return 0 if ( !check_positions(scalar $node->children()) );
71     }
72     return 1;
73 }
74
75 1;