Files
ltk/tests/tree_lookup.rs

96 lines
2.9 KiB
Rust

mod common;
use common::{ lw_none, lw_button, rect };
use ltk::test_support::{ find_widget_at, find_widget, find_handlers, WidgetHandlers };
use ltk::Point;
fn pt( x: f32, y: f32 ) -> Point
{
Point { x, y }
}
// ── find_widget_at ────────────────────────────────────────────────────────────
#[ test ]
fn hit_test_misses_when_empty()
{
let widgets: Vec<_> = vec![];
assert_eq!( find_widget_at::<()>( &widgets, pt( 10.0, 10.0 ) ), None );
}
#[ test ]
fn hit_test_misses_outside_all_rects()
{
let widgets = vec![
lw_none( 1, rect( 0.0, 0.0, 50.0, 50.0 ) ),
lw_none( 2, rect( 100.0, 100.0, 50.0, 50.0 ) ),
];
assert_eq!( find_widget_at( &widgets, pt( 75.0, 75.0 ) ), None );
}
#[ test ]
fn hit_test_returns_widget_under_point()
{
let widgets = vec![
lw_none( 7, rect( 0.0, 0.0, 100.0, 100.0 ) ),
lw_none( 8, rect( 200.0, 0.0, 100.0, 100.0 ) ),
];
assert_eq!( find_widget_at( &widgets, pt( 50.0, 50.0 ) ), Some( 7 ) );
assert_eq!( find_widget_at( &widgets, pt( 250.0, 50.0 ) ), Some( 8 ) );
}
#[ test ]
fn hit_test_returns_topmost_when_overlapping()
{
// Topmost wins. Layout pushes parents before children, so iteration in
// reverse must return the child (drawn last, last in the slice).
let widgets = vec![
lw_none( 1, rect( 0.0, 0.0, 200.0, 200.0 ) ),
lw_none( 2, rect( 50.0, 50.0, 100.0, 100.0 ) ),
];
assert_eq!( find_widget_at( &widgets, pt( 100.0, 100.0 ) ), Some( 2 ) );
assert_eq!( find_widget_at( &widgets, pt( 10.0, 10.0 ) ), Some( 1 ) );
}
// ── find_widget ───────────────────────────────────────────────────────────────
#[ test ]
fn find_widget_returns_match_by_flat_idx()
{
let widgets = vec![
lw_none( 10, rect( 0.0, 0.0, 10.0, 10.0 ) ),
lw_none( 20, rect( 0.0, 0.0, 10.0, 10.0 ) ),
lw_none( 30, rect( 0.0, 0.0, 10.0, 10.0 ) ),
];
let w = find_widget( &widgets, 20 ).expect( "widget 20 should be found" );
assert_eq!( w.flat_idx, 20 );
}
#[ test ]
fn find_widget_returns_none_for_missing_idx()
{
let widgets = vec![ lw_none( 1, rect( 0.0, 0.0, 10.0, 10.0 ) ) ];
assert!( find_widget( &widgets, 999 ).is_none() );
}
// ── find_handlers ─────────────────────────────────────────────────────────────
#[ test ]
fn find_handlers_returns_button_handler()
{
let widgets = vec![
lw_button( 5, rect( 0.0, 0.0, 10.0, 10.0 ) ),
];
let h = find_handlers( &widgets, 5 ).expect( "handler should be present" );
assert!( matches!( h, WidgetHandlers::Button { on_press: Some( () ), .. } ) );
}
#[ test ]
fn find_handlers_returns_none_for_missing_idx()
{
let widgets = vec![
lw_button( 5, rect( 0.0, 0.0, 10.0, 10.0 ) ),
];
assert!( find_handlers( &widgets, 6 ).is_none() );
}