@@ -27,9 +27,13 @@ import org.bson.BsonDocument
2727import org.bson.BsonDocumentReader
2828import org.bson.BsonDocumentWriter
2929import org.bson.BsonInvalidOperationException
30+ import org.bson.BsonMaxKey
31+ import org.bson.BsonMinKey
32+ import org.bson.BsonUndefined
3033import org.bson.codecs.DecoderContext
3134import org.bson.codecs.EncoderContext
3235import org.bson.codecs.configuration.CodecConfigurationException
36+ import org.bson.codecs.kotlinx.samples.DataClassBsonValues
3337import org.bson.codecs.kotlinx.samples.DataClassContainsOpen
3438import org.bson.codecs.kotlinx.samples.DataClassContainsValueClass
3539import org.bson.codecs.kotlinx.samples.DataClassEmbedded
@@ -43,6 +47,7 @@ import org.bson.codecs.kotlinx.samples.DataClassNestedParameterizedTypes
4347import org.bson.codecs.kotlinx.samples.DataClassOpen
4448import org.bson.codecs.kotlinx.samples.DataClassOpenA
4549import org.bson.codecs.kotlinx.samples.DataClassOpenB
50+ import org.bson.codecs.kotlinx.samples.DataClassOptionalBsonValues
4651import org.bson.codecs.kotlinx.samples.DataClassParameterized
4752import org.bson.codecs.kotlinx.samples.DataClassSealed
4853import org.bson.codecs.kotlinx.samples.DataClassSealedA
@@ -72,7 +77,6 @@ import org.bson.codecs.kotlinx.samples.DataClassWithMutableSet
7277import org.bson.codecs.kotlinx.samples.DataClassWithNestedParameterized
7378import org.bson.codecs.kotlinx.samples.DataClassWithNestedParameterizedDataClass
7479import org.bson.codecs.kotlinx.samples.DataClassWithNulls
75- import org.bson.codecs.kotlinx.samples.DataClassWithObjectIdAndBsonDocument
7680import org.bson.codecs.kotlinx.samples.DataClassWithPair
7781import org.bson.codecs.kotlinx.samples.DataClassWithParameterizedDataClass
7882import org.bson.codecs.kotlinx.samples.DataClassWithRequired
@@ -81,7 +85,6 @@ import org.bson.codecs.kotlinx.samples.DataClassWithSimpleValues
8185import org.bson.codecs.kotlinx.samples.DataClassWithTriple
8286import org.bson.codecs.kotlinx.samples.Key
8387import org.bson.codecs.kotlinx.samples.ValueClass
84- import org.bson.types.ObjectId
8588import org.junit.jupiter.api.Test
8689import org.junit.jupiter.api.assertThrows
8790
@@ -92,6 +95,40 @@ class KotlinSerializerCodecTest {
9295 private val altConfiguration =
9396 BsonConfiguration (encodeDefaults = false , classDiscriminator = " _t" , explicitNulls = true )
9497
98+ private val allBsonTypesJson =
99+ """ {
100+ | "id": {"${' $' } oid": "111111111111111111111111"},
101+ | "arrayEmpty": [],
102+ | "arraySimple": [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, {"${' $' } numberInt": "3"}],
103+ | "arrayComplex": [{"a": {"${' $' } numberInt": "1"}}, {"a": {"${' $' } numberInt": "2"}}],
104+ | "arrayMixedTypes": [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, true,
105+ | [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, {"${' $' } numberInt": "3"}],
106+ | {"a": {"${' $' } numberInt": "2"}}],
107+ | "arrayComplexMixedTypes": [{"a": {"${' $' } numberInt": "1"}}, {"a": "a"}],
108+ | "binary": {"${' $' } binary": {"base64": "S2Fma2Egcm9ja3Mh", "subType": "00"}},
109+ | "boolean": true,
110+ | "code": {"${' $' } code": "int i = 0;"},
111+ | "codeWithScope": {"${' $' } code": "int x = y", "${' $' } scope": {"y": {"${' $' } numberInt": "1"}}},
112+ | "dateTime": {"${' $' } date": {"${' $' } numberLong": "1577836801000"}},
113+ | "decimal128": {"${' $' } numberDecimal": "1.0"},
114+ | "documentEmpty": {},
115+ | "document": {"a": {"${' $' } numberInt": "1"}},
116+ | "double": {"${' $' } numberDouble": "62.0"},
117+ | "int32": {"${' $' } numberInt": "42"},
118+ | "int64": {"${' $' } numberLong": "52"},
119+ | "maxKey": {"${' $' } maxKey": 1},
120+ | "minKey": {"${' $' } minKey": 1},
121+ | "objectId": {"${' $' } oid": "211111111111111111111112"},
122+ | "regex": {"${' $' } regularExpression": {"pattern": "^test.*regex.*xyz$", "options": "i"}},
123+ | "string": "the fox ...",
124+ | "symbol": {"${' $' } symbol": "ruby stuff"},
125+ | "timestamp": {"${' $' } timestamp": {"t": 305419896, "i": 5}},
126+ | "undefined": {"${' $' } undefined": true}
127+ | }"""
128+ .trimMargin()
129+
130+ private val allBsonTypesDocument = BsonDocument .parse(allBsonTypesJson)
131+
95132 @Test
96133 fun testDataClassWithSimpleValues () {
97134 val expected =
@@ -432,44 +469,109 @@ class KotlinSerializerCodecTest {
432469 }
433470
434471 @Test
435- fun testDataClassWithObjectIdAndBsonDocument () {
436- val subDocument =
437- """ {
438- | "_id": 1,
439- | "arrayEmpty": [],
440- | "arraySimple": [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, {"${' $' } numberInt": "3"}],
441- | "arrayComplex": [{"a": {"${' $' } numberInt": "1"}}, {"a": {"${' $' } numberInt": "2"}}],
442- | "arrayMixedTypes": [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, true,
443- | [{"${' $' } numberInt": "1"}, {"${' $' } numberInt": "2"}, {"${' $' } numberInt": "3"}],
444- | {"a": {"${' $' } numberInt": "2"}}],
445- | "arrayComplexMixedTypes": [{"a": {"${' $' } numberInt": "1"}}, {"a": "a"}],
446- | "binary": {"${' $' } binary": {"base64": "S2Fma2Egcm9ja3Mh", "subType": "00"}},
447- | "boolean": true,
448- | "code": {"${' $' } code": "int i = 0;"},
449- | "codeWithScope": {"${' $' } code": "int x = y", "${' $' } scope": {"y": {"${' $' } numberInt": "1"}}},
450- | "dateTime": {"${' $' } date": {"${' $' } numberLong": "1577836801000"}},
451- | "decimal128": {"${' $' } numberDecimal": "1.0"},
452- | "documentEmpty": {},
453- | "document": {"a": {"${' $' } numberInt": "1"}},
454- | "double": {"${' $' } numberDouble": "62.0"},
455- | "int32": {"${' $' } numberInt": "42"},
456- | "int64": {"${' $' } numberLong": "52"},
457- | "maxKey": {"${' $' } maxKey": 1},
458- | "minKey": {"${' $' } minKey": 1},
459- | "null": null,
460- | "objectId": {"${' $' } oid": "5f3d1bbde0ca4d2829c91e1d"},
461- | "regex": {"${' $' } regularExpression": {"pattern": "^test.*regex.*xyz$", "options": "i"}},
462- | "string": "the fox ...",
463- | "symbol": {"${' $' } symbol": "ruby stuff"},
464- | "timestamp": {"${' $' } timestamp": {"t": 305419896, "i": 5}},
465- | "undefined": {"${' $' } undefined": true}
466- | }"""
467- .trimMargin()
468- val expected = """ {"objectId": {"${' $' } oid": "111111111111111111111111"}, "bsonDocument": $subDocument }"""
472+ fun testDataClassBsonValues () {
469473
470474 val dataClass =
471- DataClassWithObjectIdAndBsonDocument (ObjectId (" 111111111111111111111111" ), BsonDocument .parse(subDocument))
472- assertRoundTrips(expected, dataClass)
475+ DataClassBsonValues (
476+ allBsonTypesDocument[" id" ]!! .asObjectId().value,
477+ allBsonTypesDocument[" arrayEmpty" ]!! .asArray(),
478+ allBsonTypesDocument[" arraySimple" ]!! .asArray(),
479+ allBsonTypesDocument[" arrayComplex" ]!! .asArray(),
480+ allBsonTypesDocument[" arrayMixedTypes" ]!! .asArray(),
481+ allBsonTypesDocument[" arrayComplexMixedTypes" ]!! .asArray(),
482+ allBsonTypesDocument[" binary" ]!! .asBinary(),
483+ allBsonTypesDocument[" boolean" ]!! .asBoolean(),
484+ allBsonTypesDocument[" code" ]!! .asJavaScript(),
485+ allBsonTypesDocument[" codeWithScope" ]!! .asJavaScriptWithScope(),
486+ allBsonTypesDocument[" dateTime" ]!! .asDateTime(),
487+ allBsonTypesDocument[" decimal128" ]!! .asDecimal128(),
488+ allBsonTypesDocument[" documentEmpty" ]!! .asDocument(),
489+ allBsonTypesDocument[" document" ]!! .asDocument(),
490+ allBsonTypesDocument[" double" ]!! .asDouble(),
491+ allBsonTypesDocument[" int32" ]!! .asInt32(),
492+ allBsonTypesDocument[" int64" ]!! .asInt64(),
493+ allBsonTypesDocument[" maxKey" ]!! as BsonMaxKey ,
494+ allBsonTypesDocument[" minKey" ]!! as BsonMinKey ,
495+ allBsonTypesDocument[" objectId" ]!! .asObjectId(),
496+ allBsonTypesDocument[" regex" ]!! .asRegularExpression(),
497+ allBsonTypesDocument[" string" ]!! .asString(),
498+ allBsonTypesDocument[" symbol" ]!! .asSymbol(),
499+ allBsonTypesDocument[" timestamp" ]!! .asTimestamp(),
500+ allBsonTypesDocument[" undefined" ]!! as BsonUndefined )
501+
502+ assertRoundTrips(allBsonTypesJson, dataClass)
503+ }
504+
505+ @Test
506+ fun testDataClassOptionalBsonValues () {
507+ val dataClass =
508+ DataClassOptionalBsonValues (
509+ allBsonTypesDocument[" id" ]!! .asObjectId().value,
510+ allBsonTypesDocument[" arrayEmpty" ]!! .asArray(),
511+ allBsonTypesDocument[" arraySimple" ]!! .asArray(),
512+ allBsonTypesDocument[" arrayComplex" ]!! .asArray(),
513+ allBsonTypesDocument[" arrayMixedTypes" ]!! .asArray(),
514+ allBsonTypesDocument[" arrayComplexMixedTypes" ]!! .asArray(),
515+ allBsonTypesDocument[" binary" ]!! .asBinary(),
516+ allBsonTypesDocument[" boolean" ]!! .asBoolean(),
517+ allBsonTypesDocument[" code" ]!! .asJavaScript(),
518+ allBsonTypesDocument[" codeWithScope" ]!! .asJavaScriptWithScope(),
519+ allBsonTypesDocument[" dateTime" ]!! .asDateTime(),
520+ allBsonTypesDocument[" decimal128" ]!! .asDecimal128(),
521+ allBsonTypesDocument[" documentEmpty" ]!! .asDocument(),
522+ allBsonTypesDocument[" document" ]!! .asDocument(),
523+ allBsonTypesDocument[" double" ]!! .asDouble(),
524+ allBsonTypesDocument[" int32" ]!! .asInt32(),
525+ allBsonTypesDocument[" int64" ]!! .asInt64(),
526+ allBsonTypesDocument[" maxKey" ]!! as BsonMaxKey ,
527+ allBsonTypesDocument[" minKey" ]!! as BsonMinKey ,
528+ allBsonTypesDocument[" objectId" ]!! .asObjectId(),
529+ allBsonTypesDocument[" regex" ]!! .asRegularExpression(),
530+ allBsonTypesDocument[" string" ]!! .asString(),
531+ allBsonTypesDocument[" symbol" ]!! .asSymbol(),
532+ allBsonTypesDocument[" timestamp" ]!! .asTimestamp(),
533+ allBsonTypesDocument[" undefined" ]!! as BsonUndefined )
534+
535+ assertRoundTrips(allBsonTypesJson, dataClass)
536+
537+ val emptyDataClass =
538+ DataClassOptionalBsonValues (
539+ null ,
540+ null ,
541+ null ,
542+ null ,
543+ null ,
544+ null ,
545+ null ,
546+ null ,
547+ null ,
548+ null ,
549+ null ,
550+ null ,
551+ null ,
552+ null ,
553+ null ,
554+ null ,
555+ null ,
556+ null ,
557+ null ,
558+ null ,
559+ null ,
560+ null ,
561+ null ,
562+ null ,
563+ null )
564+
565+ assertRoundTrips(" {}" , emptyDataClass)
566+ assertRoundTrips(
567+ """ { "id": null, "arrayEmpty": null, "arraySimple": null, "arrayComplex": null, "arrayMixedTypes": null,
568+ | "arrayComplexMixedTypes": null, "binary": null, "boolean": null, "code": null, "codeWithScope": null,
569+ | "dateTime": null, "decimal128": null, "documentEmpty": null, "document": null, "double": null,
570+ | "int32": null, "int64": null, "maxKey": null, "minKey": null, "objectId": null, "regex": null,
571+ | "string": null, "symbol": null, "timestamp": null, "undefined": null }"""
572+ .trimMargin(),
573+ emptyDataClass,
574+ BsonConfiguration (explicitNulls = true ))
473575 }
474576
475577 @Test
0 commit comments