From 747c1f9c54245428e5dfe7460b7a139ab42653b9 Mon Sep 17 00:00:00 2001 From: Marian Jureczko Date: Sun, 12 Jan 2025 20:36:31 +0100 Subject: [PATCH] #17 in progress - showing collected treasure in classic mode --- .../searching/SearchingScreenWidgets.kt | 6 +- .../poszukiwacz/ui/ComposeRoot.kt | 5 +- .../poszukiwacz/ui/ComposableRoot.kt | 7 +- .../poszukiwacz/activity/main/MainActivity.kt | 2 +- .../n/JustFoundTreasureDescriptionFinder.kt | 1 - .../activity/searching/n/SearchingScreen.kt | 4 +- .../activity/searching/n/SharedViewModel.kt | 9 +- .../poszukiwacz/screen/result/ResultScreen.kt | 2 +- .../poszukiwacz/screen/result/ResultState.kt | 7 +- .../screen/result/ResultViewModel.kt | 21 ++-- .../poszukiwacz/shared/CallbackAliases.kt | 3 +- .../JustFoundTreasureDescriptionFinderTest.kt | 9 +- .../searching/n/SharedViewModelTest.kt | 12 +- .../screen/result/ResultViewModelTest.kt | 115 ++++++++++++++++++ build.gradle | 2 +- gradle.properties | 2 +- 16 files changed, 161 insertions(+), 46 deletions(-) create mode 100644 app/src/test/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModelTest.kt diff --git a/app/src/classic/java/pl/marianjureczko/poszukiwacz/screen/searching/SearchingScreenWidgets.kt b/app/src/classic/java/pl/marianjureczko/poszukiwacz/screen/searching/SearchingScreenWidgets.kt index d9564d2..537c6cc 100644 --- a/app/src/classic/java/pl/marianjureczko/poszukiwacz/screen/searching/SearchingScreenWidgets.kt +++ b/app/src/classic/java/pl/marianjureczko/poszukiwacz/screen/searching/SearchingScreenWidgets.kt @@ -34,7 +34,7 @@ fun Scores(modifier: Modifier = Modifier, score: TreasuresProgress) { ) Text( color = Color.Gray, - text = "0", + text = score.golds.toString(), fontSize = pl.marianjureczko.poszukiwacz.ui.theme.Typography.h5.fontSize ) Image( @@ -45,7 +45,7 @@ fun Scores(modifier: Modifier = Modifier, score: TreasuresProgress) { ) Text( color = Color.Gray, - text = "0", + text = score.rubies.toString(), fontSize = pl.marianjureczko.poszukiwacz.ui.theme.Typography.h5.fontSize ) Image( @@ -56,7 +56,7 @@ fun Scores(modifier: Modifier = Modifier, score: TreasuresProgress) { ) Text( color = Color.Gray, - text = "0", + text = score.diamonds.toString(), fontSize = pl.marianjureczko.poszukiwacz.ui.theme.Typography.h5.fontSize ) } diff --git a/app/src/classic/java/pl/marianjureczko/poszukiwacz/ui/ComposeRoot.kt b/app/src/classic/java/pl/marianjureczko/poszukiwacz/ui/ComposeRoot.kt index b4a2997..623491b 100644 --- a/app/src/classic/java/pl/marianjureczko/poszukiwacz/ui/ComposeRoot.kt +++ b/app/src/classic/java/pl/marianjureczko/poszukiwacz/ui/ComposeRoot.kt @@ -65,7 +65,7 @@ fun ComposeRoot(onClickGuide: GoToGuide) { navController = navController, onClickOnGuide = onClickGuide, goToTipPhoto = { navController.navigate("tipPhoto/$it") }, - goToResult = { resultType, treasureId, amount -> navController.navigate("$RESULTS_PATH/$resultType/$treasureId/$amount") }, + goToResult = { routeName, resultType, treasureId, amount -> navController.navigate("$RESULTS_PATH/$routeName/$resultType/$treasureId/$amount") }, goToMap = { navController.navigate("map/$it") }, goToTreasureSelector = { /*navController.navigate("$SELECTOR_PATH/$it")*/ }, goToFacebook = goToFacebook, @@ -75,6 +75,9 @@ fun ComposeRoot(onClickGuide: GoToGuide) { composable( route = RESULTS_ROUTE, arguments = listOf( + navArgument(pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_ROUTE_NAME) { + type = NavType.StringType + }, navArgument(PARAMETER_RESULT_TYPE) { type = NavType.EnumType(ResultType::class.java) }, navArgument(PARAMETER_TREASURE_ID) { type = NavType.IntType }, navArgument(PARAMETER_TREASURE_AMOUNT) { type = NavType.IntType }, diff --git a/app/src/custom/java/pl/marianjureczko/poszukiwacz/ui/ComposableRoot.kt b/app/src/custom/java/pl/marianjureczko/poszukiwacz/ui/ComposableRoot.kt index 2bc4976..ef4ccb6 100644 --- a/app/src/custom/java/pl/marianjureczko/poszukiwacz/ui/ComposableRoot.kt +++ b/app/src/custom/java/pl/marianjureczko/poszukiwacz/ui/ComposableRoot.kt @@ -24,8 +24,8 @@ import pl.marianjureczko.poszukiwacz.activity.map.n.PARAMETER_ROUTE_NAME_2 import pl.marianjureczko.poszukiwacz.activity.photo.n.PARAMETER_TIP_PHOTO import pl.marianjureczko.poszukiwacz.activity.photo.n.TipPhotoScreen import pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_RESULT_TYPE +import pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_TREASURE_AMOUNT import pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_TREASURE_ID -import pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_TREASURE_QUANTITY import pl.marianjureczko.poszukiwacz.screen.result.ResultScreen import pl.marianjureczko.poszukiwacz.screen.result.ResultType import pl.marianjureczko.poszukiwacz.activity.searching.n.PARAMETER_ROUTE_NAME @@ -57,7 +57,7 @@ fun ComposeRoot(onClickGuide: GoToGuide) { navController = navController, onClickOnGuide = onClickGuide, goToTipPhoto = { navController.navigate("tipPhoto/$it") }, - goToResult = { resultType, treasureId, amount -> navController.navigate("$RESULTS_PATH/$resultType/$treasureId/$amount") }, + goToResult = { routeName, resultType, treasureId, amount -> navController.navigate("$RESULTS_PATH/$routeName/$resultType/$treasureId/$amount") }, goToMap = { navController.navigate("map/$it") }, goToTreasureSelector = { navController.navigate("$SELECTOR_PATH/$it") }, goToFacebook = goToFacebook, @@ -100,8 +100,7 @@ fun ComposeRoot(onClickGuide: GoToGuide) { navController, navBackStackEntry, onClickGuide, - //TODO t: doesn't support classic - goToResult = { treasureId -> navController.navigate("$RESULTS_PATH/${ResultType.TREASURE}/$treasureId") }, + goToResult = { treasureId -> navController.navigate("$RESULTS_PATH/${ResultType.KNOWLEDGE}/$treasureId") }, goToCommemorative = goToCommemorative, onClickOnFacebook = goToFacebook ) diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/main/MainActivity.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/main/MainActivity.kt index 662137c..1431dfb 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/main/MainActivity.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/main/MainActivity.kt @@ -25,7 +25,7 @@ val TREASURE_EDITOR_ROUTE = "$TREASURE_EDITOR_PATH/{$PARAMETER_ROUTE_NAME}" val SEARCHING_PATH = "searching" val SEARCHING_ROUTE = "$SEARCHING_PATH/{$PARAMETER_ROUTE_NAME}" val RESULTS_PATH = "result" -val RESULTS_ROUTE = "$RESULTS_PATH/{$PARAMETER_RESULT_TYPE}/{$PARAMETER_TREASURE_ID}/{$PARAMETER_TREASURE_AMOUNT}" +val RESULTS_ROUTE = "$RESULTS_PATH/{${pl.marianjureczko.poszukiwacz.screen.result.PARAMETER_ROUTE_NAME}}/{$PARAMETER_RESULT_TYPE}/{$PARAMETER_TREASURE_ID}/{$PARAMETER_TREASURE_AMOUNT}" val SELECTOR_PATH = "selector" val SELECTOR_ROUTE = "$SELECTOR_PATH/{$PARAMETER_JUST_FOUND_TREASURE}" val COMMEMORATIVE_PATH = "commemorative" diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinder.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinder.kt index 92b2658..94f5ce9 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinder.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinder.kt @@ -15,7 +15,6 @@ class JustFoundTreasureDescriptionFinder( private val TAG = javaClass.simpleName fun findTreasureDescription( - qrCode: String, justFoundTreasure: Treasure, selectedTreasureDescription: TreasureDescription? = null, userLocation: Coordinates? = null, diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SearchingScreen.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SearchingScreen.kt index 7654ec9..f65bc77 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SearchingScreen.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SearchingScreen.kt @@ -129,8 +129,8 @@ private fun SearchingScreenBody( } val scanQrLauncher = rememberLauncherForActivityResult( contract = ScanContract(), - onResult = viewModel.scannedTreasureCallback { resultType, treasureId, quantity -> - goToResult(resultType, treasureId, quantity) + onResult = viewModel.scannedTreasureCallback { routeName, resultType, treasureId, quantity -> + goToResult(routeName, resultType, treasureId, quantity) } ) val prompt = stringResource(R.string.qr_scanner_msg) diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModel.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModel.kt index 1327990..ee5d5db 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModel.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModel.kt @@ -101,7 +101,7 @@ class SharedViewModel @Inject constructor( try { scannedTreasure = TreasureParser().parse(newCode) val tdFinder = JustFoundTreasureDescriptionFinder(state.value.route.treasures) - val foundTd: TreasureDescription? = tdFinder.findTreasureDescription(newCode, scannedTreasure) + val foundTd: TreasureDescription? = tdFinder.findTreasureDescription(scannedTreasure) var treasuresProgress: TreasuresProgress = state.value.treasuresProgress if (treasuresProgress.contains(scannedTreasure)) { result = ResultType.ALREADY_TAKEN @@ -119,7 +119,7 @@ class SharedViewModel @Inject constructor( } } result?.let { - goToResults(it, treasureId, scannedTreasure?.quantity) + goToResults(state.value.route.name, it, treasureId, scannedTreasure?.quantity) } } } @@ -219,7 +219,6 @@ class SharedViewModel @Inject constructor( } } - //TODO t: how to handle first search, when no treasure is selected private fun createState(): SharedState { Log.i(TAG, "Create state") val route = loadRoute() @@ -228,10 +227,6 @@ class SharedViewModel @Inject constructor( val mediaPlayer = MediaPlayer() mediaPlayer.isLooping = false mediaPlayer.setOnErrorListener { mp, what, extra -> handleMediaPlayerError(what, extra) } - if (treasuresProgress.selectedTreasure == null) { - treasuresProgress.selectedTreasure = route.treasures[0] - storageHelper.save(treasuresProgress) - } return SharedState( mediaPlayer, route, diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultScreen.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultScreen.kt index 652bea4..8e044a8 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultScreen.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultScreen.kt @@ -78,7 +78,7 @@ fun ResultScreenBody(viewModelStoreOwner: NavBackStackEntry) { .weight(0.01f) .background(Color.Transparent) ) - if (localState.resultType == ResultType.TREASURE && localState.moviePath != null) { + if (localState.resultType == ResultType.KNOWLEDGE && localState.moviePath != null) { VideoPlayerWithButon( localState.isPlayVisible, localViewModel, diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultState.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultState.kt index 4aa5fc3..6ed365f 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultState.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultState.kt @@ -16,8 +16,7 @@ data class ResultState( enum class ResultType { NOT_A_TREASURE, ALREADY_TAKEN, - //TODO t: rename to KNOWLEDGE - TREASURE, + KNOWLEDGE, GOLD, RUBY, DIAMOND; @@ -28,7 +27,7 @@ enum class ResultType { TreasureType.GOLD -> GOLD TreasureType.RUBY -> RUBY TreasureType.DIAMOND -> DIAMOND - TreasureType.KNOWLEDGE -> TREASURE + TreasureType.KNOWLEDGE -> KNOWLEDGE } } @@ -37,7 +36,7 @@ enum class ResultType { GOLD -> TreasureType.GOLD RUBY -> TreasureType.RUBY DIAMOND -> TreasureType.DIAMOND - TREASURE -> TreasureType.KNOWLEDGE + KNOWLEDGE -> TreasureType.KNOWLEDGE else -> null } } \ No newline at end of file diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModel.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModel.kt index 9fd9031..7da6ee7 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModel.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModel.kt @@ -6,11 +6,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel -import pl.marianjureczko.poszukiwacz.screen.main.CustomInitializerForRoute import pl.marianjureczko.poszukiwacz.shared.port.StorageHelper import java.util.Locale import javax.inject.Inject +const val PARAMETER_ROUTE_NAME = "route_name" const val PARAMETER_RESULT_TYPE = "result_type" const val PARAMETER_TREASURE_ID = "treasure_id" const val PARAMETER_TREASURE_AMOUNT = "treasure_amount" @@ -52,13 +52,14 @@ class ResultViewModel @Inject constructor( private fun createState(): ResultState { var moviePath: String? = null var subtitlesPath: String? = null - //TODO: conditional for custom version val treasureDescId = stateHandle.get(PARAMETER_TREASURE_ID) ?: NOTHING_FOUND_TREASURE_ID - if (NOTHING_FOUND_TREASURE_ID != treasureDescId) { - val treasureDescription = storageHelper.loadRoute(CustomInitializerForRoute.routeName).treasures - .find { it.id == treasureDescId } - moviePath = treasureDescription?.movieFileName - subtitlesPath = treasureDescription?.subtitlesFileName + if (treasureDescriptionHasBeenIdentified(treasureDescId)) { + stateHandle.get(PARAMETER_ROUTE_NAME)?.let { routeName -> + val treasureDescription = storageHelper.loadRoute(routeName).treasures + .find { it.id == treasureDescId } + moviePath = treasureDescription?.movieFileName + subtitlesPath = treasureDescription?.subtitlesFileName + } } val localesWithSubtitles = !"pl".equals(Locale.getDefault().language, true) val resultType = stateHandle.get(PARAMETER_RESULT_TYPE) ?: ResultType.NOT_A_TREASURE @@ -67,4 +68,10 @@ class ResultViewModel @Inject constructor( return ResultState(resultType, treasureType, amount, moviePath, null, subtitlesPath, localesWithSubtitles) } + /** + * It's possible to find a treasure whose TreasureDescription cannot be identified (for knowledge treasures it's + * always possible to identify the TreasureDescription), check JustFoundTreasureDescriptionFinder for details. + */ + private fun treasureDescriptionHasBeenIdentified(treasureDescId: Int) = NOTHING_FOUND_TREASURE_ID != treasureDescId + } \ No newline at end of file diff --git a/app/src/main/java/pl/marianjureczko/poszukiwacz/shared/CallbackAliases.kt b/app/src/main/java/pl/marianjureczko/poszukiwacz/shared/CallbackAliases.kt index c03843d..a25f289 100644 --- a/app/src/main/java/pl/marianjureczko/poszukiwacz/shared/CallbackAliases.kt +++ b/app/src/main/java/pl/marianjureczko/poszukiwacz/shared/CallbackAliases.kt @@ -5,8 +5,7 @@ import pl.marianjureczko.poszukiwacz.model.TreasureDescription import pl.marianjureczko.poszukiwacz.screen.result.ResultType typealias GoToGuide = () -> Unit -//TODO t: are nullable types supported in navigation? -typealias GoToResults = (ResultType, Int?, Int?) -> Unit +typealias GoToResults = (String, ResultType, Int?, Int?) -> Unit typealias GoToFacebook = () -> Unit typealias GoToSearching = (String) -> Unit typealias GoToQrScanner = () -> Unit diff --git a/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinderTest.kt b/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinderTest.kt index 41332b3..070231c 100644 --- a/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinderTest.kt +++ b/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/JustFoundTreasureDescriptionFinderTest.kt @@ -17,7 +17,6 @@ import org.mockito.junit.jupiter.MockitoExtension import pl.marianjureczko.poszukiwacz.activity.searching.LocationCalculator import pl.marianjureczko.poszukiwacz.model.Treasure import pl.marianjureczko.poszukiwacz.model.TreasureDescription -import pl.marianjureczko.poszukiwacz.model.TreasureDescriptionArranger import pl.marianjureczko.poszukiwacz.model.TreasureType import pl.marianjureczko.poszukiwacz.shared.Coordinates @@ -28,10 +27,10 @@ class CustomJustFoundTreasureDescriptionFinderTest { //given val treasureDescription = some() val finder = JustFoundTreasureDescriptionFinder(listOf(treasureDescription)) - val treasure = Treasure(someString(), somePositiveInt(10), TreasureType.KNOWLEDGE) + val treasure = Treasure(treasureDescription.qrCode!!, somePositiveInt(10), TreasureType.KNOWLEDGE) //when - val actual = finder.findTreasureDescription(treasureDescription.qrCode!!, treasure) + val actual = finder.findTreasureDescription(treasure) //then assertThat(actual).isEqualTo(treasureDescription) @@ -45,7 +44,7 @@ class CustomJustFoundTreasureDescriptionFinderTest { val treasure = Treasure(someString(), somePositiveInt(10), TreasureType.KNOWLEDGE) //when - val actual = finder.findTreasureDescription(TreasureDescriptionArranger.validQrCode("k"), treasure) + val actual = finder.findTreasureDescription(treasure) //then assertThat(actual).isNull() @@ -131,7 +130,7 @@ class ClassicJustFoundTreasureDescriptionFinderTest { //justFoundTreasure, description, userCoordinates, locationCalculator) //when - val actual = finder.findTreasureDescription(someString(), justFoundTreasure, description, userCoordinates) + val actual = finder.findTreasureDescription(justFoundTreasure, description, userCoordinates) //then assertThat(actual).isEqualTo(expected) diff --git a/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModelTest.kt b/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModelTest.kt index bd0c356..7767497 100644 --- a/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModelTest.kt +++ b/app/src/test/java/pl/marianjureczko/poszukiwacz/activity/searching/n/SharedViewModelTest.kt @@ -93,7 +93,7 @@ class SharedViewModelTest { //when var wasCalled = false - val callback = viewModel.scannedTreasureCallback { _: ResultType, _: Int?, _: Int? -> + val callback = viewModel.scannedTreasureCallback {_ : String, _: ResultType, _: Int?, _: Int? -> wasCalled = true } callback(qrResult) @@ -115,7 +115,7 @@ class SharedViewModelTest { //when & then var wasCalled = false - val callback = viewModel.scannedTreasureCallback { actual, _, _ -> + val callback = viewModel.scannedTreasureCallback { _, actual, _, _ -> wasCalled = true assertThat(actual).isEqualTo(ResultType.NOT_A_TREASURE) } @@ -138,9 +138,9 @@ class SharedViewModelTest { //when var wasCalled = false - val callback = viewModel.scannedTreasureCallback { actual, _, _ -> + val callback = viewModel.scannedTreasureCallback { _, actual, _, _ -> wasCalled = true - assertThat(actual).isEqualTo(ResultType.TREASURE) + assertThat(actual).isEqualTo(ResultType.KNOWLEDGE) } callback(qrResult) @@ -162,11 +162,11 @@ class SharedViewModelTest { //when & then var callbackUsed = 0 - val callback1 = viewModel.scannedTreasureCallback { actual, _, _ -> + val callback1 = viewModel.scannedTreasureCallback { _, actual, _, _ -> callbackUsed++ } callback1(qrResult) - val callback2 = viewModel.scannedTreasureCallback { actual, _, _ -> + val callback2 = viewModel.scannedTreasureCallback { _, actual, _, _ -> callbackUsed++ assertThat(actual).isEqualTo(ResultType.ALREADY_TAKEN) } diff --git a/app/src/test/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModelTest.kt b/app/src/test/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModelTest.kt new file mode 100644 index 0000000..12eba54 --- /dev/null +++ b/app/src/test/java/pl/marianjureczko/poszukiwacz/screen/result/ResultViewModelTest.kt @@ -0,0 +1,115 @@ +package pl.marianjureczko.poszukiwacz.screen.result + +import androidx.lifecycle.SavedStateHandle +import com.ocadotechnology.gembus.test.somePositiveInt +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import pl.marianjureczko.poszukiwacz.TestStoragePort +import pl.marianjureczko.poszukiwacz.model.Route +import pl.marianjureczko.poszukiwacz.model.TreasureType +import java.util.Locale + +class ResultViewModelTest { + @Test + fun `SHOULD set type not a treasure ie to default WHEN no parameters given`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.NOT_A_TREASURE) + assertThat(actual.state.value.treasureType).isNull() + } + + @Test + fun `SHOULD set type not a treasure WHEN not a treasure given given as the type`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + given(savedStateHandle.get(PARAMETER_RESULT_TYPE)).willReturn(ResultType.NOT_A_TREASURE) + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.NOT_A_TREASURE) + assertThat(actual.state.value.treasureType).isNull() + } + + @Test + fun `SHOULD set type already taken WHEN already taken given as the type`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + given(savedStateHandle.get(PARAMETER_RESULT_TYPE)).willReturn(ResultType.ALREADY_TAKEN) + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.ALREADY_TAKEN) + assertThat(actual.state.value.treasureType).isNull() + } + + @Test + fun `SHOULD set type to knowledge WHEN knowledge given as the type but no treasure id`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + given(savedStateHandle.get(PARAMETER_RESULT_TYPE)).willReturn(ResultType.KNOWLEDGE) + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.KNOWLEDGE) + assertThat(actual.state.value.treasureType).isEqualTo(TreasureType.KNOWLEDGE) + } + + @Test + fun `SHOULD set type to knowledge movie and subtitles path and locales WHEN knowledge given as the type and valid treasure id`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + val route: Route = storage.routes.values.first() + given(savedStateHandle.get(PARAMETER_RESULT_TYPE)).willReturn(ResultType.KNOWLEDGE) + given(savedStateHandle.get(PARAMETER_TREASURE_ID)).willReturn(route.treasures.first().id) + given(savedStateHandle.get(PARAMETER_ROUTE_NAME)).willReturn(route.name) + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.KNOWLEDGE) + assertThat(actual.state.value.treasureType).isEqualTo(TreasureType.KNOWLEDGE) + assertThat(actual.state.value.moviePath).isEqualTo(route.treasures.first().movieFileName) + assertThat(actual.state.value.subtitlesPath).isEqualTo(route.treasures.first().subtitlesFileName) + assertThat(actual.state.value.localesWithSubtitles).isEqualTo(!"pl".equals(Locale.getDefault().language, true)) + } + + @Test + fun `SHOULD set amount and type to gold WHEN gold given as the type and valid treasure id`() { + // Given + val storage = TestStoragePort() + val savedStateHandle = mock() + val route: Route = storage.routes.values.first() + given(savedStateHandle.get(PARAMETER_RESULT_TYPE)).willReturn(ResultType.GOLD) + given(savedStateHandle.get(PARAMETER_TREASURE_ID)).willReturn(route.treasures.first().id) + given(savedStateHandle.get(PARAMETER_ROUTE_NAME)).willReturn(route.name) + val amount = somePositiveInt(100) + given(savedStateHandle.get(PARAMETER_TREASURE_AMOUNT)).willReturn(amount) + + // When + val actual = ResultViewModel(savedStateHandle, storage) + + // Then + assertThat(actual.state.value.resultType).isEqualTo(ResultType.GOLD) + assertThat(actual.state.value.treasureType).isEqualTo(TreasureType.GOLD) + assertThat(actual.state.value.amount).isEqualTo(amount) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index abdf764..23014fe 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath "de.mannodermaus.gradle.plugins:android-junit5:1.8.2.0" + classpath "de.mannodermaus.gradle.plugins:android-junit5:1.8.2.1" classpath "com.google.dagger:hilt-android-gradle-plugin:${hilt_version}" } } diff --git a/gradle.properties b/gradle.properties index 9e73ebc..0d5eb5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ org.gradle.jvmargs=-Xmx1536m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official android.defaults.buildfeatures.buildconfig=true