fixes in parsing of ktontab templates

This commit is contained in:
InsanusMokrassar 2024-11-06 08:46:10 +06:00
parent 58917c6458
commit c76ca1798e
3 changed files with 91 additions and 78 deletions

View File

@ -2,6 +2,8 @@
## 2.6.1 ## 2.6.1
* Fixes in parsing of string parts
## 2.6.0 ## 2.6.0
* Fix of `doOnceTz` behaviour: now it will use local time as utc time to get next waking up time * Fix of `doOnceTz` behaviour: now it will use local time as utc time to get next waking up time

View File

@ -41,53 +41,80 @@ private fun <T> createSimpleScheduler(from: String, dataRange: IntRange, dataCon
* FSM for parsing of incoming data. If at the end of parsing it have non-null state and string is not empty, data passed check * FSM for parsing of incoming data. If at the end of parsing it have non-null state and string is not empty, data passed check
* *
* 1. * 1.
* * \\d -> 1 * * "\\d" -> 2
* * \\* -> 2 * * "\\*" -> 4
* * \\- -> 5 * * "f" -> 7
* * , -> 1 * * "l" -> 7
* * m -> 6 * * "/" -> 6
* * o -> 7
* * w -> 7
* 2. * 2.
* * / -> 3 * * "\\d" -> 2
* * "/" -> 6
* * "," -> 1
* * "-" -> 3
* * "m" -> 9
* * "o" -> 10
* * "w" -> 10
* 3. * 3.
* * \\d -> 3 * * "l" -> 7
* * \\* -> 4 * * "\\d" -> 8
* 4. * 4.
* * , -> 1 * * "/" -> 6
* * "," -> 1
* 5. * 5.
* * \\d -> 5 * * "/" -> 6
* * , -> 1
* 6. * 6.
* * s -> 7 * * "\\d" -> 8
* 7. Empty, end of parse * * "\\*" -> 7
* 7.
* * "," -> 1
* 8.
* * "\\d" -> 8
* * "," -> 1
* 9.
* * "s" -> 10 // end of ms
* 10. Empty, end of parse
*/ */
private val checkIncomingPartTransitionsMap = listOf( private val checkIncomingPartTransitionsMap = listOf(
listOf( listOf( // 0
Regex("\\d") to 0, Regex("\\d") to 1,
Regex("\\*") to 1,
Regex("-") to 4,
Regex(",") to 0,
Regex("m") to 5,
Regex("o") to 6,
Regex("w") to 6,
),
listOf(
Regex("/") to 2,
),
listOf(
Regex("\\d") to 2,
Regex("\\*") to 3, Regex("\\*") to 3,
Regex("f") to 6,
Regex("l") to 6,
Regex("/") to 5,
), ),
listOf( listOf( // 1
Regex("\\d") to 1,
Regex("/") to 5,
Regex(",") to 0,
Regex("-") to 2,
Regex("m") to 8,
Regex("o") to 9,
Regex("w") to 9,
),
listOf( // 2
Regex("l") to 6,
Regex("\\d") to 7,
),
listOf( // 3
Regex("/") to 5,
Regex(",") to 0, Regex(",") to 0,
), ),
listOf( listOf( // 4
Regex("\\d") to 4, Regex("/") to 5,
),
listOf( // 5
Regex("\\d") to 7,
Regex("\\*") to 6,
),
listOf( // 6
Regex(",") to 0, Regex(",") to 0,
), ),
listOf( listOf( // 7
Regex("s") to 6, // end of ms Regex("\\d") to 7,
Regex(",") to 0,
),
listOf( // 8
Regex("s") to 9, // end of ms
), ),
listOf(), // empty state, end of parsing listOf(), // empty state, end of parsing
) )

View File

@ -2,6 +2,7 @@ package dev.inmo.krontab.utils
import korlibs.time.* import korlibs.time.*
import dev.inmo.krontab.KronSchedulerTz import dev.inmo.krontab.KronSchedulerTz
import dev.inmo.krontab.KrontabTemplate
import dev.inmo.krontab.buildSchedule import dev.inmo.krontab.buildSchedule
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.flow.takeWhile
@ -11,73 +12,51 @@ import kotlin.test.*
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
@FlowPreview @FlowPreview
class StringParseTest { class StringParseTest {
@Test private fun makeSimpleEverySecondTest(template: KrontabTemplate) {
fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnString() { val kronScheduler = buildSchedule(template)
val kronScheduler = buildSchedule("*/1 * * * *")
val flow = kronScheduler.asFlowWithoutDelays() val flow = kronScheduler.asFlowWithoutDelays()
runTest { runTest {
val mustBeCollected = 10 val mustBeCollected = 10
var collected = 0 var collected = 0
var previousTime: DateTime? = null
flow.takeWhile { flow.takeWhile {
collected < mustBeCollected collected < mustBeCollected
}.collect { }.collect {
previousTime ?.let { previousTime ->
assertEquals(previousTime + 1.seconds, it)
}
previousTime = it
collected++ collected++
} }
assertEquals(mustBeCollected, collected) assertEquals(mustBeCollected, collected)
} }
} }
@Test
fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnString() {
makeSimpleEverySecondTest("*/1 * * * *")
}
@Test @Test
fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithWrongAmountOfSpaces() { fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithWrongAmountOfSpaces() {
val kronScheduler = buildSchedule("*/1 * * * * ") val templatesFirstReplacers = listOf(
"*/1",
val flow = kronScheduler.asFlowWithoutDelays() "*",
"/1",
runTest { "f,/1",
val mustBeCollected = 10 )
var collected = 0 templatesFirstReplacers.forEach { replacer ->
flow.takeWhile { makeSimpleEverySecondTest("$replacer * * * * ")
collected < mustBeCollected
}.collect {
collected++
}
assertEquals(mustBeCollected, collected)
} }
} }
@Test @Test
fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithGarbageInTemplate() { fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithGarbageInTemplate() {
val kronScheduler = buildSchedule(" sdf */1 * * * oo * ") makeSimpleEverySecondTest(" sdf */1 * * * oo * ")
val flow = kronScheduler.asFlowWithoutDelays()
runTest {
val mustBeCollected = 10
var collected = 0
flow.takeWhile {
collected < mustBeCollected
}.collect {
collected++
}
assertEquals(mustBeCollected, collected)
}
} }
@Test @Test
fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithInsufficientArgsInTemplate() { fun testThatFlowIsCorrectlyWorkEverySecondBuiltOnStringWithInsufficientArgsInTemplate() {
val kronScheduler = buildSchedule(" sdf */1 ") makeSimpleEverySecondTest(" sdf */1 ")
val flow = kronScheduler.asFlowWithoutDelays()
runTest {
val mustBeCollected = 10
var collected = 0
flow.takeWhile {
collected < mustBeCollected
}.collect {
collected++
}
assertEquals(mustBeCollected, collected)
}
} }
@Test @Test
fun testThatFlowIsCorrectlyWorkEverySecondWhenMillisIsHalfOfSecondBuiltOnString() { fun testThatFlowIsCorrectlyWorkEverySecondWhenMillisIsHalfOfSecondBuiltOnString() {
@ -88,9 +67,14 @@ class StringParseTest {
runTest { runTest {
val mustBeCollected = 10 val mustBeCollected = 10
var collected = 0 var collected = 0
var previousTime: DateTime? = null
flow.takeWhile { flow.takeWhile {
collected < mustBeCollected collected < mustBeCollected
}.collect { }.collect {
previousTime ?.let { previousTime ->
assertEquals(previousTime.copy(milliseconds = 500) + 1.seconds, it)
}
previousTime = it
collected++ collected++
} }
assertEquals(mustBeCollected, collected) assertEquals(mustBeCollected, collected)