commiting uncommited changes on live site
[weblabels.fsf.org.git] / crm.fsf.org / 20131203 / files / sites / all / modules-old / civicrm / packages / When / Tests / When_Monthly_Rrule_Test.php
1 <?php
2
3 require_once 'PHPUnit/Framework.php';
4
5 require_once './When.php';
6
7 class When_Monthly_Rrule_Test extends PHPUnit_Framework_TestCase
8 {
9 /**
10 * Monthly on the 1st Friday for ten occurrences:
11 * DTSTART;TZID=US-Eastern:19970905T090000
12 * RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
13 */
14 function testNine()
15 {
16 $results[] = new DateTime('1997-09-05 09:00:00');
17 $results[] = new DateTime('1997-10-03 09:00:00');
18 $results[] = new DateTime('1997-11-07 09:00:00');
19 $results[] = new DateTime('1997-12-05 09:00:00');
20 $results[] = new DateTime('1998-01-02 09:00:00');
21 $results[] = new DateTime('1998-02-06 09:00:00');
22 $results[] = new DateTime('1998-03-06 09:00:00');
23 $results[] = new DateTime('1998-04-03 09:00:00');
24 $results[] = new DateTime('1998-05-01 09:00:00');
25 $results[] = new DateTime('1998-06-05 09:00:00');
26
27 $r = new When();
28 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;COUNT=10;BYDAY=1FR');
29
30 foreach($results as $result)
31 {
32 $this->assertEquals($result, $r->next());
33 }
34 }
35
36 /**
37 * Monthly on the 1st Friday until December 24, 1997:
38 * DTSTART;TZID=US-Eastern:19970905T090000
39 * RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
40 */
41 function testTen()
42 {
43 $results[] = new DateTime('1997-09-05 09:00:00');
44 $results[] = new DateTime('1997-10-03 09:00:00');
45 $results[] = new DateTime('1997-11-07 09:00:00');
46 $results[] = new DateTime('1997-12-05 09:00:00');
47
48 $r = new When();
49 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR');
50
51 foreach($results as $result)
52 {
53 $this->assertEquals($result, $r->next());
54 }
55 }
56
57 /**
58 * Every other month on the 1st and last Sunday of the month for 10 occurrences:
59 * DTSTART;TZID=US-Eastern:19970907T090000
60 * RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
61 */
62 function testEleven()
63 {
64 $results[] = new DateTime('1997-09-07 09:00:00');
65 $results[] = new DateTime('1997-09-28 09:00:00');
66 $results[] = new DateTime('1997-11-02 09:00:00');
67 $results[] = new DateTime('1997-11-30 09:00:00');
68 $results[] = new DateTime('1998-01-04 09:00:00');
69 $results[] = new DateTime('1998-01-25 09:00:00');
70 $results[] = new DateTime('1998-03-01 09:00:00');
71 $results[] = new DateTime('1998-03-29 09:00:00');
72 $results[] = new DateTime('1998-05-03 09:00:00');
73 $results[] = new DateTime('1998-05-31 09:00:00');
74
75 $r = new When();
76 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU');
77
78 foreach($results as $result)
79 {
80 $this->assertEquals($result, $r->next());
81 }
82 }
83
84 /**
85 * Monthly on the second to last Monday of the month for 6 months:
86 * DTSTART;TZID=US-Eastern:19970922T090000
87 * RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
88 */
89 function testTwelve()
90 {
91 $results[] = new DateTime('1997-09-22 09:00:00');
92 $results[] = new DateTime('1997-10-20 09:00:00');
93 $results[] = new DateTime('1997-11-17 09:00:00');
94 $results[] = new DateTime('1997-12-22 09:00:00');
95 $results[] = new DateTime('1998-01-19 09:00:00');
96 $results[] = new DateTime('1998-02-16 09:00:00');
97
98 $r = new When();
99 $r->recur('19970922T090000')->rrule('FREQ=MONTHLY;COUNT=6;BYDAY=-2MO');
100
101 foreach($results as $result)
102 {
103 $this->assertEquals($result, $r->next());
104 }
105 }
106
107 /**
108 * Monthly on the third to the last day of the month, forever:
109 * DTSTART;TZID=US-Eastern:19970928T090000
110 * RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
111 */
112 function testThirteen()
113 {
114 $results[] = new DateTime('1997-09-28 09:00:00');
115 $results[] = new DateTime('1997-10-29 09:00:00');
116 $results[] = new DateTime('1997-11-28 09:00:00');
117 $results[] = new DateTime('1997-12-29 09:00:00');
118 $results[] = new DateTime('1998-01-29 09:00:00');
119 $results[] = new DateTime('1998-02-26 09:00:00');
120
121 $r = new When();
122 $r->recur('19970902T090000')->count(6)->rrule('FREQ=MONTHLY;BYMONTHDAY=-3');
123
124 foreach($results as $result)
125 {
126 $this->assertEquals($result, $r->next());
127 }
128 }
129
130 /**
131 * Monthly on the 2nd and 15th of the month for 10 occurrences:
132 * DTSTART;TZID=US-Eastern:19970902T090000
133 * RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
134 */
135 function testFourteen()
136 {
137 $results[] = new DateTime('1997-09-02 09:00:00');
138 $results[] = new DateTime('1997-09-15 09:00:00');
139 $results[] = new DateTime('1997-10-02 09:00:00');
140 $results[] = new DateTime('1997-10-15 09:00:00');
141 $results[] = new DateTime('1997-11-02 09:00:00');
142 $results[] = new DateTime('1997-11-15 09:00:00');
143 $results[] = new DateTime('1997-12-02 09:00:00');
144 $results[] = new DateTime('1997-12-15 09:00:00');
145 $results[] = new DateTime('1998-01-02 09:00:00');
146 $results[] = new DateTime('1998-01-15 09:00:00');
147
148 $r = new When();
149 $r->recur('19970902T090000')->rrule('FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15');
150
151 foreach($results as $result)
152 {
153 $this->assertEquals($result, $r->next());
154 }
155 }
156
157 /**
158 * Monthly on the first and last day of the month for 10 occurrences:
159 * DTSTART;TZID=US-Eastern:19970930T090000
160 * RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
161 */
162 function testFifteen()
163 {
164 $results[] = new DateTime('1997-09-30 09:00:00');
165 $results[] = new DateTime('1997-10-01 09:00:00');
166 $results[] = new DateTime('1997-10-31 09:00:00');
167 $results[] = new DateTime('1997-11-01 09:00:00');
168 $results[] = new DateTime('1997-11-30 09:00:00');
169 $results[] = new DateTime('1997-12-01 09:00:00');
170 $results[] = new DateTime('1997-12-31 09:00:00');
171 $results[] = new DateTime('1998-01-01 09:00:00');
172 $results[] = new DateTime('1998-01-31 09:00:00');
173 $results[] = new DateTime('1998-02-01 09:00:00');
174
175 $r = new When();
176 $r->recur('19970930T090000')->rrule('RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1');
177
178 foreach($results as $result)
179 {
180 $this->assertEquals($result, $r->next());
181 }
182 }
183
184 /**
185 * Every 18 months on the 10th thru 15th of the month for 10 occurrences:
186 * DTSTART;TZID=US-Eastern:19970910T090000
187 * RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15
188 */
189 function testSixteen()
190 {
191 $results[] = new DateTime('1997-09-10 09:00:00');
192 $results[] = new DateTime('1997-09-11 09:00:00');
193 $results[] = new DateTime('1997-09-12 09:00:00');
194 $results[] = new DateTime('1997-09-13 09:00:00');
195 $results[] = new DateTime('1997-09-14 09:00:00');
196 $results[] = new DateTime('1997-09-15 09:00:00');
197 $results[] = new DateTime('1999-03-10 09:00:00');
198 $results[] = new DateTime('1999-03-11 09:00:00');
199 $results[] = new DateTime('1999-03-12 09:00:00');
200 $results[] = new DateTime('1999-03-13 09:00:00');
201
202 $r = new When();
203 $r->recur('19970910T090000')->rrule('FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15');
204
205 foreach($results as $result)
206 {
207 $this->assertEquals($result, $r->next());
208 }
209 }
210
211 /**
212 * Every Tuesday, every other month:
213 * DTSTART;TZID=US-Eastern:19970902T090000
214 * RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
215 */
216 function testSeventeen()
217 {
218 $results[] = new DateTime('1997-09-02 09:00:00');
219 $results[] = new DateTime('1997-09-09 09:00:00');
220 $results[] = new DateTime('1997-09-16 09:00:00');
221 $results[] = new DateTime('1997-09-23 09:00:00');
222 $results[] = new DateTime('1997-09-30 09:00:00');
223 $results[] = new DateTime('1997-11-04 09:00:00');
224 $results[] = new DateTime('1997-11-11 09:00:00');
225 $results[] = new DateTime('1997-11-18 09:00:00');
226 $results[] = new DateTime('1997-11-25 09:00:00');
227 $results[] = new DateTime('1998-01-06 09:00:00');
228 $results[] = new DateTime('1998-01-13 09:00:00');
229 $results[] = new DateTime('1998-01-20 09:00:00');
230 $results[] = new DateTime('1998-01-27 09:00:00');
231 $results[] = new DateTime('1998-03-03 09:00:00');
232 $results[] = new DateTime('1998-03-10 09:00:00');
233 $results[] = new DateTime('1998-03-17 09:00:00');
234 $results[] = new DateTime('1998-03-24 09:00:00');
235 $results[] = new DateTime('1998-03-31 09:00:00');
236
237 $r = new When();
238 $r->recur('19970902T090000')->count(18)->rrule('FREQ=MONTHLY;INTERVAL=2;BYDAY=TU');
239
240 foreach($results as $result)
241 {
242 $this->assertEquals($result, $r->next());
243 }
244 }
245
246 /**
247 * Every Friday the 13th, forever:
248 * DTSTART;TZID=US-Eastern:19970902T090000
249 * RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
250 */
251 function testEighteen()
252 {
253 $results[] = new DateTime('1998-02-13 09:00:00');
254 $results[] = new DateTime('1998-03-13 09:00:00');
255 $results[] = new DateTime('1998-11-13 09:00:00');
256 $results[] = new DateTime('1999-08-13 09:00:00');
257 $results[] = new DateTime('2000-10-13 09:00:00');
258
259 $r = new When();
260 $r->recur('19970902T090000')->count(5)->rrule('FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13');
261
262 foreach($results as $result)
263 {
264 $this->assertEquals($result, $r->next());
265 }
266 }
267
268 /**
269 * The first Saturday that follows the first Sunday of the month, forever:
270 * DTSTART;TZID=US-Eastern:19970913T090000
271 * RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
272 */
273 function testNineteen()
274 {
275 $results[] = new DateTime('1997-09-13 09:00:00');
276 $results[] = new DateTime('1997-10-11 09:00:00');
277 $results[] = new DateTime('1997-11-08 09:00:00');
278 $results[] = new DateTime('1997-12-13 09:00:00');
279 $results[] = new DateTime('1998-01-10 09:00:00');
280 $results[] = new DateTime('1998-02-07 09:00:00');
281 $results[] = new DateTime('1998-03-07 09:00:00');
282 $results[] = new DateTime('1998-04-11 09:00:00');
283 $results[] = new DateTime('1998-05-09 09:00:00');
284 $results[] = new DateTime('1998-06-13 09:00:00');
285
286 $r = new When();
287 $r->recur('19970913T090000')->count(10)->rrule('FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13');
288
289 foreach($results as $result)
290 {
291 $this->assertEquals($result, $r->next());
292 }
293 }
294
295 /**
296 * The 3rd instance into the month of one of Tuesday, Wednesday or Thursday, for the next 3 months:
297 * DTSTART;TZID=US-Eastern:19970904T090000
298 * RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
299 */
300 function testTwenty()
301 {
302 $results[] = new DateTime('1997-09-04 09:00:00');
303 $results[] = new DateTime('1997-10-07 09:00:00');
304 $results[] = new DateTime('1997-11-06 09:00:00');
305
306 $r = new When();
307 $r->recur('19970904T090000')->rrule('FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3');
308
309 foreach($results as $result)
310 {
311 $this->assertEquals($result, $r->next());
312 }
313 }
314
315 /**
316 * An example where an invalid date (i.e., February 30) is ignored.
317 * DTSTART;TZID=America/New_York:20070115T090000
318 * RRULE:FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5
319 */
320 function testTwentyOne()
321 {
322 $results[] = new DateTime('2007-01-15 09:00:00');
323 $results[] = new DateTime('2007-01-30 09:00:00');
324 $results[] = new DateTime('2007-02-15 09:00:00');
325 $results[] = new DateTime('2007-03-15 09:00:00');
326 $results[] = new DateTime('2007-03-30 09:00:00');
327
328 $r = new When();
329 $r->recur('20070115T090000')->count(5)->rrule('FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5');
330
331 foreach($results as $result)
332 {
333 $this->assertEquals($result, $r->next());
334 }
335 }
336
337 /**
338 * The second-to-last weekday of the month:
339 * DTSTART;TZID=America/New_York:19970929T090000
340 * RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
341 */
342 function testTwentyTwo()
343 {
344 $results[] = new DateTime('1997-09-29 09:00:00');
345 $results[] = new DateTime('1997-10-30 09:00:00');
346 $results[] = new DateTime('1997-11-27 09:00:00');
347 $results[] = new DateTime('1997-12-30 09:00:00');
348 $results[] = new DateTime('1998-01-29 09:00:00');
349 $results[] = new DateTime('1998-02-26 09:00:00');
350 $results[] = new DateTime('1998-03-30 09:00:00');
351
352 $r = new When();
353 $r->recur('19970929T090000')->count(7)->rrule('FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2');
354
355 foreach($results as $result)
356 {
357 $this->assertEquals($result, $r->next());
358 }
359 }
360
361 /**
362 * The same day of every month:
363 * RRULE:FREQ=MONTHLY
364 */
365 function testTwentyThree()
366 {
367 $results[] = new DateTime('1997-09-14 09:00:00');
368 $results[] = new DateTime('1997-10-14 09:00:00');
369 $results[] = new DateTime('1997-11-14 09:00:00');
370 $results[] = new DateTime('1997-12-14 09:00:00');
371 $results[] = new DateTime('1998-01-14 09:00:00');
372 $results[] = new DateTime('1998-02-14 09:00:00');
373 $results[] = new DateTime('1998-03-14 09:00:00');
374 $results[] = new DateTime('1998-04-14 09:00:00');
375 $results[] = new DateTime('1998-05-14 09:00:00');
376 $results[] = new DateTime('1998-06-14 09:00:00');
377 $results[] = new DateTime('1998-07-14 09:00:00');
378 $results[] = new DateTime('1998-08-14 09:00:00');
379 $results[] = new DateTime('1998-09-14 09:00:00');
380 $results[] = new DateTime('1998-10-14 09:00:00');
381 $results[] = new DateTime('1998-11-14 09:00:00');
382 $results[] = new DateTime('1998-12-14 09:00:00');
383 $results[] = new DateTime('1999-01-14 09:00:00');
384
385 $r = new When();
386 $r->recur('19970914T090000')->count(17)->rrule('FREQ=MONTHLY');
387
388 foreach($results as $result)
389 {
390 $date = $r->next();
391 $this->assertEquals($result, $date);
392 }
393 }
394 }