From e2d73d59e7ecacf7f019adb36f7a3ba593833274 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 20 Nov 2019 10:03:16 +0600 Subject: [PATCH] clean up --- postssystem.core/build.gradle | 11 ++++ .../postssystem/core/content/Content.kt | 62 +------------------ .../postssystem/core/utils/IdUtils.kt | 2 +- .../core/api/ContentSerialization.kt | 34 ++++++++++ postssystem.exposed/build.gradle | 1 + 5 files changed, 48 insertions(+), 62 deletions(-) create mode 100644 postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/ContentSerialization.kt diff --git a/postssystem.core/build.gradle b/postssystem.core/build.gradle index 7d1facda..1a2c74bb 100644 --- a/postssystem.core/build.gradle +++ b/postssystem.core/build.gradle @@ -43,6 +43,12 @@ kotlin { api "com.benasher44:uuid:$uuidVersion" } } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } jvmMain { dependencies { implementation kotlin('stdlib-jdk8') @@ -53,5 +59,10 @@ kotlin { api "com.benasher44:uuid:$uuidVersion" } } + jvmTest { + dependencies { + implementation kotlin('test-junit') + } + } } } diff --git a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt index fcf10b68..958d60ac 100644 --- a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt +++ b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt @@ -8,69 +8,9 @@ typealias ContentId = String /** * Content which is planned to be registered in database */ -@Serializable(ContentSerializer::class) +@Serializable sealed class Content -@Serializer(Content::class) -object ContentSerializer : KSerializer { - override val descriptor: SerialDescriptor = object : SerialClassDescImpl("com.insanusmokrassar.postssystem.core.content.Content") { - init { - addElement("type") // req will have index 0 - addElement("data") // res will have index 1 - } - } - - override fun serialize(encoder: Encoder, obj: Content) { - encoder.beginCollection( - descriptor, - 2 - ).also { - when (obj) { - is SimpleSpecialContent -> { - it.encodeStringElement(descriptor, 0, SimpleSpecialContent.serializer().descriptor.name) - it.encodeSerializableElement(descriptor, 1, SimpleSpecialContent.serializer(), obj) - } - is SimpleTextContent -> { - it.encodeStringElement(descriptor, 0, SimpleTextContent.serializer().descriptor.name) - it.encodeSerializableElement(descriptor, 1, SimpleTextContent.serializer(), obj) - } - } - } - } - - private fun CompositeDecoder.deserialize(i: Int, deserializationStrategy: DeserializationStrategy): T { - return decodeSerializableElement( - descriptor, - i, - deserializationStrategy - ) - } - - override fun deserialize(decoder: Decoder): Content { - lateinit var result: Content - decoder.beginStructure(descriptor).let { - var type: String? = null - deserializeLoop@while (true) { - when (val i = it.decodeElementIndex(descriptor)) { - CompositeDecoder.READ_DONE -> break@deserializeLoop - 0 -> type = it.decodeStringElement(descriptor, i) - 1 -> result = when (type) { - SimpleSpecialContent.serializer().descriptor.name -> it.deserialize( - i, SimpleSpecialContent.serializer() - ) - SimpleTextContent.serializer().descriptor.name -> it.deserialize( - i, SimpleTextContent.serializer() - ) - else -> throw UnsupportedOperationException("Can't decode object with type $type") - } - else -> throw SerializationException("Unknown index $i") - } - } - } - return result - } -} - @Serializable data class SimpleSpecialContent( val internalId: ContentId diff --git a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/IdUtils.kt b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/IdUtils.kt index b8437c62..304b87aa 100644 --- a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/IdUtils.kt +++ b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/IdUtils.kt @@ -4,7 +4,7 @@ import com.benasher44.uuid.uuid4 import com.insanusmokrassar.postssystem.core.content.ContentId import com.insanusmokrassar.postssystem.core.post.PostId -private fun generateId() = uuid4().toString() +fun generateId() = uuid4().toString() fun generatePostId(): PostId = generateId() fun generateContentId(): ContentId = generateId() diff --git a/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/ContentSerialization.kt b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/ContentSerialization.kt new file mode 100644 index 00000000..8013a64b --- /dev/null +++ b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/ContentSerialization.kt @@ -0,0 +1,34 @@ +package com.insanusmokrassar.postssystem.core.api + +import com.insanusmokrassar.postssystem.core.content.* +import com.insanusmokrassar.postssystem.core.utils.generateContentId +import kotlinx.serialization.json.Json +import kotlin.test.Test +import kotlin.test.assertEquals + +class ContentSerialization { + @Test + fun test_that_content_correctly_serializing_and_deserializing() { + val contents = listOf( + SimpleTextContent("Example"), + SimpleSpecialContent("Some internal id") + ) + + val registeredContentFakes = contents.map { content -> + RegisteredContent( + generateContentId(), + content + ) + } + + val stringified = registeredContentFakes.map { + Json.plain.stringify(RegisteredContent.serializer(), it) + } + + val parsed = stringified.map { + Json.plain.parse(RegisteredContent.serializer(), it) + } + + parsed.forEachIndexed { i, registeredContent -> assertEquals(registeredContentFakes[i], registeredContent) } + } +} diff --git a/postssystem.exposed/build.gradle b/postssystem.exposed/build.gradle index 36989b80..b6586c42 100644 --- a/postssystem.exposed/build.gradle +++ b/postssystem.exposed/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation project(":postssystem.core") api "org.jetbrains.exposed:exposed:$exposed_version" + testImplementation "org.xerial:sqlite-jdbc:$test_sqlite_version" testImplementation "org.junit.jupiter:junit-jupiter-api:$test_junit_version" }