coreutils/tests/by-util/test_basename.rs
2022-04-05 10:39:31 +02:00

176 lines
4 KiB
Rust
Raw Blame History

// spell-checker:ignore (words) reallylongexecutable
use crate::common::util::*;
#[cfg(any(unix, target_os = "redox"))]
use std::ffi::OsStr;
#[test]
fn test_help() {
for help_flg in ["-h", "--help"] {
new_ucmd!()
.arg(&help_flg)
.succeeds()
.no_stderr()
.stdout_contains("USAGE:");
}
}
#[test]
fn test_version() {
for version_flg in ["-V", "--version"] {
assert!(new_ucmd!()
.arg(&version_flg)
.succeeds()
.no_stderr()
.stdout_str()
.starts_with("basename"));
}
}
#[test]
fn test_directory() {
new_ucmd!()
.args(&["/root/alpha/beta/gamma/delta/epsilon/omega/"])
.succeeds()
.stdout_only("omega\n");
}
#[test]
fn test_file() {
new_ucmd!()
.args(&["/etc/passwd"])
.succeeds()
.stdout_only("passwd\n");
}
#[test]
fn test_remove_suffix() {
new_ucmd!()
.args(&["/usr/local/bin/reallylongexecutable.exe", ".exe"])
.succeeds()
.stdout_only("reallylongexecutable\n");
}
#[test]
fn test_do_not_remove_suffix() {
new_ucmd!()
.args(&["/foo/bar/baz", "baz"])
.succeeds()
.stdout_only("baz\n");
}
#[test]
fn test_multiple_param() {
for multiple_param in ["-a", "--multiple", "--mul"] {
let path = "/foo/bar/baz";
new_ucmd!()
.args(&[multiple_param, path, path])
.succeeds()
.stdout_only("baz\nbaz\n"); // spell-checker:disable-line
}
}
#[test]
fn test_suffix_param() {
for suffix_param in ["-s", "--suffix", "--suf"] {
let path = "/foo/bar/baz.exe";
new_ucmd!()
.args(&[suffix_param, ".exe", path, path])
.succeeds()
.stdout_only("baz\nbaz\n"); // spell-checker:disable-line
}
}
#[test]
fn test_zero_param() {
for zero_param in ["-z", "--zero", "--ze"] {
let path = "/foo/bar/baz";
new_ucmd!()
.args(&[zero_param, "-a", path, path])
.succeeds()
.stdout_only("baz\0baz\0");
}
}
fn expect_error(input: &[&str]) {
assert!(!new_ucmd!()
.args(input)
.fails()
.no_stdout()
.stderr_str()
.is_empty());
}
#[test]
fn test_invalid_option() {
let path = "/foo/bar/baz";
expect_error(&["-q", path]);
}
#[test]
fn test_no_args() {
expect_error(&[]);
}
#[test]
fn test_no_args_output() {
new_ucmd!().fails().usage_error("missing operand");
}
#[test]
fn test_too_many_args() {
expect_error(&["a", "b", "c"]);
}
#[test]
fn test_too_many_args_output() {
new_ucmd!()
.args(&["a", "b", "c"])
.fails()
.usage_error("extra operand 'c'");
}
#[cfg(any(unix, target_os = "redox"))]
fn test_invalid_utf8_args(os_str: &OsStr) {
let test_vec = vec![os_str.to_os_string()];
new_ucmd!().args(&test_vec).succeeds().stdout_is("fo<EFBFBD>o\n");
}
#[cfg(any(unix, target_os = "redox"))]
#[test]
fn invalid_utf8_args_unix() {
use std::os::unix::ffi::OsStrExt;
let source = [0x66, 0x6f, 0x80, 0x6f];
let os_str = OsStr::from_bytes(&source[..]);
test_invalid_utf8_args(os_str);
}
#[test]
fn test_root() {
let expected = if cfg!(windows) { "\\\n" } else { "/\n" };
new_ucmd!().arg("/").succeeds().stdout_is(expected);
}
#[test]
fn test_double_slash() {
// TODO The GNU tests seem to suggest that some systems treat "//"
// as the same directory as "/" directory but not all systems. We
// should extend this test to account for that possibility.
let expected = if cfg!(windows) { "\\\n" } else { "/\n" };
new_ucmd!().arg("//").succeeds().stdout_is(expected);
new_ucmd!()
.args(&["//", "/"])
.succeeds()
.stdout_is(expected);
new_ucmd!()
.args(&["//", "//"])
.succeeds()
.stdout_is(expected);
}
#[test]
fn test_triple_slash() {
let expected = if cfg!(windows) { "\\\n" } else { "/\n" };
new_ucmd!().arg("///").succeeds().stdout_is(expected);
}