"AAA4BBB,J1/2,J1/14",
"AAA4BBB,J20/2,J365/2",
"AAA4BBB,J365/2,J365/14",
+ # Leading-zero day-of-year
+ "AAA4BBB,J001/2,J065/2",
+ "AAA4BBB,001/2,065/2",
# Extreme transition hour
"AAA4BBB,J60/167,J300/2",
"AAA4BBB,J60/+167,J300/2",
# Invalid julian offset
"AAA4BBB,J0/2,J20/2",
"AAA4BBB,J20/2,J366/2",
+ # gh-152847: non-digit day-of-year
+ "AAA4BBB,J1_0,J300/2",
+ "AAA4BBB,J60/2,J30_0/2",
+ "AAA4BBB,1_0,J300/2",
+ "AAA4BBB,J+1,J300/2",
+ "AAA4BBB,J 1,J300/2",
+ "AAA4BBB, 1,J300/2",
+ "AAA4BBB,J0001,J300/2",
+ "AAA4BBB,0001,J300/2",
# Invalid transition time
"AAA4BBB,J60/2/3,J300/2",
"AAA4BBB,J60/2,J300/2/3",
with self.assertRaisesRegex(ValueError, expected):
self.zone_from_tzstr(tzstr, encoding="utf-8")
+ def test_invalid_tzstr_non_ascii_dst_date(self):
+ tzstr = "AAA4BBB,J١,J300/2"
+ if self.module is py_zoneinfo:
+ expected = re.escape(tzstr)
+ else:
+ expected = re.escape(repr(tzstr.encode("utf-8")))
+ with self.assertRaisesRegex(ValueError, expected):
+ self.zone_from_tzstr(tzstr, encoding="utf-8")
+
@classmethod
def _populate_test_cases(cls):
# This method uses a somewhat unusual style in that it populates the