@@ -20,6 +20,20 @@ import kotlin.test.assertEquals
20
20
import kotlin.test.assertNotNull
21
21
import kotlin.test.assertNull
22
22
import kotlin.test.assertTrue
23
+ import kotlinx.serialization.ExperimentalSerializationApi
24
+ import kotlinx.serialization.modules.SerializersModule
25
+ import kotlinx.serialization.modules.plus
26
+ import kotlinx.serialization.modules.polymorphic
27
+ import kotlinx.serialization.modules.subclass
28
+ import org.bson.BsonDocument
29
+ import org.bson.BsonDocumentReader
30
+ import org.bson.BsonDocumentWriter
31
+ import org.bson.codecs.DecoderContext
32
+ import org.bson.codecs.EncoderContext
33
+ import org.bson.codecs.kotlinx.samples.DataClassContainsOpen
34
+ import org.bson.codecs.kotlinx.samples.DataClassOpen
35
+ import org.bson.codecs.kotlinx.samples.DataClassOpenA
36
+ import org.bson.codecs.kotlinx.samples.DataClassOpenB
23
37
import org.bson.codecs.kotlinx.samples.DataClassParameterized
24
38
import org.bson.codecs.kotlinx.samples.DataClassWithSimpleValues
25
39
import org.bson.conversions.Bson
@@ -60,4 +74,37 @@ class KotlinSerializerCodecProviderTest {
60
74
assertTrue { codec is KotlinSerializerCodec }
61
75
assertEquals(DataClassWithSimpleValues ::class .java, codec.encoderClass)
62
76
}
77
+
78
+ @OptIn(ExperimentalSerializationApi ::class )
79
+ @Test
80
+ fun shouldAllowOverridingOfSerializersModuleAndBsonConfigurationInConstructor () {
81
+
82
+ val serializersModule =
83
+ SerializersModule {
84
+ this .polymorphic(DataClassOpen ::class ) {
85
+ this .subclass(DataClassOpenA ::class )
86
+ this .subclass(DataClassOpenB ::class )
87
+ }
88
+ } + defaultSerializersModule
89
+
90
+ val bsonConfiguration = BsonConfiguration (classDiscriminator = " __type" )
91
+ val dataClassContainsOpenB = DataClassContainsOpen (DataClassOpenB (1 ))
92
+
93
+ val codec =
94
+ KotlinSerializerCodecProvider (serializersModule, bsonConfiguration)
95
+ .get(DataClassContainsOpen ::class .java, Bson .DEFAULT_CODEC_REGISTRY )!!
96
+
97
+ assertTrue { codec is KotlinSerializerCodec }
98
+ val encodedDocument = BsonDocument ()
99
+ val writer = BsonDocumentWriter (encodedDocument)
100
+ codec.encode(writer, dataClassContainsOpenB, EncoderContext .builder().build())
101
+ writer.flush()
102
+
103
+ assertEquals(
104
+ BsonDocument .parse(""" {"open": {"__type": "org.bson.codecs.kotlinx.samples.DataClassOpenB", "b": 1}}""" ),
105
+ encodedDocument)
106
+
107
+ assertEquals(
108
+ dataClassContainsOpenB, codec.decode(BsonDocumentReader (encodedDocument), DecoderContext .builder().build()))
109
+ }
63
110
}
0 commit comments