use term_test::{Result, SixelCapture, SixelSequence};
#[test]
fn test_sixel_capture_empty() {
let capture = SixelCapture::new();
assert!(capture.is_empty());
assert_eq!(capture.sequences().len(), 0);
}
#[test]
fn test_sixel_sequence_bounds() {
let seq = SixelSequence::new(vec![0x1b, 0x50], (5, 5), (5, 5, 10, 10));
assert!(seq.is_within((0, 0, 20, 20)));
assert!(!seq.is_within((0, 0, 10, 10)));
assert!(!seq.is_within((10, 10, 10, 10)));
}
#[test]
fn test_sixel_sequence_overlaps() {
let seq = SixelSequence::new(vec![], (5, 5), (5, 5, 10, 10));
assert!(seq.overlaps((0, 0, 10, 10)));
assert!(seq.overlaps((10, 10, 10, 10)));
assert!(seq.overlaps((5, 5, 10, 10)));
assert!(!seq.overlaps((0, 0, 5, 5)));
assert!(!seq.overlaps((15, 15, 5, 5)));
}
#[test]
fn test_sixel_capture_filtering() -> Result<()> {
let mut capture = SixelCapture::new();
let seq1 = SixelSequence::new(vec![], (5, 5), (5, 5, 10, 10));
let seq2 = SixelSequence::new(vec![], (20, 20), (20, 20, 10, 10));
let area = (0, 0, 15, 15);
assert_eq!(capture.sequences_in_area(area).len(), 0);
Ok(())
}
#[test]
fn test_sixel_validation() -> Result<()> {
let capture = SixelCapture::new();
let area = (0, 0, 80, 24);
capture.assert_all_within(area)?;
Ok(())
}
#[test]
fn test_real_sixel_sequence_parsing() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(80, 24);
screen.feed(b"\x1b[5;10H"); screen.feed(b"\x1bPq"); screen.feed(b"\"1;1;100;50"); screen.feed(b"#0;2;100;100;100"); screen.feed(b"#0~~@@vv"); screen.feed(b"\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 1, "Should parse exactly one Sixel region");
let region = ®ions[0];
assert_eq!(region.start_row, 4, "Row should be 4 (0-based)");
assert_eq!(region.start_col, 9, "Col should be 9 (0-based)");
assert_eq!(region.width, 100, "Width should match raster attribute");
assert_eq!(region.height, 50, "Height should match raster attribute");
Ok(())
}
#[test]
fn test_multiple_sixel_sequences() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(120, 40);
screen.feed(b"\x1b[10;10H\x1bPq\"1;1;200;150#0~\x1b\\");
screen.feed(b"\x1b[20;60H\x1bPq\"1;1;300;200#0~\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 2, "Should capture both Sixel sequences");
assert_eq!(regions[0].start_row, 9);
assert_eq!(regions[0].start_col, 9);
assert_eq!(regions[0].width, 200);
assert_eq!(regions[0].height, 150);
assert_eq!(regions[1].start_row, 19);
assert_eq!(regions[1].start_col, 59);
assert_eq!(regions[1].width, 300);
assert_eq!(regions[1].height, 200);
Ok(())
}
#[test]
fn test_sixel_abbreviated_raster_format() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(80, 24);
screen.feed(b"\x1b[1;1H\x1bPq\"400;300#0~\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 1);
let region = ®ions[0];
assert_eq!(region.width, 400, "Should parse abbreviated width");
assert_eq!(region.height, 300, "Should parse abbreviated height");
Ok(())
}
#[test]
fn test_sixel_without_raster_attributes() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(80, 24);
screen.feed(b"\x1b[5;5H\x1bPq#0;2;100;100;100#0~~@@\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 1, "Should still capture the sequence");
let region = ®ions[0];
assert_eq!(region.width, 0, "Width should be 0 without raster attributes");
assert_eq!(region.height, 0, "Height should be 0 without raster attributes");
assert!(!region.data.is_empty(), "Data should still be captured");
Ok(())
}
#[test]
fn test_sixel_bounds_validation() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(120, 40);
let preview_area = (5, 30, 70, 25);
screen.feed(b"\x1b[10;40H\x1bPq\"1;1;200;100#0~\x1b\\");
let capture = SixelCapture::from_screen_state(&screen);
let sequences = capture.sequences_in_area(preview_area);
assert_eq!(sequences.len(), 1, "Sixel should be within preview area");
let outside = capture.sequences_outside_area(preview_area);
assert_eq!(outside.len(), 0, "No Sixel should be outside preview area");
capture.assert_all_within(preview_area)?;
Ok(())
}
#[test]
fn test_sixel_out_of_bounds_detection() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(120, 40);
let preview_area = (5, 30, 20, 10);
screen.feed(b"\x1b[1;1H\x1bPq\"1;1;100;50#0~\x1b\\");
let capture = SixelCapture::from_screen_state(&screen);
let outside = capture.sequences_outside_area(preview_area);
assert_eq!(outside.len(), 1, "Sixel should be detected as outside");
let result = capture.assert_all_within(preview_area);
assert!(result.is_err(), "Validation should fail for out-of-bounds Sixel");
Ok(())
}
#[test]
fn test_sixel_state_comparison() -> Result<()> {
use term_test::ScreenState;
let mut screen1 = ScreenState::new(80, 24);
screen1.feed(b"\x1b[10;10H\x1bPq\"1;1;100;100#0~\x1b\\");
let capture1 = SixelCapture::from_screen_state(&screen1);
let mut screen2 = ScreenState::new(80, 24);
screen2.feed(b"\x1b[10;10H\x1bPq\"1;1;200;200#0~\x1b\\");
let capture2 = SixelCapture::from_screen_state(&screen2);
assert!(capture1.differs_from(&capture2), "Different Sixel should be detected");
let screen3 = ScreenState::new(80, 24);
let capture3 = SixelCapture::from_screen_state(&screen3);
assert!(capture1.differs_from(&capture3), "Empty state should differ from populated");
assert!(!capture1.differs_from(&capture1), "Same capture should not differ");
Ok(())
}
#[test]
fn test_complex_sixel_sequence() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(150, 50);
screen.feed(b"\x1b[15;25H");
screen.feed(b"\x1bPq\"1;1;640;480");
screen.feed(b"#0;2;0;0;0"); screen.feed(b"#1;2;100;0;0"); screen.feed(b"#2;2;0;100;0"); screen.feed(b"#0~~~"); screen.feed(b"#1@@@"); screen.feed(b"#2~~~"); screen.feed(b"\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 1);
let region = ®ions[0];
assert_eq!(region.width, 640, "Should parse complex sequence width");
assert_eq!(region.height, 480, "Should parse complex sequence height");
assert_eq!(region.start_row, 14);
assert_eq!(region.start_col, 24);
Ok(())
}
#[test]
fn test_large_sixel_dimensions() -> Result<()> {
use term_test::ScreenState;
let mut screen = ScreenState::new(200, 100);
screen.feed(b"\x1b[1;1H\x1bPq\"1;1;3840;2160#0~\x1b\\");
let regions = screen.sixel_regions();
assert_eq!(regions.len(), 1);
let region = ®ions[0];
assert_eq!(region.width, 3840, "Should handle large width");
assert_eq!(region.height, 2160, "Should handle large height");
Ok(())
}
#[test]
fn test_harness_sixel_count() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(80, 24)?;
assert_eq!(harness.sixel_count(), 0);
harness.state_mut().feed(b"\x1b[10;10H\x1bPq\"1;1;100;50#0~\x1b\\");
assert_eq!(harness.sixel_count(), 1);
harness.state_mut().feed(b"\x1b[15;20H\x1bPq\"1;1;80;60#0~\x1b\\");
assert_eq!(harness.sixel_count(), 2);
Ok(())
}
#[test]
fn test_harness_sixel_at() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(80, 24)?;
harness.state_mut().feed(b"\x1b[8;15H\x1bPq\"1;1;120;80#0~\x1b\\");
let region = harness.sixel_at(7, 14);
assert!(region.is_some());
assert_eq!(region.unwrap().width, 120);
assert!(harness.sixel_at(0, 0).is_none());
Ok(())
}
#[test]
fn test_harness_assert_within_bounds() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(100, 40)?;
harness.state_mut().feed(b"\x1b[15;30H\x1bPq\"1;1;200;100#0~\x1b\\");
let full_screen = (0, 0, 100, 40);
assert!(harness.assert_sixel_within_bounds(full_screen).is_ok());
let small_area = (0, 0, 20, 10);
assert!(harness.assert_sixel_within_bounds(small_area).is_err());
Ok(())
}
#[test]
fn test_harness_has_sixel_in_area() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(120, 40)?;
let preview_area = (10, 40, 70, 25);
assert!(!harness.has_sixel_in_area(preview_area));
harness.state_mut().feed(b"\x1b[15;60H\x1bPq\"1;1;300;150#0~\x1b\\");
assert!(harness.has_sixel_in_area(preview_area));
Ok(())
}
#[test]
fn test_harness_preview_has_sixel() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(80, 24)?;
assert!(harness.assert_preview_has_sixel().is_err());
harness.state_mut().feed(b"\x1b[10;50H\x1bPq\"1;1;150;80#0~\x1b\\");
assert!(harness.assert_preview_has_sixel().is_ok());
Ok(())
}
#[test]
fn test_harness_preview_has_sixel_custom_area() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(120, 40)?;
let custom_area = (10, 50, 60, 25);
harness.state_mut().feed(b"\x1b[20;70H\x1bPq\"1;1;400;200#0~\x1b\\");
assert!(harness.assert_preview_has_sixel_in(custom_area).is_ok());
let wrong_area = (0, 0, 30, 20);
assert!(harness.assert_preview_has_sixel_in(wrong_area).is_err());
Ok(())
}
#[test]
fn test_dgx_pixels_workflow() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(80, 24)?;
harness.state_mut().feed(b"\x1b[10;50H\x1bPq\"1;1;200;120#0~\x1b\\");
assert_eq!(harness.sixel_count(), 1);
assert!(harness.assert_preview_has_sixel().is_ok());
let sidebar = (0, 0, 40, 24);
assert!(!harness.has_sixel_in_area(sidebar));
Ok(())
}
#[test]
fn test_multiple_sixels_boundary_checking() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(150, 50)?;
harness.state_mut().feed(b"\x1b[1;1H\x1bPq\"1;1;100;80#0~\x1b\\"); harness.state_mut().feed(b"\x1b[1;140H\x1bPq\"1;1;80;60#0~\x1b\\"); harness.state_mut().feed(b"\x1b[45;1H\x1bPq\"1;1;90;70#0~\x1b\\"); harness.state_mut().feed(b"\x1b[45;140H\x1bPq\"1;1;85;65#0~\x1b\\");
assert_eq!(harness.sixel_count(), 4);
assert!(harness.assert_sixel_within_bounds((0, 0, 150, 50)).is_ok());
assert!(harness.has_sixel_in_area((0, 0, 75, 25))); assert!(harness.has_sixel_in_area((0, 75, 75, 25))); assert!(harness.has_sixel_in_area((25, 0, 75, 25))); assert!(harness.has_sixel_in_area((25, 75, 75, 25)));
Ok(())
}
#[test]
fn test_sixel_clearing_verification() -> Result<()> {
use term_test::{ScreenState, TuiTestHarness};
let mut harness = TuiTestHarness::new(80, 24)?;
harness.state_mut().feed(b"\x1b[10;20H\x1bPq\"1;1;150;100#0~\x1b\\");
harness.state_mut().feed(b"\x1b[15;30H\x1bPq\"1;1;100;80#0~\x1b\\");
assert_eq!(harness.sixel_count(), 2);
*harness.state_mut() = ScreenState::new(80, 24);
assert_eq!(harness.sixel_count(), 0);
assert!(harness.sixel_regions().is_empty());
assert!(harness.sixel_at(9, 19).is_none());
Ok(())
}
#[test]
fn test_overlapping_sixels_detection() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(120, 40)?;
harness.state_mut().feed(b"\x1b[10;30H\x1bPq\"1;1;200;150#0~\x1b\\");
harness.state_mut().feed(b"\x1b[15;35H\x1bPq\"1;1;180;140#0~\x1b\\");
assert_eq!(harness.sixel_count(), 2);
let overlap_area = (8, 28, 220, 160);
assert!(harness.has_sixel_in_area(overlap_area));
Ok(())
}
#[test]
fn test_sixel_dimensions_accuracy() -> Result<()> {
use term_test::TuiTestHarness;
let mut harness = TuiTestHarness::new(100, 40)?;
harness.state_mut().feed(b"\x1b[5;10H\x1bPq\"1;1;256;128#0~\x1b\\");
harness.state_mut().feed(b"\x1b[10;20H\x1bPq\"1;1;512;256#0~\x1b\\");
harness.state_mut().feed(b"\x1b[15;30H\x1bPq\"1;1;1024;768#0~\x1b\\");
assert_eq!(harness.sixel_count(), 3);
let region1 = harness.sixel_at(4, 9).unwrap();
assert_eq!(region1.width, 256);
assert_eq!(region1.height, 128);
let region2 = harness.sixel_at(9, 19).unwrap();
assert_eq!(region2.width, 512);
assert_eq!(region2.height, 256);
let region3 = harness.sixel_at(14, 29).unwrap();
assert_eq!(region3.width, 1024);
assert_eq!(region3.height, 768);
Ok(())
}