Skip to content

Commit bb35577

Browse files
committed
Add isStartTransition method
1 parent da0297a commit bb35577

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

kstatemachine/src/commonMain/kotlin/ru/nsk/kstatemachine/transition/TransitionParams.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package ru.nsk.kstatemachine.transition
99

1010
import ru.nsk.kstatemachine.event.Event
11+
import ru.nsk.kstatemachine.event.StartEvent
1112
import ru.nsk.kstatemachine.event.WrappedEvent
1213
import ru.nsk.kstatemachine.statemachine.StateMachineDslMarker
1314

@@ -35,4 +36,12 @@ val TransitionParams<*>.unwrappedEvent get() = if (event is WrappedEvent) event.
3536
* Convenience property for unwrapping original argument.
3637
* If the event is not [WrappedEvent] this is same as [TransitionParams.argument] property
3738
*/
38-
val TransitionParams<*>.unwrappedArgument get() = if (event is WrappedEvent) event.argument else argument
39+
val TransitionParams<*>.unwrappedArgument get() = if (event is WrappedEvent) event.argument else argument
40+
41+
/**
42+
* Returns true is the transition is triggered by [StartEvent].
43+
* This means that the StateMachine is starting.
44+
* Might be useful to check if you're entering some State just by a machine startup
45+
* or by outside event.
46+
*/
47+
val TransitionParams<*>.isStartTransition get() = event is StartEvent

tests/src/commonTest/kotlin/ru/nsk/kstatemachine/statemachine/StateMachineTest.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.kotest.assertions.throwables.shouldThrowUnitWithMessage
1212
import io.kotest.assertions.throwables.shouldThrowWithMessage
1313
import io.kotest.core.spec.style.FreeSpec
1414
import io.kotest.datatest.withData
15+
import io.kotest.matchers.collections.shouldContain
1516
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
1617
import io.kotest.matchers.shouldBe
1718
import io.kotest.matchers.string.shouldEndWith
@@ -26,10 +27,7 @@ import ru.nsk.kstatemachine.state.*
2627
import ru.nsk.kstatemachine.statemachine.StateMachineTestData.OffEvent
2728
import ru.nsk.kstatemachine.statemachine.StateMachineTestData.OnEvent
2829
import ru.nsk.kstatemachine.testing.Testing.startFromBlocking
29-
import ru.nsk.kstatemachine.transition.DefaultTransition
30-
import ru.nsk.kstatemachine.transition.Transition
31-
import ru.nsk.kstatemachine.transition.TransitionType
32-
import ru.nsk.kstatemachine.transition.onTriggered
30+
import ru.nsk.kstatemachine.transition.*
3331

3432
private object StateMachineTestData {
3533
object OnEvent : Event
@@ -363,6 +361,22 @@ class StateMachineTest : FreeSpec({
363361
}
364362
}
365363

364+
"isStartTransition" {
365+
lateinit var state2: State
366+
val machine = createTestStateMachine(coroutineStarterType) {
367+
state2 = state("state2") {
368+
onEntry { it.isStartTransition shouldBe false }
369+
}
370+
initialState("initial") {
371+
onEntry { it.isStartTransition shouldBe true }
372+
transitionOn<SwitchEvent> { targetState = { state2 } }
373+
}
374+
onStarted { it.isStartTransition shouldBe true }
375+
}
376+
machine.processEvent(SwitchEvent)
377+
machine.activeStates().shouldContain(state2)
378+
}
379+
366380
"destroy from onStart" {
367381
val callbacks = mockkCallbacks()
368382
val machine = createTestStateMachine(coroutineStarterType) {

0 commit comments

Comments
 (0)