From a049f5790e38fe1b1ba1d4c10ed5ab35150806fa Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Thu, 22 Feb 2018 15:15:32 -0500 Subject: [PATCH] Test that new_timezone can return the UTC singleton (gh-5318) --- Lib/test/datetimetester.py | 22 ++++++++++++++++++++++ Modules/_testcapimodule.c | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 8f9ebddff5a..436cbea9669 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -5489,6 +5489,28 @@ class CapiTest(unittest.TestCase): self.assertEqual(dt1.astimezone(timezone.utc), dt_utc) + def test_timezones_offset_zero(self): + utc0, utc1, non_utc = _testcapi.get_timezones_offset_zero() + + with self.subTest(testname="utc0"): + self.assertIs(utc0, timezone.utc) + + with self.subTest(testname="utc1"): + self.assertIs(utc1, timezone.utc) + + with self.subTest(testname="non_utc"): + self.assertIsNot(non_utc, timezone.utc) + + non_utc_exp = timezone(timedelta(hours=0), "") + + self.assertEqual(non_utc, non_utc_exp) + + dt1 = datetime(2000, 2, 4, tzinfo=non_utc) + dt2 = datetime(2000, 2, 4, tzinfo=non_utc_exp) + + self.assertEqual(dt1, dt2) + self.assertEqual(dt1.tzname(), dt2.tzname()) + def test_check_date(self): class DateSubclass(date): pass diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 2ad4322ecaa..afce6c94489 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2293,6 +2293,29 @@ make_timezones_capi(PyObject *self, PyObject *args) { return rv; } +static PyObject * +get_timezones_offset_zero(PyObject *self, PyObject *args) { + PyObject *offset = PyDelta_FromDSU(0, 0, 0); + PyObject *name = PyUnicode_FromString(""); + + // These two should return the UTC singleton + PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset); + PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL); + + // This one will return +00:00 zone, but not the UTC singleton + PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name); + + Py_DecRef(offset); + Py_DecRef(name); + + PyObject *rv = PyTuple_New(3); + PyTuple_SET_ITEM(rv, 0, utc_singleton_0); + PyTuple_SET_ITEM(rv, 1, utc_singleton_1); + PyTuple_SET_ITEM(rv, 2, non_utc_zone); + + return rv; +} + static PyObject * get_timezone_utc_capi(PyObject* self, PyObject *args) { int macro = 0; @@ -4540,6 +4563,7 @@ static PyMethodDef TestMethods[] = { {"datetime_check_delta", datetime_check_delta, METH_VARARGS}, {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS}, {"make_timezones_capi", make_timezones_capi, METH_NOARGS}, + {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS}, {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS}, {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS}, {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},