pub(crate) const MAX_ITERM_PAYLOAD_BYTES: usize = 16 * 1024 * 1024;
pub(crate) fn encode_iterm_osc1337(
data: &[u8],
cols: u32,
rows: u32,
preserve_aspect: bool,
) -> String {
if data.is_empty() || data.len() > MAX_ITERM_PAYLOAD_BYTES {
return String::new();
}
let b64 = crate::terminal::base64_encode(data);
let preserve = if preserve_aspect { 1 } else { 0 };
let size = data.len();
let height = if rows == 0 {
"auto".to_string()
} else {
rows.to_string()
};
format!(
"\x1b]1337;File=inline=1;size={size};width={cols};height={height};preserveAspectRatio={preserve}:{b64}\x07"
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn osc1337_well_formed_header() {
let seq = encode_iterm_osc1337(b"PNGDATA", 20, 4, false);
assert!(seq.starts_with("\x1b]1337;File="));
assert!(seq.contains("inline=1"));
assert!(seq.contains("size=7"));
assert!(seq.contains("width=20"));
assert!(seq.contains("height=4"));
assert!(seq.contains("preserveAspectRatio=0"));
assert!(seq.ends_with('\x07'));
}
#[test]
fn osc1337_payload_is_base64() {
let seq = encode_iterm_osc1337(b"Hello", 1, 1, false);
assert!(seq.contains(":SGVsbG8=\x07"));
}
#[test]
fn osc1337_preserve_aspect_and_auto_height() {
let seq = encode_iterm_osc1337(b"x", 10, 0, true);
assert!(seq.contains("preserveAspectRatio=1"));
assert!(seq.contains("height=auto"));
assert!(!seq.contains("height=0"));
}
#[test]
fn osc1337_empty_input_returns_empty() {
assert!(encode_iterm_osc1337(&[], 4, 4, false).is_empty());
}
#[test]
fn osc1337_oversized_payload_returns_empty() {
let huge = vec![0u8; MAX_ITERM_PAYLOAD_BYTES + 1];
assert!(encode_iterm_osc1337(&huge, 4, 4, false).is_empty());
}
#[test]
fn osc1337_size_matches_byte_length() {
let data = vec![1u8; 300];
let seq = encode_iterm_osc1337(&data, 5, 2, false);
assert!(seq.contains("size=300"));
}
#[test]
fn iterm_image_on_test_backend_does_not_panic() {
let png = [0x89u8, b'P', b'N', b'G', 0x0d, 0x0a, 0x1a, 0x0a];
let mut tb = crate::TestBackend::new(20, 4);
tb.render(|ui| {
let _ = ui.iterm_image(&png, 20, 4);
});
}
#[test]
fn iterm_image_on_test_backend_renders_fallback() {
let png = [0x89u8, b'P', b'N', b'G'];
let mut tb = crate::TestBackend::new(20, 2);
tb.render(|ui| {
let _ = ui.iterm_image(&png, 20, 2);
});
tb.assert_contains("[iterm2 unsupported]");
}
#[test]
fn iterm_image_fit_on_test_backend_renders_fallback() {
let png = [0x89u8, b'P', b'N', b'G'];
let mut tb = crate::TestBackend::new(20, 10);
tb.render(|ui| {
let _ = ui.iterm_image_fit(&png, 20);
});
tb.assert_contains("[iterm2 unsupported]");
}
}