Skip to content

Commit

Permalink
Test that new_timezone can return the UTC singleton (pythongh-5318)
Browse files Browse the repository at this point in the history
  • Loading branch information
pganssle authored and abalkin committed Feb 22, 2018
1 parent 48e8c82 commit a049f57
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
22 changes: 22 additions & 0 deletions Lib/test/datetimetester.py
Original file line number Diff line number Diff line change
Expand Up @@ -5489,6 +5489,28 @@ def test_timezones_capi(self):

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
Expand Down
24 changes: 24 additions & 0 deletions Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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},
Expand Down

0 comments on commit a049f57

Please sign in to comment.