Make DurationUnit not a typealias of TimeUnit on JVM

Provide conversion functions between DurationUnit and TimeUnit
This commit is contained in:
Ilya Gorbunov
2021-09-28 02:02:29 +03:00
committed by Space
parent 2b1897e362
commit 04d70162d2
5 changed files with 119 additions and 18 deletions
@@ -8,26 +8,79 @@
package kotlin.time package kotlin.time
import java.util.concurrent.TimeUnit
@SinceKotlin("1.6") @SinceKotlin("1.6")
@WasExperimental(ExperimentalTime::class) @WasExperimental(ExperimentalTime::class)
public actual typealias DurationUnit = java.util.concurrent.TimeUnit public actual enum class DurationUnit(internal val timeUnit: TimeUnit) {
/**
* Time unit representing one nanosecond, which is 1/1000 of a microsecond.
*/
NANOSECONDS(TimeUnit.NANOSECONDS),
/**
* Time unit representing one microsecond, which is 1/1000 of a millisecond.
*/
MICROSECONDS(TimeUnit.MICROSECONDS),
/**
* Time unit representing one millisecond, which is 1/1000 of a second.
*/
MILLISECONDS(TimeUnit.MILLISECONDS),
/**
* Time unit representing one second.
*/
SECONDS(TimeUnit.SECONDS),
/**
* Time unit representing one minute.
*/
MINUTES(TimeUnit.MINUTES),
/**
* Time unit representing one hour.
*/
HOURS(TimeUnit.HOURS),
/**
* Time unit representing one day, which is always equal to 24 hours.
*/
DAYS(TimeUnit.DAYS);
}
/**
* Converts this [kotlin.time.DurationUnit][DurationUnit] enum value to the corresponding [java.util.concurrent.TimeUnit][java.util.concurrent.TimeUnit] value.
*/
@SinceKotlin("1.6")
@ExperimentalTime
public fun DurationUnit.toTimeUnit(): TimeUnit = timeUnit
/**
* Converts this [java.util.concurrent.TimeUnit][java.util.concurrent.TimeUnit] enum value to the corresponding [kotlin.time.DurationUnit][DurationUnit] value.
*/
@SinceKotlin("1.6")
@ExperimentalTime
public fun TimeUnit.toDurationUnit(): DurationUnit = when (this) {
TimeUnit.NANOSECONDS -> DurationUnit.NANOSECONDS
TimeUnit.MICROSECONDS -> DurationUnit.MICROSECONDS
TimeUnit.MILLISECONDS -> DurationUnit.MILLISECONDS
TimeUnit.SECONDS -> DurationUnit.SECONDS
TimeUnit.MINUTES -> DurationUnit.MINUTES
TimeUnit.HOURS -> DurationUnit.HOURS
TimeUnit.DAYS -> DurationUnit.DAYS
}
@SinceKotlin("1.3") @SinceKotlin("1.3")
internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double { internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double {
val sourceInTargets = targetUnit.convert(1, sourceUnit) val sourceInTargets = targetUnit.timeUnit.convert(1, sourceUnit.timeUnit)
if (sourceInTargets > 0) if (sourceInTargets > 0)
return value * sourceInTargets return value * sourceInTargets
val otherInThis = sourceUnit.convert(1, targetUnit) val otherInThis = sourceUnit.timeUnit.convert(1, targetUnit.timeUnit)
return value / otherInThis return value / otherInThis
} }
@SinceKotlin("1.5") @SinceKotlin("1.5")
internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long {
return targetUnit.convert(value, sourceUnit) return targetUnit.timeUnit.convert(value, sourceUnit.timeUnit)
} }
@SinceKotlin("1.5") @SinceKotlin("1.5")
internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long {
return targetUnit.convert(value, sourceUnit) return targetUnit.timeUnit.convert(value, sourceUnit.timeUnit)
} }
@@ -0,0 +1,28 @@
/*
* 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.
*/
package test.time
import java.util.concurrent.TimeUnit
import kotlin.test.*
import kotlin.time.*
@OptIn(ExperimentalTime::class)
class DurationUnitJVMTest {
@Test
fun conversionFromTimeUnit() {
for (unit in DurationUnit.values()) {
val timeUnit = unit.toTimeUnit()
assertEquals(unit.name, timeUnit.name)
assertEquals(unit, timeUnit.toDurationUnit())
}
for (timeUnit in TimeUnit.values()) {
val unit = timeUnit.toDurationUnit()
assertEquals(timeUnit.name, unit.name)
assertEquals(timeUnit, unit.toTimeUnit())
}
}
}
@@ -92,6 +92,7 @@ class DurationTest {
repeat(10) { repeat(10) {
val d1 = value.toDuration(unit) val d1 = value.toDuration(unit)
val unit2 = units.random() val unit2 = units.random()
@OptIn(ExperimentalTime::class)
val value2 = Duration.convert(value, unit, unit2) val value2 = Duration.convert(value, unit, unit2)
val d2 = value2.toDuration(unit2) val d2 = value2.toDuration(unit2)
assertEquals(d1, d2, "$value $unit in $unit2") assertEquals(d1, d2, "$value $unit in $unit2")
@@ -200,6 +201,7 @@ class DurationTest {
val unit = units.random() val unit = units.random()
val unit2 = units.random() val unit2 = units.random()
@OptIn(ExperimentalTime::class)
assertAlmostEquals(Duration.convert(value.toDouble(), unit, unit2), value.toDuration(unit).toDouble(unit2)) assertAlmostEquals(Duration.convert(value.toDouble(), unit, unit2), value.toDuration(unit).toDouble(unit2))
} }
@@ -19,6 +19,7 @@ import kotlin.time.DurationUnit.NANOSECONDS
class DurationUnitTest { class DurationUnitTest {
@Test @Test
@OptIn(ExperimentalTime::class)
fun conversion() { fun conversion() {
fun test(sourceValue: Double, sourceUnit: DurationUnit, targetValue: Double, targetUnit: DurationUnit) { fun test(sourceValue: Double, sourceUnit: DurationUnit, targetValue: Double, targetUnit: DurationUnit) {
assertEquals( assertEquals(
@@ -5645,15 +5645,15 @@ public final class kotlin/text/UStringsKt {
} }
public abstract class kotlin/time/AbstractDoubleTimeSource : kotlin/time/TimeSource { public abstract class kotlin/time/AbstractDoubleTimeSource : kotlin/time/TimeSource {
public fun <init> (Ljava/util/concurrent/TimeUnit;)V public fun <init> (Lkotlin/time/DurationUnit;)V
protected final fun getUnit ()Ljava/util/concurrent/TimeUnit; protected final fun getUnit ()Lkotlin/time/DurationUnit;
public fun markNow ()Lkotlin/time/TimeMark; public fun markNow ()Lkotlin/time/TimeMark;
protected abstract fun read ()D protected abstract fun read ()D
} }
public abstract class kotlin/time/AbstractLongTimeSource : kotlin/time/TimeSource { public abstract class kotlin/time/AbstractLongTimeSource : kotlin/time/TimeSource {
public fun <init> (Ljava/util/concurrent/TimeUnit;)V public fun <init> (Lkotlin/time/DurationUnit;)V
protected final fun getUnit ()Ljava/util/concurrent/TimeUnit; protected final fun getUnit ()Lkotlin/time/DurationUnit;
public fun markNow ()Lkotlin/time/TimeMark; public fun markNow ()Lkotlin/time/TimeMark;
protected abstract fun read ()J protected abstract fun read ()J
} }
@@ -5699,22 +5699,22 @@ public final class kotlin/time/Duration : java/lang/Comparable {
public static final fun toComponents-impl (JLkotlin/jvm/functions/Function3;)Ljava/lang/Object; public static final fun toComponents-impl (JLkotlin/jvm/functions/Function3;)Ljava/lang/Object;
public static final fun toComponents-impl (JLkotlin/jvm/functions/Function4;)Ljava/lang/Object; public static final fun toComponents-impl (JLkotlin/jvm/functions/Function4;)Ljava/lang/Object;
public static final fun toComponents-impl (JLkotlin/jvm/functions/Function5;)Ljava/lang/Object; public static final fun toComponents-impl (JLkotlin/jvm/functions/Function5;)Ljava/lang/Object;
public static final fun toDouble-impl (JLjava/util/concurrent/TimeUnit;)D public static final fun toDouble-impl (JLkotlin/time/DurationUnit;)D
public static final fun toInt-impl (JLjava/util/concurrent/TimeUnit;)I public static final fun toInt-impl (JLkotlin/time/DurationUnit;)I
public static final fun toIsoString-impl (J)Ljava/lang/String; public static final fun toIsoString-impl (J)Ljava/lang/String;
public static final fun toLong-impl (JLjava/util/concurrent/TimeUnit;)J public static final fun toLong-impl (JLkotlin/time/DurationUnit;)J
public static final fun toLongMilliseconds-impl (J)J public static final fun toLongMilliseconds-impl (J)J
public static final fun toLongNanoseconds-impl (J)J public static final fun toLongNanoseconds-impl (J)J
public fun toString ()Ljava/lang/String; public fun toString ()Ljava/lang/String;
public static fun toString-impl (J)Ljava/lang/String; public static fun toString-impl (J)Ljava/lang/String;
public static final fun toString-impl (JLjava/util/concurrent/TimeUnit;I)Ljava/lang/String; public static final fun toString-impl (JLkotlin/time/DurationUnit;I)Ljava/lang/String;
public static synthetic fun toString-impl$default (JLjava/util/concurrent/TimeUnit;IILjava/lang/Object;)Ljava/lang/String; public static synthetic fun toString-impl$default (JLkotlin/time/DurationUnit;IILjava/lang/Object;)Ljava/lang/String;
public static final fun unaryMinus-UwyO8pc (J)J public static final fun unaryMinus-UwyO8pc (J)J
public final synthetic fun unbox-impl ()J public final synthetic fun unbox-impl ()J
} }
public final class kotlin/time/Duration$Companion { public final class kotlin/time/Duration$Companion {
public final fun convert (DLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/TimeUnit;)D public final fun convert (DLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)D
public final fun days-UwyO8pc (D)J public final fun days-UwyO8pc (D)J
public final fun days-UwyO8pc (I)J public final fun days-UwyO8pc (I)J
public final fun days-UwyO8pc (J)J public final fun days-UwyO8pc (J)J
@@ -5766,9 +5766,26 @@ public final class kotlin/time/DurationKt {
public static final fun getSeconds (D)J public static final fun getSeconds (D)J
public static final fun getSeconds (I)J public static final fun getSeconds (I)J
public static final fun getSeconds (J)J public static final fun getSeconds (J)J
public static final fun toDuration (DLjava/util/concurrent/TimeUnit;)J public static final fun toDuration (DLkotlin/time/DurationUnit;)J
public static final fun toDuration (ILjava/util/concurrent/TimeUnit;)J public static final fun toDuration (ILkotlin/time/DurationUnit;)J
public static final fun toDuration (JLjava/util/concurrent/TimeUnit;)J public static final fun toDuration (JLkotlin/time/DurationUnit;)J
}
public final class kotlin/time/DurationUnit : java/lang/Enum {
public static final field DAYS Lkotlin/time/DurationUnit;
public static final field HOURS Lkotlin/time/DurationUnit;
public static final field MICROSECONDS Lkotlin/time/DurationUnit;
public static final field MILLISECONDS Lkotlin/time/DurationUnit;
public static final field MINUTES Lkotlin/time/DurationUnit;
public static final field NANOSECONDS Lkotlin/time/DurationUnit;
public static final field SECONDS Lkotlin/time/DurationUnit;
public static fun valueOf (Ljava/lang/String;)Lkotlin/time/DurationUnit;
public static fun values ()[Lkotlin/time/DurationUnit;
}
public final class kotlin/time/DurationUnitKt {
public static final fun toDurationUnit (Ljava/util/concurrent/TimeUnit;)Lkotlin/time/DurationUnit;
public static final fun toTimeUnit (Lkotlin/time/DurationUnit;)Ljava/util/concurrent/TimeUnit;
} }
public abstract interface annotation class kotlin/time/ExperimentalTime : java/lang/annotation/Annotation { public abstract interface annotation class kotlin/time/ExperimentalTime : java/lang/annotation/Annotation {