@@ -60,7 +60,26 @@ public function testValidTimezones(string $timezone)
6060
6161public 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 ' ];
6370yield ['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
6483yield ['America/Barbados ' ];
6584yield ['America/Toronto ' ];
6685yield ['Antarctica/Syowa ' ];
@@ -71,7 +90,6 @@ public function getValidTimezones(): iterable
7190yield ['Europe/Copenhagen ' ];
7291yield ['Europe/Paris ' ];
7392yield ['Pacific/Noumea ' ];
74- yield ['UTC ' ];
7593 }
7694
7795/**
@@ -90,6 +108,8 @@ public function testValidGroupedTimezones(string $timezone, int $zone)
90108
91109public function getValidGroupedTimezones ():iterable
92110 {
111+ yield ['America/Buenos_Aires ' , \DateTimeZone::AMERICA | \DateTimeZone::AUSTRALIA ];// icu
112+ yield ['America/Argentina/Buenos_Aires ' , \DateTimeZone::AMERICA ];// php
93113yield ['America/Argentina/Cordoba ' , \DateTimeZone::AMERICA ];
94114yield ['America/Barbados ' , \DateTimeZone::AMERICA ];
95115yield ['Africa/Cairo ' , \DateTimeZone::AFRICA ];
@@ -124,6 +144,7 @@ public function testInvalidTimezoneWithoutZone(string $timezone)
124144
125145public function getInvalidTimezones ():iterable
126146 {
147+ yield ['Buenos_Aires/America ' ];
127148yield ['Buenos_Aires/Argentina/America ' ];
128149yield ['Mayotte/Indian ' ];
129150yield ['foobar ' ];
@@ -149,11 +170,15 @@ public function testInvalidGroupedTimezones(string $timezone, int $zone)
149170
150171public function getInvalidGroupedTimezones ():iterable
151172 {
173+ yield ['America/Buenos_Aires ' , \DateTimeZone::ASIA | \DateTimeZone::AUSTRALIA ];// icu
174+ yield ['America/Argentina/Buenos_Aires ' , \DateTimeZone::EUROPE ];// php
152175yield ['Antarctica/McMurdo ' , \DateTimeZone::AMERICA ];
153176yield ['America/Barbados ' , \DateTimeZone::ANTARCTICA ];
154177yield ['Europe/Kiev ' , \DateTimeZone::ARCTIC ];
155178yield ['Asia/Ho_Chi_Minh ' , \DateTimeZone::INDIAN ];
156179yield ['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
174199public function getValidGroupedTimezonesByCountry ():iterable
175200 {
201+ yield ['America/Buenos_Aires ' ,'AR ' ];// icu
202+ yield ['America/Argentina/Buenos_Aires ' ,'AR ' ];// php
176203yield ['America/Argentina/Cordoba ' ,'AR ' ];
177204yield ['America/Barbados ' ,'BB ' ];
178205yield ['Africa/Cairo ' ,'EG ' ];
@@ -215,6 +242,7 @@ public function getInvalidGroupedTimezonesByCountry(): iterable
215242yield ['America/Argentina/Cordoba ' ,'FR ' ];
216243yield ['America/Barbados ' ,'PT ' ];
217244yield ['Europe/Bern ' ,'FR ' ];
245+ yield ['Etc/UTC ' ,'NL ' ];
218246yield ['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
268296public function getDeprecatedTimezones ():iterable
269297 {
270- yield ['America/Buenos_Aires ' ];
271- yield ['America/Montreal ' ];
272298yield ['Australia/ACT ' ];
273299yield ['Australia/LHI ' ];
274300yield ['Australia/Queensland ' ];
@@ -277,13 +303,29 @@ public function getDeprecatedTimezones(): iterable
277303yield ['Canada/Mountain ' ];
278304yield ['Canada/Pacific ' ];
279305yield ['CET ' ];
280- yield ['CST6CDT ' ];
281- yield ['Etc/GMT ' ];
306+ yield ['GMT ' ];
282307yield ['Etc/Greenwich ' ];
283308yield ['Etc/UCT ' ];
284309yield ['Etc/Universal ' ];
285- yield ['Etc/UTC ' ];
286310yield ['Etc/Zulu ' ];
287311yield ['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}