@@ -20,6 +20,20 @@ import kotlin.test.assertEquals
2020import kotlin.test.assertNotNull
2121import kotlin.test.assertNull
2222import 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
2337import org.bson.codecs.kotlinx.samples.DataClassParameterized
2438import org.bson.codecs.kotlinx.samples.DataClassWithSimpleValues
2539import org.bson.conversions.Bson
@@ -60,4 +74,37 @@ class KotlinSerializerCodecProviderTest {
6074 assertTrue { codec is KotlinSerializerCodec }
6175 assertEquals(DataClassWithSimpleValues ::class .java, codec.encoderClass)
6276 }
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+ }
63110}
0 commit comments