diff --git a/src/main/kotlin/dartzee/preferences/AbstractPreferenceService.kt b/src/main/kotlin/dartzee/preferences/AbstractPreferenceService.kt new file mode 100644 index 00000000..fac6591e --- /dev/null +++ b/src/main/kotlin/dartzee/preferences/AbstractPreferenceService.kt @@ -0,0 +1,28 @@ +package dartzee.preferences + +abstract class AbstractPreferenceService { + abstract fun delete(preference: Preference) + + protected abstract fun getRaw(preference: Preference): String + + abstract fun save(preference: Preference, value: T) + + @Suppress("UNCHECKED_CAST") + fun get(preference: Preference, useDefault: Boolean = false): T { + if (useDefault) { + return preference.default + } + + val raw = getRaw(preference) + return when (val desiredType = preference.default::class) { + Boolean::class -> raw.toBoolean() as T + Double::class -> raw.toDouble() as T + Int::class -> raw.toInt() as T + String::class -> raw as T + else -> + throw TypeCastException( + "Unhandled type [${desiredType}] for preference ${preference.name}" + ) + } + } +} diff --git a/src/main/kotlin/dartzee/preferences/DefaultPreferenceService.kt b/src/main/kotlin/dartzee/preferences/DefaultPreferenceService.kt index f74a752a..b399c1e3 100644 --- a/src/main/kotlin/dartzee/preferences/DefaultPreferenceService.kt +++ b/src/main/kotlin/dartzee/preferences/DefaultPreferenceService.kt @@ -3,7 +3,7 @@ package dartzee.preferences import dartzee.utils.NODE_PREFERENCES import java.util.prefs.Preferences -class DefaultPreferenceService : IPreferenceService { +class DefaultPreferenceService : AbstractPreferenceService() { private val preferences = Preferences.userRoot().node(NODE_PREFERENCES) override fun delete(preference: Preference) { @@ -14,22 +14,6 @@ class DefaultPreferenceService : IPreferenceService { preferences.put(preference.name, value.toString()) } - @Suppress("UNCHECKED_CAST") - override fun get(preference: Preference, useDefault: Boolean): T { - if (useDefault) { - return preference.default - } - - val raw = preferences.get(preference.name, preference.default.toString()) - return when (val desiredType = preference.default::class) { - Boolean::class -> raw.toBoolean() as T - Double::class -> raw.toDouble() as T - Int::class -> raw.toInt() as T - String::class -> raw as T - else -> - throw TypeCastException( - "Unhandled type [${desiredType}] for preference ${preference.name}" - ) - } - } + override fun getRaw(preference: Preference): String = + preferences.get(preference.name, preference.default.toString()) } diff --git a/src/main/kotlin/dartzee/preferences/IPreferenceService.kt b/src/main/kotlin/dartzee/preferences/IPreferenceService.kt deleted file mode 100644 index d7c7d84d..00000000 --- a/src/main/kotlin/dartzee/preferences/IPreferenceService.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dartzee.preferences - -interface IPreferenceService { - fun delete(preference: Preference) - - fun save(preference: Preference, value: T) - - fun get(preference: Preference, useDefault: Boolean = false): T -} diff --git a/src/test/kotlin/dartzee/preferences/InMemoryPreferenceService.kt b/src/test/kotlin/dartzee/preferences/InMemoryPreferenceService.kt new file mode 100644 index 00000000..5fc65b60 --- /dev/null +++ b/src/test/kotlin/dartzee/preferences/InMemoryPreferenceService.kt @@ -0,0 +1,16 @@ +package dartzee.preferences + +class InMemoryPreferenceService : AbstractPreferenceService() { + private val hmPreferences = mutableMapOf() + + override fun delete(preference: Preference) { + hmPreferences.remove(preference.name) + } + + override fun getRaw(preference: Preference) = + hmPreferences.getOrDefault(preference.name, preference.default.toString()) + + override fun save(preference: Preference, value: T) { + hmPreferences[preference.name] = value.toString() + } +} diff --git a/src/test/kotlin/dartzee/preferences/PreferenceServiceTest.kt b/src/test/kotlin/dartzee/preferences/PreferenceServiceTest.kt index 8c6d7ddb..8ed476e8 100644 --- a/src/test/kotlin/dartzee/preferences/PreferenceServiceTest.kt +++ b/src/test/kotlin/dartzee/preferences/PreferenceServiceTest.kt @@ -13,12 +13,16 @@ private val INT_PREF = Preference("fake_int", 20) private val DOUBLE_PREF = Preference("fake_double", 2.5) private val BOOLEAN_PREF = Preference("fake_boolean", false) +class InMemoryPreferenceServiceTest : AbstractTest(), PreferenceServiceTest { + override val implementation = InMemoryPreferenceService() +} + class DefaultPreferenceServiceTest : AbstractTest(), PreferenceServiceTest { override val implementation = DefaultPreferenceService() } interface PreferenceServiceTest { - val implementation: IPreferenceService + val implementation: AbstractPreferenceService @AfterEach fun afterEach() {