@@ -332,3 +332,168 @@ pub mod option {
332332 <Option < String > >:: serialize ( & encoded, serializer)
333333 }
334334}
335+
336+ #[ cfg( test) ]
337+ mod tests {
338+ use super :: {
339+ decode, decode_url_safe, deserialize, deserialize_url_safe, encode, encode_url_safe,
340+ option, serialize, serialize_url_safe,
341+ } ;
342+ use serde:: { Deserialize , Serialize } ;
343+
344+ #[ test]
345+ fn standard_encode ( ) {
346+ assert_eq ! ( encode( b"Hello, world!" ) , "SGVsbG8sIHdvcmxkIQ==" ) ;
347+ assert_eq ! ( encode( b"" ) , "" ) ;
348+ assert_eq ! ( encode( b"f" ) , "Zg==" ) ;
349+ assert_eq ! ( encode( b"fo" ) , "Zm8=" ) ;
350+ assert_eq ! ( encode( b"foo" ) , "Zm9v" ) ;
351+ }
352+
353+ #[ test]
354+ fn standard_decode ( ) {
355+ assert_eq ! ( decode( "SGVsbG8sIHdvcmxkIQ==" ) . unwrap( ) , b"Hello, world!" ) ;
356+ assert_eq ! ( decode( "" ) . unwrap( ) , b"" ) ;
357+ assert_eq ! ( decode( "Zg==" ) . unwrap( ) , b"f" ) ;
358+ assert_eq ! ( decode( "Zm8=" ) . unwrap( ) , b"fo" ) ;
359+ assert_eq ! ( decode( "Zm9v" ) . unwrap( ) , b"foo" ) ;
360+ }
361+
362+ #[ test]
363+ fn url_safe_encode ( ) {
364+ assert_eq ! ( encode_url_safe( b"Hello, world!" ) , "SGVsbG8sIHdvcmxkIQ" ) ;
365+ assert_eq ! ( encode_url_safe( b"" ) , "" ) ;
366+ assert_eq ! ( encode_url_safe( b"f" ) , "Zg" ) ;
367+ assert_eq ! ( encode_url_safe( b"fo" ) , "Zm8" ) ;
368+ assert_eq ! ( encode_url_safe( b"foo" ) , "Zm9v" ) ;
369+ }
370+
371+ #[ test]
372+ fn url_safe_decode ( ) {
373+ assert_eq ! (
374+ decode_url_safe( "SGVsbG8sIHdvcmxkIQ" ) . unwrap( ) ,
375+ b"Hello, world!"
376+ ) ;
377+ assert_eq ! ( decode_url_safe( "" ) . unwrap( ) , b"" ) ;
378+ assert_eq ! ( decode_url_safe( "Zg" ) . unwrap( ) , b"f" ) ;
379+ assert_eq ! ( decode_url_safe( "Zm8" ) . unwrap( ) , b"fo" ) ;
380+ assert_eq ! ( decode_url_safe( "Zm9v" ) . unwrap( ) , b"foo" ) ;
381+ }
382+
383+ #[ test]
384+ fn roundtrip_standard ( ) {
385+ let data = b"The quick brown fox jumps over the lazy dog" ;
386+ assert_eq ! ( decode( encode( data) ) . unwrap( ) , data) ;
387+ }
388+
389+ #[ test]
390+ fn roundtrip_url_safe ( ) {
391+ let data = b"The quick brown fox jumps over the lazy dog" ;
392+ assert_eq ! ( decode_url_safe( encode_url_safe( data) ) . unwrap( ) , data) ;
393+ }
394+
395+ #[ derive( Serialize , Deserialize ) ]
396+ struct TestStruct {
397+ #[ serde( serialize_with = "serialize" , deserialize_with = "deserialize" ) ]
398+ data : Vec < u8 > ,
399+ }
400+
401+ #[ test]
402+ fn serde_standard ( ) {
403+ let original = TestStruct {
404+ data : b"test data" . to_vec ( ) ,
405+ } ;
406+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
407+ assert ! ( json. contains( "dGVzdCBkYXRh" ) ) ;
408+ let deserialized: TestStruct = serde_json:: from_str ( & json) . unwrap ( ) ;
409+ assert_eq ! ( deserialized. data, original. data) ;
410+ }
411+
412+ #[ derive( Serialize , Deserialize ) ]
413+ struct TestStructUrlSafe {
414+ #[ serde(
415+ serialize_with = "serialize_url_safe" ,
416+ deserialize_with = "deserialize_url_safe"
417+ ) ]
418+ data : Vec < u8 > ,
419+ }
420+
421+ #[ test]
422+ fn serde_url_safe ( ) {
423+ let original = TestStructUrlSafe {
424+ data : b"test data" . to_vec ( ) ,
425+ } ;
426+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
427+ assert ! ( json. contains( "dGVzdCBkYXRh" ) ) ;
428+ let deserialized: TestStructUrlSafe = serde_json:: from_str ( & json) . unwrap ( ) ;
429+ assert_eq ! ( deserialized. data, original. data) ;
430+ }
431+
432+ #[ derive( Serialize , Deserialize ) ]
433+ struct TestOptionalStruct {
434+ #[ serde(
435+ serialize_with = "option::serialize" ,
436+ deserialize_with = "option::deserialize"
437+ ) ]
438+ data : Option < Vec < u8 > > ,
439+ }
440+
441+ #[ test]
442+ fn serde_option_some ( ) {
443+ let original = TestOptionalStruct {
444+ data : Some ( b"test data" . to_vec ( ) ) ,
445+ } ;
446+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
447+ assert ! ( json. contains( "dGVzdCBkYXRh" ) ) ;
448+ let deserialized: TestOptionalStruct = serde_json:: from_str ( & json) . unwrap ( ) ;
449+ assert_eq ! ( deserialized. data, original. data) ;
450+ }
451+
452+ #[ test]
453+ fn serde_option_none ( ) {
454+ let original = TestOptionalStruct { data : None } ;
455+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
456+ assert ! ( json. contains( "null" ) ) ;
457+ let deserialized: TestOptionalStruct = serde_json:: from_str ( & json) . unwrap ( ) ;
458+ assert_eq ! ( deserialized. data, None ) ;
459+ }
460+
461+ #[ derive( Serialize , Deserialize ) ]
462+ struct TestOptionalStructUrlSafe {
463+ #[ serde(
464+ serialize_with = "option::serialize_url_safe" ,
465+ deserialize_with = "option::deserialize_url_safe"
466+ ) ]
467+ data : Option < Vec < u8 > > ,
468+ }
469+
470+ #[ test]
471+ fn serde_option_url_safe_some ( ) {
472+ let original = TestOptionalStructUrlSafe {
473+ data : Some ( b"test data" . to_vec ( ) ) ,
474+ } ;
475+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
476+ assert ! ( json. contains( "dGVzdCBkYXRh" ) ) ;
477+ let deserialized: TestOptionalStructUrlSafe = serde_json:: from_str ( & json) . unwrap ( ) ;
478+ assert_eq ! ( deserialized. data, original. data) ;
479+ }
480+
481+ #[ test]
482+ fn serde_option_url_safe_none ( ) {
483+ let original = TestOptionalStructUrlSafe { data : None } ;
484+ let json = serde_json:: to_string ( & original) . unwrap ( ) ;
485+ assert ! ( json. contains( "null" ) ) ;
486+ let deserialized: TestOptionalStructUrlSafe = serde_json:: from_str ( & json) . unwrap ( ) ;
487+ assert_eq ! ( deserialized. data, None ) ;
488+ }
489+
490+ #[ test]
491+ fn decode_invalid_standard ( ) {
492+ assert ! ( decode( "invalid!@#$" ) . is_err( ) ) ;
493+ }
494+
495+ #[ test]
496+ fn decode_invalid_url_safe ( ) {
497+ assert ! ( decode_url_safe( "invalid!@#$" ) . is_err( ) ) ;
498+ }
499+ }
0 commit comments