#[cfg(test)]
mod tests {
use crate::components::box_renderer::{BoxDimensions, BoxRenderer};
use crate::model::common::{Stream, StreamType};
use crate::model::muxbox::MuxBox;
use crate::Bounds;
use indexmap::IndexMap;
fn create_test_muxbox_with_content(content: &str) -> MuxBox {
MuxBox {
id: "test".to_string(),
content: Some(content.to_string()),
border_color: Some("white".to_string()),
horizontal_scroll: Some(0.0),
vertical_scroll: Some(0.0),
streams: IndexMap::new(),
..Default::default()
}
}
fn create_test_muxbox_with_streams() -> MuxBox {
let mut streams = IndexMap::new();
streams.insert(
"stream1".to_string(),
Stream {
id: "stream1".to_string(),
stream_type: StreamType::Content,
label: "Stream 1".to_string(),
content: vec![
"Multi-line".to_string(),
"stream content".to_string(),
"with tabs".to_string(),
],
choices: None,
source: None,
content_hash: 0,
last_updated: std::time::SystemTime::now(),
created_at: std::time::SystemTime::now(),
},
);
streams.insert(
"stream2".to_string(),
Stream {
id: "stream2".to_string(),
stream_type: StreamType::Content,
label: "Stream 2".to_string(),
content: vec!["Another stream".to_string()],
choices: None,
source: None,
content_hash: 0,
last_updated: std::time::SystemTime::now(),
created_at: std::time::SystemTime::now(),
},
);
MuxBox {
id: "test_tabs".to_string(),
border_color: Some("white".to_string()),
horizontal_scroll: Some(25.0),
vertical_scroll: Some(50.0),
streams,
selected_stream_id: Some("stream1".to_string()),
..Default::default()
}
}
#[test]
fn test_box_dimensions_calculation_basic() {
let muxbox = create_test_muxbox_with_content("Hello\nWorld");
let total_bounds = Bounds::new(10, 5, 50, 25);
let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
assert_eq!(dimensions.total_bounds, total_bounds);
assert_eq!(dimensions.border_thickness, 1);
assert_eq!(dimensions.content_bounds.left(), 11); assert_eq!(dimensions.content_bounds.top(), 6); assert_eq!(dimensions.content_bounds.right(), 49); assert_eq!(dimensions.content_bounds.bottom(), 24);
assert_eq!(dimensions.viewable_width, 38); assert_eq!(dimensions.viewable_height, 18);
assert_eq!(dimensions.content_width, 5); assert_eq!(dimensions.content_height, 2);
assert_eq!(dimensions.horizontal_scroll, 0.0);
assert_eq!(dimensions.vertical_scroll, 0.0);
}
#[test]
fn test_box_dimensions_with_tabs() {
let muxbox = create_test_muxbox_with_streams();
let total_bounds = Bounds::new(0, 0, 30, 20);
let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
assert_eq!(dimensions.tab_height, 1);
assert_eq!(dimensions.content_bounds.left(), 1); assert_eq!(dimensions.content_bounds.top(), 2); assert_eq!(dimensions.content_bounds.right(), 29); assert_eq!(dimensions.content_bounds.bottom(), 19);
assert_eq!(dimensions.horizontal_scroll, 25.0);
assert_eq!(dimensions.vertical_scroll, 50.0);
}
#[test]
fn test_coordinate_translation_basic() {
let muxbox = create_test_muxbox_with_content("ABCDE\nFGHIJ");
let total_bounds = Bounds::new(10, 10, 30, 25); let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
let (screen_x, screen_y) = dimensions.inbox_to_screen(0, 0);
let expected_screen_x = dimensions.content_bounds.left();
let expected_screen_y = dimensions.content_bounds.top();
assert_eq!(screen_x, expected_screen_x);
assert_eq!(screen_y, expected_screen_y);
let inbox_coords = dimensions.screen_to_inbox(expected_screen_x, expected_screen_y);
assert_eq!(inbox_coords, Some((0, 0)));
let (screen_x, screen_y) = dimensions.inbox_to_screen(2, 1);
let expected_mid_screen_x = expected_screen_x + 2;
let expected_mid_screen_y = expected_screen_y + 1;
assert_eq!(screen_x, expected_mid_screen_x);
assert_eq!(screen_y, expected_mid_screen_y);
let inbox_coords = dimensions.screen_to_inbox(expected_mid_screen_x, expected_mid_screen_y);
assert_eq!(inbox_coords, Some((2, 1)));
}
#[test]
fn test_coordinate_translation_with_scroll() {
let mut muxbox =
create_test_muxbox_with_content("ABCDEFGHIJ\nKLMNOPQRST\nUVWXYZ1234\n567890ABCD");
muxbox.horizontal_scroll = Some(50.0); muxbox.vertical_scroll = Some(25.0);
let total_bounds = Bounds::new(0, 0, 15, 10); let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
let (screen_x, screen_y) = dimensions.inbox_to_screen(0, 0);
let inbox_coords = dimensions.screen_to_inbox(screen_x, screen_y);
assert_eq!(inbox_coords, Some((0, 0)));
}
#[test]
fn test_coordinate_translation_out_of_bounds() {
let muxbox = create_test_muxbox_with_content("ABC\nDEF");
let total_bounds = Bounds::new(0, 0, 20, 15);
let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
let (screen_x, screen_y) = dimensions.inbox_to_screen(10, 10);
assert_eq!(screen_x, usize::MAX); assert_eq!(screen_y, usize::MAX);
let inbox_coords = dimensions.screen_to_inbox(0, 0); assert_eq!(inbox_coords, None);
}
#[test]
fn test_visible_inbox_region() {
let mut muxbox = create_test_muxbox_with_content(
"Line1\nLine2\nLine3\nLine4\nLine5\nLine6\nLine7\nLine8\nLine9\nLine10",
);
muxbox.vertical_scroll = Some(50.0);
let total_bounds = Bounds::new(0, 0, 20, 8); let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
let (left, top, right, bottom) = dimensions.get_visible_inbox_region();
if dimensions.content_height > dimensions.viewable_height {
assert!(top > 0); }
assert_eq!(left, 0); assert_eq!(right - left, dimensions.viewable_width);
assert_eq!(bottom - top, dimensions.viewable_height);
}
#[test]
fn test_visibility_checks() {
let mut muxbox =
create_test_muxbox_with_content("ABCDEFGHIJKLMNOP\nQRSTUVWXYZ123456\n7890!@#$%^&*()++");
muxbox.horizontal_scroll = Some(60.0);
let total_bounds = Bounds::new(0, 0, 12, 8); let dimensions = BoxDimensions::calculate_from_muxbox(&muxbox, total_bounds.clone());
let (left, top, right, bottom) = dimensions.get_visible_inbox_region();
assert!(dimensions.is_inbox_visible(left, top)); if left + 1 < right && top + 1 < bottom {
assert!(dimensions.is_inbox_visible(left + 1, top)); }
assert!(!dimensions.is_inbox_visible(dimensions.content_width, 0));
assert!(!dimensions.is_inbox_visible(0, dimensions.content_height));
if left > 0 {
assert!(!dimensions.is_inbox_visible(0, top)); }
}
#[test]
fn test_box_renderer_coordinate_integration() {
let muxbox = Box::leak(Box::new(create_test_muxbox_with_content("Test\nContent")));
let mut renderer = BoxRenderer::new(muxbox, "test_renderer".to_string());
let bounds = Bounds::new(5, 5, 25, 15);
renderer.initialize_dimensions(bounds.clone());
let dimensions = renderer
.get_dimensions()
.expect("Dimensions should be initialized");
assert_eq!(dimensions.total_bounds, bounds);
let screen_coords = renderer
.inbox_to_screen_coords(0, 0)
.expect("Rendered content origin should map to screen coordinates");
let inbox_coords = renderer.screen_to_inbox_coords(screen_coords.0, screen_coords.1);
assert_eq!(inbox_coords, Some((0, 0)));
}
}