diff options
Diffstat (limited to 'vendor/gix-quote/tests/quote.rs')
-rw-r--r-- | vendor/gix-quote/tests/quote.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/vendor/gix-quote/tests/quote.rs b/vendor/gix-quote/tests/quote.rs new file mode 100644 index 000000000..fa8a73eda --- /dev/null +++ b/vendor/gix-quote/tests/quote.rs @@ -0,0 +1,84 @@ +mod single { + use gix_quote::single; + + #[test] + fn empty() { + assert_eq!(single("".into()), "''"); + } + + #[test] + fn unquoted_becomes_quoted() { + assert_eq!(single("a".into()), "'a'"); + assert_eq!(single("a b".into()), "'a b'"); + assert_eq!(single("a\nb".into()), "'a\nb'", "newlines play no role"); + } + + #[test] + fn existing_exclamation_mark_gets_escaped() { + assert_eq!(single(r"a!b".into()), r"'a'\!'b'"); + assert_eq!(single(r"!".into()), r"''\!''"); + assert_eq!(single(r"\!".into()), r"'\'\!''"); + } + + #[test] + fn existing_quote_gets_escaped() { + assert_eq!(single(r"a'b".into()), r"'a'\''b'"); + assert_eq!(single(r"'".into()), r"''\'''"); + assert_eq!(single(r"'\''".into()), r"''\''\'\'''\'''"); + } + + #[test] + fn complex() { + let expected = "\'\0cmd `arg` $var\\\'\\\'\'ring\\// arg \"quoted\'\\!\'\"\'"; + assert_eq!(single("\0cmd `arg` $var\\'ring\\// arg \"quoted!\"".into()), expected); + } +} + +mod ansi_c { + mod undo { + use bstr::ByteSlice; + use gix_quote::ansi_c; + + macro_rules! test { + ($name:ident, $input:literal, $expected:literal, $consumed:literal) => { + #[test] + fn $name() { + assert_eq!( + ansi_c::undo($input.as_bytes().as_bstr()).expect("valid input"), + ( + std::borrow::Cow::Borrowed($expected.as_bytes().as_bstr()), + $consumed + ) + ); + } + }; + } + + test!(unquoted_remains_unchanged, "hello", "hello", 5); + test!(empty_surrounded_by_quotes, "\"\"", "", 2); + test!(surrounded_only_by_quotes, "\"hello\"", "hello", 7); + test!(typical_escapes, r#""\n\r\t""#, b"\n\r\t", 8); + test!(untypical_escapes, r#""\a\b\f\v""#, b"\x07\x08\x0c\x0b", 10); + test!(literal_escape_and_double_quote, r#""\"\\""#, br#""\"#, 6); + test!( + unicode_byte_escapes_by_number, + r#""\346\277\261\351\207\216\t\347\264\224""#, + "濱野\t純", + 40 + ); + test!( + exclamation_and_tilde_survive_an_escape_with_double_escaping, + r#""\\!\\#hello there/file.ext""#, + r"\!\#hello there/file.ext", + 28 + ); + + #[test] + fn out_of_quote_characters_can_be_passed_and_will_not_be_consumed() { + let input = br#""hello there" out of quote"#.as_bstr(); + let (unquoted, consumed) = ansi_c::undo(input).expect("valid input"); + assert_eq!(unquoted, std::borrow::Cow::Borrowed(b"hello there".as_bstr())); + assert_eq!(&input[consumed..], " out of quote"); + } + } +} |