Skip to content

Commit

Permalink
Save unconsumed state in DefaultStateKeeperDispatcher
Browse files Browse the repository at this point in the history
  • Loading branch information
arkivanov committed Oct 21, 2024
1 parent 632c45f commit 355d27f
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ internal class DefaultStateKeeperDispatcher(
private val suppliers = HashMap<String, Supplier<*>>()

override fun save(): SerializableContainer {
val map = HashMap<String, SerializableContainer>()
val map = savedState?.toMutableMap() ?: HashMap()

suppliers.forEach { (key, supplier) ->
supplier.toSerializableContainer()?.also { container ->
map[key] = container
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ class DefaultStateKeeperDispatcherTest {
dispatcher1.register(key = "key2", strategy = Data.serializer()) { data2 }
dispatcher1.register(key = "key3", strategy = Data.serializer()) { null }

val savedState = dispatcher1.save()
.serialize(strategy = SerializableContainer.serializer())
.deserialize(strategy = SerializableContainer.serializer())
val savedState = dispatcher1.save().serializeAndDeserialize()

val dispatcher2 = DefaultStateKeeperDispatcher(savedState = savedState)

Expand All @@ -36,6 +34,30 @@ class DefaultStateKeeperDispatcherTest {
assertNull(restoredData3)
}

@Test
fun WHEN_save_recreate_twice_consume_THEN_data_restored() {
val dispatcher1 = DefaultStateKeeperDispatcher(savedState = null)

val data1 = Data(value = "value1")
val data2 = Data(value = "value2")
val data3 = Data(value = "value3")

dispatcher1.register(key = "key1", strategy = Data.serializer()) { data1 }
dispatcher1.register(key = "key2", strategy = Data.serializer()) { data2 }

val savedState1 = dispatcher1.save().serializeAndDeserialize()
val dispatcher2 = DefaultStateKeeperDispatcher(savedState = savedState1)
dispatcher2.register(key = "key1", strategy = Data.serializer()) { data3 }
val savedState2 = dispatcher2.save().serializeAndDeserialize()
val dispatcher3 = DefaultStateKeeperDispatcher(savedState = savedState2)

val restoredData1 = dispatcher3.consume(key = "key1", strategy = Data.serializer())
val restoredData2 = dispatcher3.consume(key = "key2", strategy = Data.serializer())

assertEquals(data3, restoredData1)
assertEquals(data2, restoredData2)
}

@Test
fun WHEN_consume_second_time_THEN_returns_null() {
val dispatcher1 = DefaultStateKeeperDispatcher(savedState = null)
Expand Down

0 comments on commit 355d27f

Please sign in to comment.