From 355d27f0d7015d1febcff23b509d2ade4f3ce9f0 Mon Sep 17 00:00:00 2001 From: Arkadii Ivanov Date: Mon, 21 Oct 2024 20:38:59 +0100 Subject: [PATCH] Save unconsumed state in DefaultStateKeeperDispatcher --- .../DefaultStateKeeperDispatcher.kt | 3 +- .../DefaultStateKeeperDispatcherTest.kt | 28 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/state-keeper/src/commonMain/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcher.kt b/state-keeper/src/commonMain/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcher.kt index 0786ec7..3a03a1f 100644 --- a/state-keeper/src/commonMain/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcher.kt +++ b/state-keeper/src/commonMain/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcher.kt @@ -12,7 +12,8 @@ internal class DefaultStateKeeperDispatcher( private val suppliers = HashMap>() override fun save(): SerializableContainer { - val map = HashMap() + val map = savedState?.toMutableMap() ?: HashMap() + suppliers.forEach { (key, supplier) -> supplier.toSerializableContainer()?.also { container -> map[key] = container diff --git a/state-keeper/src/commonTest/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcherTest.kt b/state-keeper/src/commonTest/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcherTest.kt index 6e0fc2a..a13ddd2 100644 --- a/state-keeper/src/commonTest/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcherTest.kt +++ b/state-keeper/src/commonTest/kotlin/com/arkivanov/essenty/statekeeper/DefaultStateKeeperDispatcherTest.kt @@ -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) @@ -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)