|
| 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