#![cfg(feature = "cli")]
#[path = "common/mod.rs"]
mod common;
use predicates::prelude::*;
fn strict_invalid_short(ch: char) -> String {
format!("rusty-figlet: invalid option -- '{ch}'")
}
fn strict_unrecognized_long(flag: &str) -> String {
format!("rusty-figlet: unrecognized option '{flag}'")
}
#[test]
fn strict_activates_via_flag() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("Hi")
.assert()
.success();
}
#[test]
fn strict_activates_via_env_var() {
let _g = common::env_guard("RUSTY_FIGLET_STRICT", Some("1"));
common::rusty_figlet_cmd().arg("Hi").assert().success();
}
#[test]
fn strict_activates_via_argv0_then_rejects_excluded_flag() {
let _g = common::env_guard("RUSTY_FIGLET_STRICT", Some("1"));
common::rusty_figlet_cmd()
.arg("-L")
.arg("X")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('L')));
}
#[test]
fn no_strict_overrides_env() {
let _g = common::env_guard("RUSTY_FIGLET_STRICT", Some("1"));
common::rusty_figlet_cmd()
.arg("--no-strict")
.arg("--color=never")
.arg("Hi")
.assert()
.success();
}
#[test]
fn last_wins_strict_then_no_strict_yields_default() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("--no-strict")
.arg("--color=never")
.arg("Hi")
.assert()
.success();
}
#[test]
fn last_wins_no_strict_then_strict_yields_strict() {
common::rusty_figlet_cmd()
.arg("--no-strict")
.arg("--strict")
.arg("-L")
.arg("X")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('L')));
}
#[test]
#[allow(non_snake_case)]
fn strict_rejects_short_L() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-L")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('L')));
}
#[test]
#[allow(non_snake_case)]
fn strict_rejects_short_R() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-R")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('R')));
}
#[test]
#[allow(non_snake_case)]
fn strict_rejects_short_I() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-I")
.arg("1")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('I')));
}
#[test]
#[allow(non_snake_case)]
fn strict_rejects_short_N() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-N")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('N')));
}
#[test]
#[allow(non_snake_case)]
fn strict_rejects_short_C() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-C")
.arg("myfile.flc")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_invalid_short('C')));
}
#[test]
fn strict_rejects_long_info_dump() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("--info-dump")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_unrecognized_long(
"--info-dump",
)));
}
#[test]
fn strict_rejects_long_no_controlfile() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("--no-controlfile")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_unrecognized_long(
"--no-controlfile",
)));
}
#[test]
fn strict_rejects_color_long_flag() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("--color=always")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains("unrecognized option"));
}
#[test]
fn strict_rejects_rainbow_long_flag() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("--rainbow")
.arg("term")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains(strict_unrecognized_long(
"--rainbow",
)));
}
#[test]
fn strict_latin1_clamp_passes_low_bytes_through() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("Hi")
.assert()
.success();
}
#[test]
fn strict_latin1_clamp_replaces_multibyte_with_placeholder() {
let assert = common::rusty_figlet_cmd()
.arg("--strict")
.arg("a日b")
.assert()
.success();
let out = assert.get_output();
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
!stdout.is_empty(),
"Strict-mode Latin-1 clamp must still render printable bytes"
);
}
#[test]
fn lib_clamp_input_latin1_round_trip() {
let got = rusty_figlet::clamp_input_latin1("a\u{00E9}b\u{65E5}c");
assert_eq!(got, vec![b'a', 0xE9, b'b', b'?', b'c']);
}
#[test]
fn strict_last_wins_justify_flags() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-c")
.arg("-l")
.arg("-r")
.arg("X")
.assert()
.success();
}
#[test]
fn strict_last_wins_layout_flags() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("-k")
.arg("-W")
.arg("-S")
.arg("X")
.assert()
.success();
}
#[test]
fn strict_rejects_completions_subcommand() {
common::rusty_figlet_cmd()
.arg("--strict")
.arg("completions")
.arg("bash")
.assert()
.failure()
.code(2)
.stderr(predicate::str::contains("unrecognized option"));
}