From 57aa964c3b101352ca0707758700e3e490807085 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 13 Oct 2023 13:37:19 +0200 Subject: [PATCH 1/2] Tests for fixes for #KT-62522 and #KT-62215 JVM works already, Native should work with 2.0. --- .../sample/MultiFileHierarchyModuleA.kt | 21 ++++++++++++++ .../sample/MultiFileHierarchyModuleB.kt | 14 ++++++++++ .../kotlin/sample/MultiFileHierarchyTest.kt | 28 +++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt b/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt index 3afcd51b6c..e7e255f858 100644 --- a/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt +++ b/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt @@ -28,3 +28,24 @@ abstract class NotInConstructorBase { val b = "val b" val a = "val a" } + +@Serializable +open class GenericBox { + var contents: Map? = null +} + +// From #1264 +@Serializable +sealed class TypedSealedClass(val a: T) { + @Serializable + class Child(val y: Int) : TypedSealedClass("10") { + override fun toString(): String = "Child($a, $y)" + } +} + +// From #KT-43910 +@Serializable +open class ValidatableValue( + var value: T? = null, + var error: V? = null, +) diff --git a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyModuleB.kt b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyModuleB.kt index 0cf9efa4cf..6409d22bc9 100644 --- a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyModuleB.kt +++ b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyModuleB.kt @@ -60,3 +60,17 @@ class NotInConstructorTest : NotInConstructorBase() { return a.hashCode() * 31 + b.hashCode() * 31 + c.hashCode() } } + +@Serializable +data class TestData(val field: String) + + +@Serializable +class TestClass(): GenericBox() + +@Serializable +class Email : ValidatableValue() { + override fun toString(): String { + return "Email($value, $error)" + } +} diff --git a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt index d3bddfa6f2..cbc11abfd7 100644 --- a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt +++ b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt @@ -4,6 +4,7 @@ package sample +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic @@ -73,4 +74,31 @@ class AbstractBaseTest { fun testPropertiesNotInConstructor() { assertStringFormAndRestored("""{"b":"val b","a":"val a","c":"val c"}""", NotInConstructorTest(), NotInConstructorTest.serializer()) } + + @Test + fun testSimpleChild() { + val encodedChild = """{"a":"11","y":42}""" + val decodedChild = Json.decodeFromString(encodedChild) + assertEquals("Child(11, 42)", decodedChild.toString()) + assertEquals(encodedChild, Json.encodeToString(decodedChild)) + } + + @Test + fun testDoubleGeneric() { + val email = Email().apply { + value = "foo" + error = 1 + } + val encodedEmail = Json.encodeToString(email) + assertEquals("""{"value":"foo","error":1}""", encodedEmail) + assertEquals("Email(foo, 1)", Json.decodeFromString>(encodedEmail).toString()) + } + + @Test + fun test() { + val t = TestClass().also { it.contents = mapOf("a" to TestData("data")) } + val s = Json.encodeToString(t) + assertEquals("""{"contents":{"a":{"field":"data"}}}""", s) + assertEquals("data", Json.decodeFromString(s).contents?.get("a")?.field) + } } From c0a2258d7c909c35535ef07208ad48ce86bd82d9 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 11 Dec 2024 19:50:57 +0100 Subject: [PATCH 2/2] ~move generic override test directly into kotlinx-serialization test suite --- .../serialization/GenericOverrideTest.kt | 33 +++++++++++++++++++ .../sample/MultiFileHierarchyModuleA.kt | 9 ----- .../kotlin/sample/MultiFileHierarchyTest.kt | 8 ----- 3 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 formats/json-tests/commonTest/src/kotlinx/serialization/GenericOverrideTest.kt diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/GenericOverrideTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/GenericOverrideTest.kt new file mode 100644 index 0000000000..5b76724037 --- /dev/null +++ b/formats/json-tests/commonTest/src/kotlinx/serialization/GenericOverrideTest.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2017-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.serialization + +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.json.* +import kotlin.test.Test + +class GenericOverrideTest: JsonTestBase() { + + @Serializable + sealed class TypedSealedClass(val a: T) { + @Serializable + @SerialName("child") + data class Child(val y: Int) : TypedSealedClass("10") { + override fun toString(): String = "Child($a, $y)" + } + } + + @Test + fun testAinChildSerializesAsString() = parametrizedTest { mode -> + val encodedChild = """{"a":"10","y":42}""" + assertJsonFormAndRestored(TypedSealedClass.Child.serializer(), TypedSealedClass.Child(42), encodedChild) + } + + @Test + fun testSerializeAsBaseClass() = parametrizedTest { mode -> + val encodedChild = """{"type":"child","a":"10","y":42}""" + assertJsonFormAndRestored(TypedSealedClass.serializer(String.serializer()), TypedSealedClass.Child(42), encodedChild) + } +} diff --git a/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt b/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt index e7e255f858..087ab27f5b 100644 --- a/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt +++ b/integration-test/src/commonMain/kotlin/sample/MultiFileHierarchyModuleA.kt @@ -34,15 +34,6 @@ open class GenericBox { var contents: Map? = null } -// From #1264 -@Serializable -sealed class TypedSealedClass(val a: T) { - @Serializable - class Child(val y: Int) : TypedSealedClass("10") { - override fun toString(): String = "Child($a, $y)" - } -} - // From #KT-43910 @Serializable open class ValidatableValue( diff --git a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt index cbc11abfd7..f40d85a0d9 100644 --- a/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt +++ b/integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt @@ -75,14 +75,6 @@ class AbstractBaseTest { assertStringFormAndRestored("""{"b":"val b","a":"val a","c":"val c"}""", NotInConstructorTest(), NotInConstructorTest.serializer()) } - @Test - fun testSimpleChild() { - val encodedChild = """{"a":"11","y":42}""" - val decodedChild = Json.decodeFromString(encodedChild) - assertEquals("Child(11, 42)", decodedChild.toString()) - assertEquals(encodedChild, Json.encodeToString(decodedChild)) - } - @Test fun testDoubleGeneric() { val email = Email().apply {