use crate::Polygon;
pub trait PlaneSelector {
fn select<'a>(&self, polygons: &'a [Polygon]) -> Option<&'a Polygon>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct FirstPolygon;
impl PlaneSelector for FirstPolygon {
fn select<'a>(&self, polygons: &'a [Polygon]) -> Option<&'a Polygon> {
polygons.first()
}
}
#[cfg(test)]
mod tests {
use super::*;
use nalgebra::Point3;
fn make_triangle(a: [f32; 3], b: [f32; 3], c: [f32; 3]) -> Polygon {
Polygon::new(vec![
Point3::new(a[0], a[1], a[2]),
Point3::new(b[0], b[1], b[2]),
Point3::new(c[0], c[1], c[2]),
])
}
#[test]
fn first_polygon_empty_list() {
let selector = FirstPolygon;
let polygons: Vec<Polygon> = vec![];
assert!(selector.select(&polygons).is_none());
}
#[test]
fn first_polygon_single() {
let selector = FirstPolygon;
let poly = make_triangle([0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]);
let polygons = vec![poly.clone()];
let selected = selector.select(&polygons);
assert!(selected.is_some());
assert_eq!(selected.unwrap(), &poly);
}
#[test]
fn first_polygon_multiple() {
let selector = FirstPolygon;
let poly1 = make_triangle([0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]);
let poly2 = make_triangle([0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [0.0, 1.0, 1.0]);
let polygons = vec![poly1.clone(), poly2];
let selected = selector.select(&polygons);
assert!(selected.is_some());
assert_eq!(selected.unwrap(), &poly1);
}
}