commiting uncommited changes on live site
[weblabels.fsf.org.git] / crm.fsf.org / 20131203 / files / sites / all / modules-new / civicrm / packages / When / Tests / When_Yearly_Rrule_Test.php
1 <?php
2
3 require_once 'PHPUnit/Framework.php';
4
5 require_once './When.php';
6
7 class When_Rrule_Test extends PHPUnit_Framework_TestCase
8 {
9 /**
10 * DTSTART;TZID=US-Eastern:19970610T090000
11 * RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
12 */
13 public function testOne()
14 {
15 $results[] = new DateTime('1997-06-10 09:00:00');
16 $results[] = new DateTime('1997-07-10 09:00:00');
17 $results[] = new DateTime('1998-06-10 09:00:00');
18 $results[] = new DateTime('1998-07-10 09:00:00');
19 $results[] = new DateTime('1999-06-10 09:00:00');
20 $results[] = new DateTime('1999-07-10 09:00:00');
21 $results[] = new DateTime('2000-06-10 09:00:00');
22 $results[] = new DateTime('2000-07-10 09:00:00');
23 $results[] = new DateTime('2001-06-10 09:00:00');
24 $results[] = new DateTime('2001-07-10 09:00:00');
25
26 $r = new When();
27 $r->recur('19970610T090000')->rrule('FREQ=YEARLY;COUNT=10;BYMONTH=6,7');
28
29 foreach($results as $result)
30 {
31 $this->assertEquals($result, $r->next());
32 }
33 }
34
35 /**
36 * DTSTART;TZID=US-Eastern:19970101T090000
37 * RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
38 */
39 public function testTwo()
40 {
41 $results[] = new DateTime('1997-01-01 09:00:00');
42 $results[] = new DateTime('1997-04-10 09:00:00');
43 $results[] = new DateTime('1997-07-19 09:00:00');
44 $results[] = new DateTime('2000-01-01 09:00:00');
45 $results[] = new DateTime('2000-04-09 09:00:00');
46 $results[] = new DateTime('2000-07-18 09:00:00');
47 $results[] = new DateTime('2003-01-01 09:00:00');
48 $results[] = new DateTime('2003-04-10 09:00:00');
49 $results[] = new DateTime('2003-07-19 09:00:00');
50 $results[] = new DateTime('2006-01-01 09:00:00');
51
52 $r = new When();
53 $r->recur('19970101T090000')->rrule('FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200');
54
55 foreach($results as $result)
56 {
57 $this->assertEquals($result, $r->next());
58 }
59 }
60
61 /**
62 * DTSTART;TZID=US-Eastern:19970310T090000
63 * RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
64 */
65 public function testThree()
66 {
67 $results[] = new DateTime('1997-03-10 09:00:00');
68 $results[] = new DateTime('1999-01-10 09:00:00');
69 $results[] = new DateTime('1999-02-10 09:00:00');
70 $results[] = new DateTime('1999-03-10 09:00:00');
71 $results[] = new DateTime('2001-01-10 09:00:00');
72 $results[] = new DateTime('2001-02-10 09:00:00');
73 $results[] = new DateTime('2001-03-10 09:00:00');
74 $results[] = new DateTime('2003-01-10 09:00:00');
75 $results[] = new DateTime('2003-02-10 09:00:00');
76 $results[] = new DateTime('2003-03-10 09:00:00');
77
78 $r = new When();
79 $r->recur('19970310T090000')->rrule('FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3');
80
81 foreach($results as $result)
82 {
83 $this->assertEquals($result, $r->next());
84 }
85 }
86
87 /**
88 * DTSTART;TZID=US-Eastern:19980101T090000
89 * RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
90 */
91 public function testFour()
92 {
93 $results[] = new DateTime('1998-01-01 09:00:00');
94 $results[] = new DateTime('1998-01-02 09:00:00');
95 $results[] = new DateTime('1998-01-03 09:00:00');
96 $results[] = new DateTime('1998-01-04 09:00:00');
97 $results[] = new DateTime('1998-01-05 09:00:00');
98 $results[] = new DateTime('1998-01-06 09:00:00');
99 $results[] = new DateTime('1998-01-07 09:00:00');
100 $results[] = new DateTime('1998-01-08 09:00:00');
101 $results[] = new DateTime('1998-01-09 09:00:00');
102 $results[] = new DateTime('1998-01-10 09:00:00');
103 $results[] = new DateTime('1998-01-11 09:00:00');
104 $results[] = new DateTime('1998-01-12 09:00:00');
105 $results[] = new DateTime('1998-01-13 09:00:00');
106 $results[] = new DateTime('1998-01-14 09:00:00');
107 $results[] = new DateTime('1998-01-15 09:00:00');
108 $results[] = new DateTime('1998-01-16 09:00:00');
109 $results[] = new DateTime('1998-01-17 09:00:00');
110 $results[] = new DateTime('1998-01-18 09:00:00');
111 $results[] = new DateTime('1998-01-19 09:00:00');
112 $results[] = new DateTime('1998-01-20 09:00:00');
113 $results[] = new DateTime('1998-01-21 09:00:00');
114 $results[] = new DateTime('1998-01-22 09:00:00');
115 $results[] = new DateTime('1998-01-23 09:00:00');
116 $results[] = new DateTime('1998-01-24 09:00:00');
117 $results[] = new DateTime('1998-01-25 09:00:00');
118 $results[] = new DateTime('1998-01-26 09:00:00');
119 $results[] = new DateTime('1998-01-27 09:00:00');
120 $results[] = new DateTime('1998-01-28 09:00:00');
121 $results[] = new DateTime('1998-01-29 09:00:00');
122 $results[] = new DateTime('1998-01-30 09:00:00');
123 $results[] = new DateTime('1998-01-31 09:00:00');
124 $results[] = new DateTime('1999-01-01 09:00:00');
125 $results[] = new DateTime('1999-01-02 09:00:00');
126 $results[] = new DateTime('1999-01-03 09:00:00');
127 $results[] = new DateTime('1999-01-04 09:00:00');
128 $results[] = new DateTime('1999-01-05 09:00:00');
129 $results[] = new DateTime('1999-01-06 09:00:00');
130 $results[] = new DateTime('1999-01-07 09:00:00');
131 $results[] = new DateTime('1999-01-08 09:00:00');
132 $results[] = new DateTime('1999-01-09 09:00:00');
133 $results[] = new DateTime('1999-01-10 09:00:00');
134 $results[] = new DateTime('1999-01-11 09:00:00');
135 $results[] = new DateTime('1999-01-12 09:00:00');
136 $results[] = new DateTime('1999-01-13 09:00:00');
137 $results[] = new DateTime('1999-01-14 09:00:00');
138 $results[] = new DateTime('1999-01-15 09:00:00');
139 $results[] = new DateTime('1999-01-16 09:00:00');
140 $results[] = new DateTime('1999-01-17 09:00:00');
141 $results[] = new DateTime('1999-01-18 09:00:00');
142 $results[] = new DateTime('1999-01-19 09:00:00');
143 $results[] = new DateTime('1999-01-20 09:00:00');
144 $results[] = new DateTime('1999-01-21 09:00:00');
145 $results[] = new DateTime('1999-01-22 09:00:00');
146 $results[] = new DateTime('1999-01-23 09:00:00');
147 $results[] = new DateTime('1999-01-24 09:00:00');
148 $results[] = new DateTime('1999-01-25 09:00:00');
149 $results[] = new DateTime('1999-01-26 09:00:00');
150 $results[] = new DateTime('1999-01-27 09:00:00');
151 $results[] = new DateTime('1999-01-28 09:00:00');
152 $results[] = new DateTime('1999-01-29 09:00:00');
153 $results[] = new DateTime('1999-01-30 09:00:00');
154 $results[] = new DateTime('1999-01-31 09:00:00');
155 $results[] = new DateTime('2000-01-01 09:00:00');
156 $results[] = new DateTime('2000-01-02 09:00:00');
157 $results[] = new DateTime('2000-01-03 09:00:00');
158 $results[] = new DateTime('2000-01-04 09:00:00');
159 $results[] = new DateTime('2000-01-05 09:00:00');
160 $results[] = new DateTime('2000-01-06 09:00:00');
161 $results[] = new DateTime('2000-01-07 09:00:00');
162 $results[] = new DateTime('2000-01-08 09:00:00');
163 $results[] = new DateTime('2000-01-09 09:00:00');
164 $results[] = new DateTime('2000-01-10 09:00:00');
165 $results[] = new DateTime('2000-01-11 09:00:00');
166 $results[] = new DateTime('2000-01-12 09:00:00');
167 $results[] = new DateTime('2000-01-13 09:00:00');
168 $results[] = new DateTime('2000-01-14 09:00:00');
169 $results[] = new DateTime('2000-01-15 09:00:00');
170 $results[] = new DateTime('2000-01-16 09:00:00');
171 $results[] = new DateTime('2000-01-17 09:00:00');
172 $results[] = new DateTime('2000-01-18 09:00:00');
173 $results[] = new DateTime('2000-01-19 09:00:00');
174 $results[] = new DateTime('2000-01-20 09:00:00');
175 $results[] = new DateTime('2000-01-21 09:00:00');
176 $results[] = new DateTime('2000-01-22 09:00:00');
177 $results[] = new DateTime('2000-01-23 09:00:00');
178 $results[] = new DateTime('2000-01-24 09:00:00');
179 $results[] = new DateTime('2000-01-25 09:00:00');
180 $results[] = new DateTime('2000-01-26 09:00:00');
181 $results[] = new DateTime('2000-01-27 09:00:00');
182 $results[] = new DateTime('2000-01-28 09:00:00');
183 $results[] = new DateTime('2000-01-29 09:00:00');
184 $results[] = new DateTime('2000-01-30 09:00:00');
185 $results[] = new DateTime('2000-01-31 09:00:00');
186
187 $r = new When();
188 $r->recur('19980101T090000')->rrule('FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA');
189
190 foreach($results as $result)
191 {
192 $this->assertEquals($result, $r->next());
193 }
194 }
195
196 /**
197 * Monday of week number 20 (where the default start of the week is Monday), forever:
198 * DTSTART;TZID=US-Eastern:19970512T090000
199 * RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO
200 * Results limited to first 10 since this has no enddate or count.
201 */
202 function testFive()
203 {
204 $results[] = new DateTime('1997-05-12 09:00:00');
205 $results[] = new DateTime('1998-05-11 09:00:00');
206 $results[] = new DateTime('1999-05-17 09:00:00');
207 $results[] = new DateTime('2000-05-15 09:00:00');
208 $results[] = new DateTime('2001-05-14 09:00:00');
209 $results[] = new DateTime('2002-05-13 09:00:00');
210 $results[] = new DateTime('2003-05-12 09:00:00');
211 $results[] = new DateTime('2004-05-10 09:00:00');
212 $results[] = new DateTime('2005-05-16 09:00:00');
213 $results[] = new DateTime('2006-05-15 09:00:00');
214
215 $r = new When();
216 $r->recur('19970512T090000')->count(10)->rrule('FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO');
217
218 foreach($results as $result)
219 {
220 $this->assertEquals($result, $r->next());
221 }
222 }
223
224 /**
225 * Every Thursday in March, forever:
226 * DTSTART;TZID=US-Eastern:19970313T090000
227 * RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH
228 */
229 function testSix()
230 {
231 $results[] = new DateTime('1997-03-13 09:00:00');
232 $results[] = new DateTime('1997-03-20 09:00:00');
233 $results[] = new DateTime('1997-03-27 09:00:00');
234 $results[] = new DateTime('1998-03-05 09:00:00');
235 $results[] = new DateTime('1998-03-12 09:00:00');
236 $results[] = new DateTime('1998-03-19 09:00:00');
237 $results[] = new DateTime('1998-03-26 09:00:00');
238 $results[] = new DateTime('1999-03-04 09:00:00');
239 $results[] = new DateTime('1999-03-11 09:00:00');
240 $results[] = new DateTime('1999-03-18 09:00:00');
241
242 $r = new When();
243 $r->recur('19970313T090000')->count(10)->rrule('FREQ=YEARLY;BYMONTH=3;BYDAY=TH');
244
245 foreach($results as $result)
246 {
247 $this->assertEquals($result, $r->next());
248 }
249 }
250
251 /**
252 * Every Thursday, but only during June, July, and August, forever:
253 * DTSTART;TZID=US-Eastern:19970605T090000
254 * RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
255 */
256 function testSeven()
257 {
258 $results[] = new DateTime('1997-06-05 09:00:00');
259 $results[] = new DateTime('1997-06-12 09:00:00');
260 $results[] = new DateTime('1997-06-19 09:00:00');
261 $results[] = new DateTime('1997-06-26 09:00:00');
262 $results[] = new DateTime('1997-07-03 09:00:00');
263 $results[] = new DateTime('1997-07-10 09:00:00');
264 $results[] = new DateTime('1997-07-17 09:00:00');
265 $results[] = new DateTime('1997-07-24 09:00:00');
266 $results[] = new DateTime('1997-07-31 09:00:00');
267 $results[] = new DateTime('1997-08-07 09:00:00');
268 $results[] = new DateTime('1997-08-14 09:00:00');
269 $results[] = new DateTime('1997-08-21 09:00:00');
270 $results[] = new DateTime('1997-08-28 09:00:00');
271 $results[] = new DateTime('1998-06-04 09:00:00');
272 $results[] = new DateTime('1998-06-11 09:00:00');
273 $results[] = new DateTime('1998-06-18 09:00:00');
274 $results[] = new DateTime('1998-06-25 09:00:00');
275 $results[] = new DateTime('1998-07-02 09:00:00');
276 $results[] = new DateTime('1998-07-09 09:00:00');
277 $results[] = new DateTime('1998-07-16 09:00:00');
278 $results[] = new DateTime('1998-07-23 09:00:00');
279 $results[] = new DateTime('1998-07-30 09:00:00');
280 $results[] = new DateTime('1998-08-06 09:00:00');
281 $results[] = new DateTime('1998-08-13 09:00:00');
282 $results[] = new DateTime('1998-08-20 09:00:00');
283 $results[] = new DateTime('1998-08-27 09:00:00');
284 $results[] = new DateTime('1999-06-03 09:00:00');
285 $results[] = new DateTime('1999-06-10 09:00:00');
286 $results[] = new DateTime('1999-06-17 09:00:00');
287 $results[] = new DateTime('1999-06-24 09:00:00');
288 $results[] = new DateTime('1999-07-01 09:00:00');
289 $results[] = new DateTime('1999-07-08 09:00:00');
290 $results[] = new DateTime('1999-07-15 09:00:00');
291 $results[] = new DateTime('1999-07-22 09:00:00');
292 $results[] = new DateTime('1999-07-29 09:00:00');
293 $results[] = new DateTime('1999-08-05 09:00:00');
294 $results[] = new DateTime('1999-08-12 09:00:00');
295 $results[] = new DateTime('1999-08-19 09:00:00');
296 $results[] = new DateTime('1999-08-26 09:00:00');
297
298 $r = new When();
299 $r->recur('19970605T090000')->count(39)->rrule('FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8');
300
301 foreach($results as $result)
302 {
303 $this->assertEquals($result, $r->next());
304 }
305 }
306
307 /**
308 * Every four years, the first Tuesday after a Monday in November, forever (U.S. Presidential Election day):
309 * DTSTART;TZID=US-Eastern:19961105T090000
310 * RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8
311 */
312 function testEight()
313 {
314 $results[] = new DateTime('1996-11-05 09:00:00');
315 $results[] = new DateTime('2000-11-07 09:00:00');
316 $results[] = new DateTime('2004-11-02 09:00:00');
317 $results[] = new DateTime('2008-11-04 09:00:00');
318 $results[] = new DateTime('2012-11-06 09:00:00');
319 $results[] = new DateTime('2016-11-08 09:00:00');
320 $results[] = new DateTime('2020-11-03 09:00:00');
321 $results[] = new DateTime('2024-11-05 09:00:00');
322 $results[] = new DateTime('2028-11-07 09:00:00');
323 $results[] = new DateTime('2032-11-02 09:00:00');
324
325 $r = new When();
326 $r->recur('19961105T090000')->count(10)->rrule('FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8');
327
328 foreach($results as $result)
329 {
330 $this->assertEquals($result, $r->next());
331 }
332 }
333
334 /**
335 * Every third year on the 1st, 100th, and 200th day for 10 occurrences:
336 * DTSTART;TZID=America/New_York:19970101T090000
337 * RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
338 */
339 function testTwentyThree()
340 {
341 $results[] = new DateTime('1997-01-01 09:00:00');
342 $results[] = new DateTime('1997-04-10 09:00:00');
343 $results[] = new DateTime('1997-07-19 09:00:00');
344 $results[] = new DateTime('2000-01-01 09:00:00');
345 $results[] = new DateTime('2000-04-09 09:00:00');
346 $results[] = new DateTime('2000-07-18 09:00:00');
347 $results[] = new DateTime('2003-01-01 09:00:00');
348 $results[] = new DateTime('2003-04-10 09:00:00');
349 $results[] = new DateTime('2003-07-19 09:00:00');
350 $results[] = new DateTime('2006-01-01 09:00:00');
351
352 $r = new When();
353 $r->recur('19970101T090000')->rrule('FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200');
354
355 foreach($results as $result)
356 {
357 $this->assertEquals($result, $r->next());
358 }
359 }
360
361 /**
362 * Every year on the -1th, -100th, and -200th day for 5 occurrences (checked via google calendar import below)
363 * BEGIN:VCALENDAR
364 * PRODID:-//Google Inc//Google Calendar 70.9054//EN
365 * VERSION:2.0
366 * CALSCALE:GREGORIAN
367 * METHOD:PUBLISH
368 * BEGIN:VTIMEZONE
369 * TZID:America/New_York
370 * X-LIC-LOCATION:America/New_York
371 * BEGIN:DAYLIGHT
372 * TZOFFSETFROM:-0500
373 * TZOFFSETTO:-0400
374 * TZNAME:EDT
375 * DTSTART:19700308T020000
376 * RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
377 * END:DAYLIGHT
378 * BEGIN:STANDARD
379 * TZOFFSETFROM:-0400
380 * TZOFFSETTO:-0500
381 * TZNAME:EST
382 * DTSTART:19701101T020000
383 * RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
384 * END:STANDARD
385 * END:VTIMEZONE
386 * BEGIN:VEVENT
387 * DTSTART;VALUE=DATE:20101231
388 * RRULE:FREQ=YEARLY;COUNT=5;BYYEARDAY=-1,-100,-200
389 * DTSTAMP:20101231T090000
390 * CREATED:20101231T090000
391 * DESCRIPTION:
392 * LAST-MODIFIED:20101231T090000
393 * LOCATION:
394 * SEQUENCE:2
395 * STATUS:CONFIRMED
396 * SUMMARY:testing yearly event
397 * TRANSP:TRANSPARENT
398 * END:VEVENT
399 * END:VCALENDAR
400 */
401 function testTwentyFour()
402 {
403 $results[] = new DateTime('2010-12-31 09:00:00');
404 $results[] = new DateTime('2010-09-23 09:00:00');
405 $results[] = new DateTime('2010-06-15 09:00:00');
406 $results[] = new DateTime('2011-12-31 09:00:00');
407 $results[] = new DateTime('2011-09-23 09:00:00');
408
409 $r = new When();
410 $r->recur('20101231T090000')->rrule('FREQ=YEARLY;COUNT=5;BYYEARDAY=-1,-100,-200');
411
412 foreach($results as $result)
413 {
414 $this->assertEquals($result, $r->next());
415 }
416 }
417
418 function testTwentyFive()
419 {
420 $results[] = new DateTime('2010-01-15 09:00:00');
421 $results[] = new DateTime('2011-01-15 09:00:00');
422 $results[] = new DateTime('2012-01-15 09:00:00');
423 $results[] = new DateTime('2013-01-15 09:00:00');
424 $results[] = new DateTime('2014-01-15 09:00:00');
425 $results[] = new DateTime('2015-01-15 09:00:00');
426
427 $r = new When();
428 $r->recur('20100115T090000')->rrule('FREQ=YEARLY');
429
430 foreach($results as $result)
431 {
432 $this->assertEquals($result, $r->next());
433 }
434 }
435 }