@@ -14,14 +14,15 @@ use std::{
14
14
collections:: { BTreeMap , HashSet } ,
15
15
} ;
16
16
17
+ #[ cfg( feature = "decimal128" ) ]
18
+ use bson:: Decimal128 ;
17
19
use bson:: {
18
20
doc,
19
21
oid:: ObjectId ,
20
22
spec:: BinarySubtype ,
21
23
Binary ,
22
24
Bson ,
23
25
DateTime ,
24
- Decimal128 ,
25
26
Deserializer ,
26
27
Document ,
27
28
JavaScriptCodeWithScope ,
@@ -37,6 +38,7 @@ use bson::{
37
38
/// - deserializing a `T` from the raw BSON version of `expected_doc` produces `expected_value`
38
39
/// - deserializing a `Document` from the raw BSON version of `expected_doc` produces
39
40
/// `expected_doc`
41
+ /// - `bson::to_writer` and `Document::to_writer` produce the same result given the same input
40
42
fn run_test < T > ( expected_value : & T , expected_doc : & Document , description : & str )
41
43
where
42
44
T : Serialize + DeserializeOwned + PartialEq + std:: fmt:: Debug ,
46
48
. to_writer ( & mut expected_bytes)
47
49
. expect ( description) ;
48
50
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
+
49
61
let serialized_doc = bson:: to_document ( & expected_value) . expect ( description) ;
50
62
assert_eq ! ( & serialized_doc, expected_doc, "{}" , description) ;
51
63
assert_eq ! (
@@ -702,7 +714,7 @@ fn all_types() {
702
714
undefined : Bson ,
703
715
code : Bson ,
704
716
code_w_scope : JavaScriptCodeWithScope ,
705
- decimal : Decimal128 ,
717
+ decimal : Bson ,
706
718
symbol : Bson ,
707
719
min_key : Bson ,
708
720
max_key : Bson ,
@@ -737,6 +749,16 @@ fn all_types() {
737
749
let oid = ObjectId :: new ( ) ;
738
750
let subdoc = doc ! { "k" : true , "b" : { "hello" : "world" } } ;
739
751
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
+
740
762
let doc = doc ! {
741
763
"x" : 1 ,
742
764
"y" : 2_i64 ,
@@ -758,7 +780,7 @@ fn all_types() {
758
780
"undefined" : Bson :: Undefined ,
759
781
"code" : code. clone( ) ,
760
782
"code_w_scope" : code_w_scope. clone( ) ,
761
- "decimal" : Bson :: Decimal128 ( Decimal128 :: from_i32 ( 5 ) ) ,
783
+ "decimal" : decimal . clone ( ) ,
762
784
"symbol" : Bson :: Symbol ( "ok" . to_string( ) ) ,
763
785
"min_key" : Bson :: MinKey ,
764
786
"max_key" : Bson :: MaxKey ,
@@ -789,7 +811,7 @@ fn all_types() {
789
811
undefined : Bson :: Undefined ,
790
812
code,
791
813
code_w_scope,
792
- decimal : Decimal128 :: from_i32 ( 5 ) ,
814
+ decimal,
793
815
symbol : Bson :: Symbol ( "ok" . to_string ( ) ) ,
794
816
min_key : Bson :: MinKey ,
795
817
max_key : Bson :: MaxKey ,
@@ -851,3 +873,83 @@ fn borrowed() {
851
873
bson:: from_slice ( bson. as_slice ( ) ) . expect ( "deserialization should succeed" ) ;
852
874
assert_eq ! ( deserialized, v) ;
853
875
}
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