use rstest::rstest;
use super::{RELAYED_LIMIT, relayable};
#[rstest]
#[case(b"", "")]
#[case(b"fatal: bad revision\n", "fatal: bad revision")]
#[case(b"fatal: bad\nusage: git ls-files\n", "fatal: bad usage: git ls-files")]
#[case(b"a\r\nb\rc", "a b c")]
#[case(b"\n\nfatal\n\n", "fatal")]
#[case(b"\x1b[31mfatal\x1b[0m", "[31mfatal [0m")]
#[case(b"a\x07b", "a b")]
#[case(b"bad \xff byte", "bad \u{fffd} byte")]
#[case("fatal: bad\u{2028}usage".as_bytes(), "fatal: bad usage")]
fn relayed_diagnostics_are_scrubbed_into_one_line(#[case] input: &[u8], #[case] expected: &str) {
assert_eq!(relayable(input), expected);
}
#[rstest]
#[case('\u{2028}')]
#[case('\u{2029}')]
#[case('\u{202a}')]
#[case('\u{202b}')]
#[case('\u{202c}')]
#[case('\u{202d}')]
#[case('\u{202e}')]
#[case('\u{2066}')]
#[case('\u{2067}')]
#[case('\u{2068}')]
#[case('\u{2069}')]
fn a_character_that_lays_out_a_line_is_scrubbed(#[case] character: char) {
let diagnostic = format!("fatal: bad{character}usage: git");
assert_eq!(relayable(diagnostic.as_bytes()), "fatal: bad usage: git");
}
#[test]
fn a_diagnostic_of_exactly_the_limit_is_relayed_whole() {
let at_limit = "x".repeat(RELAYED_LIMIT);
assert_eq!(relayable(at_limit.as_bytes()), at_limit);
}
#[test]
fn a_diagnostic_past_the_limit_is_cut() {
let flood = "x".repeat(4096);
let relayed = relayable(flood.as_bytes());
assert_eq!(relayed.chars().count(), RELAYED_LIMIT + 1, "{relayed:?}");
assert!(relayed.ends_with('…'), "{relayed:?}");
assert!(
relayed.starts_with(&"x".repeat(RELAYED_LIMIT)),
"the cap must keep a prefix, not drop the message: {relayed:?}"
);
}