File: RangeTest.php

package info (click to toggle)
davical 1.1.12-2.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,020 kB
  • sloc: php: 19,361; sql: 4,514; perl: 3,524; sh: 554; javascript: 162; makefile: 85
file content (132 lines) | stat: -rw-r--r-- 4,132 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php

set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/awl/inc' . PATH_SEPARATOR . 'inc');

require_once('RRule.php');
require_once('vCalendar.php');

use PHPUnit\Framework\Attributes\PreserveGlobalState;
use PHPUnit\Framework\Attributes\RunInSeparateProcess;
use PHPUnit\Framework\TestCase;

$c = (object) array();
$c->rrule_loop_limit = 100;

final class RangeTest extends TestCase
{
  #[PreserveGlobalState('enabled')]
  #[RunInSeparateProcess]
  public function testGetVCalendarRange() {
    $cal = new vCalendar("BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Asia/Baku
BEGIN:STANDARD
TZOFFSETFROM:+0400
TZOFFSETTO:+0400
TZNAME:+04
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20181218T045608Z
LAST-MODIFIED:20181218T045951Z
DTSTAMP:20181218T045951Z
UID:8eeee169-420f-4645-9546-9ea8293a1c6d
SUMMARY:Blep
RRULE:FREQ=DAILY;UNTIL=20190102T050000Z;BYDAY=MO,TU,WE,TH,FR
DTSTART;TZID=Asia/Baku:20181226T090000
DTEND;TZID=Asia/Baku:20181226T112000
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR");

    $range = getVCalendarRange($cal);
    self::assertEquals("20181226T050000Z", (string) $range->from->UTC());
    self::assertEquals("20190102T072000Z", (string) $range->until->UTC());

    // TZ is specified in the event, so this should be unaffected by passing in a fallback timezone:
    $range = getVCalendarRange($cal, "Asia/Baku");
    self::assertEquals("20181226T050000Z", (string) $range->from->UTC());
    self::assertEquals("20190102T072000Z", (string) $range->until->UTC());
  }

  #[PreserveGlobalState('enabled')]
  #[RunInSeparateProcess]
  public function testGetVCalendarRangeTwoDayAllDay() {
    $cal = new vCalendar("BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VEVENT
CREATED:20181218T052603Z
LAST-MODIFIED:20181218T052734Z
DTSTAMP:20181218T052734Z
UID:7e76efc0-b1ed-4b68-b0ed-9e34889c30bd
SUMMARY:New Event
RRULE:FREQ=WEEKLY;COUNT=3;BYDAY=TU
DTSTART;VALUE=DATE:20181225
DTEND;VALUE=DATE:20181227
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR");

    $range = getVCalendarRange($cal, "Asia/Baku");
    self::assertEquals("20181224T200000Z", (string) $range->from->UTC());
    self::assertEquals("20190109T200000Z", (string) $range->until->UTC());
  }

  #[PreserveGlobalState('enabled')]
  #[RunInSeparateProcess]
  public function testGetVCalendarRangeFloating() {
    // When interpreted as being in Greece, this event crosses the daylight savings boundary!
    // TODO deal with how that affects all-day events...
    $cal = new vCalendar("BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VEVENT
CREATED:20181218T052603Z
LAST-MODIFIED:20181218T052734Z
DTSTAMP:20181218T052734Z
UID:7e76efc0-b1ed-4b68-b0ed-9e34889c30bd
SUMMARY:New Event
RRULE:FREQ=MONTHLY;COUNT=4;INTERVAL=2;BYMONTHDAY=10
DTSTART:20180411T140000
DTEND:20180411T150000
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR");

    $range = getVCalendarRange($cal, "Europe/Athens");
    self::assertEquals("20180411T110000Z", (string) $range->from->UTC());
    self::assertEquals("20181210T130000Z", (string) $range->until->UTC());
  }

  #[PreserveGlobalState('enabled')]
  #[RunInSeparateProcess]
  public function testGetVCalendarRangeAllDayAcrossDST() {
    // When interpreted as being in Greece, this event crosses the daylight savings boundary!

    $cal = new vCalendar("BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VEVENT
CREATED:20181218T052603Z
LAST-MODIFIED:20181218T052734Z
DTSTAMP:20181218T052734Z
UID:7e76efc0-b1ed-4b68-b0ed-9e34889c30bd
SUMMARY:New Event
RRULE:FREQ=MONTHLY;COUNT=5;INTERVAL=2;BYMONTHDAY=10
DTSTART;VALUE=DATE:20180410
DTEND;VALUE=DATE:20180411
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR");

    $range = getVCalendarRange($cal, "Europe/Athens");
    self::assertEquals("20180409T210000Z", (string) $range->from->UTC());

    // This is correctly at a different UTC time-of-day to the original, since DST has changed
    self::assertEquals("20181210T220000Z", (string) $range->until->UTC());
  }
}