2023-08-21 08:49:27 +00:00
|
|
|
// This file is part of the uutils coreutils package.
|
|
|
|
//
|
|
|
|
// For the full copyright and license information, please view the LICENSE
|
|
|
|
// file that was distributed with this source code.
|
2021-05-30 05:10:54 +00:00
|
|
|
// spell-checker:ignore (words) defaultcheck nocheck
|
|
|
|
|
2023-03-20 13:51:19 +00:00
|
|
|
use crate::common::util::TestScenario;
|
2016-05-22 07:46:54 +00:00
|
|
|
|
2022-09-10 16:38:14 +00:00
|
|
|
#[test]
|
|
|
|
fn test_invalid_arg() {
|
|
|
|
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
|
|
|
|
}
|
|
|
|
|
2016-02-18 14:29:50 +00:00
|
|
|
#[test]
|
|
|
|
fn ab_no_args() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ab_dash_one() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "b", "-1"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab1.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ab_dash_two() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "b", "-2"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab2.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ab_dash_three() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "b", "-3"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab3.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2021-05-30 05:10:54 +00:00
|
|
|
fn a_empty() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "empty"])
|
|
|
|
.succeeds()
|
2021-05-31 03:55:28 +00:00
|
|
|
.stdout_only_fixture("aempty.expected"); // spell-checker:disable-line
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2021-05-30 05:10:54 +00:00
|
|
|
fn empty_empty() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["empty", "empty"])
|
|
|
|
.succeeds()
|
2021-05-30 05:10:54 +00:00
|
|
|
.stdout_only_fixture("emptyempty.expected"); // spell-checker:disable-line
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
2023-01-24 12:36:13 +00:00
|
|
|
#[test]
|
|
|
|
fn total() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--total", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_is_fixture("ab_total.expected");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn total_with_suppressed_regular_output() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--total", "-123", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_is_fixture("ab_total_suppressed_regular_output.expected");
|
|
|
|
}
|
|
|
|
|
2024-03-23 20:04:42 +00:00
|
|
|
#[test]
|
|
|
|
fn repeated_flags() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--total", "-123123", "--total", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_is_fixture("ab_total_suppressed_regular_output.expected");
|
|
|
|
}
|
|
|
|
|
2023-01-31 09:08:11 +00:00
|
|
|
#[test]
|
|
|
|
fn total_with_output_delimiter() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--total", "--output-delimiter=word", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_is_fixture("ab_total_delimiter_word.expected");
|
|
|
|
}
|
|
|
|
|
2016-02-18 14:29:50 +00:00
|
|
|
#[test]
|
|
|
|
fn output_delimiter() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--output-delimiter=word", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_delimiter_word.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
2024-03-23 18:28:14 +00:00
|
|
|
#[test]
|
|
|
|
fn output_delimiter_hyphen_one() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--output-delimiter", "-1", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_delimiter_hyphen_one.expected");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn output_delimiter_hyphen_help() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--output-delimiter", "--help", "a", "b"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_delimiter_hyphen_help.expected");
|
|
|
|
}
|
|
|
|
|
2024-03-23 19:52:58 +00:00
|
|
|
#[test]
|
|
|
|
fn output_delimiter_multiple_identical() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&[
|
|
|
|
"--output-delimiter=word",
|
|
|
|
"--output-delimiter=word",
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_delimiter_word.expected");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn output_delimiter_multiple_different() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&[
|
|
|
|
"--output-delimiter=word",
|
|
|
|
"--output-delimiter=other",
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
])
|
|
|
|
.fails()
|
|
|
|
.no_stdout()
|
|
|
|
.stderr_contains("multiple")
|
|
|
|
.stderr_contains("output")
|
|
|
|
.stderr_contains("delimiters");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[ignore = "This is too weird; deviate intentionally."]
|
|
|
|
fn output_delimiter_multiple_different_prevents_help() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&[
|
|
|
|
"--output-delimiter=word",
|
|
|
|
"--output-delimiter=other",
|
|
|
|
"--help",
|
|
|
|
"a",
|
|
|
|
"b",
|
|
|
|
])
|
|
|
|
.fails()
|
|
|
|
.no_stdout()
|
|
|
|
.stderr_contains("multiple")
|
|
|
|
.stderr_contains("output")
|
|
|
|
.stderr_contains("delimiters");
|
|
|
|
}
|
|
|
|
|
2016-02-18 14:29:50 +00:00
|
|
|
#[test]
|
2022-07-06 11:50:23 +00:00
|
|
|
fn output_delimiter_nul() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--output-delimiter=", "a", "b"])
|
2022-07-06 11:50:23 +00:00
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_delimiter_nul.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn zero_terminated() {
|
2022-04-02 08:47:37 +00:00
|
|
|
for param in ["-z", "--zero-terminated"] {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
2023-02-28 09:57:14 +00:00
|
|
|
.args(&[param, "a_nul", "b_nul"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_nul.expected");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-02 15:18:42 +00:00
|
|
|
#[test]
|
|
|
|
fn zero_terminated_provided_multiple_times() {
|
|
|
|
for param in ["-z", "--zero-terminated"] {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&[param, param, param, "a_nul", "b_nul"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_nul.expected");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-28 09:57:14 +00:00
|
|
|
#[test]
|
|
|
|
fn zero_terminated_with_total() {
|
|
|
|
for param in ["-z", "--zero-terminated"] {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&[param, "--total", "a_nul", "b_nul"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("ab_nul_total.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-13 18:36:03 +00:00
|
|
|
#[cfg_attr(not(feature = "test_unimplemented"), ignore)]
|
2015-11-28 19:36:29 +00:00
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn check_order() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--check-order", "bad_order_1", "bad_order_2"])
|
|
|
|
.fails()
|
|
|
|
.stdout_is_fixture("bad_order12.check_order.expected")
|
|
|
|
.stderr_is("error to be defined");
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
|
|
|
|
2020-04-13 18:36:03 +00:00
|
|
|
#[cfg_attr(not(feature = "test_unimplemented"), ignore)]
|
2015-11-28 19:36:29 +00:00
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn nocheck_order() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["--nocheck-order", "bad_order_1", "bad_order_2"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("bad_order12.nocheck_order.expected");
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
|
|
|
|
2016-02-18 14:29:50 +00:00
|
|
|
// when neither --check-order nor --no-check-order is provided,
|
|
|
|
// stderr and the error code behaves like check order, but stdout
|
|
|
|
// behaves like nocheck_order. However with some quirks detailed below.
|
2020-04-13 18:36:03 +00:00
|
|
|
#[cfg_attr(not(feature = "test_unimplemented"), ignore)]
|
2015-11-28 19:36:29 +00:00
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn defaultcheck_order() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["a", "bad_order_1"])
|
|
|
|
.fails()
|
|
|
|
.stderr_only("error to be defined");
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
|
|
|
|
2016-02-18 14:29:50 +00:00
|
|
|
// * the first: if both files are not in order, the default behavior is the only
|
|
|
|
// behavior that will provide an error message
|
|
|
|
|
|
|
|
// * the second: if two rows are paired but are out of order,
|
|
|
|
// it won't matter if all rows in the two files are exactly the same.
|
|
|
|
// This is specified in the documentation
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn defaultcheck_order_identical_bad_order_files() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["bad_order_1", "bad_order_1"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("bad_order11.defaultcheck_order.expected");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
2020-04-13 18:36:03 +00:00
|
|
|
#[cfg_attr(not(feature = "test_unimplemented"), ignore)]
|
2016-02-18 14:29:50 +00:00
|
|
|
#[test]
|
|
|
|
fn defaultcheck_order_two_different_bad_order_files() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["bad_order_1", "bad_order_2"])
|
|
|
|
.fails()
|
|
|
|
.stdout_is_fixture("bad_order12.nocheck_order.expected")
|
|
|
|
.stderr_is("error to be defined");
|
2016-02-18 14:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// * the third: (it is not know whether this is a bug or not)
|
|
|
|
// for the first incident, and only the first incident,
|
|
|
|
// where both lines are different and one or both file lines being
|
|
|
|
// compared are out of order from the preceding line,
|
|
|
|
// it is ignored and no errors occur.
|
|
|
|
|
|
|
|
// * the fourth: (it is not known whether this is a bug or not)
|
|
|
|
// there are additional, not-yet-understood circumstances where an out-of-order
|
|
|
|
// pair is ignored and is not counted against the 1 maximum out-of-order line.
|
|
|
|
|
2020-04-13 18:36:03 +00:00
|
|
|
#[cfg_attr(not(feature = "test_unimplemented"), ignore)]
|
2015-11-28 19:36:29 +00:00
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn unintuitive_default_behavior_1() {
|
2020-04-13 18:36:03 +00:00
|
|
|
new_ucmd!()
|
|
|
|
.args(&["defaultcheck_unintuitive_1", "defaultcheck_unintuitive_2"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_only_fixture("defaultcheck_unintuitive.expected");
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn no_arguments() {
|
2023-02-09 09:51:32 +00:00
|
|
|
new_ucmd!().fails().no_stdout();
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2016-02-18 14:29:50 +00:00
|
|
|
fn one_argument() {
|
2023-02-09 09:51:32 +00:00
|
|
|
new_ucmd!().arg("a").fails().no_stdout();
|
2015-11-28 19:36:29 +00:00
|
|
|
}
|
2021-12-24 18:40:18 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_no_such_file() {
|
|
|
|
new_ucmd!()
|
|
|
|
.args(&["bogus_file_1", "bogus_file_2"])
|
|
|
|
.fails()
|
2023-01-05 20:09:15 +00:00
|
|
|
.stderr_only("comm: bogus_file_1: No such file or directory\n");
|
2021-12-24 18:40:18 +00:00
|
|
|
}
|
2024-11-14 20:37:20 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_is_dir() {
|
|
|
|
let scene = TestScenario::new(util_name!());
|
|
|
|
let at = &scene.fixtures;
|
|
|
|
|
|
|
|
scene
|
|
|
|
.ucmd()
|
|
|
|
.args(&[".", "."])
|
|
|
|
.fails()
|
|
|
|
.stderr_only("comm: .: Is a directory\n");
|
|
|
|
|
|
|
|
at.mkdir("dir");
|
|
|
|
scene
|
|
|
|
.ucmd()
|
|
|
|
.args(&["dir", "."])
|
|
|
|
.fails()
|
|
|
|
.stderr_only("comm: dir: Is a directory\n");
|
|
|
|
|
|
|
|
at.touch("file");
|
|
|
|
scene
|
|
|
|
.ucmd()
|
|
|
|
.args(&[".", "file"])
|
|
|
|
.fails()
|
|
|
|
.stderr_only("comm: .: Is a directory\n");
|
|
|
|
|
|
|
|
at.touch("file");
|
|
|
|
scene
|
|
|
|
.ucmd()
|
|
|
|
.args(&["file", "."])
|
|
|
|
.fails()
|
|
|
|
.stderr_only("comm: .: Is a directory\n");
|
|
|
|
}
|