X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=test%2Ftest_dates.py;h=4c315885ef77828aa4b7be4c6f2ca67f18866143;hb=HEAD;hp=2223e3e940bc9c2e44663b38410114b2978cbebf;hpb=357a8034c643e11ff123d44e5472b149e6fa76fa;p=roundup.git diff --git a/test/test_dates.py b/test/test_dates.py index 2223e3e..4c31588 100644 --- a/test/test_dates.py +++ b/test/test_dates.py @@ -14,14 +14,31 @@ # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -# -# $Id: test_dates.py,v 1.19 2003-03-06 06:12:30 richard Exp $ +# +# $Id: test_dates.py,v 1.45 2008-03-07 01:11:55 richard Exp $ +from __future__ import nested_scopes + +import unittest +import time +import datetime +import calendar -import unittest, time +from roundup import date, i18n +from roundup.date import Date, Interval, Range, fixTimeOverflow, \ + get_timezone -from roundup.date import Date, Interval, fixTimeOverflow class DateTestCase(unittest.TestCase): + def setUp(self): + self.old_gettext_ = i18n.gettext + self.old_ngettext_ = i18n.ngettext + i18n.gettext = i18n.get_translation(language='C').gettext + i18n.ngettext = i18n.get_translation(language='C').ngettext + + def tearDown(self): + i18n.gettext = self.old_gettext_ + i18n.ngettext = self.old_ngettext_ + def testDateInterval(self): ae = self.assertEqual date = Date("2000-06-26.00:34:02 + 2d") @@ -30,11 +47,15 @@ class DateTestCase(unittest.TestCase): ae(str(date), '2000-02-29.00:00:00') date = Date("2001-02-27 + 2d") ae(str(date), '2001-03-01.00:00:00') - + date = Date("2009", add_granularity=True) + self.assertRaises(ValueError, Date, ". +30d", add_granularity=True) + def testDate(self): ae = self.assertEqual date = Date("2000-04-17") ae(str(date), '2000-04-17.00:00:00') + date = Date("2000/04/17") + ae(str(date), '2000-04-17.00:00:00') date = Date("2000-4-7") ae(str(date), '2000-04-07.00:00:00') date = Date("2000-4-17") @@ -44,6 +65,8 @@ class DateTestCase(unittest.TestCase): ae(str(date), '%s-01-25.00:00:00'%y) date = Date("2000-04-17.03:45") ae(str(date), '2000-04-17.03:45:00') + date = Date("2000/04/17.03:45") + ae(str(date), '2000-04-17.03:45:00') date = Date("08-13.22:13") ae(str(date), '%s-08-13.22:13:00'%y) date = Date("11-07.09:32:43") @@ -52,6 +75,19 @@ class DateTestCase(unittest.TestCase): ae(str(date), '%s-%02d-%02d.14:25:00'%(y, m, d)) date = Date("8:47:11") ae(str(date), '%s-%02d-%02d.08:47:11'%(y, m, d)) + ae(str(Date('2003')), '2003-01-01.00:00:00') + ae(str(Date('2004-06')), '2004-06-01.00:00:00') + ae(str(Date('1900-02-01')), '1900-02-01.00:00:00') + ae(str(Date('1800-07-15')), '1800-07-15.00:00:00') + + def testLeapYear(self): + self.assertEquals(str(Date('2008-02-29')), '2008-02-29.00:00:00') + + def testDateError(self): + self.assertRaises(ValueError, Date, "12") + # Date cannot handle dates before year 1 + self.assertRaises(ValueError, Date, (0, 1, 1, 0, 0, 0.0, 0, 1, -1)) + self.assertRaises(ValueError, Date, "1/1/06") def testOffset(self): ae = self.assertEqual @@ -71,6 +107,12 @@ class DateTestCase(unittest.TestCase): date = Date("8:47:11", -5) ae(str(date), '%s-%02d-%02d.13:47:11'%(y, m, d)) + # just make sure we parse these, m'kay? + date = Date('-1d') + date = Date('-1w') + date = Date('-1m') + date = Date('-1y') + def testOffsetRandom(self): ae = self.assertEqual # XXX unsure of the usefulness of these, they're pretty random @@ -109,9 +151,13 @@ class DateTestCase(unittest.TestCase): ae(str(date), '2000-02-29.00:00:00') date = Date('2001-02-28.22:58:59') + Interval('00:00:3661') ae(str(date), '2001-03-01.00:00:00') + date = Date('2001-03-01.00:00:00') + Interval('150y') + ae(str(date), '2151-03-01.00:00:00') def testOffsetSub(self): ae = self.assertEqual + date = Date('2000-12-01') - Interval('- 1d') + date = Date('2000-01-01') - Interval('- 2y 2m') ae(str(date), '2002-03-01.00:00:00') date = Date('2000-01-01') - Interval('2m') @@ -141,6 +187,8 @@ class DateTestCase(unittest.TestCase): ae(str(date), '2000-02-28.22:58:59') date = Date('2001-03-01.00:00:00') - Interval('00:00:3661') ae(str(date), '2001-02-28.22:58:59') + date = Date('2001-03-01.00:00:00') - Interval('150y') + ae(str(date), '1851-03-01.00:00:00') def testDateLocal(self): ae = self.assertEqual @@ -158,20 +206,114 @@ class DateTestCase(unittest.TestCase): ae(str(Interval(' - 1 d 2:50 ')), '- 1d 2:50') ae(str(Interval(' 14:00 ')), '+ 14:00') ae(str(Interval(' 0:04:33 ')), '+ 0:04:33') + ae(str(Interval(8.*3600)), '+ 8:00') + + def testIntervalInitDate(self): + ae = self.assertEqual + now = Date('.') + now.hour = now.minute = now.second = 0 + then = now + Interval('2d') + ae((Interval(str(then))), Interval('- 2d')) + then = now - Interval('2d') + ae(Interval(str(then)), Interval('+ 2d')) + + def testIntervalAddMonthBoundary(self): + # force the transition over a month boundary + now = Date('2003-10-30.00:00:00') + then = now + Interval('2d') + self.assertEqual(str(then), '2003-11-01.00:00:00') + now = Date('2004-02-28.00:00:00') + then = now + Interval('1d') + self.assertEqual(str(then), '2004-02-29.00:00:00') + now = Date('2003-02-28.00:00:00') + then = now + Interval('1d') + self.assertEqual(str(then), '2003-03-01.00:00:00') + now = Date('2003-01-01.00:00:00') + then = now + Interval('59d') + self.assertEqual(str(then), '2003-03-01.00:00:00') + now = Date('2004-01-01.00:00:00') + then = now + Interval('59d') + self.assertEqual(str(then), '2004-02-29.00:00:00') + + def testIntervalSubtractMonthBoundary(self): + # force the transition over a month boundary + now = Date('2003-11-01.00:00:00') + then = now - Interval('2d') + self.assertEqual(str(then), '2003-10-30.00:00:00') + now = Date('2004-02-29.00:00:00') + then = now - Interval('1d') + self.assertEqual(str(then), '2004-02-28.00:00:00') + now = Date('2003-03-01.00:00:00') + then = now - Interval('1d') + self.assertEqual(str(then), '2003-02-28.00:00:00') + now = Date('2003-03-01.00:00:00') + then = now - Interval('59d') + self.assertEqual(str(then), '2003-01-01.00:00:00') + now = Date('2004-02-29.00:00:00') + then = now - Interval('59d') + self.assertEqual(str(then), '2004-01-01.00:00:00') + + def testIntervalAddYearBoundary(self): + # force the transition over a year boundary + now = Date('2003-12-30.00:00:00') + then = now + Interval('2d') + self.assertEqual(str(then), '2004-01-01.00:00:00') + now = Date('2003-01-01.00:00:00') + then = now + Interval('365d') + self.assertEqual(str(then), '2004-01-01.00:00:00') + now = Date('2004-01-01.00:00:00') + then = now + Interval('366d') + self.assertEqual(str(then), '2005-01-01.00:00:00') + + def testIntervalSubtractYearBoundary(self): + # force the transition over a year boundary + now = Date('2003-01-01.00:00:00') + then = now - Interval('2d') + self.assertEqual(str(then), '2002-12-30.00:00:00') + now = Date('2004-02-01.00:00:00') + then = now - Interval('365d') + self.assertEqual(str(then), '2003-02-01.00:00:00') + now = Date('2005-02-01.00:00:00') + then = now - Interval('365d') + self.assertEqual(str(then), '2004-02-02.00:00:00') + + def testDateSubtract(self): + # These are thoroughly broken right now. + i = Date('2003-03-15.00:00:00') - Date('2003-03-10.00:00:00') + self.assertEqual(i, Interval('5d')) + i = Date('2003-02-01.00:00:00') - Date('2003-03-01.00:00:00') + self.assertEqual(i, Interval('-28d')) + i = Date('2003-03-01.00:00:00') - Date('2003-02-01.00:00:00') + self.assertEqual(i, Interval('28d')) + i = Date('2003-03-03.00:00:00') - Date('2003-02-01.00:00:00') + self.assertEqual(i, Interval('30d')) + i = Date('2003-03-03.00:00:00') - Date('2002-02-01.00:00:00') + self.assertEqual(i, Interval('395d')) + i = Date('2003-03-03.00:00:00') - Date('2003-04-01.00:00:00') + self.assertEqual(i, Interval('-29d')) + i = Date('2003-03-01.00:00:00') - Date('2003-02-01.00:00:00') + self.assertEqual(i, Interval('28d')) + # force the transition over a year boundary + i = Date('2003-01-01.00:00:00') - Date('2002-01-01.00:00:00') + self.assertEqual(i, Interval('365d')) + i = Date('1952-01-01') - Date('1953-01-01') + self.assertEqual(i, Interval('-366d')) + i = Date('1953-01-01') - Date('1952-01-01') + self.assertEqual(i, Interval('366d')) def testIntervalAdd(self): ae = self.assertEqual ae(str(Interval('1y') + Interval('1y')), '+ 2y') ae(str(Interval('1y') + Interval('1m')), '+ 1y 1m') ae(str(Interval('1y') + Interval('2:40')), '+ 1y 2:40') - ae(str(Interval('1y') + Interval('- 1y')), '') - ae(str(Interval('- 1y') + Interval('1y')), '') + ae(str(Interval('1y') + Interval('- 1y')), '00:00') + ae(str(Interval('- 1y') + Interval('1y')), '00:00') ae(str(Interval('- 1y') + Interval('- 1y')), '- 2y') ae(str(Interval('1y') + Interval('- 1m')), '+ 11m') ae(str(Interval('1:00') + Interval('1:00')), '+ 2:00') ae(str(Interval('0:50') + Interval('0:50')), '+ 1:40') - ae(str(Interval('1:50') + Interval('- 1:50')), '') - ae(str(Interval('- 1:50') + Interval('1:50')), '') + ae(str(Interval('1:50') + Interval('- 1:50')), '00:00') + ae(str(Interval('- 1:50') + Interval('1:50')), '00:00') ae(str(Interval('- 1:50') + Interval('- 1:50')), '- 3:40') ae(str(Interval('1:59:59') + Interval('00:00:01')), '+ 2:00') ae(str(Interval('2:00') + Interval('- 00:00:01')), '+ 1:59:59') @@ -181,11 +323,11 @@ class DateTestCase(unittest.TestCase): ae(str(Interval('1y') - Interval('- 1y')), '+ 2y') ae(str(Interval('1y') - Interval('- 1m')), '+ 1y 1m') ae(str(Interval('1y') - Interval('- 2:40')), '+ 1y 2:40') - ae(str(Interval('1y') - Interval('1y')), '') + ae(str(Interval('1y') - Interval('1y')), '00:00') ae(str(Interval('1y') - Interval('1m')), '+ 11m') ae(str(Interval('1:00') - Interval('- 1:00')), '+ 2:00') ae(str(Interval('0:50') - Interval('- 0:50')), '+ 1:40') - ae(str(Interval('1:50') - Interval('1:50')), '') + ae(str(Interval('1:50') - Interval('1:50')), '00:00') ae(str(Interval('1:59:59') - Interval('- 00:00:01')), '+ 2:00') ae(str(Interval('2:00') - Interval('00:00:01')), '+ 1:59:59') @@ -223,9 +365,156 @@ class DateTestCase(unittest.TestCase): l = [i1, i2]; l.sort() ae(l, [i1, i2]) + i1 = Interval("1:20") + i2 = Interval("2d") + i3 = Interval("3:30") + l = [i1, i2, i3]; l.sort() + ae(l, [i1, i3, i2]) + + def testGranularity(self): + ae = self.assertEqual + ae(str(Date('2003-2-12', add_granularity=1)), '2003-02-12.23:59:59') + ae(str(Date('2003-1-1.23:00', add_granularity=1)), '2003-01-01.23:00:59') + ae(str(Date('2003', add_granularity=1)), '2003-12-31.23:59:59') + ae(str(Date('2003-5', add_granularity=1)), '2003-05-31.23:59:59') + ae(str(Date('2003-12', add_granularity=1)), '2003-12-31.23:59:59') + ae(str(Interval('+1w', add_granularity=1)), '+ 14d') + ae(str(Interval('-2m 3w', add_granularity=1)), '- 2m 14d') + + def testIntervalPretty(self): + def ae(spec, pretty): + self.assertEqual(Interval(spec).pretty(), pretty) + ae('2y', 'in 2 years') + ae('1y', 'in 1 year') + ae('2m', 'in 2 months') + ae('1m 30d', 'in 2 months') + ae('60d', 'in 2 months') + ae('59d', 'in 1 month') + ae('1m', 'in 1 month') + ae('29d', 'in 1 month') + ae('28d', 'in 4 weeks') + ae('8d', 'in 1 week') + ae('7d', 'in 7 days') + ae('1w', 'in 7 days') + ae('2d', 'in 2 days') + ae('1d', 'tomorrow') + ae('02:00:00', 'in 2 hours') + ae('01:59:00', 'in 1 3/4 hours') + ae('01:45:00', 'in 1 3/4 hours') + ae('01:30:00', 'in 1 1/2 hours') + ae('01:29:00', 'in 1 1/4 hours') + ae('01:00:00', 'in an hour') + ae('00:30:00', 'in 1/2 an hour') + ae('00:15:00', 'in 1/4 hour') + ae('00:02:00', 'in 2 minutes') + ae('00:01:00', 'in 1 minute') + ae('00:00:30', 'in a moment') + ae('-00:00:30', 'just now') + ae('-1d', 'yesterday') + ae('-1y', '1 year ago') + ae('-2y', '2 years ago') + + def testPyDatetime(self): + d = datetime.datetime.now() + Date(d) + toomuch = datetime.MAXYEAR + 1 + self.assertRaises(ValueError, Date, (toomuch, 1, 1, 0, 0, 0, 0, 1, -1)) + + def testSimpleTZ(self): + ae = self.assertEqual + # local to utc + date = Date('2006-04-04.12:00:00', 2) + ae(str(date), '2006-04-04.10:00:00') + # utc to local + date = Date('2006-04-04.10:00:00') + date = date.local(2) + ae(str(date), '2006-04-04.12:00:00') + # from Date instance + date = Date('2006-04-04.12:00:00') + date = Date(date, 2) + ae(str(date), '2006-04-04.10:00:00') + + def testTimestamp(self): + ae = self.assertEqual + date = Date('2038') + ae(date.timestamp(), 2145916800) + date = Date('1902') + ae(date.timestamp(), -2145916800) + date = Date(time.gmtime(0)) + ae(date.timestamp(), 0) + ae(str(date), '1970-01-01.00:00:00') + date = Date(time.gmtime(0x7FFFFFFF)) + ae(date.timestamp(), 2147483647) + ae(str(date), '2038-01-19.03:14:07') + date = Date('1901-12-13.20:45:52') + ae(date.timestamp(), -0x80000000L) + ae(str(date), '1901-12-13.20:45:52') + date = Date('9999') + ae (date.timestamp(), 253370764800.0) + date = Date('0033') + ae (date.timestamp(), -61125753600.0) + ae(str(date), '0033-01-01.00:00:00') + +class TimezoneTestCase(unittest.TestCase): + + def testTZ(self): + ae = self.assertEqual + tz = 'Europe/Warsaw' + + # local to utc, DST + date = Date('2006-04-04.12:00:00', tz) + ae(str(date), '2006-04-04.10:00:00') + + # local to utc, no DST + date = Date('2006-01-01.12:00:00', tz) + ae(str(date), '2006-01-01.11:00:00') + + # utc to local, DST + date = Date('2006-04-04.10:00:00') + date = date.local(tz) + ae(str(date), '2006-04-04.12:00:00') + + # utc to local, no DST + date = Date('2006-01-01.10:00:00') + date = date.local(tz) + ae(str(date), '2006-01-01.11:00:00') + + date = Date('2006-04-04.12:00:00') + date = Date(date, tz) + ae(str(date), '2006-04-04.10:00:00') + date = Date('2006-01-01.12:00:00') + date = Date(date, tz) + ae(str(date), '2006-01-01.11:00:00') + + +class RangeTestCase(unittest.TestCase): + + def testRange(self): + ae = self.assertEqual + r = Range('2006', Date) + ae(str(r.from_value), '2006-01-01.00:00:00') + ae(str(r.to_value), '2006-12-31.23:59:59') + for i in range(1, 13): + r = Range('2006-%02d'%i, Date) + ae(str(r.from_value), '2006-%02d-01.00:00:00'%i) + ae(str(r.to_value), '2006-%02d-%02d.23:59:59'%(i, + calendar.mdays[i])) + -def suite(): - return unittest.makeSuite(DateTestCase, 'test') +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(DateTestCase)) + suite.addTest(unittest.makeSuite(RangeTestCase)) + try: + import pytz + except ImportError: + pass + else: + suite.addTest(unittest.makeSuite(TimezoneTestCase)) + return suite +if __name__ == '__main__': + runner = unittest.TextTestRunner() + unittest.main(testRunner=runner) -# vim: set filetype=python ts=4 sw=4 et si +# vim: set filetype=python sts=4 sw=4 et si :