Skip to content

Commit

Permalink
Added pre filtered Rx listeners for convenience
Browse files Browse the repository at this point in the history
  • Loading branch information
ToxicBakery committed May 31, 2019
1 parent 58c5af8 commit b369e8c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.toxicbakery.kfinstatemachine

import com.toxicbakery.kfinstatemachine.TransitionEvent.*
import com.toxicbakery.kfinstatemachine.TransitionEvent.EnterTransition
import com.toxicbakery.kfinstatemachine.TransitionEvent.ExitTransition
import io.reactivex.Observable
import io.reactivex.ObservableEmitter

Expand All @@ -14,6 +15,16 @@ val <S, T : Any> StateMachine<S, T>.stateObservable: Observable<TransitionEvent<
emitter.setCancellable { unregisterCallback(rxCallback) }
}

inline val <S, T : Any> StateMachine<S, T>.enterTransitionObservable: Observable<EnterTransition<S, T>>
get() = stateObservable
.filter { event -> event is EnterTransition<S, T> }
.map { event -> event as EnterTransition<S, T> }

inline val <S, T : Any> StateMachine<S, T>.exitTransitionObservable: Observable<ExitTransition<S, T>>
get() = stateObservable
.filter { event -> event is ExitTransition<S, T> }
.map { event -> event as ExitTransition<S, T> }

sealed class TransitionEvent<S, T : Any> {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import com.toxicbakery.kfinstatemachine.RxStateMachineTest.Energy.Potential
import com.toxicbakery.kfinstatemachine.RxStateMachineTest.EnergyTransition.Release
import com.toxicbakery.kfinstatemachine.RxStateMachineTest.EnergyTransition.Store
import com.toxicbakery.kfinstatemachine.StateMachine.Companion.transition
import com.toxicbakery.kfinstatemachine.TransitionEvent.ExitTransition
import org.junit.Assert.assertEquals
import org.junit.Test

Expand All @@ -28,19 +27,21 @@ class RxStateMachineTest {
transition(Potential, Release::class, Kinetic),
transition(Kinetic, Store::class, Potential))

var currentState: Energy = stateMachine.state
var lastEnterState: Energy = stateMachine.state
var lastExitState: Energy = stateMachine.state

val disposable = stateMachine.stateObservable
.filter { event -> event is ExitTransition }
.map { event -> event as ExitTransition<Energy, EnergyTransition> }
val enterDisposable = stateMachine.enterTransitionObservable
.map { event -> event.currentState }
.subscribe { state -> currentState = state }
.subscribe { state -> lastEnterState = state }

assertEquals(Potential, currentState)
val exitDisposable = stateMachine.exitTransitionObservable
.map { event -> event.currentState }
.subscribe { state -> lastExitState = state }

// Transition to kinetic and verify the states
stateMachine.transition(Release)
assertEquals(Kinetic, currentState)
assertEquals(Potential, lastEnterState)
assertEquals(Kinetic, lastExitState)

assertEquals(
setOf(Store::class),
Expand All @@ -52,7 +53,8 @@ class RxStateMachineTest {

// Transition back to potential and verify the states
stateMachine.transition(Store)
assertEquals(Potential, currentState)
assertEquals(Kinetic, lastEnterState)
assertEquals(Potential, lastExitState)

assertEquals(
setOf(Release::class),
Expand All @@ -63,8 +65,9 @@ class RxStateMachineTest {
stateMachine.transitionsTo(Kinetic))

// Cleanup
disposable.dispose()

assertEquals(2, stateMachine.transitionCallbacks.size)
enterDisposable.dispose()
exitDisposable.dispose()
assertEquals(0, stateMachine.transitionCallbacks.size)
}

Expand Down

0 comments on commit b369e8c

Please sign in to comment.