diff --git a/src/main/kotlin/com/tinder/StateMachine.kt b/src/main/kotlin/com/tinder/StateMachine.kt index 34dc053..4b785c7 100644 --- a/src/main/kotlin/com/tinder/StateMachine.kt +++ b/src/main/kotlin/com/tinder/StateMachine.kt @@ -51,8 +51,7 @@ class StateMachine private construc private fun STATE.getDefinition() = graph.stateDefinitions .filter { it.key.matches(this) } .map { it.value } - .firstOrNull() - .let { checkNotNull(it) } + .firstOrNull() ?: error("Missing definition for state ${this.javaClass.simpleName}!") private fun STATE.notifyOnEnter(cause: EVENT) { getDefinition().onEnterListeners.forEach { it(this, cause) } diff --git a/src/test/kotlin/com/tinder/StateMachineTest.kt b/src/test/kotlin/com/tinder/StateMachineTest.kt index b25a8ca..5d6e579 100644 --- a/src/test/kotlin/com/tinder/StateMachineTest.kt +++ b/src/test/kotlin/com/tinder/StateMachineTest.kt @@ -698,6 +698,27 @@ internal class StateMachineTest { } } + class WithMissingStateDefinition { + + private val stateMachine = StateMachine.create { + initialState(STATE_A) + state(STATE_A) { + on(EVENT_1) { + transitionTo(STATE_B) + } + } + // Missing STATE_B definition. + } + + @Test + fun transition_givenMissingDestinationStateDefinition_shouldThrowIllegalStateExceptionWithStateName() { + // Then + assertThatIllegalStateException() + .isThrownBy { stateMachine.transition(EVENT_1) } + .withMessage("Missing definition for state ${STATE_B.javaClass.simpleName}!") + } + } + private companion object { private const val STATE_A = "a" private const val STATE_B = "b"