mesh-sieve 4.0.2

Modular, high-performance Rust library for mesh and data management, designed for scientific computing and PDE codes.
Documentation
use crate::mesh_error::{MeshSieveError, RelationConflictKind};
use crate::topology::orientation::Sign;
use crate::topology::sieve::in_memory_oriented::InMemoryOrientedSieve;
use crate::topology::sieve::{InMemorySieve, Sieve};
use crate::topology::stack::{InMemoryStack, Stack};

#[test]
fn add_arrow_rejects_conflicting_payload() {
    let mut s = InMemorySieve::<u32, i32>::default();
    s.add_arrow(1, 2, 10).unwrap();
    let err = s.add_arrow(1, 2, 20).unwrap_err();
    assert!(matches!(
        err,
        MeshSieveError::RelationConflict {
            kind: RelationConflictKind::Payload,
            ..
        }
    ));
    let outs: Vec<_> = s.cone(1).collect();
    assert_eq!(outs.len(), 1);
    assert_eq!(outs[0], (2, 10));
    let ins: Vec<_> = s.support(2).collect();
    assert_eq!(ins, vec![(1, 10)]);
}

#[test]
fn add_cone_dedups() {
    let mut s = InMemorySieve::<u32, i32>::default();
    s.add_cone(1, vec![(2, 1), (2, 2), (3, 3)]);
    let mut cone: Vec<_> = s.cone(1).collect();
    cone.sort_by_key(|(d, _)| *d);
    assert_eq!(cone, vec![(2, 2), (3, 3)]);
}

#[test]
fn set_cone_last_wins_and_mirrors() {
    let mut s = InMemorySieve::<u32, i32>::default();
    s.set_cone(1, vec![(2, 1), (2, 9), (3, 3)]);
    let outs: Vec<_> = s.cone(1).collect();
    assert_eq!(outs.len(), 2);
    assert!(outs.contains(&(2, 9)));
    assert!(outs.contains(&(3, 3)));
    let ins: Vec<_> = s.support(2).collect();
    assert_eq!(ins, vec![(1, 9)]);
}

#[test]
fn oriented_add_rejects_payload_and_orientation_conflicts() {
    let mut s = InMemoryOrientedSieve::<u32, i32>::default();
    s.add_arrow_o(1, 2, 10, Sign(true)).unwrap();
    let err = s.add_arrow_o(1, 2, 20, Sign(false)).unwrap_err();
    assert!(matches!(
        err,
        MeshSieveError::RelationConflict {
            kind: RelationConflictKind::PayloadAndOrientation,
            ..
        }
    ));
    let outs: Vec<_> = s.cone(1).collect();
    assert_eq!(outs, vec![(2, 10)]);
    let outs_o: Vec<_> = s.cone_o(1).collect();
    assert_eq!(outs_o, vec![(2, Sign(true))]);
}

#[test]
fn stack_add_rejects_conflicting_payload() {
    let mut st = InMemoryStack::<u32, u32, i32>::default();
    st.add_arrow(1, 100, 7).unwrap();
    let err = st.add_arrow(1, 100, 9).unwrap_err();
    assert!(matches!(
        err,
        MeshSieveError::RelationConflict {
            kind: RelationConflictKind::Payload,
            ..
        }
    ));
    let ups: Vec<_> = st.lift(1).collect();
    assert_eq!(ups, vec![(100, 7)]);
    let downs: Vec<_> = st.drop(100).collect();
    assert_eq!(downs, vec![(1, 7)]);
}