use crate::ansi_processor::AnsiProcessor;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_osc_terminal_title_sequence() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]0;Test Title\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Test Title".to_string())
);
processor.process_bytes("\x1b]2;Window Title\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Window Title".to_string())
);
}
#[test]
fn test_osc_icon_name_sequence() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]1;Icon Name\x07".as_bytes());
assert_eq!(
processor.terminal_state.icon_name,
Some("Icon Name".to_string())
);
processor.process_bytes("\x1b]0;Both Title\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Both Title".to_string())
);
assert_eq!(
processor.terminal_state.icon_name,
Some("Icon Name".to_string())
);
}
#[test]
fn test_osc_sequence_termination_methods() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]2;BEL Terminated\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("BEL Terminated".to_string())
);
processor.process_bytes("\x1b]2;ST Terminated\x1b\\".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("ST Terminated".to_string())
);
}
#[test]
fn test_osc_sequence_with_special_characters() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]2;Title with spaces & symbols!\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Title with spaces & symbols!".to_string())
);
processor.process_bytes("\x1b]2;\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("".to_string())
);
}
#[test]
fn test_osc_sequence_with_unicode() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]2;æµ‹è¯•æ ‡é¢˜ 🚀 Test\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("æµ‹è¯•æ ‡é¢˜ 🚀 Test".to_string())
);
}
#[test]
fn test_osc_unknown_commands() {
let mut processor = AnsiProcessor::new();
let original_title = processor.terminal_state.terminal_title.clone();
processor.process_bytes("\x1b]999;Unknown Command\x07".as_bytes());
assert_eq!(processor.terminal_state.terminal_title, original_title);
}
#[test]
fn test_osc_malformed_sequences() {
let mut processor = AnsiProcessor::new();
let original_title = processor.terminal_state.terminal_title.clone();
processor.process_bytes("\x1b]2NoSemicolon\x07".as_bytes());
assert_eq!(processor.terminal_state.terminal_title, original_title);
processor.process_bytes("\x1b]2;First;Second;Third\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("First;Second;Third".to_string())
);
}
#[test]
fn test_osc_color_palette_sequences() {
let mut processor = AnsiProcessor::new();
let original_title = processor.terminal_state.terminal_title.clone();
processor.process_bytes("\x1b]4;0;rgb:00/00/00\x07".as_bytes());
assert_eq!(processor.terminal_state.terminal_title, original_title);
}
#[test]
fn test_osc_clipboard_sequences() {
let mut processor = AnsiProcessor::new();
let original_title = processor.terminal_state.terminal_title.clone();
processor.process_bytes("\x1b]52;c;dGVzdCBkYXRh\x07".as_bytes());
assert_eq!(processor.terminal_state.terminal_title, original_title);
}
#[test]
fn test_multiple_osc_sequences() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]1;First Icon\x07".as_bytes());
processor.process_bytes("\x1b]2;First Title\x07".as_bytes());
assert_eq!(
processor.terminal_state.icon_name,
Some("First Icon".to_string())
);
assert_eq!(
processor.terminal_state.terminal_title,
Some("First Title".to_string())
);
processor.process_bytes("\x1b]0;Updated Both\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Updated Both".to_string())
);
}
#[test]
fn test_osc_long_titles() {
let mut processor = AnsiProcessor::new();
let long_title = "A".repeat(1000);
let osc_sequence = format!("\x1b]2;{}\x07", long_title);
processor.process_bytes(osc_sequence.as_bytes());
assert_eq!(processor.terminal_state.terminal_title, Some(long_title));
}
#[test]
fn test_osc_with_control_characters() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]2;Title\nwith\tcontrols\x07".as_bytes());
assert_eq!(
processor.terminal_state.terminal_title,
Some("Titlewithcontrols".to_string())
);
}
#[test]
fn test_title_propagation_detection() {
let mut processor = AnsiProcessor::new();
assert!(!processor.has_title_changed());
processor.process_bytes("\x1b]2;New Title\x07".as_bytes());
assert!(processor.has_title_changed());
let title = processor.get_and_consume_terminal_title();
assert_eq!(title, Some("New Title".to_string()));
assert!(!processor.has_title_changed());
}
#[test]
fn test_multiple_title_changes() {
let mut processor = AnsiProcessor::new();
processor.process_bytes("\x1b]2;Title 1\x07".as_bytes());
assert!(processor.has_title_changed());
assert_eq!(
processor.get_current_terminal_title(),
Some("Title 1".to_string())
);
let _ = processor.get_and_consume_terminal_title();
assert!(!processor.has_title_changed());
processor.process_bytes("\x1b]0;Title 2\x07".as_bytes());
assert!(processor.has_title_changed());
assert_eq!(
processor.get_current_terminal_title(),
Some("Title 2".to_string())
);
let title = processor.get_and_consume_terminal_title();
assert_eq!(title, Some("Title 2".to_string()));
assert!(!processor.has_title_changed());
}
}