From a7fda66fa1b8a5a89f0b609f833b78a1db389a44 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 12 Feb 2021 04:22:43 +0300 Subject: [PATCH] Suggest duration static factories instead of number extension properties Introduce Duration companion functions to convert numbers to Duration. Deprecate number extension properties and propose to use these new functions instead. --- libraries/stdlib/api/js-v1/kotlin.time.kt | 84 ++++++ libraries/stdlib/api/js/kotlin.time.kt | 84 ++++++ .../src/kotlin/time/DurationConversions.kt | 4 +- .../jdk8/test/time/DurationConversionTest.kt | 12 +- .../js/src/kotlin/time/MonoTimeSource.kt | 4 +- .../samples/test/samples/time/durations.kt | 34 +-- libraries/stdlib/src/kotlin/time/Duration.kt | 142 ++++++++- libraries/stdlib/test/time/DurationTest.kt | 273 +++++++++--------- libraries/stdlib/test/time/MeasureTimeTest.kt | 10 +- .../stdlib/test/time/TestTimeSourceTest.kt | 20 +- libraries/stdlib/test/time/TimeMarkTest.kt | 26 +- .../kotlin-stdlib-runtime-merged.txt | 21 ++ 12 files changed, 523 insertions(+), 191 deletions(-) diff --git a/libraries/stdlib/api/js-v1/kotlin.time.kt b/libraries/stdlib/api/js-v1/kotlin.time.kt index b195dcadf61..7dd56c1ad8a 100644 --- a/libraries/stdlib/api/js-v1/kotlin.time.kt +++ b/libraries/stdlib/api/js-v1/kotlin.time.kt @@ -1,85 +1,106 @@ @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @@ -236,6 +257,69 @@ public final inline class Duration : kotlin.Comparable { public final val ZERO: kotlin.time.Duration { get; } public final fun convert(value: kotlin.Double, sourceUnit: kotlin.time.DurationUnit, targetUnit: kotlin.time.DurationUnit): kotlin.Double + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Long): kotlin.time.Duration } } diff --git a/libraries/stdlib/api/js/kotlin.time.kt b/libraries/stdlib/api/js/kotlin.time.kt index b195dcadf61..7dd56c1ad8a 100644 --- a/libraries/stdlib/api/js/kotlin.time.kt +++ b/libraries/stdlib/api/js/kotlin.time.kt @@ -1,85 +1,106 @@ @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.days() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.days(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.days: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.hours() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.hours(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.hours: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.microseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.microseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.microseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.milliseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.milliseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.milliseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.minutes() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.minutes(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.minutes: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.nanoseconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.nanoseconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.nanoseconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Double.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Int.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @kotlin.time.ExperimentalTime +@kotlin.Deprecated(message = "Use Duration.seconds() function instead.", replaceWith = kotlin.ReplaceWith(expression = "Duration.seconds(this)", imports = {"kotlin.time.Duration"})) public val kotlin.Long.seconds: kotlin.time.Duration { get; } @kotlin.SinceKotlin(version = "1.3") @@ -236,6 +257,69 @@ public final inline class Duration : kotlin.Comparable { public final val ZERO: kotlin.time.Duration { get; } public final fun convert(value: kotlin.Double, sourceUnit: kotlin.time.DurationUnit, targetUnit: kotlin.time.DurationUnit): kotlin.Double + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun days(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun hours(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun microseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun milliseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun minutes(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun nanoseconds(value: kotlin.Long): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Double): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Int): kotlin.time.Duration + + @kotlin.SinceKotlin(version = "1.5") + public final fun seconds(value: kotlin.Long): kotlin.time.Duration } } diff --git a/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt b/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt index 3f565b7a136..74e203152c0 100644 --- a/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt +++ b/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -20,7 +20,7 @@ import java.time.* @ExperimentalTime @kotlin.internal.InlineOnly public inline fun java.time.Duration.toKotlinDuration(): Duration = - this.seconds.seconds + this.nano.nanoseconds + Duration.seconds(this.seconds) + Duration.nanoseconds(this.nano) /** diff --git a/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt b/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt index b7964f878ec..04b9f7355fd 100644 --- a/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt +++ b/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -15,7 +15,9 @@ class DurationConversionTest { @Test fun twoWayConversion() { fun test(days: Int, hours: Int, minutes: Int, seconds: Int, millis: Int, nanos: Int) { - val duration = days.days + hours.hours + minutes.minutes + seconds.seconds + millis.milliseconds + nanos.nanoseconds + val duration = with(Duration) { + days(days) + hours(hours) + minutes(minutes) + seconds(seconds) + milliseconds(millis) + nanoseconds(nanos) + } val jtDuration = JTDuration.ZERO .plusDays(days.toLong()) .plusHours(hours.toLong()) @@ -44,12 +46,12 @@ class DurationConversionTest { fun javaToKotlinRounding() { val jtDuration = JTDuration.ofDays(105).plusNanos(1) val duration = jtDuration.toKotlinDuration() - assertEquals(105.days, duration) + assertEquals(Duration.days(105), duration) } @Test fun kotlinToJavaClamping() { - val duration = Long.MAX_VALUE.seconds * 5 + val duration = Duration.seconds(Long.MAX_VALUE) * 5 val jtDuration = duration.toJavaDuration() assertEquals(JTDuration.ofSeconds(Long.MAX_VALUE), jtDuration) @@ -60,7 +62,7 @@ class DurationConversionTest { @Test fun randomIsoConversionEquivalence() { repeat(100) { - val duration = Random.nextLong(-(1 shl 53) + 1, 1 shl 53).nanoseconds + val duration = Duration.nanoseconds(Random.nextLong(-(1 shl 53) + 1, 1 shl 53)) val fromString = JTDuration.parse(duration.toIsoString()) val fromDuration = duration.toJavaDuration() diff --git a/libraries/stdlib/js/src/kotlin/time/MonoTimeSource.kt b/libraries/stdlib/js/src/kotlin/time/MonoTimeSource.kt index 71fb0d61ce5..0a279faae9c 100644 --- a/libraries/stdlib/js/src/kotlin/time/MonoTimeSource.kt +++ b/libraries/stdlib/js/src/kotlin/time/MonoTimeSource.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -37,7 +37,7 @@ internal class HrTimeSource(val process: Process) : TimeSource { override fun markNow(): TimeMark = object : TimeMark() { val startedAt = process.hrtime() override fun elapsedNow(): Duration = - process.hrtime(startedAt).let { (seconds, nanos) -> seconds.seconds + nanos.nanoseconds } + process.hrtime(startedAt).let { (seconds, nanos) -> Duration.seconds(seconds) + Duration.nanoseconds(nanos) } } override fun toString(): String = "TimeSource(process.hrtime())" diff --git a/libraries/stdlib/samples/test/samples/time/durations.kt b/libraries/stdlib/samples/test/samples/time/durations.kt index e78ec8f4ce2..26794728a37 100644 --- a/libraries/stdlib/samples/test/samples/time/durations.kt +++ b/libraries/stdlib/samples/test/samples/time/durations.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,32 +13,32 @@ class Durations { @Sample fun toIsoString() { - assertPrints(25.nanoseconds.toIsoString(), "PT0.000000025S") - assertPrints(120.3.milliseconds.toIsoString(), "PT0.120300S") - assertPrints(30.5.seconds.toIsoString(), "PT30.500S") - assertPrints(30.5.minutes.toIsoString(), "PT30M30S") - assertPrints(86420.seconds.toIsoString(), "PT24H0M20S") - assertPrints(2.days.toIsoString(), "PT48H") + assertPrints(Duration.nanoseconds(25).toIsoString(), "PT0.000000025S") + assertPrints(Duration.milliseconds(120.3).toIsoString(), "PT0.120300S") + assertPrints(Duration.seconds(30.5).toIsoString(), "PT30.500S") + assertPrints(Duration.minutes(30.5).toIsoString(), "PT30M30S") + assertPrints(Duration.seconds(86420).toIsoString(), "PT24H0M20S") + assertPrints(Duration.days(2).toIsoString(), "PT48H") assertPrints(Duration.ZERO.toIsoString(), "PT0S") assertPrints(Duration.INFINITE.toIsoString(), "PT2147483647H") } @Sample fun toStringDefault() { - assertPrints(45.days, "45.0d") - assertPrints(1.5.days, "36.0h") - assertPrints(1230.minutes, "20.5h") - assertPrints(920.minutes, "920m") - assertPrints(1.546.seconds, "1.55s") - assertPrints(25.12.milliseconds, "25.1ms") + assertPrints(Duration.days(45), "45.0d") + assertPrints(Duration.days(1.5), "36.0h") + assertPrints(Duration.minutes(1230), "20.5h") + assertPrints(Duration.minutes(920), "920m") + assertPrints(Duration.seconds(1.546), "1.55s") + assertPrints(Duration.milliseconds(25.12), "25.1ms") } @Sample fun toStringDecimals() { - assertPrints(1230.minutes.toString(DurationUnit.DAYS, 2), "0.85d") - assertPrints(1230.minutes.toString(DurationUnit.HOURS, 2), "20.50h") - assertPrints(1230.minutes.toString(DurationUnit.MINUTES), "1230m") - assertPrints(1230.minutes.toString(DurationUnit.SECONDS), "73800s") + assertPrints(Duration.minutes(1230).toString(DurationUnit.DAYS, 2), "0.85d") + assertPrints(Duration.minutes(1230).toString(DurationUnit.HOURS, 2), "20.50h") + assertPrints(Duration.minutes(1230).toString(DurationUnit.MINUTES), "1230m") + assertPrints(Duration.minutes(1230).toString(DurationUnit.SECONDS), "73800s") } diff --git a/libraries/stdlib/src/kotlin/time/Duration.kt b/libraries/stdlib/src/kotlin/time/Duration.kt index 604e3681bcc..533beb37b5b 100644 --- a/libraries/stdlib/src/kotlin/time/Duration.kt +++ b/libraries/stdlib/src/kotlin/time/Duration.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -18,9 +18,9 @@ private inline val storageUnit get() = DurationUnit.NANOSECONDS * A negative duration is possible in a situation when the second instant is earlier than the first one. * An infinite duration value [Duration.INFINITE] can be used to represent infinite timeouts. * - * To construct a duration use either the extension function [toDuration], - * or the extension properties [hours], [minutes], [seconds], and so on, - * available on [Int], [Long], and [Double] numeric types. + * To construct a duration use either the extension function [toDuration] available on [Int], [Long], and [Double] numeric types, + * or the `Duration` companion object functions [Duration.hours], [Duration.minutes], [Duration.seconds], and so on, + * taking [Int], [Long], or [Double] numbers as parameters. * * To get the value of this duration expressed in a particular [duration units][DurationUnit] * use the functions [toInt], [toLong], and [toDouble] @@ -44,6 +44,119 @@ public value class Duration internal constructor(internal val value: Double) : C /** Converts the given time duration [value] expressed in the specified [sourceUnit] into the specified [targetUnit]. */ public fun convert(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double = convertDurationUnit(value, sourceUnit, targetUnit) + + /** Returns a [Duration] representing the specified [value] number of nanoseconds. */ + @SinceKotlin("1.5") + public fun nanoseconds(value: Int): Duration = value.toDuration(DurationUnit.NANOSECONDS) + + /** Returns a [Duration] representing the specified [value] number of nanoseconds. */ + @SinceKotlin("1.5") + public fun nanoseconds(value: Long): Duration = value.toDuration(DurationUnit.NANOSECONDS) + + /** + * Returns a [Duration] representing the specified [value] number of nanoseconds. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun nanoseconds(value: Double): Duration = value.toDuration(DurationUnit.NANOSECONDS) + + /** Returns a [Duration] representing the specified [value] number of microseconds. */ + @SinceKotlin("1.5") + public fun microseconds(value: Int): Duration = value.toDuration(DurationUnit.MICROSECONDS) + + /** Returns a [Duration] representing the specified [value] number of microseconds. */ + @SinceKotlin("1.5") + public fun microseconds(value: Long): Duration = value.toDuration(DurationUnit.MICROSECONDS) + + /** + * Returns a [Duration] representing the specified [value] number of microseconds. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun microseconds(value: Double): Duration = value.toDuration(DurationUnit.MICROSECONDS) + + /** Returns a [Duration] representing the specified [value] number of milliseconds. */ + @SinceKotlin("1.5") + public fun milliseconds(value: Int): Duration = value.toDuration(DurationUnit.MILLISECONDS) + + /** Returns a [Duration] representing the specified [value] number of milliseconds. */ + @SinceKotlin("1.5") + public fun milliseconds(value: Long): Duration = value.toDuration(DurationUnit.MILLISECONDS) + + /** + * Returns a [Duration] representing the specified [value] number of milliseconds. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun milliseconds(value: Double): Duration = value.toDuration(DurationUnit.MILLISECONDS) + + /** Returns a [Duration] representing the specified [value] number of seconds. */ + @SinceKotlin("1.5") + public fun seconds(value: Int): Duration = value.toDuration(DurationUnit.SECONDS) + + /** Returns a [Duration] representing the specified [value] number of seconds. */ + @SinceKotlin("1.5") + public fun seconds(value: Long): Duration = value.toDuration(DurationUnit.SECONDS) + + /** + * Returns a [Duration] representing the specified [value] number of seconds. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun seconds(value: Double): Duration = value.toDuration(DurationUnit.SECONDS) + + /** Returns a [Duration] representing the specified [value] number of minutes. */ + @SinceKotlin("1.5") + public fun minutes(value: Int): Duration = value.toDuration(DurationUnit.MINUTES) + + /** Returns a [Duration] representing the specified [value] number of minutes. */ + @SinceKotlin("1.5") + public fun minutes(value: Long): Duration = value.toDuration(DurationUnit.MINUTES) + + /** + * Returns a [Duration] representing the specified [value] number of minutes. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun minutes(value: Double): Duration = value.toDuration(DurationUnit.MINUTES) + + /** Returns a [Duration] representing the specified [value] number of hours. */ + @SinceKotlin("1.5") + public fun hours(value: Int): Duration = value.toDuration(DurationUnit.HOURS) + + /** Returns a [Duration] representing the specified [value] number of hours. */ + @SinceKotlin("1.5") + public fun hours(value: Long): Duration = value.toDuration(DurationUnit.HOURS) + + /** + * Returns a [Duration] representing the specified [value] number of hours. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun hours(value: Double): Duration = value.toDuration(DurationUnit.HOURS) + + /** Returns a [Duration] representing the specified [value] number of days. */ + @SinceKotlin("1.5") + public fun days(value: Int): Duration = value.toDuration(DurationUnit.DAYS) + + /** Returns a [Duration] representing the specified [value] number of days. */ + @SinceKotlin("1.5") + public fun days(value: Long): Duration = value.toDuration(DurationUnit.DAYS) + + /** + * Returns a [Duration] representing the specified [value] number of days. + * + * @throws IllegalArgumentException if the provided `Double` [value] is `NaN`. + */ + @SinceKotlin("1.5") + public fun days(value: Double): Duration = value.toDuration(DurationUnit.DAYS) + } // arithmetic operators @@ -394,11 +507,13 @@ public fun Double.toDuration(unit: DurationUnit): Duration = Duration(convertDur /** Returns a [Duration] equal to this [Int] number of nanoseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.nanoseconds() function instead.", ReplaceWith("Duration.nanoseconds(this)", "kotlin.time.Duration")) public val Int.nanoseconds get() = toDuration(DurationUnit.NANOSECONDS) /** Returns a [Duration] equal to this [Long] number of nanoseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.nanoseconds() function instead.", ReplaceWith("Duration.nanoseconds(this)", "kotlin.time.Duration")) public val Long.nanoseconds get() = toDuration(DurationUnit.NANOSECONDS) /** @@ -408,16 +523,19 @@ public val Long.nanoseconds get() = toDuration(DurationUnit.NANOSECONDS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.nanoseconds() function instead.", ReplaceWith("Duration.nanoseconds(this)", "kotlin.time.Duration")) public val Double.nanoseconds get() = toDuration(DurationUnit.NANOSECONDS) /** Returns a [Duration] equal to this [Int] number of microseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.microseconds() function instead.", ReplaceWith("Duration.microseconds(this)", "kotlin.time.Duration")) public val Int.microseconds get() = toDuration(DurationUnit.MICROSECONDS) /** Returns a [Duration] equal to this [Long] number of microseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.microseconds() function instead.", ReplaceWith("Duration.microseconds(this)", "kotlin.time.Duration")) public val Long.microseconds get() = toDuration(DurationUnit.MICROSECONDS) /** @@ -427,16 +545,19 @@ public val Long.microseconds get() = toDuration(DurationUnit.MICROSECONDS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.microseconds() function instead.", ReplaceWith("Duration.microseconds(this)", "kotlin.time.Duration")) public val Double.microseconds get() = toDuration(DurationUnit.MICROSECONDS) /** Returns a [Duration] equal to this [Int] number of milliseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.milliseconds() function instead.", ReplaceWith("Duration.milliseconds(this)", "kotlin.time.Duration")) public val Int.milliseconds get() = toDuration(DurationUnit.MILLISECONDS) /** Returns a [Duration] equal to this [Long] number of milliseconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.milliseconds() function instead.", ReplaceWith("Duration.milliseconds(this)", "kotlin.time.Duration")) public val Long.milliseconds get() = toDuration(DurationUnit.MILLISECONDS) /** @@ -446,16 +567,19 @@ public val Long.milliseconds get() = toDuration(DurationUnit.MILLISECONDS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.milliseconds() function instead.", ReplaceWith("Duration.milliseconds(this)", "kotlin.time.Duration")) public val Double.milliseconds get() = toDuration(DurationUnit.MILLISECONDS) /** Returns a [Duration] equal to this [Int] number of seconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.seconds() function instead.", ReplaceWith("Duration.seconds(this)", "kotlin.time.Duration")) public val Int.seconds get() = toDuration(DurationUnit.SECONDS) /** Returns a [Duration] equal to this [Long] number of seconds. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.seconds() function instead.", ReplaceWith("Duration.seconds(this)", "kotlin.time.Duration")) public val Long.seconds get() = toDuration(DurationUnit.SECONDS) /** @@ -465,16 +589,19 @@ public val Long.seconds get() = toDuration(DurationUnit.SECONDS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.seconds() function instead.", ReplaceWith("Duration.seconds(this)", "kotlin.time.Duration")) public val Double.seconds get() = toDuration(DurationUnit.SECONDS) /** Returns a [Duration] equal to this [Int] number of minutes. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.minutes() function instead.", ReplaceWith("Duration.minutes(this)", "kotlin.time.Duration")) public val Int.minutes get() = toDuration(DurationUnit.MINUTES) /** Returns a [Duration] equal to this [Long] number of minutes. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.minutes() function instead.", ReplaceWith("Duration.minutes(this)", "kotlin.time.Duration")) public val Long.minutes get() = toDuration(DurationUnit.MINUTES) /** @@ -484,16 +611,19 @@ public val Long.minutes get() = toDuration(DurationUnit.MINUTES) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.minutes() function instead.", ReplaceWith("Duration.minutes(this)", "kotlin.time.Duration")) public val Double.minutes get() = toDuration(DurationUnit.MINUTES) /** Returns a [Duration] equal to this [Int] number of hours. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.hours() function instead.", ReplaceWith("Duration.hours(this)", "kotlin.time.Duration")) public val Int.hours get() = toDuration(DurationUnit.HOURS) /** Returns a [Duration] equal to this [Long] number of hours. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.hours() function instead.", ReplaceWith("Duration.hours(this)", "kotlin.time.Duration")) public val Long.hours get() = toDuration(DurationUnit.HOURS) /** @@ -503,16 +633,19 @@ public val Long.hours get() = toDuration(DurationUnit.HOURS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.hours() function instead.", ReplaceWith("Duration.hours(this)", "kotlin.time.Duration")) public val Double.hours get() = toDuration(DurationUnit.HOURS) /** Returns a [Duration] equal to this [Int] number of days. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.days() function instead.", ReplaceWith("Duration.days(this)", "kotlin.time.Duration")) public val Int.days get() = toDuration(DurationUnit.DAYS) /** Returns a [Duration] equal to this [Long] number of days. */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.days() function instead.", ReplaceWith("Duration.days(this)", "kotlin.time.Duration")) public val Long.days get() = toDuration(DurationUnit.DAYS) /** @@ -522,6 +655,7 @@ public val Long.days get() = toDuration(DurationUnit.DAYS) */ @SinceKotlin("1.3") @ExperimentalTime +@Deprecated("Use Duration.days() function instead.", ReplaceWith("Duration.days(this)", "kotlin.time.Duration")) public val Double.days get() = toDuration(DurationUnit.DAYS) diff --git a/libraries/stdlib/test/time/DurationTest.kt b/libraries/stdlib/test/time/DurationTest.kt index de81bc88292..5c98ff00327 100644 --- a/libraries/stdlib/test/time/DurationTest.kt +++ b/libraries/stdlib/test/time/DurationTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -71,54 +71,54 @@ class DurationTest { val n2 = Random.nextLong(Long.MAX_VALUE) val n3 = Random.nextDouble() - assertEquals(n1.toDuration(DurationUnit.DAYS), n1.days) - assertEquals(n2.toDuration(DurationUnit.DAYS), n2.days) - assertEquals(n3.toDuration(DurationUnit.DAYS), n3.days) + assertEquals(n1.toDuration(DurationUnit.DAYS), Duration.days(n1)) + assertEquals(n2.toDuration(DurationUnit.DAYS), Duration.days(n2)) + assertEquals(n3.toDuration(DurationUnit.DAYS), Duration.days(n3)) - assertEquals(n1.toDuration(DurationUnit.HOURS), n1.hours) - assertEquals(n2.toDuration(DurationUnit.HOURS), n2.hours) - assertEquals(n3.toDuration(DurationUnit.HOURS), n3.hours) + assertEquals(n1.toDuration(DurationUnit.HOURS), Duration.hours(n1)) + assertEquals(n2.toDuration(DurationUnit.HOURS), Duration.hours(n2)) + assertEquals(n3.toDuration(DurationUnit.HOURS), Duration.hours(n3)) - assertEquals(n1.toDuration(DurationUnit.MINUTES), n1.minutes) - assertEquals(n2.toDuration(DurationUnit.MINUTES), n2.minutes) - assertEquals(n3.toDuration(DurationUnit.MINUTES), n3.minutes) + assertEquals(n1.toDuration(DurationUnit.MINUTES), Duration.minutes(n1)) + assertEquals(n2.toDuration(DurationUnit.MINUTES), Duration.minutes(n2)) + assertEquals(n3.toDuration(DurationUnit.MINUTES), Duration.minutes(n3)) - assertEquals(n1.toDuration(DurationUnit.SECONDS), n1.seconds) - assertEquals(n2.toDuration(DurationUnit.SECONDS), n2.seconds) - assertEquals(n3.toDuration(DurationUnit.SECONDS), n3.seconds) + assertEquals(n1.toDuration(DurationUnit.SECONDS), Duration.seconds(n1)) + assertEquals(n2.toDuration(DurationUnit.SECONDS), Duration.seconds(n2)) + assertEquals(n3.toDuration(DurationUnit.SECONDS), Duration.seconds(n3)) - assertEquals(n1.toDuration(DurationUnit.MILLISECONDS), n1.milliseconds) - assertEquals(n2.toDuration(DurationUnit.MILLISECONDS), n2.milliseconds) - assertEquals(n3.toDuration(DurationUnit.MILLISECONDS), n3.milliseconds) + assertEquals(n1.toDuration(DurationUnit.MILLISECONDS), Duration.milliseconds(n1)) + assertEquals(n2.toDuration(DurationUnit.MILLISECONDS), Duration.milliseconds(n2)) + assertEquals(n3.toDuration(DurationUnit.MILLISECONDS), Duration.milliseconds(n3)) - assertEquals(n1.toDuration(DurationUnit.MICROSECONDS), n1.microseconds) - assertEquals(n2.toDuration(DurationUnit.MICROSECONDS), n2.microseconds) - assertEquals(n3.toDuration(DurationUnit.MICROSECONDS), n3.microseconds) + assertEquals(n1.toDuration(DurationUnit.MICROSECONDS), Duration.microseconds(n1)) + assertEquals(n2.toDuration(DurationUnit.MICROSECONDS), Duration.microseconds(n2)) + assertEquals(n3.toDuration(DurationUnit.MICROSECONDS), Duration.microseconds(n3)) - assertEquals(n1.toDuration(DurationUnit.NANOSECONDS), n1.nanoseconds) - assertEquals(n2.toDuration(DurationUnit.NANOSECONDS), n2.nanoseconds) - assertEquals(n3.toDuration(DurationUnit.NANOSECONDS), n3.nanoseconds) + assertEquals(n1.toDuration(DurationUnit.NANOSECONDS), Duration.nanoseconds(n1)) + assertEquals(n2.toDuration(DurationUnit.NANOSECONDS), Duration.nanoseconds(n2)) + assertEquals(n3.toDuration(DurationUnit.NANOSECONDS), Duration.nanoseconds(n3)) } @Test fun conversionToNumber() { - assertEquals(24.0, 1.days.inHours) - assertEquals(0.5, 12.hours.inDays) - assertEquals(15.0, 0.25.hours.inMinutes) - assertEquals(600.0, 10.minutes.inSeconds) - assertEquals(500.0, 0.5.seconds.inMilliseconds) - assertEquals(50_000.0, 0.05.seconds.inMicroseconds) - assertEquals(50_000.0, 0.05.milliseconds.inNanoseconds) + assertEquals(24.0, Duration.days(1).inHours) + assertEquals(0.5, Duration.hours(12).inDays) + assertEquals(15.0, Duration.hours(0.25).inMinutes) + assertEquals(600.0, Duration.minutes(10).inSeconds) + assertEquals(500.0, Duration.seconds(0.5).inMilliseconds) + assertEquals(50_000.0, Duration.seconds(0.05).inMicroseconds) + assertEquals(50_000.0, Duration.milliseconds(0.05).inNanoseconds) - assertEquals(365 * 86400e9, 365.days.inNanoseconds) + assertEquals(365 * 86400e9, Duration.days(365).inNanoseconds) assertEquals(0.0, Duration.ZERO.inNanoseconds) - assertEquals(10500, 10.5.seconds.toLongMilliseconds()) - assertEquals(11, 11.5.milliseconds.toLongMilliseconds()) - assertEquals(-11, (-11.5).milliseconds.toLongMilliseconds()) - assertEquals(252_000_000, 252.milliseconds.toLongNanoseconds()) - assertEquals(Long.MAX_VALUE, (365.days * 293).toLongNanoseconds()) // clamping overflowed value + assertEquals(10500, Duration.seconds(10.5).toLongMilliseconds()) + assertEquals(11, Duration.milliseconds(11.5).toLongMilliseconds()) + assertEquals(-11, Duration.milliseconds((-11.5)).toLongMilliseconds()) + assertEquals(252_000_000, Duration.milliseconds(252).toLongNanoseconds()) + assertEquals(Long.MAX_VALUE, (Duration.days(365) * 293).toLongNanoseconds()) // clamping overflowed value repeat(100) { val value = Random.nextLong(1000) @@ -136,7 +136,7 @@ class DurationTest { val m = Random.nextInt(60) val s = Random.nextInt(60) val ns = Random.nextInt(1e9.toInt()) - (h.hours + m.minutes + s.seconds + ns.nanoseconds).run { + (Duration.hours(h) + Duration.minutes(m) + Duration.seconds(s) + Duration.nanoseconds(ns)).run { toComponents { seconds, nanoseconds -> assertEquals(h.toLong() * 3600 + m * 60 + s, seconds) assertEquals(ns, nanoseconds) @@ -165,7 +165,7 @@ class DurationTest { @Test fun componentsOfCarriedSum() { - (36.hours + 90.minutes + 90.seconds + 1500.milliseconds).run { + (Duration.hours(36) + Duration.minutes(90) + Duration.seconds(90) + Duration.milliseconds(1500)).run { toComponents { days, hours, minutes, seconds, nanoseconds -> assertEquals(1, days) assertEquals(13, hours) @@ -180,11 +180,11 @@ class DurationTest { fun infinite() { assertTrue(Duration.INFINITE.isInfinite()) assertTrue((-Duration.INFINITE).isInfinite()) - assertTrue(Double.POSITIVE_INFINITY.nanoseconds.isInfinite()) + assertTrue(Duration.nanoseconds(Double.POSITIVE_INFINITY).isInfinite()) // seconds converted to nanoseconds overflow to infinite - assertTrue(Double.MAX_VALUE.seconds.isInfinite()) - assertTrue((-Double.MAX_VALUE).seconds.isInfinite()) + assertTrue(Duration.seconds(Double.MAX_VALUE).isInfinite()) + assertTrue(Duration.seconds((-Double.MAX_VALUE)).isInfinite()) } @@ -200,8 +200,8 @@ class DurationTest { @Test fun signAndAbsoluteValue() { - val negative = -1.seconds - val positive = 1.seconds + val negative = -Duration.seconds(1) + val positive = Duration.seconds(1) val zero = Duration.ZERO assertTrue(negative.isNegative()) @@ -232,45 +232,45 @@ class DurationTest { assertEquals(0, Duration.ZERO.compareTo(value)) assertEquals(0, Duration.ZERO.inNanoseconds.compareTo(value.inNanoseconds)) } - equivalentToZero((-0.0).seconds) + equivalentToZero(Duration.seconds(-0.0)) equivalentToZero((-0.0).toDuration(DurationUnit.DAYS)) equivalentToZero(-Duration.ZERO) - equivalentToZero((-1).seconds / Double.POSITIVE_INFINITY) - equivalentToZero(0.seconds / -1) - equivalentToZero((-1).seconds * 0.0) - equivalentToZero(0.seconds * -1) + equivalentToZero(Duration.seconds(-1) / Double.POSITIVE_INFINITY) + equivalentToZero(Duration.seconds(0) / -1) + equivalentToZero(Duration.seconds(-1) * 0.0) + equivalentToZero(Duration.seconds(0) * -1) } @Test fun addition() { - assertEquals(1.5.hours, 1.hours + 30.minutes) - assertEquals(0.5.days, 6.hours + 360.minutes) - assertEquals(0.5.seconds, 200.milliseconds + 300_000.microseconds) + assertEquals(Duration.hours(1.5), Duration.hours(1) + Duration.minutes(30)) + assertEquals(Duration.days(0.5), Duration.hours(6) + Duration.minutes(360)) + assertEquals(Duration.seconds(0.5), Duration.milliseconds(200) + Duration.microseconds(300_000)) assertFailsWith { Duration.INFINITE + (-Duration.INFINITE) } } @Test fun subtraction() { - assertEquals(10.hours, 0.5.days - 120.minutes) - assertEquals(850.milliseconds, 1.seconds - 150.milliseconds) + assertEquals(Duration.hours(10), Duration.days(0.5) - Duration.minutes(120)) + assertEquals(Duration.milliseconds(850), Duration.seconds(1) - Duration.milliseconds(150)) assertFailsWith { Duration.INFINITE - Duration.INFINITE } } @Test fun multiplication() { - assertEquals(1.days, 12.hours * 2) - assertEquals(1.days, 60.minutes * 24.0) - assertEquals(1.microseconds, 20.nanoseconds * 50) + assertEquals(Duration.days(1), Duration.hours(12) * 2) + assertEquals(Duration.days(1), Duration.minutes(60) * 24.0) + assertEquals(Duration.microseconds(1), Duration.nanoseconds(20) * 50) - assertEquals(1.days, 2 * 12.hours) - assertEquals(12.5.hours, 12.5 * 60.minutes) - assertEquals(1.microseconds, 50 * 20.nanoseconds) + assertEquals(Duration.days(1), 2 * Duration.hours(12)) + assertEquals(Duration.hours(12.5), 12.5 * Duration.minutes(60)) + assertEquals(Duration.microseconds(1), 50 * Duration.nanoseconds(20)) - assertEquals(Duration.ZERO, 0 * 1.hours) - assertEquals(Duration.ZERO, 1.seconds * 0.0) + assertEquals(Duration.ZERO, 0 * Duration.hours(1)) + assertEquals(Duration.ZERO, Duration.seconds(1) * 0.0) assertFailsWith { Duration.INFINITE * 0 } assertFailsWith { 0 * Duration.INFINITE } @@ -278,21 +278,21 @@ class DurationTest { @Test fun divisionByNumber() { - assertEquals(12.hours, 1.days / 2) - assertEquals(60.minutes, 1.days / 24.0) - assertEquals(20.seconds, 2.minutes / 6) + assertEquals(Duration.hours(12), Duration.days(1) / 2) + assertEquals(Duration.minutes(60), Duration.days(1) / 24.0) + assertEquals(Duration.seconds(20), Duration.minutes(2) / 6) - assertEquals(Duration.INFINITE, 1.seconds / 0.0) - assertEquals(-Duration.INFINITE, -1.seconds / 0.0) + assertEquals(Duration.INFINITE, Duration.seconds(1) / 0.0) + assertEquals(-Duration.INFINITE, -Duration.seconds(1) / 0.0) assertFailsWith { Duration.INFINITE / Double.POSITIVE_INFINITY } assertFailsWith { Duration.ZERO / 0 } } @Test fun divisionByDuration() { - assertEquals(24.0, 1.days / 1.hours) - assertEquals(0.1, 9.minutes / 1.5.hours) - assertEquals(50.0, 1.microseconds / 20.nanoseconds) + assertEquals(24.0, Duration.days(1) / Duration.hours(1)) + assertEquals(0.1, Duration.minutes(9) / Duration.hours(1.5)) + assertEquals(50.0, Duration.microseconds(1) / Duration.nanoseconds(20)) assertTrue((Duration.INFINITE / Duration.INFINITE).isNaN()) } @@ -303,30 +303,30 @@ class DurationTest { assertEquals("PT0S", Duration.ZERO.toIsoString()) // single unit - assertEquals("PT24H", 1.days.toIsoString()) - assertEquals("PT1H", 1.hours.toIsoString()) - assertEquals("PT1M", 1.minutes.toIsoString()) - assertEquals("PT1S", 1.seconds.toIsoString()) - assertEquals("PT0.001S", 1.milliseconds.toIsoString()) - assertEquals("PT0.000001S", 1.microseconds.toIsoString()) - assertEquals("PT0.000000001S", 1.nanoseconds.toIsoString()) + assertEquals("PT24H", Duration.days(1).toIsoString()) + assertEquals("PT1H", Duration.hours(1).toIsoString()) + assertEquals("PT1M", Duration.minutes(1).toIsoString()) + assertEquals("PT1S", Duration.seconds(1).toIsoString()) + assertEquals("PT0.001S", Duration.milliseconds(1).toIsoString()) + assertEquals("PT0.000001S", Duration.microseconds(1).toIsoString()) + assertEquals("PT0.000000001S", Duration.nanoseconds(1).toIsoString()) // rounded to zero - assertEquals("PT0S", 0.1.nanoseconds.toIsoString()) - assertEquals("PT0S", 0.9.nanoseconds.toIsoString()) + assertEquals("PT0S", Duration.nanoseconds(0.1).toIsoString()) + assertEquals("PT0S", Duration.nanoseconds(0.9).toIsoString()) // several units combined - assertEquals("PT24H1M", (1.days + 1.minutes).toIsoString()) - assertEquals("PT24H0M1S", (1.days + 1.seconds).toIsoString()) - assertEquals("PT24H0M0.001S", (1.days + 1.milliseconds).toIsoString()) - assertEquals("PT1H30M", (1.hours + 30.minutes).toIsoString()) - assertEquals("PT1H0M0.500S", (1.hours + 500.milliseconds).toIsoString()) - assertEquals("PT2M0.500S", (2.minutes + 500.milliseconds).toIsoString()) - assertEquals("PT1M30.500S", (90_500.milliseconds).toIsoString()) + assertEquals("PT24H1M", (Duration.days(1) + Duration.minutes(1)).toIsoString()) + assertEquals("PT24H0M1S", (Duration.days(1) + Duration.seconds(1)).toIsoString()) + assertEquals("PT24H0M0.001S", (Duration.days(1) + Duration.milliseconds(1)).toIsoString()) + assertEquals("PT1H30M", (Duration.hours(1) + Duration.minutes(30)).toIsoString()) + assertEquals("PT1H0M0.500S", (Duration.hours(1) + Duration.milliseconds(500)).toIsoString()) + assertEquals("PT2M0.500S", (Duration.minutes(2) + Duration.milliseconds(500)).toIsoString()) + assertEquals("PT1M30.500S", (Duration.milliseconds(90_500)).toIsoString()) // negative - assertEquals("-PT23H45M", (-1.days + 15.minutes).toIsoString()) - assertEquals("-PT24H15M", (-1.days - 15.minutes).toIsoString()) + assertEquals("-PT23H45M", (-Duration.days(1) + Duration.minutes(15)).toIsoString()) + assertEquals("-PT24H15M", (-Duration.days(1) - Duration.minutes(15)).toIsoString()) // infinite assertEquals("PT2147483647H", Duration.INFINITE.toIsoString()) @@ -334,7 +334,10 @@ class DurationTest { @Test fun toStringInUnits() { - var d = 1.days + 15.hours + 31.minutes + 45.seconds + 678.milliseconds + 920.microseconds + 516.34.nanoseconds + var d = with(Duration) { + days(1) + hours(15) + minutes(31) + seconds(45) + + milliseconds(678) + microseconds(920) + nanoseconds(516.34) + } fun test(unit: DurationUnit, vararg representations: String) { assertFails { d.toString(unit, -1) } @@ -344,25 +347,25 @@ class DurationTest { test(DurationUnit.DAYS, "2d", "1.6d", "1.65d", "1.647d") test(DurationUnit.HOURS, "40h", "39.5h", "39.53h") test(DurationUnit.MINUTES, "2372m", "2371.8m", "2371.76m") - d -= 39.hours + d -= Duration.hours(39) test(DurationUnit.SECONDS, "1906s", "1905.7s", "1905.68s", "1905.679s") - d -= 1904.seconds + d -= Duration.seconds(1904) test(DurationUnit.MILLISECONDS, "1679ms", "1678.9ms", "1678.92ms", "1678.921ms") - d -= 1678.milliseconds + d -= Duration.milliseconds(1678) test(DurationUnit.MICROSECONDS, "921us", "920.5us", "920.52us", "920.516us") - d -= 920.microseconds + d -= Duration.microseconds(920) // sub-nanosecond precision errors test(DurationUnit.NANOSECONDS, "516ns", "516.3ns", "516.34ns", "516.344ns", "516.3438ns") - d = (d - 516.nanoseconds) / 17 + d = (d - Duration.nanoseconds(516)) / 17 test(DurationUnit.NANOSECONDS, "0ns", "0.0ns", "0.02ns", "0.020ns", "0.0202ns") - d = Double.MAX_VALUE.nanoseconds + d = Duration.nanoseconds(Double.MAX_VALUE) test(DurationUnit.DAYS, "2.08e+294d") test(DurationUnit.NANOSECONDS, "1.80e+308ns") - assertEquals("0.500000000000s", 0.5.seconds.toString(DurationUnit.SECONDS, 100)) - assertEquals("99999000000000.000000000000ns", 99_999.seconds.toString(DurationUnit.NANOSECONDS, 15)) - assertEquals("1.00e+14ns", 100_000.seconds.toString(DurationUnit.NANOSECONDS, 9)) + assertEquals("0.500000000000s", Duration.seconds(0.5).toString(DurationUnit.SECONDS, 100)) + assertEquals("99999000000000.000000000000ns", Duration.seconds(99_999).toString(DurationUnit.NANOSECONDS, 15)) + assertEquals("1.00e+14ns", Duration.seconds(100_000).toString(DurationUnit.NANOSECONDS, 9)) d = Duration.INFINITE test(DurationUnit.DAYS, "Infinity", "Infinity") @@ -383,58 +386,58 @@ class DurationTest { assertEquals("-$actual", (-duration).toString()) } - test(101.days, "101d") - test(45.3.days, "45.3d") - test(45.days, "45.0d") + test(Duration.days(101), "101d") + test(Duration.days(45.3), "45.3d") + test(Duration.days(45), "45.0d") - test(40.5.days, "972h") - test(40.hours + 15.minutes, "40.3h", "40.2h") - test(40.hours, "40.0h") + test(Duration.days(40.5), "972h") + test(Duration.hours(40) + Duration.minutes(15), "40.3h", "40.2h") + test(Duration.hours(40), "40.0h") - test(12.5.hours, "750m") - test(30.minutes, "30.0m") - test(17.5.minutes, "17.5m") + test(Duration.hours(12.5), "750m") + test(Duration.minutes(30), "30.0m") + test(Duration.minutes(17.5), "17.5m") - test(16.5.minutes, "990s") - test(90.36.seconds, "90.4s") - test(50.seconds, "50.0s") - test(1.3.seconds, "1.30s") - test(1.seconds, "1.00s") + test(Duration.minutes(16.5), "990s") + test(Duration.seconds(90.36), "90.4s") + test(Duration.seconds(50), "50.0s") + test(Duration.seconds(1.3), "1.30s") + test(Duration.seconds(1), "1.00s") - test(0.5.seconds, "500ms") - test(40.2.milliseconds, "40.2ms") - test(4.225.milliseconds, "4.23ms", "4.22ms") - test(4.245.milliseconds, "4.25ms") - test(1.milliseconds, "1.00ms") + test(Duration.seconds(0.5), "500ms") + test(Duration.milliseconds(40.2), "40.2ms") + test(Duration.milliseconds(4.225), "4.23ms", "4.22ms") + test(Duration.milliseconds(4.245), "4.25ms") + test(Duration.milliseconds(1), "1.00ms") - test(0.75.milliseconds, "750us") - test(75.35.microseconds, "75.4us", "75.3us") - test(7.25.microseconds, "7.25us") - test(1.035.microseconds, "1.04us", "1.03us") - test(1.005.microseconds, "1.01us", "1.00us") + test(Duration.milliseconds(0.75), "750us") + test(Duration.microseconds(75.35), "75.4us", "75.3us") + test(Duration.microseconds(7.25), "7.25us") + test(Duration.microseconds(1.035), "1.04us", "1.03us") + test(Duration.microseconds(1.005), "1.01us", "1.00us") - test(950.5.nanoseconds, "951ns", "950ns") - test(85.23.nanoseconds, "85.2ns") - test(8.235.nanoseconds, "8.24ns", "8.23ns") - test(1.3.nanoseconds, "1.30ns") + test(Duration.nanoseconds(950.5), "951ns", "950ns") + test(Duration.nanoseconds(85.23), "85.2ns") + test(Duration.nanoseconds(8.235), "8.24ns", "8.23ns") + test(Duration.nanoseconds(1.3), "1.30ns") - test(0.75.nanoseconds, "0.75ns") - test(0.7512.nanoseconds, "0.7512ns") - test(0.023.nanoseconds, "0.023ns") - test(0.0034.nanoseconds, "0.0034ns") - test(0.0000035.nanoseconds, "0.0000035ns") + test(Duration.nanoseconds(0.75), "0.75ns") + test(Duration.nanoseconds(0.7512), "0.7512ns") + test(Duration.nanoseconds(0.023), "0.023ns") + test(Duration.nanoseconds(0.0034), "0.0034ns") + test(Duration.nanoseconds(0.0000035), "0.0000035ns") test(Duration.ZERO, "0s") - test(365.days * 10000, "3650000d") - test(300.days * 100000, "3.00e+7d") - test(365.days * 100000, "3.65e+7d") + test(Duration.days(365) * 10000, "3650000d") + test(Duration.days(300) * 100000, "3.00e+7d") + test(Duration.days(365) * 100000, "3.65e+7d") - val universeAge = 365.25.days * 13.799e9 - val planckTime = 5.4e-44.seconds + val universeAge = Duration.days(365.25) * 13.799e9 + val planckTime = Duration.seconds(5.4e-44) test(universeAge, "5.04e+12d") test(planckTime, "5.40e-44s") - test(Double.MAX_VALUE.nanoseconds, "2.08e+294d") + test(Duration.nanoseconds(Double.MAX_VALUE), "2.08e+294d") test(Duration.INFINITE, "Infinity") } diff --git a/libraries/stdlib/test/time/MeasureTimeTest.kt b/libraries/stdlib/test/time/MeasureTimeTest.kt index 9d2d8cf5645..4a5594c65e4 100644 --- a/libraries/stdlib/test/time/MeasureTimeTest.kt +++ b/libraries/stdlib/test/time/MeasureTimeTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -52,20 +52,20 @@ class MeasureTimeTest { val timeSource = TestTimeSource() val expectedNs = Random.nextLong(1_000_000_000L) val elapsed = timeSource.measureTime { - timeSource += expectedNs.nanoseconds + timeSource += Duration.nanoseconds(expectedNs) } - assertEquals(expectedNs.nanoseconds, elapsed) + assertEquals(Duration.nanoseconds(expectedNs), elapsed) val expectedResult: Long val (result, elapsed2) = timeSource.measureTimedValue { - timeSource += expectedNs.nanoseconds + timeSource += Duration.nanoseconds(expectedNs) expectedResult = expectedNs expectedNs } assertEquals(expectedResult, result) - assertEquals(result.nanoseconds, elapsed2) + assertEquals(Duration.nanoseconds(result), elapsed2) } } diff --git a/libraries/stdlib/test/time/TestTimeSourceTest.kt b/libraries/stdlib/test/time/TestTimeSourceTest.kt index e8ba18ce685..ee5e554217b 100644 --- a/libraries/stdlib/test/time/TestTimeSourceTest.kt +++ b/libraries/stdlib/test/time/TestTimeSourceTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,14 +13,14 @@ class TestTimeSourceTest { @Test fun overflows() { - for (enormousDuration in listOf(Duration.INFINITE, Double.MAX_VALUE.nanoseconds, Long.MAX_VALUE.nanoseconds * 2)) { + for (enormousDuration in listOf(Duration.INFINITE, Duration.nanoseconds(Double.MAX_VALUE), Duration.nanoseconds(Long.MAX_VALUE) * 2)) { assertFailsWith(enormousDuration.toString()) { TestTimeSource() += enormousDuration } assertFailsWith((-enormousDuration).toString()) { TestTimeSource() += -enormousDuration } } - val moderatePositiveDuration = Long.MAX_VALUE.takeHighestOneBit().nanoseconds - val borderlinePositiveDuration = Long.MAX_VALUE.nanoseconds // rounded to 2.0^63, which is slightly more than Long.MAX_VALUE - val borderlineNegativeDuration = Long.MIN_VALUE.nanoseconds + val moderatePositiveDuration = Duration.nanoseconds(Long.MAX_VALUE.takeHighestOneBit()) + val borderlinePositiveDuration = Duration.nanoseconds(Long.MAX_VALUE) // rounded to 2.0^63, which is slightly more than Long.MAX_VALUE + val borderlineNegativeDuration = Duration.nanoseconds(Long.MIN_VALUE) run { val timeSource = TestTimeSource() timeSource += moderatePositiveDuration @@ -29,12 +29,12 @@ class TestTimeSourceTest { run { val timeSource = TestTimeSource() timeSource += borderlinePositiveDuration - assertFailsWith("Should overflow positive") { timeSource += 1.nanoseconds } + assertFailsWith("Should overflow positive") { timeSource += Duration.nanoseconds(1) } } run { val timeSource = TestTimeSource() timeSource += borderlineNegativeDuration - assertFailsWith("Should overflow negative") { timeSource += -1.nanoseconds } + assertFailsWith("Should overflow negative") { timeSource += -Duration.nanoseconds(1) } } run { @@ -51,12 +51,12 @@ class TestTimeSourceTest { val mark = timeSource.markNow() repeat(10_000) { - timeSource += 0.9.nanoseconds + timeSource += Duration.nanoseconds(0.9) assertEquals(Duration.ZERO, mark.elapsedNow()) } - timeSource += 1.9.nanoseconds - assertEquals(1.nanoseconds, mark.elapsedNow()) + timeSource += Duration.nanoseconds(1.9) + assertEquals(Duration.nanoseconds(1), mark.elapsedNow()) } } diff --git a/libraries/stdlib/test/time/TimeMarkTest.kt b/libraries/stdlib/test/time/TimeMarkTest.kt index 982b9dcac3a..f1f3bf3478d 100644 --- a/libraries/stdlib/test/time/TimeMarkTest.kt +++ b/libraries/stdlib/test/time/TimeMarkTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -19,23 +19,27 @@ class TimeMarkTest { assertEquals(!hasPassed, this.hasNotPassedNow(), "Expected mark in the future") assertEquals(hasPassed, this.hasPassedNow(), "Expected mark in the past") - assertEquals(!hasPassed, this.elapsedNow() < Duration.ZERO, "Mark elapsed: ${this.elapsedNow()}, expected hasPassed: $hasPassed") + assertEquals( + !hasPassed, + this.elapsedNow() < Duration.ZERO, + "Mark elapsed: ${this.elapsedNow()}, expected hasPassed: $hasPassed" + ) } val mark = timeSource.markNow() - val markFuture1 = (mark + 1.milliseconds).apply { assertHasPassed(false) } - val markFuture2 = (mark - (-1).milliseconds).apply { assertHasPassed(false) } + val markFuture1 = (mark + Duration.milliseconds(1)).apply { assertHasPassed(false) } + val markFuture2 = (mark - Duration.milliseconds((-1))).apply { assertHasPassed(false) } - val markPast1 = (mark - 1.milliseconds).apply { assertHasPassed(true) } - val markPast2 = (markFuture1 + (-2).milliseconds).apply { assertHasPassed(true) } + val markPast1 = (mark - Duration.milliseconds(1)).apply { assertHasPassed(true) } + val markPast2 = (markFuture1 + Duration.milliseconds((-2))).apply { assertHasPassed(true) } - timeSource += 500_000.nanoseconds + timeSource += Duration.nanoseconds(500_000) val elapsed = mark.elapsedNow() - val elapsedFromFuture = elapsed - 1.milliseconds - val elapsedFromPast = elapsed + 1.milliseconds + val elapsedFromFuture = elapsed - Duration.milliseconds(1) + val elapsedFromPast = elapsed + Duration.milliseconds(1) - assertEquals(0.5.milliseconds, elapsed) + assertEquals(Duration.milliseconds(0.5), elapsed) assertEquals(elapsedFromFuture, markFuture1.elapsedNow()) assertEquals(elapsedFromFuture, markFuture2.elapsedNow()) @@ -45,7 +49,7 @@ class TimeMarkTest { markFuture1.assertHasPassed(false) markPast1.assertHasPassed(true) - timeSource += 1.milliseconds + timeSource += Duration.milliseconds(1) markFuture1.assertHasPassed(true) markPast1.assertHasPassed(true) diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 105462948e2..c797a752fa3 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -5694,8 +5694,29 @@ public final class kotlin/time/Duration : java/lang/Comparable { public final class kotlin/time/Duration$Companion { public final fun convert (DLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/TimeUnit;)D + public final fun days-UwyO8pc (D)D + public final fun days-UwyO8pc (I)D + public final fun days-UwyO8pc (J)D public final fun getINFINITE-UwyO8pc ()D public final fun getZERO-UwyO8pc ()D + public final fun hours-UwyO8pc (D)D + public final fun hours-UwyO8pc (I)D + public final fun hours-UwyO8pc (J)D + public final fun microseconds-UwyO8pc (D)D + public final fun microseconds-UwyO8pc (I)D + public final fun microseconds-UwyO8pc (J)D + public final fun milliseconds-UwyO8pc (D)D + public final fun milliseconds-UwyO8pc (I)D + public final fun milliseconds-UwyO8pc (J)D + public final fun minutes-UwyO8pc (D)D + public final fun minutes-UwyO8pc (I)D + public final fun minutes-UwyO8pc (J)D + public final fun nanoseconds-UwyO8pc (D)D + public final fun nanoseconds-UwyO8pc (I)D + public final fun nanoseconds-UwyO8pc (J)D + public final fun seconds-UwyO8pc (D)D + public final fun seconds-UwyO8pc (I)D + public final fun seconds-UwyO8pc (J)D } public final class kotlin/time/DurationKt {