66import arrow
77from datetime import datetime as pydatetime
88from datetime import timedelta
9+ from datetime import timezone as pydttz
910from datemath import dm , datemath
1011from datemath .helpers import DateMathException as DateMathException
1112from dateutil import tz
@@ -15,6 +16,9 @@ class TestDM(unittest.TestCase):
1516
1617
1718 def testParse (self ):
19+ # Make sure our helpers return the correct objects
20+ self .assertIsInstance (datemath ('now' ), pydatetime )
21+ self .assertIsInstance (dm ('now' ), arrow .arrow .Arrow )
1822
1923 # Baisc dates
2024 self .assertEqual (dm ('2016.01.02' ).format (iso8601 ), '2016-01-02T00:00:00+00:00' )
@@ -42,13 +46,16 @@ def testParse(self):
4246 self .assertEqual (dm ('2016-01-01' , tz = 'US/Eastern' ), pydatetime (2016 , 1 , 1 , tzinfo = tz .gettz ('US/Eastern' )))
4347 self .assertEqual (datemath ('2016-01-01T01:00:00' , tz = 'US/Central' ), pydatetime (2016 , 1 , 1 , 1 , 0 , 0 , tzinfo = tz .gettz ('US/Central' )))
4448 self .assertEqual (datemath ('2016-01-01T02:00:00' , tz = 'US/Eastern' ), pydatetime (2016 , 1 , 1 , 2 , tzinfo = tz .gettz ('US/Eastern' )))
49+
4550 # TZ offset inside of date string
4651 self .assertEqual (datemath ('2016-01-01T16:20:00.5+12:00' ), pydatetime (2016 , 1 , 1 , 16 , 20 , 0 , 500000 , tzinfo = tz .tzoffset (None , timedelta (hours = 12 ))))
4752 self .assertEqual (datemath ('2016-01-01T16:20:00.5-05:00' ), pydatetime (2016 , 1 , 1 , 16 , 20 , 0 , 500000 , tzinfo = tz .tzoffset (None , timedelta (hours = - 5 ))))
4853 self .assertEqual (datemath ('2016-01-01T16:20:00.5-00:00' ), pydatetime (2016 , 1 , 1 , 16 , 20 , 0 , 500000 , tzinfo = tz .tzoffset (None , timedelta (hours = 0 ))))
54+
4955 # TZ offset inside of date string with datemath
5056 self .assertEqual (datemath ('2016-01-01T16:20:00.5+12:00||+1d' ), pydatetime (2016 , 1 , 2 , 16 , 20 , 0 , 500000 , tzinfo = tz .tzoffset (None , timedelta (hours = 12 ))))
5157 self .assertEqual (datemath ('2016-01-01T16:20:00.6+12:00||+2d+1h' ), pydatetime (2016 , 1 , 3 , 17 , 20 , 0 , 600000 , tzinfo = tz .tzoffset (None , timedelta (hours = 12 ))))
58+
5259 # If a TZ offset is in a datetime string, and there is a tz param used, the TZ offset will take precedence for the returned timeobj
5360 self .assertEqual (datemath ('2016-01-01T16:20:00.6+12:00||+2d+1h' , tz = 'US/Eastern' ), pydatetime (2016 , 1 , 3 , 17 , 20 , 0 , 600000 , tzinfo = tz .tzoffset (None , timedelta (hours = 12 ))))
5461
@@ -62,6 +69,7 @@ def testParse(self):
6269 self .assertEqual (dm ('+1M' ).format (iso8601 ), arrow .utcnow ().shift (months = + 1 ).format (iso8601 ))
6370 self .assertEqual (dm ('+1Y' ).format (iso8601 ), arrow .utcnow ().shift (years = + 1 ).format (iso8601 ))
6471 self .assertEqual (dm ('+1y' ).format (iso8601 ), arrow .utcnow ().shift (years = + 1 ).format (iso8601 ))
72+
6573 # subtraction
6674 self .assertEqual (dm ('-1s' ).format (iso8601 ), arrow .utcnow ().shift (seconds = - 1 ).format (iso8601 ))
6775 self .assertEqual (dm ('-1m' ).format (iso8601 ), arrow .utcnow ().shift (minutes = - 1 ).format (iso8601 ))
@@ -71,6 +79,7 @@ def testParse(self):
7179 self .assertEqual (dm ('-1M' ).format (iso8601 ), arrow .utcnow ().shift (months = - 1 ).format (iso8601 ))
7280 self .assertEqual (dm ('-1Y' ).format (iso8601 ), arrow .utcnow ().shift (years = - 1 ).format (iso8601 ))
7381 self .assertEqual (dm ('-1y' ).format (iso8601 ), arrow .utcnow ().shift (years = - 1 ).format (iso8601 ))
82+
7483 # rounding
7584 self .assertEqual (dm ('/s' ).format (iso8601 ), arrow .utcnow ().floor ('second' ).format (iso8601 ))
7685 self .assertEqual (dm ('/m' ).format (iso8601 ), arrow .utcnow ().floor ('minute' ).format (iso8601 ))
@@ -80,6 +89,7 @@ def testParse(self):
8089 self .assertEqual (dm ('/M' ).format (iso8601 ), arrow .utcnow ().floor ('month' ).format (iso8601 ))
8190 self .assertEqual (dm ('/Y' ).format (iso8601 ), arrow .utcnow ().floor ('year' ).format (iso8601 ))
8291 self .assertEqual (dm ('/y' ).format (iso8601 ), arrow .utcnow ().floor ('year' ).format (iso8601 ))
92+
8393 # rounding up
8494 self .assertEqual (dm ('/s' , roundDown = False ).format (iso8601 ), arrow .utcnow ().ceil ('second' ).format (iso8601 ))
8595 self .assertEqual (dm ('/m' , roundDown = False ).format (iso8601 ), arrow .utcnow ().ceil ('minute' ).format (iso8601 ))
@@ -89,8 +99,7 @@ def testParse(self):
8999 self .assertEqual (dm ('/M' , roundDown = False ).format (iso8601 ), arrow .utcnow ().ceil ('month' ).format (iso8601 ))
90100 self .assertEqual (dm ('/Y' , roundDown = False ).format (iso8601 ), arrow .utcnow ().ceil ('year' ).format (iso8601 ))
91101 self .assertEqual (dm ('/y' , roundDown = False ).format (iso8601 ), arrow .utcnow ().ceil ('year' ).format (iso8601 ))
92-
93-
102+
94103 # roundDown option tests
95104 self .assertEqual (dm ('2016-01-01T14:00:00||/d' ).format (iso8601 ), '2016-01-01T00:00:00+00:00' )
96105 self .assertEqual (dm ('2016-01-01T14:00:00||/d' , roundDown = False ).format (iso8601 ), '2016-01-01T23:59:59+00:00' )
@@ -143,6 +152,7 @@ def testParse(self):
143152 self .assertEqual (dm (1367900664 ).format (iso8601 ), '2013-05-07T04:24:24+00:00' )
144153
145154 self .assertRaises (DateMathException , dm , '1451610061000' )
155+
146156 try :
147157 dm (1451610061000 )
148158 except DateMathException as e :
0 commit comments