Skip to content

Commit 2efd7e6

Browse files
fixes in built-in schedulers
1 parent 6845537 commit 2efd7e6

File tree

4 files changed

+88
-15
lines changed

4 files changed

+88
-15
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* `Kotlin`: `1.9.23`
77
* `Serialization`: `1.6.3`
88
* `Klock`: `5.3.2`
9+
* Fixes in build-in schedulers
910

1011
## 2.2.8
1112

src/commonMain/kotlin/SchedulerShortcuts.kt

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,35 +34,60 @@ val EverySecondScheduler: KronScheduler by lazy {
3434
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one minute
3535
*/
3636
val EveryMinuteScheduler: KronScheduler by lazy {
37-
buildSchedule { minutes { 0 every 1 } }
37+
buildSchedule {
38+
seconds { at(0) }
39+
minutes { 0 every 1 }
40+
}
3841
}
3942

4043
/**
4144
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one hour
4245
*/
4346
val EveryHourScheduler: KronScheduler by lazy {
44-
buildSchedule { hours { 0 every 1 } }
47+
buildSchedule {
48+
seconds { at(0) }
49+
minutes { at(0) }
50+
hours { 0 every 1 }
51+
}
4552
}
4653

4754
/**
4855
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one day
4956
*/
5057
val EveryDayOfMonthScheduler: KronScheduler by lazy {
51-
buildSchedule { dayOfMonth { 0 every 1 } }
58+
buildSchedule {
59+
seconds { at(0) }
60+
minutes { at(0) }
61+
hours { at(0) }
62+
dayOfMonth { 0 every 1 }
63+
}
5264
}
5365

5466
/**
5567
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one month
5668
*/
5769
val EveryMonthScheduler: KronScheduler by lazy {
58-
buildSchedule { months { 0 every 1 } }
70+
buildSchedule {
71+
seconds { at(0) }
72+
minutes { at(0) }
73+
hours { at(0) }
74+
dayOfMonth { at(0) }
75+
months { 0 every 1 }
76+
}
5977
}
6078

6179
/**
6280
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one year
6381
*/
6482
val EveryYearScheduler: KronScheduler by lazy {
65-
buildSchedule { years { 0 every 1 } }
83+
buildSchedule {
84+
seconds { at(0) }
85+
minutes { at(0) }
86+
hours { at(0) }
87+
dayOfMonth { at(0) }
88+
months { at(0) }
89+
years { 0 every 1 }
90+
}
6691
}
6792

6893
/**

src/commonMain/kotlin/builder/SchedulerBuilder.kt

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,24 @@ class SchedulerBuilder(
182182
*/
183183
fun build(): KronScheduler = offset ?.let {
184184
createKronSchedulerWithOffset(
185-
seconds,
186-
minutes,
187-
hours,
188-
dayOfMonth,
189-
month,
190-
year,
191-
dayOfWeek,
192-
TimezoneOffset(it.minutes),
193-
milliseconds ?: millisecondsArrayDefault
185+
seconds = seconds,
186+
minutes = minutes,
187+
hours = hours,
188+
dayOfMonth = dayOfMonth,
189+
month = month,
190+
years = year,
191+
weekDays = dayOfWeek,
192+
offset = TimezoneOffset(it.minutes),
193+
milliseconds = milliseconds ?: millisecondsArrayDefault
194194
)
195-
} ?: createKronScheduler(seconds, minutes, hours, dayOfMonth, month, year, dayOfWeek, milliseconds ?: millisecondsArrayDefault)
195+
} ?: createKronScheduler(
196+
seconds = seconds,
197+
minutes = minutes,
198+
hours = hours,
199+
dayOfMonth = dayOfMonth,
200+
month = month,
201+
years = year,
202+
weekDays = dayOfWeek,
203+
milliseconds = milliseconds ?: millisecondsArrayDefault
204+
)
196205
}

src/commonTest/kotlin/BuildersTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package dev.inmo.krontab.utils
2+
3+
import dev.inmo.krontab.*
4+
import korlibs.time.*
5+
import kotlinx.coroutines.test.runTest
6+
import kotlin.test.Test
7+
import kotlin.test.assertEquals
8+
import kotlin.time.Duration.Companion.milliseconds
9+
import kotlin.time.Duration.Companion.minutes
10+
import kotlin.time.Duration.Companion.seconds
11+
12+
class BuildersTest {
13+
@Test
14+
fun presetsWorksCorrectly() {
15+
val data = mapOf(
16+
EverySecondScheduler to { it: DateTime -> if (it.milliseconds > 0 ) it + 1.seconds - it.milliseconds.milliseconds else it },
17+
EveryMinuteScheduler to { it: DateTime -> if (it.seconds > 0 || it.milliseconds > 0 ) it + 1.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
18+
EveryHourScheduler to { it: DateTime -> if (it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) it + 1.hours - it.minutes.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
19+
EveryDayOfMonthScheduler to { it: DateTime -> if (it.hours > 0 || it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) it + 1.days - it.hours.hours - it.minutes.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
20+
EveryMonthScheduler to { it: DateTime -> if (it.dayOfMonth > 1 || it.hours > 0 || it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) (it + 1.months).copy(dayOfMonth = 1, hour = 0, minute = 0, second = 0, milliseconds = 0) else it },
21+
)
22+
val samples = 10000
23+
24+
runTest {
25+
var now = DateTime.now()
26+
for (i in 0 until samples) {
27+
data.forEach { (scheduler, expectCalculator) ->
28+
val expectValue = expectCalculator(now)
29+
val newNow = scheduler.nextOrRelative(now)
30+
31+
assertEquals(expectValue, newNow, "For time ${now.toStringDefault()} calculated wrong value: ${newNow.toStringDefault()} is not equal to ${expectValue.toStringDefault()}")
32+
33+
now = newNow
34+
}
35+
}
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)