use crate::output::test_support::ColorsEnabledGuard;
use crate::output::{Doc, Printer, Role, Theme, Verbosity};
use crate::test_helpers::EnvVarGuard;
use serial_test::serial;
fn render_with_theme(name: &str, doc: Doc) -> String {
let (p, buf) = Printer::for_test_with_theme(Theme::from_preset(name), Verbosity::Normal);
p.emit(doc);
p.flush();
match buf.lock() {
Ok(g) => g.clone(),
Err(poisoned) => poisoned.into_inner().clone(),
}
}
#[test]
#[serial]
fn accent_emits_truecolor_sgr_per_preset() {
let cases = [
("default", (0xd7, 0x87, 0x00)), ("dracula", (0xff, 0xb8, 0x6c)), ("solarized-dark", (0xcb, 0x4b, 0x16)), ("solarized-light", (0xcb, 0x4b, 0x16)), ];
let _no_color = EnvVarGuard::unset("NO_COLOR");
let _term = EnvVarGuard::set("COLORTERM", "truecolor");
let _guard = ColorsEnabledGuard::set(true);
for (preset, (r, g, b)) in cases {
let doc = Doc::new().status(Role::Accent, "marker");
let raw = render_with_theme(preset, doc);
let needle_plain = format!("\x1b[38;2;{r};{g};{b}m");
let needle_italic = format!("\x1b[3;38;2;{r};{g};{b}m");
assert!(
raw.contains(&needle_plain) || raw.contains(&needle_italic),
"preset {preset}: missing accent SGR for rgb({r},{g},{b}); raw={raw:?}",
);
}
}
#[test]
#[serial]
fn secondary_emits_truecolor_sgr_per_preset() {
let cases = [
("default", (0xaf, 0x5f, 0xd7)), ("dracula", (0xff, 0x79, 0xc6)), ("solarized-dark", (0xd3, 0x36, 0x82)), ("solarized-light", (0xd3, 0x36, 0x82)), ];
let _no_color = EnvVarGuard::unset("NO_COLOR");
let _term = EnvVarGuard::set("COLORTERM", "truecolor");
let _guard = ColorsEnabledGuard::set(true);
for (preset, (r, g, b)) in cases {
let doc = Doc::new().status(Role::Secondary, "marker");
let raw = render_with_theme(preset, doc);
let needle = format!("\x1b[38;2;{r};{g};{b}m");
assert!(
raw.contains(&needle),
"preset {preset}: missing secondary SGR for rgb({r},{g},{b}); raw={raw:?}",
);
}
}
#[test]
#[serial]
fn minimal_accent_emits_italic_attr_no_color() {
let _no_color = EnvVarGuard::unset("NO_COLOR");
let _term = EnvVarGuard::set("COLORTERM", "truecolor");
let _guard = ColorsEnabledGuard::set(true);
let doc = Doc::new().status(Role::Accent, "marker");
let raw = render_with_theme("minimal", doc);
assert!(
raw.contains("\x1b[3m"),
"minimal accent must emit italic SGR; raw={raw:?}"
);
assert!(
!raw.contains("\x1b[38;2;"),
"minimal accent must not emit truecolor SGR; raw={raw:?}"
);
}
#[test]
#[serial]
fn minimal_secondary_emits_underline_attr_no_color() {
let _no_color = EnvVarGuard::unset("NO_COLOR");
let _term = EnvVarGuard::set("COLORTERM", "truecolor");
let _guard = ColorsEnabledGuard::set(true);
let doc = Doc::new().status(Role::Secondary, "marker");
let raw = render_with_theme("minimal", doc);
assert!(
raw.contains("\x1b[4m"),
"minimal secondary must emit underline SGR; raw={raw:?}"
);
assert!(
!raw.contains("\x1b[38;2;"),
"minimal secondary must not emit truecolor SGR; raw={raw:?}"
);
}