#[cfg(test)]
mod tab_stop_tests {
use crate::ansi_processor::{AnsiProcessor, TerminalState};
#[test]
fn test_default_tab_stops() {
let terminal_state = TerminalState::new(80, 24);
assert!(!terminal_state.tab_stops[0]); assert!(terminal_state.tab_stops[8]); assert!(terminal_state.tab_stops[16]); assert!(terminal_state.tab_stops[24]); assert!(terminal_state.tab_stops[32]); assert!(terminal_state.tab_stops[40]); assert!(terminal_state.tab_stops[48]); assert!(terminal_state.tab_stops[56]); assert!(terminal_state.tab_stops[64]); assert!(terminal_state.tab_stops[72]);
assert!(!terminal_state.tab_stops[5]); assert!(!terminal_state.tab_stops[10]); }
#[test]
fn test_tab_forward() {
let mut terminal_state = TerminalState::new(80, 24);
terminal_state.get_cursor_mut().x = 0;
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 8);
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 16);
terminal_state.get_cursor_mut().x = 5;
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 8);
}
#[test]
fn test_tab_backward() {
let mut terminal_state = TerminalState::new(80, 24);
terminal_state.get_cursor_mut().x = 20;
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 16);
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 8);
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 0);
}
#[test]
fn test_tab_forward_at_end() {
let mut terminal_state = TerminalState::new(80, 24);
terminal_state.get_cursor_mut().x = 75;
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 79);
}
#[test]
fn test_tab_backward_at_beginning() {
let mut terminal_state = TerminalState::new(80, 24);
terminal_state.get_cursor_mut().x = 3;
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 0);
}
#[test]
fn test_set_tab_stop_esc_h() {
let mut processor = AnsiProcessor::new();
processor.terminal_state.get_cursor_mut().x = 10;
assert!(!processor.terminal_state.tab_stops[10]);
processor.process_bytes(b"\x1bH");
assert!(processor.terminal_state.tab_stops[10]);
}
#[test]
fn test_clear_tab_stop_current() {
let mut processor = AnsiProcessor::new();
assert!(processor.terminal_state.tab_stops[8]);
processor.terminal_state.get_cursor_mut().x = 8;
processor.process_bytes(b"\x1b[0g");
assert!(!processor.terminal_state.tab_stops[8]);
assert!(processor.terminal_state.tab_stops[16]);
assert!(processor.terminal_state.tab_stops[24]);
}
#[test]
fn test_clear_all_tab_stops() {
let mut processor = AnsiProcessor::new();
assert!(processor.terminal_state.tab_stops[8]);
assert!(processor.terminal_state.tab_stops[16]);
assert!(processor.terminal_state.tab_stops[24]);
processor.process_bytes(b"\x1b[3g");
for &stop in &processor.terminal_state.tab_stops {
assert!(!stop);
}
}
#[test]
fn test_csi_tab_forward() {
let mut processor = AnsiProcessor::new();
processor.terminal_state.get_cursor_mut().x = 0;
processor.process_bytes(b"\x1b[I");
assert_eq!(processor.terminal_state.get_cursor().x, 8);
processor.process_bytes(b"\x1b[2I");
assert_eq!(processor.terminal_state.get_cursor().x, 24);
}
#[test]
fn test_csi_tab_backward() {
let mut processor = AnsiProcessor::new();
processor.terminal_state.get_cursor_mut().x = 20;
processor.process_bytes(b"\x1b[Z");
assert_eq!(processor.terminal_state.get_cursor().x, 16);
processor.process_bytes(b"\x1b[2Z");
assert_eq!(processor.terminal_state.get_cursor().x, 0);
}
#[test]
fn test_horizontal_tab_character() {
let mut processor = AnsiProcessor::new();
processor.terminal_state.get_cursor_mut().x = 0;
processor.process_bytes(b"\t");
assert_eq!(processor.terminal_state.get_cursor().x, 8);
processor.process_bytes(b"\t");
assert_eq!(processor.terminal_state.get_cursor().x, 16);
}
#[test]
fn test_custom_tab_stops() {
let mut processor = AnsiProcessor::new();
processor.process_bytes(b"\x1b[3g");
processor.terminal_state.get_cursor_mut().x = 5;
processor.process_bytes(b"\x1bH");
processor.terminal_state.get_cursor_mut().x = 15;
processor.process_bytes(b"\x1bH");
processor.terminal_state.get_cursor_mut().x = 25;
processor.process_bytes(b"\x1bH");
processor.terminal_state.get_cursor_mut().x = 0;
processor.process_bytes(b"\t"); assert_eq!(processor.terminal_state.get_cursor().x, 5);
processor.process_bytes(b"\t"); assert_eq!(processor.terminal_state.get_cursor().x, 15);
processor.process_bytes(b"\t"); assert_eq!(processor.terminal_state.get_cursor().x, 25);
}
#[test]
fn test_tab_stops_after_resize() {
let mut terminal_state = TerminalState::new(40, 24);
assert!(terminal_state.tab_stops[8]);
assert!(terminal_state.tab_stops[16]);
assert!(terminal_state.tab_stops[24]);
assert!(terminal_state.tab_stops[32]);
terminal_state.resize(120, 24);
assert_eq!(terminal_state.tab_stops.len(), 120);
assert!(terminal_state.tab_stops[8]);
assert!(terminal_state.tab_stops[16]);
assert!(terminal_state.tab_stops[24]);
assert!(terminal_state.tab_stops[32]);
assert!(terminal_state.tab_stops[40]);
assert!(terminal_state.tab_stops[48]);
assert!(terminal_state.tab_stops[56]);
assert!(terminal_state.tab_stops[64]);
assert!(terminal_state.tab_stops[72]);
assert!(terminal_state.tab_stops[80]);
assert!(terminal_state.tab_stops[88]);
assert!(terminal_state.tab_stops[96]);
assert!(terminal_state.tab_stops[104]);
assert!(terminal_state.tab_stops[112]);
}
#[test]
fn test_tab_navigation_edge_cases() {
let mut terminal_state = TerminalState::new(80, 24);
terminal_state.get_cursor_mut().x = 8;
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 16);
terminal_state.get_cursor_mut().x = 16;
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 8);
terminal_state.get_cursor_mut().x = 79;
terminal_state.tab_forward();
assert_eq!(terminal_state.get_cursor().x, 79);
terminal_state.get_cursor_mut().x = 0;
terminal_state.tab_backward();
assert_eq!(terminal_state.get_cursor().x, 0); }
}