summaryrefslogtreecommitdiffstats
path: root/tests/parsing/test_parsing_duration.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/parsing/test_parsing_duration.py')
-rw-r--r--tests/parsing/test_parsing_duration.py298
1 files changed, 298 insertions, 0 deletions
diff --git a/tests/parsing/test_parsing_duration.py b/tests/parsing/test_parsing_duration.py
new file mode 100644
index 0000000..ab8b992
--- /dev/null
+++ b/tests/parsing/test_parsing_duration.py
@@ -0,0 +1,298 @@
+from __future__ import annotations
+
+import pytest
+
+from pendulum.parsing import ParserError
+from pendulum.parsing import parse
+
+
+def test_parse_duration():
+ text = "P2Y3M4DT5H6M7S"
+ parsed = parse(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(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(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(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(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(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(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(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(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(ParserError):
+ parse(text)
+
+ text = "P1,5Y"
+ with pytest.raises(ParserError):
+ parse(text)
+
+ text = "P1M"
+ parsed = parse(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(ParserError):
+ parse(text)
+
+ text = "P1,5M"
+ with pytest.raises(ParserError):
+ parse(text)
+
+ text = "P1W"
+ parsed = parse(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(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(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(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(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(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(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(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(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
+
+
+def test_parse_duration_no_operator():
+ with pytest.raises(ParserError):
+ parse("2Y3M4DT5H6M7S")
+
+
+def test_parse_duration_weeks_combined():
+ with pytest.raises(ParserError):
+ parse("P1Y2W")
+
+
+def test_parse_duration_invalid_order():
+ with pytest.raises(ParserError):
+ parse("P1S")
+
+ with pytest.raises(ParserError):
+ parse("P1D1S")
+
+ with pytest.raises(ParserError):
+ parse("1Y2M3D1SPT1M")
+
+ with pytest.raises(ParserError):
+ parse("P1Y2M3D2MT1S")
+
+ with pytest.raises(ParserError):
+ parse("P2M3D1ST1Y1M")
+
+ with pytest.raises(ParserError):
+ parse("P1Y2M2MT3D1S")
+
+ with pytest.raises(ParserError):
+ parse("P1D1Y1M")
+
+ with pytest.raises(ParserError):
+ parse("PT1S1H")
+
+
+def test_parse_duration_invalid():
+ with pytest.raises(ParserError):
+ parse("P1Dasdfasdf")
+
+
+def test_parse_duration_fraction_only_allowed_on_last_component():
+ with pytest.raises(ParserError):
+ parse("P2Y3M4DT5.5H6M7S")