Saturate overflowing values when adjusting time marks
KT-46132
This commit is contained in:
@@ -59,6 +59,53 @@ class TimeMarkTest {
|
||||
|
||||
}
|
||||
|
||||
fun testAdjustmentInfinite(timeSource: TimeSource) {
|
||||
val baseMark = timeSource.markNow()
|
||||
val infiniteFutureMark = baseMark + Duration.INFINITE
|
||||
val infinitePastMark = baseMark - Duration.INFINITE
|
||||
|
||||
assertEquals(-Duration.INFINITE, infiniteFutureMark.elapsedNow())
|
||||
assertTrue(infiniteFutureMark.hasNotPassedNow())
|
||||
|
||||
assertEquals(Duration.INFINITE, infinitePastMark.elapsedNow())
|
||||
assertTrue(infinitePastMark.hasPassedNow())
|
||||
|
||||
assertFailsWith<IllegalArgumentException> { infiniteFutureMark - Duration.INFINITE }
|
||||
assertFailsWith<IllegalArgumentException> { infinitePastMark + Duration.INFINITE }
|
||||
|
||||
|
||||
val longDuration = Long.MAX_VALUE.nanoseconds
|
||||
val long2Duration = longDuration * 2
|
||||
|
||||
val pastMark = baseMark - longDuration
|
||||
val futureMark = pastMark + long2Duration
|
||||
val sameMark = futureMark - longDuration
|
||||
val elapsedDiff = sameMark.elapsedNow() - baseMark.elapsedNow()
|
||||
assertTrue(elapsedDiff < 1.milliseconds, "$elapsedDiff")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun adjustmentInfinite() {
|
||||
testAdjustmentInfinite(TestTimeSource())
|
||||
}
|
||||
|
||||
fun testLongDisplacement(timeSource: TimeSource, wait: (Duration) -> Unit) {
|
||||
val baseMark = timeSource.markNow()
|
||||
val longDuration = Long.MAX_VALUE.nanoseconds
|
||||
val waitDuration = 10.milliseconds
|
||||
val pastMark = baseMark - longDuration
|
||||
wait(waitDuration)
|
||||
val elapsed = pastMark.elapsedNow()
|
||||
assertTrue(elapsed > longDuration)
|
||||
assertTrue(elapsed >= longDuration + waitDuration)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun longDisplacement() {
|
||||
val timeSource = TestTimeSource()
|
||||
testLongDisplacement(timeSource, { waitDuration -> timeSource += waitDuration })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun defaultTimeMarkAdjustment() {
|
||||
val baseMark = TimeSource.Monotonic.markNow()
|
||||
@@ -77,4 +124,32 @@ class TimeMarkTest {
|
||||
assertTrue(elapsedBefore >= elapsedBase + 200.microseconds)
|
||||
assertTrue(elapsedAfter <= elapsedBase - 100.microseconds)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun defaultTimeMarkAdjustmentInfinite() {
|
||||
testAdjustmentInfinite(TimeSource.Monotonic)
|
||||
|
||||
// do the same with specialized methods
|
||||
val baseMark = TimeSource.Monotonic.markNow()
|
||||
val infiniteFutureMark = baseMark + Duration.INFINITE
|
||||
val infinitePastMark = baseMark - Duration.INFINITE
|
||||
|
||||
assertEquals(-Duration.INFINITE, infiniteFutureMark.elapsedNow())
|
||||
assertTrue(infiniteFutureMark.hasNotPassedNow())
|
||||
|
||||
assertEquals(Duration.INFINITE, infinitePastMark.elapsedNow())
|
||||
assertTrue(infinitePastMark.hasPassedNow())
|
||||
|
||||
assertFailsWith<IllegalArgumentException> { infiniteFutureMark - Duration.INFINITE }
|
||||
assertFailsWith<IllegalArgumentException> { infinitePastMark + Duration.INFINITE }
|
||||
|
||||
val longDuration = Long.MAX_VALUE.nanoseconds
|
||||
val long2Duration = longDuration * 2
|
||||
|
||||
val pastMark = baseMark - longDuration
|
||||
val futureMark = pastMark + long2Duration
|
||||
val sameMark = futureMark - longDuration
|
||||
val elapsedDiff = sameMark.elapsedNow() - baseMark.elapsedNow()
|
||||
assertTrue(elapsedDiff < 1.milliseconds, "$elapsedDiff")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user