use super::super::*;
use super::make_global_arrangement;
use crate::ecs::types::{Point, SizeI};
use bevy_ecs::world::World;
#[test]
fn test_hit_test_ex_returns_region_name() {
let mut world = World::new();
let region_map = HitRegionMap::builder()
.rect("head", 0.0, 0.0, 100.0, 50.0)
.rect("body", 0.0, 50.0, 100.0, 50.0)
.build()
.unwrap();
let entity = world
.spawn((
make_global_arrangement(0.0, 0.0, 100.0, 100.0),
HitTest::named_regions(),
region_map,
))
.id();
let root = world.spawn_empty().id();
world.entity_mut(root).add_children(&[entity]);
let result = hit_test_ex(&world, root, PhysicalPoint::new(50.0, 25.0));
assert!(result.is_some());
let result = result.unwrap();
assert_eq!(result.entity, entity);
assert_eq!(result.region.as_deref(), Some("head"));
let result = hit_test_ex(&world, root, PhysicalPoint::new(50.0, 75.0));
assert!(result.is_some());
let result = result.unwrap();
assert_eq!(result.entity, entity);
assert_eq!(result.region.as_deref(), Some("body"));
}
#[test]
fn test_hit_test_ex_bounds_mode() {
let mut world = World::new();
let entity = world
.spawn((
make_global_arrangement(0.0, 0.0, 100.0, 100.0),
HitTest::bounds(),
))
.id();
let root = world.spawn_empty().id();
world.entity_mut(root).add_children(&[entity]);
let result = hit_test_ex(&world, root, PhysicalPoint::new(50.0, 50.0));
assert!(result.is_some());
let result = result.unwrap();
assert_eq!(result.entity, entity);
assert_eq!(result.region, None);
}
#[test]
fn test_hit_test_ex_backward_compat_same_entity() {
let mut world = World::new();
let back = world
.spawn(make_global_arrangement(0.0, 0.0, 100.0, 100.0))
.id();
let front = world
.spawn(make_global_arrangement(20.0, 20.0, 80.0, 80.0))
.id();
let root = world.spawn_empty().id();
world.entity_mut(root).add_children(&[back, front]);
let point = PhysicalPoint::new(50.0, 50.0);
let old_result = hit_test(&world, root, point);
let new_result = hit_test_ex(&world, root, point);
assert_eq!(old_result.unwrap(), new_result.unwrap().entity);
}
#[test]
fn test_hit_test_in_window_ex_with_region() {
let mut world = World::new();
let region_map = HitRegionMap::builder()
.rect("button", 0.0, 0.0, 100.0, 50.0)
.build()
.unwrap();
let window = world
.spawn((
make_global_arrangement(100.0, 200.0, 500.0, 500.0),
WindowPos {
position: Some(Point { x: 100, y: 200 }),
size: Some(SizeI {
width: 400,
height: 300,
}),
..Default::default()
},
))
.id();
let widget = world
.spawn((
make_global_arrangement(150.0, 250.0, 250.0, 300.0), HitTest::named_regions(),
region_map,
))
.id();
world.entity_mut(window).add_children(&[widget]);
let result = hit_test_in_window_ex(&world, window, PhysicalPoint::new(50.0, 50.0));
assert!(result.is_some());
let result = result.unwrap();
assert_eq!(result.entity, widget);
assert_eq!(result.region.as_deref(), Some("button"));
}
#[test]
fn test_hit_test_in_window_ex_no_window_pos() {
let mut world = World::new();
let window = world
.spawn(make_global_arrangement(0.0, 0.0, 100.0, 100.0))
.id();
let result = hit_test_in_window_ex(&world, window, PhysicalPoint::new(50.0, 50.0));
assert!(result.is_none());
}
#[test]
fn test_hit_test_in_window_ex_position_none() {
let mut world = World::new();
let window = world
.spawn((
make_global_arrangement(0.0, 0.0, 100.0, 100.0),
WindowPos {
position: None,
..Default::default()
},
))
.id();
let result = hit_test_in_window_ex(&world, window, PhysicalPoint::new(50.0, 50.0));
assert!(result.is_none());
}
#[test]
fn test_existing_api_backward_compat() {
let mut world = World::new();
let entity = world
.spawn((
make_global_arrangement(0.0, 0.0, 100.0, 100.0),
HitTest::bounds(),
))
.id();
let root = world.spawn_empty().id();
world.entity_mut(root).add_children(&[entity]);
let result = hit_test(&world, root, PhysicalPoint::new(50.0, 50.0));
assert_eq!(result, Some(entity));
let result = hit_test(&world, root, PhysicalPoint::new(200.0, 200.0));
assert_eq!(result, None);
}