diff options
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt')
-rw-r--r-- | formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt new file mode 100644 index 00000000..e0903470 --- /dev/null +++ b/formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:UseSerializers(NotNullSerializersCompatibilityOnFileTest.NonNullableIntSerializer::class) +@file:UseContextualSerialization(NotNullSerializersCompatibilityOnFileTest.FileContextualType::class) + +package kotlinx.serialization + +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual +import kotlin.test.* + +class NotNullSerializersCompatibilityOnFileTest { + data class FileContextualType(val text: String) + + object FileContextualSerializer : KSerializer<FileContextualType> { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("FileContextualSerializer", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: FileContextualType) { + return encoder.encodeString(value.text) + } + + override fun deserialize(decoder: Decoder): FileContextualType { + return FileContextualType(decoder.decodeString()) + } + } + + @Serializable + data class FileContextualHolder(val nullable: FileContextualType?, val nonNullable: FileContextualType) + + + data class ContextualType(val text: String) + + object ContextualSerializer : KSerializer<ContextualType> { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("FileContextualSerializer", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: ContextualType) { + return encoder.encodeString(value.text) + } + + override fun deserialize(decoder: Decoder): ContextualType { + return ContextualType(decoder.decodeString()) + } + } + + @Serializable + data class ContextualHolder(@Contextual val nullable: ContextualType?, @Contextual val nonNullable: ContextualType) + + + @Serializable + data class Holder(val nullable: Int?, val nonNullable: Int) + + object NonNullableIntSerializer : KSerializer<Int> { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("NotNullIntSerializer", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: Int) { + return encoder.encodeInt(value + 2) + } + + override fun deserialize(decoder: Decoder): Int { + return (decoder.decodeInt() - 2) + } + } + + @Test + fun testFileLevel() { + assertEquals("""{"nullable":null,"nonNullable":52}""", Json.encodeToString(Holder(nullable = null, nonNullable = 50))) + assertEquals("""{"nullable":2,"nonNullable":2}""", Json.encodeToString(Holder(nullable = 0, nonNullable = 0))) + assertEquals("""{"nullable":12,"nonNullable":52}""", Json.encodeToString(Holder(nullable = 10, nonNullable = 50))) + + assertEquals(Holder(nullable = 0, nonNullable = 50), Json.decodeFromString("""{"nullable":2,"nonNullable":52}""")) + assertEquals(Holder(nullable = null, nonNullable = 50), Json.decodeFromString("""{"nullable":null,"nonNullable":52}""")) + assertEquals(Holder(nullable = 10, nonNullable = 50), Json.decodeFromString("""{"nullable":12,"nonNullable":52}""")) + } + + @Test + fun testFileContextual() { + val module = SerializersModule { + contextual(FileContextualSerializer) + } + + val json = Json { serializersModule = module } + + assertEquals("""{"nullable":null,"nonNullable":"foo"}""", json.encodeToString(FileContextualHolder(null, FileContextualType("foo")))) + assertEquals("""{"nullable":"foo","nonNullable":"bar"}""", json.encodeToString( + FileContextualHolder( + FileContextualType("foo"), FileContextualType("bar") + ) + )) + + assertEquals(FileContextualHolder(null, FileContextualType("foo")), json.decodeFromString("""{"nullable":null,"nonNullable":"foo"}""")) + assertEquals(FileContextualHolder(FileContextualType("foo"), FileContextualType("bar")), json.decodeFromString("""{"nullable":"foo","nonNullable":"bar"}""")) + } + + @Test + fun testContextual() { + val module = SerializersModule { + contextual(ContextualSerializer) + } + + val json = Json { serializersModule = module } + + assertEquals("""{"nullable":null,"nonNullable":"foo"}""", json.encodeToString(ContextualHolder(null, ContextualType("foo")))) + assertEquals("""{"nullable":"foo","nonNullable":"bar"}""", json.encodeToString(ContextualHolder(ContextualType("foo"), ContextualType("bar")))) + + assertEquals(ContextualHolder(null, ContextualType("foo")), json.decodeFromString("""{"nullable":null,"nonNullable":"foo"}""")) + assertEquals(ContextualHolder(ContextualType("foo"), ContextualType("bar")), json.decodeFromString("""{"nullable":"foo","nonNullable":"bar"}""")) + } +} |