1<?php
2
3namespace Sabre\CalDAV;
4use Sabre\VObject;
5use Sabre\DAV;
6
7class CalendarQueryValidatorTest extends \PHPUnit_Framework_TestCase {
8
9    function testTopLevelFail() {
10
11        $validator = new CalendarQueryValidator();
12        $vcal = <<<ICS
13BEGIN:VCALENDAR
14BEGIN:VEVENT
15END:VEVENT
16END:VCALENDAR
17ICS;
18        $vcal = VObject\Reader::read($vcal);
19        $this->assertFalse($validator->validate($vcal, ['name' => 'VFOO']));
20
21    }
22
23    /**
24     * @dataProvider provider
25     */
26    function testValid($icalObject, $filters, $outcome) {
27
28        $validator = new CalendarQueryValidator();
29
30        // Wrapping filter in a VCALENDAR component filter, as this is always
31        // there anyway.
32        $filters = array(
33            'name' => 'VCALENDAR',
34            'comp-filters' => array($filters),
35            'prop-filters' => array(),
36            'is-not-defined' => false,
37            'time-range' => null,
38        );
39
40        $vObject = VObject\Reader::read($icalObject);
41
42        switch($outcome) {
43            case 0 :
44                $this->assertFalse($validator->validate($vObject, $filters));
45                break;
46            case 1 :
47                $this->assertTrue($validator->validate($vObject, $filters));
48                break;
49            case -1 :
50                try {
51                    $validator->validate($vObject, $filters);
52                    $this->fail('This test was supposed to fail');
53                } catch (\Exception $e) {
54                    // We need to test something to be valid for phpunit strict
55                    // mode.
56                    $this->assertTrue(true);
57                }
58                break;
59
60        }
61
62    }
63
64    function provider() {
65
66        $blob1 = <<<yow
67BEGIN:VCALENDAR
68BEGIN:VEVENT
69SUMMARY:hi
70END:VEVENT
71END:VCALENDAR
72yow;
73
74        $blob2 = <<<yow
75BEGIN:VCALENDAR
76BEGIN:VEVENT
77SUMMARY:hi
78BEGIN:VALARM
79ACTION:DISPLAY
80END:VALARM
81END:VEVENT
82END:VCALENDAR
83yow;
84
85        $blob3 = <<<yow
86BEGIN:VCALENDAR
87BEGIN:VEVENT
88SUMMARY:hi
89DTSTART;VALUE=DATE:20110704
90END:VEVENT
91END:VCALENDAR
92yow;
93        $blob4 = <<<yow
94BEGIN:VCARD
95VERSION:3.0
96FN:Evert
97END:VCARD
98yow;
99
100        $blob5 = <<<yow
101BEGIN:VCALENDAR
102BEGIN:VEVENT
103DTSTART:20110101T120000Z
104DTEND:20110102T120000Z
105END:VEVENT
106END:VCALENDAR
107yow;
108
109        $blob6 = <<<yow
110BEGIN:VCALENDAR
111BEGIN:VEVENT
112DTSTART:20110101T120000Z
113DURATION:PT5H
114END:VEVENT
115END:VCALENDAR
116yow;
117
118        $blob7 = <<<yow
119BEGIN:VCALENDAR
120BEGIN:VEVENT
121DTSTART;VALUE=DATE:20110101
122END:VEVENT
123END:VCALENDAR
124yow;
125
126        $blob8 = <<<yow
127BEGIN:VCALENDAR
128BEGIN:VEVENT
129DTSTART:20110101T120000Z
130END:VEVENT
131END:VCALENDAR
132yow;
133
134        $blob9 = <<<yow
135BEGIN:VCALENDAR
136BEGIN:VTODO
137DTSTART:20110101T120000Z
138DURATION:PT1H
139END:VTODO
140END:VCALENDAR
141yow;
142        $blob10 = <<<yow
143BEGIN:VCALENDAR
144BEGIN:VTODO
145DTSTART:20110101T120000Z
146DUE:20110101T130000Z
147END:VTODO
148END:VCALENDAR
149yow;
150        $blob11 = <<<yow
151BEGIN:VCALENDAR
152BEGIN:VTODO
153DTSTART:20110101T120000Z
154END:VTODO
155END:VCALENDAR
156yow;
157
158        $blob12 = <<<yow
159BEGIN:VCALENDAR
160BEGIN:VTODO
161DUE:20110101T130000Z
162END:VTODO
163END:VCALENDAR
164yow;
165
166        $blob13 = <<<yow
167BEGIN:VCALENDAR
168BEGIN:VTODO
169COMPLETED:20110101T130000Z
170CREATED:20110101T110000Z
171END:VTODO
172END:VCALENDAR
173yow;
174
175        $blob14 = <<<yow
176BEGIN:VCALENDAR
177BEGIN:VTODO
178COMPLETED:20110101T130000Z
179END:VTODO
180END:VCALENDAR
181yow;
182
183        $blob15 = <<<yow
184BEGIN:VCALENDAR
185BEGIN:VTODO
186CREATED:20110101T110000Z
187END:VTODO
188END:VCALENDAR
189yow;
190
191
192        $blob16 = <<<yow
193BEGIN:VCALENDAR
194BEGIN:VTODO
195END:VTODO
196END:VCALENDAR
197yow;
198
199        $blob17 = <<<yow
200BEGIN:VCALENDAR
201BEGIN:VJOURNAL
202END:VJOURNAL
203END:VCALENDAR
204yow;
205
206        $blob18 = <<<yow
207BEGIN:VCALENDAR
208BEGIN:VJOURNAL
209DTSTART:20110101T120000Z
210END:VJOURNAL
211END:VCALENDAR
212yow;
213
214        $blob19 = <<<yow
215BEGIN:VCALENDAR
216BEGIN:VJOURNAL
217DTSTART;VALUE=DATE:20110101
218END:VJOURNAL
219END:VCALENDAR
220yow;
221
222        $blob20 = <<<yow
223BEGIN:VCALENDAR
224BEGIN:VFREEBUSY
225END:VFREEBUSY
226END:VCALENDAR
227yow;
228
229        $blob21 = <<<yow
230BEGIN:VCALENDAR
231BEGIN:VEVENT
232DTSTART:20110101T120000Z
233BEGIN:VALARM
234TRIGGER:-PT1H
235END:VALARM
236END:VEVENT
237END:VCALENDAR
238yow;
239
240        $blob22 = <<<yow
241BEGIN:VCALENDAR
242BEGIN:VEVENT
243DTSTART:20110101T120000Z
244BEGIN:VALARM
245TRIGGER;VALUE=DURATION:-PT1H
246END:VALARM
247END:VEVENT
248END:VCALENDAR
249yow;
250
251        $blob23 = <<<yow
252BEGIN:VCALENDAR
253BEGIN:VEVENT
254DTSTART:20110101T120000Z
255BEGIN:VALARM
256TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
257END:VALARM
258END:VEVENT
259END:VCALENDAR
260yow;
261
262        $blob24 = <<<yow
263BEGIN:VCALENDAR
264BEGIN:VEVENT
265DTSTART:20110101T120000Z
266DTEND:20110101T130000Z
267BEGIN:VALARM
268TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
269END:VALARM
270END:VEVENT
271END:VCALENDAR
272yow;
273
274        $blob25 = <<<yow
275BEGIN:VCALENDAR
276BEGIN:VEVENT
277DTSTART:20110101T120000Z
278DURATION:PT1H
279BEGIN:VALARM
280TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
281END:VALARM
282END:VEVENT
283END:VCALENDAR
284yow;
285
286        $blob26 = <<<yow
287BEGIN:VCALENDAR
288BEGIN:VEVENT
289DTSTART:20110101T120000Z
290DURATION:PT1H
291BEGIN:VALARM
292TRIGGER;VALUE=DATE-TIME:20110101T110000Z
293END:VALARM
294END:VEVENT
295END:VCALENDAR
296yow;
297
298
299        $blob27 = <<<yow
300BEGIN:VCALENDAR
301BEGIN:VTODO
302DTSTART:20110101T120000Z
303DUE:20110101T130000Z
304BEGIN:VALARM
305TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
306END:VALARM
307END:VTODO
308END:VCALENDAR
309yow;
310
311        $blob28 = <<<yow
312BEGIN:VCALENDAR
313BEGIN:VJOURNAL
314DTSTART:20110101T120000Z
315BEGIN:VALARM
316TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
317END:VALARM
318END:VJOURNAL
319END:VCALENDAR
320yow;
321
322        $blob29 = <<<yow
323BEGIN:VCALENDAR
324BEGIN:VEVENT
325DTSTART:20110101T120000Z
326DURATION:PT1H
327BEGIN:VALARM
328TRIGGER;VALUE=DATE-TIME:20110101T090000Z
329REPEAT:2
330DURATION:PT1H
331END:VALARM
332END:VEVENT
333END:VCALENDAR
334yow;
335
336        $blob30 = <<<yow
337BEGIN:VCALENDAR
338BEGIN:VEVENT
339DTSTART:20110101T120000Z
340DURATION:PT1H
341BEGIN:VALARM
342TRIGGER;VALUE=DATE-TIME:20110101T090000Z
343DURATION:PT1H
344END:VALARM
345END:VEVENT
346END:VCALENDAR
347yow;
348
349        $blob31 = <<<yow
350BEGIN:VCALENDAR
351BEGIN:VEVENT
352UID:foobar
353DTSTART:20080101T120000Z
354DURATION:PT1H
355RRULE:FREQ=YEARLY
356END:VEVENT
357END:VCALENDAR
358yow;
359
360        $blob32 = <<<yow
361BEGIN:VCALENDAR
362BEGIN:VEVENT
363UID:foobar
364DTSTART:20080102T120000Z
365DURATION:PT1H
366RRULE:FREQ=YEARLY
367END:VEVENT
368END:VCALENDAR
369yow;
370        $blob33 = <<<yow
371BEGIN:VCALENDAR
372BEGIN:VEVENT
373UID:foobar
374DTSTART;VALUE=DATE:20120628
375RRULE:FREQ=DAILY
376END:VEVENT
377END:VCALENDAR
378yow;
379        $blob34 = <<<yow
380BEGIN:VCALENDAR
381BEGIN:VEVENT
382UID:foobar
383DTSTART;VALUE=DATE:20120628
384RRULE:FREQ=DAILY
385BEGIN:VALARM
386TRIGGER:P52W
387END:VALARM
388END:VEVENT
389END:VCALENDAR
390yow;
391
392        $filter1 = array(
393            'name' => 'VEVENT',
394            'comp-filters' => array(),
395            'prop-filters' => array(),
396            'is-not-defined' => false,
397            'time-range' => null,
398        );
399        $filter2 = $filter1;
400        $filter2['name'] = 'VTODO';
401
402        $filter3 = $filter1;
403        $filter3['is-not-defined'] = true;
404
405        $filter4 = $filter1;
406        $filter4['name'] = 'VTODO';
407        $filter4['is-not-defined'] = true;
408
409        $filter5 = $filter1;
410        $filter5['comp-filters'] = array(
411            array(
412                'name' => 'VALARM',
413                'is-not-defined' => false,
414                'comp-filters' => array(),
415                'prop-filters' => array(),
416                'time-range' => null,
417            ),
418        );
419        $filter6 = $filter1;
420        $filter6['prop-filters'] = array(
421            array(
422                'name' => 'SUMMARY',
423                'is-not-defined' => false,
424                'param-filters' => array(),
425                'time-range' => null,
426                'text-match' => null,
427            ),
428        );
429        $filter7 = $filter6;
430        $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
431
432        $filter8 = $filter6;
433        $filter8['prop-filters'][0]['is-not-defined'] = true;
434
435        $filter9 = $filter7;
436        $filter9['prop-filters'][0]['is-not-defined'] = true;
437
438        $filter10 = $filter5;
439        $filter10['prop-filters'] = $filter6['prop-filters'];
440
441        // Param filters
442        $filter11 = $filter1;
443        $filter11['prop-filters'] = array(
444            array(
445                'name' => 'DTSTART',
446                'is-not-defined' => false,
447                'param-filters' => array(
448                    array(
449                        'name' => 'VALUE',
450                        'is-not-defined' => false,
451                        'text-match' => null,
452                    ),
453                ),
454                'time-range' => null,
455                'text-match' => null,
456            ),
457        );
458
459        $filter12 = $filter11;
460        $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
461
462        $filter13 = $filter11;
463        $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
464
465        $filter14 = $filter12;
466        $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
467
468        // Param text filter
469        $filter15 = $filter11;
470        $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
471            'collation' => 'i;ascii-casemap',
472            'value' => 'dAtE',
473            'negate-condition' => false,
474        );
475        $filter16 = $filter15;
476        $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
477
478        $filter17 = $filter15;
479        $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
480
481        $filter18 = $filter15;
482        $filter18['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
483        $filter18['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
484
485        // prop + text
486        $filter19 = $filter5;
487        $filter19['comp-filters'][0]['prop-filters'] = array(
488            array(
489                'name' => 'action',
490                'is-not-defined' => false,
491                'time-range' => null,
492                'param-filters' => array(),
493                'text-match' => array(
494                    'collation' => 'i;ascii-casemap',
495                    'value' => 'display',
496                    'negate-condition' => false,
497                ),
498            ),
499        );
500
501        // Time range
502        $filter20 = array(
503            'name' => 'VEVENT',
504            'comp-filters' => array(),
505            'prop-filters' => array(),
506            'is-not-defined' => false,
507            'time-range' => array(
508               'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
509               'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
510            ),
511        );
512        // Time range, no end date
513        $filter21 = $filter20;
514        $filter21['time-range']['end'] = null;
515
516        // Time range, no start date
517        $filter22 = $filter20;
518        $filter22['time-range']['start'] = null;
519
520        // Time range, other dates
521        $filter23 = $filter20;
522        $filter23['time-range'] = array(
523           'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
524           'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
525        );
526        // Time range
527        $filter24 = array(
528            'name' => 'VTODO',
529            'comp-filters' => array(),
530            'prop-filters' => array(),
531            'is-not-defined' => false,
532            'time-range' => array(
533               'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
534               'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
535            ),
536        );
537        // Time range, other dates (1 month in the future)
538        $filter25 = $filter24;
539        $filter25['time-range'] = array(
540           'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
541           'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
542        );
543        $filter26 = $filter24;
544        $filter26['time-range'] = array(
545           'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
546           'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
547       );
548
549        // Time range for VJOURNAL
550        $filter27 = array(
551            'name' => 'VJOURNAL',
552            'comp-filters' => array(),
553            'prop-filters' => array(),
554            'is-not-defined' => false,
555            'time-range' => array(
556               'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
557               'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
558            ),
559        );
560        $filter28 = $filter27;
561        $filter28['time-range'] = array(
562           'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
563           'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
564        );
565        // Time range for VFREEBUSY
566        $filter29 = array(
567            'name' => 'VFREEBUSY',
568            'comp-filters' => array(),
569            'prop-filters' => array(),
570            'is-not-defined' => false,
571            'time-range' => array(
572               'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
573               'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
574            ),
575        );
576        // Time range filter on property
577        $filter30 = array(
578            'name' => 'VEVENT',
579            'comp-filters' => array(),
580            'prop-filters' => array(
581                array(
582                    'name' => 'DTSTART',
583                    'is-not-defined' => false,
584                    'param-filters' => array(),
585                    'time-range' => array(
586                       'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
587                       'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
588                   ),
589                    'text-match' => null,
590               ),
591            ),
592            'is-not-defined' => false,
593            'time-range' => null,
594        );
595
596        // Time range for alarm
597        $filter31 = array(
598            'name' => 'VEVENT',
599            'prop-filters' => array(),
600            'comp-filters' => array(
601                array(
602                    'name' => 'VALARM',
603                    'is-not-defined' => false,
604                    'comp-filters' => array(),
605                    'prop-filters' => array(),
606                    'time-range' => array(
607                       'start' => new \DateTime('2011-01-01 10:45:00', new \DateTimeZone('GMT')),
608                       'end' => new \DateTime('2011-01-01 11:15:00', new \DateTimeZone('GMT')),
609                    ),
610                    'text-match' => null,
611               ),
612            ),
613            'is-not-defined' => false,
614            'time-range' => null,
615        );
616        $filter32 = $filter31;
617        $filter32['comp-filters'][0]['time-range'] = array(
618           'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
619           'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
620       );
621
622        $filter33 = $filter31;
623        $filter33['name'] = 'VTODO';
624        $filter34 = $filter32;
625        $filter34['name'] = 'VTODO';
626        $filter35 = $filter31;
627        $filter35['name'] = 'VJOURNAL';
628        $filter36 = $filter32;
629        $filter36['name'] = 'VJOURNAL';
630
631        // Time range filter on non-datetime property
632        $filter37 = array(
633            'name' => 'VEVENT',
634            'comp-filters' => array(),
635            'prop-filters' => array(
636                array(
637                    'name' => 'SUMMARY',
638                    'is-not-defined' => false,
639                    'param-filters' => array(),
640                    'time-range' => array(
641                       'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
642                       'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
643                   ),
644                    'text-match' => null,
645               ),
646            ),
647            'is-not-defined' => false,
648            'time-range' => null,
649        );
650
651        $filter38 = array(
652            'name' => 'VEVENT',
653            'comp-filters' => array(),
654            'prop-filters' => array(),
655            'is-not-defined' => false,
656            'time-range' => array(
657                'start' => new \DateTime('2012-07-01 00:00:00', new \DateTimeZone('UTC')),
658                'end' => new \DateTime('2012-08-01 00:00:00', new \DateTimeZone('UTC')),
659            )
660        );
661        $filter39 = array(
662            'name' => 'VEVENT',
663            'comp-filters' => array(
664                array(
665                    'name' => 'VALARM',
666                    'comp-filters' => array(),
667                    'prop-filters' => array(),
668                    'is-not-defined' => false,
669                    'time-range' => array(
670                        'start' => new \DateTime('2012-09-01 00:00:00', new \DateTimeZone('UTC')),
671                        'end' => new \DateTime('2012-10-01 00:00:00', new \DateTimeZone('UTC')),
672                    )
673                ),
674            ),
675            'prop-filters' => array(),
676            'is-not-defined' => false,
677            'time-range' => null,
678        );
679
680        return array(
681
682            // Component check
683
684            array($blob1, $filter1, 1),
685            array($blob1, $filter2, 0),
686            array($blob1, $filter3, 0),
687            array($blob1, $filter4, 1),
688
689            // Subcomponent check (4)
690            array($blob1, $filter5, 0),
691            array($blob2, $filter5, 1),
692
693            // Property checki (6)
694            array($blob1, $filter6, 1),
695            array($blob1, $filter7, 0),
696            array($blob1, $filter8, 0),
697            array($blob1, $filter9, 1),
698
699            // Subcomponent + property (10)
700            array($blob2, $filter10, 1),
701
702            // Param filter (11)
703            array($blob3, $filter11, 1),
704            array($blob3, $filter12, 0),
705            array($blob3, $filter13, 0),
706            array($blob3, $filter14, 1),
707
708            // Param + text (15)
709            array($blob3, $filter15, 1),
710            array($blob3, $filter16, 0),
711            array($blob3, $filter17, 0),
712            array($blob3, $filter18, 1),
713
714            // Prop + text (19)
715            array($blob2, $filter19, 1),
716
717            // Incorrect object (vcard) (20)
718            array($blob4, $filter1, -1),
719
720            // Time-range for event (21)
721            array($blob5, $filter20, 1),
722            array($blob6, $filter20, 1),
723            array($blob7, $filter20, 1),
724            array($blob8, $filter20, 1),
725
726            array($blob5, $filter21, 1),
727            array($blob5, $filter22, 1),
728
729            array($blob5, $filter23, 0),
730            array($blob6, $filter23, 0),
731            array($blob7, $filter23, 0),
732            array($blob8, $filter23, 0),
733
734            // Time-range for todo (31)
735            array($blob9, $filter24, 1),
736            array($blob9, $filter25, 0),
737            array($blob9, $filter26, 1),
738            array($blob10, $filter24, 1),
739            array($blob10, $filter25, 0),
740            array($blob10, $filter26, 1),
741
742            array($blob11, $filter24, 0),
743            array($blob11, $filter25, 0),
744            array($blob11, $filter26, 1),
745
746            array($blob12, $filter24, 1),
747            array($blob12, $filter25, 0),
748            array($blob12, $filter26, 0),
749
750            array($blob13, $filter24, 1),
751            array($blob13, $filter25, 0),
752            array($blob13, $filter26, 1),
753
754            array($blob14, $filter24, 1),
755            array($blob14, $filter25, 0),
756            array($blob14, $filter26, 0),
757
758            array($blob15, $filter24, 1),
759            array($blob15, $filter25, 1),
760            array($blob15, $filter26, 1),
761
762            array($blob16, $filter24, 1),
763            array($blob16, $filter25, 1),
764            array($blob16, $filter26, 1),
765
766            // Time-range for journals (55)
767            array($blob17, $filter27, 0),
768            array($blob17, $filter28, 0),
769            array($blob18, $filter27, 0),
770            array($blob18, $filter28, 1),
771            array($blob19, $filter27, 1),
772            array($blob19, $filter28, 1),
773
774            // Time-range for free-busy (61)
775            array($blob20, $filter29, -1),
776
777            // Time-range on property (62)
778            array($blob5, $filter30, 1),
779            array($blob3, $filter37, -1),
780            array($blob3, $filter30, 0),
781
782            // Time-range on alarm in vevent (65)
783            array($blob21, $filter31, 1),
784            array($blob21, $filter32, 0),
785            array($blob22, $filter31, 1),
786            array($blob22, $filter32, 0),
787            array($blob23, $filter31, 1),
788            array($blob23, $filter32, 0),
789            array($blob24, $filter31, 1),
790            array($blob24, $filter32, 0),
791            array($blob25, $filter31, 1),
792            array($blob25, $filter32, 0),
793            array($blob26, $filter31, 1),
794            array($blob26, $filter32, 0),
795
796            // Time-range on alarm for vtodo (77)
797            array($blob27, $filter33, 1),
798            array($blob27, $filter34, 0),
799
800            // Time-range on alarm for vjournal (79)
801            array($blob28, $filter35, -1),
802            array($blob28, $filter36, -1),
803
804            // Time-range on alarm with duration (81)
805            array($blob29, $filter31, 1),
806            array($blob29, $filter32, 0),
807            array($blob30, $filter31, 0),
808            array($blob30, $filter32, 0),
809
810            // Time-range with RRULE (85)
811            array($blob31, $filter20, 1),
812            array($blob32, $filter20, 0),
813
814            // Bug reported on mailing list, related to all-day events (87)
815            //array($blob33, $filter38, 1),
816
817            // Event in timerange, but filtered alarm is in the far future (88).
818            array($blob34, $filter39, 0),
819        );
820
821    }
822
823}
824