mod support;
use predicates::prelude::*;
use support::lx_no_colour;
#[test]
fn columns_explicit_set() {
lx_no_colour()
.args(["-l", "--columns=perms,size,modified", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("Cargo.toml"));
}
#[test]
fn columns_with_inode() {
lx_no_colour()
.args(["-l", "--columns=inode,perms,size", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("Cargo.toml"));
}
#[test]
fn columns_overrides_tier() {
lx_no_colour()
.args(["-lll", "--columns=perms,size,modified", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("Group").not())
.stdout(predicate::str::contains("Cargo.toml"));
}
#[test]
fn columns_suppression_still_works() {
lx_no_colour()
.args([
"-l",
"--columns=perms,size,modified",
"--no-permissions",
"Cargo.toml",
])
.assert()
.success()
.stdout(predicate::str::contains("Cargo.toml"));
}
#[test]
fn columns_unknown_names_error() {
lx_no_colour()
.args(["-l", "--columns=perms,bogus,size", "Cargo.toml"])
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(
"invalid value 'bogus' for '--columns",
))
.stderr(predicate::str::contains("[possible values:"));
}
#[test]
fn format_long() {
lx_no_colour()
.args(["-l", "--format=long", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("Cargo.toml"));
}
#[test]
fn format_long2_has_group() {
lx_no_colour()
.args(["-l", "--format=long2", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains(support::current_group()));
}
#[test]
fn format_long3_has_multiple_timestamps() {
lx_no_colour()
.args(["-l", "--format=long3", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("Date Changed"));
}
#[test]
fn format_overrides_tier() {
lx_no_colour()
.args(["-lll", "--format=long", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("staff").not());
}
#[test]
fn format_invalid_rejected() {
lx_no_colour()
.args(["-l", "--format=bogus", "Cargo.toml"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid value"));
}
#[test]
fn format_with_individual_add() {
lx_no_colour()
.args(["-l", "--format=long", "-i", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("inode"));
}
#[test]
fn format_with_suppression() {
lx_no_colour()
.args(["-l", "--format=long2", "--no-group", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("staff").not());
}
#[test]
fn blocks_inserts_after_size() {
lx_no_colour()
.args(["-l", "-S", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::is_match(r"Size\s+Blocks\s+User").unwrap());
}
#[test]
fn inode_inserts_before_perms() {
lx_no_colour()
.args(["-l", "-i", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::is_match(r"(?i)inode\s+Permissions").unwrap());
}
#[test]
fn multiple_adds_canonical_order() {
lx_no_colour()
.args(["-l", "-S", "-i", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::is_match(r"(?i)inode\s+Permissions").unwrap())
.stdout(predicate::str::is_match(r"Size\s+Blocks").unwrap());
}
#[test]
fn group_add_between_user_and_timestamp() {
lx_no_colour()
.args(["-l", "-g", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::is_match(r"User\s+Group\s+Date").unwrap());
}
#[test]
fn explicit_columns_with_add_inserts_canonically() {
lx_no_colour()
.args(["--columns=modified,user,size", "-S", "-h", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::is_match(r"Size\s+Blocks").unwrap());
}
#[test]
fn no_duplicate_when_already_present() {
let output = lx_no_colour()
.args(["-ll", "-g", "-h", "Cargo.toml"])
.output()
.expect("failed to run");
let stdout = String::from_utf8_lossy(&output.stdout);
let count = stdout.matches("Group").count();
assert_eq!(count, 1, "Group should appear once, got {count}: {stdout}");
}
#[test]
fn columns_overrides_format() {
lx_no_colour()
.args(["-l", "--format=long3", "--columns=perms,size", "Cargo.toml"])
.assert()
.success()
.stdout(predicate::str::contains("staff").not());
}