summaryrefslogtreecommitdiffstats
path: root/Lib/test/datetimetester.py
diff options
context:
space:
mode:
authorAlexander Belopolsky <abalkin@users.noreply.github.com>2018-06-10 21:02:58 (GMT)
committerGitHub <noreply@github.com>2018-06-10 21:02:58 (GMT)
commit877b23202b7e7d4f57b58504fd0eb886e8c0b377 (patch)
treeda6e7b1d515204db9e603a7aa3e01ab222dc2c3b /Lib/test/datetimetester.py
parentaf4b0130d44bf8a1ff4f7b46195d1dc79add444a (diff)
downloadcpython-877b23202b7e7d4f57b58504fd0eb886e8c0b377.zip
cpython-877b23202b7e7d4f57b58504fd0eb886e8c0b377.tar.gz
cpython-877b23202b7e7d4f57b58504fd0eb886e8c0b377.tar.bz2
bpo-33812: Corrected astimezone for naive datetimes. (GH-7578)
A datetime object d is aware if d.tzinfo is not None and d.tzinfo.utcoffset(d) does not return None. If d.tzinfo is None, or if d.tzinfo is not None but d.tzinfo.utcoffset(d) returns None, d is naive. This commit ensures that instances with non-None d.tzinfo, but d.tzinfo.utcoffset(d) returning None are treated as naive. In addition, C acceleration code will raise TypeError if d.tzinfo.utcoffset(d) returns an object with the type other than timedelta. * Updated the documentation. Assume that the term "naive" is defined elsewhere and remove the not entirely correct clarification. Thanks, Tim.
Diffstat (limited to 'Lib/test/datetimetester.py')
-rw-r--r--Lib/test/datetimetester.py25
1 files changed, 16 insertions, 9 deletions
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index a7e5e0b..7d4cdac 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -2414,25 +2414,24 @@ class TestDateTime(TestDate):
base = cls(2000, 2, 29)
self.assertRaises(ValueError, base.replace, year=2001)
+ @support.run_with_tz('EDT4')
def test_astimezone(self):
- return # The rest is no longer applicable
- # Pretty boring! The TZ test is more interesting here. astimezone()
- # simply can't be applied to a naive object.
dt = self.theclass.now()
- f = FixedOffset(44, "")
- self.assertRaises(ValueError, dt.astimezone) # naive
+ f = FixedOffset(44, "0044")
+ dt_utc = dt.replace(tzinfo=timezone(timedelta(hours=-4), 'EDT'))
+ self.assertEqual(dt.astimezone(), dt_utc) # naive
self.assertRaises(TypeError, dt.astimezone, f, f) # too many args
self.assertRaises(TypeError, dt.astimezone, dt) # arg wrong type
- self.assertRaises(ValueError, dt.astimezone, f) # naive
- self.assertRaises(ValueError, dt.astimezone, tz=f) # naive
+ dt_f = dt.replace(tzinfo=f) + timedelta(hours=4, minutes=44)
+ self.assertEqual(dt.astimezone(f), dt_f) # naive
+ self.assertEqual(dt.astimezone(tz=f), dt_f) # naive
class Bogus(tzinfo):
def utcoffset(self, dt): return None
def dst(self, dt): return timedelta(0)
bog = Bogus()
self.assertRaises(ValueError, dt.astimezone, bog) # naive
- self.assertRaises(ValueError,
- dt.replace(tzinfo=bog).astimezone, f)
+ self.assertEqual(dt.replace(tzinfo=bog).astimezone(f), dt_f)
class AlsoBogus(tzinfo):
def utcoffset(self, dt): return timedelta(0)
@@ -2440,6 +2439,14 @@ class TestDateTime(TestDate):
alsobog = AlsoBogus()
self.assertRaises(ValueError, dt.astimezone, alsobog) # also naive
+ class Broken(tzinfo):
+ def utcoffset(self, dt): return 1
+ def dst(self, dt): return 1
+ broken = Broken()
+ dt_broken = dt.replace(tzinfo=broken)
+ with self.assertRaises(TypeError):
+ dt_broken.astimezone()
+
def test_subclass_datetime(self):
class C(self.theclass):