# See https://github.com/python/cpython/blob/3.9/Lib/test/datetimetester.py # # This script can be run in 3 different modes: # 1. `python3 test_datetime.py --stdlib`: checks that the tests comply to # CPython's standard datetime library. # 2. `python3 test_datetime.py`: runs the tests against datetime.py, using # CPython's standard unittest (which accepts filter options, such as # `-v TestTimeDelta -k tuple`, and provides more verbose output in case # of failure). # 3. `micropython test_datetime.py`: runs the tests against datetime.py # using MicroPython's unittest library (which must be available). # # This script also accepts option `--reorder` which rewrites this file # in-place by numbering tests in sequence. import sys STDLIB = False if __name__ == "__main__": while len(sys.argv) > 1: if sys.argv[1] == "--reorder": import fileinput, re with fileinput.input(files=sys.argv[0], inplace=True) as f: cases = {} n = 0 for line in f: match = re.match("(\s+def\s+test_)(\w+?)(?:\d+)(\(.+\):)", line) if match: prefix, name, suffix = match.groups() if name != last_name: if name in cases[case]: sys.exit( f"duplicated test in {case} at line {fileinput.filelineno()}: {name}" ) cases[case].append(name) last_name = name i = 0 print(f"{prefix}{name}{i:02d}{suffix}") i += 1 n += 1 continue match = re.match("class\s+(Test[\w\d]+)\(", line) if match: case = match[1] if case in cases: sys.exit( f"duplicated test case at line {fileinput.filelineno()}: {case}" ) cases[case] = [] last_name = "" print(line, end="") print(f"Reordered {n} tests in {len(cases)} cases") elif sys.argv[1] == "--stdlib": sys.path.pop(0) STDLIB = True else: break sys.argv.pop(1) import os import time as mod_time import datetime as mod_datetime from datetime import MAXYEAR, MINYEAR, datetime, date, time, timedelta, timezone, tzinfo import unittest # See localtz.patch try: datetime.fromtimestamp(0) LOCALTZ = True except NotImplementedError: LOCALTZ = False if hasattr(datetime, "EPOCH"): EPOCH = datetime.EPOCH else: EPOCH = datetime(*mod_time.gmtime(0)[:6], tzinfo=timezone.utc) def eval_mod(s): return eval(s.replace("datetime.", "mod_datetime.")) ### timedelta ################################################################ a = timedelta(hours=7) b = timedelta(minutes=6) c = timedelta(seconds=10) us = timedelta(microseconds=1) td0 = timedelta(0) td1 = timedelta(2, 3, 4) td2 = timedelta(2, 3, 4) td3 = timedelta(2, 3, 5) td4 = timedelta( days=100, weeks=-7, hours=-24 * (100 - 49), minutes=-3, seconds=12, microseconds=(3 * 60 - 12) * 1000000, ) # == timedelta(0) td1h = timedelta(hours=1) td1hr = "datetime.timedelta(microseconds={})".format(1 * 3600 * 10**6) td10h2m = timedelta(hours=10, minutes=2) td10h2mr = "datetime.timedelta(microseconds={})".format((10 * 3600 + 2 * 60) * 10**6) tdn10h2m40s = timedelta(hours=-10, minutes=2, seconds=40) tdn10h2m40sr = "datetime.timedelta(microseconds={})".format((-10 * 3600 + 2 * 60 + 40) * 10**6) td1h2m40s100us = timedelta(hours=1, minutes=2, seconds=40, microseconds=100) td1h2m40s100usr = "datetime.timedelta(microseconds={})".format( (1 * 3600 + 2 * 60 + 40) * 10**6 + 100 ) class Test0TimeDelta(unittest.TestCase): def test___init__00(self): self.assertEqual(timedelta(), timedelta(weeks=0, days=0, hours=0, minutes=0, seconds=0)) def test___init__01(self): self.assertEqual(timedelta(weeks=1), timedelta(days=7)) def test___init__02(self): self.assertEqual(timedelta(days=1), timedelta(hours=24)) def test___init__03(self): self.assertEqual(timedelta(hours=1), timedelta(minutes=60)) def test___init__04(self): self.assertEqual(timedelta(minutes=1), timedelta(seconds=60)) def test___init__05(self): self.assertEqual(timedelta(seconds=1), timedelta(milliseconds=1000)) def test___init__06(self): self.assertEqual(timedelta(milliseconds=1), timedelta(microseconds=1000)) def test___init__07(self): self.assertEqual(timedelta(weeks=1.0 / 7), timedelta(days=1)) def test___init__08(self): self.assertEqual(timedelta(days=1.0 / 24), timedelta(hours=1)) def test___init__09(self): self.assertEqual(timedelta(hours=1.0 / 60), timedelta(minutes=1)) def test___init__10(self): self.assertEqual(timedelta(minutes=1.0 / 60), timedelta(seconds=1)) def test___init__11(self): self.assertEqual(timedelta(seconds=0.001), timedelta(milliseconds=1)) def test___init__12(self): self.assertEqual(timedelta(milliseconds=0.001), timedelta(microseconds=1)) def test___init__13(self): self.assertEqual(td1h, eval_mod(td1hr)) def test___init__14(self): self.assertEqual(td10h2m, eval_mod(td10h2mr)) def test___init__15(self): self.assertEqual(tdn10h2m40s, eval_mod(tdn10h2m40sr)) def test___init__16(self): self.assertEqual(td1h2m40s100us, eval_mod(td1h2m40s100usr)) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__00(self): self.assertEqual(repr(td1h), td1hr) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__01(self): self.assertEqual(repr(td10h2m), td10h2mr) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__02(self): self.assertEqual(repr(tdn10h2m40s), tdn10h2m40sr) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__03(self): self.assertEqual(repr(td1h2m40s100us), td1h2m40s100usr) def test___repr__04(self): self.assertEqual(td1, eval_mod(repr(td1))) def test_total_seconds00(self): d = timedelta(days=365) self.assertEqual(d.total_seconds(), 31536000.0) def test_days00(self): self.assertEqual(td1.days, 2) def test_seconds00(self): self.assertEqual(td1.seconds, 3) def test_microseconds00(self): self.assertEqual(td1.microseconds, 4) def test___add__00(self): self.assertEqual(a + b + c, timedelta(hours=7, minutes=6, seconds=10)) def test___add__01(self): dt = a + datetime(2010, 1, 1, 12, 30) self.assertEqual(dt, datetime(2010, 1, 1, 12 + 7, 30)) def test___sub__00(self): self.assertEqual(a - b, timedelta(hours=6, minutes=60 - 6)) def test___neg__00(self): self.assertEqual(-a, timedelta(hours=-7)) def test___neg__01(self): self.assertEqual(-b, timedelta(hours=-1, minutes=54)) def test___neg__02(self): self.assertEqual(-c, timedelta(hours=-1, minutes=59, seconds=50)) def test___pos__00(self): self.assertEqual(+a, timedelta(hours=7)) def test___abs__00(self): self.assertEqual(abs(a), a) def test___abs__01(self): self.assertEqual(abs(-a), a) def test___mul__00(self): self.assertEqual(a * 10, timedelta(hours=70)) def test___mul__01(self): self.assertEqual(a * 10, 10 * a) def test___mul__02(self): self.assertEqual(b * 10, timedelta(minutes=60)) def test___mul__03(self): self.assertEqual(10 * b, timedelta(minutes=60)) def test___mul__04(self): self.assertEqual(c * 10, timedelta(seconds=100)) def test___mul__05(self): self.assertEqual(10 * c, timedelta(seconds=100)) def test___mul__06(self): self.assertEqual(a * -1, -a) def test___mul__07(self): self.assertEqual(b * -2, -b - b) def test___mul__08(self): self.assertEqual(c * -2, -c + -c) def test___mul__09(self): self.assertEqual(b * (60 * 24), (b * 60) * 24) def test___mul__10(self): self.assertEqual(b * (60 * 24), (60 * b) * 24) def test___mul__11(self): self.assertEqual(c * 6, timedelta(minutes=1)) def test___mul__12(self): self.assertEqual(6 * c, timedelta(minutes=1)) def test___truediv__00(self): self.assertEqual(a / 0.5, timedelta(hours=14)) def test___truediv__01(self): self.assertEqual(b / 0.5, timedelta(minutes=12)) def test___truediv__02(self): self.assertEqual(a / 7, timedelta(hours=1)) def test___truediv__03(self): self.assertEqual(b / 6, timedelta(minutes=1)) def test___truediv__04(self): self.assertEqual(c / 10, timedelta(seconds=1)) def test___truediv__05(self): self.assertEqual(a / 10, timedelta(minutes=7 * 6)) def test___truediv__06(self): self.assertEqual(a / 3600, timedelta(seconds=7)) def test___truediv__07(self): self.assertEqual(a / a, 1.0) def test___truediv__08(self): t = timedelta(hours=1, minutes=24, seconds=19) second = timedelta(seconds=1) self.assertEqual(t / second, 5059.0) def test___truediv__09(self): t = timedelta(minutes=2, seconds=30) minute = timedelta(minutes=1) self.assertEqual(t / minute, 2.5) def test___floordiv__00(self): self.assertEqual(a // 7, timedelta(hours=1)) def test___floordiv__01(self): self.assertEqual(b // 6, timedelta(minutes=1)) def test___floordiv__02(self): self.assertEqual(c // 10, timedelta(seconds=1)) def test___floordiv__03(self): self.assertEqual(a // 10, timedelta(minutes=7 * 6)) def test___floordiv__04(self): self.assertEqual(a // 3600, timedelta(seconds=7)) def test___floordiv__05(self): t = timedelta(hours=1, minutes=24, seconds=19) second = timedelta(seconds=1) self.assertEqual(t // second, 5059) def test___floordiv__06(self): t = timedelta(minutes=2, seconds=30) minute = timedelta(minutes=1) self.assertEqual(t // minute, 2) def test___mod__00(self): t = timedelta(minutes=2, seconds=30) r = t % timedelta(minutes=1) self.assertEqual(r, timedelta(seconds=30)) def test___mod__01(self): t = timedelta(minutes=-2, seconds=30) r = t % timedelta(minutes=1) self.assertEqual(r, timedelta(seconds=30)) def test___divmod__00(self): t = timedelta(minutes=2, seconds=30) q, r = divmod(t, timedelta(minutes=1)) self.assertEqual(q, 2) self.assertEqual(r, timedelta(seconds=30)) def test___divmod__01(self): t = timedelta(minutes=-2, seconds=30) q, r = divmod(t, timedelta(minutes=1)) self.assertEqual(q, -2) self.assertEqual(r, timedelta(seconds=30)) def test___eq__00(self): self.assertEqual(td1, td2) def test___eq__01(self): self.assertTrue(not td1 != td2) def test___eq__02(self): self.assertEqual(timedelta(hours=6, minutes=60), a) def test___eq__03(self): self.assertEqual(timedelta(seconds=60 * 6), b) def test___eq__04(self): self.assertTrue(not td1 == td3) def test___eq__05(self): self.assertTrue(td1 != td3) def test___eq__06(self): self.assertTrue(td3 != td1) def test___eq__07(self): self.assertTrue(not td3 == td1) def test___le__00(self): self.assertTrue(td1 <= td2) def test___le__01(self): self.assertTrue(td1 <= td3) def test___le__02(self): self.assertTrue(not td3 <= td1) def test___lt__00(self): self.assertTrue(not td1 < td2) def test___lt__01(self): self.assertTrue(td1 < td3) def test___lt__02(self): self.assertTrue(not td3 < td1) def test___ge__00(self): self.assertTrue(td1 >= td2) def test___ge__01(self): self.assertTrue(td3 >= td1) def test___ge__02(self): self.assertTrue(not td1 >= td3) def test___gt__00(self): self.assertTrue(not td1 > td2) def test___gt__01(self): self.assertTrue(td3 > td1) def test___gt__02(self): self.assertTrue(not td1 > td3) def test___bool__00(self): self.assertTrue(timedelta(hours=1)) def test___bool__01(self): self.assertTrue(timedelta(minutes=1)) def test___bool__02(self): self.assertTrue(timedelta(seconds=1)) def test___bool__03(self): self.assertTrue(not td0) def test___str__00(self): self.assertEqual(str(timedelta(days=1)), "1 day, 0:00:00") def test___str__01(self): self.assertEqual(str(timedelta(days=-1)), "-1 day, 0:00:00") def test___str__02(self): self.assertEqual(str(timedelta(days=2)), "2 days, 0:00:00") def test___str__03(self): self.assertEqual(str(timedelta(days=-2)), "-2 days, 0:00:00") def test___str__04(self): self.assertEqual(str(timedelta(hours=12, minutes=58, seconds=59)), "12:58:59") def test___str__05(self): self.assertEqual(str(timedelta(hours=2, minutes=3, seconds=4)), "2:03:04") def test___hash__00(self): self.assertEqual(td0, td4) self.assertEqual(hash(td0), hash(td4)) def test___hash__01(self): tt0 = td0 + timedelta(weeks=7) tt4 = td4 + timedelta(days=7 * 7) self.assertEqual(hash(tt0), hash(tt4)) def test___hash__02(self): d = {td0: 1} d[td4] = 2 self.assertEqual(len(d), 1) self.assertEqual(d[td0], 2) def test_constant00(self): self.assertIsInstance(timedelta.min, timedelta) self.assertIsInstance(timedelta.max, timedelta) self.assertIsInstance(timedelta.resolution, timedelta) self.assertTrue(timedelta.max > timedelta.min) def test_constant01(self): self.assertEqual(timedelta.min, timedelta(days=-999_999_999)) def test_constant02(self): self.assertEqual( timedelta.max, timedelta(days=999_999_999, seconds=24 * 3600 - 1, microseconds=10**6 - 1), ) def test_constant03(self): self.assertEqual(timedelta.resolution, timedelta(microseconds=1)) def test_computation00(self): self.assertEqual((3 * us) * 0.5, 2 * us) def test_computation01(self): self.assertEqual((5 * us) * 0.5, 2 * us) def test_computation02(self): self.assertEqual(0.5 * (3 * us), 2 * us) def test_computation03(self): self.assertEqual(0.5 * (5 * us), 2 * us) def test_computation04(self): self.assertEqual((-3 * us) * 0.5, -2 * us) def test_computation05(self): self.assertEqual((-5 * us) * 0.5, -2 * us) def test_computation06(self): self.assertEqual((3 * us) / 2, 2 * us) def test_computation07(self): self.assertEqual((5 * us) / 2, 2 * us) def test_computation08(self): self.assertEqual((-3 * us) / 2.0, -2 * us) def test_computation09(self): self.assertEqual((-5 * us) / 2.0, -2 * us) def test_computation10(self): self.assertEqual((3 * us) / -2, -2 * us) def test_computation11(self): self.assertEqual((5 * us) / -2, -2 * us) def test_computation12(self): self.assertEqual((3 * us) / -2.0, -2 * us) def test_computation13(self): self.assertEqual((5 * us) / -2.0, -2 * us) def test_computation14(self): for i in range(-10, 10): # with self.subTest(i=i): not supported by Micropython self.assertEqual((i * us / 3) // us, round(i / 3)) def test_computation15(self): for i in range(-10, 10): # with self.subTest(i=i): not supported by Micropython self.assertEqual((i * us / -3) // us, round(i / -3)) def test_carries00(self): td1 = timedelta( days=100, weeks=-7, hours=-24 * (100 - 49), minutes=-3, seconds=3 * 60 + 1, ) td2 = timedelta(seconds=1) self.assertEqual(td1, td2) def test_resolution00(self): self.assertIsInstance(timedelta.min, timedelta) def test_resolution01(self): self.assertIsInstance(timedelta.max, timedelta) def test_resolution02(self): self.assertIsInstance(timedelta.resolution, timedelta) def test_resolution03(self): self.assertTrue(timedelta.max > timedelta.min) def test_resolution04(self): self.assertEqual(timedelta.resolution, timedelta(microseconds=1)) @unittest.skipIf(STDLIB, "standard timedelta has no tuple()") def test_tuple00(self): self.assertEqual(td1.tuple(), (2, 0, 0, 3, 4)) @unittest.skipIf(STDLIB, "standard timedelta has no tuple()") def test_tuple01(self): self.assertEqual(td1h2m40s100us.tuple(), (0, 1, 2, 40, 100)) ### timezone ################################################################# class Cet(tzinfo): # Central European Time (see https://en.wikipedia.org/wiki/Summer_time_in_Europe) def utcoffset(self, dt): h = 2 if self.isdst(dt)[0] else 1 return timedelta(hours=h) def dst(self, dt): h = 1 if self.isdst(dt)[0] else 0 return timedelta(hours=h) def tzname(self, dt): return "CEST" if self.isdst(dt)[0] else "CET" def fromutc(self, dt): assert dt.tzinfo is self isdst, fold = self.isdst(dt, utc=True) h = 2 if isdst else 1 dt += timedelta(hours=h) dt = dt.replace(fold=fold) return dt def isdst(self, dt, utc=False): if dt is None: return False, None year = dt.year if not 2000 <= year < 2100: # Formulas below are valid in the range [2000; 2100) raise ValueError hour = 1 if utc else 3 day = 31 - (5 * year // 4 + 4) % 7 # last Sunday of March beg = datetime(year, 3, day, hour) day = 31 - (5 * year // 4 + 1) % 7 # last Sunday of October end = datetime(year, 10, day, hour) dt = dt.replace(tzinfo=None) if utc: fold = 1 if end <= dt < end + timedelta(hours=1) else 0 else: fold = dt.fold isdst = beg <= dt < end return isdst, fold def __repr__(self): return "Cet()" def __str__(self): return self.tzname(None) def __eq__(self, other): return repr(self) == repr(other) def __hash__(self): return hash(repr(self)) class USTimeZone(tzinfo): DSTSTART = datetime(1, 3, 8, 2) DSTEND = datetime(1, 11, 1, 2) ZERO = timedelta(0) HOUR = timedelta(hours=1) def __init__(self, hours, reprname, stdname, dstname): self.stdoffset = timedelta(hours=hours) self.reprname = reprname self.stdname = stdname self.dstname = dstname def __repr__(self): return self.reprname def tzname(self, dt): if self.dst(dt): return self.dstname else: return self.stdname def utcoffset(self, dt): return self.stdoffset + self.dst(dt) def dst(self, dt): if dt is None or dt.tzinfo is None: return self.ZERO assert dt.tzinfo is self start, end = USTimeZone.us_dst_range(dt.year) dt = dt.replace(tzinfo=None) if start + self.HOUR <= dt < end - self.HOUR: return self.HOUR if end - self.HOUR <= dt < end: return self.ZERO if dt.fold else self.HOUR if start <= dt < start + self.HOUR: return self.HOUR if dt.fold else self.ZERO return self.ZERO def fromutc(self, dt): assert dt.tzinfo is self start, end = USTimeZone.us_dst_range(dt.year) start = start.replace(tzinfo=self) end = end.replace(tzinfo=self) std_time = dt + self.stdoffset dst_time = std_time + self.HOUR if end <= dst_time < end + self.HOUR: return std_time.replace(fold=1) if std_time < start or dst_time >= end: return std_time if start <= std_time < end - self.HOUR: return dst_time @staticmethod def us_dst_range(year): start = first_sunday_on_or_after(USTimeZone.DSTSTART.replace(year=year)) end = first_sunday_on_or_after(USTimeZone.DSTEND.replace(year=year)) return start, end @staticmethod def first_sunday_on_or_after(dt): days_to_go = 6 - dt.weekday() if days_to_go: dt += timedelta(days_to_go) return dt class LocalTz: def __init__(self, tz): self.tz = tz self._old = None @staticmethod def _set(tz): if hasattr(mod_time, "tzset"): # Python if tz: os.environ["TZ"] = tz else: del os.environ["TZ"] mod_time.tzset() else: if tz: os.putenv("TZ", tz) else: os.unsetenv("TZ") def set(self): self._old = os.getenv("TZ") LocalTz._set(self.tz) def unset(self): LocalTz._set(self._old) self._old = None def __enter__(self): self.set() def __exit__(self, typ, value, trace): self.unset() tz_acdt = timezone(timedelta(hours=9.5), "ACDT") tz_est = timezone(-timedelta(hours=5), "EST") tz1 = timezone(timedelta(hours=-1)) tz2 = Cet() tz3 = USTimeZone(-5, "Eastern", "EST", "EDT") class Test1TimeZone(unittest.TestCase): def test___init__00(self): self.assertEqual(str(tz_acdt), "ACDT") self.assertEqual(str(tz_acdt), tz_acdt.tzname(None)) def test___init__01(self): self.assertEqual(str(tz_est), "EST") self.assertEqual(str(tz_est), tz_est.tzname(None)) def test___init__02(self): self.assertEqual(str(tz1), "UTC-01:00") self.assertEqual(str(tz1), tz1.tzname(None)) def test___init__03(self): self.assertEqual(str(tz2), "CET") self.assertEqual(str(tz2), tz2.tzname(None)) def test___init__04(self): offset = timedelta(hours=-24, microseconds=1) tz = timezone(offset) self.assertIsInstance(tz, timezone) def test___init__05(self): offset = timedelta(hours=24, microseconds=-1) tz = timezone(offset) self.assertIsInstance(tz, timezone) def test___init__06(self): offset = timedelta(hours=-24) self.assertRaises(ValueError, timezone, offset) def test___init__07(self): offset = timedelta(hours=24) self.assertRaises(ValueError, timezone, offset) def test___repr__00(self): self.assertEqual(tz1, eval_mod(repr(tz1))) def test___eq__00(self): self.assertEqual(timezone(timedelta(hours=1)), timezone(timedelta(hours=1))) def test___eq__01(self): self.assertNotEqual(timezone(timedelta(hours=1)), timezone(timedelta(hours=2))) def test___eq__02(self): self.assertEqual(timezone(timedelta(hours=-5)), timezone(timedelta(hours=-5), "EST")) def test_utcoffset00(self): self.assertEqual(str(tz2.utcoffset(None)), "1:00:00") def test_utcoffset01(self): self.assertEqual(str(tz2.utcoffset(datetime(2010, 3, 27, 12))), "1:00:00") def test_utcoffset02(self): self.assertEqual(str(tz2.utcoffset(datetime(2010, 3, 28, 12))), "2:00:00") def test_utcoffset03(self): self.assertEqual(str(tz2.utcoffset(datetime(2010, 10, 30, 12))), "2:00:00") def test_utcoffset04(self): self.assertEqual(str(tz2.utcoffset(datetime(2010, 10, 31, 12))), "1:00:00") def test_tzname00(self): self.assertEqual(tz2.tzname(datetime(2011, 1, 1)), "CET") def test_tzname01(self): self.assertEqual(tz2.tzname(datetime(2011, 8, 1)), "CEST") def test_utc00(self): self.assertEqual(timezone.utc.utcoffset(None), td0) def test_fromutc00(self): utc = EPOCH.replace(tzinfo=tz_acdt) self.assertEqual(tz_acdt.fromutc(utc), utc + 9.5 * td1h) def test_fromutc01(self): utc = EPOCH.replace(tzinfo=tz_est) self.assertEqual(tz_est.fromutc(utc), utc + 5 * -td1h) def test_fromutc02(self): utc = datetime(2010, 3, 28, 0, 59, 59, 999_999, tz2) dt = tz2.fromutc(utc) self.assertEqual(dt, utc + td1h) self.assertFalse(dt.fold) def test_fromutc03(self): utc = datetime(2010, 3, 28, 1, 0, 0, 0, tz2) dt = tz2.fromutc(utc) self.assertEqual(dt, utc + 2 * td1h) self.assertFalse(dt.fold) def test_fromutc04(self): utc = datetime(2010, 10, 31, 0, 59, 59, 999_999, tz2) dt = tz2.fromutc(utc) self.assertEqual(dt, utc + 2 * td1h) self.assertFalse(dt.fold) def test_fromutc05(self): utc = datetime(2010, 10, 31, 1, 0, 0, 0, tz2) dt = tz2.fromutc(utc) self.assertEqual(dt, utc + td1h) self.assertTrue(dt.fold) def test_fromutc06(self): dt1 = tz2.fromutc(datetime(2010, 10, 31, 0, 0, 0, 0, tz2)) dt2 = tz2.fromutc(datetime(2010, 10, 31, 1, 0, 0, 0, tz2)) self.assertEqual(dt1, dt2) self.assertNotEqual(dt1.fold, dt2.fold) def test_aware_datetime00(self): t = datetime(1, 1, 1) self.assertEqual(tz1.tzname(t), t.replace(tzinfo=tz1).tzname()) def test_aware_datetime01(self): t = datetime(1, 1, 1) self.assertEqual(tz1.utcoffset(t), t.replace(tzinfo=tz1).utcoffset()) def test_aware_datetime02(self): t = datetime(1, 1, 1) self.assertEqual(tz1.dst(t), t.replace(tzinfo=tz1).dst()) def test_offset_boundaries00(self): td = timedelta(hours=23, minutes=59, seconds=59, microseconds=999999) for i in (1, -1): self.assertIsInstance(timezone(i * td), timezone) def test_offset_boundaries01(self): td = timedelta(hours=24) for i in (1, -1): with self.assertRaises(ValueError): timezone(i * td) ### date ##################################################################### d1 = date(2002, 1, 31) d1r = "datetime.date(0, 0, 730881)" d2 = date(1956, 1, 31) d2d1s = (46 * 365 + len(range(1956, 2002, 4))) * 24 * 60 * 60 d3 = date(2002, 3, 1) d4 = date(2002, 3, 2) d5 = date(2002, 1, 31) hour = timedelta(hours=1) day = timedelta(days=1) week = timedelta(weeks=1) max_days = MAXYEAR * 365 + MAXYEAR // 4 - MAXYEAR // 100 + MAXYEAR // 400 class Test2Date(unittest.TestCase): def test___init__00(self): self.assertEqual(d1.year, 2002) self.assertEqual(d1.month, 1) self.assertEqual(d1.day, 31) @unittest.skipIf(STDLIB, "not supported by standard datetime") def test___init__01(self): date(0, 0, 1) @unittest.skipIf(STDLIB, "not supported by standard datetime") def test___init__02(self): date(0, 0, max_days) def test___init__03(self): datetime(2000, 2, 29) def test___init__04(self): datetime(2004, 2, 29) def test___init__05(self): datetime(2400, 2, 29) def test___init__06(self): self.assertRaises(ValueError, datetime, 2000, 2, 30) def test___init__07(self): self.assertRaises(ValueError, datetime, 2001, 2, 29) def test___init__08(self): self.assertRaises(ValueError, datetime, 2100, 2, 29) def test___init__09(self): self.assertRaises(ValueError, datetime, 1900, 2, 29) def test___init__10(self): self.assertRaises(ValueError, date, MINYEAR - 1, 1, 1) self.assertRaises(ValueError, date, MINYEAR, 0, 1) self.assertRaises(ValueError, date, MINYEAR, 1, 0) def test___init__11(self): self.assertRaises(ValueError, date, MAXYEAR + 1, 12, 31) self.assertRaises(ValueError, date, MAXYEAR, 13, 31) self.assertRaises(ValueError, date, MAXYEAR, 12, 32) def test___init__12(self): self.assertRaises(ValueError, date, 1, 2, 29) self.assertRaises(ValueError, date, 1, 4, 31) self.assertRaises(ValueError, date, 1, 6, 31) self.assertRaises(ValueError, date, 1, 9, 31) self.assertRaises(ValueError, date, 1, 11, 31) def test_fromtimestamp00(self): with LocalTz("UTC"): d = date.fromtimestamp(1012435200) self.assertEqual(d, d1) def test_fromtimestamp01(self): with LocalTz("UTC"): d = date.fromtimestamp(1012435200 + 1) self.assertEqual(d, d1) def test_fromtimestamp02(self): with LocalTz("UTC"): d = date.fromtimestamp(1012435200 - 1) self.assertEqual(d, d1 - timedelta(days=1)) def test_fromtimestamp03(self): with LocalTz("Europe/Rome"): d = date.fromtimestamp(1012435200 - 3601) self.assertEqual(d, d1 - timedelta(days=1)) def test_today00(self): tm = mod_time.localtime()[:3] dt = date.today() dd = (dt.year, dt.month, dt.day) self.assertEqual(tm, dd) def test_fromordinal00(self): self.assertEqual(date.fromordinal(1), date(1, 1, 1)) def test_fromordinal01(self): self.assertEqual(date.fromordinal(max_days), date(MAXYEAR, 12, 31)) def test_fromisoformat00(self): self.assertEqual(datetime.fromisoformat("1975-08-10"), datetime(1975, 8, 10)) def test_year00(self): self.assertEqual(d1.year, 2002) def test_year01(self): self.assertEqual(d2.year, 1956) def test_month00(self): self.assertEqual(d1.month, 1) def test_month01(self): self.assertEqual(d4.month, 3) def test_day00(self): self.assertEqual(d1.day, 31) def test_day01(self): self.assertEqual(d4.day, 2) def test_toordinal00(self): self.assertEqual(date(1, 1, 1).toordinal(), 1) def test_toordinal01(self): self.assertEqual(date(MAXYEAR, 12, 31).toordinal(), max_days) def test_timetuple00(self): self.assertEqual(d1.timetuple()[:8], (2002, 1, 31, 0, 0, 0, 3, 31)) def test_timetuple01(self): self.assertEqual(d3.timetuple()[:8], (2002, 3, 1, 0, 0, 0, 4, 60)) def test_replace00(self): self.assertEqual(d1.replace(), d1) def test_replace01(self): self.assertEqual(d1.replace(year=2001), date(2001, 1, 31)) def test_replace02(self): self.assertEqual(d1.replace(month=5), date(2002, 5, 31)) def test_replace03(self): self.assertEqual(d1.replace(day=16), date(2002, 1, 16)) def test___add__00(self): self.assertEqual(d4 + hour, d4) def test___add__01(self): self.assertEqual(d4 + day, date(2002, 3, 3)) def test___add__02(self): self.assertEqual(d4 + week, date(2002, 3, 9)) def test___add__03(self): self.assertEqual(d4 + 52 * week, date(2003, 3, 1)) def test___add__04(self): self.assertEqual(d4 + -hour, date(2002, 3, 1)) def test___add__05(self): self.assertEqual(d5 + -day, date(2002, 1, 30)) def test___add__06(self): self.assertEqual(d4 + -week, date(2002, 2, 23)) def test___sub__00(self): d = d1 - d2 self.assertEqual(d.total_seconds(), d2d1s) def test___sub__01(self): self.assertEqual(d4 - hour, d4) def test___sub__02(self): self.assertEqual(d4 - day, date(2002, 3, 1)) def test___sub__03(self): self.assertEqual(d4 - week, date(2002, 2, 23)) def test___sub__04(self): self.assertEqual(d4 - 52 * week, date(2001, 3, 3)) def test___sub__05(self): self.assertEqual(d4 - -hour, date(2002, 3, 3)) def test___sub__06(self): self.assertEqual(d4 - -day, date(2002, 3, 3)) def test___sub__07(self): self.assertEqual(d4 - -week, date(2002, 3, 9)) def test___eq__00(self): self.assertEqual(d1, d5) def test___eq__01(self): self.assertFalse(d1 != d5) def test___eq__02(self): self.assertTrue(d2 != d5) def test___eq__03(self): self.assertTrue(d5 != d2) def test___eq__04(self): self.assertFalse(d2 == d5) def test___eq__05(self): self.assertFalse(d5 == d2) def test___eq__06(self): self.assertFalse(d1 == None) def test___eq__07(self): self.assertTrue(d1 != None) def test___le__00(self): self.assertTrue(d1 <= d5) def test___le__01(self): self.assertTrue(d2 <= d5) def test___le__02(self): self.assertFalse(d5 <= d2) def test___ge__00(self): self.assertTrue(d1 >= d5) def test___ge__01(self): self.assertTrue(d5 >= d2) def test___ge__02(self): self.assertFalse(d2 >= d5) def test___lt__00(self): self.assertFalse(d1 < d5) def test___lt__01(self): self.assertTrue(d2 < d5) def test___lt__02(self): self.assertFalse(d5 < d2) def test___gt__00(self): self.assertFalse(d1 > d5) def test___gt__01(self): self.assertTrue(d5 > d2) def test___gt__02(self): self.assertFalse(d2 > d5) def test_weekday00(self): for i in range(7): # March 4, 2002 is a Monday self.assertEqual(datetime(2002, 3, 4 + i).weekday(), i) # January 2, 1956 is a Monday self.assertEqual(datetime(1956, 1, 2 + i).weekday(), i) def test_isoweekday00(self): for i in range(7): self.assertEqual(datetime(2002, 3, 4 + i).isoweekday(), i + 1) self.assertEqual(datetime(1956, 1, 2 + i).isoweekday(), i + 1) def test_isoformat00(self): self.assertEqual(d1.isoformat(), "2002-01-31") @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__00(self): self.assertEqual(repr(d1), d1r) def test___repr__01(self): self.assertEqual(d1, eval_mod(repr(d1))) def test___hash__00(self): self.assertEqual(d1, d5) self.assertEqual(hash(d1), hash(d5)) def test___hash__01(self): dd1 = d1 + timedelta(weeks=7) dd5 = d5 + timedelta(days=7 * 7) self.assertEqual(hash(dd1), hash(dd5)) def test___hash__02(self): d = {d1: 1} d[d5] = 2 self.assertEqual(len(d), 1) self.assertEqual(d[d1], 2) ### time ##################################################################### t1 = time(18, 45, 3, 1234) t1r = "datetime.time(microsecond=67503001234, tzinfo=None, fold=0)" t1f = time(18, 45, 3, 1234, fold=1) t1fr = f"datetime.time(microsecond=67503001234, tzinfo=None, fold=1)" t1z = time(18, 45, 3, 1234, tz1) t1zr = f"datetime.time(microsecond=67503001234, tzinfo={repr(tz1)}, fold=0)" t2 = time(12, 59, 59, 100) t2z = time(12, 59, 59, 100, tz2) t3 = time(18, 45, 3, 1234) t3z = time(18, 45, 3, 1234, tz2) t4 = time(18, 45, 3, 1234, fold=1) t4z = time(18, 45, 3, 1234, tz2, fold=1) t5z = time(20, 45, 3, 1234, tz2) class Test3Time(unittest.TestCase): def test___init__00(self): t = time() self.assertEqual(t.hour, 0) self.assertEqual(t.minute, 0) self.assertEqual(t.second, 0) self.assertEqual(t.microsecond, 0) self.assertEqual(t.tzinfo, None) self.assertEqual(t.fold, 0) def test___init__01(self): t = time(12) self.assertEqual(t.hour, 12) self.assertEqual(t.minute, 0) self.assertEqual(t.second, 0) self.assertEqual(t.microsecond, 0) self.assertEqual(t.tzinfo, None) self.assertEqual(t.fold, 0) def test___init__02(self): self.assertEqual(t1z.hour, 18) self.assertEqual(t1z.minute, 45) self.assertEqual(t1z.second, 3) self.assertEqual(t1z.microsecond, 1234) self.assertEqual(t1z.tzinfo, tz1) self.assertEqual(t1z.fold, 0) def test___init__03(self): t = time(microsecond=1, fold=1) self.assertEqual(t.fold, 1) @unittest.skipIf(STDLIB, "not supported by standard datetime") def test___init__04(self): time(microsecond=24 * 60 * 60 * 1_000_000 - 1) def test___init__05(self): self.assertRaises(ValueError, time, -1, 0, 0, 0) self.assertRaises(ValueError, time, 0, -1, 0, 0) self.assertRaises(ValueError, time, 0, 0, -1, 0) self.assertRaises(ValueError, time, 0, 0, 0, -1) self.assertRaises(ValueError, time, 0, 0, 0, 0, fold=-1) def test___init__06(self): self.assertRaises(ValueError, time, 24, 0, 0, 0) self.assertRaises(ValueError, time, 0, 60, 0, 0) self.assertRaises(ValueError, time, 0, 0, 60, 0) self.assertRaises(ValueError, time, 0, 0, 0, 0, fold=2) @unittest.skipIf(STDLIB, "not supported by standard datetime") def test___init__07(self): self.assertRaises(ValueError, time, microsecond=24 * 60 * 60 * 1_000_000) def test_fromisoformat00(self): self.assertEqual(time.fromisoformat("01"), time(1)) def test_fromisoformat01(self): self.assertEqual(time.fromisoformat("13:30"), time(13, 30)) def test_fromisoformat02(self): self.assertEqual(time.fromisoformat("23:30:12"), time(23, 30, 12)) def test_fromisoformat03(self): self.assertEqual(str(time.fromisoformat("11:03:04+01:00")), "11:03:04+01:00") def test_hour00(self): self.assertEqual(t1.hour, 18) def test_hour01(self): self.assertEqual(t2z.hour, 12) def test_minute00(self): self.assertEqual(t1.minute, 45) def test_minute01(self): self.assertEqual(t2z.minute, 59) def test_second00(self): self.assertEqual(t1.second, 3) def test_second01(self): self.assertEqual(t2z.second, 59) def test_microsecond00(self): self.assertEqual(t1.microsecond, 1234) def test_microsecond01(self): self.assertEqual(t2z.microsecond, 100) def test_tzinfo00(self): self.assertEqual(t1.tzinfo, None) def test_tzinfo01(self): self.assertEqual(t2z.tzinfo, tz2) def test_fold00(self): self.assertEqual(t1.fold, 0) def test_replace00(self): self.assertEqual(t2z.replace(), t2z) def test_replace01(self): self.assertEqual(t2z.replace(hour=20), time(20, 59, 59, 100, tz2)) def test_replace02(self): self.assertEqual(t2z.replace(minute=4), time(12, 4, 59, 100, tz2)) def test_replace03(self): self.assertEqual(t2z.replace(second=16), time(12, 59, 16, 100, tz2)) def test_replace04(self): self.assertEqual(t2z.replace(microsecond=99), time(12, 59, 59, 99, tz2)) def test_replace05(self): self.assertEqual(t2z.replace(tzinfo=tz1), time(12, 59, 59, 100, tz1)) def test_isoformat00(self): self.assertEqual(t1.isoformat(), "18:45:03.001234") def test_isoformat01(self): self.assertEqual(t1z.isoformat(), "18:45:03.001234-01:00") def test_isoformat02(self): self.assertEqual(t2z.isoformat(), "12:59:59.000100+01:00") @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__00(self): self.assertEqual(repr(t1), t1r) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__01(self): self.assertEqual(repr(t1f), t1fr) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__02(self): self.assertEqual(repr(t1z), t1zr) def test___repr__03(self): self.assertEqual(t1, eval_mod(repr(t1))) def test___repr__04(self): self.assertEqual(t1z, eval_mod(repr(t1z))) def test___repr__05(self): self.assertEqual(t4, eval_mod(repr(t4))) def test___repr__06(self): dt = eval_mod(repr(t4z)) self.assertEqual(t4z, eval_mod(repr(t4z))) def test___bool__00(self): self.assertTrue(t1) def test___bool__01(self): self.assertTrue(t1z) def test___bool__02(self): self.assertTrue(time()) def test___eq__00(self): self.assertEqual(t1, t1) def test___eq__01(self): self.assertEqual(t1z, t1z) def test___eq__02(self): self.assertNotEqual(t1, t1z) def test___eq__03(self): self.assertNotEqual(t1z, t2z) def test___eq__04(self): self.assertEqual(t1z, t5z) def test___eq__05(self): self.assertEqual(t1, t1f) def test___lt__00(self): self.assertTrue(t2 < t1) def test___lt__01(self): self.assertTrue(t2z < t1z) def test___lt__02(self): self.assertRaises(TypeError, t1.__lt__, t1z) def test___le__00(self): self.assertTrue(t3 <= t1) def test___le__01(self): self.assertTrue(t1z <= t5z) def test___le__02(self): self.assertRaises(TypeError, t1.__le__, t1z) def test___ge__00(self): self.assertTrue(t1 >= t3) def test___ge__01(self): self.assertTrue(t5z >= t1z) def test___ge__02(self): self.assertRaises(TypeError, t1.__ge__, t1z) def test___gt__00(self): self.assertTrue(t1 > t2) def test___gt__01(self): self.assertTrue(t1z > t2z) def test___gt__02(self): self.assertRaises(TypeError, t1.__gt__, t1z) def test___hash__00(self): self.assertEqual(t1, t3) self.assertEqual(hash(t1), hash(t3)) def test___hash__01(self): d = {t1: 1} d[t3] = 3 self.assertEqual(len(d), 1) self.assertEqual(d[t1], 3) def test___hash__02(self): self.assertNotEqual(t1, t1z) self.assertNotEqual(hash(t1), hash(t1z)) def test___hash__03(self): self.assertNotEqual(t1z, t3z) self.assertNotEqual(hash(t1z), hash(t3z)) def test___hash__04(self): tf = t1.replace(fold=1) self.assertEqual(t1, tf) self.assertEqual(hash(t1), hash(tf)) def test_utcoffset00(self): self.assertEqual(t1.utcoffset(), None) def test_utcoffset01(self): self.assertEqual(t1z.utcoffset(), timedelta(hours=-1)) def test_utcoffset02(self): self.assertEqual(t2z.utcoffset(), timedelta(hours=1)) def test_dst00(self): self.assertEqual(t1.dst(), None) def test_dst01(self): self.assertEqual(t1z.dst(), None) def test_dst02(self): self.assertEqual(t2z.dst(), td0) def test_tzname00(self): self.assertEqual(t1.tzname(), None) def test_tzname01(self): self.assertEqual(t1z.tzname(), "UTC-01:00") def test_tzname02(self): self.assertEqual(t2z.tzname(), "CET") def test_constant00(self): self.assertIsInstance(timedelta.resolution, timedelta) self.assertTrue(timedelta.max > timedelta.min) def test_constant01(self): self.assertEqual(time.min, time(0)) def test_constant02(self): self.assertEqual(time.max, time(23, 59, 59, 999_999)) def test_constant03(self): self.assertEqual(time.resolution, timedelta(microseconds=1)) ### datetime ################################################################# dt1 = datetime(2002, 1, 31) dt1z1 = datetime(2002, 1, 31, tzinfo=tz1) dt1z2 = datetime(2002, 1, 31, tzinfo=tz2) dt2 = datetime(1956, 1, 31) dt3 = datetime(2002, 3, 1, 12, 59, 59, 100, tz2) dt4 = datetime(2002, 3, 2, 17, 6) dt5 = datetime(2002, 1, 31) dt5z2 = datetime(2002, 1, 31, tzinfo=tz2) dt1r = "datetime.datetime(2002, 1, 31, 0, 0, 0, 0, None, fold=0)" dt3r = "datetime.datetime(2002, 3, 1, 12, 59, 59, 100, Cet(), fold=0)" dt4r = "datetime.datetime(2002, 3, 2, 17, 6, 0, 0, None, fold=0)" d1t1 = datetime(2002, 1, 31, 18, 45, 3, 1234) d1t1f = datetime(2002, 1, 31, 18, 45, 3, 1234, fold=1) d1t1z = datetime(2002, 1, 31, 18, 45, 3, 1234, tz1) dt27tz2 = datetime(2010, 3, 27, 12, tzinfo=tz2) # last CET day dt28tz2 = datetime(2010, 3, 28, 12, tzinfo=tz2) # first CEST day dt30tz2 = datetime(2010, 10, 30, 12, tzinfo=tz2) # last CEST day dt31tz2 = datetime(2010, 10, 31, 12, tzinfo=tz2) # first CET day # Tests where datetime depens on date and time class Test4DateTime(unittest.TestCase): def test_combine00(self): dt = datetime.combine(d1, t1) self.assertEqual(dt, d1t1) def test_combine01(self): dt = datetime.combine(d1, t1) self.assertEqual(dt.date(), d1) def test_combine02(self): dt1 = datetime.combine(d1, t1) dt2 = datetime.combine(dt1, t1) self.assertEqual(dt1, dt2) def test_combine03(self): dt = datetime.combine(d1, t1) self.assertEqual(dt.time(), t1) def test_combine04(self): dt = datetime.combine(d1, t1, tz1) self.assertEqual(dt, d1t1z) def test_combine05(self): dt = datetime.combine(d1, t1z) self.assertEqual(dt, d1t1z) def test_combine06(self): dt = datetime.combine(d1, t1f) self.assertEqual(dt, d1t1f) def test_date00(self): self.assertEqual(d1t1.date(), d1) def test_time00(self): self.assertEqual(d1t1.time(), t1) def test_time01(self): self.assertNotEqual(d1t1z.time(), t1z) def test_timetz00(self): self.assertEqual(d1t1.timetz(), t1) def test_timetz01(self): self.assertEqual(d1t1z.timetz(), t1z) def test_timetz02(self): self.assertEqual(d1t1f.timetz(), t1f) # Tests where datetime is independent from date and time class Test5DateTime(unittest.TestCase): @classmethod def setUpClass(cls): for k in ("date", "time"): del mod_datetime.__dict__[k] def test___init__00(self): d = datetime(2002, 3, 1, 12, 0, fold=1) self.assertEqual(d.year, 2002) self.assertEqual(d.month, 3) self.assertEqual(d.day, 1) self.assertEqual(d.hour, 12) self.assertEqual(d.minute, 0) self.assertEqual(d.second, 0) self.assertEqual(d.microsecond, 0) self.assertEqual(d.tzinfo, None) self.assertEqual(d.fold, 1) def test___init__01(self): self.assertEqual(dt3.year, 2002) self.assertEqual(dt3.month, 3) self.assertEqual(dt3.day, 1) self.assertEqual(dt3.hour, 12) self.assertEqual(dt3.minute, 59) self.assertEqual(dt3.second, 59) self.assertEqual(dt3.microsecond, 100) self.assertEqual(dt3.tzinfo, tz2) self.assertEqual(dt3.fold, 0) def test___init__02(self): datetime(MINYEAR, 1, 1) def test___init__03(self): datetime(MAXYEAR, 12, 31) def test___init__04(self): self.assertRaises(ValueError, datetime, MINYEAR - 1, 1, 1) def test___init__05(self): self.assertRaises(ValueError, datetime, MAXYEAR + 1, 1, 1) def test___init__06(self): self.assertRaises(ValueError, datetime, 2000, 0, 1) def test___init__07(self): datetime(2000, 2, 29) def test___init__08(self): datetime(2004, 2, 29) def test___init__09(self): datetime(2400, 2, 29) def test___init__10(self): self.assertRaises(ValueError, datetime, 2000, 2, 30) def test___init__11(self): self.assertRaises(ValueError, datetime, 2001, 2, 29) def test___init__12(self): self.assertRaises(ValueError, datetime, 2100, 2, 29) def test___init__13(self): self.assertRaises(ValueError, datetime, 1900, 2, 29) def test___init__14(self): self.assertRaises(ValueError, datetime, 2000, 1, 0) def test___init__15(self): self.assertRaises(ValueError, datetime, 2000, 1, 32) def test___init__16(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, -1) def test___init__17(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, 24) def test___init__18(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, 23, -1) def test___init__19(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, 23, 60) def test___init__20(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, 23, 59, -1) def test___init__21(self): self.assertRaises(ValueError, datetime, 2000, 1, 31, 23, 59, 60) def test___init__22(self): self.assertEqual(dt1, eval_mod(dt1r)) def test___init__23(self): self.assertEqual(dt3, eval_mod(dt3r)) def test___init__24(self): self.assertEqual(dt4, eval_mod(dt4r)) def test_fromtimestamp00(self): with LocalTz("Europe/Rome"): ts = 1012499103.001234 if LOCALTZ: dt = datetime.fromtimestamp(ts) self.assertEqual(dt, d1t1) else: self.assertRaises(NotImplementedError, datetime.fromtimestamp, ts) def test_fromtimestamp01(self): ts = 1012506303.001234 self.assertEqual(datetime.fromtimestamp(ts, tz1), d1t1z) def test_fromtimestamp02(self): ts = 1269687600 self.assertEqual(datetime.fromtimestamp(ts, tz2), dt27tz2) def test_fromtimestamp03(self): ts = 1269770400 self.assertEqual(datetime.fromtimestamp(ts, tz2), dt28tz2) def test_fromtimestamp04(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 10, 31, 0, 30, tzinfo=timezone.utc) ts = (dt - EPOCH).total_seconds() dt = dt.replace(tzinfo=None) + 2 * td1h if LOCALTZ: ds = datetime.fromtimestamp(ts) self.assertEqual(ds, dt) self.assertFalse(ds.fold) else: self.assertRaises(NotImplementedError, datetime.fromtimestamp, ts) def test_fromtimestamp05(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 10, 31, 1, 30, tzinfo=timezone.utc) ts = (dt - EPOCH).total_seconds() dt = dt.replace(tzinfo=None) + 1 * td1h if LOCALTZ: ds = datetime.fromtimestamp(ts) self.assertEqual(ds, dt) self.assertTrue(ds.fold) else: self.assertRaises(NotImplementedError, datetime.fromtimestamp, ts) def test_fromtimestamp06(self): with LocalTz("US/Eastern"): dt = datetime(2020, 11, 1, 5, 30, tzinfo=timezone.utc) ts = (dt - EPOCH).total_seconds() dt = dt.replace(tzinfo=None) - 4 * td1h if LOCALTZ: ds = datetime.fromtimestamp(ts) self.assertEqual(ds, dt) else: self.assertRaises(NotImplementedError, datetime.fromtimestamp, ts) def test_fromtimestamp07(self): with LocalTz("US/Eastern"): dt = datetime(2020, 11, 1, 7, 30, tzinfo=timezone.utc) ts = (dt - EPOCH).total_seconds() dt = dt.replace(tzinfo=None) - 5 * td1h if LOCALTZ: ds = datetime.fromtimestamp(ts) self.assertEqual(ds, dt) else: self.assertRaises(NotImplementedError, datetime.fromtimestamp, ts) @unittest.skipIf(not LOCALTZ, "naive datetime not supported") def test_now00(self): tm = datetime(*mod_time.localtime()[:6]) dt = datetime.now() self.assertAlmostEqual(tm, dt, delta=timedelta(seconds=1)) def test_now01(self): tm = datetime(*mod_time.gmtime()[:6], tzinfo=tz2) tm += tz2.utcoffset(tm) dt = datetime.now(tz2) self.assertAlmostEqual(tm, dt, delta=timedelta(seconds=1)) def test_fromordinal00(self): self.assertEqual(datetime.fromordinal(1), datetime(1, 1, 1)) def test_fromordinal01(self): self.assertEqual(datetime.fromordinal(max_days), datetime(MAXYEAR, 12, 31)) def test_fromisoformat00(self): self.assertEqual(datetime.fromisoformat("1975-08-10"), datetime(1975, 8, 10)) def test_fromisoformat01(self): self.assertEqual(datetime.fromisoformat("1975-08-10 23"), datetime(1975, 8, 10, 23)) def test_fromisoformat02(self): self.assertEqual(datetime.fromisoformat("1975-08-10 23:30"), datetime(1975, 8, 10, 23, 30)) def test_fromisoformat03(self): self.assertEqual( datetime.fromisoformat("1975-08-10 23:30:12"), datetime(1975, 8, 10, 23, 30, 12) ) def test_fromisoformat04(self): self.assertEqual( str(datetime.fromisoformat("1975-08-10 23:30:12+01:00")), "1975-08-10 23:30:12+01:00" ) def test_year00(self): self.assertEqual(dt1.year, 2002) def test_year01(self): self.assertEqual(dt2.year, 1956) def test_month00(self): self.assertEqual(dt1.month, 1) def test_month01(self): self.assertEqual(dt3.month, 3) def test_day00(self): self.assertEqual(dt1.day, 31) def test_day01(self): self.assertEqual(dt4.day, 2) def test_hour00(self): self.assertEqual(dt1.hour, 0) def test_hour01(self): self.assertEqual(dt3.hour, 12) def test_minute00(self): self.assertEqual(dt1.minute, 0) def test_minute01(self): self.assertEqual(dt3.minute, 59) def test_second00(self): self.assertEqual(dt1.second, 0) def test_second01(self): self.assertEqual(dt3.second, 59) def test_microsecond00(self): self.assertEqual(dt1.microsecond, 0) def test_microsecond01(self): self.assertEqual(dt3.microsecond, 100) def test_tzinfo00(self): self.assertEqual(dt1.tzinfo, None) def test_tzinfo01(self): self.assertEqual(dt3.tzinfo, tz2) def test_fold00(self): self.assertEqual(dt1.fold, 0) def test___add__00(self): self.assertEqual(dt4 + hour, datetime(2002, 3, 2, 18, 6)) def test___add__01(self): self.assertEqual(hour + dt4, datetime(2002, 3, 2, 18, 6)) def test___add__02(self): self.assertEqual(dt4 + 10 * hour, datetime(2002, 3, 3, 3, 6)) def test___add__03(self): self.assertEqual(dt4 + day, datetime(2002, 3, 3, 17, 6)) def test___add__04(self): self.assertEqual(dt4 + week, datetime(2002, 3, 9, 17, 6)) def test___add__05(self): self.assertEqual(dt4 + 52 * week, datetime(2003, 3, 1, 17, 6)) def test___add__06(self): self.assertEqual(dt4 + (week + day + hour), datetime(2002, 3, 10, 18, 6)) def test___add__07(self): self.assertEqual(dt5 + -day, datetime(2002, 1, 30)) def test___add__08(self): self.assertEqual(-hour + dt4, datetime(2002, 3, 2, 16, 6)) def test___sub__00(self): d = dt1 - dt2 self.assertEqual(d.total_seconds(), d2d1s) def test___sub__01(self): self.assertEqual(dt4 - hour, datetime(2002, 3, 2, 16, 6)) def test___sub__02(self): self.assertEqual(dt4 - hour, dt4 + -hour) def test___sub__03(self): self.assertEqual(dt4 - 20 * hour, datetime(2002, 3, 1, 21, 6)) def test___sub__04(self): self.assertEqual(dt4 - day, datetime(2002, 3, 1, 17, 6)) def test___sub__05(self): self.assertEqual(dt4 - week, datetime(2002, 2, 23, 17, 6)) def test___sub__06(self): self.assertEqual(dt4 - 52 * week, datetime(2001, 3, 3, 17, 6)) def test___sub__07(self): self.assertEqual(dt4 - (week + day + hour), datetime(2002, 2, 22, 16, 6)) def test_computation00(self): self.assertEqual((dt4 + week) - dt4, week) def test_computation01(self): self.assertEqual((dt4 + day) - dt4, day) def test_computation02(self): self.assertEqual((dt4 + hour) - dt4, hour) def test_computation03(self): self.assertEqual(dt4 - (dt4 + week), -week) def test_computation04(self): self.assertEqual(dt4 - (dt4 + day), -day) def test_computation05(self): self.assertEqual(dt4 - (dt4 + hour), -hour) def test_computation06(self): self.assertEqual(dt4 - (dt4 - week), week) def test_computation07(self): self.assertEqual(dt4 - (dt4 - day), day) def test_computation08(self): self.assertEqual(dt4 - (dt4 - hour), hour) def test_computation09(self): self.assertEqual(dt4 + (week + day + hour), (((dt4 + week) + day) + hour)) def test_computation10(self): self.assertEqual(dt4 - (week + day + hour), (((dt4 - week) - day) - hour)) def test___eq__00(self): self.assertEqual(dt1, dt5) def test___eq__01(self): self.assertFalse(dt1 != dt5) def test___eq__02(self): self.assertTrue(dt2 != dt5) def test___eq__03(self): self.assertTrue(dt5 != dt2) def test___eq__04(self): self.assertFalse(dt2 == dt5) def test___eq__05(self): self.assertFalse(dt5 == dt2) def test___eq__06(self): self.assertFalse(dt1 == dt1z1) def test___eq__07(self): self.assertFalse(dt1z1 == dt1z2) def test___eq__08(self): self.assertTrue(dt1z2 == dt5z2) def test___le__00(self): self.assertTrue(dt1 <= dt5) def test___le__01(self): self.assertTrue(dt2 <= dt5) def test___le__02(self): self.assertFalse(dt5 <= dt2) def test___le__03(self): self.assertFalse(dt1z1 <= dt1z2) def test___le__04(self): self.assertTrue(dt1z2 <= dt5z2) def test___le__05(self): self.assertRaises(TypeError, dt1.__le__, dt1z1) def test___ge__00(self): self.assertTrue(dt1 >= dt5) def test___ge__01(self): self.assertTrue(dt5 >= dt2) def test___ge__02(self): self.assertFalse(dt2 >= dt5) def test___ge__03(self): self.assertTrue(dt1z1 >= dt1z2) def test___ge__04(self): self.assertTrue(dt1z2 >= dt5z2) def test___ge__05(self): self.assertRaises(TypeError, dt1.__ge__, dt1z1) def test___lt__00(self): self.assertFalse(dt1 < dt5) def test___lt__01(self): self.assertTrue(dt2 < dt5) def test___lt__02(self): self.assertFalse(dt5 < dt2) def test___lt__03(self): self.assertFalse(dt1z1 < dt1z2) def test___lt__04(self): self.assertFalse(dt1z2 < dt5z2) def test___lt__05(self): self.assertRaises(TypeError, dt1.__lt__, dt1z1) def test___gt__00(self): self.assertFalse(dt1 > dt5) def test___gt__01(self): self.assertTrue(dt5 > dt2) def test___gt__02(self): self.assertFalse(dt2 > dt5) def test___gt__03(self): self.assertTrue(dt1z1 > dt1z2) def test___gt__04(self): self.assertFalse(dt1z2 > dt5z2) def test___gt__05(self): self.assertRaises(TypeError, dt1.__gt__, dt1z1) def test_replace00(self): self.assertEqual(dt3.replace(), dt3) def test_replace01(self): self.assertEqual(dt3.replace(year=2001), datetime(2001, 3, 1, 12, 59, 59, 100, tz2)) def test_replace02(self): self.assertEqual(dt3.replace(month=4), datetime(2002, 4, 1, 12, 59, 59, 100, tz2)) def test_replace03(self): self.assertEqual(dt3.replace(day=16), datetime(2002, 3, 16, 12, 59, 59, 100, tz2)) def test_replace04(self): self.assertEqual(dt3.replace(hour=13), datetime(2002, 3, 1, 13, 59, 59, 100, tz2)) def test_replace05(self): self.assertEqual(dt3.replace(minute=0), datetime(2002, 3, 1, 12, 0, 59, 100, tz2)) def test_replace06(self): self.assertEqual(dt3.replace(second=1), datetime(2002, 3, 1, 12, 59, 1, 100, tz2)) def test_replace07(self): self.assertEqual(dt3.replace(microsecond=99), datetime(2002, 3, 1, 12, 59, 59, 99, tz2)) def test_replace08(self): self.assertEqual(dt3.replace(tzinfo=tz1), datetime(2002, 3, 1, 12, 59, 59, 100, tz1)) def test_replace09(self): self.assertRaises(ValueError, datetime(2000, 2, 29).replace, year=2001) def test_astimezone00(self): dt = datetime(2002, 3, 1, 11, 59, 59, 100, timezone.utc) self.assertEqual(dt3.astimezone(timezone.utc), dt) def test_astimezone01(self): self.assertIs(dt1z1.astimezone(tz1), dt1z1) def test_astimezone02(self): dt = datetime(2002, 1, 31, 2, 0, tzinfo=tz2) self.assertEqual(dt1z1.astimezone(tz2), dt) def test_astimezone03(self): dt = datetime(2002, 1, 31, 10, 30, tzinfo=tz_acdt) self.assertEqual(dt1z1.astimezone(tz_acdt), dt) def test_astimezone04(self): with LocalTz("Europe/Rome"): dt1 = dt27tz2 dt2 = dt1.replace(tzinfo=None) if LOCALTZ: self.assertEqual(dt1, dt2.astimezone(tz2)) else: self.assertRaises(NotImplementedError, dt2.astimezone, tz2) def test_astimezone05(self): with LocalTz("Europe/Rome"): dt1 = dt28tz2 dt2 = dt1.replace(tzinfo=None) if LOCALTZ: self.assertEqual(dt1, dt2.astimezone(tz2)) else: self.assertRaises(NotImplementedError, dt2.astimezone, tz2) def test_astimezone06(self): with LocalTz("Europe/Rome"): dt1 = dt30tz2 dt2 = dt1.replace(tzinfo=None) if LOCALTZ: self.assertEqual(dt1, dt2.astimezone(tz2)) else: self.assertRaises(NotImplementedError, dt2.astimezone, tz2) def test_astimezone07(self): with LocalTz("Europe/Rome"): dt1 = dt31tz2 dt2 = dt1.replace(tzinfo=None) if LOCALTZ: self.assertEqual(dt1, dt2.astimezone(tz2)) else: self.assertRaises(NotImplementedError, dt2.astimezone, tz2) def test_astimezone08(self): with LocalTz("Europe/Rome"): dt1 = dt3 dt2 = dt1.replace(tzinfo=None) if LOCALTZ: self.assertEqual(dt1, dt2.astimezone(tz2)) else: self.assertRaises(NotImplementedError, dt2.astimezone, tz2) def test_utcoffset00(self): self.assertEqual(dt1.utcoffset(), None) def test_utcoffset01(self): self.assertEqual(dt27tz2.utcoffset(), timedelta(hours=1)) def test_utcoffset02(self): self.assertEqual(dt28tz2.utcoffset(), timedelta(hours=2)) def test_utcoffset03(self): self.assertEqual(dt30tz2.utcoffset(), timedelta(hours=2)) def test_utcoffset04(self): self.assertEqual(dt31tz2.utcoffset(), timedelta(hours=1)) def test_dst00(self): self.assertEqual(dt1.dst(), None) def test_dst01(self): self.assertEqual(dt27tz2.dst(), timedelta(hours=0)) def test_dst02(self): self.assertEqual(dt28tz2.dst(), timedelta(hours=1)) def test_tzname00(self): self.assertEqual(dt1.tzname(), None) def test_tzname01(self): self.assertEqual(dt27tz2.tzname(), "CET") def test_tzname02(self): self.assertEqual(dt28tz2.tzname(), "CEST") def test_timetuple00(self): with LocalTz("Europe/Rome"): self.assertEqual(dt1.timetuple()[:8], (2002, 1, 31, 0, 0, 0, 3, 31)) def test_timetuple01(self): self.assertEqual(dt27tz2.timetuple()[:8], (2010, 3, 27, 12, 0, 0, 5, 86)) def test_timetuple02(self): self.assertEqual(dt28tz2.timetuple()[:8], (2010, 3, 28, 12, 0, 0, 6, 87)) def test_timetuple03(self): with LocalTz("Europe/Rome"): self.assertEqual( dt27tz2.replace(tzinfo=None).timetuple()[:8], (2010, 3, 27, 12, 0, 0, 5, 86) ) def test_timetuple04(self): self.assertEqual( dt28tz2.replace(tzinfo=None).timetuple()[:8], (2010, 3, 28, 12, 0, 0, 6, 87) ) def test_toordinal00(self): self.assertEqual(datetime(1, 1, 1).toordinal(), 1) def test_toordinal01(self): self.assertEqual(datetime(1, 12, 31).toordinal(), 365) def test_toordinal02(self): self.assertEqual(datetime(2, 1, 1).toordinal(), 366) def test_toordinal03(self): # https://www.timeanddate.com/date/dateadded.html?d1=1&m1=1&y1=1&type=add&ad=730882 self.assertEqual(dt1.toordinal(), 730_882 - 1) def test_toordinal04(self): # https://www.timeanddate.com/date/dateadded.html?d1=1&m1=1&y1=1&type=add&ad=730911 self.assertEqual(dt3.toordinal(), 730_911 - 1) def test_weekday00(self): self.assertEqual(dt1.weekday(), d1.weekday()) def test_timestamp00(self): with LocalTz("Europe/Rome"): if LOCALTZ: self.assertEqual(d1t1.timestamp(), 1012499103.001234) else: self.assertRaises(NotImplementedError, d1t1.timestamp) def test_timestamp01(self): self.assertEqual(d1t1z.timestamp(), 1012506303.001234) def test_timestamp02(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 3, 28, 2, 30) # doens't exist if LOCALTZ: self.assertEqual(dt.timestamp(), 1269739800.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp03(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 8, 10, 2, 30) if LOCALTZ: self.assertEqual(dt.timestamp(), 1281400200.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp04(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 10, 31, 2, 30, fold=0) if LOCALTZ: self.assertEqual(dt.timestamp(), 1288485000.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp05(self): with LocalTz("Europe/Rome"): dt = datetime(2010, 10, 31, 2, 30, fold=1) if LOCALTZ: self.assertEqual(dt.timestamp(), 1288488600.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp06(self): with LocalTz("US/Eastern"): dt = datetime(2020, 3, 8, 2, 30) # doens't exist if LOCALTZ: self.assertEqual(dt.timestamp(), 1583652600.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp07(self): with LocalTz("US/Eastern"): dt = datetime(2020, 8, 10, 2, 30) if LOCALTZ: self.assertEqual(dt.timestamp(), 1597041000.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp08(self): with LocalTz("US/Eastern"): dt = datetime(2020, 11, 1, 2, 30, fold=0) if LOCALTZ: self.assertEqual(dt.timestamp(), 1604215800.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_timestamp09(self): with LocalTz("US/Eastern"): dt = datetime(2020, 11, 1, 2, 30, fold=1) if LOCALTZ: self.assertEqual(dt.timestamp(), 1604215800.0) else: self.assertRaises(NotImplementedError, dt.timestamp) def test_isoweekday00(self): self.assertEqual(dt1.isoweekday(), d1.isoweekday()) def test_isoformat00(self): self.assertEqual(dt3.isoformat(), "2002-03-01T12:59:59.000100+01:00") def test_isoformat01(self): self.assertEqual(dt3.isoformat("T"), "2002-03-01T12:59:59.000100+01:00") def test_isoformat02(self): self.assertEqual(dt3.isoformat(" "), "2002-03-01 12:59:59.000100+01:00") def test_isoformat03(self): self.assertEqual(str(dt3), "2002-03-01 12:59:59.000100+01:00") @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__00(self): self.assertEqual(repr(dt1), dt1r) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__01(self): self.assertEqual(repr(dt3), dt3r) @unittest.skipIf(STDLIB, "standard datetime differs") def test___repr__02(self): self.assertEqual(repr(dt4), dt4r) def test___repr__03(self): self.assertEqual(dt1, eval_mod(repr(dt1))) def test___repr__04(self): self.assertEqual(dt3, eval_mod(repr(dt3))) def test___repr__05(self): self.assertEqual(dt4, eval_mod(repr(dt4))) def test___hash__00(self): self.assertEqual(dt1, dt5) self.assertEqual(hash(dt1), hash(dt5)) def test___hash__01(self): dd1 = dt1 + timedelta(weeks=7) dd5 = dt5 + timedelta(days=7 * 7) self.assertEqual(hash(dd1), hash(dd5)) def test___hash__02(self): d = {dt1: 1} d[dt5] = 2 self.assertEqual(len(d), 1) self.assertEqual(d[dt1], 2) def test___hash__03(self): self.assertNotEqual(dt1, dt1z1) self.assertNotEqual(hash(dt1), hash(dt1z1)) def test___hash__04(self): self.assertNotEqual(dt1z1, dt5z2) self.assertNotEqual(hash(dt1z1), hash(dt5z2)) @unittest.skipIf(STDLIB, "standard datetime has no tuple()") def test_tuple00(self): self.assertEqual(dt1.tuple(), (2002, 1, 31, 0, 0, 0, 0, None, 0)) @unittest.skipIf(STDLIB, "standard datetime has no tuple()") def test_tuple01(self): self.assertEqual(dt27tz2.tuple(), (2010, 3, 27, 12, 0, 0, 0, tz2, 0)) @unittest.skipIf(STDLIB, "standard datetime has no tuple()") def test_tuple02(self): self.assertEqual(dt28tz2.tuple(), (2010, 3, 28, 12, 0, 0, 0, tz2, 0)) if __name__ == "__main__": unittest.main()