7
|
1 <?php
|
|
2
|
|
3 namespace Sabre\VObject;
|
|
4
|
|
5 class TimezoneUtilTest extends \PHPUnit_Framework_TestCase {
|
|
6
|
|
7 function setUp() {
|
|
8
|
|
9 // clearning the tz cache
|
|
10 TimezoneUtil::$map = null;
|
|
11
|
|
12 }
|
|
13
|
|
14 /**
|
|
15 * @dataProvider getMapping
|
|
16 */
|
|
17 function testCorrectTZ($timezoneName) {
|
|
18
|
|
19 $tz = new \DateTimeZone($timezoneName);
|
|
20 $this->assertInstanceOf('DateTimeZone', $tz);
|
|
21
|
|
22 }
|
|
23
|
|
24 function getMapping() {
|
|
25
|
|
26 TimeZoneUtil::loadTzMaps();
|
|
27
|
|
28 // PHPUNit requires an array of arrays
|
|
29 return array_map(
|
|
30 function($value) {
|
|
31 return array($value);
|
|
32 },
|
|
33 TimeZoneUtil::$map
|
|
34 );
|
|
35
|
|
36 }
|
|
37
|
|
38 function testExchangeMap() {
|
|
39
|
|
40 $vobj = <<<HI
|
|
41 BEGIN:VCALENDAR
|
|
42 METHOD:REQUEST
|
|
43 VERSION:2.0
|
|
44 BEGIN:VTIMEZONE
|
|
45 TZID:foo
|
|
46 X-MICROSOFT-CDO-TZID:2
|
|
47 BEGIN:STANDARD
|
|
48 DTSTART:16010101T030000
|
|
49 TZOFFSETFROM:+0200
|
|
50 TZOFFSETTO:+0100
|
|
51 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
|
|
52 END:STANDARD
|
|
53 BEGIN:DAYLIGHT
|
|
54 DTSTART:16010101T020000
|
|
55 TZOFFSETFROM:+0100
|
|
56 TZOFFSETTO:+0200
|
|
57 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
|
|
58 END:DAYLIGHT
|
|
59 END:VTIMEZONE
|
|
60 BEGIN:VEVENT
|
|
61 DTSTAMP:20120416T092149Z
|
|
62 DTSTART;TZID="foo":20120418T1
|
|
63 00000
|
|
64 SUMMARY:Begin Unterhaltsreinigung
|
|
65 UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
|
|
66 0100000008FECD2E607780649BE5A4C9EE6418CBC
|
|
67 000
|
|
68 END:VEVENT
|
|
69 END:VCALENDAR
|
|
70 HI;
|
|
71
|
|
72 $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
|
|
73 $ex = new \DateTimeZone('Europe/Lisbon');
|
|
74
|
|
75 $this->assertEquals($ex->getName(), $tz->getName());
|
|
76
|
|
77 }
|
|
78
|
|
79 function testWetherMicrosoftIsStillInsane() {
|
|
80
|
|
81 $vobj = <<<HI
|
|
82 BEGIN:VCALENDAR
|
|
83 METHOD:REQUEST
|
|
84 VERSION:2.0
|
|
85 BEGIN:VTIMEZONE
|
|
86 TZID:(GMT+01.00) Sarajevo/Warsaw/Zagreb
|
|
87 X-MICROSOFT-CDO-TZID:2
|
|
88 BEGIN:STANDARD
|
|
89 DTSTART:16010101T030000
|
|
90 TZOFFSETFROM:+0200
|
|
91 TZOFFSETTO:+0100
|
|
92 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
|
|
93 END:STANDARD
|
|
94 END:VTIMEZONE
|
|
95 END:VCALENDAR
|
|
96 HI;
|
|
97
|
|
98 $tz = TimeZoneUtil::getTimeZone('(GMT+01.00) Sarajevo/Warsaw/Zagreb', Reader::read($vobj));
|
|
99 $ex = new \DateTimeZone('Europe/Sarajevo');
|
|
100
|
|
101 $this->assertEquals($ex->getName(), $tz->getName());
|
|
102
|
|
103 }
|
|
104
|
|
105 function testUnknownExchangeId() {
|
|
106
|
|
107 $vobj = <<<HI
|
|
108 BEGIN:VCALENDAR
|
|
109 METHOD:REQUEST
|
|
110 VERSION:2.0
|
|
111 BEGIN:VTIMEZONE
|
|
112 TZID:foo
|
|
113 X-MICROSOFT-CDO-TZID:2000
|
|
114 BEGIN:STANDARD
|
|
115 DTSTART:16010101T030000
|
|
116 TZOFFSETFROM:+0200
|
|
117 TZOFFSETTO:+0100
|
|
118 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
|
|
119 END:STANDARD
|
|
120 BEGIN:DAYLIGHT
|
|
121 DTSTART:16010101T020000
|
|
122 TZOFFSETFROM:+0100
|
|
123 TZOFFSETTO:+0200
|
|
124 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
|
|
125 END:DAYLIGHT
|
|
126 END:VTIMEZONE
|
|
127 BEGIN:VEVENT
|
|
128 DTSTAMP:20120416T092149Z
|
|
129 DTSTART;TZID="foo":20120418T1
|
|
130 00000
|
|
131 SUMMARY:Begin Unterhaltsreinigung
|
|
132 UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
|
|
133 0100000008FECD2E607780649BE5A4C9EE6418CBC
|
|
134 DTEND;TZID="Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb":20120418T103
|
|
135 000
|
|
136 END:VEVENT
|
|
137 END:VCALENDAR
|
|
138 HI;
|
|
139
|
|
140 $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
|
|
141 $ex = new \DateTimeZone(date_default_timezone_get());
|
|
142 $this->assertEquals($ex->getName(), $tz->getName());
|
|
143
|
|
144 }
|
|
145
|
|
146 function testWindowsTimeZone() {
|
|
147
|
|
148 $tz = TimeZoneUtil::getTimeZone('Eastern Standard Time');
|
|
149 $ex = new \DateTimeZone('America/New_York');
|
|
150 $this->assertEquals($ex->getName(), $tz->getName());
|
|
151
|
|
152 }
|
|
153
|
|
154 /**
|
|
155 * @dataProvider getPHPTimeZoneIdentifiers
|
|
156 */
|
|
157 function testTimeZoneIdentifiers($tzid) {
|
|
158
|
|
159 $tz = TimeZoneUtil::getTimeZone($tzid);
|
|
160 $ex = new \DateTimeZone($tzid);
|
|
161
|
|
162 $this->assertEquals($ex->getName(), $tz->getName());
|
|
163
|
|
164 }
|
|
165
|
|
166 /**
|
|
167 * @dataProvider getPHPTimeZoneBCIdentifiers
|
|
168 */
|
|
169 function testTimeZoneBCIdentifiers($tzid) {
|
|
170
|
|
171 $tz = TimeZoneUtil::getTimeZone($tzid);
|
|
172 $ex = new \DateTimeZone($tzid);
|
|
173
|
|
174 $this->assertEquals($ex->getName(), $tz->getName());
|
|
175
|
|
176 }
|
|
177
|
|
178 function getPHPTimeZoneIdentifiers() {
|
|
179
|
|
180 // PHPUNit requires an array of arrays
|
|
181 return array_map(
|
|
182 function($value) {
|
|
183 return array($value);
|
|
184 },
|
|
185 \DateTimeZone::listIdentifiers()
|
|
186 );
|
|
187
|
|
188 }
|
|
189
|
|
190 function getPHPTimeZoneBCIdentifiers() {
|
|
191
|
|
192 // PHPUNit requires an array of arrays
|
|
193 return array_map(
|
|
194 function($value) {
|
|
195 return array($value);
|
|
196 },
|
|
197 TimeZoneUtil::getIdentifiersBC()
|
|
198 );
|
|
199
|
|
200 }
|
|
201
|
|
202 function testTimezoneOffset() {
|
|
203
|
|
204 $tz = TimeZoneUtil::getTimeZone('GMT-0400', null, true);
|
|
205
|
|
206 if (version_compare(PHP_VERSION, '5.5.10', '>=') && !defined('HHVM_VERSION')) {
|
|
207 $ex = new \DateTimeZone('-04:00');
|
|
208 } else {
|
|
209 $ex = new \DateTimeZone('Etc/GMT-4');
|
|
210 }
|
|
211 $this->assertEquals($ex->getName(), $tz->getName());
|
|
212
|
|
213 }
|
|
214
|
|
215 /**
|
|
216 * @expectedException InvalidArgumentException
|
|
217 */
|
|
218 function testTimezoneFail() {
|
|
219
|
|
220 $tz = TimeZoneUtil::getTimeZone('FooBar', null, true);
|
|
221
|
|
222 }
|
|
223
|
|
224 function testFallBack() {
|
|
225
|
|
226 $vobj = <<<HI
|
|
227 BEGIN:VCALENDAR
|
|
228 METHOD:REQUEST
|
|
229 VERSION:2.0
|
|
230 BEGIN:VTIMEZONE
|
|
231 TZID:foo
|
|
232 BEGIN:STANDARD
|
|
233 DTSTART:16010101T030000
|
|
234 TZOFFSETFROM:+0200
|
|
235 TZOFFSETTO:+0100
|
|
236 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
|
|
237 END:STANDARD
|
|
238 BEGIN:DAYLIGHT
|
|
239 DTSTART:16010101T020000
|
|
240 TZOFFSETFROM:+0100
|
|
241 TZOFFSETTO:+0200
|
|
242 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
|
|
243 END:DAYLIGHT
|
|
244 END:VTIMEZONE
|
|
245 BEGIN:VEVENT
|
|
246 DTSTAMP:20120416T092149Z
|
|
247 DTSTART;TZID="foo":20120418T1
|
|
248 00000
|
|
249 SUMMARY:Begin Unterhaltsreinigung
|
|
250 UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
|
|
251 0100000008FECD2E607780649BE5A4C9EE6418CBC
|
|
252 000
|
|
253 END:VEVENT
|
|
254 END:VCALENDAR
|
|
255 HI;
|
|
256
|
|
257 $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
|
|
258 $ex = new \DateTimeZone(date_default_timezone_get());
|
|
259 $this->assertEquals($ex->getName(), $tz->getName());
|
|
260
|
|
261 }
|
|
262
|
|
263 function testLjubljanaBug() {
|
|
264
|
|
265 $vobj = <<<HI
|
|
266 BEGIN:VCALENDAR
|
|
267 CALSCALE:GREGORIAN
|
|
268 PRODID:-//Ximian//NONSGML Evolution Calendar//EN
|
|
269 VERSION:2.0
|
|
270 BEGIN:VTIMEZONE
|
|
271 TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana
|
|
272 X-LIC-LOCATION:Europe/Ljubljana
|
|
273 BEGIN:STANDARD
|
|
274 TZNAME:CET
|
|
275 DTSTART:19701028T030000
|
|
276 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
|
|
277 TZOFFSETFROM:+0200
|
|
278 TZOFFSETTO:+0100
|
|
279 END:STANDARD
|
|
280 BEGIN:DAYLIGHT
|
|
281 TZNAME:CEST
|
|
282 DTSTART:19700325T020000
|
|
283 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
|
|
284 TZOFFSETFROM:+0100
|
|
285 TZOFFSETTO:+0200
|
|
286 END:DAYLIGHT
|
|
287 END:VTIMEZONE
|
|
288 BEGIN:VEVENT
|
|
289 UID:foo
|
|
290 DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
|
|
291 20121003T080000
|
|
292 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
|
|
293 20121003T083000
|
|
294 TRANSP:OPAQUE
|
|
295 SEQUENCE:2
|
|
296 SUMMARY:testing
|
|
297 CREATED:20121002T172613Z
|
|
298 LAST-MODIFIED:20121002T172613Z
|
|
299 END:VEVENT
|
|
300 END:VCALENDAR
|
|
301
|
|
302 HI;
|
|
303
|
|
304
|
|
305 $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana', Reader::read($vobj));
|
|
306 $ex = new \DateTimeZone('Europe/Ljubljana');
|
|
307 $this->assertEquals($ex->getName(), $tz->getName());
|
|
308
|
|
309 }
|
|
310
|
|
311 function testWeirdSystemVLICs() {
|
|
312
|
|
313 $vobj = <<<HI
|
|
314 BEGIN:VCALENDAR
|
|
315 CALSCALE:GREGORIAN
|
|
316 PRODID:-//Ximian//NONSGML Evolution Calendar//EN
|
|
317 VERSION:2.0
|
|
318 BEGIN:VTIMEZONE
|
|
319 TZID:/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT
|
|
320 X-LIC-LOCATION:SystemV/EST5EDT
|
|
321 BEGIN:STANDARD
|
|
322 TZNAME:EST
|
|
323 DTSTART:19701104T020000
|
|
324 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
|
|
325 TZOFFSETFROM:-0400
|
|
326 TZOFFSETTO:-0500
|
|
327 END:STANDARD
|
|
328 BEGIN:DAYLIGHT
|
|
329 TZNAME:EDT
|
|
330 DTSTART:19700311T020000
|
|
331 RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
|
|
332 TZOFFSETFROM:-0500
|
|
333 TZOFFSETTO:-0400
|
|
334 END:DAYLIGHT
|
|
335 END:VTIMEZONE
|
|
336 BEGIN:VEVENT
|
|
337 UID:20121026T021107Z-6301-1000-1-0@chAir
|
|
338 DTSTAMP:20120905T172126Z
|
|
339 DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
|
|
340 20121026T153000
|
|
341 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
|
|
342 20121026T160000
|
|
343 TRANSP:OPAQUE
|
|
344 SEQUENCE:5
|
|
345 SUMMARY:pick up Ibby
|
|
346 CLASS:PUBLIC
|
|
347 CREATED:20121026T021108Z
|
|
348 LAST-MODIFIED:20121026T021118Z
|
|
349 X-EVOLUTION-MOVE-CALENDAR:1
|
|
350 END:VEVENT
|
|
351 END:VCALENDAR
|
|
352 HI;
|
|
353
|
|
354 $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT', Reader::read($vobj), true);
|
|
355 $ex = new \DateTimeZone('America/New_York');
|
|
356 $this->assertEquals($ex->getName(), $tz->getName());
|
|
357
|
|
358 }
|
|
359
|
|
360 }
|