Skip to content

Commit

Permalink
#47: Clearing Loaders onCleared of Play01ViewModel
Browse files Browse the repository at this point in the history
  • Loading branch information
Entreco committed Jul 17, 2018
1 parent 01a72e3 commit 84656ce
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package nl.entreco.dartsscorecard.play

import android.databinding.ObservableBoolean
import android.databinding.ObservableInt
import android.support.annotation.StringRes
import android.view.Menu
import android.view.MenuItem
import nl.entreco.dartsscorecard.R
Expand All @@ -11,6 +12,7 @@ import nl.entreco.dartsscorecard.base.DialogHelper
import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier
import nl.entreco.dartsscorecard.play.score.TeamScoreListener
import nl.entreco.dartsscorecard.play.score.UiCallback
import nl.entreco.domain.Analytics
import nl.entreco.domain.common.log.Logger
import nl.entreco.domain.model.*
import nl.entreco.domain.model.players.Player
Expand All @@ -20,6 +22,7 @@ import nl.entreco.domain.play.mastercaller.MasterCaller
import nl.entreco.domain.play.mastercaller.MasterCallerRequest
import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase
import nl.entreco.domain.play.revanche.RevancheRequest
import nl.entreco.domain.play.revanche.RevancheResponse
import nl.entreco.domain.play.revanche.RevancheUsecase
import nl.entreco.domain.play.start.MarkGameAsFinishedRequest
import nl.entreco.domain.play.start.Play01Request
Expand Down Expand Up @@ -51,48 +54,47 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
private lateinit var game: Game
private lateinit var request: Play01Request
private lateinit var teams: Array<Team>
private lateinit var load: GameLoadedNotifier<ScoreSettings>
private lateinit var loaders: Array<GameLoadedNotifier<Play01Response>>
private var load: GameLoadedNotifier<ScoreSettings>? = null
private var loaders: Array<GameLoadedNotifier<Play01Response>>? = null

fun load(request: Play01Request, load: GameLoadedNotifier<ScoreSettings>, vararg loaders: GameLoadedNotifier<Play01Response>) {
this.request = request
this.load = load
this.loaders = arrayOf(*loaders)
this.playGameUsecase.loadGameAndStart(request,
{ response ->
this.game = response.game
this.teams = response.teams
this.load.onLoaded(response.teams, game.scores, response.settings, this)
this.loaders.forEach {
it.onLoaded(response.teams, game.scores, response, null)
}
onGameOk(request, response, null)
},
{ err ->
logger.e("err: $err")
loading.set(false)
errorMsg.set(R.string.err_unable_to_retrieve_game)
})
onGameFailed(R.string.err_unable_to_retrieve_game))
}

override fun onRevanche() {
dialogHelper.revanche(request.startIndex, teams) { startIndex ->
val nextTeam = (startIndex) % teams.size
revancheUsecase.recreateGameAndStart(RevancheRequest(request, teams, nextTeam),
{ response ->
this.request = this.request.copy(gameId = response.game.id, startIndex = nextTeam)
this.game = response.game
this.teams = response.teams
this.load.onLoaded(response.teams, game.scores, response.settings, this)
this.loaders.forEach {
val playResponse = Play01Response(response.game, response.settings, response.teams, response.teamIds)
it.onLoaded(response.teams, game.scores, playResponse, null)
}
{ revenge ->
onGameOk(this.request.copy(gameId = revenge.game.id, startIndex = nextTeam), null, revenge)
},
{ err ->
logger.e("err: $err")
loading.set(false)
errorMsg.set(R.string.err_unable_to_revanche)
})
onGameFailed(R.string.err_unable_to_revanche))
}
}

private fun onGameOk(request: Play01Request, response: Play01Response?, revancheResponse: RevancheResponse?) {
this.request = request
this.game = response?.game ?: revancheResponse!!.game
this.teams = response?.teams ?: revancheResponse!!.teams
val teamIds = response?.teamIds ?: revancheResponse!!.teamIds
val settings = response?.settings ?: revancheResponse!!.settings
this.load?.onLoaded(teams, game.scores, settings, this)
this.loaders?.forEach {
it.onLoaded(teams, game.scores, response ?: Play01Response(game, settings, teams, teamIds), null)
}
}

