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