@@ -14,14 +14,15 @@ use std::{
1414 collections:: { BTreeMap , HashSet } ,
1515} ;
1616
17+ #[ cfg( feature = "decimal128" ) ]
18+ use bson:: Decimal128 ;
1719use bson:: {
1820 doc,
1921 oid:: ObjectId ,
2022 spec:: BinarySubtype ,
2123 Binary ,
2224 Bson ,
2325 DateTime ,
24- Decimal128 ,
2526 Deserializer ,
2627 Document ,
2728 JavaScriptCodeWithScope ,
@@ -37,6 +38,7 @@ use bson::{
3738/// - deserializing a `T` from the raw BSON version of `expected_doc` produces `expected_value`
3839/// - deserializing a `Document` from the raw BSON version of `expected_doc` produces
3940/// `expected_doc`
41+ /// - `bson::to_writer` and `Document::to_writer` produce the same result given the same input
4042fn run_test < T > ( expected_value : & T , expected_doc : & Document , description : & str )
4143where
4244 T : Serialize + DeserializeOwned + PartialEq + std:: fmt:: Debug ,
4648 . to_writer ( & mut expected_bytes)
4749 . expect ( description) ;
4850
51+ let expected_bytes_serde = bson:: to_vec ( & expected_value) . expect ( description) ;
52+ assert_eq ! ( expected_bytes_serde, expected_bytes, "{}" , description) ;
53+
54+ let expected_bytes_from_doc_serde = bson:: to_vec ( & expected_doc) . expect ( description) ;
55+ assert_eq ! (
56+ expected_bytes_from_doc_serde, expected_bytes,
57+ "{}" ,
58+ description
59+ ) ;
60+
4961 let serialized_doc = bson:: to_document ( & expected_value) . expect ( description) ;
5062 assert_eq ! ( & serialized_doc, expected_doc, "{}" , description) ;
5163 assert_eq ! (
@@ -702,7 +714,7 @@ fn all_types() {
702714 undefined : Bson ,
703715 code : Bson ,
704716 code_w_scope : JavaScriptCodeWithScope ,
705- decimal : Decimal128 ,
717+ decimal : Bson ,
706718 symbol : Bson ,
707719 min_key : Bson ,
708720 max_key : Bson ,
@@ -737,6 +749,16 @@ fn all_types() {
737749 let oid = ObjectId :: new ( ) ;
738750 let subdoc = doc ! { "k" : true , "b" : { "hello" : "world" } } ;
739751
752+ #[ cfg( not( feature = "decimal128" ) ) ]
753+ let decimal = {
754+ let bytes = hex:: decode ( "18000000136400D0070000000000000000000000003A3000" ) . unwrap ( ) ;
755+ let d = Document :: from_reader ( bytes. as_slice ( ) ) . unwrap ( ) ;
756+ d. get ( "d" ) . unwrap ( ) . clone ( )
757+ } ;
758+
759+ #[ cfg( feature = "decimal128" ) ]
760+ let decimal = Bson :: Decimal128 ( Decimal128 :: from_str ( "2.000" ) ) ;
761+
740762 let doc = doc ! {
741763 "x" : 1 ,
742764 "y" : 2_i64 ,
@@ -758,7 +780,7 @@ fn all_types() {
758780 "undefined" : Bson :: Undefined ,
759781 "code" : code. clone( ) ,
760782 "code_w_scope" : code_w_scope. clone( ) ,
761- "decimal" : Bson :: Decimal128 ( Decimal128 :: from_i32 ( 5 ) ) ,
783+ "decimal" : decimal . clone ( ) ,
762784 "symbol" : Bson :: Symbol ( "ok" . to_string( ) ) ,
763785 "min_key" : Bson :: MinKey ,
764786 "max_key" : Bson :: MaxKey ,
@@ -789,7 +811,7 @@ fn all_types() {
789811 undefined : Bson :: Undefined ,
790812 code,
791813 code_w_scope,
792- decimal : Decimal128 :: from_i32 ( 5 ) ,
814+ decimal,
793815 symbol : Bson :: Symbol ( "ok" . to_string ( ) ) ,
794816 min_key : Bson :: MinKey ,
795817 max_key : Bson :: MaxKey ,
@@ -851,3 +873,83 @@ fn borrowed() {
851873 bson:: from_slice ( bson. as_slice ( ) ) . expect ( "deserialization should succeed" ) ;
852874 assert_eq ! ( deserialized, v) ;
853875}
876+
877+ #[ cfg( feature = "u2i" ) ]
878+ #[ test]
879+ fn u2i ( ) {
880+ #[ derive( Serialize , Deserialize , Debug , PartialEq ) ]
881+ struct Foo {
882+ u_8 : u8 ,
883+ u_16 : u16 ,
884+ u_32 : u32 ,
885+ u_32_max : u32 ,
886+ u_64 : u64 ,
887+ i_64_max : u64 ,
888+ }
889+
890+ let v = Foo {
891+ u_8 : 15 ,
892+ u_16 : 123 ,
893+ u_32 : 1234 ,
894+ u_32_max : u32:: MAX ,
895+ u_64 : 12345 ,
896+ i_64_max : i64:: MAX as u64 ,
897+ } ;
898+
899+ let expected = doc ! {
900+ "u_8" : 15_i32 ,
901+ "u_16" : 123_i32 ,
902+ "u_32" : 1234_i64 ,
903+ "u_32_max" : u32 :: MAX as i64 ,
904+ "u_64" : 12345_i64 ,
905+ "i_64_max" : i64 :: MAX as u64 ,
906+ } ;
907+
908+ run_test ( & v, & expected, "u2i - valid" ) ;
909+
910+ #[ derive( Serialize , Debug ) ]
911+ struct TooBig {
912+ u_64 : u64 ,
913+ }
914+ let v = TooBig {
915+ u_64 : i64:: MAX as u64 + 1 ,
916+ } ;
917+ bson:: to_document ( & v) . unwrap_err ( ) ;
918+ bson:: to_vec ( & v) . unwrap_err ( ) ;
919+ }
920+
921+ #[ cfg( not( feature = "u2i" ) ) ]
922+ #[ test]
923+ fn unsigned ( ) {
924+ #[ derive( Serialize , Debug ) ]
925+ struct U8 {
926+ v : u8 ,
927+ }
928+ let v = U8 { v : 1 } ;
929+ bson:: to_document ( & v) . unwrap_err ( ) ;
930+ bson:: to_vec ( & v) . unwrap_err ( ) ;
931+
932+ #[ derive( Serialize , Debug ) ]
933+ struct U16 {
934+ v : u16 ,
935+ }
936+ let v = U16 { v : 1 } ;
937+ bson:: to_document ( & v) . unwrap_err ( ) ;
938+ bson:: to_vec ( & v) . unwrap_err ( ) ;
939+
940+ #[ derive( Serialize , Debug ) ]
941+ struct U32 {
942+ v : u32 ,
943+ }
944+ let v = U32 { v : 1 } ;
945+ bson:: to_document ( & v) . unwrap_err ( ) ;
946+ bson:: to_vec ( & v) . unwrap_err ( ) ;
947+
948+ #[ derive( Serialize , Debug ) ]
949+ struct U64 {
950+ v : u64 ,
951+ }
952+ let v = U64 { v : 1 } ;
953+ bson:: to_document ( & v) . unwrap_err ( ) ;
954+ bson:: to_vec ( & v) . unwrap_err ( ) ;
955+ }
0 commit comments