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