Commit | Line | Data |
c0329273 |
1 | BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } |
2 | |
93cec8c3 |
3 | # vim: filetype=perl |
70350518 |
4 | use strict; |
8273e845 |
5 | use warnings; |
93cec8c3 |
6 | |
70350518 |
7 | use Test::More; |
c0329273 |
8 | |
70350518 |
9 | use DBICTest; |
93cec8c3 |
10 | |
47603d6c |
11 | use POSIX (); |
1d941d67 |
12 | |
a47e1233 |
13 | my $schema = DBICTest->init_schema(); |
93cec8c3 |
14 | |
70350518 |
15 | my $employees = $schema->resultset('Employee'); |
16 | $employees->delete(); |
169bb185 |
17 | |
70350518 |
18 | foreach (1..5) { |
19 | $employees->create({ name=>'temp' }); |
20 | } |
21 | $employees = $employees->search(undef,{order_by=>'position'}); |
22 | ok( check_rs($employees), "intial positions" ); |
b1c66eea |
23 | |
70350518 |
24 | hammer_rs( $employees ); |
169bb185 |
25 | |
70350518 |
26 | DBICTest::Employee->grouping_column('group_id'); |
27 | $employees->delete(); |
79dc353a |
28 | foreach 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 |
35 | foreach 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 |
42 | my $group_3 = $employees->search({group_id=>3}); |
43 | my $to_group = 1; |
44 | my $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 | } |
53 | foreach 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 | |
58 | my $employee = $employees->search({group_id=>4})->first; |
59 | $employee->position(2); |
60 | $employee->update; |
61 | ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 1" ); |
62 | $employee = $employees->search({group_id=>4})->first; |
63 | $employee->update({position=>3}); |
64 | ok( 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; |
68 | ok( |
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}); |
74 | ok( |
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; |
82 | ok( |
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; |
90 | ok( |
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}); |
96 | ok( |
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 }); |
104 | is_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 | ); |
117 | is_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 |
127 | DBICTest::Employee->grouping_column(['group_id_2', 'group_id_3']); |
1d941d67 |
128 | $employees->delete(); |
9beded8a |
129 | foreach 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 |
138 | foreach 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 |
148 | my $group_4 = $employees->search({group_id_2=>4}); |
1d941d67 |
149 | $to_group = 1; |
150 | my $to_group_2_base = 7; |
151 | my $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 |
166 | foreach 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 |
174 | foreach 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 |
186 | ok( |
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}); |
194 | ok( 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 |
203 | ok( 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}); |
210 | ok( 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}); |
217 | ok( 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 |
222 | sub 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 |
286 | sub 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 |
300 | done_testing; |