use set_theory::models::CustomSet;
use set_theory::operations::SetOperations;
#[test]
fn test_create_empty_set() {
let set = CustomSet::<i32>::empty();
assert_eq!(set.cardinality(), 0, "Empty set should have cardinality 0");
assert!(
set.is_empty(),
"Empty set should return true for is_empty()"
);
assert_eq!(format!("{}", set), "∅", "Empty set should display as ∅");
}
#[test]
fn test_create_set_with_elements() {
let set = CustomSet::from(vec![1, 2, 3, 4]);
assert_eq!(set.cardinality(), 4, "Set should have 4 elements");
assert!(set.contains(&1), "Set should contain 1");
assert!(set.contains(&2), "Set should contain 2");
assert!(set.contains(&3), "Set should contain 3");
assert!(set.contains(&4), "Set should contain 4");
assert!(!set.contains(&5), "Set should not contain 5");
}
#[test]
fn test_duplicate_elements_removed() {
let set = CustomSet::from(vec![1, 2, 2, 3, 3, 3]);
assert_eq!(
set.cardinality(),
3,
"Duplicate elements should be removed, cardinality should be 3"
);
assert!(set.contains(&1), "Set should contain 1");
assert!(set.contains(&2), "Set should contain 2");
assert!(set.contains(&3), "Set should contain 3");
}
#[test]
fn test_order_does_not_matter() {
let set1 = CustomSet::from(vec![1, 2, 3]);
let set2 = CustomSet::from(vec![3, 2, 1]);
let set3 = CustomSet::from(vec![2, 1, 3]);
assert!(
set1.equals(&set2),
"Sets with same elements should be equal regardless of order"
);
assert!(
set1.equals(&set3),
"Sets with same elements should be equal regardless of order"
);
assert!(
set2.equals(&set3),
"Sets with same elements should be equal regardless of order"
);
}
#[test]
fn test_subset_operations() {
let a = CustomSet::from(vec![1, 2, 3]);
let b = CustomSet::from(vec![1, 2, 3, 4, 5]);
assert!(a.is_subset_of(&b), "A should be a subset of B");
assert!(!b.is_subset_of(&a), "B should not be a subset of A");
assert!(
a.is_proper_subset_of(&b),
"A should be a proper subset of B"
);
assert!(
!b.is_proper_subset_of(&a),
"B should not be a proper subset of A"
);
}
#[test]
fn test_empty_set_is_subset() {
let empty = CustomSet::<i32>::empty();
let any = CustomSet::from(vec![1, 2, 3]);
assert!(
empty.is_subset_of(&any),
"Empty set should be subset of any set"
);
assert!(
empty.is_subset_of(&empty),
"Empty set should be subset of itself"
);
assert!(
!empty.is_proper_subset_of(&empty),
"Empty set should not be proper subset of itself"
);
}
#[test]
fn test_intersection() {
let a = CustomSet::from(vec![2, 4, 6, 8, 10]);
let b = CustomSet::from(vec![4, 10, 14, 18]);
let result = a.intersection(&b);
assert_eq!(
result.cardinality(),
2,
"Intersection should have 2 elements"
);
assert!(result.contains(&4), "Intersection should contain 4");
assert!(result.contains(&10), "Intersection should contain 10");
assert!(!result.contains(&2), "Intersection should not contain 2");
assert!(!result.contains(&14), "Intersection should not contain 14");
}
#[test]
fn test_union() {
let a = CustomSet::from(vec![2, 5, 8]);
let b = CustomSet::from(vec![7, 5, 22]);
let result = a.union(&b);
assert_eq!(
result.cardinality(),
5,
"Union should have 5 unique elements"
);
assert!(result.contains(&2), "Union should contain 2");
assert!(result.contains(&5), "Union should contain 5");
assert!(result.contains(&7), "Union should contain 7");
assert!(result.contains(&8), "Union should contain 8");
assert!(result.contains(&22), "Union should contain 22");
}
#[test]
fn test_complement() {
let universal = CustomSet::from(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
let a = CustomSet::from(vec![1, 3, 7, 9]);
let result = a.complement(&universal);
assert_eq!(result.cardinality(), 5, "Complement should have 5 elements");
assert!(result.contains(&2), "Complement should contain 2");
assert!(result.contains(&4), "Complement should contain 4");
assert!(result.contains(&6), "Complement should contain 6");
assert!(result.contains(&8), "Complement should contain 8");
assert!(!result.contains(&1), "Complement should not contain 1");
}
#[test]
fn test_difference() {
let a = CustomSet::from(vec![1, 2, 3, 4, 5]);
let b = CustomSet::from(vec![2, 4]);
let result = a.difference(&b);
assert_eq!(result.cardinality(), 3, "Difference should have 3 elements");
assert!(result.contains(&1), "Difference should contain 1");
assert!(result.contains(&3), "Difference should contain 3");
assert!(result.contains(&5), "Difference should contain 5");
assert!(!result.contains(&2), "Difference should not contain 2");
assert!(!result.contains(&4), "Difference should not contain 4");
}
#[test]
fn test_symmetric_difference() {
let a = CustomSet::from(vec![2, 4, 6]);
let b = CustomSet::from(vec![2, 3, 5]);
let result = a.symmetric_difference(&b);
assert_eq!(
result.cardinality(),
4,
"Symmetric difference should have 4 elements"
);
assert!(result.contains(&3), "Should contain 3");
assert!(result.contains(&4), "Should contain 4");
assert!(result.contains(&5), "Should contain 5");
assert!(result.contains(&6), "Should contain 6");
assert!(!result.contains(&2), "Should not contain 2 (in both sets)");
}
#[test]
fn test_power_set() {
let a = CustomSet::from(vec![1, 2]);
let power_set: Vec<_> = a.power_set().collect();
assert_eq!(power_set.len(), 4, "Power set should have 2^2 = 4 subsets");
assert!(
power_set.iter().any(|s| s.is_empty()),
"Power set should contain empty set"
);
assert!(
power_set.iter().any(|s| s.equals(&a)),
"Power set should contain original set"
);
assert!(
power_set
.iter()
.any(|s| s.cardinality() == 1 && s.contains(&1)),
"Power set should contain {{1}}"
);
assert!(
power_set
.iter()
.any(|s| s.cardinality() == 1 && s.contains(&2)),
"Power set should contain {{2}}"
);
}
#[test]
fn test_power_set_empty() {
let empty = CustomSet::<i32>::empty();
let power_set: Vec<_> = empty.power_set().collect();
assert_eq!(
power_set.len(),
1,
"Power set of empty set should have 2^0 = 1 subset"
);
assert!(
power_set[0].is_empty(),
"The only subset should be the empty set"
);
}
#[test]
fn test_from_predicate() {
let evens = CustomSet::from_predicate(0..10, |x| x % 2 == 0);
assert_eq!(
evens.cardinality(),
5,
"Should have 5 even numbers from 0-9"
);
assert!(evens.contains(&0), "Should contain 0");
assert!(evens.contains(&2), "Should contain 2");
assert!(evens.contains(&4), "Should contain 4");
assert!(evens.contains(&6), "Should contain 6");
assert!(evens.contains(&8), "Should contain 8");
assert!(!evens.contains(&1), "Should not contain 1");
assert!(!evens.contains(&3), "Should not contain 3");
}
#[test]
fn test_disjoint() {
let a = CustomSet::from(vec![1, 2, 3]);
let b = CustomSet::from(vec![4, 5, 6]);
let c = CustomSet::from(vec![3, 4, 5]);
assert!(a.is_disjoint_from(&b), "A and B should be disjoint");
assert!(
!a.is_disjoint_from(&c),
"A and C should not be disjoint (share 3)"
);
assert!(
!b.is_disjoint_from(&c),
"B and C should not be disjoint (share 4, 5)"
);
}
#[test]
fn test_add_remove() {
let mut set = CustomSet::from(vec![1, 2]);
assert!(set.add(3), "Add should return true for new element");
assert_eq!(set.cardinality(), 3, "Cardinality should increase");
assert!(!set.add(3), "Add should return false for existing element");
assert_eq!(set.cardinality(), 3, "Cardinality should not change");
assert!(
set.remove(&2),
"Remove should return true for existing element"
);
assert_eq!(set.cardinality(), 2, "Cardinality should decrease");
assert!(
!set.remove(&2),
"Remove should return false for non-existing element"
);
assert_eq!(set.cardinality(), 2, "Cardinality should not change");
}
#[test]
fn test_clear() {
let mut set = CustomSet::from(vec![1, 2, 3]);
set.clear();
assert!(set.is_empty(), "Set should be empty after clear");
assert_eq!(set.cardinality(), 0, "Cardinality should be 0 after clear");
}
#[test]
fn test_iteration() {
let set = CustomSet::from(vec![1, 2, 3, 4, 5]);
let mut count = 0;
let mut sum = 0;
for element in set.iter() {
count += 1;
sum += element;
}
assert_eq!(count, 5, "Should iterate over all 5 elements");
assert_eq!(sum, 15, "Sum should be 1+2+3+4+5 = 15");
}
#[test]
fn test_display() {
let set = CustomSet::from(vec![1, 2, 3]);
let display = format!("{}", set);
assert!(display.starts_with("{"), "Display should start with {{");
assert!(display.ends_with("}"), "Display should end with }}");
assert!(display.contains("1"), "Display should contain 1");
assert!(display.contains("2"), "Display should contain 2");
assert!(display.contains("3"), "Display should contain 3");
let empty = CustomSet::<i32>::empty();
assert_eq!(format!("{}", empty), "∅", "Empty set should display as ∅");
}
#[test]
fn test_equality() {
let a = CustomSet::from(vec![1, 2, 3]);
let b = CustomSet::from(vec![3, 2, 1]);
let c = CustomSet::from(vec![1, 2, 4]);
assert_eq!(a, b, "Sets with same elements should be equal");
assert_ne!(a, c, "Sets with different elements should not be equal");
}
#[test]
fn test_set_with_itself() {
let a = CustomSet::from(vec![1, 2, 3]);
assert_eq!(SetOperations::union(&a, &a), a, "A ∪ A should equal A");
assert_eq!(
SetOperations::intersection(&a, &a),
a,
"A ∩ A should equal A"
);
assert!(
SetOperations::difference(&a, &a).is_empty(),
"A - A should be empty"
);
assert!(
SetOperations::symmetric_difference(&a, &a).is_empty(),
"A ⊕ A should be empty"
);
}
#[test]
fn test_nested_sets() {
let inner_set1 = CustomSet::from(vec!['a', 'b', 'c']);
let inner_set1_reordered = CustomSet::from(vec!['c', 'b', 'a']);
let inner_set2 = CustomSet::from(vec!['a', 'c']);
assert_eq!(
inner_set1, inner_set1_reordered,
"Inner sets with same elements should be equal regardless of order"
);
let outer_set = CustomSet::from(vec![inner_set1.clone(), inner_set2.clone()]);
assert_eq!(
outer_set.cardinality(),
2,
"Outer set should have 2 inner sets as elements"
);
assert!(
outer_set.contains(&inner_set1),
"Outer set should contain inner_set1"
);
assert!(
outer_set.contains(&inner_set2),
"Outer set should contain inner_set2"
);
let outer_set_reordered =
CustomSet::from(vec![inner_set2.clone(), inner_set1_reordered.clone()]);
assert_eq!(
outer_set, outer_set_reordered,
"Outer sets should be equal regardless of element order"
);
}
#[test]
fn test_superset_operations() {
let a = CustomSet::from(vec![1, 2, 3, 4, 5]);
let b = CustomSet::from(vec![1, 2, 3]);
assert!(a.is_superset_of(&b), "A should be a superset of B");
assert!(!b.is_superset_of(&a), "B should not be a superset of A");
assert!(
a.is_proper_superset_of(&b),
"A should be a proper superset of B"
);
assert!(
!b.is_proper_superset_of(&a),
"B should not be a proper superset of A"
);
}
#[test]
fn test_equivalence() {
let a = CustomSet::from(vec![1, 2, 3, 4]);
let b = CustomSet::from(vec!['a', 'b', 'c', 'd']);
let c = CustomSet::from(vec![1, 2, 3]);
assert!(
a.is_equivalent_to(&b),
"Sets with same cardinality should be equivalent"
);
assert!(
!a.is_equivalent_to(&c),
"Sets with different cardinality should not be equivalent"
);
}
#[test]
fn test_empty_set_operations() {
let empty = CustomSet::<i32>::empty();
let non_empty = CustomSet::from(vec![1, 2, 3]);
assert!(SetOperations::union(&empty, &empty).is_empty(), "∅ ∪ ∅ = ∅");
assert!(
SetOperations::intersection(&empty, &non_empty).is_empty(),
"∅ ∩ A = ∅"
);
assert_eq!(
SetOperations::difference(&non_empty, &empty),
non_empty,
"A - ∅ = A"
);
assert!(
SetOperations::difference(&empty, &non_empty).is_empty(),
"∅ - A = ∅"
);
}