Commit | Line | Data |
93cec8c3 |
1 | # vim: filetype=perl |
70350518 |
2 | use strict; |
3 | use warnings; |
93cec8c3 |
4 | |
70350518 |
5 | use Test::More; |
6 | use lib qw(t/lib); |
7 | use DBICTest; |
93cec8c3 |
8 | |
70350518 |
9 | my $schema = DBICTest::init_schema(); |
93cec8c3 |
10 | |
70350518 |
11 | plan tests => 321; |
93cec8c3 |
12 | |
70350518 |
13 | my $employees = $schema->resultset('Employee'); |
14 | $employees->delete(); |
169bb185 |
15 | |
70350518 |
16 | foreach (1..5) { |
17 | $employees->create({ name=>'temp' }); |
18 | } |
19 | $employees = $employees->search(undef,{order_by=>'position'}); |
20 | ok( check_rs($employees), "intial positions" ); |
b1c66eea |
21 | |
70350518 |
22 | hammer_rs( $employees ); |
169bb185 |
23 | |
70350518 |
24 | DBICTest::Employee->grouping_column('group_id'); |
25 | $employees->delete(); |
26 | foreach my $group_id (1..3) { |
27 | foreach (1..6) { |
28 | $employees->create({ name=>'temp', group_id=>$group_id }); |
169bb185 |
29 | } |
70350518 |
30 | } |
31 | $employees = $employees->search(undef,{order_by=>'group_id,position'}); |
169bb185 |
32 | |
70350518 |
33 | foreach my $group_id (1..3) { |
34 | my $group_employees = $employees->search({group_id=>$group_id}); |
35 | $group_employees->all(); |
36 | ok( check_rs($group_employees), "group intial positions" ); |
37 | hammer_rs( $group_employees ); |
169bb185 |
38 | } |
39 | |
40 | sub hammer_rs { |
41 | my $rs = shift; |
707cbb2d |
42 | my $employee; |
169bb185 |
43 | my $count = $rs->count(); |
44 | my $position_column = $rs->result_class->position_column(); |
80010e2b |
45 | |
169bb185 |
46 | foreach my $position (1..$count) { |
80010e2b |
47 | |
dc66dea1 |
48 | ($row) = $rs->search({ $position_column=>$position })->all(); |
169bb185 |
49 | $row->move_previous(); |
50 | ok( check_rs($rs), "move_previous( $position )" ); |
80010e2b |
51 | |
dc66dea1 |
52 | ($row) = $rs->search({ $position_column=>$position })->all(); |
169bb185 |
53 | $row->move_next(); |
54 | ok( check_rs($rs), "move_next( $position )" ); |
80010e2b |
55 | |
dc66dea1 |
56 | ($row) = $rs->search({ $position_column=>$position })->all(); |
169bb185 |
57 | $row->move_first(); |
58 | ok( check_rs($rs), "move_first( $position )" ); |
80010e2b |
59 | |
dc66dea1 |
60 | ($row) = $rs->search({ $position_column=>$position })->all(); |
169bb185 |
61 | $row->move_last(); |
62 | ok( check_rs($rs), "move_last( $position )" ); |
80010e2b |
63 | |
169bb185 |
64 | foreach my $to_position (1..$count) { |
dc66dea1 |
65 | ($row) = $rs->search({ $position_column=>$position })->all(); |
169bb185 |
66 | $row->move_to($to_position); |
67 | ok( check_rs($rs), "move_to( $position => $to_position )" ); |
707cbb2d |
68 | } |
80021def |
69 | |
dc66dea1 |
70 | ($row) = $rs->search({ position=>$position })->all(); |
707cbb2d |
71 | if ($position==1) { |
169bb185 |
72 | ok( !$row->previous_sibling(), 'no previous sibling' ); |
73 | ok( !$row->first_sibling(), 'no first sibling' ); |
74 | } |
75 | else { |
76 | ok( $row->previous_sibling(), 'previous sibling' ); |
77 | ok( $row->first_sibling(), 'first sibling' ); |
707cbb2d |
78 | } |
169bb185 |
79 | if ($position==$count) { |
80 | ok( !$row->next_sibling(), 'no next sibling' ); |
81 | ok( !$row->last_sibling(), 'no last sibling' ); |
80021def |
82 | } |
707cbb2d |
83 | else { |
169bb185 |
84 | ok( $row->next_sibling(), 'next sibling' ); |
85 | ok( $row->last_sibling(), 'last sibling' ); |
707cbb2d |
86 | } |
87 | |
80010e2b |
88 | } |
80010e2b |
89 | } |
90 | |
169bb185 |
91 | sub check_rs { |
92 | my( $rs ) = @_; |
93 | $rs->reset(); |
94 | my $position_column = $rs->result_class->position_column(); |
93cec8c3 |
95 | my $expected_position = 0; |
169bb185 |
96 | while (my $row = $rs->next()) { |
93cec8c3 |
97 | $expected_position ++; |
169bb185 |
98 | if ($row->get_column($position_column)!=$expected_position) { |
133dd22a |
99 | return 0; |
80021def |
100 | } |
93cec8c3 |
101 | } |
133dd22a |
102 | return 1; |
93cec8c3 |
103 | } |
104 | |