@@ -169,3 +169,75 @@ fn test_serde_bytes() {
169
169
let f = bson:: from_bson :: < Foo > ( b) . unwrap ( ) ;
170
170
assert_eq ! ( x, f) ;
171
171
}
172
+
173
+ #[ test]
174
+ fn test_serde_newtype_struct ( ) {
175
+ #[ derive( Debug , PartialEq , Eq , Serialize , Deserialize ) ]
176
+ struct Email ( String ) ;
177
+
178
+ let email_1 =
Email ( String :: from ( "[email protected] " ) ) ;
179
+ let b = bson:: to_bson ( & email_1) . unwrap ( ) ;
180
+ assert_eq ! ( b, Bson :: String ( email_1. 0 ) ) ;
181
+
182
+ let s =
String :: from ( "[email protected] " ) ;
183
+ let de = Bson :: String ( s. clone ( ) ) ;
184
+ let email_2 = bson:: from_bson :: < Email > ( de) . unwrap ( ) ;
185
+ assert_eq ! ( email_2, Email ( s) ) ;
186
+ }
187
+
188
+ #[ test]
189
+ fn test_serde_tuple_struct ( ) {
190
+ #[ derive( Debug , PartialEq , Eq , Serialize , Deserialize ) ]
191
+ struct Name ( String , String ) ; // first, last
192
+
193
+ let name_1 = Name ( String :: from ( "Graydon" ) , String :: from ( "Hoare" ) ) ;
194
+ let b = bson:: to_bson ( & name_1) . unwrap ( ) ;
195
+ assert_eq ! ( b, bson!( [
196
+ name_1. 0 . clone( ) ,
197
+ name_1. 1 . clone( ) ,
198
+ ] ) ) ;
199
+
200
+ let ( first, last) = ( String :: from ( "Donald" ) , String :: from ( "Knuth" ) ) ;
201
+ let de = bson ! ( [ first. clone( ) , last. clone( ) ] ) ;
202
+ let name_2 = bson:: from_bson :: < Name > ( de) . unwrap ( ) ;
203
+ assert_eq ! ( name_2, Name ( first, last) ) ;
204
+ }
205
+
206
+ #[ test]
207
+ fn test_serde_newtype_variant ( ) {
208
+ #[ derive( Debug , PartialEq , Serialize , Deserialize ) ]
209
+ #[ serde( tag = "type" , content = "value" ) ]
210
+ enum Number {
211
+ Int ( i64 ) ,
212
+ Float ( f64 ) ,
213
+ }
214
+
215
+ let n = 42 ;
216
+ let num_1 = Number :: Int ( n) ;
217
+ let b = bson:: to_bson ( & num_1) . unwrap ( ) ;
218
+ assert_eq ! ( b, bson!( { "type" : "Int" , "value" : n } ) ) ;
219
+
220
+ let x = 1337.0 ;
221
+ let de = bson ! ( { "type" : "Float" , "value" : x } ) ;
222
+ let num_2 = bson:: from_bson :: < Number > ( de) . unwrap ( ) ;
223
+ assert_eq ! ( num_2, Number :: Float ( x) ) ;
224
+ }
225
+
226
+ #[ test]
227
+ fn test_serde_tuple_variant ( ) {
228
+ #[ derive( Debug , PartialEq , Serialize , Deserialize ) ]
229
+ enum Point {
230
+ TwoDim ( f64 , f64 ) ,
231
+ ThreeDim ( f64 , f64 , f64 ) ,
232
+ }
233
+
234
+ let ( x1, y1) = ( 3.14 , -2.71 ) ;
235
+ let p1 = Point :: TwoDim ( x1, y1) ;
236
+ let b = bson:: to_bson ( & p1) . unwrap ( ) ;
237
+ assert_eq ! ( b, bson!( { "TwoDim" : [ x1, y1] } ) ) ;
238
+
239
+ let ( x2, y2, z2) = ( 0.0 , -13.37 , 4.2 ) ;
240
+ let de = bson ! ( { "ThreeDim" : [ x2, y2, z2] } ) ;
241
+ let p2 = bson:: from_bson :: < Point > ( de) . unwrap ( ) ;
242
+ assert_eq ! ( p2, Point :: ThreeDim ( x2, y2, z2) ) ;
243
+ }
0 commit comments