diff --git a/kstatemachine-serialization/src/commonMain/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializer.kt b/kstatemachine-serialization/src/commonMain/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializer.kt index ca29ea6..4e98424 100644 --- a/kstatemachine-serialization/src/commonMain/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializer.kt +++ b/kstatemachine-serialization/src/commonMain/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializer.kt @@ -11,6 +11,7 @@ package ru.nsk.kstatemachine.serialization.persistence import kotlinx.serialization.* import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.nullable import kotlinx.serialization.builtins.serializer import kotlinx.serialization.descriptors.* import kotlinx.serialization.encoding.* @@ -195,29 +196,27 @@ private object SerializableGeneratedEventSerializer : KSerializer { - @OptIn(InternalSerializationApi::class) override val descriptor = buildClassSerialDescriptor( "ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Start", ) { - element("ignore_fix_bug") + element("ignore_this_field", Boolean.serializer().nullable.descriptor, isOptional = true) } override fun serialize(encoder: Encoder, value: EventType.Start) { encoder.encodeStructure(descriptor) { - encodeBooleanElement(descriptor, 0, false) + encodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable, null) } } override fun deserialize(decoder: Decoder): EventType.Start { return decoder.decodeStructure(descriptor) { - var eventType = - makeNullPointerFailure("required eventType property is absent") while (true) { when (val index = decodeElementIndex(descriptor)) { - 0 -> eventType = Result.success( - decodeBooleanElement(descriptor, 0) - ) + 0 -> decodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable) // ignore CompositeDecoder.DECODE_DONE -> break else -> error("Unexpected index: $index") } @@ -227,16 +226,30 @@ private object SerializableGeneratedEventEventTypeStartSerializer : KSerializer< } } +/** + * See an issue https://github.com/Kotlin/kotlinx.serialization/issues/2830 + */ private object SerializableGeneratedEventEventTypeStopSerializer : KSerializer { override val descriptor = - buildClassSerialDescriptor("ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Stop") + buildClassSerialDescriptor("ru.nsk.kstatemachine.event.SerializableGeneratedEvent.EventType.Stop") { + element("ignore_this_field", Boolean.serializer().nullable.descriptor, isOptional = true) + } override fun serialize(encoder: Encoder, value: EventType.Stop) { - encoder.encodeStructure(descriptor) {} + encoder.encodeStructure(descriptor) { + encodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable, null) + } } override fun deserialize(decoder: Decoder): EventType.Stop { return decoder.decodeStructure(descriptor) { + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> decodeNullableSerializableElement(descriptor, 0, Boolean.serializer().nullable) // ignore + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } EventType.Stop } } diff --git a/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/CoroutinesTest.kt b/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/coroutines/CoroutinesTest.kt similarity index 98% rename from tests/src/commonTest/kotlin/ru/nsk/kstatemachine/CoroutinesTest.kt rename to tests/src/commonTest/kotlin/ru/nsk/kstatemachine/coroutines/CoroutinesTest.kt index a67b465..6768de4 100644 --- a/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/CoroutinesTest.kt +++ b/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/coroutines/CoroutinesTest.kt @@ -5,7 +5,7 @@ * All rights reserved. */ -package ru.nsk.kstatemachine +package ru.nsk.kstatemachine.coroutines import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.StringSpec @@ -15,8 +15,11 @@ import io.mockk.verifySequence import kotlinx.coroutines.* import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.take +import ru.nsk.kstatemachine.SecondEvent +import ru.nsk.kstatemachine.SwitchEvent import ru.nsk.kstatemachine.statemachine.StateMachineNotification.* import ru.nsk.kstatemachine.event.StartEvent +import ru.nsk.kstatemachine.mockkCallbacks import ru.nsk.kstatemachine.state.* import ru.nsk.kstatemachine.statemachine.* import ru.nsk.kstatemachine.transition.onTriggered diff --git a/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/RecordedEventsSerializerTest.kt b/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializerTest.kt similarity index 95% rename from tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/RecordedEventsSerializerTest.kt rename to tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializerTest.kt index f80bd71..60b1ab2 100644 --- a/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/RecordedEventsSerializerTest.kt +++ b/tests/src/commonTest/kotlin/ru/nsk/kstatemachine/serialization/persistence/RecordedEventsSerializerTest.kt @@ -5,14 +5,13 @@ * All rights reserved. */ -package ru.nsk.kstatemachine.serialization +package ru.nsk.kstatemachine.serialization.persistence import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf import kotlinx.coroutines.CoroutineScope -import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -22,10 +21,8 @@ import kotlinx.serialization.modules.polymorphic import kotlinx.serialization.modules.subclass import ru.nsk.kstatemachine.event.DataEvent import ru.nsk.kstatemachine.event.Event -import ru.nsk.kstatemachine.event.SerializableGeneratedEvent import ru.nsk.kstatemachine.persistence.RecordedEvents import ru.nsk.kstatemachine.persistence.restoreByRecordedEvents -import ru.nsk.kstatemachine.serialization.persistence.KStateMachineSerializersModule import ru.nsk.kstatemachine.state.* import ru.nsk.kstatemachine.statemachine.StateMachine import ru.nsk.kstatemachine.statemachine.buildCreationArguments