@@ -138,7 +138,7 @@ pub fn utf8_percent_encode<'a>(input: &'a str, ascii_set: &'static AsciiSet) ->
138138}
139139
140140/// The return type of [`percent_encode`] and [`utf8_percent_encode`].
141- #[ derive( Clone ) ]
141+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
142142pub struct PercentEncode < ' a > {
143143 bytes : & ' a [ u8 ] ,
144144 ascii_set : & ' static AsciiSet ,
@@ -363,3 +363,119 @@ fn decode_utf8_lossy(input: Cow<'_, [u8]>) -> Cow<'_, str> {
363363 }
364364 }
365365}
366+
367+ #[ cfg( test) ]
368+ mod tests {
369+
370+ use super :: * ;
371+
372+ #[ test]
373+ fn percent_encode_byte ( ) {
374+ for i in 0 ..=0xFF {
375+ let encoded = super :: percent_encode_byte ( i) ;
376+ assert_eq ! ( encoded, alloc:: format!( "%{:02X}" , i) ) ;
377+ }
378+ }
379+
380+ #[ test]
381+ fn percent_encode_accepts_ascii_set_ref ( ) {
382+ let encoded = percent_encode ( b"foo bar?" , & AsciiSet :: EMPTY ) ;
383+ assert_eq ! ( encoded. collect:: <String >( ) , "foo bar?" ) ;
384+ }
385+
386+ #[ test]
387+ fn percent_encode_collect ( ) {
388+ let encoded = percent_encode ( b"foo bar?" , NON_ALPHANUMERIC ) ;
389+ assert_eq ! ( encoded. collect:: <String >( ) , String :: from( "foo%20bar%3F" ) ) ;
390+
391+ let encoded = percent_encode ( b"\x00 \x01 \x02 \x03 " , CONTROLS ) ;
392+ assert_eq ! ( encoded. collect:: <String >( ) , String :: from( "%00%01%02%03" ) ) ;
393+ }
394+
395+ #[ test]
396+ fn percent_encode_display ( ) {
397+ let encoded = percent_encode ( b"foo bar?" , NON_ALPHANUMERIC ) ;
398+ assert_eq ! ( alloc:: format!( "{}" , encoded) , "foo%20bar%3F" ) ;
399+ }
400+
401+ #[ test]
402+ fn percent_encode_cow ( ) {
403+ let encoded = percent_encode ( b"foo bar?" , NON_ALPHANUMERIC ) ;
404+ assert_eq ! ( Cow :: from( encoded) , "foo%20bar%3F" ) ;
405+ }
406+
407+ #[ test]
408+ fn utf8_percent_encode_accepts_ascii_set_ref ( ) {
409+ let encoded = super :: utf8_percent_encode ( "foo bar?" , & AsciiSet :: EMPTY ) ;
410+ assert_eq ! ( encoded. collect:: <String >( ) , "foo bar?" ) ;
411+ }
412+
413+ #[ test]
414+ fn utf8_percent_encode ( ) {
415+ assert_eq ! (
416+ super :: utf8_percent_encode( "foo bar?" , NON_ALPHANUMERIC ) ,
417+ percent_encode( b"foo bar?" , NON_ALPHANUMERIC )
418+ ) ;
419+ }
420+
421+ #[ test]
422+ fn percent_decode ( ) {
423+ assert_eq ! (
424+ super :: percent_decode( b"foo%20bar%3f" )
425+ . decode_utf8( )
426+ . unwrap( ) ,
427+ "foo bar?"
428+ ) ;
429+ }
430+
431+ #[ test]
432+ fn percent_decode_str ( ) {
433+ assert_eq ! (
434+ super :: percent_decode_str( "foo%20bar%3f" )
435+ . decode_utf8( )
436+ . unwrap( ) ,
437+ "foo bar?"
438+ ) ;
439+ }
440+
441+ #[ test]
442+ fn percent_decode_collect ( ) {
443+ let decoded = super :: percent_decode ( b"foo%20bar%3f" ) ;
444+ assert_eq ! ( decoded. collect:: <Vec <u8 >>( ) , b"foo bar?" ) ;
445+ }
446+
447+ #[ test]
448+ fn percent_decode_cow ( ) {
449+ let decoded = super :: percent_decode ( b"foo%20bar%3f" ) ;
450+ assert_eq ! ( Cow :: from( decoded) , Cow :: Owned :: <[ u8 ] >( b"foo bar?" . to_vec( ) ) ) ;
451+
452+ let decoded = super :: percent_decode ( b"foo bar?" ) ;
453+ assert_eq ! ( Cow :: from( decoded) , Cow :: Borrowed ( b"foo bar?" ) ) ;
454+ }
455+
456+ #[ test]
457+ fn percent_decode_invalid_utf8 ( ) {
458+ // Invalid UTF-8 sequence
459+ let decoded = super :: percent_decode ( b"%00%9F%92%96" )
460+ . decode_utf8 ( )
461+ . unwrap_err ( ) ;
462+ assert_eq ! ( decoded. valid_up_to( ) , 1 ) ;
463+ assert_eq ! ( decoded. error_len( ) , Some ( 1 ) ) ;
464+ }
465+
466+ #[ test]
467+ fn percent_decode_utf8_lossy ( ) {
468+ assert_eq ! (
469+ super :: percent_decode( b"%F0%9F%92%96" ) . decode_utf8_lossy( ) ,
470+ "💖"
471+ ) ;
472+ }
473+
474+ #[ test]
475+ fn percent_decode_utf8_lossy_invalid_utf8 ( ) {
476+ assert_eq ! (
477+ super :: percent_decode( b"%00%9F%92%96" ) . decode_utf8_lossy( ) ,
478+ "\u{0} ���"
479+ ) ;
480+ }
481+ }
0 commit comments