Skip to content

Commit

Permalink
test(ls): Add test for #6554
Browse files Browse the repository at this point in the history
  • Loading branch information
RenjiSann committed Jul 22, 2024
1 parent 1bd5c91 commit 9c5b073
Showing 1 changed file with 209 additions and 2 deletions.
211 changes: 209 additions & 2 deletions tests/by-util/test_ls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2197,6 +2197,213 @@ fn test_ls_recursive_1() {
.stdout_is(out);
}

#[test]
#[cfg(unix)]
// The test can't run on windows, because a folder in windows can't have a colon
// in it. Therefore, the call to `mkdir dir:name` will fail.
fn test_ls_recursive_escape_dirname() {
#[allow(clippy::type_complexity)]
let cases: &[(&str, &[&str], &[(&str, &str, &str)])] = &[
(
// Control case
"dirname",
&[],
&[
("literal", "dirname", "./dirname"),
("shell", "dirname", "./dirname"),
("shell-always", "'dirname'", "'./dirname'"),
("shell-escape", "dirname", "./dirname"),
("shell-escape-always", "'dirname'", "'./dirname'"),
("c", "\"dirname\"", "\"./dirname\""),
("escape", "dirname", "./dirname"),
],
),
(
// Space character
"dir name",
&[],
&[
("literal", "dir name", "./dir name"),
("shell", "'dir name'", "'./dir name'"),
("shell-always", "'dir name'", "'./dir name'"),
("shell-escape", "'dir name'", "'./dir name'"),
("shell-escape-always", "'dir name'", "'./dir name'"),
("c", "\"dir name\"", "\"./dir name\""),
("escape", "dir\\ name", "./dir name"),
],
),
(
// Dollar character
"dir$name",
&[],
&[
("literal", "dir$name", "./dir$name"),
("shell", "'dir$name'", "'./dir$name'"),
("shell-always", "'dir$name'", "'./dir$name'"),
("shell-escape", "'dir$name'", "'./dir$name'"),
("shell-escape-always", "'dir$name'", "'./dir$name'"),
("c", "\"dir$name\"", "\"./dir$name\""),
("escape", "dir$name", "./dir$name"),
],
),
(
// Single quote character
"dir'name",
&[],
&[
("literal", "dir'name", "./dir'name"),
("shell", "\"dir'name\"", "\"./dir'name\""),
("shell-always", "\"dir'name\"", "\"./dir'name\""),
("shell-escape", "\"dir'name\"", "\"./dir'name\""),
("shell-escape-always", "\"dir'name\"", "\"./dir'name\""),
("c", "\"dir'name\"", "\"./dir'name\""),
("escape", "dir'name", "./dir'name"),
],
),
(
// Double quote character
"dir\"name",
&[],
&[
("literal", "dir\"name", "./dir\"name"),
("shell", "'dir\"name'", "'./dir\"name'"),
("shell-always", "'dir\"name'", "'./dir\"name'"),
("shell-escape", "'dir\"name'", "'./dir\"name'"),
("shell-escape-always", "'dir\"name'", "'./dir\"name'"),
("c", "\"dir\\\"name\"", "\"./dir\\\"name\""),
("escape", "dir\"name", "./dir\"name"),
],
),
(
// Colon character
"dir:name",
&[],
&[
("literal", "dir:name", "./dir:name"),
("shell", "dir:name", "'./dir:name'"),
("shell-always", "'dir:name'", "'./dir:name'"),
("shell-escape", "dir:name", "'./dir:name'"),
("shell-escape-always", "'dir:name'", "'./dir:name'"),
("c", "\"dir:name\"", "\"./dir\\:name\""),
("escape", "dir:name", "./dir\\:name"),
],
),
(
// Backslash character
"dir\\name",
&[],
&[
("literal", "dir\\name", "./dir\\name"),
("shell", "'dir\\name'", "'./dir\\name'"),
("shell-always", "'dir\\name'", "'./dir\\name'"),
("shell-escape", "'dir\\name'", "'./dir\\name'"),
("shell-escape-always", "'dir\\name'", "'./dir\\name'"),
("c", "\"dir\\\\name\"", "\"./dir\\\\name\""),
("escape", "dir\\\\name", "./dir\\\\name"),
],
),
(
// Linefeed character
"dir\nname",
&[],
&[
("literal", "dir\nname", "./dir\nname"),
("shell", "'dir\nname'", "'./dir\nname'"),
("shell-always", "'dir\nname'", "'./dir\nname'"),
("shell-escape", "'dir'$'\\n''name'", "'./dir'$'\\n''name'"),
(
"shell-escape-always",
"'dir'$'\\n''name'",
"'./dir'$'\\n''name'",
),
("c", "\"dir\\nname\"", "\"./dir\\nname\""),
("escape", "dir\\nname", "./dir\\nname"),
],
),
(
// Linefeed character WITH hide-control-chars
"dir\nname",
&["--hide-control-chars"],
&[
("literal", "dir?name", "./dir?name"),
("shell", "'dir?name'", "'./dir?name'"),
("shell-always", "'dir?name'", "'./dir?name'"),
("shell-escape", "'dir'$'\\n''name'", "'./dir'$'\\n''name'"),
(
"shell-escape-always",
"'dir'$'\\n''name'",
"'./dir'$'\\n''name'",
),
("c", "\"dir\\nname\"", "\"./dir\\nname\""),
("escape", "dir\\nname", "./dir\\nname"),
],
),
(
// Tabulation character
"dir\tname",
&[],
&[
("literal", "dir\tname", "./dir\tname"),
("shell", "'dir\tname'", "'./dir\tname'"),
("shell-always", "'dir\tname'", "'./dir\tname'"),
("shell-escape", "'dir'$'\\t''name'", "'./dir'$'\\t''name'"),
(
"shell-escape-always",
"'dir'$'\\t''name'",
"'./dir'$'\\t''name'",
),
("c", "\"dir\\tname\"", "\"./dir\\tname\""),
("escape", "dir\\tname", "./dir\\tname"),
],
),
(
// Tabulation character WITH hide-control-chars
"dir\tname",
&["--hide-control-chars"],
&[
("literal", "dir?name", "./dir?name"),
("shell", "'dir?name'", "'./dir?name'"),
("shell-always", "'dir?name'", "'./dir?name'"),
("shell-escape", "'dir'$'\\t''name'", "'./dir'$'\\t''name'"),
(
"shell-escape-always",
"'dir'$'\\t''name'",
"'./dir'$'\\t''name'",
),
("c", "\"dir\\tname\"", "\"./dir\\tname\""),
("escape", "dir\\tname", "./dir\\tname"),
],
),
];

for (dirname, extra_args, styles) in cases {
for (qt_style, regular_mode, dir_mode) in *styles {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.mkdir(dirname);

let expected = format!(
"{}:\n{}\n\n{}:\n",
match *qt_style {
"shell-always" | "shell-escape-always" => "'.'",
"c" => "\".\"",
_ => ".",
},
regular_mode,
dir_mode
);

scene
.ucmd()
.arg("-R")
.arg(format!("--quoting-style={qt_style}"))
.args(extra_args)
.succeeds()
.stdout_is(expected);
}
}
}

#[test]
fn test_ls_color() {
let scene = TestScenario::new(util_name!());
Expand Down Expand Up @@ -2738,7 +2945,7 @@ fn test_ls_quoting_style() {
("--quoting-style=shell-escape-always", "'one'$'\\n''two'"),
("--quoting-style=shell-escape-alway", "'one'$'\\n''two'"),
("--quoting-style=shell-escape-a", "'one'$'\\n''two'"),
("--quoting-style=shell", "one?two"),
("--quoting-style=shell", "'one?two'"),
("--quoting-style=shell-always", "'one?two'"),
("--quoting-style=shell-a", "'one?two'"),
] {
Expand All @@ -2756,7 +2963,7 @@ fn test_ls_quoting_style() {
("-N", "one\ntwo"),
("--literal", "one\ntwo"),
("--l", "one\ntwo"),
("--quoting-style=shell", "one\ntwo"), // FIXME: GNU ls quotes this case
("--quoting-style=shell", "'one\ntwo'"),
("--quoting-style=shell-always", "'one\ntwo'"),
] {
scene
Expand Down

0 comments on commit 9c5b073

Please sign in to comment.