def test_timetuple(self): for i in range(7): # January 2, 1956 is a Monday (0) d = cpy_date(1956, 1, 2 + i) t = d.timetuple() d2 = cpython_date(1956, 1, 2 + i) t2 = d2.timetuple() self.assertEqual(t, t2) # February 1, 1956 is a Wednesday (2) d = cpy_date(1956, 2, 1 + i) t = d.timetuple() d2 = cpython_date(1956, 2, 1 + i) t2 = d2.timetuple() self.assertEqual(t, t2) # March 1, 1956 is a Thursday (3), and is the 31+29+1 = 61st day # of the year. d = cpy_date(1956, 3, 1 + i) t = d.timetuple() d2 = cpython_date(1956, 3, 1 + i) t2 = d2.timetuple() self.assertEqual(t, t2) self.assertEqual(t.tm_year, t2.tm_year) self.assertEqual(t.tm_mon, t2.tm_mon) self.assertEqual(t.tm_mday, t2.tm_mday) self.assertEqual(t.tm_hour, t2.tm_hour) self.assertEqual(t.tm_min, t2.tm_min) self.assertEqual(t.tm_sec, t2.tm_sec) self.assertEqual(t.tm_wday, t2.tm_wday) self.assertEqual(t.tm_yday, t2.tm_yday) self.assertEqual(t.tm_isdst, t2.tm_isdst)
def test_strftime(self): t = cpy_date(2005, 3, 2) self.assertEqual(t.strftime("m:%m d:%d y:%y"), "m:03 d:02 y:05") self.assertEqual(t.strftime(""), "") # SF bug #761337 # self.assertEqual(t.strftime('x'*1000), 'x'*1000) # SF bug #1556784 self.assertRaises(TypeError, t.strftime) # needs an arg self.assertRaises(TypeError, t.strftime, "one", "two") # too many args self.assertRaises(TypeError, t.strftime, 42) # arg wrong type # test that unicode input is allowed (issue 2782) self.assertEqual(t.strftime("%m"), "03") # A naive object replaces %z and %Z w/ empty strings. self.assertEqual(t.strftime("'%z' '%Z'"), "'' ''") # make sure that invalid format specifiers are handled correctly # self.assertRaises(ValueError, t.strftime, "%e") # self.assertRaises(ValueError, t.strftime, "%") # self.assertRaises(ValueError, t.strftime, "%#") # oh well, some systems just ignore those invalid ones. # at least, excercise them to make sure that no crashes # are generated for f in ["%e", "%", "%#"]: try: t.strftime(f) except ValueError: pass # check that this standard extension works t.strftime("%f")
def test_weekday(self): for i in range(7): # March 4, 2002 is a Monday self.assertEqual( cpy_date(2002, 3, 4 + i).weekday(), cpython_date(2002, 3, 4 + i).weekday()) self.assertEqual( cpy_date(2002, 3, 4 + i).isoweekday(), cpython_date(2002, 3, 4 + i).isoweekday()) # January 2, 1956 is a Monday self.assertEqual( cpy_date(1956, 1, 2 + i).weekday(), cpython_date(1956, 1, 2 + i).weekday()) self.assertEqual( cpy_date(1956, 1, 2 + i).isoweekday(), cpython_date(1956, 1, 2 + i).isoweekday())
def test_mixed_compare(self): our = cpy_date(2000, 4, 5) our2 = cpython_date(2000, 4, 5) # Our class can be compared for equality to other classes self.assertEqual(our == 1, our2 == 1) self.assertEqual(1 == our, 1 == our2) self.assertEqual(our != 1, our2 != 1) self.assertEqual(1 != our, 1 != our2) # But the ordering is undefined self.assertRaises(TypeError, lambda: our < 1) self.assertRaises(TypeError, lambda: 1 < our) # Repeat those tests with a different class class SomeClass: pass their = SomeClass() self.assertEqual(our == their, False) self.assertEqual(their == our, False) self.assertEqual(our != their, True) self.assertEqual(their != our, True) self.assertRaises(TypeError, lambda: our < their) self.assertRaises(TypeError, lambda: their < our) # However, if the other class explicitly defines ordering # relative to our class, it is allowed to do so class LargerThanAnything: def __lt__(self, other): return False def __le__(self, other): return isinstance(other, LargerThanAnything) def __eq__(self, other): return isinstance(other, LargerThanAnything) def __ne__(self, other): return not isinstance(other, LargerThanAnything) def __gt__(self, other): return not isinstance(other, LargerThanAnything) def __ge__(self, other): return True their = LargerThanAnything() self.assertEqual(our == their, False) self.assertEqual(their == our, False) self.assertEqual(our != their, True) self.assertEqual(their != our, True) self.assertEqual(our < their, True) self.assertEqual(their < our, False)
def test_strftime_y2k(self): for y in (1, 49, 70, 99, 100, 999, 1000, 1970): d = cpy_date(y, 1, 1) # Issue 13305: For years < 1000, the value is not always # padded to 4 digits across platforms. The C standard # assumes year >= 1900, so it does not specify the number # of digits. if d.strftime("%Y") != "%04d" % y: # Year 42 returns '42', not padded self.assertEqual(d.strftime("%Y"), "%d" % y) # '0042' is obtained anyway self.assertEqual(d.strftime("%4Y"), "%04d" % y)
def test_hash_equality(self): d = cpy_date(2000, 12, 31) e = cpy_date(2000, 12, 31) self.assertEqual(d, e) self.assertEqual(hash(d), hash(e)) dic = {d: 1} dic[e] = 2 self.assertEqual(len(dic), 1) self.assertEqual(dic[d], 2) self.assertEqual(dic[e], 2) d = cpy_date(2001, 1, 1) e = cpy_date(2001, 1, 1) self.assertEqual(d, e) self.assertEqual(hash(d), hash(e)) dic = {d: 1} dic[e] = 2 self.assertEqual(len(dic), 1) self.assertEqual(dic[d], 2) self.assertEqual(dic[e], 2)
def test_compare(self): t1 = cpy_date(2, 3, 4) t2 = cpy_date(2, 3, 4) self.assertEqual(t1, t2) self.assertTrue(t1 <= t2) self.assertTrue(t1 >= t2) self.assertTrue(not t1 != t2) self.assertTrue(not t1 < t2) self.assertTrue(not t1 > t2) for args in (3, 3, 3), (2, 4, 4), (2, 3, 5): t2 = cpy_date(*args) # this is larger than t1 self.assertTrue(t1 < t2) self.assertTrue(t2 > t1) self.assertTrue(t1 <= t2) self.assertTrue(t2 >= t1) self.assertTrue(t1 != t2) self.assertTrue(t2 != t1) self.assertTrue(not t1 == t2) self.assertTrue(not t2 == t1) self.assertTrue(not t1 > t2) self.assertTrue(not t2 < t1) self.assertTrue(not t1 >= t2) self.assertTrue(not t2 <= t1) for badarg in OTHERSTUFF: self.assertEqual(t1 == badarg, False) self.assertEqual(t1 != badarg, True) self.assertEqual(badarg == t1, False) self.assertEqual(badarg != t1, True) self.assertRaises(TypeError, lambda: t1 < badarg) self.assertRaises(TypeError, lambda: t1 > badarg) self.assertRaises(TypeError, lambda: t1 >= badarg) self.assertRaises(TypeError, lambda: badarg <= t1) self.assertRaises(TypeError, lambda: badarg < t1) self.assertRaises(TypeError, lambda: badarg > t1) self.assertRaises(TypeError, lambda: badarg >= t1)
def test_isocalendar(self): # Check examples from # http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm for i in range(7): d = cpy_date(2003, 12, 22 + i) self.assertEqual(d.isocalendar(), (2003, 52, i + 1)) d = cpy_date(2003, 12, 29) + timedelta(i) self.assertEqual(d.isocalendar(), (2004, 1, i + 1)) d = cpy_date(2004, 1, 5 + i) self.assertEqual(d.isocalendar(), (2004, 2, i + 1)) d = cpy_date(2009, 12, 21 + i) self.assertEqual(d.isocalendar(), (2009, 52, i + 1)) d = cpy_date(2009, 12, 28) + timedelta(i) self.assertEqual(d.isocalendar(), (2009, 53, i + 1)) d = cpy_date(2010, 1, 4 + i) self.assertEqual(d.isocalendar(), (2010, 1, i + 1))
def test_format(self): dt = cpy_date(2007, 9, 10) self.assertEqual(dt.__format__(""), str(dt)) # check that a derived class's __str__() gets called class A(cpy_date): def __str__(self): return "A" a = A(2007, 9, 10) self.assertEqual(a.__format__(""), "A") # check that a derived class's strftime gets called class B(cpy_date): def strftime(self, format_spec): return "B" b = B(2007, 9, 10) self.assertEqual(b.__format__(""), str(dt)) # date strftime not implemented in CircuitPython, skip """for fmt in ["m:%m d:%d y:%y",
def test_subclass_date(self): class C(cpy_date): theAnswer = 42 def __new__(cls, *args, **kws): temp = kws.copy() extra = temp.pop("extra") result = cpy_date.__new__(cls, *args, **temp) result.extra = extra return result def newmeth(self, start): return start + self.year + self.month args = 2003, 4, 14 dt1 = cpy_date(*args) dt2 = C(*args, **{"extra": 7}) self.assertEqual(dt2.__class__, C) self.assertEqual(dt2.theAnswer, 42) self.assertEqual(dt2.extra, 7) self.assertEqual(dt1.toordinal(), dt2.toordinal()) self.assertEqual(dt2.newmeth(-7), dt1.year + dt1.month - 7)
def test_bad_constructor_arguments(self): # bad years cpy_date(MINYEAR, 1, 1) # no exception cpy_date(MAXYEAR, 1, 1) # no exception self.assertRaises(ValueError, cpy_date, MINYEAR - 1, 1, 1) self.assertRaises(ValueError, cpy_date, MAXYEAR + 1, 1, 1) # bad months cpy_date(2000, 1, 1) # no exception cpy_date(2000, 12, 1) # no exception self.assertRaises(ValueError, cpy_date, 2000, 0, 1) self.assertRaises(ValueError, cpy_date, 2000, 13, 1) # bad days cpy_date(2000, 2, 29) # no exception cpy_date(2004, 2, 29) # no exception cpy_date(2400, 2, 29) # no exception self.assertRaises(ValueError, cpy_date, 2000, 2, 30) self.assertRaises(ValueError, cpy_date, 2001, 2, 29) self.assertRaises(ValueError, cpy_date, 2100, 2, 29) self.assertRaises(ValueError, cpy_date, 1900, 2, 29) self.assertRaises(ValueError, cpy_date, 2000, 1, 0) self.assertRaises(ValueError, cpy_date, 2000, 1, 32)
def test_basic_attributes(self): dt = cpy_date(2002, 3, 1) dt_2 = cpython_date(2002, 3, 1) self.assertEqual(dt.year, dt_2.year) self.assertEqual(dt.month, dt_2.month) self.assertEqual(dt.day, dt_2.day)
def test_ctime(self): t = cpy_date(2002, 3, 2) self.assertEqual(t.ctime(), "Sat Mar 2 00:00:00 2002")
def test_isoformat(self): # test isoformat against expected and cpython equiv. t = cpy_date(2, 3, 2) t2 = cpython_date(2, 3, 2) self.assertEqual(t.isoformat(), "0002-03-02") self.assertEqual(t.isoformat(), t2.isoformat())