Skip to content

Commit

Permalink
improve StateFlowMutableStorageValueImpl with delegation, add more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
makeevrserg committed Dec 31, 2023
1 parent d8f4a2a commit 071847a
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 34 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ makeevrserg.java.ktarget=17
# Project
makeevrserg.project.name=KStorage
makeevrserg.project.group=ru.astrainteractive.klibs
makeevrserg.project.version.string=1.2.0
makeevrserg.project.version.string=1.3.0
makeevrserg.project.description=Kotlin wrapper for key-value storage libraries
makeevrserg.project.developers=makeevrserg|Makeev Roman|makeevrserg@gmail.com
makeevrserg.project.url=https://github.com/makeevrserg/kstorage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@ import ru.astrainteractive.klibs.kstorage.api.MutableStorageValue
internal class MutableStorageValueImpl<T>(
private val default: T,
private val loadSettingsValue: () -> T,
private val saveSettingsValue: (T) -> Unit
private val saveSettingsValue: (T) -> Unit,
private val onChanged: (T) -> Unit = {}
) : MutableStorageValue<T> {
private var currentValue: T = loadSettingsValue.invoke()
set(value) {
onChanged.invoke(value)
field = value
}
override val value: T
get() = currentValue

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ru.astrainteractive.klibs.kstorage.impl

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import ru.astrainteractive.klibs.kstorage.api.MutableStorageValue
import ru.astrainteractive.klibs.kstorage.api.StateFlowMutableStorageValue

/**
Expand All @@ -10,31 +11,17 @@ import ru.astrainteractive.klibs.kstorage.api.StateFlowMutableStorageValue
internal class StateFlowMutableStorageValueImpl<T>(
private val default: T,
private val loadSettingsValue: () -> T,
private val saveSettingsValue: (T) -> Unit
) : StateFlowMutableStorageValue<T> {

private val mutableStateFlow by lazy {
MutableStateFlow(loadSettingsValue.invoke())
}
private val saveSettingsValue: (T) -> Unit,
private val mutableStateFlow: MutableStateFlow<T> = MutableStateFlow(loadSettingsValue.invoke())
) : StateFlowMutableStorageValue<T>,
MutableStorageValue<T> by MutableStorageValueImpl(
default = default,
loadSettingsValue = loadSettingsValue,
saveSettingsValue = saveSettingsValue,
onChanged = { mutableStateFlow.value = it }
) {
override val stateFlow: StateFlow<T>
get() = mutableStateFlow

override fun load(): T {
val newValue = loadSettingsValue.invoke()
mutableStateFlow.value = newValue
return newValue
}

override fun save(value: T) {
saveSettingsValue.invoke(value)
mutableStateFlow.value = value
}

override fun reset() {
save(default)
}

override fun update(block: (T) -> T) {
save(block(value))
}
override val value: T
get() = stateFlow.value
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,59 @@ package ru.astrainteractive.klibs.kstorage

import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals

class StorageValueTest {
@Test
fun testLoadStorageValue() {
val expectedValue = 11
val storageValue = StateFlowMutableStorageValue(
default = 0,
loadSettingsValue = { 11 },
saveSettingsValue = {}
loadSettingsValue = { expectedValue },
saveSettingsValue = { }
)
assertEquals(11, storageValue.value)
assertEquals(11, storageValue.stateFlow.value)
assertEquals(expectedValue, storageValue.value)
assertEquals(expectedValue, storageValue.stateFlow.value)
storageValue.load()
assertEquals(11, storageValue.value)
assertEquals(11, storageValue.stateFlow.value)
assertEquals(expectedValue, storageValue.value)
assertEquals(expectedValue, storageValue.stateFlow.value)
}

@Test
fun testResetStorageValue() {
val expectedValue = 0
val storageValue = StateFlowMutableStorageValue(
default = expectedValue,
loadSettingsValue = { 11 },
saveSettingsValue = { }
)
assertNotEquals(expectedValue, storageValue.value)
assertNotEquals(expectedValue, storageValue.stateFlow.value)
storageValue.reset()
assertEquals(expectedValue, storageValue.value)
assertEquals(expectedValue, storageValue.stateFlow.value)
}

@Test
fun testSaveStorageValue() {
val storageValue = StateFlowMutableStorageValue(
default = 0,
loadSettingsValue = { },
saveSettingsValue = {}
saveSettingsValue = { }
)
storageValue.save(10)
assertEquals(storageValue.value, 10)
assertEquals(storageValue.stateFlow.value, 10)
}

@Test
fun testInMemoryStorageValue() {
val expectedValue = 0
val storageValue = StateFlowMutableStorageValue(expectedValue)
assertEquals(expectedValue, storageValue.value)
assertEquals(expectedValue, storageValue.stateFlow.value)
val newExpectedValue = expectedValue * 2
assertEquals(newExpectedValue, storageValue.value)
assertEquals(newExpectedValue, storageValue.stateFlow.value)
}
}

0 comments on commit 071847a

Please sign in to comment.