@@ -475,6 +475,118 @@ public void GeoWithin_typed()
475
475
"{ geoWithin: { circle: { center: { type: 'Point', coordinates: [-161.323242, 22.512557] }, radius: 7.5 }, path: 'location' } }" ) ;
476
476
}
477
477
478
+ [ Theory ]
479
+ [ MemberData ( nameof ( InTestData ) ) ]
480
+ public void In < T > ( T [ ] fieldValues , string [ ] fieldsRendered )
481
+ {
482
+ var subject = CreateSubject < BsonDocument > ( ) ;
483
+
484
+ AssertRendered (
485
+ subject . In ( "x" , fieldValues ) ,
486
+ $ "{{ in: {{ path: 'x', value: [{ string . Join ( "," , fieldsRendered ) } ] }} }}") ;
487
+ }
488
+
489
+ public static readonly object [ ] [ ] InTestData =
490
+ {
491
+ new object [ ] { new bool [ ] { true , false } , new [ ] { "true" , "false" } } ,
492
+ new object [ ] { new byte [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
493
+ new object [ ] { new sbyte [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
494
+ new object [ ] { new short [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
495
+ new object [ ] { new ushort [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
496
+ new object [ ] { new int [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
497
+ new object [ ] { new uint [ ] { 1 , 2 } , new [ ] { "1" , "2" } } ,
498
+ new object [ ] { new long [ ] { long . MaxValue , long . MinValue } , new [ ] { "NumberLong(\" 9223372036854775807\" )" , "NumberLong(\" -9223372036854775808\" )" } } ,
499
+ new object [ ] { new float [ ] { 1.5f , 2.5f } , new [ ] { "1.5" , "2.5" } } ,
500
+ new object [ ] { new double [ ] { 1.5 , 2.5 } , new [ ] { "1.5" , "2.5" } } ,
501
+ new object [ ] { new decimal [ ] { 1.5m , 2.5m } , new [ ] { "NumberDecimal(\" 1.5\" )" , "NumberDecimal(\" 2.5\" )" } } ,
502
+ new object [ ] { new [ ] { "str1" , "str2" } , new [ ] { "'str1'" , "'str2'" } } ,
503
+ new object [ ] { new [ ] { DateTime . MinValue , DateTime . MaxValue } , new [ ] { "ISODate(\" 0001-01-01T00:00:00Z\" )" , "ISODate(\" 9999-12-31T23:59:59.999Z\" )" } } ,
504
+ new object [ ] { new [ ] { DateTimeOffset . MinValue , DateTimeOffset . MaxValue } , new [ ] { "ISODate(\" 0001-01-01T00:00:00Z\" )" , "ISODate(\" 9999-12-31T23:59:59.999Z\" )" } } ,
505
+ new object [ ] { new [ ] { ObjectId . Empty , ObjectId . Parse ( "4d0ce088e447ad08b4721a37" ) } , new [ ] { "{ $oid: '000000000000000000000000' }" , "{ $oid: '4d0ce088e447ad08b4721a37' }" } } ,
506
+ new object [ ] { new object [ ] { ( byte ) 1 , ( short ) 2 , ( int ) 3 } , new [ ] { "1" , "2" , "3" } }
507
+ } ;
508
+
509
+ [ Theory ]
510
+ [ MemberData ( nameof ( InTypedTestData ) ) ]
511
+ public void In_typed < T > (
512
+ T [ ] fieldValues ,
513
+ string [ ] fieldValuesRendered ,
514
+ Expression < Func < Person , T > > fieldExpression ,
515
+ string fieldNameRendered )
516
+ {
517
+ var subject = CreateSubject < Person > ( ) ;
518
+ var fieldValuesArray = $ "[{ string . Join ( "," , fieldValuesRendered ) } ]";
519
+
520
+ AssertRendered (
521
+ subject . In ( "x" , fieldValues ) ,
522
+ $ "{{ in: {{ path: 'x', value: { fieldValuesArray } }} }}") ;
523
+
524
+ AssertRendered (
525
+ subject . In ( fieldExpression , fieldValues ) ,
526
+ $ "{{ in: {{path: '{ fieldNameRendered } ', value: { fieldValuesArray } }} }}") ;
527
+ }
528
+
529
+ public static readonly object [ ] [ ] InTypedTestData =
530
+ {
531
+ new object [ ] { new bool [ ] { true , false } , new [ ] { "true" , "false" } , Exp ( p => p . Retired ) , "ret" } ,
532
+ new object [ ] { new byte [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . UInt8 ) , nameof ( Person . UInt8 ) } ,
533
+ new object [ ] { new sbyte [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . Int8 ) , nameof ( Person . Int8 ) } ,
534
+ new object [ ] { new short [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . Int16 ) , nameof ( Person . Int16 ) } ,
535
+ new object [ ] { new ushort [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . UInt16 ) , nameof ( Person . UInt16 ) } ,
536
+ new object [ ] { new int [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . Int32 ) , nameof ( Person . Int32 ) } ,
537
+ new object [ ] { new uint [ ] { 1 , 2 } , new [ ] { "1" , "2" } , Exp ( p => p . UInt32 ) , nameof ( Person . UInt32 ) } ,
538
+ new object [ ] { new long [ ] { long . MaxValue , long . MinValue } , new [ ] { "NumberLong(\" 9223372036854775807\" )" , "NumberLong(\" -9223372036854775808\" )" } , Exp ( p => p . Int64 ) , nameof ( Person . Int64 ) } ,
539
+ new object [ ] { new float [ ] { 1.5f , 2.5f } , new [ ] { "1.5" , "2.5" } , Exp ( p => p . Float ) , nameof ( Person . Float ) } ,
540
+ new object [ ] { new double [ ] { 1.5 , 2.5 } , new [ ] { "1.5" , "2.5" } , Exp ( p => p . Double ) , nameof ( Person . Double ) } ,
541
+ new object [ ] { new decimal [ ] { 1.5m , 2.5m } , new [ ] { "NumberDecimal(\" 1.5\" )" , "NumberDecimal(\" 2.5\" )" } , Exp ( p => p . Decimal ) , nameof ( Person . Decimal ) } ,
542
+ new object [ ] { new [ ] { "str1" , "str2" } , new [ ] { "'str1'" , "'str2'" } , Exp ( p => p . FirstName ) , "fn" } ,
543
+ new object [ ] { new [ ] { DateTime . MinValue , DateTime . MaxValue } , new [ ] { "ISODate(\" 0001-01-01T00:00:00Z\" )" , "ISODate(\" 9999-12-31T23:59:59.999Z\" )" } , Exp ( p => p . Birthday ) , "dob" } ,
544
+ new object [ ] { new [ ] { DateTimeOffset . MinValue , DateTimeOffset . MaxValue } , new [ ] { "ISODate(\" 0001-01-01T00:00:00Z\" )" , "ISODate(\" 9999-12-31T23:59:59.999Z\" )" } , Exp ( p => p . DateTimeOffset ) , nameof ( Person . DateTimeOffset ) } ,
545
+ new object [ ] { new [ ] { ObjectId . Empty , ObjectId . Parse ( "4d0ce088e447ad08b4721a37" ) } , new [ ] { "{ $oid: '000000000000000000000000' }" , "{ $oid: '4d0ce088e447ad08b4721a37' }" } , Exp ( p => p . Id ) , "_id" } ,
546
+ new object [ ] { new object [ ] { ( byte ) 1 , ( short ) 2 , ( int ) 3 } , new [ ] { "1" , "2" , "3" } , Exp ( p => p . Object ) , nameof ( Person . Object ) }
547
+ } ;
548
+
549
+ [ Theory ]
550
+ [ MemberData ( nameof ( InUnsupportedTypesTestData ) ) ]
551
+ public void In_should_throw_on_unsupported_types < T > ( T value , Expression < Func < Person , T > > fieldExpression )
552
+ {
553
+ var subject = CreateSubject < BsonDocument > ( ) ;
554
+ Record . Exception ( ( ) => subject . In ( "x" , new [ ] { value } ) ) . Should ( ) . BeOfType < InvalidCastException > ( ) ;
555
+
556
+ var subjectTyped = CreateSubject < Person > ( ) ;
557
+ Record . Exception ( ( ) => subjectTyped . In ( fieldExpression , new [ ] { value } ) ) . Should ( ) . BeOfType < InvalidCastException > ( ) ;
558
+ }
559
+
560
+ [ Fact ]
561
+ public void In_should_throw_when_values_are_invalid ( )
562
+ {
563
+ var subject = CreateSubject < BsonDocument > ( ) ;
564
+ Record . Exception ( ( ) => subject . In ( "x" , new int [ ] { } ) ) . Should ( ) . BeOfType < ArgumentException > ( ) ;
565
+ Record . Exception ( ( ) => subject . In < int > ( "x" , null ) ) . Should ( ) . BeOfType < ArgumentNullException > ( ) ;
566
+
567
+ var subjectTyped = CreateSubject < Person > ( ) ;
568
+ Record . Exception ( ( ) => subjectTyped . In ( p => p . Age , new int [ ] { } ) ) . Should ( ) . BeOfType < ArgumentException > ( ) ;
569
+ Record . Exception ( ( ) => subjectTyped . In ( p => p . Age , null ) ) . Should ( ) . BeOfType < ArgumentNullException > ( ) ;
570
+ }
571
+
572
+ public static object [ ] [ ] InUnsupportedTypesTestData => new [ ]
573
+ {
574
+ new object [ ] { ( ulong ) 1 , Exp ( p => p . UInt64 ) } ,
575
+ new object [ ] { TimeSpan . Zero , Exp ( p => p . TimeSpan ) } ,
576
+ } ;
577
+
578
+ [ Fact ]
579
+ public void In_should_throw_when_values_are_not_of_same_type ( )
580
+ {
581
+ var values = new object [ ] { 1.5 , 1 } ;
582
+
583
+ var subject = CreateSubject < BsonDocument > ( ) ;
584
+ Record . Exception ( ( ) => subject . In ( "x" , values ) ) . Should ( ) . BeOfType < ArgumentException > ( ) ;
585
+
586
+ var subjectTyped = CreateSubject < Person > ( ) ;
587
+ Record . Exception ( ( ) => subjectTyped . In ( p => p . Object , values ) ) . Should ( ) . BeOfType < ArgumentException > ( ) ;
588
+ }
589
+
478
590
[ Fact ]
479
591
public void MoreLikeThis ( )
480
592
{
@@ -1117,6 +1229,7 @@ public class Person : SimplePerson
1117
1229
public ulong UInt64 { get ; set ; }
1118
1230
public float Float { get ; set ; }
1119
1231
public double Double { get ; set ; }
1232
+ public decimal Decimal { get ; set ; }
1120
1233
1121
1234
public DateTimeOffset DateTimeOffset { get ; set ; }
1122
1235
public TimeSpan TimeSpan { get ; set ; }
@@ -1135,6 +1248,8 @@ public class Person : SimplePerson
1135
1248
1136
1249
[ BsonElement ( "ret" ) ]
1137
1250
public bool Retired { get ; set ; }
1251
+
1252
+ public object Object { get ; set ; }
1138
1253
}
1139
1254
1140
1255
public class Family
0 commit comments