2019-12-17 18:54:39 +00:00
|
|
|
use nu_test_support::fs::Stub::EmptyFile;
|
2021-03-15 07:26:30 +00:00
|
|
|
use nu_test_support::playground::Playground;
|
2020-05-07 11:03:43 +00:00
|
|
|
use nu_test_support::{nu, pipeline};
|
2019-08-02 09:23:39 +00:00
|
|
|
|
|
|
|
#[test]
|
2019-12-15 16:15:06 +00:00
|
|
|
fn lists_regular_files() {
|
2019-08-29 00:32:42 +00:00
|
|
|
Playground::setup("ls_test_1", |dirs, sandbox| {
|
2019-09-11 14:36:50 +00:00
|
|
|
sandbox.with_files(vec![
|
2019-10-15 10:16:47 +00:00
|
|
|
EmptyFile("yehuda.txt"),
|
|
|
|
EmptyFile("jonathan.txt"),
|
|
|
|
EmptyFile("andres.txt"),
|
2019-08-29 00:32:42 +00:00
|
|
|
]);
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2019-08-29 00:32:42 +00:00
|
|
|
let actual = nu!(
|
2019-12-15 16:15:06 +00:00
|
|
|
cwd: dirs.test(), pipeline(
|
2019-08-29 06:31:56 +00:00
|
|
|
r#"
|
2019-09-03 00:49:51 +00:00
|
|
|
ls
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2019-08-29 06:31:56 +00:00
|
|
|
"#
|
2019-08-29 00:32:42 +00:00
|
|
|
));
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "3");
|
2019-08-28 17:01:16 +00:00
|
|
|
})
|
2019-08-02 09:23:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-12-15 16:15:06 +00:00
|
|
|
fn lists_regular_files_using_asterisk_wildcard() {
|
2019-08-29 00:32:42 +00:00
|
|
|
Playground::setup("ls_test_2", |dirs, sandbox| {
|
2019-09-11 14:36:50 +00:00
|
|
|
sandbox.with_files(vec![
|
2019-10-15 10:16:47 +00:00
|
|
|
EmptyFile("los.txt"),
|
|
|
|
EmptyFile("tres.txt"),
|
|
|
|
EmptyFile("amigos.txt"),
|
|
|
|
EmptyFile("arepas.clu"),
|
2019-08-29 00:32:42 +00:00
|
|
|
]);
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2019-08-29 00:32:42 +00:00
|
|
|
let actual = nu!(
|
2019-12-15 16:15:06 +00:00
|
|
|
cwd: dirs.test(), pipeline(
|
2019-08-29 06:31:56 +00:00
|
|
|
r#"
|
2019-09-03 00:49:51 +00:00
|
|
|
ls *.txt
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2019-08-29 06:31:56 +00:00
|
|
|
"#
|
2019-08-29 00:32:42 +00:00
|
|
|
));
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "3");
|
2019-08-28 17:01:16 +00:00
|
|
|
})
|
2019-08-02 09:23:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-12-15 16:15:06 +00:00
|
|
|
fn lists_regular_files_using_question_mark_wildcard() {
|
2019-08-29 00:32:42 +00:00
|
|
|
Playground::setup("ls_test_3", |dirs, sandbox| {
|
2019-09-11 14:36:50 +00:00
|
|
|
sandbox.with_files(vec![
|
|
|
|
EmptyFile("yehuda.10.txt"),
|
|
|
|
EmptyFile("jonathan.10.txt"),
|
|
|
|
EmptyFile("andres.10.txt"),
|
|
|
|
EmptyFile("chicken_not_to_be_picked_up.100.txt"),
|
2019-08-29 00:32:42 +00:00
|
|
|
]);
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2019-08-29 00:32:42 +00:00
|
|
|
let actual = nu!(
|
2019-12-15 16:15:06 +00:00
|
|
|
cwd: dirs.test(), pipeline(
|
2019-08-29 06:31:56 +00:00
|
|
|
r#"
|
2019-09-03 00:49:51 +00:00
|
|
|
ls *.??.txt
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2019-08-29 06:31:56 +00:00
|
|
|
"#
|
2019-08-29 00:32:42 +00:00
|
|
|
));
|
2019-08-02 09:23:39 +00:00
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "3");
|
2019-08-28 17:01:16 +00:00
|
|
|
})
|
2019-08-02 09:23:39 +00:00
|
|
|
}
|
2020-01-19 02:25:07 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn lists_all_files_in_directories_from_stream() {
|
|
|
|
Playground::setup("ls_test_4", |dirs, sandbox| {
|
2020-01-22 03:56:12 +00:00
|
|
|
sandbox
|
|
|
|
.with_files(vec![EmptyFile("root1.txt"), EmptyFile("root2.txt")])
|
|
|
|
.within("dir_a")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("yehuda.10.txt"),
|
|
|
|
EmptyFile("jonathan.10.txt"),
|
|
|
|
])
|
|
|
|
.within("dir_b")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("andres.10.txt"),
|
|
|
|
EmptyFile("chicken_not_to_be_picked_up.100.txt"),
|
|
|
|
]);
|
2020-01-19 02:25:07 +00:00
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
echo dir_a dir_b
|
2022-02-17 11:40:24 +00:00
|
|
|
| each { |it| ls $it }
|
2022-02-04 20:32:13 +00:00
|
|
|
| flatten | length
|
2020-01-19 02:25:07 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "4");
|
2020-01-19 02:25:07 +00:00
|
|
|
})
|
|
|
|
}
|
2020-02-01 08:34:34 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn does_not_fail_if_glob_matches_empty_directory() {
|
|
|
|
Playground::setup("ls_test_5", |dirs, sandbox| {
|
|
|
|
sandbox.within("dir_a");
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
ls dir_a
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2020-02-01 08:34:34 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "0");
|
2020-02-01 08:34:34 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn fails_when_glob_doesnt_match() {
|
|
|
|
Playground::setup("ls_test_5", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![EmptyFile("root1.txt"), EmptyFile("root2.txt")]);
|
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
let actual = nu!(
|
2020-02-01 08:34:34 +00:00
|
|
|
cwd: dirs.test(),
|
|
|
|
"ls root3*"
|
|
|
|
);
|
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert!(actual.err.contains("no matches found"));
|
2020-02-01 08:34:34 +00:00
|
|
|
})
|
|
|
|
}
|
2020-04-06 11:28:56 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn list_files_from_two_parents_up_using_multiple_dots() {
|
|
|
|
Playground::setup("ls_test_6", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![
|
|
|
|
EmptyFile("yahuda.yaml"),
|
|
|
|
EmptyFile("jonathan.json"),
|
|
|
|
EmptyFile("andres.xml"),
|
|
|
|
EmptyFile("kevin.txt"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
sandbox.within("foo").mkdir("bar");
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test().join("foo/bar"),
|
|
|
|
r#"
|
2021-03-13 21:46:40 +00:00
|
|
|
ls ... | length
|
2020-04-06 11:28:56 +00:00
|
|
|
"#
|
|
|
|
);
|
|
|
|
|
2020-05-07 11:03:43 +00:00
|
|
|
assert_eq!(actual.out, "5");
|
2020-04-06 11:28:56 +00:00
|
|
|
})
|
|
|
|
}
|
2020-07-04 20:17:36 +00:00
|
|
|
|
2020-08-22 01:49:34 +00:00
|
|
|
#[test]
|
|
|
|
fn lists_hidden_file_when_explicitly_specified() {
|
|
|
|
Playground::setup("ls_test_7", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![
|
|
|
|
EmptyFile("los.txt"),
|
|
|
|
EmptyFile("tres.txt"),
|
|
|
|
EmptyFile("amigos.txt"),
|
|
|
|
EmptyFile("arepas.clu"),
|
|
|
|
EmptyFile(".testdotfile"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
ls .testdotfile
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2020-08-22 01:49:34 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
assert_eq!(actual.out, "1");
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn lists_all_hidden_files_when_glob_contains_dot() {
|
|
|
|
Playground::setup("ls_test_8", |dirs, sandbox| {
|
|
|
|
sandbox
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("root1.txt"),
|
|
|
|
EmptyFile("root2.txt"),
|
|
|
|
EmptyFile(".dotfile1"),
|
|
|
|
])
|
|
|
|
.within("dir_a")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("yehuda.10.txt"),
|
|
|
|
EmptyFile("jonathan.10.txt"),
|
|
|
|
EmptyFile(".dotfile2"),
|
|
|
|
])
|
|
|
|
.within("dir_b")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("andres.10.txt"),
|
|
|
|
EmptyFile("chicken_not_to_be_picked_up.100.txt"),
|
|
|
|
EmptyFile(".dotfile3"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
ls **/.*
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2020-08-22 01:49:34 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
assert_eq!(actual.out, "3");
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-09-04 19:32:58 +00:00
|
|
|
#[test]
|
|
|
|
// TODO Remove this cfg value when we have an OS-agnostic way
|
|
|
|
// of creating hidden files using the playground.
|
|
|
|
#[cfg(unix)]
|
|
|
|
fn lists_all_hidden_files_when_glob_does_not_contain_dot() {
|
|
|
|
Playground::setup("ls_test_8", |dirs, sandbox| {
|
|
|
|
sandbox
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("root1.txt"),
|
|
|
|
EmptyFile("root2.txt"),
|
|
|
|
EmptyFile(".dotfile1"),
|
|
|
|
])
|
|
|
|
.within("dir_a")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("yehuda.10.txt"),
|
|
|
|
EmptyFile("jonathan.10.txt"),
|
|
|
|
EmptyFile(".dotfile2"),
|
|
|
|
])
|
|
|
|
.within(".dir_b")
|
|
|
|
.with_files(vec![
|
|
|
|
EmptyFile("andres.10.txt"),
|
|
|
|
EmptyFile("chicken_not_to_be_picked_up.100.txt"),
|
|
|
|
EmptyFile(".dotfile3"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
ls **/*
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2020-09-04 19:32:58 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
assert_eq!(actual.out, "5");
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-03-31 06:52:39 +00:00
|
|
|
#[test]
|
|
|
|
#[cfg(unix)]
|
|
|
|
fn fails_with_ls_to_dir_without_permission() {
|
|
|
|
Playground::setup("ls_test_1", |dirs, sandbox| {
|
|
|
|
sandbox.within("dir_a").with_files(vec![
|
|
|
|
EmptyFile("yehuda.11.txt"),
|
|
|
|
EmptyFile("jonathan.10.txt"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
chmod 000 dir_a; ls dir_a
|
|
|
|
"#
|
|
|
|
));
|
2022-05-21 02:48:36 +00:00
|
|
|
|
|
|
|
let check_not_root = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
id -u
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
assert!(
|
|
|
|
actual
|
|
|
|
.err
|
|
|
|
.contains("The permissions of 0 do not allow access for this user")
|
|
|
|
|| check_not_root.out == "0"
|
|
|
|
);
|
2021-03-31 06:52:39 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-09-21 07:56:37 +00:00
|
|
|
#[test]
|
|
|
|
fn lists_files_including_starting_with_dot() {
|
|
|
|
Playground::setup("ls_test_9", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![
|
|
|
|
EmptyFile("yehuda.txt"),
|
|
|
|
EmptyFile("jonathan.txt"),
|
|
|
|
EmptyFile("andres.txt"),
|
|
|
|
EmptyFile(".hidden1.txt"),
|
|
|
|
EmptyFile(".hidden2.txt"),
|
|
|
|
]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
ls -a
|
2021-03-13 21:46:40 +00:00
|
|
|
| length
|
2020-09-21 07:56:37 +00:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
assert_eq!(actual.out, "5");
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-07-04 20:17:36 +00:00
|
|
|
#[test]
|
|
|
|
fn list_all_columns() {
|
2021-03-15 07:26:30 +00:00
|
|
|
Playground::setup("ls_test_all_columns", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![
|
|
|
|
EmptyFile("Leonardo.yaml"),
|
|
|
|
EmptyFile("Raphael.json"),
|
|
|
|
EmptyFile("Donatello.xml"),
|
|
|
|
EmptyFile("Michelangelo.txt"),
|
|
|
|
]);
|
|
|
|
// Normal Operation
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(),
|
2022-02-04 20:32:13 +00:00
|
|
|
"ls | columns | to md"
|
2021-03-15 07:26:30 +00:00
|
|
|
);
|
|
|
|
let expected = ["name", "type", "size", "modified"].join("");
|
|
|
|
assert_eq!(actual.out, expected, "column names are incorrect for ls");
|
|
|
|
// Long
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(),
|
2022-02-04 20:32:13 +00:00
|
|
|
"ls -l | columns | to md"
|
2021-03-15 07:26:30 +00:00
|
|
|
);
|
|
|
|
let expected = {
|
|
|
|
#[cfg(unix)]
|
|
|
|
{
|
|
|
|
[
|
|
|
|
"name",
|
|
|
|
"type",
|
|
|
|
"target",
|
2022-02-04 02:01:45 +00:00
|
|
|
"readonly",
|
|
|
|
"mode",
|
2022-02-04 20:32:13 +00:00
|
|
|
"num_links",
|
|
|
|
"inode",
|
2021-03-15 07:26:30 +00:00
|
|
|
"uid",
|
|
|
|
"group",
|
|
|
|
"size",
|
|
|
|
"created",
|
|
|
|
"accessed",
|
|
|
|
"modified",
|
|
|
|
]
|
|
|
|
.join("")
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(windows)]
|
|
|
|
{
|
|
|
|
[
|
|
|
|
"name", "type", "target", "readonly", "size", "created", "accessed", "modified",
|
|
|
|
]
|
|
|
|
.join("")
|
|
|
|
}
|
|
|
|
};
|
|
|
|
assert_eq!(
|
|
|
|
actual.out, expected,
|
|
|
|
"column names are incorrect for ls long"
|
|
|
|
);
|
|
|
|
});
|
2020-07-04 20:17:36 +00:00
|
|
|
}
|