use super::super::*;
#[test]
fn test_shapes_hit_test_degenerate_entity_size() {
let map = HitRegionMap::builder()
.rect("away", 10.0, 10.0, 30.0, 30.0)
.build()
.unwrap();
let degenerate = Size {
width: 0.0,
height: 0.0,
};
assert_eq!(map.hit_test_region(0.5, 0.5, °enerate), None);
}
#[test]
fn test_rect_hit_test_inside() {
let map = HitRegionMap::builder()
.rect("test", 10.0, 20.0, 50.0, 30.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.35, 0.35, &entity_size), Some("test"));
}
#[test]
fn test_rect_hit_test_outside() {
let map = HitRegionMap::builder()
.rect("test", 10.0, 20.0, 50.0, 30.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.05, 0.05, &entity_size), None);
}
#[test]
fn test_rect_hit_test_boundary_inclusive() {
let map = HitRegionMap::builder()
.rect("test", 10.0, 20.0, 50.0, 30.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.10, 0.20, &entity_size), Some("test"));
assert_eq!(map.hit_test_region(0.59, 0.49, &entity_size), Some("test"));
}
#[test]
fn test_builder_build_success() {
let result = HitRegionMap::builder()
.rect("head", 20.0, 0.0, 60.0, 40.0)
.polygon("hand", &[(0.0, 50.0), (30.0, 80.0), (0.0, 80.0)])
.build();
assert!(result.is_ok());
}
#[test]
fn test_builder_invalid_rect_size_zero_width() {
let result = HitRegionMap::builder()
.rect("bad", 0.0, 0.0, 0.0, 10.0)
.build();
assert!(result.is_err());
let err = result.unwrap_err();
assert!(matches!(err, HitRegionError::InvalidRectSize { .. }));
}
#[test]
fn test_builder_invalid_rect_size_negative() {
let result = HitRegionMap::builder()
.rect("bad", 0.0, 0.0, -5.0, 10.0)
.build();
assert!(result.is_err());
}
#[test]
fn test_builder_insufficient_vertices() {
let result = HitRegionMap::builder()
.polygon("bad", &[(0.0, 0.0), (10.0, 0.0)])
.build();
assert!(result.is_err());
let err = result.unwrap_err();
assert!(matches!(err, HitRegionError::InsufficientVertices { .. }));
}
#[test]
fn test_builder_empty_builds_ok() {
let result = HitRegionMap::builder().build();
assert!(result.is_ok());
}
#[test]
fn test_shapes_first_match_wins() {
let map = HitRegionMap::builder()
.rect("first", 0.0, 0.0, 100.0, 100.0)
.rect("second", 0.0, 0.0, 100.0, 100.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.5, 0.5, &entity_size), Some("first"));
}
#[test]
fn test_shapes_mixed_rect_polygon() {
let map = HitRegionMap::builder()
.rect("rect_region", 0.0, 0.0, 50.0, 50.0)
.polygon(
"poly_region",
&[(50.0, 0.0), (100.0, 0.0), (100.0, 50.0), (50.0, 50.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("rect_region")
);
assert_eq!(
map.hit_test_region(0.75, 0.25, &entity_size),
Some("poly_region")
);
}
#[test]
fn test_shapes_no_region_hit() {
let map = HitRegionMap::builder()
.rect("test", 10.0, 10.0, 30.0, 30.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.01, 0.01, &entity_size), None);
}
#[test]
fn test_empty_shapes_returns_none() {
let map = HitRegionMap::builder().build().unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.5, 0.5, &entity_size), None);
}
#[test]
fn test_error_display() {
let err = HitRegionError::InsufficientVertices { vertices: 2 };
assert!(err.to_string().contains("2 < 3"));
let err = HitRegionError::InvalidRectSize {
width: -1.0,
height: 10.0,
};
assert!(err.to_string().contains("-1"));
}
#[test]
fn test_shapes_extreme_and_nonfinite_rel_do_not_panic() {
let map = HitRegionMap::builder()
.rect("box", 10.0, 10.0, 30.0, 30.0)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(1e10, 1e10, &entity_size), None);
assert_eq!(map.hit_test_region(-1e10, -1e10, &entity_size), None);
assert_eq!(map.hit_test_region(f32::NAN, f32::NAN, &entity_size), None);
}
#[test]
fn test_shapes_zero_extent_rect_via_inclusive_boundary() {
let map = HitRegionMap::builder()
.rect("pt", 50.0, 50.0, f32::MIN_POSITIVE, f32::MIN_POSITIVE)
.build()
.unwrap();
let entity_size = Size {
width: 100.0,
height: 100.0,
};
assert_eq!(map.hit_test_region(0.5, 0.5, &entity_size), Some("pt"));
assert_eq!(map.hit_test_region(0.1, 0.1, &entity_size), None);
}