mod common;
use doc_quad::core::buffer::DocBuffer;
use doc_quad::find_document;
#[test]
fn test_strided_buffer_detection() {
common::init_test_log();
let width = 640u32;
let height = 480u32;
let stride = 700u32;
let data = common::create_mock_y_channel(width, height, stride, (100, 100), (400, 300));
let buffer =
DocBuffer::new(&data, width, height, stride).expect("Failed to create buffer");
let result = find_document(&buffer).expect("Detection process failed");
assert!(result.is_some(), "Should detect the rectangular document");
if let Some(quad) = result {
assert!(
quad.area > 50000.0 && quad.area < 70000.0,
"Area out of range: {}",
quad.area
);
let [tl, tr, br, bl] = quad.points;
assert!(tl.x > 90.0 && tl.x < 110.0, "TL.x out of range: {}", tl.x);
assert!(tl.y > 90.0 && tl.y < 110.0, "TL.y out of range: {}", tl.y);
assert!(tr.x > 390.0 && tr.x < 410.0, "TR.x out of range: {}", tr.x);
assert!(tr.y > 90.0 && tr.y < 110.0, "TR.y out of range: {}", tr.y);
assert!(br.x > 390.0 && br.x < 410.0, "BR.x out of range: {}", br.x);
assert!(br.y > 290.0 && br.y < 310.0, "BR.y out of range: {}", br.y);
assert!(bl.x > 90.0 && bl.x < 110.0, "BL.x out of range: {}", bl.x);
assert!(bl.y > 290.0 && bl.y < 310.0, "BL.y out of range: {}", bl.y);
}
}
#[test]
fn test_contiguous_buffer_detection() {
common::init_test_log();
let width = 320u32;
let height = 240u32;
let stride = width;
let data = common::create_mock_y_channel(width, height, stride, (50, 50), (270, 190));
let buffer =
DocBuffer::new(&data, width, height, stride).expect("Failed to create buffer");
let result = find_document(&buffer).expect("Detection process failed");
assert!(result.is_some(), "Should detect document in contiguous buffer");
if let Some(quad) = result {
assert!(
quad.area > 25000.0 && quad.area < 36000.0,
"Area out of range: {}",
quad.area
);
let [tl, tr, br, bl] = quad.points;
assert!(tl.x > 40.0 && tl.x < 60.0, "TL.x out of range: {}", tl.x);
assert!(tl.y > 40.0 && tl.y < 60.0, "TL.y out of range: {}", tl.y);
assert!(tr.x > 260.0 && tr.x < 280.0, "TR.x out of range: {}", tr.x);
assert!(tr.y > 40.0 && tr.y < 60.0, "TR.y out of range: {}", tr.y);
assert!(br.x > 260.0 && br.x < 280.0, "BR.x out of range: {}", br.x);
assert!(br.y > 180.0 && br.y < 200.0, "BR.y out of range: {}", br.y);
assert!(bl.x > 40.0 && bl.x < 60.0, "BL.x out of range: {}", bl.x);
assert!(bl.y > 180.0 && bl.y < 200.0, "BL.y out of range: {}", bl.y);
}
}
#[test]
fn test_buffer_overflow_protection() {
let data = vec![0u8; 100];
assert!(
DocBuffer::new(&data, 10, 10, 9).is_err(),
"stride < width should fail"
);
assert!(
DocBuffer::new(&data, 10, 10, 11).is_err(),
"insufficient data should fail"
);
let data = vec![0u8; 100];
assert!(
DocBuffer::new(&data, 10, 10, 10).is_ok(),
"valid buffer should succeed"
);
}