4 use Test::More tests => 102;
8 use C4::Serials::Frequency;
10 my $schema = Koha::Database->new->schema;
11 $schema->storage->txn_begin;
12 my $dbh = C4::Context->dbh;
15 # TEST CASE - 1 issue per day, no irregularities
17 description => "One issue per day",
22 my $id = AddSubscriptionFrequency($frequency);
26 firstacquidate => '1970-01-01',
28 countissuesperunit => 1,
30 my $publisheddate = $subscription->{firstacquidate};
32 $publisheddate = GetNextDate($subscription, $publisheddate);
33 is($publisheddate, '1970-01-02');
34 $publisheddate = GetNextDate($subscription, $publisheddate);
35 is($publisheddate, '1970-01-03');
36 $publisheddate = GetNextDate($subscription, $publisheddate);
37 is($publisheddate, '1970-01-04');
39 # TEST CASE - 1 issue per day, irregularities
42 firstacquidate => '1970-01-01',
43 irregularity => '2;4', # Skip the second and fourth issues
44 countissuesperunit => 1,
46 $publisheddate = $subscription->{firstacquidate};
47 $publisheddate = GetNextDate($subscription, $publisheddate);
48 is($publisheddate, '1970-01-03');
49 $publisheddate = GetNextDate($subscription, $publisheddate);
50 is($publisheddate, '1970-01-05');
51 $publisheddate = GetNextDate($subscription, $publisheddate);
52 is($publisheddate, '1970-01-06');
54 # TEST CASE - 2 issues per day, no irregularity
55 $id = AddSubscriptionFrequency({
56 description => "Two issues per day",
63 firstacquidate => '1970-01-01',
65 countissuesperunit => 1,
67 $publisheddate = $subscription->{firstacquidate};
68 $publisheddate = GetNextDate($subscription, $publisheddate);
69 is($publisheddate, '1970-01-01');
70 $publisheddate = GetNextDate($subscription, $publisheddate);
71 is($publisheddate, '1970-01-02');
72 $publisheddate = GetNextDate($subscription, $publisheddate);
73 is($publisheddate, '1970-01-02');
74 $publisheddate = GetNextDate($subscription, $publisheddate);
75 is($publisheddate, '1970-01-03');
77 # TEST CASE - 2 issues per day, irregularities
80 firstacquidate => '1970-01-01',
81 irregularity => '3;5;6',
82 countissuesperunit => 1,
84 $publisheddate = $subscription->{firstacquidate};
85 $publisheddate = GetNextDate($subscription, $publisheddate);
86 is($publisheddate, '1970-01-01');
87 $publisheddate = GetNextDate($subscription, $publisheddate);
88 is($publisheddate, '1970-01-02');
89 $publisheddate = GetNextDate($subscription, $publisheddate);
90 is($publisheddate, '1970-01-04');
91 $publisheddate = GetNextDate($subscription, $publisheddate);
92 is($publisheddate, '1970-01-04');
93 $publisheddate = GetNextDate($subscription, $publisheddate);
94 is($publisheddate, '1970-01-05');
96 # TEST CASE - 1 issue every 2 days, no irregularity
97 $id = AddSubscriptionFrequency({
98 description => "one issue every two days",
105 firstacquidate => '1970-01-01',
107 countissuesperunit => 1,
109 $publisheddate = $subscription->{firstacquidate};
110 $publisheddate = GetNextDate($subscription, $publisheddate);
111 is($publisheddate, '1970-01-03');
112 $publisheddate = GetNextDate($subscription, $publisheddate);
113 is($publisheddate, '1970-01-05');
115 # TEST CASE - 1 issue every 2 days, irregularities
118 firstacquidate => '1970-01-01',
120 countissuesperunit => 1,
122 $publisheddate = $subscription->{firstacquidate};
123 $publisheddate = GetNextDate($subscription, $publisheddate);
124 is($publisheddate, '1970-01-03');
125 $publisheddate = GetNextDate($subscription, $publisheddate);
126 is($publisheddate, '1970-01-07');
127 $publisheddate = GetNextDate($subscription, $publisheddate);
128 is($publisheddate, '1970-01-09');
130 # TEST CASE - 1 issue per week, no irregularity
131 $id = AddSubscriptionFrequency({
132 description => "one issue per week",
139 firstacquidate => '1970-01-01',
141 countissuesperunit => 1,
143 $publisheddate = $subscription->{firstacquidate};
144 $publisheddate = GetNextDate($subscription, $publisheddate);
145 is($publisheddate, '1970-01-08');
146 $publisheddate = GetNextDate($subscription, $publisheddate);
147 is($publisheddate, '1970-01-15');
149 # TEST CASE - 1 issue per week, irregularities
152 firstacquidate => '1970-01-01',
154 countissuesperunit => 1,
156 $publisheddate = $subscription->{firstacquidate};
157 $publisheddate = GetNextDate($subscription, $publisheddate);
158 is($publisheddate, '1970-01-08');
159 $publisheddate = GetNextDate($subscription, $publisheddate);
160 is($publisheddate, '1970-01-22');
161 $publisheddate = GetNextDate($subscription, $publisheddate);
162 is($publisheddate, '1970-01-29');
164 # TEST CASE - 1 issue every 2 weeks, no irregularity
165 $id = AddSubscriptionFrequency({
166 description => "one issue every 2 weeks",
173 firstacquidate => '1970-01-01',
175 countissuesperunit => 1,
177 $publisheddate = $subscription->{firstacquidate};
178 $publisheddate = GetNextDate($subscription, $publisheddate);
179 is($publisheddate, '1970-01-15');
180 $publisheddate = GetNextDate($subscription, $publisheddate);
181 is($publisheddate, '1970-01-29');
182 $publisheddate = GetNextDate($subscription, $publisheddate);
183 is($publisheddate, '1970-02-12');
185 # TEST CASE - 1 issue every 2 weeks, irregularities
188 firstacquidate => '1970-01-01',
190 countissuesperunit => 1,
192 $publisheddate = $subscription->{firstacquidate};
193 $publisheddate = GetNextDate($subscription, $publisheddate);
194 is($publisheddate, '1970-01-15');
195 $publisheddate = GetNextDate($subscription, $publisheddate);
196 is($publisheddate, '1970-02-12');
197 $publisheddate = GetNextDate($subscription, $publisheddate);
198 is($publisheddate, '1970-02-26');
200 # TEST CASE - 2 issues per week, no irregularity
201 $id = AddSubscriptionFrequency({
202 description => "two issues per week",
209 firstacquidate => '1970-01-01',
211 countissuesperunit => 1,
213 $publisheddate = $subscription->{firstacquidate};
214 $publisheddate = GetNextDate($subscription, $publisheddate);
215 is($publisheddate, '1970-01-04');
216 $publisheddate = GetNextDate($subscription, $publisheddate);
217 is($publisheddate, '1970-01-08');
218 $publisheddate = GetNextDate($subscription, $publisheddate);
219 is($publisheddate, '1970-01-11');
220 $publisheddate = GetNextDate($subscription, $publisheddate);
221 is($publisheddate, '1970-01-15');
223 # TEST CASE - 2 issues per week, irregularities
226 firstacquidate => '1970-01-01',
227 irregularity => '3;5;6',
228 countissuesperunit => 1,
230 $publisheddate = $subscription->{firstacquidate};
231 $publisheddate = GetNextDate($subscription, $publisheddate);
232 is($publisheddate, '1970-01-04');
233 $publisheddate = GetNextDate($subscription, $publisheddate);
234 is($publisheddate, '1970-01-11');
235 $publisheddate = GetNextDate($subscription, $publisheddate);
236 is($publisheddate, '1970-01-22');
237 $publisheddate = GetNextDate($subscription, $publisheddate);
238 is($publisheddate, '1970-01-25');
239 $publisheddate = GetNextDate($subscription, $publisheddate);
240 is($publisheddate, '1970-01-29');
242 # TEST CASE - 6 issues per week, no irregularity
243 $id = AddSubscriptionFrequency({
244 description => "six issues per week",
251 firstacquidate => '1970-01-06',
253 countissuesperunit => 1,
255 $publisheddate = $subscription->{firstacquidate};
256 $publisheddate = GetNextDate($subscription, $publisheddate);
257 is($publisheddate, '1970-01-07');
258 $publisheddate = GetNextDate($subscription, $publisheddate);
259 is($publisheddate, '1970-01-08');
260 $publisheddate = GetNextDate($subscription, $publisheddate);
261 is($publisheddate, '1970-01-09');
262 $publisheddate = GetNextDate($subscription, $publisheddate);
263 is($publisheddate, '1970-01-10');
264 $publisheddate = GetNextDate($subscription, $publisheddate);
265 is($publisheddate, '1970-01-11');
266 $publisheddate = GetNextDate($subscription, $publisheddate);
267 is($publisheddate, '1970-01-13');
269 # TEST CASE - 6 issues per week, irregularities
272 firstacquidate => '1970-01-06',
273 irregularity => '3;5;6',
274 countissuesperunit => 1,
276 $publisheddate = $subscription->{firstacquidate};
277 $publisheddate = GetNextDate($subscription, $publisheddate);
278 is($publisheddate, '1970-01-07');
279 $publisheddate = GetNextDate($subscription, $publisheddate);
280 is($publisheddate, '1970-01-09');
281 $publisheddate = GetNextDate($subscription, $publisheddate);
282 is($publisheddate, '1970-01-13');
283 $publisheddate = GetNextDate($subscription, $publisheddate);
284 is($publisheddate, '1970-01-14');
286 # TEST CASE - 1 issue per month, no irregularity
287 $id = AddSubscriptionFrequency({
288 description => "1 issue per month",
295 firstacquidate => '1970-01-01',
297 countissuesperunit => 1,
299 $publisheddate = $subscription->{firstacquidate};
300 $publisheddate = GetNextDate($subscription, $publisheddate);
301 is($publisheddate, '1970-02-01');
302 $publisheddate = GetNextDate($subscription, $publisheddate);
303 is($publisheddate, '1970-03-01');
304 $publisheddate = GetNextDate($subscription, $publisheddate);
305 is($publisheddate, '1970-04-01');
307 # TEST CASE - 1 issue per month, irregularities
310 firstacquidate => '1970-01-01',
311 irregularity => '2;4',
312 countissuesperunit => 1,
314 $publisheddate = $subscription->{firstacquidate};
315 $publisheddate = GetNextDate($subscription, $publisheddate);
316 is($publisheddate, '1970-03-01');
317 $publisheddate = GetNextDate($subscription, $publisheddate);
318 is($publisheddate, '1970-05-01');
319 $publisheddate = GetNextDate($subscription, $publisheddate);
320 is($publisheddate, '1970-06-01');
322 # TEST CASE - 1 issue every 2 months, no irregularity
323 $id = AddSubscriptionFrequency({
324 description => "1 issue every 2 months",
331 firstacquidate => '1970-01-01',
333 countissuesperunit => 1,
335 $publisheddate = $subscription->{firstacquidate};
336 $publisheddate = GetNextDate($subscription, $publisheddate);
337 is($publisheddate, '1970-03-01');
338 $publisheddate = GetNextDate($subscription, $publisheddate);
339 is($publisheddate, '1970-05-01');
340 $publisheddate = GetNextDate($subscription, $publisheddate);
341 is($publisheddate, '1970-07-01');
343 # TEST CASE - 1 issue every 2 months, irregularities
346 firstacquidate => '1970-01-01',
347 irregularity => '2;3',
348 countissuesperunit => 1,
350 $publisheddate = $subscription->{firstacquidate};
351 $publisheddate = GetNextDate($subscription, $publisheddate);
352 is($publisheddate, '1970-07-01');
353 $publisheddate = GetNextDate($subscription, $publisheddate);
354 is($publisheddate, '1970-09-01');
355 $publisheddate = GetNextDate($subscription, $publisheddate);
356 is($publisheddate, '1970-11-01');
358 # TEST CASE - 2 issues per month, no irregularity
359 $id = AddSubscriptionFrequency({
360 description => "2 issues per month",
367 firstacquidate => '1970-01-01',
369 countissuesperunit => 1,
371 $publisheddate = $subscription->{firstacquidate};
372 $publisheddate = GetNextDate($subscription, $publisheddate);
373 is($publisheddate, '1970-01-16', 'Jan 16');
374 $publisheddate = GetNextDate($subscription, $publisheddate);
375 is($publisheddate, '1970-02-01', 'Feb 1');
376 $publisheddate = GetNextDate($subscription, $publisheddate);
377 is($publisheddate, '1970-02-16', 'Feb 16');
378 $publisheddate = GetNextDate($subscription, $publisheddate);
379 is($publisheddate, '1970-03-01', 'Mar 1' );
381 # TEST CASE - 2 issues per month, irregularities
384 firstacquidate => '1970-01-01',
385 irregularity => '3;5;6',
386 countissuesperunit => 1,
388 $publisheddate = $subscription->{firstacquidate};
389 $publisheddate = GetNextDate($subscription, $publisheddate);
390 is($publisheddate, '1970-01-16', 'Jan 16' );
391 $publisheddate = GetNextDate($subscription, $publisheddate);
392 is($publisheddate, '1970-02-16', 'Feb 16 (skipping Feb 1)' );
393 $publisheddate = GetNextDate($subscription, $publisheddate);
394 is($publisheddate, '1970-04-01', 'Apr 1 (skipping Mar 1 and 16)' );
395 $publisheddate = GetNextDate($subscription, $publisheddate);
396 is($publisheddate, '1970-04-16', 'Apr 16' );
397 $publisheddate = GetNextDate($subscription, $publisheddate);
398 is($publisheddate, '1970-05-01', 'May 1' );
400 # TEST CASE - 1 issue per year, no irregularity
401 $id = AddSubscriptionFrequency({
402 description => "1 issue per year",
409 firstacquidate => '1970-01-01',
411 countissuesperunit => 1,
413 $publisheddate = $subscription->{firstacquidate};
414 $publisheddate = GetNextDate($subscription, $publisheddate);
415 is($publisheddate, '1971-01-01');
416 $publisheddate = GetNextDate($subscription, $publisheddate);
417 is($publisheddate, '1972-01-01');
418 $publisheddate = GetNextDate($subscription, $publisheddate);
419 is($publisheddate, '1973-01-01');
421 # TEST CASE - 1 issue per year, irregularities
424 firstacquidate => '1970-01-01',
425 irregularity => '2;4',
426 countissuesperunit => 1,
428 $publisheddate = $subscription->{firstacquidate};
429 $publisheddate = GetNextDate($subscription, $publisheddate);
430 is($publisheddate, '1972-01-01');
431 $publisheddate = GetNextDate($subscription, $publisheddate);
432 is($publisheddate, '1974-01-01');
433 $publisheddate = GetNextDate($subscription, $publisheddate);
434 is($publisheddate, '1975-01-01');
436 # TEST CASE - 1 issue every 2 years, no irregularity
437 $id = AddSubscriptionFrequency({
438 description => "1 issue every 2 years",
445 firstacquidate => '1970-01-01',
447 countissuesperunit => 1,
449 $publisheddate = $subscription->{firstacquidate};
450 $publisheddate = GetNextDate($subscription, $publisheddate);
451 is($publisheddate, '1972-01-01');
452 $publisheddate = GetNextDate($subscription, $publisheddate);
453 is($publisheddate, '1974-01-01');
454 $publisheddate = GetNextDate($subscription, $publisheddate);
455 is($publisheddate, '1976-01-01');
457 # TEST CASE - 1 issue every 2 years, irregularities
460 firstacquidate => '1970-01-01',
461 irregularity => '2;4',
462 countissuesperunit => 1,
464 $publisheddate = $subscription->{firstacquidate};
465 $publisheddate = GetNextDate($subscription, $publisheddate);
466 is($publisheddate, '1974-01-01');
467 $publisheddate = GetNextDate($subscription, $publisheddate);
468 is($publisheddate, '1978-01-01');
469 $publisheddate = GetNextDate($subscription, $publisheddate);
470 is($publisheddate, '1980-01-01');
471 # Move publisheddate to Feb 29 (leap year 1980)
472 $publisheddate = '1980-02-29';
473 $publisheddate = GetNextDate( $subscription, $publisheddate );
474 is( $publisheddate, '1982-02-28', 'Test +2 year from Feb 29' );
476 # TEST CASE - 2 issues per year, no irregularity
477 $id = AddSubscriptionFrequency({
478 description => "2 issues per year",
485 firstacquidate => '1970-01-01',
487 countissuesperunit => 1,
489 $publisheddate = $subscription->{firstacquidate};
490 $publisheddate = GetNextDate($subscription, $publisheddate);
491 is($publisheddate, '1970-07-02');
492 $publisheddate = GetNextDate($subscription, $publisheddate);
493 is($publisheddate, '1971-01-01');
494 $publisheddate = GetNextDate($subscription, $publisheddate);
495 is($publisheddate, '1971-07-02');
496 $publisheddate = GetNextDate($subscription, $publisheddate);
497 is($publisheddate, '1972-01-01');
499 # TEST CASE - 2 issues per year, irregularities
502 firstacquidate => '1970-01-01',
503 irregularity => '3;5;6',
504 countissuesperunit => 1,
506 $publisheddate = $subscription->{firstacquidate};
507 $publisheddate = GetNextDate($subscription, $publisheddate);
508 is($publisheddate, '1970-07-02');
509 $publisheddate = GetNextDate($subscription, $publisheddate);
510 is($publisheddate, '1971-07-02');
511 $publisheddate = GetNextDate($subscription, $publisheddate);
512 is($publisheddate, '1973-01-01');
513 $publisheddate = GetNextDate($subscription, $publisheddate);
514 is($publisheddate, '1973-07-02');
515 $publisheddate = GetNextDate($subscription, $publisheddate);
516 is($publisheddate, '1974-01-01');
518 # TEST CASE - 9 issues per year, dates spread throughout month
519 $id = AddSubscriptionFrequency({
520 description => "9 issues per year",
527 firstacquidate => '1970-08-10',
529 countissuesperunit => 1,
531 my @dates = ( $subscription->{firstacquidate} );
533 push @dates, GetNextDate( $subscription, $dates[-1] );
535 is( $dates[9], '1971-08-10', 'Freq 9/yr, 1 year passed' );
536 is( $dates[18], '1972-08-10', 'Freq 9/yr, 2 years passed (leap year)' );
537 is( $dates[27], '1973-08-10', 'Freq 9/yr, 3 years passed' );
538 # Keep (first) position in cycle, but shift back 9 days
539 is( GetNextDate( $subscription, '1973-08-01' ), '1973-09-10', 'Back 9 days, without annual correction' );
540 # Set position to last in cycle, and shift back 9 days; annual correction
541 $subscription->{countissuesperunit} = 9;
542 is( GetNextDate( $subscription, '1973-08-01' ), '1973-09-15', 'Last in cycle, back 9 days, expect annual correction' );
544 # TEST CASE - Irregular
545 $id = AddSubscriptionFrequency({
546 description => "Irregular",
553 firstacquidate => '1970-01-01',
555 countissuesperunit => 1,
557 $publisheddate = $subscription->{firstacquidate};
558 # GetNextDate always return undef if subscription is irregular
559 $publisheddate = GetNextDate($subscription, $publisheddate);
560 is($publisheddate, undef);
562 # GetNextDate returns undef if one of two first parameters is undef
563 $publisheddate = GetNextDate($subscription, undef);
564 is($publisheddate, undef);
565 $publisheddate = GetNextDate(undef, $subscription->{firstacquidate});
566 is($publisheddate, undef);
567 $publisheddate = GetNextDate(undef, undef);
568 is($publisheddate, undef);
570 $schema->storage->txn_rollback;