Skip to content

Commit 68cb682

Browse files
authored
Merge pull request #921 from yadavan88/kotin-durations
Code samples for Kotlin Durations
2 parents 789bf0a + 05d5de2 commit 68cb682

File tree

1 file changed

+122
-0
lines changed
  • core-kotlin-modules/core-kotlin-date-time/src/test/kotlin/com/baeldung/duration

1 file changed

+122
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package com.baeldung.duration
2+
3+
import org.junit.jupiter.api.Test
4+
import java.time.LocalDateTime
5+
import kotlin.test.assertEquals
6+
import kotlin.test.assertFalse
7+
import kotlin.test.assertTrue
8+
import kotlin.time.*
9+
import kotlin.time.Duration.Companion.hours
10+
import kotlin.time.Duration.Companion.milliseconds
11+
import kotlin.time.Duration.Companion.minutes
12+
import kotlin.time.Duration.Companion.seconds
13+
import java.time.Duration as JavaDuration
14+
import kotlinx.coroutines.delay
15+
import kotlinx.coroutines.runBlocking
16+
import kotlin.time.Duration
17+
import kotlin.time.ExperimentalTime
18+
19+
class DurationUnitTest {
20+
@Test
21+
fun `given numeric values, create duration instance using companion`() {
22+
val tenMinutes = 10.minutes
23+
assertEquals(10L, tenMinutes.inWholeMinutes)
24+
assertEquals(600L, tenMinutes.inWholeSeconds)
25+
val tenSeconds = 10.seconds
26+
assertEquals(10L, tenSeconds.inWholeSeconds)
27+
val zero = Duration.ZERO
28+
assertEquals(0L, zero.inWholeMicroseconds)
29+
}
30+
31+
@Test
32+
fun `given numeric values, create duration instance using toDuration and unit`() {
33+
val tenMinutes = 10.toDuration(DurationUnit.MINUTES)
34+
assertEquals(10L, tenMinutes.inWholeMinutes)
35+
assertEquals(600L, tenMinutes.inWholeSeconds)
36+
val tenSeconds = 10.toDuration(DurationUnit.SECONDS)
37+
assertEquals(10L, tenSeconds.inWholeSeconds)
38+
val zero = Duration.ZERO
39+
assertEquals(0L, zero.inWholeMicroseconds)
40+
val infinite = Duration.INFINITE
41+
assertEquals(true, infinite.isInfinite())
42+
}
43+
44+
@Test
45+
fun `given ISO8601 string values, create duration instance`() {
46+
val tenMinDuration = Duration.parseIsoString("PT10M")
47+
assertEquals(600L, tenMinDuration.inWholeSeconds)
48+
assertEquals("PT10M", tenMinDuration.toIsoString())
49+
val tenDays = Duration.parseIsoString("P10D")
50+
assertEquals(10L, tenDays.inWholeDays)
51+
val tenDaysAndOneHour = Duration.parseIsoString("P10DT1H")
52+
assertEquals(241L, tenDaysAndOneHour.inWholeHours)
53+
assertEquals("PT241H", tenDaysAndOneHour.toIsoString())
54+
val tenDaysWithAllUnits = Duration.parseIsoString("P10DT1H5M7S")
55+
assertEquals(867907L, tenDaysWithAllUnits.inWholeSeconds)
56+
}
57+
58+
@Test
59+
fun `given a duration, convert into java duration`() {
60+
val sixHundredSeconds = 600.seconds
61+
val javaDuration: java.time.Duration = sixHundredSeconds.toJavaDuration()
62+
val javaDurationInst = JavaDuration.ofSeconds(600)
63+
assertEquals(javaDuration, javaDurationInst)
64+
}
65+
66+
@Test
67+
fun `given two different durations, combine them into single duration`() {
68+
val tenMinutes = 10.minutes
69+
val fiveHours = 5.hours
70+
val fiveHoursPlusTenMin = tenMinutes + fiveHours
71+
assertEquals(310L, fiveHoursPlusTenMin.inWholeMinutes)
72+
val fiveHoursMinusTenMin = fiveHours - tenMinutes
73+
assertEquals(290L, fiveHoursMinusTenMin.inWholeMinutes)
74+
val timesMinutes = tenMinutes.times(3)
75+
assertEquals(30L, timesMinutes.inWholeMinutes)
76+
val sixSecs = tenMinutes.div(100)
77+
assertEquals(6, sixSecs.inWholeSeconds)
78+
}
79+
80+
@Test
81+
fun `given two different durations, check if they are equal`() {
82+
val tenMinutes = 10.minutes
83+
val sixHundredSeconds = 600.seconds
84+
assert(tenMinutes == sixHundredSeconds)
85+
}
86+
87+
@Test
88+
fun `given two different durations, compare them`() {
89+
val tenMinutes = 10.minutes
90+
val fiveHours = 5.hours
91+
assertTrue { fiveHours > tenMinutes }
92+
assertFalse { fiveHours < tenMinutes }
93+
assertTrue { fiveHours == 300.minutes }
94+
assertTrue { fiveHours.isPositive() }
95+
}
96+
97+
@Test
98+
fun `given a duration, break down into smaller parts`() {
99+
val seventyMinutes = 70.minutes
100+
val asStr = seventyMinutes.toComponents { hrs, min, sec, nanos -> "${hrs}:${min}" }
101+
assertEquals("1:10", asStr)
102+
}
103+
104+
@Test
105+
fun `given a two datetime, calculate the duration between them`() {
106+
val datetime1 = LocalDateTime.now()
107+
val datetime2 = datetime1.minusDays(1).minusHours(1)
108+
val duration = java.time.Duration.between(datetime2, datetime1).toKotlinDuration()
109+
val expectedDuration = 25.hours
110+
assertEquals(expectedDuration, duration)
111+
}
112+
113+
@OptIn(ExperimentalTime::class)
114+
@Test
115+
fun `use duration api to measure execution time`() {
116+
val operationDuration = kotlin.time.measureTime {
117+
Thread.sleep(510)
118+
}
119+
assertTrue(operationDuration > 500.milliseconds)
120+
}
121+
122+
}

0 commit comments

Comments
 (0)