1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 @file:UseSerializers(NotNullSerializersCompatibilityOnFileTest.NonNullableIntSerializer::class) 5 @file:UseContextualSerialization(NotNullSerializersCompatibilityOnFileTest.FileContextualType::class) 6 7 package kotlinx.serialization 8 9 import kotlinx.serialization.descriptors.* 10 import kotlinx.serialization.encoding.* 11 import kotlinx.serialization.json.* 12 import kotlinx.serialization.modules.SerializersModule 13 import kotlinx.serialization.modules.contextual 14 import kotlin.test.* 15 16 class NotNullSerializersCompatibilityOnFileTest { 17 data class FileContextualType(val text: String) 18 19 object FileContextualSerializer : KSerializer<FileContextualType> { 20 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("FileContextualSerializer", PrimitiveKind.STRING) 21 serializenull22 override fun serialize(encoder: Encoder, value: FileContextualType) { 23 return encoder.encodeString(value.text) 24 } 25 deserializenull26 override fun deserialize(decoder: Decoder): FileContextualType { 27 return FileContextualType(decoder.decodeString()) 28 } 29 } 30 31 @Serializable 32 data class FileContextualHolder(val nullable: FileContextualType?, val nonNullable: FileContextualType) 33 34 35 data class ContextualType(val text: String) 36 37 object ContextualSerializer : KSerializer<ContextualType> { 38 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("FileContextualSerializer", PrimitiveKind.STRING) 39 serializenull40 override fun serialize(encoder: Encoder, value: ContextualType) { 41 return encoder.encodeString(value.text) 42 } 43 deserializenull44 override fun deserialize(decoder: Decoder): ContextualType { 45 return ContextualType(decoder.decodeString()) 46 } 47 } 48 49 @Serializable 50 data class ContextualHolder(@Contextual val nullable: ContextualType?, @Contextual val nonNullable: ContextualType) 51 52 53 @Serializable 54 data class Holder(val nullable: Int?, val nonNullable: Int) 55 56 object NonNullableIntSerializer : KSerializer<Int> { 57 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("NotNullIntSerializer", PrimitiveKind.INT) 58 serializenull59 override fun serialize(encoder: Encoder, value: Int) { 60 return encoder.encodeInt(value + 2) 61 } 62 deserializenull63 override fun deserialize(decoder: Decoder): Int { 64 return (decoder.decodeInt() - 2) 65 } 66 } 67 68 @Test testFileLevelnull69 fun testFileLevel() { 70 assertEquals("""{"nullable":null,"nonNullable":52}""", Json.encodeToString(Holder(nullable = null, nonNullable = 50))) 71 assertEquals("""{"nullable":2,"nonNullable":2}""", Json.encodeToString(Holder(nullable = 0, nonNullable = 0))) 72 assertEquals("""{"nullable":12,"nonNullable":52}""", Json.encodeToString(Holder(nullable = 10, nonNullable = 50))) 73 74 assertEquals(Holder(nullable = 0, nonNullable = 50), Json.decodeFromString("""{"nullable":2,"nonNullable":52}""")) 75 assertEquals(Holder(nullable = null, nonNullable = 50), Json.decodeFromString("""{"nullable":null,"nonNullable":52}""")) 76 assertEquals(Holder(nullable = 10, nonNullable = 50), Json.decodeFromString("""{"nullable":12,"nonNullable":52}""")) 77 } 78 79 @Test testFileContextualnull80 fun testFileContextual() { 81 val module = SerializersModule { 82 contextual(FileContextualSerializer) 83 } 84 85 val json = Json { serializersModule = module } 86 87 assertEquals("""{"nullable":null,"nonNullable":"foo"}""", json.encodeToString(FileContextualHolder(null, FileContextualType("foo")))) 88 assertEquals("""{"nullable":"foo","nonNullable":"bar"}""", json.encodeToString( 89 FileContextualHolder( 90 FileContextualType("foo"), FileContextualType("bar") 91 ) 92 )) 93 94 assertEquals(FileContextualHolder(null, FileContextualType("foo")), json.decodeFromString("""{"nullable":null,"nonNullable":"foo"}""")) 95 assertEquals(FileContextualHolder(FileContextualType("foo"), FileContextualType("bar")), json.decodeFromString("""{"nullable":"foo","nonNullable":"bar"}""")) 96 } 97 98 @Test testContextualnull99 fun testContextual() { 100 val module = SerializersModule { 101 contextual(ContextualSerializer) 102 } 103 104 val json = Json { serializersModule = module } 105 106 assertEquals("""{"nullable":null,"nonNullable":"foo"}""", json.encodeToString(ContextualHolder(null, ContextualType("foo")))) 107 assertEquals("""{"nullable":"foo","nonNullable":"bar"}""", json.encodeToString(ContextualHolder(ContextualType("foo"), ContextualType("bar")))) 108 109 assertEquals(ContextualHolder(null, ContextualType("foo")), json.decodeFromString("""{"nullable":null,"nonNullable":"foo"}""")) 110 assertEquals(ContextualHolder(ContextualType("foo"), ContextualType("bar")), json.decodeFromString("""{"nullable":"foo","nonNullable":"bar"}""")) 111 } 112 } 113