• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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