Spaces:
Running
Running
# -*- coding: utf-8 -*- | |
# Copyright (c) 2021, Brandon Nielsen | |
# All rights reserved. | |
# | |
# This software may be modified and distributed under the terms | |
# of the BSD license. See the LICENSE file for details. | |
import unittest | |
import aniso8601 | |
from aniso8601.builders import DatetimeTuple, DateTuple, TimeTuple, TimezoneTuple | |
from aniso8601.exceptions import ISOFormatError | |
from aniso8601.resolution import TimeResolution | |
from aniso8601.tests.compat import mock | |
from aniso8601.time import ( | |
_get_time_resolution, | |
get_datetime_resolution, | |
get_time_resolution, | |
parse_datetime, | |
parse_time, | |
) | |
class TestTimeResolutionFunctions(unittest.TestCase): | |
def test_get_time_resolution(self): | |
self.assertEqual(get_time_resolution("01:23:45"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("24:00:00"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("23:21:28,512400"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("23:21:28.512400"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("01:23"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("24:00"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("01:23,4567"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("01:23.4567"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("012345"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("240000"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("0123"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("2400"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("01"), TimeResolution.Hours) | |
self.assertEqual(get_time_resolution("24"), TimeResolution.Hours) | |
self.assertEqual(get_time_resolution("12,5"), TimeResolution.Hours) | |
self.assertEqual(get_time_resolution("12.5"), TimeResolution.Hours) | |
self.assertEqual( | |
get_time_resolution("232128.512400+00:00"), TimeResolution.Seconds | |
) | |
self.assertEqual(get_time_resolution("0123.4567+00:00"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("01.4567+00:00"), TimeResolution.Hours) | |
self.assertEqual(get_time_resolution("01:23:45+00:00"), TimeResolution.Seconds) | |
self.assertEqual(get_time_resolution("24:00:00+00:00"), TimeResolution.Seconds) | |
self.assertEqual( | |
get_time_resolution("23:21:28.512400+00:00"), TimeResolution.Seconds | |
) | |
self.assertEqual(get_time_resolution("01:23+00:00"), TimeResolution.Minutes) | |
self.assertEqual(get_time_resolution("24:00+00:00"), TimeResolution.Minutes) | |
self.assertEqual( | |
get_time_resolution("01:23.4567+00:00"), TimeResolution.Minutes | |
) | |
self.assertEqual( | |
get_time_resolution("23:21:28.512400+11:15"), TimeResolution.Seconds | |
) | |
self.assertEqual( | |
get_time_resolution("23:21:28.512400-12:34"), TimeResolution.Seconds | |
) | |
self.assertEqual( | |
get_time_resolution("23:21:28.512400Z"), TimeResolution.Seconds | |
) | |
self.assertEqual( | |
get_time_resolution("06:14:00.000123Z"), TimeResolution.Seconds | |
) | |
def test_get_datetime_resolution(self): | |
self.assertEqual( | |
get_datetime_resolution("2019-06-05T01:03:11.858714"), | |
TimeResolution.Seconds, | |
) | |
self.assertEqual( | |
get_datetime_resolution("2019-06-05T01:03:11"), TimeResolution.Seconds | |
) | |
self.assertEqual( | |
get_datetime_resolution("2019-06-05T01:03"), TimeResolution.Minutes | |
) | |
self.assertEqual(get_datetime_resolution("2019-06-05T01"), TimeResolution.Hours) | |
def test_get_time_resolution_badtype(self): | |
testtuples = (None, 1, False, 1.234) | |
for testtuple in testtuples: | |
with self.assertRaises(ValueError): | |
get_time_resolution(testtuple) | |
def test_get_time_resolution_badstr(self): | |
testtuples = ("A6:14:00.000123Z", "06:14:0B", "bad", "") | |
for testtuple in testtuples: | |
with self.assertRaises(ISOFormatError): | |
get_time_resolution(testtuple) | |
def test_get_time_resolution_internal(self): | |
self.assertEqual( | |
_get_time_resolution(TimeTuple(hh="01", mm="02", ss="03", tz=None)), | |
TimeResolution.Seconds, | |
) | |
self.assertEqual( | |
_get_time_resolution(TimeTuple(hh="01", mm="02", ss=None, tz=None)), | |
TimeResolution.Minutes, | |
) | |
self.assertEqual( | |
_get_time_resolution(TimeTuple(hh="01", mm=None, ss=None, tz=None)), | |
TimeResolution.Hours, | |
) | |
class TestTimeParserFunctions(unittest.TestCase): | |
def test_parse_time(self): | |
testtuples = ( | |
("01:23:45", {"hh": "01", "mm": "23", "ss": "45", "tz": None}), | |
("24:00:00", {"hh": "24", "mm": "00", "ss": "00", "tz": None}), | |
( | |
"23:21:28,512400", | |
{"hh": "23", "mm": "21", "ss": "28.512400", "tz": None}, | |
), | |
( | |
"23:21:28.512400", | |
{"hh": "23", "mm": "21", "ss": "28.512400", "tz": None}, | |
), | |
( | |
"01:03:11.858714", | |
{"hh": "01", "mm": "03", "ss": "11.858714", "tz": None}, | |
), | |
( | |
"14:43:59.9999997", | |
{"hh": "14", "mm": "43", "ss": "59.9999997", "tz": None}, | |
), | |
("01:23", {"hh": "01", "mm": "23", "ss": None, "tz": None}), | |
("24:00", {"hh": "24", "mm": "00", "ss": None, "tz": None}), | |
("01:23,4567", {"hh": "01", "mm": "23.4567", "ss": None, "tz": None}), | |
("01:23.4567", {"hh": "01", "mm": "23.4567", "ss": None, "tz": None}), | |
("012345", {"hh": "01", "mm": "23", "ss": "45", "tz": None}), | |
("240000", {"hh": "24", "mm": "00", "ss": "00", "tz": None}), | |
("232128,512400", {"hh": "23", "mm": "21", "ss": "28.512400", "tz": None}), | |
("232128.512400", {"hh": "23", "mm": "21", "ss": "28.512400", "tz": None}), | |
("010311.858714", {"hh": "01", "mm": "03", "ss": "11.858714", "tz": None}), | |
( | |
"144359.9999997", | |
{"hh": "14", "mm": "43", "ss": "59.9999997", "tz": None}, | |
), | |
("0123", {"hh": "01", "mm": "23", "ss": None, "tz": None}), | |
("2400", {"hh": "24", "mm": "00", "ss": None, "tz": None}), | |
("01", {"hh": "01", "mm": None, "ss": None, "tz": None}), | |
("24", {"hh": "24", "mm": None, "ss": None, "tz": None}), | |
("12,5", {"hh": "12.5", "mm": None, "ss": None, "tz": None}), | |
("12.5", {"hh": "12.5", "mm": None, "ss": None, "tz": None}), | |
( | |
"232128,512400+00:00", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"232128.512400+00:00", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"0123,4567+00:00", | |
{ | |
"hh": "01", | |
"mm": "23.4567", | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"0123.4567+00:00", | |
{ | |
"hh": "01", | |
"mm": "23.4567", | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"01,4567+00:00", | |
{ | |
"hh": "01.4567", | |
"mm": None, | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"01.4567+00:00", | |
{ | |
"hh": "01.4567", | |
"mm": None, | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"01:23:45+00:00", | |
{ | |
"hh": "01", | |
"mm": "23", | |
"ss": "45", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"24:00:00+00:00", | |
{ | |
"hh": "24", | |
"mm": "00", | |
"ss": "00", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"23:21:28.512400+00:00", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"01:23+00:00", | |
{ | |
"hh": "01", | |
"mm": "23", | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"24:00+00:00", | |
{ | |
"hh": "24", | |
"mm": "00", | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"01:23.4567+00:00", | |
{ | |
"hh": "01", | |
"mm": "23.4567", | |
"ss": None, | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
}, | |
), | |
( | |
"23:21:28.512400+11:15", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "11", "15", "+11:15"), | |
}, | |
), | |
( | |
"23:21:28.512400-12:34", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(True, None, "12", "34", "-12:34"), | |
}, | |
), | |
( | |
"23:21:28.512400Z", | |
{ | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, True, None, None, "Z"), | |
}, | |
), | |
( | |
"06:14:00.000123Z", | |
{ | |
"hh": "06", | |
"mm": "14", | |
"ss": "00.000123", | |
"tz": TimezoneTuple(False, True, None, None, "Z"), | |
}, | |
), | |
) | |
for testtuple in testtuples: | |
with mock.patch.object( | |
aniso8601.time.PythonTimeBuilder, "build_time" | |
) as mockBuildTime: | |
mockBuildTime.return_value = testtuple[1] | |
result = parse_time(testtuple[0]) | |
self.assertEqual(result, testtuple[1]) | |
mockBuildTime.assert_called_once_with(**testtuple[1]) | |
def test_parse_time_badtype(self): | |
testtuples = (None, 1, False, 1.234) | |
for testtuple in testtuples: | |
with self.assertRaises(ValueError): | |
parse_time(testtuple, builder=None) | |
def test_parse_time_badstr(self): | |
testtuples = ( | |
"A6:14:00.000123Z", | |
"06:14:0B", | |
"06:1 :02", | |
"0000,70:24,9", | |
"00.27:5332", | |
"bad", | |
"", | |
) | |
for testtuple in testtuples: | |
with self.assertRaises(ISOFormatError): | |
parse_time(testtuple, builder=None) | |
def test_parse_time_mockbuilder(self): | |
mockBuilder = mock.Mock() | |
expectedargs = {"hh": "01", "mm": "23", "ss": "45", "tz": None} | |
mockBuilder.build_time.return_value = expectedargs | |
result = parse_time("01:23:45", builder=mockBuilder) | |
self.assertEqual(result, expectedargs) | |
mockBuilder.build_time.assert_called_once_with(**expectedargs) | |
mockBuilder = mock.Mock() | |
expectedargs = { | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "00", "00", "+00:00"), | |
} | |
mockBuilder.build_time.return_value = expectedargs | |
result = parse_time("232128.512400+00:00", builder=mockBuilder) | |
self.assertEqual(result, expectedargs) | |
mockBuilder.build_time.assert_called_once_with(**expectedargs) | |
mockBuilder = mock.Mock() | |
expectedargs = { | |
"hh": "23", | |
"mm": "21", | |
"ss": "28.512400", | |
"tz": TimezoneTuple(False, None, "11", "15", "+11:15"), | |
} | |
mockBuilder.build_time.return_value = expectedargs | |
result = parse_time("23:21:28.512400+11:15", builder=mockBuilder) | |
self.assertEqual(result, expectedargs) | |
mockBuilder.build_time.assert_called_once_with(**expectedargs) | |
def test_parse_datetime(self): | |
testtuples = ( | |
( | |
"2019-06-05T01:03:11,858714", | |
( | |
DateTuple("2019", "06", "05", None, None, None), | |
TimeTuple("01", "03", "11.858714", None), | |
), | |
), | |
( | |
"2019-06-05T01:03:11.858714", | |
( | |
DateTuple("2019", "06", "05", None, None, None), | |
TimeTuple("01", "03", "11.858714", None), | |
), | |
), | |
( | |
"1981-04-05T23:21:28.512400Z", | |
( | |
DateTuple("1981", "04", "05", None, None, None), | |
TimeTuple( | |
"23", | |
"21", | |
"28.512400", | |
TimezoneTuple(False, True, None, None, "Z"), | |
), | |
), | |
), | |
( | |
"1981095T23:21:28.512400-12:34", | |
( | |
DateTuple("1981", None, None, None, None, "095"), | |
TimeTuple( | |
"23", | |
"21", | |
"28.512400", | |
TimezoneTuple(True, None, "12", "34", "-12:34"), | |
), | |
), | |
), | |
( | |
"19810405T23:21:28+00", | |
( | |
DateTuple("1981", "04", "05", None, None, None), | |
TimeTuple( | |
"23", "21", "28", TimezoneTuple(False, None, "00", None, "+00") | |
), | |
), | |
), | |
( | |
"19810405T23:21:28+00:00", | |
( | |
DateTuple("1981", "04", "05", None, None, None), | |
TimeTuple( | |
"23", | |
"21", | |
"28", | |
TimezoneTuple(False, None, "00", "00", "+00:00"), | |
), | |
), | |
), | |
) | |
for testtuple in testtuples: | |
with mock.patch.object( | |
aniso8601.time.PythonTimeBuilder, "build_datetime" | |
) as mockBuildDateTime: | |
mockBuildDateTime.return_value = testtuple[1] | |
result = parse_datetime(testtuple[0]) | |
self.assertEqual(result, testtuple[1]) | |
mockBuildDateTime.assert_called_once_with(*testtuple[1]) | |
def test_parse_datetime_spacedelimited(self): | |
expectedargs = ( | |
DateTuple("2004", None, None, "53", "6", None), | |
TimeTuple( | |
"23", "21", "28.512400", TimezoneTuple(True, None, "12", "34", "-12:34") | |
), | |
) | |
with mock.patch.object( | |
aniso8601.time.PythonTimeBuilder, "build_datetime" | |
) as mockBuildDateTime: | |
mockBuildDateTime.return_value = expectedargs | |
result = parse_datetime("2004-W53-6 23:21:28.512400-12:34", delimiter=" ") | |
self.assertEqual(result, expectedargs) | |
mockBuildDateTime.assert_called_once_with(*expectedargs) | |
def test_parse_datetime_commadelimited(self): | |
expectedargs = ( | |
DateTuple("1981", "04", "05", None, None, None), | |
TimeTuple( | |
"23", "21", "28.512400", TimezoneTuple(False, True, None, None, "Z") | |
), | |
) | |
with mock.patch.object( | |
aniso8601.time.PythonTimeBuilder, "build_datetime" | |
) as mockBuildDateTime: | |
mockBuildDateTime.return_value = expectedargs | |
result = parse_datetime("1981-04-05,23:21:28,512400Z", delimiter=",") | |
self.assertEqual(result, expectedargs) | |
mockBuildDateTime.assert_called_once_with(*expectedargs) | |
def test_parse_datetime_baddelimiter(self): | |
testtuples = ( | |
"1981-04-05,23:21:28,512400Z", | |
"2004-W53-6 23:21:28.512400-12:3", | |
"1981040523:21:28", | |
) | |
for testtuple in testtuples: | |
with self.assertRaises(ISOFormatError): | |
parse_datetime(testtuple, builder=None) | |
def test_parse_datetime_badtype(self): | |
testtuples = (None, 1, False, 1.234) | |
for testtuple in testtuples: | |
with self.assertRaises(ValueError): | |
parse_datetime(testtuple, builder=None) | |
def test_parse_datetime_badstr(self): | |
testtuples = ( | |
"1981-04-05TA6:14:00.000123Z", | |
"2004-W53-6T06:14:0B", | |
"2014-01-230T23:21:28+00", | |
"201401230T01:03:11.858714", | |
"9999 W53T49", | |
"9T0000,70:24,9", | |
"bad", | |
"", | |
) | |
for testtuple in testtuples: | |
with self.assertRaises(ISOFormatError): | |
parse_datetime(testtuple, builder=None) | |
def test_parse_datetime_mockbuilder(self): | |
mockBuilder = mock.Mock() | |
expectedargs = ( | |
DateTuple("1981", None, None, None, None, "095"), | |
TimeTuple( | |
"23", "21", "28.512400", TimezoneTuple(True, None, "12", "34", "-12:34") | |
), | |
) | |
mockBuilder.build_datetime.return_value = expectedargs | |
result = parse_datetime("1981095T23:21:28.512400-12:34", builder=mockBuilder) | |
self.assertEqual(result, expectedargs) | |
mockBuilder.build_datetime.assert_called_once_with(*expectedargs) | |