summaryrefslogtreecommitdiffstats
path: root/vendor/gix-quote/tests/quote.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix-quote/tests/quote.rs')
-rw-r--r--vendor/gix-quote/tests/quote.rs84
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");
+ }
+ }
+}