@@ -60,7 +60,26 @@ public function testValidTimezones(string $timezone)
6060
6161 public function getValidTimezones (): iterable
6262 {
63+ // ICU standard (alias/BC in PHP)
64+ yield ['Etc/UTC ' ];
65+ yield ['Etc/GMT ' ];
66+ yield ['America/Buenos_Aires ' ];
67+
68+ // PHP standard (alias in ICU)
69+ yield ['UTC ' ];
6370 yield ['America/Argentina/Buenos_Aires ' ];
71+
72+ // not deprecated in ICU
73+ yield ['CST6CDT ' ];
74+ yield ['EST5EDT ' ];
75+ yield ['MST7MDT ' ];
76+ yield ['PST8PDT ' ];
77+ yield ['America/Montreal ' ];
78+
79+ // expired in ICU
80+ yield ['Europe/Saratov ' ];
81+
82+ // standard
6483 yield ['America/Barbados ' ];
6584 yield ['America/Toronto ' ];
6685 yield ['Antarctica/Syowa ' ];
@@ -71,7 +90,6 @@ public function getValidTimezones(): iterable
7190 yield ['Europe/Copenhagen ' ];
7291 yield ['Europe/Paris ' ];
7392 yield ['Pacific/Noumea ' ];
74- yield ['UTC ' ];
7593 }
7694
7795 /**
@@ -90,6 +108,8 @@ public function testValidGroupedTimezones(string $timezone, int $zone)
90108
91109 public function getValidGroupedTimezones (): iterable
92110 {
111+ yield ['America/Buenos_Aires ' , \DateTimeZone::AMERICA | \DateTimeZone::AUSTRALIA ]; // icu
112+ yield ['America/Argentina/Buenos_Aires ' , \DateTimeZone::AMERICA ]; // php
93113 yield ['America/Argentina/Cordoba ' , \DateTimeZone::AMERICA ];
94114 yield ['America/Barbados ' , \DateTimeZone::AMERICA ];
95115 yield ['Africa/Cairo ' , \DateTimeZone::AFRICA ];
@@ -124,6 +144,7 @@ public function testInvalidTimezoneWithoutZone(string $timezone)
124144
125145 public function getInvalidTimezones (): iterable
126146 {
147+ yield ['Buenos_Aires/America ' ];
127148 yield ['Buenos_Aires/Argentina/America ' ];
128149 yield ['Mayotte/Indian ' ];
129150 yield ['foobar ' ];
@@ -149,11 +170,15 @@ public function testInvalidGroupedTimezones(string $timezone, int $zone)
149170
150171 public function getInvalidGroupedTimezones (): iterable
151172 {
173+ yield ['America/Buenos_Aires ' , \DateTimeZone::ASIA | \DateTimeZone::AUSTRALIA ]; // icu
174+ yield ['America/Argentina/Buenos_Aires ' , \DateTimeZone::EUROPE ]; // php
152175 yield ['Antarctica/McMurdo ' , \DateTimeZone::AMERICA ];
153176 yield ['America/Barbados ' , \DateTimeZone::ANTARCTICA ];
154177 yield ['Europe/Kiev ' , \DateTimeZone::ARCTIC ];
155178 yield ['Asia/Ho_Chi_Minh ' , \DateTimeZone::INDIAN ];
156179 yield ['Asia/Ho_Chi_Minh ' , \DateTimeZone::INDIAN | \DateTimeZone::ANTARCTICA ];
180+ yield ['UTC ' , \DateTimeZone::EUROPE ];
181+ yield ['Etc/UTC ' , \DateTimeZone::EUROPE ];
157182 }
158183
159184 /**
@@ -173,6 +198,8 @@ public function testValidGroupedTimezonesByCountry(string $timezone, string $cou
173198
174199 public function getValidGroupedTimezonesByCountry (): iterable
175200 {
201+ yield ['America/Buenos_Aires ' , 'AR ' ]; // icu
202+ yield ['America/Argentina/Buenos_Aires ' , 'AR ' ]; // php
176203 yield ['America/Argentina/Cordoba ' , 'AR ' ];
177204 yield ['America/Barbados ' , 'BB ' ];
178205 yield ['Africa/Cairo ' , 'EG ' ];
@@ -215,6 +242,7 @@ public function getInvalidGroupedTimezonesByCountry(): iterable
215242 yield ['America/Argentina/Cordoba ' , 'FR ' ];
216243 yield ['America/Barbados ' , 'PT ' ];
217244 yield ['Europe/Bern ' , 'FR ' ];
245+ yield ['Etc/UTC ' , 'NL ' ];
218246 yield ['Europe/Amsterdam ' , 'AC ' ]; // "AC" has no timezones, but is a valid country code
219247 }
220248
@@ -267,8 +295,6 @@ public function testDeprecatedTimezonesAreInvalidWithoutBC(string $timezone)
267295
268296 public function getDeprecatedTimezones (): iterable
269297 {
270- yield ['America/Buenos_Aires ' ];
271- yield ['America/Montreal ' ];
272298 yield ['Australia/ACT ' ];
273299 yield ['Australia/LHI ' ];
274300 yield ['Australia/Queensland ' ];
@@ -277,13 +303,29 @@ public function getDeprecatedTimezones(): iterable
277303 yield ['Canada/Mountain ' ];
278304 yield ['Canada/Pacific ' ];
279305 yield ['CET ' ];
280- yield ['CST6CDT ' ];
281- yield ['Etc/GMT ' ];
306+ yield ['GMT ' ];
282307 yield ['Etc/Greenwich ' ];
283308 yield ['Etc/UCT ' ];
284309 yield ['Etc/Universal ' ];
285- yield ['Etc/UTC ' ];
286310 yield ['Etc/Zulu ' ];
287311 yield ['US/Pacific ' ];
288312 }
313+
314+ /**
315+ * @requires extension intl
316+ */
317+ public function testIntlCompatibility ()
318+ {
319+ $ constraint = new Timezone ([
320+ 'message ' => 'myMessage ' ,
321+ 'intlCompatible ' => true ,
322+ ]);
323+
324+ $ this ->validator ->validate ('Europe/Saratov ' , $ constraint );
325+
326+ $ this ->buildViolation ('myMessage ' )
327+ ->setParameter ('{{ value }} ' , '"Europe/Saratov" ' )
328+ ->setCode (Timezone::TIMEZONE_IDENTIFIER_INTL_ERROR )
329+ ->assertRaised ();
330+ }
289331}
0 commit comments