comparison vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MainTest.php @ 7:430dbd5346f7

vendor sabre as distributed
author Charlie Root
date Sat, 13 Jan 2018 09:06:10 -0500
parents
children
comparison
equal deleted inserted replaced
6:cec75ba50afc 7:430dbd5346f7
1 <?php
2
3 namespace Sabre\VObject\EventIterator;
4
5 use DateTime;
6 use DateTimeZone;
7 use Sabre\VObject\Recur\EventIterator;
8 use Sabre\VObject\Component\VCalendar;
9
10 class MainTest extends \PHPUnit_Framework_TestCase {
11
12 function testValues() {
13
14 $vcal = new VCalendar();
15 $ev = $vcal->createComponent('VEVENT');
16 $ev->UID = 'bla';
17 $ev->RRULE = 'FREQ=DAILY;BYHOUR=10;BYMINUTE=5;BYSECOND=16;BYWEEKNO=32;BYYEARDAY=100,200';
18 $dtStart = $vcal->createProperty('DTSTART');
19 $dtStart->setDateTime(new DateTime('2011-10-07'));
20
21 $ev->add($dtStart);
22
23 $vcal->add($ev);
24
25 $it = new EventIterator($vcal,(string)$ev->uid);
26
27 $this->assertTrue($it->isInfinite());
28
29 }
30
31 /**
32 * @expectedException InvalidArgumentException
33 * @depends testValues
34 */
35 function testInvalidFreq() {
36
37 $vcal = new VCalendar();
38 $ev = $vcal->createComponent('VEVENT');
39 $ev->RRULE = 'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z';
40 $ev->UID = 'foo';
41 $dtStart = $vcal->createProperty('DTSTART');
42 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
43
44 $ev->add($dtStart);
45 $vcal->add($ev);
46
47 $it = new EventIterator($vcal,(string)$ev->uid);
48
49 }
50
51 /**
52 * @expectedException InvalidArgumentException
53 */
54 function testVCalendarNoUID() {
55
56 $vcal = new VCalendar();
57 $it = new EventIterator($vcal);
58
59 }
60
61 /**
62 * @expectedException InvalidArgumentException
63 */
64 function testVCalendarInvalidUID() {
65
66 $vcal = new VCalendar();
67 $it = new EventIterator($vcal,'foo');
68
69 }
70
71 /**
72 * @depends testValues
73 */
74 function testHourly() {
75
76 $vcal = new VCalendar();
77 $ev = $vcal->createComponent('VEVENT');
78
79 $ev->UID = 'bla';
80 $ev->RRULE = 'FREQ=HOURLY;INTERVAL=3;UNTIL=20111025T000000Z';
81 $dtStart = $vcal->createProperty('DTSTART');
82 $dtStart->setDateTime(new DateTime('2011-10-07 12:00:00', new DateTimeZone('UTC')));
83
84 $ev->add($dtStart);
85 $vcal->add($ev);
86
87 $it = new EventIterator($vcal,$ev->uid);
88
89 // Max is to prevent overflow
90 $max = 12;
91 $result = array();
92 foreach($it as $item) {
93
94 $result[] = $item;
95 $max--;
96
97 if (!$max) break;
98
99 }
100
101 $tz = new DateTimeZone('UTC');
102
103 $this->assertEquals(
104 array(
105 new DateTime('2011-10-07 12:00:00', $tz),
106 new DateTime('2011-10-07 15:00:00', $tz),
107 new DateTime('2011-10-07 18:00:00', $tz),
108 new DateTime('2011-10-07 21:00:00', $tz),
109 new DateTime('2011-10-08 00:00:00', $tz),
110 new DateTime('2011-10-08 03:00:00', $tz),
111 new DateTime('2011-10-08 06:00:00', $tz),
112 new DateTime('2011-10-08 09:00:00', $tz),
113 new DateTime('2011-10-08 12:00:00', $tz),
114 new DateTime('2011-10-08 15:00:00', $tz),
115 new DateTime('2011-10-08 18:00:00', $tz),
116 new DateTime('2011-10-08 21:00:00', $tz),
117 ),
118 $result
119 );
120
121 }
122
123 /**
124 * @depends testValues
125 */
126 function testDaily() {
127
128 $vcal = new VCalendar();
129 $ev = $vcal->createComponent('VEVENT');
130
131 $ev->UID = 'bla';
132 $ev->RRULE = 'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z';
133 $dtStart = $vcal->createProperty('DTSTART');
134 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
135
136 $ev->add($dtStart);
137
138 $vcal->add($ev);
139
140 $it = new EventIterator($vcal,$ev->uid);
141
142 // Max is to prevent overflow
143 $max = 12;
144 $result = array();
145 foreach($it as $item) {
146
147 $result[] = $item;
148 $max--;
149
150 if (!$max) break;
151
152 }
153
154 $tz = new DateTimeZone('UTC');
155
156 $this->assertEquals(
157 array(
158 new DateTime('2011-10-07', $tz),
159 new DateTime('2011-10-10', $tz),
160 new DateTime('2011-10-13', $tz),
161 new DateTime('2011-10-16', $tz),
162 new DateTime('2011-10-19', $tz),
163 new DateTime('2011-10-22', $tz),
164 new DateTime('2011-10-25', $tz),
165 ),
166 $result
167 );
168
169 }
170
171 /**
172 * @depends testValues
173 */
174 function testNoRRULE() {
175
176 $vcal = new VCalendar();
177 $ev = $vcal->createComponent('VEVENT');
178
179 $ev->UID = 'bla';
180 $dtStart = $vcal->createProperty('DTSTART');
181 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
182
183 $ev->add($dtStart);
184
185 $vcal->add($ev);
186
187 $it = new EventIterator($vcal,$ev->uid);
188
189 // Max is to prevent overflow
190 $max = 12;
191 $result = array();
192 foreach($it as $item) {
193
194 $result[] = $item;
195 $max--;
196
197 if (!$max) break;
198
199 }
200
201 $tz = new DateTimeZone('UTC');
202
203 $this->assertEquals(
204 array(
205 new DateTime('2011-10-07', $tz),
206 ),
207 $result
208 );
209
210 }
211
212 /**
213 * @depends testValues
214 */
215 function testDailyByDayByHour() {
216
217 $vcal = new VCalendar();
218 $ev = $vcal->createComponent('VEVENT');
219
220 $ev->UID = 'bla';
221 $ev->RRULE = 'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7';
222 $dtStart = $vcal->createProperty('DTSTART');
223 $dtStart->setDateTime(new DateTime('2011-10-08 06:00:00', new DateTimeZone('UTC')));
224
225 $ev->add($dtStart);
226
227 $vcal->add($ev);
228
229 $it = new EventIterator($vcal,(string)$ev->uid);
230
231 // Grabbing the next 12 items
232 $max = 12;
233 $result = array();
234 foreach($it as $item) {
235
236 $result[] = $item;
237 $max--;
238
239 if (!$max) break;
240
241 }
242
243 $tz = new DateTimeZone('UTC');
244
245 $this->assertEquals(
246 array(
247 new datetime('2011-10-08 06:00:00', $tz),
248 new datetime('2011-10-08 07:00:00', $tz),
249 new datetime('2011-10-09 06:00:00', $tz),
250 new datetime('2011-10-09 07:00:00', $tz),
251 new datetime('2011-10-15 06:00:00', $tz),
252 new datetime('2011-10-15 07:00:00', $tz),
253 new datetime('2011-10-16 06:00:00', $tz),
254 new datetime('2011-10-16 07:00:00', $tz),
255 new datetime('2011-10-22 06:00:00', $tz),
256 new datetime('2011-10-22 07:00:00', $tz),
257 new datetime('2011-10-23 06:00:00', $tz),
258 new datetime('2011-10-23 07:00:00', $tz),
259 ),
260 $result
261 );
262
263 }
264
265 /**
266 * @depends testValues
267 */
268 function testDailyByHour() {
269
270 $vcal = new VCalendar();
271 $ev = $vcal->createComponent('VEVENT');
272
273 $ev->UID = 'bla';
274 $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15';
275 $dtStart = $vcal->createProperty('DTSTART');
276 $dtStart->setDateTime(new DateTime('2012-10-11 12:00:00', new DateTimeZone('UTC')));
277
278 $ev->add($dtStart);
279
280 $vcal->add($ev);
281
282 $it = new EventIterator($vcal,(string)$ev->uid);
283
284 // Grabbing the next 12 items
285 $max = 12;
286 $result = array();
287 foreach($it as $item) {
288
289 $result[] = $item;
290 $max--;
291
292 if (!$max) break;
293
294 }
295
296 $tz = new DateTimeZone('UTC');
297
298 $this->assertEquals(
299 array(
300 new datetime('2012-10-11 12:00:00', $tz),
301 new datetime('2012-10-11 13:00:00', $tz),
302 new datetime('2012-10-11 14:00:00', $tz),
303 new datetime('2012-10-11 15:00:00', $tz),
304 new datetime('2012-10-13 10:00:00', $tz),
305 new datetime('2012-10-13 11:00:00', $tz),
306 new datetime('2012-10-13 12:00:00', $tz),
307 new datetime('2012-10-13 13:00:00', $tz),
308 new datetime('2012-10-13 14:00:00', $tz),
309 new datetime('2012-10-13 15:00:00', $tz),
310 new datetime('2012-10-15 10:00:00', $tz),
311 new datetime('2012-10-15 11:00:00', $tz),
312 ),
313 $result
314 );
315
316 }
317
318 /**
319 * @depends testValues
320 */
321 function testDailyByDay() {
322
323 $vcal = new VCalendar();
324 $ev = $vcal->createComponent('VEVENT');
325
326 $ev->UID = 'bla';
327 $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR';
328 $dtStart = $vcal->createProperty('DTSTART');
329 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
330
331 $ev->add($dtStart);
332
333 $vcal->add($ev);
334
335 $it = new EventIterator($vcal,(string)$ev->uid);
336
337 // Grabbing the next 12 items
338 $max = 12;
339 $result = array();
340 foreach($it as $item) {
341
342 $result[] = $item;
343 $max--;
344
345 if (!$max) break;
346
347 }
348
349 $tz = new DateTimeZone('UTC');
350
351 $this->assertEquals(
352 array(
353 new DateTime('2011-10-07', $tz),
354 new DateTime('2011-10-11', $tz),
355 new DateTime('2011-10-19', $tz),
356 new DateTime('2011-10-21', $tz),
357 new DateTime('2011-10-25', $tz),
358 new DateTime('2011-11-02', $tz),
359 new DateTime('2011-11-04', $tz),
360 new DateTime('2011-11-08', $tz),
361 new DateTime('2011-11-16', $tz),
362 new DateTime('2011-11-18', $tz),
363 new DateTime('2011-11-22', $tz),
364 new DateTime('2011-11-30', $tz),
365 ),
366 $result
367 );
368
369 }
370
371 /**
372 * @depends testValues
373 */
374 function testWeekly() {
375
376 $vcal = new VCalendar();
377 $ev = $vcal->createComponent('VEVENT');
378
379 $ev->UID = 'bla';
380 $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;COUNT=10';
381 $dtStart = $vcal->createProperty('DTSTART');
382 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
383
384 $ev->add($dtStart);
385
386 $vcal->add($ev);
387
388 $it = new EventIterator($vcal,(string)$ev->uid);
389
390 // Max is to prevent overflow
391 $max = 12;
392 $result = array();
393 foreach($it as $item) {
394
395 $result[] = $item;
396 $max--;
397
398 if (!$max) break;
399
400 }
401
402 $tz = new DateTimeZone('UTC');
403
404 $this->assertEquals(
405 array(
406 new DateTime('2011-10-07', $tz),
407 new DateTime('2011-10-21', $tz),
408 new DateTime('2011-11-04', $tz),
409 new DateTime('2011-11-18', $tz),
410 new DateTime('2011-12-02', $tz),
411 new DateTime('2011-12-16', $tz),
412 new DateTime('2011-12-30', $tz),
413 new DateTime('2012-01-13', $tz),
414 new DateTime('2012-01-27', $tz),
415 new DateTime('2012-02-10', $tz),
416 ),
417 $result
418 );
419
420 }
421
422 /**
423 * @depends testValues
424 */
425 function testWeeklyByDayByHour() {
426
427 $vcal = new VCalendar();
428 $ev = $vcal->createComponent('VEVENT');
429
430 $ev->UID = 'bla';
431 $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10';
432 $dtStart = $vcal->createProperty('DTSTART');
433 $dtStart->setDateTime(new DateTime('2011-10-07 08:00:00', new DateTimeZone('UTC')));
434
435 $ev->add($dtStart);
436
437 $vcal->add($ev);
438
439 $it = new EventIterator($vcal,(string)$ev->uid);
440
441 // Grabbing the next 12 items
442 $max = 15;
443 $result = array();
444 foreach($it as $item) {
445
446 $result[] = $item;
447 $max--;
448
449 if (!$max) break;
450
451 }
452
453 $tz = new DateTimeZone('UTC');
454
455 $this->assertEquals(
456 array(
457 new DateTime('2011-10-07 08:00:00', $tz),
458 new DateTime('2011-10-07 09:00:00', $tz),
459 new DateTime('2011-10-07 10:00:00', $tz),
460 new DateTime('2011-10-18 08:00:00', $tz),
461 new DateTime('2011-10-18 09:00:00', $tz),
462 new DateTime('2011-10-18 10:00:00', $tz),
463 new DateTime('2011-10-19 08:00:00', $tz),
464 new DateTime('2011-10-19 09:00:00', $tz),
465 new DateTime('2011-10-19 10:00:00', $tz),
466 new DateTime('2011-10-21 08:00:00', $tz),
467 new DateTime('2011-10-21 09:00:00', $tz),
468 new DateTime('2011-10-21 10:00:00', $tz),
469 new DateTime('2011-11-01 08:00:00', $tz),
470 new DateTime('2011-11-01 09:00:00', $tz),
471 new DateTime('2011-11-01 10:00:00', $tz),
472 ),
473 $result
474 );
475
476 }
477
478 /**
479 * @depends testValues
480 */
481 function testWeeklyByDaySpecificHour() {
482
483 $vcal = new VCalendar();
484 $ev = $vcal->createComponent('VEVENT');
485
486 $ev->UID = 'bla';
487 $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
488 $dtStart = $vcal->createProperty('DTSTART');
489 $dtStart->setDateTime(new DateTime('2011-10-07 18:00:00', new DateTimeZone('UTC')));
490
491 $ev->add($dtStart);
492
493 $vcal->add($ev);
494
495 $it = new EventIterator($vcal,(string)$ev->uid);
496
497 // Grabbing the next 12 items
498 $max = 12;
499 $result = array();
500 foreach($it as $item) {
501
502 $result[] = $item;
503 $max--;
504
505 if (!$max) break;
506
507 }
508
509 $tz = new DateTimeZone('UTC');
510
511 $this->assertEquals(
512 array(
513 new DateTime('2011-10-07 18:00:00', $tz),
514 new DateTime('2011-10-18 18:00:00', $tz),
515 new DateTime('2011-10-19 18:00:00', $tz),
516 new DateTime('2011-10-21 18:00:00', $tz),
517 new DateTime('2011-11-01 18:00:00', $tz),
518 new DateTime('2011-11-02 18:00:00', $tz),
519 new DateTime('2011-11-04 18:00:00', $tz),
520 new DateTime('2011-11-15 18:00:00', $tz),
521 new DateTime('2011-11-16 18:00:00', $tz),
522 new DateTime('2011-11-18 18:00:00', $tz),
523 new DateTime('2011-11-29 18:00:00', $tz),
524 new DateTime('2011-11-30 18:00:00', $tz),
525 ),
526 $result
527 );
528
529 }
530
531 /**
532 * @depends testValues
533 */
534 function testWeeklyByDay() {
535
536 $vcal = new VCalendar();
537 $ev = $vcal->createComponent('VEVENT');
538
539 $ev->UID = 'bla';
540 $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
541 $dtStart = $vcal->createProperty('DTSTART');
542 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
543
544 $ev->add($dtStart);
545
546 $vcal->add($ev);
547
548 $it = new EventIterator($vcal,(string)$ev->uid);
549
550 // Grabbing the next 12 items
551 $max = 12;
552 $result = array();
553 foreach($it as $item) {
554
555 $result[] = $item;
556 $max--;
557
558 if (!$max) break;
559
560 }
561
562 $tz = new DateTimeZone('UTC');
563
564 $this->assertEquals(
565 array(
566 new DateTime('2011-10-07', $tz),
567 new DateTime('2011-10-18', $tz),
568 new DateTime('2011-10-19', $tz),
569 new DateTime('2011-10-21', $tz),
570 new DateTime('2011-11-01', $tz),
571 new DateTime('2011-11-02', $tz),
572 new DateTime('2011-11-04', $tz),
573 new DateTime('2011-11-15', $tz),
574 new DateTime('2011-11-16', $tz),
575 new DateTime('2011-11-18', $tz),
576 new DateTime('2011-11-29', $tz),
577 new DateTime('2011-11-30', $tz),
578 ),
579 $result
580 );
581
582 }
583
584 /**
585 * @depends testValues
586 */
587 function testMonthly() {
588
589 $vcal = new VCalendar();
590 $ev = $vcal->createComponent('VEVENT');
591
592 $ev->UID = 'bla';
593 $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=3;COUNT=5';
594 $dtStart = $vcal->createProperty('DTSTART');
595 $dtStart->setDateTime(new DateTime('2011-12-05', new DateTimeZone('UTC')));
596
597 $ev->add($dtStart);
598
599 $vcal->add($ev);
600
601 $it = new EventIterator($vcal,(string)$ev->uid);
602
603 $max = 14;
604 $result = array();
605 foreach($it as $item) {
606
607 $result[] = $item;
608 $max--;
609
610 if (!$max) break;
611
612 }
613
614 $tz = new DateTimeZone('UTC');
615
616 $this->assertEquals(
617 array(
618 new DateTime('2011-12-05', $tz),
619 new DateTime('2012-03-05', $tz),
620 new DateTime('2012-06-05', $tz),
621 new DateTime('2012-09-05', $tz),
622 new DateTime('2012-12-05', $tz),
623 ),
624 $result
625 );
626
627
628 }
629
630 /**
631 * @depends testValues
632 */
633 function testMonthlyEndOfMonth() {
634
635 $vcal = new VCalendar();
636 $ev = $vcal->createComponent('VEVENT');
637
638 $ev->UID = 'bla';
639 $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=12';
640 $dtStart = $vcal->createProperty('DTSTART');
641 $dtStart->setDateTime(new DateTime('2011-12-31', new DateTimeZone('UTC')));
642
643 $ev->add($dtStart);
644
645 $vcal->add($ev);
646
647 $it = new EventIterator($vcal,(string)$ev->uid);
648
649 $max = 14;
650 $result = array();
651 foreach($it as $item) {
652
653 $result[] = $item;
654 $max--;
655
656 if (!$max) break;
657
658 }
659
660 $tz = new DateTimeZone('UTC');
661
662 $this->assertEquals(
663 array(
664 new DateTime('2011-12-31', $tz),
665 new DateTime('2012-08-31', $tz),
666 new DateTime('2012-10-31', $tz),
667 new DateTime('2012-12-31', $tz),
668 new DateTime('2013-08-31', $tz),
669 new DateTime('2013-10-31', $tz),
670 new DateTime('2013-12-31', $tz),
671 new DateTime('2014-08-31', $tz),
672 new DateTime('2014-10-31', $tz),
673 new DateTime('2014-12-31', $tz),
674 new DateTime('2015-08-31', $tz),
675 new DateTime('2015-10-31', $tz),
676 ),
677 $result
678 );
679
680
681 }
682
683 /**
684 * @depends testValues
685 */
686 function testMonthlyByMonthDay() {
687
688 $vcal = new VCalendar();
689 $ev = $vcal->createComponent('VEVENT');
690
691 $ev->UID = 'bla';
692 $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7';
693 $dtStart = $vcal->createProperty('DTSTART');
694 $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')));
695
696 $ev->add($dtStart);
697
698 $vcal->add($ev);
699
700 $it = new EventIterator($vcal,(string)$ev->uid);
701
702 $max = 14;
703 $result = array();
704 foreach($it as $item) {
705
706 $result[] = $item;
707 $max--;
708
709 if (!$max) break;
710
711 }
712
713 $tz = new DateTimeZone('UTC');
714
715 $this->assertEquals(
716 array(
717 new DateTime('2011-01-01', $tz),
718 new DateTime('2011-01-25', $tz),
719 new DateTime('2011-01-31', $tz),
720 new DateTime('2011-06-01', $tz),
721 new DateTime('2011-06-24', $tz),
722 new DateTime('2011-11-01', $tz),
723 new DateTime('2011-11-24', $tz),
724 new DateTime('2012-04-01', $tz),
725 new DateTime('2012-04-24', $tz),
726 ),
727 $result
728 );
729
730 }
731
732 /**
733 * A pretty slow test. Had to be marked as 'medium' for phpunit to not die
734 * after 1 second. Would be good to optimize later.
735 *
736 * @depends testValues
737 * @medium
738 */
739 function testMonthlyByDay() {
740
741 $vcal = new VCalendar();
742 $ev = $vcal->createComponent('VEVENT');
743
744 $ev->UID = 'bla';
745 $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH';
746 $dtStart = $vcal->createProperty('DTSTART');
747 $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')));
748
749 $ev->add($dtStart);
750
751 $vcal->add($ev);
752
753 $it = new EventIterator($vcal,(string)$ev->uid);
754
755 $max = 20;
756 $result = array();
757 foreach($it as $k=>$item) {
758
759 $result[] = $item;
760 $max--;
761
762 if (!$max) break;
763
764 }
765
766 $tz = new DateTimeZone('UTC');
767
768 $this->assertEquals(
769 array(
770 new DateTime('2011-01-03', $tz),
771 new DateTime('2011-01-05', $tz),
772 new DateTime('2011-01-10', $tz),
773 new DateTime('2011-01-17', $tz),
774 new DateTime('2011-01-18', $tz),
775 new DateTime('2011-01-20', $tz),
776 new DateTime('2011-01-24', $tz),
777 new DateTime('2011-01-31', $tz),
778 new DateTime('2011-03-02', $tz),
779 new DateTime('2011-03-07', $tz),
780 new DateTime('2011-03-14', $tz),
781 new DateTime('2011-03-17', $tz),
782 new DateTime('2011-03-21', $tz),
783 new DateTime('2011-03-22', $tz),
784 new DateTime('2011-03-28', $tz),
785 new DateTime('2011-05-02', $tz),
786 ),
787 $result
788 );
789
790 }
791
792 /**
793 * @depends testValues
794 */
795 function testMonthlyByDayByMonthDay() {
796
797 $vcal = new VCalendar();
798 $ev = $vcal->createComponent('VEVENT');
799
800 $ev->UID = 'bla';
801 $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1';
802 $dtStart = $vcal->createProperty('DTSTART');
803 $dtStart->setDateTime(new DateTime('2011-08-01', new DateTimeZone('UTC')));
804
805 $ev->add($dtStart);
806
807 $vcal->add($ev);
808
809 $it = new EventIterator($vcal,(string)$ev->uid);
810
811 $max = 20;
812 $result = array();
813 foreach($it as $k=>$item) {
814
815 $result[] = $item;
816 $max--;
817
818 if (!$max) break;
819
820 }
821
822 $tz = new DateTimeZone('UTC');
823
824 $this->assertEquals(
825 array(
826 new DateTime('2011-08-01', $tz),
827 new DateTime('2012-10-01', $tz),
828 new DateTime('2013-04-01', $tz),
829 new DateTime('2013-07-01', $tz),
830 new DateTime('2014-09-01', $tz),
831 new DateTime('2014-12-01', $tz),
832 new DateTime('2015-06-01', $tz),
833 new DateTime('2016-02-01', $tz),
834 new DateTime('2016-08-01', $tz),
835 new DateTime('2017-05-01', $tz),
836 ),
837 $result
838 );
839
840 }
841
842 /**
843 * @depends testValues
844 */
845 function testMonthlyByDayBySetPos() {
846
847 $vcal = new VCalendar();
848 $ev = $vcal->createComponent('VEVENT');
849
850 $ev->UID = 'bla';
851 $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1';
852 $dtStart = $vcal->createProperty('DTSTART');
853 $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')));
854
855 $ev->add($dtStart);
856
857 $vcal->add($ev);
858
859 $it = new EventIterator($vcal,(string)$ev->uid);
860
861 $max = 20;
862 $result = array();
863 foreach($it as $k=>$item) {
864
865 $result[] = $item;
866 $max--;
867
868 if (!$max) break;
869
870 }
871
872 $tz = new DateTimeZone('UTC');
873
874 $this->assertEquals(
875 array(
876 new DateTime('2011-01-03', $tz),
877 new DateTime('2011-01-31', $tz),
878 new DateTime('2011-02-01', $tz),
879 new DateTime('2011-02-28', $tz),
880 new DateTime('2011-03-01', $tz),
881 new DateTime('2011-03-31', $tz),
882 new DateTime('2011-04-01', $tz),
883 new DateTime('2011-04-29', $tz),
884 new DateTime('2011-05-02', $tz),
885 new DateTime('2011-05-31', $tz),
886 ),
887 $result
888 );
889
890 }
891
892 /**
893 * @depends testValues
894 */
895 function testYearly() {
896
897 $vcal = new VCalendar();
898 $ev = $vcal->createComponent('VEVENT');
899
900 $ev->UID = 'bla';
901 $ev->RRULE = 'FREQ=YEARLY;COUNT=10;INTERVAL=3';
902 $dtStart = $vcal->createProperty('DTSTART');
903 $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')));
904
905 $ev->add($dtStart);
906
907 $vcal->add($ev);
908
909 $it = new EventIterator($vcal,(string)$ev->uid);
910
911 $max = 20;
912 $result = array();
913 foreach($it as $k=>$item) {
914
915 $result[] = $item;
916 $max--;
917
918 if (!$max) break;
919
920 }
921
922 $tz = new DateTimeZone('UTC');
923
924 $this->assertEquals(
925 array(
926 new DateTime('2011-01-01', $tz),
927 new DateTime('2014-01-01', $tz),
928 new DateTime('2017-01-01', $tz),
929 new DateTime('2020-01-01', $tz),
930 new DateTime('2023-01-01', $tz),
931 new DateTime('2026-01-01', $tz),
932 new DateTime('2029-01-01', $tz),
933 new DateTime('2032-01-01', $tz),
934 new DateTime('2035-01-01', $tz),
935 new DateTime('2038-01-01', $tz),
936 ),
937 $result
938 );
939
940 }
941
942 /**
943 * @depends testValues
944 */
945 function testYearlyLeapYear() {
946
947 $vcal = new VCalendar();
948 $ev = $vcal->createComponent('VEVENT');
949
950 $ev->UID = 'bla';
951 $ev->RRULE = 'FREQ=YEARLY;COUNT=3';
952 $dtStart = $vcal->createProperty('DTSTART');
953 $dtStart->setDateTime(new DateTime('2012-02-29', new DateTimeZone('UTC')));
954
955 $ev->add($dtStart);
956
957 $vcal->add($ev);
958
959 $it = new EventIterator($vcal,(string)$ev->uid);
960
961 $max = 20;
962 $result = array();
963 foreach($it as $k=>$item) {
964
965 $result[] = $item;
966 $max--;
967
968 if (!$max) break;
969
970 }
971
972 $tz = new DateTimeZone('UTC');
973
974 $this->assertEquals(
975 array(
976 new DateTime('2012-02-29', $tz),
977 new DateTime('2016-02-29', $tz),
978 new DateTime('2020-02-29', $tz),
979 ),
980 $result
981 );
982
983 }
984
985 /**
986 * @depends testValues
987 */
988 function testYearlyByMonth() {
989
990 $vcal = new VCalendar();
991 $ev = $vcal->createComponent('VEVENT');
992
993 $ev->UID = 'bla';
994 $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10';
995 $dtStart = $vcal->createProperty('DTSTART');
996 $dtStart->setDateTime(new DateTime('2011-04-07', new DateTimeZone('UTC')));
997
998 $ev->add($dtStart);
999
1000 $vcal->add($ev);
1001
1002 $it = new EventIterator($vcal,(string)$ev->uid);
1003
1004 $max = 20;
1005 $result = array();
1006 foreach($it as $k=>$item) {
1007
1008 $result[] = $item;
1009 $max--;
1010
1011 if (!$max) break;
1012
1013 }
1014
1015 $tz = new DateTimeZone('UTC');
1016
1017 $this->assertEquals(
1018 array(
1019 new DateTime('2011-04-07', $tz),
1020 new DateTime('2011-10-07', $tz),
1021 new DateTime('2015-04-07', $tz),
1022 new DateTime('2015-10-07', $tz),
1023 new DateTime('2019-04-07', $tz),
1024 new DateTime('2019-10-07', $tz),
1025 new DateTime('2023-04-07', $tz),
1026 new DateTime('2023-10-07', $tz),
1027 ),
1028 $result
1029 );
1030
1031 }
1032
1033 /**
1034 * @depends testValues
1035 */
1036 function testYearlyByMonthByDay() {
1037
1038 $vcal = new VCalendar();
1039 $ev = $vcal->createComponent('VEVENT');
1040
1041 $ev->UID = 'bla';
1042 $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
1043 $dtStart = $vcal->createProperty('DTSTART');
1044 $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')));
1045
1046 $ev->add($dtStart);
1047
1048 $vcal->add($ev);
1049
1050 $it = new EventIterator($vcal,(string)$ev->uid);
1051
1052 $max = 20;
1053 $result = array();
1054 foreach($it as $k=>$item) {
1055
1056 $result[] = $item;
1057 $max--;
1058
1059 if (!$max) break;
1060
1061 }
1062
1063 $tz = new DateTimeZone('UTC');
1064
1065 $this->assertEquals(
1066 array(
1067 new DateTime('2011-04-04', $tz),
1068 new DateTime('2011-04-24', $tz),
1069 new DateTime('2011-10-03', $tz),
1070 new DateTime('2011-10-30', $tz),
1071 new DateTime('2016-04-04', $tz),
1072 new DateTime('2016-04-24', $tz),
1073 new DateTime('2016-10-03', $tz),
1074 new DateTime('2016-10-30', $tz),
1075 ),
1076 $result
1077 );
1078
1079 }
1080
1081 /**
1082 * @depends testValues
1083 */
1084 function testFastForward() {
1085
1086 $vcal = new VCalendar();
1087 $ev = $vcal->createComponent('VEVENT');
1088
1089 $ev->UID = 'bla';
1090 $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
1091 $dtStart = $vcal->createProperty('DTSTART');
1092 $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')));
1093
1094 $ev->add($dtStart);
1095
1096 $vcal->add($ev);
1097
1098 $it = new EventIterator($vcal,(string)$ev->uid);
1099
1100 // The idea is that we're fast-forwarding too far in the future, so
1101 // there will be no results left.
1102 $it->fastForward(new DateTime('2020-05-05', new DateTimeZone('UTC')));
1103
1104 $max = 20;
1105 $result = array();
1106 while($item = $it->current()) {
1107
1108 $result[] = $item;
1109 $max--;
1110
1111 if (!$max) break;
1112 $it->next();
1113
1114 }
1115
1116 $tz = new DateTimeZone('UTC');
1117 $this->assertEquals(array(), $result);
1118
1119 }
1120
1121 /**
1122 * @depends testValues
1123 */
1124 function testComplexExclusions() {
1125
1126 $vcal = new VCalendar();
1127 $ev = $vcal->createComponent('VEVENT');
1128
1129 $ev->UID = 'bla';
1130 $ev->RRULE = 'FREQ=YEARLY;COUNT=10';
1131 $dtStart = $vcal->createProperty('DTSTART');
1132
1133 $tz = new DateTimeZone('Canada/Eastern');
1134 $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz));
1135
1136 $exDate1 = $vcal->createProperty('EXDATE');
1137 $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)));
1138 $exDate2 = $vcal->createProperty('EXDATE');
1139 $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)));
1140
1141 $ev->add($dtStart);
1142 $ev->add($exDate1);
1143 $ev->add($exDate2);
1144
1145 $vcal->add($ev);
1146
1147 $it = new EventIterator($vcal,(string)$ev->uid);
1148
1149 $max = 20;
1150 $result = array();
1151 foreach($it as $k=>$item) {
1152
1153 $result[] = $item;
1154 $max--;
1155
1156 if (!$max) break;
1157
1158 }
1159
1160 $this->assertEquals(
1161 array(
1162 new DateTime('2011-01-01 13:50:20', $tz),
1163 new DateTime('2013-01-01 13:50:20', $tz),
1164 new DateTime('2015-01-01 13:50:20', $tz),
1165 new DateTime('2017-01-01 13:50:20', $tz),
1166 new DateTime('2018-01-01 13:50:20', $tz),
1167 new DateTime('2019-01-01 13:50:20', $tz),
1168 new DateTime('2020-01-01 13:50:20', $tz),
1169 ),
1170 $result
1171 );
1172
1173 }
1174
1175 /**
1176 * @depends testValues
1177 */
1178 function testOverridenEvent() {
1179
1180 $vcal = new VCalendar();
1181
1182 $ev1 = $vcal->createComponent('VEVENT');
1183 $ev1->UID = 'overridden';
1184 $ev1->RRULE = 'FREQ=DAILY;COUNT=10';
1185 $ev1->DTSTART = '20120107T120000Z';
1186 $ev1->SUMMARY = 'baseEvent';
1187
1188 $vcal->add($ev1);
1189
1190 // ev2 overrides an event, and puts it on 2pm instead.
1191 $ev2 = $vcal->createComponent('VEVENT');
1192 $ev2->UID = 'overridden';
1193 $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
1194 $ev2->DTSTART = '20120110T140000Z';
1195 $ev2->SUMMARY = 'Event 2';
1196
1197 $vcal->add($ev2);
1198
1199 // ev3 overrides an event, and puts it 2 days and 2 hours later
1200 $ev3 = $vcal->createComponent('VEVENT');
1201 $ev3->UID = 'overridden';
1202 $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
1203 $ev3->DTSTART = '20120115T140000Z';
1204 $ev3->SUMMARY = 'Event 3';
1205
1206 $vcal->add($ev3);
1207
1208 $it = new EventIterator($vcal,'overridden');
1209
1210 $dates = array();
1211 $summaries = array();
1212 while($it->valid()) {
1213
1214 $dates[] = $it->getDTStart();
1215 $summaries[] = (string)$it->getEventObject()->SUMMARY;
1216 $it->next();
1217
1218 }
1219
1220 $tz = new DateTimeZone('UTC');
1221 $this->assertEquals(array(
1222 new DateTime('2012-01-07 12:00:00',$tz),
1223 new DateTime('2012-01-08 12:00:00',$tz),
1224 new DateTime('2012-01-09 12:00:00',$tz),
1225 new DateTime('2012-01-10 14:00:00',$tz),
1226 new DateTime('2012-01-11 12:00:00',$tz),
1227 new DateTime('2012-01-12 12:00:00',$tz),
1228 new DateTime('2012-01-14 12:00:00',$tz),
1229 new DateTime('2012-01-15 12:00:00',$tz),
1230 new DateTime('2012-01-15 14:00:00',$tz),
1231 new DateTime('2012-01-16 12:00:00',$tz),
1232 ), $dates);
1233
1234 $this->assertEquals(array(
1235 'baseEvent',
1236 'baseEvent',
1237 'baseEvent',
1238 'Event 2',
1239 'baseEvent',
1240 'baseEvent',
1241 'baseEvent',
1242 'baseEvent',
1243 'Event 3',
1244 'baseEvent',
1245 ), $summaries);
1246
1247 }
1248
1249 /**
1250 * @depends testValues
1251 */
1252 function testOverridenEvent2() {
1253
1254 $vcal = new VCalendar();
1255
1256 $ev1 = $vcal->createComponent('VEVENT');
1257 $ev1->UID = 'overridden';
1258 $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
1259 $ev1->DTSTART = '20120112T120000Z';
1260 $ev1->SUMMARY = 'baseEvent';
1261
1262 $vcal->add($ev1);
1263
1264 // ev2 overrides an event, and puts it 6 days earlier instead.
1265 $ev2 = $vcal->createComponent('VEVENT');
1266 $ev2->UID = 'overridden';
1267 $ev2->{'RECURRENCE-ID'} = '20120119T120000Z';
1268 $ev2->DTSTART = '20120113T120000Z';
1269 $ev2->SUMMARY = 'Override!';
1270
1271 $vcal->add($ev2);
1272
1273 $it = new EventIterator($vcal,'overridden');
1274
1275 $dates = array();
1276 $summaries = array();
1277 while($it->valid()) {
1278
1279 $dates[] = $it->getDTStart();
1280 $summaries[] = (string)$it->getEventObject()->SUMMARY;
1281 $it->next();
1282
1283 }
1284
1285 $tz = new DateTimeZone('UTC');
1286 $this->assertEquals(array(
1287 new DateTime('2012-01-12 12:00:00',$tz),
1288 new DateTime('2012-01-13 12:00:00',$tz),
1289 new DateTime('2012-01-26 12:00:00',$tz),
1290
1291 ), $dates);
1292
1293 $this->assertEquals(array(
1294 'baseEvent',
1295 'Override!',
1296 'baseEvent',
1297 ), $summaries);
1298
1299 }
1300
1301 /**
1302 * @depends testValues
1303 */
1304 function testOverridenEventNoValuesExpected() {
1305
1306 $vcal = new VCalendar();
1307 $ev1 = $vcal->createComponent('VEVENT');
1308
1309 $ev1->UID = 'overridden';
1310 $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
1311 $ev1->DTSTART = '20120124T120000Z';
1312 $ev1->SUMMARY = 'baseEvent';
1313
1314 $vcal->add($ev1);
1315
1316 // ev2 overrides an event, and puts it 6 days earlier instead.
1317 $ev2 = $vcal->createComponent('VEVENT');
1318 $ev2->UID = 'overridden';
1319 $ev2->{'RECURRENCE-ID'} = '20120131T120000Z';
1320 $ev2->DTSTART = '20120125T120000Z';
1321 $ev2->SUMMARY = 'Override!';
1322
1323 $vcal->add($ev2);
1324
1325 $it = new EventIterator($vcal,'overridden');
1326
1327 $dates = array();
1328 $summaries = array();
1329
1330 // The reported problem was specifically related to the VCALENDAR
1331 // expansion. In this parcitular case, we had to forward to the 28th of
1332 // january.
1333 $it->fastForward(new DateTime('2012-01-28 23:00:00'));
1334
1335 // We stop the loop when it hits the 6th of februari. Normally this
1336 // iterator would hit 24, 25 (overriden from 31) and 7 feb but because
1337 // we 'filter' from the 28th till the 6th, we should get 0 results.
1338 while($it->valid() && $it->getDTSTart() < new DateTime('2012-02-06 23:00:00')) {
1339
1340 $dates[] = $it->getDTStart();
1341 $summaries[] = (string)$it->getEventObject()->SUMMARY;
1342 $it->next();
1343
1344 }
1345
1346 $this->assertEquals(array(), $dates);
1347 $this->assertEquals(array(), $summaries);
1348
1349 }
1350
1351 /**
1352 * @depends testValues
1353 */
1354 function testRDATE() {
1355
1356 $vcal = new VCalendar();
1357 $ev = $vcal->createComponent('VEVENT');
1358
1359 $ev->UID = 'bla';
1360 $ev->RDATE = array(
1361 new DateTime('2014-08-07', new DateTimeZone('UTC')),
1362 new DateTime('2014-08-08', new DateTimeZone('UTC')),
1363 );
1364 $dtStart = $vcal->createProperty('DTSTART');
1365 $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
1366
1367 $ev->add($dtStart);
1368
1369 $vcal->add($ev);
1370
1371 $it = new EventIterator($vcal,$ev->uid);
1372
1373 // Max is to prevent overflow
1374 $max = 12;
1375 $result = array();
1376 foreach($it as $item) {
1377
1378 $result[] = $item;
1379 $max--;
1380
1381 if (!$max) break;
1382
1383 }
1384
1385 $tz = new DateTimeZone('UTC');
1386
1387 $this->assertEquals(
1388 array(
1389 new DateTime('2011-10-07', $tz),
1390 new DateTime('2014-08-07', $tz),
1391 new DateTime('2014-08-08', $tz),
1392 ),
1393 $result
1394 );
1395
1396 }
1397
1398 /**
1399 * @depends testValues
1400 * @expectedException \InvalidArgumentException
1401 */
1402 function testNoMasterBadUID() {
1403
1404 $vcal = new VCalendar();
1405 // ev2 overrides an event, and puts it on 2pm instead.
1406 $ev2 = $vcal->createComponent('VEVENT');
1407 $ev2->UID = 'overridden';
1408 $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
1409 $ev2->DTSTART = '20120110T140000Z';
1410 $ev2->SUMMARY = 'Event 2';
1411
1412 $vcal->add($ev2);
1413
1414 // ev3 overrides an event, and puts it 2 days and 2 hours later
1415 $ev3 = $vcal->createComponent('VEVENT');
1416 $ev3->UID = 'overridden';
1417 $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
1418 $ev3->DTSTART = '20120115T140000Z';
1419 $ev3->SUMMARY = 'Event 3';
1420
1421 $vcal->add($ev3);
1422
1423 $it = new EventIterator($vcal,'broken');
1424
1425 }
1426 }
1427