3 require_once 'PHPUnit/Framework.php';
5 require_once './When.php';
7 class When_Monthly_Rrule_Test
extends PHPUnit_Framework_TestCase
10 * Monthly on the 1st Friday for ten occurrences:
11 * DTSTART;TZID=US-Eastern:19970905T090000
12 * RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
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');
28 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;COUNT=10;BYDAY=1FR');
30 foreach($results as $result)
32 $this->assertEquals($result, $r->next());
37 * Monthly on the 1st Friday until December 24, 1997:
38 * DTSTART;TZID=US-Eastern:19970905T090000
39 * RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
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');
49 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR');
51 foreach($results as $result)
53 $this->assertEquals($result, $r->next());
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
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');
76 $r->recur('19970905T090000')->rrule('FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU');
78 foreach($results as $result)
80 $this->assertEquals($result, $r->next());
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
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');
99 $r->recur('19970922T090000')->rrule('FREQ=MONTHLY;COUNT=6;BYDAY=-2MO');
101 foreach($results as $result)
103 $this->assertEquals($result, $r->next());
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
112 function testThirteen()
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');
122 $r->recur('19970902T090000')->count(6)->rrule('FREQ=MONTHLY;BYMONTHDAY=-3');
124 foreach($results as $result)
126 $this->assertEquals($result, $r->next());
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
135 function testFourteen()
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');
149 $r->recur('19970902T090000')->rrule('FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15');
151 foreach($results as $result)
153 $this->assertEquals($result, $r->next());
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
162 function testFifteen()
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');
176 $r->recur('19970930T090000')->rrule('RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1');
178 foreach($results as $result)
180 $this->assertEquals($result, $r->next());
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
189 function testSixteen()
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');
203 $r->recur('19970910T090000')->rrule('FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15');
205 foreach($results as $result)
207 $this->assertEquals($result, $r->next());
212 * Every Tuesday, every other month:
213 * DTSTART;TZID=US-Eastern:19970902T090000
214 * RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
216 function testSeventeen()
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');
238 $r->recur('19970902T090000')->count(18)->rrule('FREQ=MONTHLY;INTERVAL=2;BYDAY=TU');
240 foreach($results as $result)
242 $this->assertEquals($result, $r->next());
247 * Every Friday the 13th, forever:
248 * DTSTART;TZID=US-Eastern:19970902T090000
249 * RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
251 function testEighteen()
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');
260 $r->recur('19970902T090000')->count(5)->rrule('FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13');
262 foreach($results as $result)
264 $this->assertEquals($result, $r->next());
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
273 function testNineteen()
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');
287 $r->recur('19970913T090000')->count(10)->rrule('FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13');
289 foreach($results as $result)
291 $this->assertEquals($result, $r->next());
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
300 function testTwenty()
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');
307 $r->recur('19970904T090000')->rrule('FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3');
309 foreach($results as $result)
311 $this->assertEquals($result, $r->next());
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
320 function testTwentyOne()
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');
329 $r->recur('20070115T090000')->count(5)->rrule('FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5');
331 foreach($results as $result)
333 $this->assertEquals($result, $r->next());
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
342 function testTwentyTwo()
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');
353 $r->recur('19970929T090000')->count(7)->rrule('FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2');
355 foreach($results as $result)
357 $this->assertEquals($result, $r->next());
362 * The same day of every month:
365 function testTwentyThree()
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');
386 $r->recur('19970914T090000')->count(17)->rrule('FREQ=MONTHLY');
388 foreach($results as $result)
391 $this->assertEquals($result, $date);