Skip to content

Commit cb0c408

Browse files
committed
For inline descriptors propagate the elementUseOutputKind value from the
serialParent. This makes all primitive map values serialized as element (in the case of collapsing the value). Add various tests for various variants of map values.
1 parent 32547cf commit cb0c408

File tree

2 files changed

+65
-2
lines changed
  • serialization/src

2 files changed

+65
-2
lines changed

serialization/src/commonMain/kotlin/nl/adaptivity/xmlutil/serialization/structure/XmlDescriptor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ public class XmlInlineDescriptor internal constructor(
805805
}
806806
}
807807

808-
val useParentInfo = ParentInfo(codecConfig.config, this, 0, effectiveUseNameInfo)
808+
val useParentInfo = ParentInfo(codecConfig.config, this, 0, effectiveUseNameInfo, serializerParent.elementUseOutputKind)
809809

810810
from(codecConfig, useParentInfo, tagParent, canBeAttribute)
811811
}
@@ -1632,7 +1632,8 @@ public class XmlMapDescriptor internal constructor(
16321632

16331633
private val valueDescriptor: XmlDescriptor by lazy(LazyThreadSafetyMode.PUBLICATION) {
16341634
val valueNameInfo = codecConfig.config.policy.mapValueName(serializerParent, isListEluded)
1635-
val parentInfo = ParentInfo(codecConfig.config, this, 1, valueNameInfo, OutputKind.Element)
1635+
val parentInfo =
1636+
ParentInfo(codecConfig.config, this, 1, valueNameInfo, if (isListEluded) OutputKind.Element else null)
16361637
val valueTagParent = InjectedParentTag(0, typeDescriptor[1], valueNameInfo, tagParent.namespace)
16371638
from(codecConfig, parentInfo, valueTagParent, canBeAttribute = true)
16381639
}

serialization/src/commonTest/kotlin/nl/adaptivity/xml/serialization/regressions/CustomMapKey274.kt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import kotlinx.serialization.encodeToString
2828
import nl.adaptivity.xmlutil.QName
2929
import nl.adaptivity.xmlutil.serialization.*
3030
import nl.adaptivity.xmlutil.serialization.structure.*
31+
import kotlin.jvm.JvmInline
3132
import kotlin.test.Test
3233
import kotlin.test.assertEquals
3334
import kotlin.test.assertIs
@@ -188,6 +189,54 @@ class CustomMapKey274 {
188189
assertEquals(expected, xml.decodeFromString<MyClass>(data))
189190
}
190191

192+
@Test
193+
fun testStringIntHolderDescriptor() {
194+
val myObjDesc = assertIs<XmlCompositeDescriptor>(xml.xmlDescriptor(StringIntHolderMap.serializer()).getElementDescriptor(0))
195+
assertEquals(QName("StringIntHolderMap"), myObjDesc.tagName)
196+
197+
assertEquals(1, myObjDesc.elementsCount)
198+
199+
val mapDesc = assertIs<XmlMapDescriptor>(myObjDesc.getElementDescriptor(0))
200+
assertEquals(true, mapDesc.isValueCollapsed)
201+
202+
val keyDesc = assertIs<XmlPrimitiveDescriptor>(mapDesc.getElementDescriptor(0))
203+
assertEquals(OutputKind.Attribute, keyDesc.outputKind)
204+
205+
val valueDesc = assertIs<XmlInlineDescriptor>(mapDesc.getElementDescriptor(1))
206+
assertEquals(OutputKind.Element, valueDesc.outputKind)
207+
208+
val inlineValueDesc = assertIs<XmlPrimitiveDescriptor>(valueDesc.getElementDescriptor(0))
209+
assertEquals(OutputKind.Element, inlineValueDesc.outputKind)
210+
}
211+
212+
@Test
213+
fun testSerializeStringIntHolderMap() {
214+
val data = StringIntHolderMap(mapOf("abc" to IntHolder(123), "def" to IntHolder(456)))
215+
val expected = "<StringIntHolderMap><value key=\"abc\">123</value><value key=\"def\">456</value></StringIntHolderMap>"
216+
assertXmlEquals(expected, xml.encodeToString(data))
217+
}
218+
219+
@Test
220+
fun testDeserializeStringIntHolderMap() {
221+
val expected = StringIntHolderMap(mapOf("abc" to IntHolder(123), "def" to IntHolder(456)))
222+
val data = "<StringIntHolderMap><value key=\"abc\">123</value><value key=\"def\">456</value></StringIntHolderMap>"
223+
assertEquals(expected, xml.decodeFromString(data))
224+
}
225+
226+
@Test
227+
fun testSerializeStringNonValueIntHolderMap() {
228+
val data = StringNonValueIntHolderMap(mapOf("abc" to NonValueIntHolder(123), "def" to NonValueIntHolder(456)))
229+
val expected = "<StringNonValueIntHolderMap><NonValueIntHolder key=\"abc\" data=\"123\"/><NonValueIntHolder key=\"def\" data=\"456\"/></StringNonValueIntHolderMap>"
230+
assertXmlEquals(expected, xml.encodeToString(data))
231+
}
232+
233+
@Test
234+
fun testDeserializeStringNonValueIntHolderMap() {
235+
val expected = StringNonValueIntHolderMap(mapOf("abc" to NonValueIntHolder(123), "def" to NonValueIntHolder(456)))
236+
val data = "<StringNonValueIntHolderMap><NonValueIntHolder key=\"abc\" data=\"123\"/><NonValueIntHolder key=\"def\" data=\"456\"/></StringNonValueIntHolderMap>"
237+
assertEquals(expected, xml.decodeFromString(data))
238+
}
239+
191240
@Serializable
192241
data class MapElement(val value: String)
193242

@@ -209,4 +258,17 @@ class CustomMapKey274 {
209258

210259
@Serializable
211260
data class MyClass(val map: Map<String, String>)
261+
262+
@Serializable
263+
@JvmInline
264+
value class IntHolder(val data: Int)
265+
266+
@Serializable
267+
data class StringIntHolderMap(val map: Map<String, IntHolder>)
268+
269+
@Serializable
270+
data class NonValueIntHolder(val data: Int)
271+
272+
@Serializable
273+
data class StringNonValueIntHolderMap(val map: Map<String, NonValueIntHolder>)
212274
}

0 commit comments

Comments
 (0)