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
import java.util.concurrent.TimeUnit
@SinceKotlin("1.6")
@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")
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)
return value * sourceInTargets
val otherInThis = sourceUnit.convert(1, targetUnit)
val otherInThis = sourceUnit.timeUnit.convert(1, targetUnit.timeUnit)
return value / otherInThis
}
@SinceKotlin("1.5")
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")
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) {
val d1 = value.toDuration(unit)
val unit2 = units.random()
@OptIn(ExperimentalTime::class)
val value2 = Duration.convert(value, unit, unit2)
val d2 = value2.toDuration(unit2)
assertEquals(d1, d2, "$value $unit in $unit2")
@@ -200,6 +201,7 @@ class DurationTest {
val unit = units.random()
val unit2 = units.random()
@OptIn(ExperimentalTime::class)
assertAlmostEquals(Duration.convert(value.toDouble(), unit, unit2), value.toDuration(unit).toDouble(unit2))
}
@@ -19,6 +19,7 @@ import kotlin.time.DurationUnit.NANOSECONDS
class DurationUnitTest {
@Test
@OptIn(ExperimentalTime::class)
fun conversion() {
fun test(sourceValue: Double, sourceUnit: DurationUnit, targetValue: Double, targetUnit: DurationUnit) {
assertEquals(
@@ -5645,15 +5645,15 @@ public final class kotlin/text/UStringsKt {
}
public abstract class kotlin/time/AbstractDoubleTimeSource : kotlin/time/TimeSource {
public fun <init> (Ljava/util/concurrent/TimeUnit;)V
protected final fun getUnit ()Ljava/util/concurrent/TimeUnit;
public fun <init> (Lkotlin/time/DurationUnit;)V
protected final fun getUnit ()Lkotlin/time/DurationUnit;
public fun markNow ()Lkotlin/time/TimeMark;
protected abstract fun read ()D
}
public abstract class kotlin/time/AbstractLongTimeSource : kotlin/time/TimeSource {
public fun <init> (Ljava/util/concurrent/TimeUnit;)V
protected final fun getUnit ()Ljava/util/concurrent/TimeUnit;
public fun <init> (Lkotlin/time/DurationUnit;)V
protected final fun getUnit ()Lkotlin/time/DurationUnit;
public fun markNow ()Lkotlin/time/TimeMark;
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/Function4;)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 toInt-impl (JLjava/util/concurrent/TimeUnit;)I
public static final fun toDouble-impl (JLkotlin/time/DurationUnit;)D
public static final fun toInt-impl (JLkotlin/time/DurationUnit;)I
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 toLongNanoseconds-impl (J)J
public fun toString ()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 synthetic fun toString-impl$default (JLjava/util/concurrent/TimeUnit;IILjava/lang/Object;)Ljava/lang/String;
public static final fun toString-impl (JLkotlin/time/DurationUnit;I)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 final synthetic fun unbox-impl ()J
}
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 (I)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 (I)J
public static final fun getSeconds (J)J
public static final fun toDuration (DLjava/util/concurrent/TimeUnit;)J
public static final fun toDuration (ILjava/util/concurrent/TimeUnit;)J
public static final fun toDuration (JLjava/util/concurrent/TimeUnit;)J
public static final fun toDuration (DLkotlin/time/DurationUnit;)J
public static final fun toDuration (ILkotlin/time/DurationUnit;)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 {