private fun onGameFailed(@StringRes error: Int): (Throwable) -> Unit {
return { err ->
logger.e("err: $err")
loading.set(false)
errorMsg.set(error)
}
}

Expand Down Expand Up @@ -120,7 +122,7 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
private fun undoSuccess(): (UndoTurnResponse) -> Unit {
return {
logger.i("Undo done! -> go to Let's Play Darts Function")
load(request, load, *loaders)
load(request, load!!, *loaders!!)
}
}

Expand Down Expand Up @@ -187,8 +189,7 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
State.LEG -> adViewModel.provideInterstitial()
State.SET -> adViewModel.provideInterstitial()
State.MATCH -> adViewModel.provideInterstitial()
else -> {
}
else -> { /* ignore */ }
}
}

Expand All @@ -204,4 +205,10 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
item.isChecked = !item.isChecked
toggleSoundUsecase.toggle()
}

override fun onCleared() {
load = null
loaders = null
super.onCleared()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import nl.entreco.dartsscorecard.base.DialogHelper
import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier
import nl.entreco.domain.common.log.Logger
import nl.entreco.domain.model.Game
import nl.entreco.domain.model.players.Team
import nl.entreco.domain.play.mastercaller.MasterCaller
import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase
import nl.entreco.domain.play.revanche.RevancheUsecase
Expand All @@ -29,6 +30,8 @@ import org.mockito.junit.MockitoJUnitRunner
class Play01ViewModelUndoTest {

@Mock private lateinit var mockGame: Game
@Mock private lateinit var mockTeam: Team
@Mock private lateinit var mockSettings: ScoreSettings
@Mock private lateinit var mockRequest: Play01Request
@Mock private lateinit var mockResponse: Play01Response
@Mock private lateinit var mockAdProvider: AdViewModel
Expand Down Expand Up @@ -75,6 +78,9 @@ class Play01ViewModelUndoTest {
private fun givenSubject() {
whenever(mockGame.id).thenReturn(5)
whenever(mockResponse.game).thenReturn(mockGame)
whenever(mockResponse.teams).thenReturn(arrayOf(mockTeam, mockTeam))
whenever(mockResponse.teamIds).thenReturn("")
whenever(mockResponse.settings).thenReturn(mockSettings)

subject = Play01ViewModel(mockPlay01Usecase, mockRevancheUsecase, mockGameListeners, mockMasterCaller, mockDialogHelper, mockToggleSoundUsecase, mockAudioPrefs, mockAdProvider, mockLogger)
subject.load(mockRequest, mockLoad, mockLoaders)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package nl.entreco.domain.play.start

import nl.entreco.domain.Analytics
import nl.entreco.domain.BaseUsecase
import nl.entreco.domain.common.executors.Background
import nl.entreco.domain.common.executors.Foreground
Expand All @@ -9,9 +10,10 @@ import javax.inject.Inject
/**
* Created by entreco on 09/01/2018.
*/
class MarkGameAsFinishedUsecase @Inject constructor(private val gameRepository: GameRepository, bg: Background, fg: Foreground) : BaseUsecase(bg, fg) {
class MarkGameAsFinishedUsecase @Inject constructor(private val gameRepository: GameRepository, private val analytics: Analytics, bg: Background, fg: Foreground) : BaseUsecase(bg, fg) {
fun exec(request: MarkGameAsFinishedRequest) {
onBackground({
analytics.trackAchievement("Game Finished")
gameRepository.finish(request.gameId, request.winningTeam)
}, {})
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package nl.entreco.domain.setup.game

import nl.entreco.domain.Analytics
import nl.entreco.domain.BaseUsecase
import nl.entreco.domain.common.executors.Background
import nl.entreco.domain.common.executors.Foreground
Expand All @@ -9,10 +10,11 @@ import javax.inject.Inject
/**
* Created by Entreco on 12/12/2017.
*/
class CreateGameUsecase @Inject constructor(private val gameRepository: GameRepository, bg: Background, fg: Foreground) : BaseUsecase(bg, fg) {
class CreateGameUsecase @Inject constructor(private val gameRepository: GameRepository, private val analytics: Analytics, bg: Background, fg: Foreground) : BaseUsecase(bg, fg) {

fun exec(request: CreateGameRequest, teamIdString: String, done: (CreateGameResponse) -> Unit, fail: (Throwable) -> Unit) {
onBackground({
analytics.trackAchievement("Game Created")
val (score, index, legs, sets) = request
val id = gameRepository.create(teamIdString, score, index, legs, sets)
onUi { done(CreateGameResponse(id, teamIdString, score, index, legs, sets)) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package nl.entreco.domain.play.start
import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.verify
import com.nhaarman.mockito_kotlin.whenever
import nl.entreco.domain.Analytics
import nl.entreco.domain.common.executors.TestBackground
import nl.entreco.domain.common.executors.TestForeground
import nl.entreco.domain.repository.GameRepository
Expand All @@ -17,6 +18,7 @@ import org.mockito.junit.MockitoJUnitRunner
@RunWith(MockitoJUnitRunner::class)
class MarkGameAsFinishedUsecaseTest {

@Mock private lateinit var mockAnalytics: Analytics
@Mock private lateinit var mockGameRepository: GameRepository
private val bg = TestBackground()
private val fg = TestForeground()
Expand All @@ -39,8 +41,15 @@ class MarkGameAsFinishedUsecaseTest {
thenGameIsMarkedAsFinished()
}

@Test
fun `it should log "game created" when executing usecase`() {
givenSubject()
whenMarkingGameAsFinished(244)
thenSendToAnalytics("Game Finished")
}

private fun givenSubject() {
subject = MarkGameAsFinishedUsecase(mockGameRepository, bg, fg)
subject = MarkGameAsFinishedUsecase(mockGameRepository, mockAnalytics, bg, fg)
}

private fun whenMarkingGameAsFinished(gameId: Long) {
Expand All @@ -60,4 +69,8 @@ class MarkGameAsFinishedUsecaseTest {
verify(mockGameRepository).finish(givenId, "1")
}

private fun thenSendToAnalytics(expected: String) {
verify(mockAnalytics).trackAchievement(expected)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package nl.entreco.domain.setup.game
import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.eq
import com.nhaarman.mockito_kotlin.verify
import nl.entreco.domain.Analytics
import nl.entreco.domain.common.executors.TestBackground
import nl.entreco.domain.common.executors.TestForeground
import nl.entreco.domain.repository.GameRepository
Expand All @@ -19,6 +20,7 @@ import org.mockito.junit.MockitoJUnitRunner
@RunWith(MockitoJUnitRunner::class)
class CreateGameUsecaseTest {

@Mock private lateinit var mockAnalytics: Analytics
@Mock private lateinit var mockGameRepository: GameRepository
@Mock private lateinit var mockOk: (CreateGameResponse) -> Unit
@Mock private lateinit var mockFail: (Throwable) -> Unit
Expand All @@ -43,8 +45,15 @@ class CreateGameUsecaseTest {
thenGameIsStarted()
}

@Test
fun `it should log "game created" when executing usecase`() {
givenCreateGameUsecase()
whenStartIsCalled()
thenSendToAnalytics("Game Created")
}

private fun givenCreateGameUsecase() {
subject = CreateGameUsecase(mockGameRepository, mockBg, mockFg)
subject = CreateGameUsecase(mockGameRepository, mockAnalytics, mockBg, mockFg)
}

private fun whenStartIsCalled() {
Expand All @@ -55,4 +64,8 @@ class CreateGameUsecaseTest {
private fun thenGameIsStarted() {
verify(mockOk).invoke(any())
}

private fun thenSendToAnalytics(expected: String) {
verify(mockAnalytics).trackAchievement(expected)
}
}

0 comments on commit 84656ce

Please sign in to comment.