relmath-rs 0.7.0

Relation-first mathematics and scientific computing in Rust.
Documentation
//! Integration tests for the first shared G6 relation-view boundary.

use relmath::{BinaryRelation, NaryRelation, NaryRelationError, RelationView, UnaryRelation};

fn tuple_count<R: RelationView>(relation: &R) -> usize {
    relation.len()
}

fn relation_is_empty<R: RelationView>(relation: &R) -> bool {
    relation.is_empty()
}

#[test]
fn relation_view_counts_exact_relations_generically() -> Result<(), NaryRelationError> {
    let unary = UnaryRelation::from_values([3, 1, 2]);
    let binary = BinaryRelation::from_pairs([("Ada", "Bob"), ("Bob", "Cara")]);
    let nary =
        NaryRelation::from_rows(["student", "course"], [["Ada", "Math"], ["Bob", "Physics"]])?;

    assert_eq!(tuple_count(&unary), 3);
    assert_eq!(tuple_count(&binary), 2);
    assert_eq!(tuple_count(&nary), 2);

    Ok(())
}

#[test]
fn relation_view_preserves_deterministic_tuple_order() -> Result<(), NaryRelationError> {
    let unary = UnaryRelation::from_values([3, 1, 2]);
    let binary = BinaryRelation::from_pairs([("Bob", "Cara"), ("Ada", "Bob")]);
    let nary =
        NaryRelation::from_rows(["student", "course"], [["Bob", "Physics"], ["Ada", "Math"]])?;

    assert_eq!(unary.tuples().copied().collect::<Vec<_>>(), vec![1, 2, 3]);
    assert_eq!(
        binary.tuples().copied().collect::<Vec<_>>(),
        vec![("Ada", "Bob"), ("Bob", "Cara")]
    );
    assert_eq!(
        nary.tuples().map(|row| row.to_vec()).collect::<Vec<_>>(),
        vec![vec!["Ada", "Math"], vec!["Bob", "Physics"]]
    );

    Ok(())
}

#[test]
fn relation_view_reports_empty_relations_generically() -> Result<(), NaryRelationError> {
    let unary = UnaryRelation::<i32>::new();
    let binary = BinaryRelation::<i32, i32>::new();
    let nary = NaryRelation::<i32>::new(["value"])?;

    assert!(relation_is_empty(&unary));
    assert!(relation_is_empty(&binary));
    assert!(relation_is_empty(&nary));

    assert_eq!(unary.tuples().count(), 0);
    assert_eq!(binary.tuples().count(), 0);
    assert_eq!(nary.tuples().count(), 0);

    Ok(())
}