use super::super::*;
#[test]
fn test_point_in_polygon_convex_inside() {
let vertices = vec![(0.0, 0.0), (100.0, 0.0), (100.0, 100.0), (0.0, 100.0)];
assert!(point_in_polygon(50.0, 50.0, &vertices));
}
#[test]
fn test_point_in_polygon_convex_outside() {
let vertices = vec![(0.0, 0.0), (100.0, 0.0), (100.0, 100.0), (0.0, 100.0)];
assert!(!point_in_polygon(150.0, 50.0, &vertices));
}
#[test]
fn test_point_in_polygon_concave_inside() {
let vertices = vec![
(0.0, 0.0),
(100.0, 0.0),
(100.0, 50.0),
(50.0, 50.0),
(50.0, 100.0),
(0.0, 100.0),
];
assert!(point_in_polygon(25.0, 75.0, &vertices));
}
#[test]
fn test_point_in_polygon_concave_outside_notch() {
let vertices = vec![
(0.0, 0.0),
(100.0, 0.0),
(100.0, 50.0),
(50.0, 50.0),
(50.0, 100.0),
(0.0, 100.0),
];
assert!(!point_in_polygon(75.0, 75.0, &vertices));
}
#[test]
fn test_point_in_polygon_triangle() {
let vertices = vec![(50.0, 0.0), (100.0, 100.0), (0.0, 100.0)];
assert!(point_in_polygon(50.0, 50.0, &vertices));
assert!(!point_in_polygon(5.0, 5.0, &vertices));
}
#[test]
fn test_point_in_polygon_insufficient_vertices() {
let vertices = vec![(0.0, 0.0), (100.0, 0.0)];
assert!(!point_in_polygon(50.0, 0.0, &vertices));
}
#[test]
fn test_point_in_polygon_closing_edge() {
let vertices = vec![(0.0, 0.0), (80.0, 0.0), (60.0, 100.0), (0.0, 100.0)];
assert!(point_in_polygon(10.0, 50.0, &vertices));
assert!(!point_in_polygon(-10.0, 50.0, &vertices));
}
#[test]
fn test_polygon_hit_test_region_inside() {
let map = HitRegionMap::builder()
.polygon("tri", &[(0.0, 0.0), (100.0, 0.0), (50.0, 100.0)])
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.50, 0.33, &entity_size), Some("tri"));
}
#[test]
fn test_polygon_hit_test_region_outside() {
let map = HitRegionMap::builder()
.polygon("tri", &[(0.0, 0.0), (100.0, 0.0), (50.0, 100.0)])
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.95, 0.90, &entity_size), None);
}
#[test]
fn test_polygon_hit_test_region_non_square_entity() {
let map = HitRegionMap::builder()
.polygon(
"right_half",
&[(100.0, 0.0), (200.0, 0.0), (200.0, 100.0), (100.0, 100.0)],
)
.build()
.unwrap();
let entity_size = Size {
width: 200.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.25, 0.50, &entity_size), None);
assert_eq!(
map.hit_test_region(0.75, 0.50, &entity_size),
Some("right_half")
);
}
#[test]
fn test_polygon_hit_test_region_multiple_regions() {
let map = HitRegionMap::builder()
.polygon(
"top-left",
&[(0.0, 0.0), (50.0, 0.0), (50.0, 50.0), (0.0, 50.0)],
)
.polygon(
"top-right",
&[(50.0, 0.0), (100.0, 0.0), (100.0, 50.0), (50.0, 50.0)],
)
.polygon(
"bottom-left",
&[(0.0, 50.0), (50.0, 50.0), (50.0, 100.0), (0.0, 100.0)],
)
.polygon(
"bottom-right",
&[(50.0, 50.0), (100.0, 50.0), (100.0, 100.0), (50.0, 100.0)],
)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(
map.hit_test_region(0.25, 0.25, &entity_size),
Some("top-left")
);
assert_eq!(
map.hit_test_region(0.75, 0.25, &entity_size),
Some("top-right")
);
assert_eq!(
map.hit_test_region(0.25, 0.75, &entity_size),
Some("bottom-left")
);
assert_eq!(
map.hit_test_region(0.75, 0.75, &entity_size),
Some("bottom-right")
);
}