Skip to content

Commit 4167c60

Browse files
committed
Cover more functions in Instant arithmetic test
1 parent e45e73f commit 4167c60

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

core/commonTest/src/InstantTest.kt

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -89,36 +89,42 @@ class InstantTest {
8989
@Test
9090
fun instantCalendarArithmetic() {
9191
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+
92106
val instant1 = LocalDateTime(2019, 10, 27, 2, 59, 0, 0).toInstant(zone)
93107
checkComponents(instant1.toLocalDateTime(zone), 2019, 10, 27, 2, 59)
94108

95109
val instant2 = instant1.plus(DateTimePeriod(hours = 24), zone)
96110
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)
100112

101113
val instant3 = instant1.plus(DateTimeUnit.DAY, zone)
102114
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)
105117
assertEquals(1, instant1.daysUntil(instant3, zone))
106-
assertEquals(1, instant3.minus(instant1, DateTimeUnit.DAY, zone))
107118

108119
val instant4 = instant1.plus(14, DateTimeUnit.MONTH, zone)
109120
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+
122128

123129
val period = DateTimePeriod(days = 1, hours = 1)
124130
val instant5 = instant1.plus(period, zone)
@@ -129,12 +135,20 @@ class InstantTest {
129135

130136
val instant6 = instant1.plus(23, DateTimeUnit.HOUR, zone)
131137
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)
138152
}
139153

140154
@OptIn(ExperimentalTime::class)
@@ -156,8 +170,11 @@ class InstantTest {
156170
val end = start.plus(300, DateTimeUnit.YEAR, zone)
157171
val diffNs = start.until(end, unit500ns, zone)
158172
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
160174
// assertEquals(diffUs * 2, diffNs)
175+
176+
// assertEquals(end, start.plus(diffNs, unit500ns, zone))
177+
assertEquals(start, end.plus(-diffUs, DateTimeUnit.MICROSECOND, zone))
161178
}
162179

163180
@OptIn(ExperimentalTime::class)

0 commit comments

Comments
 (0)