use crate::iterators::{AbstractFiber, AbstractFiberIndex, Fiber, FiberClass, FiberIndex};
use crate::structure::representation::RepName;
use crate::structure::TensorStructure;
use crate::structure::{representation::Euclidean, OrderedStructure};
#[test]
fn test_fiber_creation() {
let rep = Euclidean {};
let structure: OrderedStructure<Euclidean> = OrderedStructure::new(vec![
rep.new_slot(3, 0),
rep.new_slot(4, 0),
rep.new_slot(5, 0),
])
.structure;
let filter = [true, false, true];
let fiber = Fiber::from_filter(&filter, &structure);
assert_eq!(fiber.bitvec().len(), filter.len());
for (i, &is_free) in filter.iter().enumerate() {
assert_eq!(fiber[i].is_free(), is_free);
}
let flat_idx = 5.into(); let fiber_from_flat = Fiber::from_flat(flat_idx, &structure);
for i in 0..structure.order() {
assert!(fiber_from_flat[i].is_fixed());
}
let zeros_fiber = Fiber::zeros(&structure);
for i in 0..structure.order() {
assert!(zeros_fiber[i].is_fixed());
if let FiberIndex::Fixed(val) = zeros_fiber[i] {
assert_eq!(val, 0);
}
}
}
#[test]
fn test_fiber_modification() {
let rep = Euclidean {};
let structure: OrderedStructure<Euclidean> = OrderedStructure::new(vec![
rep.new_slot(3, 0),
rep.new_slot(4, 0),
rep.new_slot(5, 0),
])
.structure;
let mut fiber = Fiber::zeros(&structure);
fiber.free(1);
assert!(fiber[1].is_free());
fiber.fix(0, 2);
if let FiberIndex::Fixed(val) = fiber[0] {
assert_eq!(val, 2);
} else {
panic!("Expected index 0 to be fixed");
}
let single_idx = fiber.is_single();
if let FiberIndex::Fixed(val) = single_idx {
assert_eq!(val, 1); } else {
panic!("Expected is_single() to identify index 1 as the only free index");
}
fiber.free(2);
assert!(fiber[2].is_free());
}
#[test]
fn test_fiber_class_conversion() {
let rep = Euclidean {};
let structure: OrderedStructure<Euclidean> = OrderedStructure::new(vec![
rep.new_slot(3, 0),
rep.new_slot(4, 0),
rep.new_slot(5, 0),
])
.structure;
let filter = [true, false, true];
let fiber = Fiber::from_filter(&filter, &structure);
let fiber_class: FiberClass<_> = fiber.clone().into();
let fiber_bits = fiber.bitvec();
let class_bits = fiber_class.bitvec();
assert_eq!(fiber_bits.len(), class_bits.len());
for i in 0..fiber_bits.len() {
assert_eq!(fiber_bits[i], !class_bits[i]);
}
let fiber_back: Fiber<_> = fiber_class.into();
let back_bits = fiber_back.bitvec();
assert_eq!(fiber_bits, back_bits);
}
#[test]
fn test_fiber_display() {
let rep = Euclidean {};
let structure: OrderedStructure<Euclidean> =
OrderedStructure::new(vec![rep.new_slot(3, 0), rep.new_slot(4, 0)]).structure;
let mut fiber = Fiber::zeros(&structure);
fiber.fix(0, 2);
fiber.free(1);
let display = format!("{}", fiber);
assert_eq!(display.trim(), "2 :");
}
#[test]
fn test_single_fiber_detection() {
let rep = Euclidean {};
let structure: OrderedStructure<Euclidean> = OrderedStructure::new(vec![
rep.new_slot(3, 0),
rep.new_slot(4, 0),
rep.new_slot(5, 0),
])
.structure;
let mut zero_free = Fiber::zeros(&structure);
let mut one_free = Fiber::zeros(&structure);
let mut two_free = Fiber::zeros(&structure);
one_free.free(1);
two_free.free(0);
two_free.free(2);
assert!(matches!(zero_free.is_single(), FiberIndex::Free));
if let FiberIndex::Fixed(val) = one_free.is_single() {
assert_eq!(val, 1);
} else {
panic!("Expected is_single() to identify index 1");
}
assert!(matches!(two_free.is_single(), FiberIndex::Free));
}