summaryrefslogtreecommitdiffstats
path: root/tests/parsing/test_parse_iso8601.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/parsing/test_parse_iso8601.py')
-rw-r--r--tests/parsing/test_parse_iso8601.py485
1 files changed, 115 insertions, 370 deletions
diff --git a/tests/parsing/test_parse_iso8601.py b/tests/parsing/test_parse_iso8601.py
index 0047791..c15b9bd 100644
--- a/tests/parsing/test_parse_iso8601.py
+++ b/tests/parsing/test_parse_iso8601.py
@@ -8,83 +8,86 @@ import pytest
from pendulum.parsing import parse_iso8601
+
try:
- from pendulum.parsing._extension import TZFixedOffset as FixedTimezone
+ from pendulum._pendulum import FixedTimezone
except ImportError:
from pendulum.tz.timezone import FixedTimezone
-def test_parse_iso8601():
- # Date
- assert date(2016, 1, 1) == parse_iso8601("2016")
- assert date(2016, 10, 1) == parse_iso8601("2016-10")
- assert date(2016, 10, 6) == parse_iso8601("2016-10-06")
- assert date(2016, 10, 6) == parse_iso8601("20161006")
-
- # Time
- assert time(20, 16, 10, 0) == parse_iso8601("201610")
-
- # Datetime
- assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601(
- "2016-10-06T12:34:56.123456"
- )
- assert datetime(2016, 10, 6, 12, 34, 56, 123000) == parse_iso8601(
- "2016-10-06T12:34:56.123"
- )
- assert datetime(2016, 10, 6, 12, 34, 56, 123) == parse_iso8601(
- "2016-10-06T12:34:56.000123"
- )
- assert datetime(2016, 10, 6, 12, 0, 0, 0) == parse_iso8601("2016-10-06T12")
- assert datetime(2016, 10, 6, 12, 34, 56, 0) == parse_iso8601("2016-10-06T123456")
- assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601(
- "2016-10-06T123456.123456"
- )
- assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601(
- "20161006T123456.123456"
- )
- assert datetime(2016, 10, 6, 12, 34, 56, 123456) == parse_iso8601(
- "20161006 123456.123456"
- )
-
- # Datetime with offset
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)
- ) == parse_iso8601("2016-10-06T12:34:56.123456+05:30")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)
- ) == parse_iso8601("2016-10-06T12:34:56.123456+0530")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)
- ) == parse_iso8601("2016-10-06T12:34:56.123456-05:30")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)
- ) == parse_iso8601("2016-10-06T12:34:56.123456-0530")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(18000)
- ) == parse_iso8601("2016-10-06T12:34:56.123456+05")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)
- ) == parse_iso8601("2016-10-06T12:34:56.123456-05")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)
- ) == parse_iso8601("20161006T123456,123456-05")
- assert datetime(
- 2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(+19800)
- ) == parse_iso8601("2016-10-06T12:34:56.123456789+05:30")
-
- # Ordinal date
- assert date(2012, 1, 7) == parse_iso8601("2012-007")
- assert date(2012, 1, 7) == parse_iso8601("2012007")
- assert date(2017, 3, 20) == parse_iso8601("2017-079")
-
- # Week date
- assert date(2012, 1, 30) == parse_iso8601("2012-W05")
- assert date(2008, 9, 27) == parse_iso8601("2008-W39-6")
- assert date(2010, 1, 3) == parse_iso8601("2009-W53-7")
- assert date(2008, 12, 29) == parse_iso8601("2009-W01-1")
-
- # Week date wth time
- assert datetime(2008, 9, 27, 9, 0, 0, 0) == parse_iso8601("2008-W39-6T09")
+@pytest.mark.parametrize(
+ ["text", "expected"],
+ [
+ ("2016-10", date(2016, 10, 1)),
+ ("2016-10-06", date(2016, 10, 6)),
+ # Ordinal date
+ ("2012-007", date(2012, 1, 7)),
+ ("2012007", date(2012, 1, 7)),
+ ("2017-079", date(2017, 3, 20)),
+ # Week date
+ ("2012-W05", date(2012, 1, 30)),
+ ("2008-W39-6", date(2008, 9, 27)),
+ ("2009-W53-7", date(2010, 1, 3)),
+ ("2009-W01-1", date(2008, 12, 29)),
+ # Time
+ ("12:34", time(12, 34, 0)),
+ ("12:34:56", time(12, 34, 56)),
+ ("12:34:56.123", time(12, 34, 56, 123000)),
+ ("12:34:56.123456", time(12, 34, 56, 123456)),
+ ("12:34+05:30", time(12, 34, 0, tzinfo=FixedTimezone(19800))),
+ ("12:34:56+05:30", time(12, 34, 56, tzinfo=FixedTimezone(19800))),
+ ("12:34:56.123+05:30", time(12, 34, 56, 123000, tzinfo=FixedTimezone(19800))),
+ (
+ "12:34:56.123456+05:30",
+ time(12, 34, 56, 123456, tzinfo=FixedTimezone(19800)),
+ ),
+ # Datetime
+ ("2016-10-06T12:34:56.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)),
+ ("2016-10-06T12:34:56.123", datetime(2016, 10, 6, 12, 34, 56, 123000)),
+ ("2016-10-06T12:34:56.000123", datetime(2016, 10, 6, 12, 34, 56, 123)),
+ ("20161006T12", datetime(2016, 10, 6, 12, 0, 0, 0)),
+ ("20161006T123456", datetime(2016, 10, 6, 12, 34, 56, 0)),
+ ("20161006T123456.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)),
+ ("20161006 123456.123456", datetime(2016, 10, 6, 12, 34, 56, 123456)),
+ # Datetime with offset
+ (
+ "2016-10-06T12:34:56.123456+05:30",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456+0530",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(19800)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456-05:30",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456-0530",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-19800)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456+05",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(18000)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456-05",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)),
+ ),
+ (
+ "20161006T123456,123456-05",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(-18000)),
+ ),
+ (
+ "2016-10-06T12:34:56.123456789+05:30",
+ datetime(2016, 10, 6, 12, 34, 56, 123456, FixedTimezone(+19800)),
+ ),
+ # Week date with time
+ ("2008-W39-6T09", datetime(2008, 9, 27, 9, 0, 0, 0)),
+ ],
+)
+def test_parse_iso8601(text: str, expected: date) -> None:
+ assert parse_iso8601(text) == expected
def test_parse_ios8601_invalid():
@@ -165,301 +168,43 @@ def test_parse_ios8601_invalid():
parse_iso8601("2012-W123") # Missing separator
-def test_parse_ios8601_duration():
- text = "P2Y3M4DT5H6M7S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 2
- assert parsed.months == 3
- assert parsed.weeks == 0
- assert parsed.remaining_days == 4
- assert parsed.hours == 5
- assert parsed.minutes == 6
- assert parsed.remaining_seconds == 7
- assert parsed.microseconds == 0
-
- text = "P1Y2M3DT4H5M6.5S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 2
- assert parsed.weeks == 0
- assert parsed.remaining_days == 3
- assert parsed.hours == 4
- assert parsed.minutes == 5
- assert parsed.remaining_seconds == 6
- assert parsed.microseconds == 500000
-
- text = "P1Y2M3DT4H5M6,5S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 2
- assert parsed.weeks == 0
- assert parsed.remaining_days == 3
- assert parsed.hours == 4
- assert parsed.minutes == 5
- assert parsed.remaining_seconds == 6
- assert parsed.microseconds == 500000
-
- text = "P1Y2M3D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 2
- assert parsed.weeks == 0
- assert parsed.remaining_days == 3
- assert parsed.hours == 0
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1Y2M3.5D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 2
- assert parsed.weeks == 0
- assert parsed.remaining_days == 3
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1Y2M3,5D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 2
- assert parsed.weeks == 0
- assert parsed.remaining_days == 3
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "PT4H54M6.5S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 4
- assert parsed.minutes == 54
- assert parsed.remaining_seconds == 6
- assert parsed.microseconds == 500000
-
- text = "PT4H54M6,5S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 4
- assert parsed.minutes == 54
- assert parsed.remaining_seconds == 6
- assert parsed.microseconds == 500000
-
- text = "P1Y"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 1
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 0
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1.5Y"
- with pytest.raises(ValueError):
- parse_iso8601(text)
-
- text = "P1,5Y"
- with pytest.raises(ValueError):
- parse_iso8601(text)
-
- text = "P1M"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 1
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 0
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1.5M"
- with pytest.raises(ValueError):
- parse_iso8601(text)
-
- text = "P1,5M"
- with pytest.raises(ValueError):
- parse_iso8601(text)
-
- text = "P1W"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 1
- assert parsed.remaining_days == 0
- assert parsed.hours == 0
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1.5W"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 1
- assert parsed.remaining_days == 3
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1,5W"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 1
- assert parsed.remaining_days == 3
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 1
- assert parsed.hours == 0
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1.5D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 1
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "P1,5D"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 1
- assert parsed.hours == 12
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "PT1H"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 1
- assert parsed.minutes == 0
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "PT1.5H"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 1
- assert parsed.minutes == 30
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- text = "PT1,5H"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 0
- assert parsed.months == 0
- assert parsed.weeks == 0
- assert parsed.remaining_days == 0
- assert parsed.hours == 1
- assert parsed.minutes == 30
- assert parsed.remaining_seconds == 0
- assert parsed.microseconds == 0
-
- # Double digit with 0
- text = "P2Y30M4DT5H6M7S"
- parsed = parse_iso8601(text)
-
- assert parsed.years == 2
- assert parsed.months == 30
- assert parsed.weeks == 0
- assert parsed.remaining_days == 4
- assert parsed.hours == 5
- assert parsed.minutes == 6
- assert parsed.remaining_seconds == 7
- assert parsed.microseconds == 0
-
- # No P operator
- with pytest.raises(ValueError):
- parse_iso8601("2Y3M4DT5H6M7S")
-
- # Week and other units combined
- with pytest.raises(ValueError):
- parse_iso8601("P1Y2W")
-
- # Invalid units order
- with pytest.raises(ValueError):
- parse_iso8601("P1S")
-
- with pytest.raises(ValueError):
- parse_iso8601("P1D1S")
-
- with pytest.raises(ValueError):
- parse_iso8601("1Y2M3D1SPT1M")
-
- with pytest.raises(ValueError):
- parse_iso8601("P1Y2M3D2MT1S")
-
- with pytest.raises(ValueError):
- parse_iso8601("P2M3D1ST1Y1M")
-
- with pytest.raises(ValueError):
- parse_iso8601("P1Y2M2MT3D1S")
-
- with pytest.raises(ValueError):
- parse_iso8601("P1D1Y1M")
-
- with pytest.raises(ValueError):
- parse_iso8601("PT1S1H")
-
- # Invalid
- with pytest.raises(ValueError):
- parse_iso8601("P1Dasdfasdf")
-
- # Invalid fractional
- with pytest.raises(ValueError):
- parse_iso8601("P2Y3M4DT5.5H6M7S")
+@pytest.mark.parametrize(
+ ["text", "expected"],
+ [
+ ("P2Y3M4DT5H6M7S", (2, 3, 0, 4, 5, 6, 7, 0)),
+ ("P1Y2M3DT4H5M6.5S", (1, 2, 0, 3, 4, 5, 6, 500_000)),
+ ("P1Y2M3DT4H5M6,5S", (1, 2, 0, 3, 4, 5, 6, 500_000)),
+ ("P1Y2M3D", (1, 2, 0, 3, 0, 0, 0, 0)),
+ ("P1Y2M3.5D", (1, 2, 0, 3, 12, 0, 0, 0)),
+ ("P1Y2M3,5D", (1, 2, 0, 3, 12, 0, 0, 0)),
+ ("PT4H54M6.5S", (0, 0, 0, 0, 4, 54, 6, 500_000)),
+ ("PT4H54M6,5S", (0, 0, 0, 0, 4, 54, 6, 500_000)),
+ ("P1Y", (1, 0, 0, 0, 0, 0, 0, 0)),
+ ("P1M", (0, 1, 0, 0, 0, 0, 0, 0)),
+ ("P1W", (0, 0, 1, 0, 0, 0, 0, 0)),
+ ("P1.5W", (0, 0, 1, 3, 12, 0, 0, 0)),
+ ("P1,5W", (0, 0, 1, 3, 12, 0, 0, 0)),
+ ("P1D", (0, 0, 0, 1, 0, 0, 0, 0)),
+ ("P1.5D", (0, 0, 0, 1, 12, 0, 0, 0)),
+ ("P1,5D", (0, 0, 0, 1, 12, 0, 0, 0)),
+ ("PT1H", (0, 0, 0, 0, 1, 0, 0, 0)),
+ ("PT1.5H", (0, 0, 0, 0, 1, 30, 0, 0)),
+ ("PT1,5H", (0, 0, 0, 0, 1, 30, 0, 0)),
+ ("P2Y30M4DT5H6M7S", (2, 30, 0, 4, 5, 6, 7, 0)),
+ ],
+)
+def test_parse_ios8601_duration(
+ text: str, expected: tuple[int, int, int, int, int, int, int, int]
+) -> None:
+ parsed = parse_iso8601(text)
+
+ assert (
+ parsed.years,
+ parsed.months,
+ parsed.weeks,
+ parsed.remaining_days,
+ parsed.hours,
+ parsed.minutes,
+ parsed.remaining_seconds,
+ parsed.microseconds,
+ ) == expected