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(())
}