Introduce GOVERNANCE document and empty RESOLUTIONS file.
[dbsrgits/DBIx-Class.git] / t / 87ordered.t
CommitLineData
c0329273 1BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
93cec8c3 3# vim: filetype=perl
70350518 4use strict;
8273e845 5use warnings;
93cec8c3 6
70350518 7use Test::More;
c0329273 8
70350518 9use DBICTest;
93cec8c3 10
47603d6c 11use POSIX ();
1d941d67 12
a47e1233 13my $schema = DBICTest->init_schema();
93cec8c3 14
70350518 15my $employees = $schema->resultset('Employee');
16$employees->delete();
169bb185 17
70350518 18foreach (1..5) {
19 $employees->create({ name=>'temp' });
20}
21$employees = $employees->search(undef,{order_by=>'position'});
22ok( check_rs($employees), "intial positions" );
b1c66eea 23
70350518 24hammer_rs( $employees );
169bb185 25
70350518 26DBICTest::Employee->grouping_column('group_id');
27$employees->delete();
79dc353a 28foreach my $group_id (1..4) {
70350518 29 foreach (1..6) {
30 $employees->create({ name=>'temp', group_id=>$group_id });
169bb185 31 }
70350518 32}
33$employees = $employees->search(undef,{order_by=>'group_id,position'});
169bb185 34
79dc353a 35foreach my $group_id (1..4) {
70350518 36 my $group_employees = $employees->search({group_id=>$group_id});
37 $group_employees->all();
38 ok( check_rs($group_employees), "group intial positions" );
39 hammer_rs( $group_employees );
169bb185 40}
41
79dc353a 42my $group_3 = $employees->search({group_id=>3});
43my $to_group = 1;
44my $to_pos = undef;
8f535707 45{
46 my @empl = $group_3->all;
47 while (my $employee = shift @empl) {
8f535707 48 $employee->move_to_group($to_group, $to_pos);
49 $to_pos++;
50 $to_group = $to_group==1 ? 2 : 1;
51 }
79dc353a 52}
53foreach my $group_id (1..4) {
54 my $group_employees = $employees->search({group_id=>$group_id});
79dc353a 55 ok( check_rs($group_employees), "group positions after move_to_group" );
56}
57
58my $employee = $employees->search({group_id=>4})->first;
59$employee->position(2);
60$employee->update;
61ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 1" );
62$employee = $employees->search({group_id=>4})->first;
63$employee->update({position=>3});
64ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 2" );
65$employee = $employees->search({group_id=>4})->first;
66$employee->group_id(1);
67$employee->update;
68ok(
d146b340 69 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
70 "overloaded update 3"
79dc353a 71);
72$employee = $employees->search({group_id=>4})->first;
73$employee->update({group_id=>2});
74ok(
d146b340 75 check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
76 "overloaded update 4"
79dc353a 77);
78$employee = $employees->search({group_id=>4})->first;
79$employee->group_id(1);
80$employee->position(3);
81$employee->update;
82ok(
d146b340 83 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
84 "overloaded update 5"
79dc353a 85);
86$employee = $employees->search({group_id=>4})->first;
87$employee->group_id(2);
88$employee->position(undef);
89$employee->update;
90ok(
d146b340 91 check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
92 "overloaded update 6"
79dc353a 93);
94$employee = $employees->search({group_id=>4})->first;
95$employee->update({group_id=>1,position=>undef});
96ok(
d146b340 97 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
98 "overloaded update 7"
79dc353a 99);
100
5ef76b8b 101$employee->group_id(2);
102$employee->name('E of the month');
103$employee->update({ employee_id => 666, position => 2 });
104is_deeply(
105 { $employee->get_columns },
106 {
107 employee_id => 666,
108 encoded => undef,
109 group_id => 2,
110 group_id_2 => undef,
111 group_id_3 => undef,
112 name => "E of the month",
113 position => 2
114 },
115 'combined update() worked correctly'
116);
117is_deeply(
118 { $employee->get_columns },
119 { $employee->get_from_storage->get_columns },
120 'object matches database state',
121);
122
123#####
1d941d67 124# multicol tests begin here
5ef76b8b 125#####
126
9beded8a 127DBICTest::Employee->grouping_column(['group_id_2', 'group_id_3']);
1d941d67 128$employees->delete();
9beded8a 129foreach my $group_id_2 (1..4) {
130 foreach my $group_id_3 (1..4) {
1d941d67 131 foreach (1..4) {
9beded8a 132 $employees->create({ name=>'temp', group_id_2=>$group_id_2, group_id_3=>$group_id_3 });
1d941d67 133 }
134 }
135}
9beded8a 136$employees = $employees->search(undef,{order_by=>[qw/group_id_2 group_id_3 position/]});
1d941d67 137
9beded8a 138foreach my $group_id_2 (1..3) {
139 foreach my $group_id_3 (1..3) {
140 my $group_employees = $employees->search({group_id_2=>$group_id_2, group_id_3=>$group_id_3});
1d941d67 141 $group_employees->all();
142 ok( check_rs($group_employees), "group intial positions" );
143 hammer_rs( $group_employees );
144 }
145}
146
147# move_to_group, specifying group by hash
9beded8a 148my $group_4 = $employees->search({group_id_2=>4});
1d941d67 149$to_group = 1;
150my $to_group_2_base = 7;
151my $to_group_2 = 1;
152$to_pos = undef;
8f535707 153
8f535707 154{
155 my @empl = $group_3->all;
156 while (my $employee = shift @empl) {
157 $employee->move_to_group({group_id_2=>$to_group, group_id_3=>$to_group_2}, $to_pos);
158 $to_pos++;
1d941d67 159 $to_group = ($to_group % 3) + 1;
160 $to_group_2_base++;
47603d6c 161 $to_group_2 = (
162 POSIX::ceil( $to_group_2_base / 3.0 ) % 3
163 ) + 1;
8f535707 164 }
1d941d67 165}
9beded8a 166foreach my $group_id_2 (1..4) {
167 foreach my $group_id_3 (1..4) {
168 my $group_employees = $employees->search({group_id_2=>$group_id_2,group_id_3=>$group_id_3});
1d941d67 169 ok( check_rs($group_employees), "group positions after move_to_group" );
170 }
171}
172
173$employees->delete();
9beded8a 174foreach my $group_id_2 (1..4) {
175 foreach my $group_id_3 (1..4) {
1d941d67 176 foreach (1..4) {
9beded8a 177 $employees->create({ name=>'temp', group_id_2=>$group_id_2, group_id_3=>$group_id_3 });
1d941d67 178 }
179 }
180}
9beded8a 181$employees = $employees->search(undef,{order_by=>[qw/group_id_2 group_id_3 position/]});
1d941d67 182
9beded8a 183$employee = $employees->search({group_id_2=>4, group_id_3=>1})->first;
184$employee->group_id_2(1);
1d941d67 185$employee->update;
d146b340 186ok(
9beded8a 187 check_rs($employees->search_rs({group_id_2=>4, group_id_3=>1}))
8273e845 188 && check_rs($employees->search_rs({group_id_2=>1, group_id_3=>1})),
189 "overloaded multicol update 1"
1d941d67 190);
191
9beded8a 192$employee = $employees->search({group_id_2=>4, group_id_3=>1})->first;
193$employee->update({group_id_2=>2});
194ok( check_rs($employees->search_rs({group_id_2=>4, group_id_3=>1}))
8273e845 195 && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>1})),
196 "overloaded multicol update 2"
1d941d67 197);
198
9beded8a 199$employee = $employees->search({group_id_2=>3, group_id_3=>1})->first;
200$employee->group_id_2(1);
201$employee->group_id_3(3);
1d941d67 202$employee->update();
9beded8a 203ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>1}))
204 && check_rs($employees->search_rs({group_id_2=>1, group_id_3=>3})),
8273e845 205 "overloaded multicol update 3"
1d941d67 206);
207
9beded8a 208$employee = $employees->search({group_id_2=>3, group_id_3=>1})->first;
209$employee->update({group_id_2=>2, group_id_3=>3});
210ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>1}))
8273e845 211 && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>3})),
212 "overloaded multicol update 4"
1d941d67 213);
214
9beded8a 215$employee = $employees->search({group_id_2=>3, group_id_3=>2})->first;
216$employee->update({group_id_2=>2, group_id_3=>4, position=>2});
217ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>2}))
8273e845 218 && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>4})),
219 "overloaded multicol update 5"
1d941d67 220);
221
169bb185 222sub hammer_rs {
223 my $rs = shift;
707cbb2d 224 my $employee;
169bb185 225 my $count = $rs->count();
226 my $position_column = $rs->result_class->position_column();
58d387fe 227 my $row;
80010e2b 228
169bb185 229 foreach my $position (1..$count) {
80010e2b 230
dc66dea1 231 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 232 $row->move_previous();
233 ok( check_rs($rs), "move_previous( $position )" );
80010e2b 234
dc66dea1 235 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 236 $row->move_next();
237 ok( check_rs($rs), "move_next( $position )" );
80010e2b 238
dc66dea1 239 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 240 $row->move_first();
241 ok( check_rs($rs), "move_first( $position )" );
80010e2b 242
dc66dea1 243 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 244 $row->move_last();
245 ok( check_rs($rs), "move_last( $position )" );
80010e2b 246
169bb185 247 foreach my $to_position (1..$count) {
dc66dea1 248 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 249 $row->move_to($to_position);
250 ok( check_rs($rs), "move_to( $position => $to_position )" );
707cbb2d 251 }
80021def 252
97bfce50 253 $row = $rs->find({ position => $position });
707cbb2d 254 if ($position==1) {
169bb185 255 ok( !$row->previous_sibling(), 'no previous sibling' );
256 ok( !$row->first_sibling(), 'no first sibling' );
97bfce50 257 ok( $row->next_sibling->position > $position, 'next sibling position > than us');
258 is( $row->next_sibling->previous_sibling->position, $position, 'next-prev sibling is us');
259 ok( $row->last_sibling->position > $position, 'last sibling position > than us');
169bb185 260 }
261 else {
262 ok( $row->previous_sibling(), 'previous sibling' );
263 ok( $row->first_sibling(), 'first sibling' );
97bfce50 264 ok( $row->previous_sibling->position < $position, 'prev sibling position < than us');
265 is( $row->previous_sibling->next_sibling->position, $position, 'prev-next sibling is us');
266 ok( $row->first_sibling->position < $position, 'first sibling position < than us');
707cbb2d 267 }
169bb185 268 if ($position==$count) {
269 ok( !$row->next_sibling(), 'no next sibling' );
270 ok( !$row->last_sibling(), 'no last sibling' );
97bfce50 271 ok( $row->previous_sibling->position < $position, 'prev sibling position < than us');
272 is( $row->previous_sibling->next_sibling->position, $position, 'prev-next sibling is us');
273 ok( $row->first_sibling->position < $position, 'first sibling position < than us');
80021def 274 }
707cbb2d 275 else {
169bb185 276 ok( $row->next_sibling(), 'next sibling' );
277 ok( $row->last_sibling(), 'last sibling' );
97bfce50 278 ok( $row->next_sibling->position > $row->position, 'next sibling position > than us');
279 is( $row->next_sibling->previous_sibling->position, $position, 'next-prev sibling is us');
280 ok( $row->last_sibling->position > $row->position, 'last sibling position > than us');
707cbb2d 281 }
282
80010e2b 283 }
80010e2b 284}
285
169bb185 286sub check_rs {
287 my( $rs ) = @_;
288 $rs->reset();
289 my $position_column = $rs->result_class->position_column();
93cec8c3 290 my $expected_position = 0;
169bb185 291 while (my $row = $rs->next()) {
93cec8c3 292 $expected_position ++;
169bb185 293 if ($row->get_column($position_column)!=$expected_position) {
133dd22a 294 return 0;
80021def 295 }
93cec8c3 296 }
133dd22a 297 return 1;
93cec8c3 298}
299
87b4a877 300done_testing;