1+ /*
2+ * Copyright 2019-2023 JetBrains s.r.o. and contributors.
3+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+ */
5+
6+ package kotlinx.datetime.test
7+
8+ import kotlinx.datetime.*
9+ import kotlin.test.*
10+ import kotlin.time.*
11+ import kotlin.time.Duration.Companion.days
12+ import kotlin.time.Duration.Companion.nanoseconds
13+
14+ @OptIn(ExperimentalTime ::class )
15+ class ClockTimeSourceTest {
16+ @Test
17+ fun arithmetic () {
18+ val timeSource = Clock .System .asTimeSource()
19+ val mark0 = timeSource.markNow()
20+
21+ val markPast = mark0 - 1 .days
22+ val markFuture = mark0 + 1 .days
23+
24+ assertTrue(markPast < mark0)
25+ assertTrue(markFuture > mark0)
26+ assertEquals(mark0, markPast + 1 .days)
27+ assertEquals(2 .days, markFuture - markPast)
28+ }
29+
30+ @Test
31+ fun elapsed () {
32+ val clock = object : Clock {
33+ var instant = Clock .System .now()
34+ override fun now (): Instant = instant
35+ }
36+ val timeSource = clock.asTimeSource()
37+ val mark = timeSource.markNow()
38+ assertEquals(Duration .ZERO , mark.elapsedNow())
39+
40+ clock.instant + = 1 .days
41+ assertEquals(1 .days, mark.elapsedNow())
42+
43+ clock.instant - = 2 .days
44+ assertEquals(- 1 .days, mark.elapsedNow())
45+
46+ clock.instant = Instant .MAX
47+ assertEquals(Duration .INFINITE , mark.elapsedNow())
48+ }
49+
50+ @Test
51+ fun differentSources () {
52+ val mark1 = Clock .System .asTimeSource().markNow()
53+ val mark2 = object : Clock {
54+ override fun now (): Instant = Instant .DISTANT_FUTURE
55+ }.asTimeSource().markNow()
56+ assertNotEquals(mark1, mark2)
57+ assertFailsWith<IllegalArgumentException > { mark1 - mark2 }
58+ assertFailsWith<IllegalArgumentException > { mark1 compareTo mark2 }
59+ }
60+
61+ @Test
62+ fun saturation () {
63+ val mark0 = Clock .System .asTimeSource().markNow()
64+
65+ val markFuture = mark0 + Duration .INFINITE
66+ val markPast = mark0 - Duration .INFINITE
67+
68+ for (delta in listOf (Duration .ZERO , 1 .nanoseconds, 1 .days)) {
69+ assertEquals(markFuture, markFuture - delta)
70+ assertEquals(markFuture, markFuture + delta)
71+
72+ assertEquals(markPast, markPast - delta)
73+ assertEquals(markPast, markPast + delta)
74+ }
75+ val infinitePairs = listOf (markFuture to markPast, markFuture to mark0, mark0 to markPast)
76+ for ((later, earlier) in infinitePairs) {
77+ assertEquals(Duration .INFINITE , later - earlier)
78+ assertEquals(- Duration .INFINITE , earlier - later)
79+ }
80+ assertEquals(Duration .ZERO , markFuture - markFuture)
81+ assertEquals(Duration .ZERO , markPast - markPast)
82+
83+ assertFailsWith<IllegalArgumentException > { markFuture - Duration .INFINITE }
84+ assertFailsWith<IllegalArgumentException > { markPast + Duration .INFINITE }
85+ }
86+ }
0 commit comments