@@ -12,12 +12,45 @@ import kotlin.time.*
12
12
13
13
class DateTimePeriodTest {
14
14
15
+ @Test
16
+ fun normalization () {
17
+ assertPeriodComponents(DateTimePeriod (years = 1 ) as DatePeriod , years = 1 )
18
+ assertPeriodComponents(DateTimePeriod (years = 1 , months = 1 ) as DatePeriod , years = 1 , months = 1 )
19
+ assertPeriodComponents(DateTimePeriod (years = 1 , months = - 1 ) as DatePeriod , months = 11 )
20
+ assertPeriodComponents(DateTimePeriod (years = - 1 , months = 1 ) as DatePeriod , months = - 11 )
21
+ assertPeriodComponents(DateTimePeriod (years = - 1 , months = - 1 ) as DatePeriod , years = - 1 , months = - 1 )
22
+ assertPeriodComponents(DateTimePeriod (months = 11 ) as DatePeriod , months = 11 )
23
+ assertPeriodComponents(DateTimePeriod (months = 14 ) as DatePeriod , years = 1 , months = 2 )
24
+ assertPeriodComponents(DateTimePeriod (months = - 14 ) as DatePeriod , years = - 1 , months = - 2 )
25
+ assertPeriodComponents(DateTimePeriod (months = 10 , days = 5 ) as DatePeriod , months = 10 , days = 5 )
26
+ assertPeriodComponents(DateTimePeriod (years = 1 , days = 40 ) as DatePeriod , years = 1 , days = 40 )
27
+ assertPeriodComponents(DateTimePeriod (years = 1 , days = - 40 ) as DatePeriod , years = 1 , days = - 40 )
28
+ assertPeriodComponents(DateTimePeriod (days = 5 ) as DatePeriod , days = 5 )
29
+
30
+ assertPeriodComponents(DateTimePeriod (hours = 3 ), hours = 3 )
31
+ assertPeriodComponents(DateTimePeriod (hours = 1 , minutes = 120 ), hours = 3 )
32
+ assertPeriodComponents(DateTimePeriod (hours = 1 , minutes = 119 , seconds = 60 ), hours = 3 )
33
+ assertPeriodComponents(DateTimePeriod (hours = 1 , minutes = 119 , seconds = 59 , nanoseconds = 1_000_000_000 ), hours = 3 )
34
+ assertPeriodComponents(DateTimePeriod (hours = 1 , minutes = 121 , seconds = - 59 , nanoseconds = - 1_000_000_000 ), hours = 3 )
35
+ assertPeriodComponents(DateTimePeriod ())
36
+ assertPeriodComponents(DatePeriod ())
37
+
38
+ assertPeriodComponents(DateTimePeriod (days = 1 , hours = - 1 ), days = 1 , hours = - 1 )
39
+ assertPeriodComponents(DateTimePeriod (days = - 1 , hours = - 1 ), days = - 1 , hours = - 1 )
40
+
41
+ assertPeriodComponents(DateTimePeriod (years = - 1 , months = - 2 , days = - 3 , hours = - 4 , minutes = - 5 , seconds = 0 , nanoseconds = 500_000_000 ),
42
+ years = - 1 , months = - 2 , days = - 3 , hours = - 4 , minutes = - 4 , seconds = - 59 , nanoseconds = - 500_000_000 )
43
+
44
+ assertPeriodComponents(DateTimePeriod (nanoseconds = 999_999_999_999_999L ), hours = 277 , minutes = 46 , seconds = 39 , nanoseconds = 999_999_999 )
45
+ assertPeriodComponents(DateTimePeriod (nanoseconds = - 999_999_999_999_999L ), hours = - 277 , minutes = - 46 , seconds = - 39 , nanoseconds = - 999_999_999 )
46
+ }
47
+
15
48
@Test
16
49
fun toStringConversion () {
17
50
assertEquals(" P1Y" , DateTimePeriod (years = 1 ).toString())
18
51
assertEquals(" P1Y1M" , DatePeriod (years = 1 , months = 1 ).toString())
19
52
assertEquals(" P11M" , DateTimePeriod (months = 11 ).toString())
20
- assertEquals(" P14M " , DateTimePeriod (months = 14 ).toString()) // TODO: normalize or not
53
+ assertEquals(" P1Y2M " , DateTimePeriod (months = 14 ).toString())
21
54
assertEquals(" P10M5D" , DateTimePeriod (months = 10 , days = 5 ).toString())
22
55
assertEquals(" P1Y40D" , DateTimePeriod (years = 1 , days = 40 ).toString())
23
56
@@ -29,8 +62,74 @@ class DateTimePeriodTest {
29
62
assertEquals(" -P1DT1H" , DateTimePeriod (days = - 1 , hours = - 1 ).toString())
30
63
assertEquals(" -P1M" , DateTimePeriod (months = - 1 ).toString())
31
64
32
- assertEquals(" P-1Y-2M-3DT-4H-5M0 .500000000S" ,
65
+ assertEquals(" -P1Y2M3DT4H4M59 .500000000S" ,
33
66
DateTimePeriod (years = - 1 , months = - 2 , days = - 3 , hours = - 4 , minutes = - 5 , seconds = 0 , nanoseconds = 500_000_000 ).toString())
67
+
68
+ assertEquals(" PT277H46M39.999999999S" , DateTimePeriod (nanoseconds = 999_999_999_999_999L ).toString())
69
+ assertEquals(" PT0.999999999S" , DateTimePeriod (seconds = 1 , nanoseconds = - 1L ).toString())
70
+ assertEquals(" -PT0.000000001S" , DateTimePeriod (nanoseconds = - 1L ).toString())
71
+ assertEquals(" P1DT-0.000000001S" , DateTimePeriod (days = 1 , nanoseconds = - 1L ).toString())
72
+ assertEquals(" -PT0.999999999S" , DateTimePeriod (seconds = - 1 , nanoseconds = 1L ).toString())
73
+ assertEquals(" P1DT-0.999999999S" , DateTimePeriod (days = 1 , seconds = - 1 , nanoseconds = 1L ).toString())
74
+ }
75
+
76
+ @Test
77
+ fun parseIsoString () {
78
+ assertEquals(DateTimePeriod (years = 1 ), DateTimePeriod .parse(" P1Y" ))
79
+ assertEquals(DatePeriod (years = 1 , months = 1 ), DateTimePeriod .parse(" P1Y1M" ))
80
+ assertEquals(DateTimePeriod (months = 11 ), DateTimePeriod .parse(" P11M" ))
81
+ assertEquals(DateTimePeriod (months = 10 , days = 5 ), DateTimePeriod .parse(" P10M5D" ))
82
+ assertEquals(DateTimePeriod (years = 1 , days = 40 ), DateTimePeriod .parse(" P1Y40D" ))
83
+
84
+ assertEquals(DateTimePeriod (months = 14 ), DateTimePeriod .parse(" P14M" ))
85
+ assertPeriodComponents(DateTimePeriod .parse(" P14M" ) as DatePeriod , years = 1 , months = 2 )
86
+
87
+ assertEquals(DateTimePeriod (hours = 1 ), DateTimePeriod .parse(" PT1H" ))
88
+ assertEquals(DateTimePeriod (), DateTimePeriod .parse(" P0D" ))
89
+ assertEquals(DatePeriod (), DateTimePeriod .parse(" P0D" ))
90
+
91
+ assertEquals(DateTimePeriod (days = 1 , hours = - 1 ), DateTimePeriod .parse(" P1DT-1H" ))
92
+ assertEquals(DateTimePeriod (days = - 1 , hours = - 1 ), DateTimePeriod .parse(" -P1DT1H" ))
93
+ assertEquals(DateTimePeriod (months = - 1 ), DateTimePeriod .parse(" -P1M" ))
94
+
95
+ assertEquals(DateTimePeriod (years = - 1 , months = - 2 , days = - 3 , hours = - 4 , minutes = - 5 , seconds = 0 , nanoseconds = 500_000_000 ),
96
+ DateTimePeriod .parse(" P-1Y-2M-3DT-4H-5M0.500000000S" ))
97
+ assertPeriodComponents(DateTimePeriod .parse(" P-1Y-2M-3DT-4H-5M0.500000000S" ),
98
+ years = - 1 , months = - 2 , days = - 3 , hours = - 4 , minutes = - 4 , seconds = - 59 , nanoseconds = - 500_000_000 )
99
+
100
+ assertEquals(DateTimePeriod (nanoseconds = 999_999_999_999_999L ), DateTimePeriod .parse(" PT277H46M39.999999999S" ))
101
+ assertPeriodComponents(DateTimePeriod .parse(" PT277H46M39.999999999S" ),
102
+ hours = 277 , minutes = 46 , seconds = 39 , nanoseconds = 999_999_999 )
103
+
104
+ assertEquals(DateTimePeriod (nanoseconds = 999_999_999 ), DateTimePeriod .parse(" PT0.999999999S" ))
105
+ assertEquals(DateTimePeriod (nanoseconds = - 1 ), DateTimePeriod .parse(" -PT0.000000001S" ))
106
+ assertEquals(DateTimePeriod (days = 1 , nanoseconds = - 1 ), DateTimePeriod .parse(" P1DT-0.000000001S" ))
107
+ assertEquals(DateTimePeriod (nanoseconds = - 999_999_999 ), DateTimePeriod .parse(" -PT0.999999999S" ))
108
+ assertEquals(DateTimePeriod (days = 1 , nanoseconds = - 999_999_999 ), DateTimePeriod .parse(" P1DT-0.999999999S" ))
109
+ assertPeriodComponents(DateTimePeriod .parse(" P1DT-0.999999999S" ), days = 1 , nanoseconds = - 999_999_999 )
110
+
111
+ // overflow of `Int.MAX_VALUE` months
112
+ assertFailsWith<IllegalArgumentException > { DateTimePeriod .parse(" P2000000000Y" ) }
113
+ assertFailsWith<IllegalArgumentException > { DateTimePeriod .parse(" P1Y2147483640M" ) }
114
+
115
+ // too large a number in a field
116
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000Y" ) }
117
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000M" ) }
118
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000D" ) }
119
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000H" ) }
120
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000M" ) }
121
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P3000000000S" ) }
122
+
123
+ // wrong order of signifiers
124
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P1Y2D3M" ) }
125
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P0DT1M2H" ) }
126
+
127
+ // loss of precision in fractional seconds
128
+ assertFailsWith<DateTimeFormatException > { DateTimePeriod .parse(" P0.000000000001S" ) }
129
+
130
+ // non-zero time components when parsing DatePeriod
131
+ assertFailsWith<IllegalArgumentException > { DatePeriod .parse(" P1DT1H" ) }
132
+ DatePeriod .parse(" P1DT0H" )
34
133
}
35
134
36
135
@Test
@@ -69,4 +168,16 @@ class DateTimePeriodTest {
69
168
assertEquals(period, duration.toDateTimePeriod())
70
169
}
71
170
}
72
- }
171
+
172
+ private fun assertPeriodComponents (period : DateTimePeriod ,
173
+ years : Int = 0, months : Int = 0, days : Int = 0,
174
+ hours : Int = 0, minutes : Int = 0, seconds : Int = 0, nanoseconds : Int = 0) {
175
+ assertEquals(years, period.years)
176
+ assertEquals(months, period.months)
177
+ assertEquals(days, period.days)
178
+ assertEquals(hours, period.hours)
179
+ assertEquals(minutes, period.minutes)
180
+ assertEquals(seconds, period.seconds)
181
+ assertEquals(nanoseconds, period.nanoseconds)
182
+ }
183
+ }
0 commit comments