From d8ed07da98a4efbeb8ccccee03d2577f4d445495 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 3 Jun 2020 22:04:05 +0600 Subject: [PATCH] new buildSchedule function and tests for string parsing --- CHANGELOG.md | 4 ++ .../insanusmokrassar/krontab/StringParser.kt | 7 ++- .../krontab/utils/StringParseTest.kt | 63 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index d2c4528..0524856 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,11 @@ * Kotlin `1.3.70` -> `1.3.72` * Coroutines `1.3.5` -> `1.3.7` * Klock `1.10.0` -> `1.11.3` +* A lot of KDocs added and fixed * `EverySecondScheduler` changed its building logic - now it is lazy with builder using +* `KronScheduler#doOnce` was optimized: now it will be explicitly called once and return result of its calculations + * `KronScheduler#doWhile` was rewritten to use `KronScheduler#doOnce` for calculations of `block` result +* New `buildSchedule(String)` function as a shortcut for `createSimpleScheduler(String)` ### 0.2.2 diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt index af5f0d7..fffb1a3 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt @@ -50,4 +50,9 @@ fun createSimpleScheduler(incoming: String): KronScheduler { return createKronScheduler( secondsParsed, minutesParsed, hoursParsed, dayOfMonthParsed, monthParsed ) -} \ No newline at end of file +} + +/** + * + */ +fun buildSchedule(incoming: String): KronScheduler = createSimpleScheduler(incoming) \ No newline at end of file diff --git a/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt new file mode 100644 index 0000000..406852a --- /dev/null +++ b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt @@ -0,0 +1,63 @@ +package com.insanusmokrassar.krontab.utils + +import com.insanusmokrassar.krontab.buildSchedule +import com.insanusmokrassar.krontab.builder.buildSchedule +import com.insanusmokrassar.krontab.createSimpleScheduler +import com.soywiz.klock.DateTime +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.takeWhile +import kotlin.test.Test +import kotlin.test.assertEquals + +@ExperimentalCoroutinesApi +@FlowPreview +class StringParseTest { + @Test + fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnString() { + val kronScheduler = buildSchedule("*/1 * * * *") + + val flow = kronScheduler.asFlow() + + runTest { + val mustBeCollected = 10 + var collected = 0 + flow.takeWhile { + collected < mustBeCollected + }.collect { + collected++ + } + assertEquals(mustBeCollected, collected) + } + } + + @Test + fun testThatFlowIsCorrectlyWorkEverySecondWithMuchOfEmittersBuiltOnString() { + val kronScheduler = buildSchedule("*/1 * * * *") + + val flow = kronScheduler.asFlow() + + runTest { + val testsCount = 10 + val failJob = it.createFailJob((testsCount * 2) * 1000L) + val mustBeCollected = 10 + val answers = (0 until testsCount).map { _ -> + it.async { + var collected = 0 + flow.takeWhile { + collected < mustBeCollected + }.collect { + collected++ + } + collected + } + }.awaitAll() + + failJob.cancel() + + answers.forEach { + assertEquals(mustBeCollected, it) + } + } + } +}