Skip to content

Commit eb354bd

Browse files
committed
Add tests for percent_encoding
1 parent dc19522 commit eb354bd

File tree

1 file changed

+117
-1
lines changed

1 file changed

+117
-1
lines changed

percent_encoding/src/lib.rs

+117-1
Original file line numberDiff line numberDiff line change
@@ -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)]
142142
pub 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

Comments
 (0)