2020using MongoDB . Bson . Serialization . Conventions ;
2121using MongoDB . Bson . Serialization . Serializers ;
2222using MongoDB . Driver . Core . TestHelpers . XunitExtensions ;
23+ using MongoDB . Driver . Linq ;
2324using Xunit ;
2425
2526namespace MongoDB . Driver . Tests
@@ -169,31 +170,68 @@ public void TestConventions()
169170 }
170171
171172 [ Fact ]
172- public void TestAggregate ( )
173+ public void TestDiscriminators ( )
173174 {
174175 RequireServer . Check ( ) ;
175176
176177 var customDomain = BsonSerializer . CreateSerializationDomain ( ) ;
177- customDomain . RegisterSerializer ( new CustomStringSerializer ( ) ) ;
178+
179+ customDomain . BsonClassMap . RegisterClassMap < BasePerson > ( cm =>
180+ {
181+ cm . AutoMap ( ) ;
182+ cm . SetIsRootClass ( true ) ;
183+ } ) ;
184+
185+ customDomain . BsonClassMap . RegisterClassMap < DerivedPerson1 > ( cm =>
186+ {
187+ cm . AutoMap ( ) ;
188+ cm . SetDiscriminator ( "dp1" ) ;
189+ } ) ;
190+
191+ customDomain . BsonClassMap . RegisterClassMap < DerivedPerson2 > ( cm =>
192+ {
193+ cm . AutoMap ( ) ;
194+ cm . SetDiscriminator ( "dp2" ) ;
195+ } ) ;
178196
179197 var client = DriverTestConfiguration . CreateMongoClient ( ( MongoClientSettings c ) => ( c as IInheritableMongoClientSettings ) . SerializationDomain = customDomain ) ;
180198 var db = client . GetDatabase ( DriverTestConfiguration . DatabaseNamespace . DatabaseName ) ;
181199 db . DropCollection ( DriverTestConfiguration . CollectionNamespace . CollectionName ) ;
182- var collection = db . GetCollection < Person > ( DriverTestConfiguration . CollectionNamespace . CollectionName ) ;
200+ var collection = db . GetCollection < BasePerson > ( DriverTestConfiguration . CollectionNamespace . CollectionName ) ;
183201 var untypedCollection = db . GetCollection < BsonDocument > ( DriverTestConfiguration . CollectionNamespace . CollectionName ) ;
184202
185- var person = new Person { Id = ObjectId . Parse ( "6797b56bf5495bf53aa3078f" ) , Name = "Mario" , Age = 24 } ;
186- collection . InsertOne ( person ) ;
203+ var bp1 = new DerivedPerson1 { Name = "Alice" , Age = 30 , ExtraField1 = "Field1" } ;
204+ var bp2 = new DerivedPerson2 { Name = "Bob" , Age = 40 , ExtraField2 = "Field2" } ;
205+ collection . InsertMany ( new BasePerson [ ] { bp1 , bp2 } ) ;
187206
188- var retrievedAsBson = untypedCollection . FindSync ( "{}" ) . ToList ( ) . Single ( ) ;
189- var toString = retrievedAsBson . ToString ( ) ;
207+ var test1 = collection . Aggregate ( ) . OfType < DerivedPerson1 > ( ) . Single ( ) ;
208+ var test2 = collection . Aggregate ( ) . OfType < DerivedPerson2 > ( ) . Single ( ) ;
190209
191- var expectedVal =
192- """{ "_id" : { "$oid" : "6797b56bf5495bf53aa3078f" }, "Name" : "Mariotest", "Age" : 24 }""" ;
193- Assert . Equal ( expectedVal , toString ) ;
210+ Assert . Equal ( bp1 . Id , test1 . Id ) ;
211+ Assert . Equal ( bp2 . Id , test2 . Id ) ;
194212
195- var retrievedTyped = collection . AsQueryable ( ) . Where ( x => x . Name == "Mario" ) . ToList ( ) ; //The string serializer is correctly serializing "Mario" to "Mariotest"
196- Assert . NotEmpty ( retrievedTyped ) ;
213+ var a1 = collection . AsQueryable ( ) . AppendStage ( PipelineStageDefinitionBuilder . OfType < BasePerson , DerivedPerson1 > ( ) )
214+ . OfType < DerivedPerson1 > ( ) . Single ( ) ;
215+ var a2 = collection . AsQueryable ( ) . AppendStage ( PipelineStageDefinitionBuilder . OfType < BasePerson , DerivedPerson2 > ( ) )
216+ . OfType < DerivedPerson2 > ( ) . Single ( ) ;
217+
218+ Assert . Equal ( bp1 . Id , a1 . Id ) ;
219+ Assert . Equal ( bp2 . Id , a2 . Id ) ;
220+
221+ var res1 = collection . AsQueryable ( ) . OfType < DerivedPerson1 > ( ) . Single ( ) ;
222+ var res2 = collection . AsQueryable ( ) . OfType < DerivedPerson2 > ( ) . Single ( ) ;
223+
224+ Assert . Equal ( bp1 . Id , res1 . Id ) ;
225+ Assert . Equal ( bp2 . Id , res2 . Id ) ;
226+
227+ var filter1 = Builders < BasePerson > . Filter . OfType < DerivedPerson1 > ( ) ;
228+ var dp1 = collection . FindSync ( filter1 ) . Single ( ) ;
229+
230+ var filter2 = Builders < BasePerson > . Filter . OfType < DerivedPerson2 > ( ) ;
231+ var dp2 = collection . FindSync ( filter2 ) . Single ( ) ;
232+
233+ Assert . Equal ( bp1 . Id , dp1 . Id ) ;
234+ Assert . Equal ( bp2 . Id , dp2 . Id ) ;
197235 }
198236
199237 public class Person
@@ -212,15 +250,22 @@ public class Person1
212250
213251 public class BasePerson
214252 {
215- [ BsonId ] public ObjectId Id { get ; set ; }
253+ [ BsonId ] public ObjectId Id { get ; set ; } = ObjectId . GenerateNewId ( ) ;
216254 public string Name { get ; set ; }
217255 public int Age { get ; set ; }
218256 }
219257
220- public class DerivedPerson : BasePerson
258+ public class DerivedPerson1 : BasePerson
221259 {
260+ public string ExtraField1 { get ; set ; }
222261 }
223262
263+ public class DerivedPerson2 : BasePerson
264+ {
265+ public string ExtraField2 { get ; set ; }
266+ }
267+
268+
224269 public class CustomStringSerializer : SealedClassSerializerBase < string > //This serializer just adds "test" to any serialised string
225270 {
226271 /// <inheritdoc/>
0 commit comments