@@ -89,36 +89,42 @@ class InstantTest {
89
89
@Test
90
90
fun instantCalendarArithmetic () {
91
91
val zone = TimeZone .of(" Europe/Berlin" )
92
+
93
+ fun expectBetween (instant1 : Instant , instant2 : Instant , expected : Long , unit : DateTimeUnit ) {
94
+ assertEquals(expected, instant1.until(instant2, unit, zone), " i1.until(i2)" )
95
+ assertEquals(expected, - instant2.until(instant1, unit, zone), " i2.until(i1)" )
96
+ assertEquals(expected, instant2.minus(instant1, unit, zone), " i2.minus(i1)" )
97
+ assertEquals(expected, - instant1.minus(instant2, unit, zone), " i1.minus(i2)" )
98
+
99
+ for (timeUnit in listOf (DateTimeUnit .MICROSECOND , DateTimeUnit .MILLISECOND , DateTimeUnit .SECOND , DateTimeUnit .MINUTE , DateTimeUnit .HOUR )) {
100
+ val diff = instant2.minus(instant1, timeUnit, zone)
101
+ assertEquals(instant2 - instant1, timeUnit.duration * diff.toDouble())
102
+ assertEquals(instant2, instant1.plus(diff, timeUnit, zone))
103
+ }
104
+ }
105
+
92
106
val instant1 = LocalDateTime (2019 , 10 , 27 , 2 , 59 , 0 , 0 ).toInstant(zone)
93
107
checkComponents(instant1.toLocalDateTime(zone), 2019 , 10 , 27 , 2 , 59 )
94
108
95
109
val instant2 = instant1.plus(DateTimePeriod (hours = 24 ), zone)
96
110
checkComponents(instant2.toLocalDateTime(zone), 2019 , 10 , 28 , 1 , 59 )
97
- assertEquals(24 .hours, instant2 - instant1)
98
- assertEquals(24 , instant1.until(instant2, DateTimeUnit .HOUR , zone))
99
- assertEquals(24 , instant2.minus(instant1, DateTimeUnit .HOUR , zone))
111
+ expectBetween(instant1, instant2, 24 , DateTimeUnit .HOUR )
100
112
101
113
val instant3 = instant1.plus(DateTimeUnit .DAY , zone)
102
114
checkComponents(instant3.toLocalDateTime(zone), 2019 , 10 , 28 , 2 , 59 )
103
- assertEquals( 25 .hours , instant3 - instant1 )
104
- assertEquals( 1 , instant1.until( instant3, DateTimeUnit .DAY , zone) )
115
+ expectBetween(instant1 , instant3, 25 , DateTimeUnit . HOUR )
116
+ expectBetween(instant1, instant3, 1 , DateTimeUnit .DAY )
105
117
assertEquals(1 , instant1.daysUntil(instant3, zone))
106
- assertEquals(1 , instant3.minus(instant1, DateTimeUnit .DAY , zone))
107
118
108
119
val instant4 = instant1.plus(14 , DateTimeUnit .MONTH , zone)
109
120
checkComponents(instant4.toLocalDateTime(zone), 2020 , 12 , 27 , 2 , 59 )
110
- assertEquals(1 , instant1.until(instant4, DateTimeUnit .YEAR , zone))
111
- assertEquals(4 , instant1.until(instant4, DateTimeUnit .QUARTER , zone))
112
- assertEquals(14 , instant1.until(instant4, DateTimeUnit .MONTH , zone))
113
- assertEquals(61 , instant1.until(instant4, DateTimeUnit .WEEK , zone))
114
- assertEquals(366 + 31 + 30 , instant1.until(instant4, DateTimeUnit .DAY , zone))
115
- assertEquals((366 + 31 + 30 ) * 24 + 1 , instant1.until(instant4, DateTimeUnit .HOUR , zone))
116
-
117
- for (timeUnit in listOf (DateTimeUnit .MICROSECOND , DateTimeUnit .MILLISECOND , DateTimeUnit .SECOND , DateTimeUnit .MINUTE , DateTimeUnit .HOUR )) {
118
- val diff = instant4.minus(instant1, timeUnit, zone)
119
- assertEquals(instant4 - instant1, timeUnit.duration * diff.toDouble())
120
- assertEquals(instant4, instant1.plus(diff, timeUnit, zone))
121
- }
121
+ expectBetween(instant1, instant4, 1 , DateTimeUnit .YEAR )
122
+ expectBetween(instant1, instant4, 4 , DateTimeUnit .QUARTER )
123
+ expectBetween(instant1, instant4, 14 , DateTimeUnit .MONTH )
124
+ expectBetween(instant1, instant4, 61 , DateTimeUnit .WEEK )
125
+ expectBetween(instant1, instant4, 366 + 31 + 30 , DateTimeUnit .DAY )
126
+ expectBetween(instant1, instant4, (366 + 31 + 30 ) * 24 + 1 , DateTimeUnit .HOUR )
127
+
122
128
123
129
val period = DateTimePeriod (days = 1 , hours = 1 )
124
130
val instant5 = instant1.plus(period, zone)
@@ -129,12 +135,20 @@ class InstantTest {
129
135
130
136
val instant6 = instant1.plus(23 , DateTimeUnit .HOUR , zone)
131
137
checkComponents(instant6.toLocalDateTime(zone), 2019 , 10 , 28 , 0 , 59 )
132
- assertEquals(23 .hours, instant6 - instant1)
133
- assertEquals(23 , instant1.until(instant6, DateTimeUnit .HOUR , zone))
134
- assertEquals(23 , instant6.minus(instant1, DateTimeUnit .HOUR , zone))
135
- assertEquals(0 , instant1.until(instant6, DateTimeUnit .DAY , zone))
136
- assertEquals(0 , instant6.until(instant1, DateTimeUnit .DAY , zone))
137
- assertEquals(0 , instant6.minus(instant1, DateTimeUnit .DAY , zone))
138
+ expectBetween(instant1, instant6, 23 , DateTimeUnit .HOUR )
139
+ expectBetween(instant1, instant6, 0 , DateTimeUnit .DAY )
140
+ }
141
+
142
+ @Test
143
+ fun addingMultiplesOf2_32 () {
144
+ val pow2_32 = 1L shl 32
145
+ val instant1 = Instant .fromEpochSeconds(0 )
146
+ val instant2 = instant1.plus(pow2_32, DateTimeUnit .NANOSECOND , TimeZone .UTC )
147
+ assertEquals(pow2_32 / NANOS_PER_ONE , instant2.epochSeconds)
148
+ assertEquals(pow2_32 % NANOS_PER_ONE , instant2.nanosecondsOfSecond.toLong())
149
+
150
+ val instant3 = instant1.plus(pow2_32, DateTimeUnit .SECOND , TimeZone .UTC )
151
+ assertEquals(pow2_32, instant3.epochSeconds)
138
152
}
139
153
140
154
@OptIn(ExperimentalTime ::class )
@@ -156,8 +170,11 @@ class InstantTest {
156
170
val end = start.plus(300 , DateTimeUnit .YEAR , zone)
157
171
val diffNs = start.until(end, unit500ns, zone)
158
172
val diffUs = start.until(end, DateTimeUnit .MICROSECOND , zone)
159
- // TODO: avoid clamping/overflowing in intermediate results
173
+ // TODO: avoid clamping/overflowing in intermediate results in JVM
160
174
// assertEquals(diffUs * 2, diffNs)
175
+
176
+ // assertEquals(end, start.plus(diffNs, unit500ns, zone))
177
+ assertEquals(start, end.plus(- diffUs, DateTimeUnit .MICROSECOND , zone))
161
178
}
162
179
163
180
@OptIn(ExperimentalTime ::class )
0 commit comments