Bug 26384: Fix executable flags
[koha.git] / t / db_dependent / Serials / GetNextSeq.t
1 #!/usr/bin/perl
2
3 use C4::Context;
4 use Test::More tests => 32;
5 use Modern::Perl;
6 use Koha::Database;
7
8 my $schema = Koha::Database->new->schema;
9 $schema->storage->txn_begin;
10
11 use C4::Serials::Frequency;
12 use C4::Serials;
13
14 my $frequency = {
15     description => "One issue per day",
16     unit => 'day',
17     issuesperunit => 1,
18     unitsperissue => 1,
19 };
20 my $id = AddSubscriptionFrequency($frequency);
21
22 # TEST CASE 1 - 1 variable, from 1 to 4
23 my $pattern = {
24              add1 =>  1,          add2 =>  0,          add3 =>  0,
25            every1 =>  1,        every2 =>  0,        every3 =>  0,
26     whenmorethan1 =>  4, whenmorethan2 =>  0, whenmorethan3 =>  0,
27            setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
28     numberingmethod => 'X: {X}',
29     numbering1 => '',
30     numbering2 => '',
31     numbering3 => '',
32 };
33
34 my $subscription = {
35     periodicity => $id,
36     firstacquidate => '1970-01-01',
37     lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
38     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
39     skip_serialseq => 1,
40     irregularity => '3;5',
41     countissuesperunit => 1,
42     locale => 'en',
43 };
44 my $publisheddate = $subscription->{firstacquidate};
45
46 my $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
47 is($seq, 'X: 2');
48 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
49 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
50 is($seq, 'X: 4');
51 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
52 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
53 is($seq, 'X: 2');
54 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
55 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
56 is($seq, 'X: 3');
57
58 # TEST CASE 2 - 1 variable, use 'dayname' numbering, from 1 to 7
59 $subscription = {
60     periodicity => $id,
61     firstacquidate => '1970-01-01',
62     lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
63     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
64     skip_serialseq => 1,
65     irregularity => '3;4;6',
66     countissuesperunit => 1,
67     locale => 'C',
68 };
69 $pattern = {
70              add1 =>  1,          add2 =>  0,          add3 =>  0,
71            every1 =>  1,        every2 =>  0,        every3 =>  0,
72     whenmorethan1 =>  7, whenmorethan2 =>  0, whenmorethan3 =>  0,
73            setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
74     numberingmethod => 'X: {X}',
75     numbering1 => 'dayname',
76     numbering2 => '',
77     numbering3 => '',
78 };
79
80 $publisheddate = $subscription->{firstacquidate};
81
82 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
83 is($seq, 'X: Tuesday');
84 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
85 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
86 is($seq, 'X: Friday');
87 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
88 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
89 is($seq, 'X: Sunday');
90 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
91 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
92 is($seq, 'X: Monday');
93 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
94 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
95 is($seq, 'X: Tuesday');
96
97 # TEST CASE 3 - 1 variable, use 'monthname' numbering, from 0 to 11 by step of 2
98 $subscription = {
99     periodicity => $id,
100     firstacquidate => '1970-01-01',
101     lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
102     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
103     skip_serialseq => 1,
104     irregularity => '3;4;6',
105     countissuesperunit => 1,
106     locale => 'C',
107 };
108 $pattern = {
109              add1 =>  2,          add2 =>  0,          add3 =>  0,
110            every1 =>  1,        every2 =>  0,        every3 =>  0,
111     whenmorethan1 => 11, whenmorethan2 =>  0, whenmorethan3 =>  0,
112            setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
113     numberingmethod => 'X: {X}',
114     numbering1 => 'monthname',
115     numbering2 => '',
116     numbering3 => '',
117 };
118
119 $publisheddate = $subscription->{firstacquidate};
120
121 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
122 is($seq, 'X: March');
123 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
124 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
125 is($seq, 'X: September');
126 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
127 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
128 is($seq, 'X: January');
129 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
130 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
131 is($seq, 'X: March');
132 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
133 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
134 is($seq, 'X: May');
135
136 # TEST CASE 4 - 1 variable, use 'season' numbering, from 0 to 3
137 $subscription = {
138     periodicity => $id,
139     firstacquidate => '1970-01-01',
140     lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
141     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
142     skip_serialseq => 1,
143     irregularity => '3;4;6',
144     countissuesperunit => 1,
145     locale => 'C',
146 };
147 $pattern = {
148              add1 =>  1,          add2 =>  0,          add3 =>  0,
149            every1 =>  1,        every2 =>  0,        every3 =>  0,
150     whenmorethan1 =>  3, whenmorethan2 =>  0, whenmorethan3 =>  0,
151            setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
152     numberingmethod => 'X: {X}',
153     numbering1 => 'season',
154     numbering2 => '',
155     numbering3 => '',
156 };
157
158 $publisheddate = $subscription->{firstacquidate};
159
160 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
161 is($seq, 'X: Summer');
162 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
163 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
164 is($seq, 'X: Spring');
165 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
166 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
167 is($seq, 'X: Fall');
168 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
169 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
170 is($seq, 'X: Winter');
171 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
172 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
173 is($seq, 'X: Spring');
174
175 # TEST CASE 5 - 2 variables, from 1 to 12, and from 1 to 4
176 $subscription = {
177     periodicity => $id,
178     firstacquidate => '1970-01-01',
179     lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
180     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
181     skip_serialseq => 1,
182     irregularity => '3;4;6',
183     countissuesperunit => 1,
184     locale => 'C',
185 };
186 $pattern = {
187              add1 =>  1,          add2 =>  1,          add3 =>  0,
188            every1 =>  1,        every2 =>  4,        every3 =>  0,
189     whenmorethan1 =>  4, whenmorethan2 => 12, whenmorethan3 =>  0,
190            setto1 =>  1,        setto2 =>  1,        setto3 =>  0,
191     numberingmethod => 'Y: {Y}, X: {X}',
192     numbering1 => '',
193     numbering2 => '',
194     numbering3 => '',
195 };
196
197 $publisheddate = $subscription->{firstacquidate};
198
199 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
200 is($seq, 'Y: 1, X: 2');
201 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
202 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
203 is($seq, 'Y: 2, X: 1');
204 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
205 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
206 is($seq, 'Y: 2, X: 3');
207 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
208 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
209 is($seq, 'Y: 2, X: 4');
210 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
211 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
212 is($seq, 'Y: 3, X: 1');
213
214 # TEST CASE 6 - 3 variables, from 1 to 12, from 1 to 8, and from 1 to 4
215 $subscription = {
216     periodicity => $id,
217     firstacquidate => '1970-01-01',
218     lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
219     innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
220     skip_serialseq => 1,
221     irregularity => '3;4;6;110',
222     countissuesperunit => 1,
223     locale => 'C',
224 };
225 $pattern = {
226              add1 =>  1,          add2 =>  1,          add3 =>  1,
227            every1 =>  1,        every2 =>  4,        every3 => 32,
228     whenmorethan1 =>  4, whenmorethan2 =>  8, whenmorethan3 => 12,
229            setto1 =>  1,        setto2 =>  1,        setto3 =>  1,
230     numberingmethod => 'Z: {Z}, Y: {Y}, X: {X}',
231     numbering1 => '',
232     numbering2 => '',
233     numbering3 => '',
234 };
235
236 $publisheddate = $subscription->{firstacquidate};
237
238 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
239 is($seq, 'Z: 1, Y: 1, X: 2');
240 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
241 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
242 is($seq, 'Z: 1, Y: 2, X: 1');
243 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
244 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
245 is($seq, 'Z: 1, Y: 2, X: 3');
246 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
247 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
248 is($seq, 'Z: 1, Y: 2, X: 4');
249 for (1..100) {
250     $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
251     $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
252 }
253 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
254 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
255 is($seq, 'Z: 4, Y: 4, X: 1');
256 # 110th is here
257 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
258 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
259 is($seq, 'Z: 4, Y: 4, X: 3');
260 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
261 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
262 is($seq, 'Z: 4, Y: 4, X: 4');
263 $publisheddate = GetNextDate($subscription, $publisheddate, $frequency);
264 $seq = _next_seq($subscription, $pattern, $frequency, $publisheddate);
265 is($seq, 'Z: 4, Y: 5, X: 1');
266
267 sub _next_seq {
268     my ($subscription, $pattern, $frequency, $publisheddate) = @_;
269     my $seq;
270     ($seq, $subscription->{lastvalue1}, $subscription->{lastvalue2},
271         $subscription->{lastvalue3}, $subscription->{innerloop1},
272         $subscription->{innerloop2}, $subscription->{innerloop3}) =
273             GetNextSeq($subscription, $pattern, $frequency, $publisheddate);
274     return $seq;
275 }