96 lines
2.9 KiB
Rust
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() );
|
|
}
|