Files
wehub-resource-sync a789495a98
FreeBSD Smoke / FreeBSD Smoke (x86_64) (push) Has been cancelled
CI / Quality Guardrails (push) Has been cancelled
CI / Build & Test (macos-latest) (push) Has been cancelled
CI / Build & Test (ubuntu-latest) (push) Has been cancelled
CI / Build & Test (windows-latest) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / PowerShell Syntax (push) Has been cancelled
CI / Windows Cross-Target Check (Linux) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:10:34 +08:00

56 lines
2.0 KiB
Rust

//! End-to-end wire proof for the macOS glyph-atlas corruption fix (#330).
//!
//! Renders a colored buffer through a *real* `CrosstermBackend` (the same
//! backend the shipped binary uses) and inspects the actual ANSI bytes it
//! writes. Under glyph-safe mode, animated colors are quantized to
//! `Color::Indexed`, which must serialize as `38;5;<n>` (256-color) and never
//! as `38;2;r;g;b` (truecolor). The truecolor churn is what overflows the
//! terminal's GPU glyph atlas and garbles letters into boxes.
use ratatui::backend::{Backend, CrosstermBackend};
use ratatui::buffer::Cell;
use ratatui::style::Color;
/// Drive the backend to draw a single cell with the given fg color and return
/// the raw bytes it emitted to the writer.
fn emitted_bytes_for(fg: Color) -> Vec<u8> {
let mut out: Vec<u8> = Vec::new();
{
let mut backend = CrosstermBackend::new(&mut out);
let mut cell = Cell::default();
cell.set_symbol("X");
cell.set_fg(fg);
let content = [(0u16, 0u16, &cell)];
backend.draw(content.into_iter()).expect("draw");
backend.flush().expect("flush");
}
out
}
#[test]
fn indexed_color_emits_256_sgr_not_truecolor() {
// What glyph-safe quantization produces (xterm-256 index).
let bytes = emitted_bytes_for(Color::Indexed(111));
let text = String::from_utf8_lossy(&bytes);
assert!(
text.contains("38;5;111"),
"expected 256-color SGR in emitted bytes, got: {text:?}"
);
assert!(
!text.contains("38;2;"),
"256-color path must never emit truecolor SGR, got: {text:?}"
);
}
#[test]
fn truecolor_color_emits_truecolor_sgr() {
// Sanity check: the truecolor path (robust terminals) still works and is
// precisely what we suppress on fragile terminals.
let bytes = emitted_bytes_for(Color::Rgb(138, 180, 248));
let text = String::from_utf8_lossy(&bytes);
assert!(
text.contains("38;2;138;180;248"),
"expected truecolor SGR, got: {text:?}"
);
}