From fa9b114599551778a20ca9a88a348c179cafa2ac Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Sun, 28 Jun 2020 00:54:24 -0300 Subject: [PATCH] Add Preference tests --- .../mocks/MockPreferencesRepository.kt | 33 ---------- common/build.gradle | 2 +- .../core/preferences/PreferencesManager.kt | 44 +++++-------- .../core/preferences/PreferencesRepository.kt | 54 +++++++++++----- .../preferences/PreferencesRepositoryTest.kt | 62 +++++++++++++++++++ 5 files changed, 118 insertions(+), 77 deletions(-) delete mode 100644 app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt create mode 100644 common/src/test/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepositoryTest.kt diff --git a/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt b/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt deleted file mode 100644 index ca0b94e2..00000000 --- a/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt +++ /dev/null @@ -1,33 +0,0 @@ -package dev.lucasnlm.antimine.mocks - -import dev.lucasnlm.antimine.common.level.models.Minefield -import dev.lucasnlm.antimine.core.control.ControlStyle -import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository - -class MockPreferencesRepository : IPreferencesRepository { - override fun customGameMode(): Minefield = Minefield(9, 9, 9) - - override fun updateCustomGameMode(minefield: Minefield) { } - - override fun controlStyle(): ControlStyle = ControlStyle.Standard - - override fun useControlStyle(controlStyle: ControlStyle) { } - - override fun getBoolean(key: String, defaultValue: Boolean): Boolean = false - - override fun getInt(key: String, defaultValue: Int): Int = 0 - - override fun putBoolean(key: String, value: Boolean) { } - - override fun putInt(key: String, value: Int) { } - - override fun useFlagAssistant(): Boolean = true - - override fun useHapticFeedback(): Boolean = false - - override fun useLargeAreas(): Boolean = false - - override fun useAnimations(): Boolean = false - - override fun useQuestionMark(): Boolean = true -} diff --git a/common/build.gradle b/common/build.gradle index 04640880..96cbe01a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -62,7 +62,6 @@ dependencies { implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01" kapt "androidx.hilt:hilt-compiler:1.0.0-alpha01" - // Room api 'androidx.room:room-runtime:2.2.5' api 'androidx.room:room-ktx:2.2.5' @@ -85,6 +84,7 @@ dependencies { testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.24.0' testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0' + testImplementation "io.mockk:mockk:1.10.0" // Core library androidTestImplementation 'androidx.test:core:1.2.0' diff --git a/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesManager.kt b/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesManager.kt index b7aeb0dc..ca9a2062 100644 --- a/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesManager.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesManager.kt @@ -2,45 +2,33 @@ package dev.lucasnlm.antimine.core.preferences import android.content.Context import androidx.preference.PreferenceManager -import dev.lucasnlm.antimine.common.level.models.Minefield import javax.inject.Inject +interface IPreferencesManager { + fun getBoolean(key: String, defaultValue: Boolean): Boolean + fun putBoolean(key: String, value: Boolean) + fun getInt(key: String, defaultValue: Int): Int + fun putInt(key: String, value: Int) + fun removeKey(key: String) + fun contains(key: String): Boolean +} + class PreferencesManager @Inject constructor( private val context: Context -) { +): IPreferencesManager { private val preferences by lazy { PreferenceManager.getDefaultSharedPreferences(context) } - fun getCustomMode() = Minefield( - preferences.getInt(PREFERENCE_CUSTOM_GAME_WIDTH, 9), - preferences.getInt(PREFERENCE_CUSTOM_GAME_HEIGHT, 9), - preferences.getInt(PREFERENCE_CUSTOM_GAME_MINES, 9) - ) + override fun getBoolean(key: String, defaultValue: Boolean) = preferences.getBoolean(key, defaultValue) - fun updateCustomMode(customMinefield: Minefield) { - preferences.edit().apply { - putInt(PREFERENCE_CUSTOM_GAME_WIDTH, customMinefield.width) - putInt(PREFERENCE_CUSTOM_GAME_HEIGHT, customMinefield.height) - putInt(PREFERENCE_CUSTOM_GAME_MINES, customMinefield.mines) - }.apply() - } + override fun putBoolean(key: String, value: Boolean) = preferences.edit().putBoolean(key, value).apply() - fun getBoolean(key: String, defaultValue: Boolean) = preferences.getBoolean(key, defaultValue) + override fun getInt(key: String, defaultValue: Int) = preferences.getInt(key, defaultValue) - fun putBoolean(key: String, value: Boolean) = preferences.edit().putBoolean(key, value).apply() + override fun putInt(key: String, value: Int) = preferences.edit().putInt(key, value).apply() - fun getInt(key: String, defaultValue: Int) = preferences.getInt(key, defaultValue) + override fun contains(key: String): Boolean = preferences.contains(key) - fun putInt(key: String, value: Int) = preferences.edit().putInt(key, value).apply() - - fun removeKey(key: String) { - preferences.edit().remove(key).apply() - } - - companion object { - private const val PREFERENCE_CUSTOM_GAME_WIDTH = "preference_custom_game_width" - private const val PREFERENCE_CUSTOM_GAME_HEIGHT = "preference_custom_game_height" - private const val PREFERENCE_CUSTOM_GAME_MINES = "preference_custom_game_mines" - } + override fun removeKey(key: String) = preferences.edit().remove(key).apply() } diff --git a/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepository.kt b/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepository.kt index 387d8dfd..c4b74664 100644 --- a/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepository.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepository.kt @@ -23,17 +23,25 @@ interface IPreferencesRepository { } class PreferencesRepository( - private val preferencesManager: PreferencesManager + private val preferencesManager: IPreferencesManager ) : IPreferencesRepository { init { migrateOldPreferences() } - override fun customGameMode(): Minefield = - preferencesManager.getCustomMode() + override fun customGameMode(): Minefield = Minefield( + preferencesManager.getInt(PREFERENCE_CUSTOM_GAME_WIDTH, 9), + preferencesManager.getInt(PREFERENCE_CUSTOM_GAME_HEIGHT, 9), + preferencesManager.getInt(PREFERENCE_CUSTOM_GAME_MINES, 9) + ) - override fun updateCustomGameMode(minefield: Minefield) = - preferencesManager.updateCustomMode(minefield) + override fun updateCustomGameMode(minefield: Minefield) { + preferencesManager.apply { + putInt(PREFERENCE_CUSTOM_GAME_WIDTH, minefield.width) + putInt(PREFERENCE_CUSTOM_GAME_HEIGHT, minefield.height) + putInt(PREFERENCE_CUSTOM_GAME_MINES, minefield.mines) + } + } override fun getBoolean(key: String, defaultValue: Boolean): Boolean = preferencesManager.getBoolean(key, defaultValue) @@ -48,33 +56,49 @@ class PreferencesRepository( preferencesManager.putInt(key, value) override fun useFlagAssistant(): Boolean = - getBoolean("preference_assistant", true) + getBoolean(PREFERENCE_ASSISTANT, true) override fun useHapticFeedback(): Boolean = - getBoolean("preference_vibration", true) + getBoolean(PREFERENCE_VIBRATION, true) override fun useLargeAreas(): Boolean = - getBoolean("preference_large_area", false) + getBoolean(PREFERENCE_USE_LARGE_TILE, false) override fun useAnimations(): Boolean = - getBoolean("preference_animation", true) + getBoolean(PREFERENCE_ANIMATION, true) override fun useQuestionMark(): Boolean = - getBoolean("preference_use_question_mark", true) + getBoolean(PREFERENCE_QUESTION_MARK, true) override fun controlStyle(): ControlStyle { - val index = getInt("preference_control_style", -1) + val index = getInt(PREFERENCE_CONTROL_STYLE, -1) return ControlStyle.values().getOrNull(index) ?: ControlStyle.Standard } override fun useControlStyle(controlStyle: ControlStyle) { - putInt("preference_control_style", controlStyle.ordinal) + putInt(PREFERENCE_CONTROL_STYLE, controlStyle.ordinal) } private fun migrateOldPreferences() { - if (getBoolean("preference_double_click_open", false)) { - useControlStyle(ControlStyle.DoubleClick) - preferencesManager.removeKey("preference_double_click_open") + if (preferencesManager.contains(PREFERENCE_OLD_DOUBLE_CLICK)) { + if (getBoolean(PREFERENCE_OLD_DOUBLE_CLICK, false)) { + useControlStyle(ControlStyle.DoubleClick) + } + + preferencesManager.removeKey(PREFERENCE_OLD_DOUBLE_CLICK) } } + + private companion object { + private const val PREFERENCE_VIBRATION = "preference_vibration" + private const val PREFERENCE_ASSISTANT = "preference_assistant" + private const val PREFERENCE_ANIMATION = "preference_animation" + private const val PREFERENCE_USE_LARGE_TILE = "preference_large_area" + private const val PREFERENCE_QUESTION_MARK = "preference_use_question_mark" + private const val PREFERENCE_CONTROL_STYLE = "preference_control_style" + private const val PREFERENCE_OLD_DOUBLE_CLICK = "preference_double_click_open" + private const val PREFERENCE_CUSTOM_GAME_WIDTH = "preference_custom_game_width" + private const val PREFERENCE_CUSTOM_GAME_HEIGHT = "preference_custom_game_height" + private const val PREFERENCE_CUSTOM_GAME_MINES = "preference_custom_game_mines" + } } diff --git a/common/src/test/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepositoryTest.kt b/common/src/test/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepositoryTest.kt new file mode 100644 index 00000000..6d7733e9 --- /dev/null +++ b/common/src/test/java/dev/lucasnlm/antimine/core/preferences/PreferencesRepositoryTest.kt @@ -0,0 +1,62 @@ +package dev.lucasnlm.antimine.core.preferences + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +private class TestPreferenceManager: IPreferencesManager { + val values = mutableMapOf() + + override fun getBoolean(key: String, defaultValue: Boolean): Boolean { + return values.getOrDefault(key, defaultValue) as Boolean + } + + override fun putBoolean(key: String, value: Boolean) { + values[key] = value + } + + override fun getInt(key: String, defaultValue: Int): Int { + return values.getOrDefault(key, defaultValue) as Int + } + + override fun putInt(key: String, value: Int) { + values[key] = value + } + + override fun removeKey(key: String) { + values.remove(key) + } + + override fun contains(key: String): Boolean { + return values.containsKey(key) + } + +} + +class PreferencesRepositoryTest { + @Test + fun testMigrationWhenUsingDoubleClick() { + val preferenceManager = TestPreferenceManager() + preferenceManager.putBoolean("preference_double_click_open", true) + assertTrue(preferenceManager.values["preference_double_click_open"] as Boolean) + + val preferencesRepository = PreferencesRepository(preferenceManager) + + assertTrue(preferenceManager.values["preference_double_click_open"] == null) + assertEquals(1, preferenceManager.values["preference_control_style"]) + assertFalse(preferencesRepository.getBoolean("preference_double_click_open", false)) + } + + @Test + fun testMigrationWhenNotUsingDoubleClick() { + val preferenceManager = TestPreferenceManager() + preferenceManager.putBoolean("preference_double_click_open", false) + assertFalse(preferenceManager.values["preference_double_click_open"] as Boolean) + + val preferencesRepository = PreferencesRepository(preferenceManager) + + assertTrue(preferenceManager.values["preference_double_click_open"] == null) + assertFalse(preferencesRepository.getBoolean("preference_double_click_open", false)) + } +} \ No newline at end of file