conspire 0.7.1

The Rust interface to conspire.
Documentation
use crate::{
    geometry::mesh::{Connectivity, Mesh, Output},
    io::Write,
};
use std::fs::read_to_string;

#[test]
fn triangles_round_trip() {
    let connectivities = vec![Connectivity::Triangular(vec![[0, 1, 2], [0, 2, 3]].into())];
    let coordinates = vec![
        [0.0, 0.0, 0.0],
        [1.0, 0.0, 0.0],
        [1.0, 1.0, 0.0],
        [0.0, 1.0, 0.0],
    ]
    .into();
    let path = "target/triangles.mesh";
    Mesh::from((connectivities, coordinates))
        .write(Output::Medit(path))
        .unwrap();
    let contents = read_to_string(path).unwrap();
    assert!(contents.starts_with("MeshVersionFormatted 2"));
    assert!(contents.contains("Dimension 3"));
    assert!(contents.contains("Vertices\n4\n"));
    assert!(contents.contains("Triangles\n2\n"));
    assert!(contents.contains("1 2 3 1\n"));
    assert!(contents.contains("1 3 4 1\n"));
    assert!(contents.trim_end().ends_with("End"));
}

#[test]
fn merges_blocks_of_same_type() {
    let connectivities = vec![
        Connectivity::Triangular(vec![[0, 1, 2]].into()),
        Connectivity::Triangular(vec![[0, 2, 3]].into()),
    ];
    let coordinates = vec![
        [0.0, 0.0, 0.0],
        [1.0, 0.0, 0.0],
        [1.0, 1.0, 0.0],
        [0.0, 1.0, 0.0],
    ]
    .into();
    let path = "target/merged.mesh";
    Mesh::from((connectivities, coordinates))
        .write(Output::Medit(path))
        .unwrap();
    let contents = read_to_string(path).unwrap();
    assert_eq!(contents.matches("Triangles").count(), 1);
    assert!(contents.contains("Triangles\n2\n"));
    assert!(contents.contains("1 2 3 1\n"));
    assert!(contents.contains("1 3 4 2\n"));
}

#[test]
fn mixed_hex_wedge_pyramid_tet() {
    let connectivities = vec![
        Connectivity::Hexahedral(vec![[0, 1, 2, 3, 4, 5, 6, 7]].into()),
        Connectivity::Wedge(vec![[4, 5, 8, 7, 6, 9]].into()),
        Connectivity::Pyramidal(vec![[1, 2, 6, 5, 10]].into()),
        Connectivity::Tetrahedral(vec![[1, 2, 10, 11]].into()),
    ];
    let coordinates = vec![
        [0.0, 0.0, 0.0],
        [1.0, 0.0, 0.0],
        [1.0, 1.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 0.0, 1.0],
        [1.0, 0.0, 1.0],
        [1.0, 1.0, 1.0],
        [0.0, 1.0, 1.0],
        [0.5, 0.0, 2.0],
        [0.5, 1.0, 2.0],
        [2.0, 0.5, 0.5],
        [1.5, 0.5, -1.0],
    ]
    .into();
    let path = "target/mixed.mesh";
    Mesh::from((connectivities, coordinates))
        .write(Output::Medit(path))
        .unwrap();
    let contents = read_to_string(path).unwrap();
    assert!(contents.contains("Vertices\n12\n"));
    assert!(contents.contains("Hexahedra\n1\n1 2 3 4 5 6 7 8 1\n"));
    assert!(contents.contains("Prisms\n1\n5 6 9 8 7 10 2\n"));
    assert!(contents.contains("Pyramids\n1\n2 3 7 6 11 3\n"));
    assert!(contents.contains("Tetrahedra\n1\n2 3 11 12 4\n"));
    assert!(contents.trim_end().ends_with("End"));
}

#[test]
fn polyhedral_is_unsupported() {
    let connectivities = vec![Connectivity::Polyhedral(
        (vec![vec![0]], vec![vec![0, 1, 2]]).into(),
    )];
    let coordinates = vec![[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0]].into();
    assert!(
        Mesh::from((connectivities, coordinates))
            .write(Output::Medit("target/bad.mesh"))
            .is_err()
    );
}