def test_parse_duration_prescribed_relative(self): resultduration = _parse_duration_prescribed('P1Y', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(years=1)) resultduration = _parse_duration_prescribed('P1M', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(months=1)) #Add the relative ‘days’ argument to the absolute day. Notice that the ‘weeks’ argument is multiplied by 7 and added to ‘days’. #http://dateutil.readthedocs.org/en/latest/relativedelta.html resultduration = _parse_duration_prescribed('P1W', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(days=7)) resultduration = _parse_duration_prescribed('P1.5W', True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(days=10.5)) #Make sure we truncate, not round #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is resultduration = parse_duration('PT0.0000001S', relative=True) self.assertEqual(resultduration, dateutil.relativedelta.relativedelta(0)) resultduration = parse_duration('PT2.0000048S', relative=True) self.assertEqual( resultduration, dateutil.relativedelta.relativedelta(seconds=2.000004))
def test_parse_duration_prescribed_relative_nodateutil(self): import sys import dateutil dateutil_import = dateutil sys.modules['dateutil'] = None with self.assertRaises(RuntimeError): _parse_duration_prescribed('P1Y', True) #Reinstall dateutil sys.modules['dateutil'] = dateutil
def test_parse_duration_prescribed_relative(self): resultduration = _parse_duration_prescribed('P1Y', True) self.assertEqual(resultduration.years, 1) resultduration = _parse_duration_prescribed('P1M', True) self.assertEqual(resultduration.months, 1) #Add the relative ‘days’ argument to the absolute day. Notice that the ‘weeks’ argument is multiplied by 7 and added to ‘days’. #http://dateutil.readthedocs.org/en/latest/relativedelta.html resultduration = _parse_duration_prescribed('P1W', True) self.assertEqual(resultduration.days, 7) resultduration = _parse_duration_prescribed('P1.5W', True) self.assertEqual(resultduration.days, 10.5) #Fractional weeks are allowed
def test_parse_duration_prescribed_negative(self): with self.assertRaises(NegativeDurationError): _parse_duration_prescribed('P-T1H', builder=None) with self.assertRaises(NegativeDurationError): _parse_duration_prescribed('P-T2M', builder=None) with self.assertRaises(NegativeDurationError): _parse_duration_prescribed('P-T3S', builder=None) with self.assertRaises(NegativeDurationError): _parse_duration_prescribed('P-4W', builder=None) with self.assertRaises(NegativeDurationError): _parse_duration_prescribed('P-1Y2M3DT4H54M6S', builder=None)
def test_parse_duration_prescribed(self): testtuples = (('P1Y2M3DT4H54M6S', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6'}), ('P1Y2M3DT4H54M6,5S', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('P1Y2M3DT4H54M6.5S', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('PT4H54M6,5S', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': None, 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('PT4H54M6.5S', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': None, 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('P1Y2M3D', {'PnY': '1', 'PnM': '2', '' 'PnW': None, 'PnD': '3'}), ('P1Y2M3,5D', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3.5'}), ('P1Y2M3.5D', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3.5'}), ('P1Y2M', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': None}), ('P1Y', {'PnY': '1', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1,5Y', {'PnY': '1.5', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1.5Y', {'PnY': '1.5', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1M', {'PnY': None, 'PnM': '1', 'PnW': None, 'PnD': None}), ('P1,5M', {'PnY': None, 'PnM': '1.5', 'PnW': None, 'PnD':None}), ('P1.5M', {'PnY': None, 'PnM': '1.5', 'PnW': None, 'PnD':None}), ('P1W', {'PnY': None, 'PnM': None, 'PnW': '1', 'PnD': None}), ('P1,5W', {'PnY': None, 'PnM': None, 'PnW': '1.5', 'PnD': None}), ('P1.5W', {'PnY': None, 'PnM': None, 'PnW': '1.5', 'PnD': None}), ('P1D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1'}), ('P1,5D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1.5'}), ('P1.5D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1.5'})) for testtuple in testtuples: result = _parse_duration_prescribed(testtuple[0]) self.assertEqual(result, testtuple[1])
def test_parse_duration_prescribed(self): testtuples = (('P1Y2M3DT4H54M6S', {'PnY': '1', 'PnM': '2', 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6'}), ('P1Y2M3DT4H54M6.5S', {'PnY': '1', 'PnM': '2', 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('P1Y2M3DT4H54M6,5S', {'PnY': '1', 'PnM': '2', 'PnD': '3', 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('PT4H54M6.5S', {'PnY': None, 'PnM': None, 'PnD': None, 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('PT4H54M6,5S', {'PnY': None, 'PnM': None, 'PnD': None, 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}), ('P1Y2M3D', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3'}), ('P1Y2M3.5D', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3.5'}), ('P1Y2M3,5D', {'PnY': '1', 'PnM': '2', 'PnW': None, 'PnD': '3.5'}), ('P1Y', {'PnY': '1', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1.5Y', {'PnY': '1.5', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1,5Y', {'PnY': '1.5', 'PnM': None, 'PnW': None, 'PnD': None}), ('P1M', {'PnY': None, 'PnM': '1', 'PnW': None, 'PnD': None}), ('P1.5M', {'PnY': None, 'PnM': '1.5', 'PnW': None, 'PnD': None}), ('P1,5M', {'PnY': None, 'PnM': '1.5', 'PnW': None, 'PnD': None}), ('P1W', {'PnY': None, 'PnM': None, 'PnW': '1', 'PnD': None}), ('P1.5W', {'PnY': None, 'PnM': None, 'PnW': '1.5', 'PnD': None}), ('P1,5W', {'PnY': None, 'PnM': None, 'PnW': '1.5', 'PnD': None}), ('P1D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1'}), ('P1.5D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1.5'}), ('P1,5D', {'PnY': None, 'PnM': None, 'PnW': None, 'PnD': '1.5'})) for testtuple in testtuples: mockBuilder = mock.Mock() mockBuilder.build_duration.return_value = testtuple[1] result = _parse_duration_prescribed(testtuple[0], mockBuilder) self.assertEqual(result, testtuple[1]) mockBuilder.build_duration.assert_called_once_with(**testtuple[1])
def test_parse_duration_prescribed_relative_fractionalmonth(self): #Fractional months and years are not defined #https://github.com/dateutil/dateutil/issues/40 with self.assertRaises(RelativeValueError): _parse_duration_prescribed('P1.5M', True)
def test_parse_duration_prescribed(self): resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6S', False) self.assertEqual( resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6)) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6.5S', False) self.assertEqual( resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6,5S', False) self.assertEqual( resultduration, datetime.timedelta(days=428, hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('PT4H54M6.5S', False) self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('PT4H54M6,5S', False) self.assertEqual(resultduration, datetime.timedelta(hours=4, minutes=54, seconds=6.5)) resultduration = _parse_duration_prescribed('P1Y2M3D', False) self.assertEqual(resultduration, datetime.timedelta(days=428)) resultduration = _parse_duration_prescribed('P1Y2M3.5D', False) self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = _parse_duration_prescribed('P1Y2M3,5D', False) self.assertEqual(resultduration, datetime.timedelta(days=428.5)) resultduration = _parse_duration_prescribed('P1Y', False) self.assertEqual(resultduration, datetime.timedelta(days=365)) resultduration = _parse_duration_prescribed('P1.5Y', False) self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = _parse_duration_prescribed('P1,5Y', False) self.assertEqual(resultduration, datetime.timedelta(days=547.5)) resultduration = _parse_duration_prescribed('P1M', False) self.assertEqual(resultduration, datetime.timedelta(days=30)) resultduration = _parse_duration_prescribed('P1.5M', False) self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = _parse_duration_prescribed('P1,5M', False) self.assertEqual(resultduration, datetime.timedelta(days=45)) resultduration = _parse_duration_prescribed('P1W', False) self.assertEqual(resultduration, datetime.timedelta(days=7)) resultduration = _parse_duration_prescribed('P1.5W', False) self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = _parse_duration_prescribed('P1,5W', False) self.assertEqual(resultduration, datetime.timedelta(days=10.5)) resultduration = _parse_duration_prescribed('P1D', False) self.assertEqual(resultduration, datetime.timedelta(days=1)) resultduration = _parse_duration_prescribed('P1.5D', False) self.assertEqual(resultduration, datetime.timedelta(days=1.5)) resultduration = _parse_duration_prescribed('P1,5D', False) self.assertEqual(resultduration, datetime.timedelta(days=1.5)) #Verify overflows self.assertEqual(parse_duration('PT36H'), parse_duration('P1DT12H'))
def test_parse_duration_prescribed_suffixgarbage(self): #Don't allow garbage after the duration #https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1Dasdfasdf', None)
def test_parse_duration_prescribed_multiplefractions(self): with self.assertRaises(ISOFormatError): #Multiple fractions are not allowed _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', None)
def test_parse_duration_prescribed_relative_multiplefractions(self): with self.assertRaises(ValueError): #Multiple fractions are not allowed _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', True)
def test_parse_duration_prescribed(self): testtuples = ( ( "P1Y2M3DT4H54M6S", { "PnY": "1", "PnM": "2", "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6", }, ), ( "P1Y2M3DT4H54M6.5S", { "PnY": "1", "PnM": "2", "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "P1Y2M3DT4H54M6,5S", { "PnY": "1", "PnM": "2", "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "PT4H54M6.5S", { "PnY": None, "PnM": None, "PnD": None, "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "PT4H54M6,5S", { "PnY": None, "PnM": None, "PnD": None, "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ("P1Y2M3D", {"PnY": "1", "PnM": "2", "PnW": None, "PnD": "3"}), ("P1Y2M3.5D", {"PnY": "1", "PnM": "2", "PnW": None, "PnD": "3.5"}), ("P1Y2M3,5D", {"PnY": "1", "PnM": "2", "PnW": None, "PnD": "3.5"}), ("P1Y", {"PnY": "1", "PnM": None, "PnW": None, "PnD": None}), ("P1.5Y", {"PnY": "1.5", "PnM": None, "PnW": None, "PnD": None}), ("P1,5Y", {"PnY": "1.5", "PnM": None, "PnW": None, "PnD": None}), ("P1M", {"PnY": None, "PnM": "1", "PnW": None, "PnD": None}), ("P1.5M", {"PnY": None, "PnM": "1.5", "PnW": None, "PnD": None}), ("P1,5M", {"PnY": None, "PnM": "1.5", "PnW": None, "PnD": None}), ("P1W", {"PnY": None, "PnM": None, "PnW": "1", "PnD": None}), ("P1.5W", {"PnY": None, "PnM": None, "PnW": "1.5", "PnD": None}), ("P1,5W", {"PnY": None, "PnM": None, "PnW": "1.5", "PnD": None}), ("P1D", {"PnY": None, "PnM": None, "PnW": None, "PnD": "1"}), ("P1.5D", {"PnY": None, "PnM": None, "PnW": None, "PnD": "1.5"}), ("P1,5D", {"PnY": None, "PnM": None, "PnW": None, "PnD": "1.5"}), ) for testtuple in testtuples: mockBuilder = mock.Mock() mockBuilder.build_duration.return_value = testtuple[1] result = _parse_duration_prescribed(testtuple[0], mockBuilder) self.assertEqual(result, testtuple[1]) mockBuilder.build_duration.assert_called_once_with(**testtuple[1])
def test_parse_duration_prescribed_negative(self): with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-1Y") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-2M") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-3D") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-4W") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-1Y2M3D") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-T1H") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-T2M") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-T3S") with self.assertRaises(ISOFormatError): _parse_duration_prescribed("P-1Y2M3DT4H54M6S")
def test_parse_duration_prescribed(self): testtuples = ( ( "P1Y2M3DT4H54M6S", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6", }, ), ( "P1Y2M3DT4H54M6,5S", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "P1Y2M3DT4H54M6.5S", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": "3", "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "PT4H54M6,5S", { "PnY": None, "PnM": None, "PnW": None, "PnD": None, "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ( "PT4H54M6.5S", { "PnY": None, "PnM": None, "PnW": None, "PnD": None, "TnH": "4", "TnM": "54", "TnS": "6.5", }, ), ("P1Y2M3D", { "PnY": "1", "PnM": "2", "" "PnW": None, "PnD": "3" }), ("P1Y2M3,5D", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": "3.5" }), ("P1Y2M3.5D", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": "3.5" }), ("P1Y2M", { "PnY": "1", "PnM": "2", "PnW": None, "PnD": None }), ("P1Y", { "PnY": "1", "PnM": None, "PnW": None, "PnD": None }), ("P1,5Y", { "PnY": "1.5", "PnM": None, "PnW": None, "PnD": None }), ("P1.5Y", { "PnY": "1.5", "PnM": None, "PnW": None, "PnD": None }), ("P1M", { "PnY": None, "PnM": "1", "PnW": None, "PnD": None }), ("P1,5M", { "PnY": None, "PnM": "1.5", "PnW": None, "PnD": None }), ("P1.5M", { "PnY": None, "PnM": "1.5", "PnW": None, "PnD": None }), ("P1W", { "PnY": None, "PnM": None, "PnW": "1", "PnD": None }), ("P1,5W", { "PnY": None, "PnM": None, "PnW": "1.5", "PnD": None }), ("P1.5W", { "PnY": None, "PnM": None, "PnW": "1.5", "PnD": None }), ("P1D", { "PnY": None, "PnM": None, "PnW": None, "PnD": "1" }), ("P1,5D", { "PnY": None, "PnM": None, "PnW": None, "PnD": "1.5" }), ("P1.5D", { "PnY": None, "PnM": None, "PnW": None, "PnD": "1.5" }), ) for testtuple in testtuples: result = _parse_duration_prescribed(testtuple[0]) self.assertEqual(result, testtuple[1])
def test_parse_duration_prescribed_negative(self): with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-1Y') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-2M') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-3D') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-4W') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-1Y2M3D') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-T1H') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-T2M') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-T3S') with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P-1Y2M3DT4H54M6S')
def test_parse_duration_prescribed_relative_middlefraction(self): with self.assertRaises(ValueError): #Fraction only allowed on final component _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', True)
def test_parse_duration_prescribed(self): with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', False) with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', False) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6S', False) self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6.5S', False) self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6,5S', False) self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y2M3D', False) self.assertEqual(resultduration.days, 428) resultduration = _parse_duration_prescribed('P1Y2M3.5D', False) self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1Y2M3,5D', False) self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('PT4H54M6.5S', False) self.assertEqual(resultduration.days, 0) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('PT4H54M6,5S', False) self.assertEqual(resultduration.days, 0) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y', False) self.assertEqual(resultduration.days, 365) resultduration = _parse_duration_prescribed('P1.5Y', False) self.assertEqual(resultduration.days, 547) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5Y', False) self.assertEqual(resultduration.days, 547) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1M', False) self.assertEqual(resultduration.days, 30) resultduration = _parse_duration_prescribed('P1.5M', False) self.assertEqual(resultduration.days, 45) resultduration = _parse_duration_prescribed('P1,5M', False) self.assertEqual(resultduration.days, 45) resultduration = _parse_duration_prescribed('P1W', False) self.assertEqual(resultduration.days, 7) resultduration = _parse_duration_prescribed('P1.5W', False) self.assertEqual(resultduration.days, 10) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5W', False) self.assertEqual(resultduration.days, 10) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1D', False) self.assertEqual(resultduration.days, 1) resultduration = _parse_duration_prescribed('P1.5D', False) self.assertEqual(resultduration.days, 1) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5D', False) self.assertEqual(resultduration.days, 1) self.assertEqual(resultduration.seconds, 43200) #Verify overflows self.assertEqual(parse_duration('PT36H', False), parse_duration('P1DT12H', False))
def test_parse_duration_prescribed_middlefraction(self): with self.assertRaises(ISOFormatError): #Fraction only allowed on final component _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', None)
def test_parse_duration_prescribed_relative(self): with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S', True) #Fractional months and years are not defined #https://github.com/dateutil/dateutil/issues/40 with self.assertRaises(ValueError): _parse_duration_prescribed('P1.5Y', True) with self.assertRaises(ValueError): _parse_duration_prescribed('P1.5M', True) resultduration = _parse_duration_prescribed('P1Y', True) self.assertEqual(resultduration.years, 1) resultduration = _parse_duration_prescribed('P1M', True) self.assertEqual(resultduration.months, 1) #Add the relative ‘days’ argument to the absolute day. Notice that the ‘weeks’ argument is multiplied by 7 and added to ‘days’. #http://dateutil.readthedocs.org/en/latest/relativedelta.html resultduration = _parse_duration_prescribed('P1W', True) self.assertEqual(resultduration.days, 7) resultduration = _parse_duration_prescribed('P1.5W', True) self.assertEqual(resultduration.days, 10.5) #Fractional weeks are allowed
def test_parse_duration_prescribed_outoforder(self): #Ensure durations are required to be in the correct order #https://bitbucket.org/nielsenb/aniso8601/issues/7/durations-with-time-components-before-t #https://bitbucket.org/nielsenb/aniso8601/issues/8/durations-with-components-in-wrong-order with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1S', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1D1S', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1H1M', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('1Y2M3D1SPT1M', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1Y2M3D2MT1S', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P2M3D1ST1Y1M', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1Y2M2MT3D1S', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('P1D1Y1M', None) with self.assertRaises(ISOFormatError): _parse_duration_prescribed('PT1S1H', None)
def test_parse_duration_prescribed(self): with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6.1234S') with self.assertRaises(ValueError): _parse_duration_prescribed('P1Y2M3DT4H5.1234M6S') resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6S') self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6.5S') self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y2M3DT4H54M6,5S') self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y2M3D') self.assertEqual(resultduration.days, 428) resultduration = _parse_duration_prescribed('P1Y2M3.5D') self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1Y2M3,5D') self.assertEqual(resultduration.days, 428) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('PT4H54M6.5S') self.assertEqual(resultduration.days, 0) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('PT4H54M6,5S') self.assertEqual(resultduration.days, 0) self.assertEqual(resultduration.seconds, 17646) self.assertEqual(resultduration.microseconds, 500000) resultduration = _parse_duration_prescribed('P1Y') self.assertEqual(resultduration.days, 365) resultduration = _parse_duration_prescribed('P1.5Y') self.assertEqual(resultduration.days, 547) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5Y') self.assertEqual(resultduration.days, 547) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1M') self.assertEqual(resultduration.days, 30) resultduration = _parse_duration_prescribed('P1.5M') self.assertEqual(resultduration.days, 45) resultduration = _parse_duration_prescribed('P1,5M') self.assertEqual(resultduration.days, 45) resultduration = _parse_duration_prescribed('P1W') self.assertEqual(resultduration.days, 7) resultduration = _parse_duration_prescribed('P1.5W') self.assertEqual(resultduration.days, 10) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5W') self.assertEqual(resultduration.days, 10) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1D') self.assertEqual(resultduration.days, 1) resultduration = _parse_duration_prescribed('P1.5D') self.assertEqual(resultduration.days, 1) self.assertEqual(resultduration.seconds, 43200) resultduration = _parse_duration_prescribed('P1,5D') self.assertEqual(resultduration.days, 1) self.assertEqual(resultduration.seconds, 43200) #Verify overflows self.assertEqual(parse_duration('PT36H'), parse_duration('P1DT12H'))