use assert_cmd::Command;
const Z12: &str =
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
const CANON: &str = "ms10entrsqqqqqqqqqqqqqqqqqqqqqqqqqqqqcj9sxraq34v7f";
fn stdout_of(args: &[&str]) -> String {
let out = Command::cargo_bin("ms")
.unwrap()
.args(args)
.output()
.unwrap();
assert!(
out.status.success(),
"command failed: {}",
String::from_utf8_lossy(&out.stderr)
);
String::from_utf8(out.stdout).unwrap()
}
#[test]
fn encode_default_groups_space_5_print_once() {
let s = stdout_of(&["encode", "--phrase", Z12]);
assert!(
!s.contains("\n\n"),
"print-once: stdout must not contain \\n\\n; got {s:?}"
);
let line = s.lines().next().unwrap();
assert_eq!(
line.chars().nth(5),
Some(' '),
"expected a space after the first 5 chars; got {line:?}"
);
let unbroken: String = line.chars().filter(|c| *c != ' ').collect();
assert_eq!(
unbroken, CANON,
"space-stripped grouped form must equal canonical ms1"
);
}
#[test]
fn encode_unbroken_group_size_0() {
let s = stdout_of(&["encode", "--phrase", Z12, "--group-size", "0"]);
let line = s.lines().next().unwrap();
assert_eq!(line, CANON);
}
#[test]
fn encode_separator_hyphen() {
let s = stdout_of(&["encode", "--phrase", Z12, "--separator", "hyphen"]);
let line = s.lines().next().unwrap();
assert_eq!(
line.chars().nth(5),
Some('-'),
"expected hyphen at idx 5; got {line:?}"
);
}
#[test]
fn encode_rejects_bad_separator() {
Command::cargo_bin("ms")
.unwrap()
.args(["encode", "--phrase", Z12, "--separator", "bogus"])
.assert()
.code(64);
}
#[test]
fn split_grouped_default_labels_on_stderr() {
let out = Command::cargo_bin("ms")
.unwrap()
.args(["split", "--phrase", Z12, "-k", "2", "-n", "3"])
.output()
.unwrap();
assert!(out.status.success());
let stdout = String::from_utf8(out.stdout).unwrap();
let stderr = String::from_utf8(out.stderr).unwrap();
let lines: Vec<&str> = stdout.lines().filter(|l| !l.is_empty()).collect();
assert_eq!(
lines.len(),
3,
"stdout = exactly 3 share lines; got {stdout:?}"
);
for l in &lines {
assert!(l.starts_with("ms1"), "share line: {l:?}");
assert!(
l.contains(' '),
"default-grouped share must contain a space: {l:?}"
);
}
assert!(
!stdout.contains("share "),
"labels must NOT be on stdout; got {stdout:?}"
);
assert!(
stderr.contains("share 1 of 3"),
"label on stderr; got {stderr:?}"
);
}