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