@@ -50,16 +50,46 @@ def test_duration_parse_str_weeks() -> None:
5050 assert duration .elapsed == 604800 * 1_000_000_000
5151
5252
53+ def test_duration_parse_str_years () -> None :
54+ """Test Duration.parse with string input in years."""
55+ duration = Duration .parse ("2y" )
56+ assert duration .elapsed == 2 * 365 * 86400 * 1_000_000_000
57+
58+
5359def test_duration_parse_str_milliseconds () -> None :
5460 """Test Duration.parse with string input in milliseconds."""
5561 duration = Duration .parse ("500ms" )
5662 assert duration .elapsed == 500 * 1_000_000
5763
5864
5965def test_duration_parse_str_microseconds () -> None :
60- """Test Duration.parse with string input in microseconds."""
61- duration = Duration .parse ("100us" )
62- assert duration .elapsed == 100 * 1_000
66+ """Test Duration.parse with string input in microseconds (both us and µs variants)."""
67+ duration_us = Duration .parse ("100us" )
68+ duration_mu = Duration .parse ("100µs" )
69+
70+ # Both should equal 100 microseconds in nanoseconds
71+ assert duration_us .elapsed == 100 * 1_000
72+ assert duration_mu .elapsed == 100 * 1_000
73+
74+ # Both variants should produce identical results
75+ assert duration_us .elapsed == duration_mu .elapsed
76+
77+
78+ def test_duration_parse_str_compound () -> None :
79+ """Test Duration.parse with comprehensive compound duration including all units."""
80+ duration = Duration .parse ("1y2w3d4h5m6s7ms8us9ns" )
81+ assert (
82+ duration .elapsed
83+ == (1 * 365 * 86400 * 1_000_000_000 )
84+ + (2 * 604800 * 1_000_000_000 )
85+ + (3 * 86400 * 1_000_000_000 )
86+ + (4 * 3600 * 1_000_000_000 )
87+ + (5 * 60 * 1_000_000_000 )
88+ + (6 * 1_000_000_000 )
89+ + (7 * 1_000_000 )
90+ + (8 * 1_000 )
91+ + 9
92+ )
6393
6494
6595def test_duration_parse_str_nanoseconds () -> None :
@@ -70,7 +100,9 @@ def test_duration_parse_str_nanoseconds() -> None:
70100
71101def test_duration_parse_invalid_unit () -> None :
72102 """Test Duration.parse with invalid unit raises ValueError."""
73- with pytest .raises (ValueError , match = "Unknown duration unit: x" ):
103+ # it fails when checking the format, before checking if the unit is valid,
104+ # which is ok.
105+ with pytest .raises (ValueError , match = "Invalid duration format: 10x" ):
74106 Duration .parse ("10x" )
75107
76108
@@ -115,6 +147,7 @@ def test_duration_properties() -> None:
115147 assert duration .hours == total_ns // (3600 * 1_000_000_000 )
116148 assert duration .days == total_ns // (86400 * 1_000_000_000 )
117149 assert duration .weeks == total_ns // (604800 * 1_000_000_000 )
150+ assert duration .years == total_ns // (365 * 86400 * 1_000_000_000 )
118151
119152
120153def test_duration_to_string () -> None :
@@ -128,6 +161,7 @@ def test_duration_to_string() -> None:
128161 assert Duration (3600 * 1_000_000_000 ).to_string () == "1h"
129162 assert Duration (86400 * 1_000_000_000 ).to_string () == "1d"
130163 assert Duration (604800 * 1_000_000_000 ).to_string () == "1w"
164+ assert Duration (365 * 86400 * 1_000_000_000 ).to_string () == "1y"
131165
132166 # Test compound duration (should use largest unit)
133167 compound = Duration (3600 * 1_000_000_000 + 30 * 60 * 1_000_000_000 ) # 1h30m
0 commit comments