@@ -138,7 +138,7 @@ pub fn utf8_percent_encode<'a>(input: &'a str, ascii_set: &'static AsciiSet) ->
138
138
}
139
139
140
140
/// The return type of [`percent_encode`] and [`utf8_percent_encode`].
141
- #[ derive( Clone ) ]
141
+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
142
142
pub struct PercentEncode < ' a > {
143
143
bytes : & ' a [ u8 ] ,
144
144
ascii_set : & ' static AsciiSet ,
@@ -363,3 +363,119 @@ fn decode_utf8_lossy(input: Cow<'_, [u8]>) -> Cow<'_, str> {
363
363
}
364
364
}
365
365
}
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