conspire 0.7.2

The Rust interface to conspire.
Documentation
use super::super::Class;
use super::super::test::{dual, hexahedron, sphere};
use crate::math::Tensor;
use std::collections::HashMap;

#[test]
fn classify_single_hexahedra() {
    let tessellation = sphere(3);
    assert_eq!(
        tessellation.classify(&hexahedron([-0.1; 3], [0.1; 3])),
        vec![Class::Inside]
    );
    assert_eq!(
        tessellation.classify(&hexahedron([2.0; 3], [3.0; 3])),
        vec![Class::Outside]
    );
    assert_eq!(
        tessellation.classify(&hexahedron([0.9, -0.1, -0.1], [1.1, 0.1, 0.1])),
        vec![Class::Cut]
    );
}

#[test]
fn classify_sphere_dual() {
    let tessellation = sphere(3);
    let mesh = dual(&tessellation, 8.0);
    let classes = tessellation.classify(&mesh);
    [Class::Inside, Class::Cut, Class::Outside]
        .iter()
        .for_each(|class| assert!(classes.contains(class)));
    let centroids = mesh.centroids();
    classes
        .iter()
        .zip(centroids.iter())
        .for_each(|(class, centroid)| match class {
            Class::Inside => assert!(centroid.norm() < 1.0),
            Class::Outside => assert!(centroid.norm() > 1.0),
            Class::Cut => (),
        });
    let mut faces = HashMap::<Vec<usize>, Vec<Class>>::new();
    mesh.iter().for_each(|block| {
        block
            .iter()
            .zip(classes.iter())
            .for_each(|(element, &class)| {
                block.local_faces().iter().for_each(|face| {
                    let mut key: Vec<usize> = face.iter().map(|&local| element[local]).collect();
                    key.sort_unstable();
                    faces.entry(key).or_default().push(class);
                })
            })
    });
    faces.values().for_each(|classes| {
        assert!(!(classes.contains(&Class::Inside) && classes.contains(&Class::Outside)))
    })
}