#[cfg(test)]
mod tests {
use arc::Arc;
use fst_impls::VectorFst;
use fst_traits::{
ArcIterator, CoreFst, ExpandedFst, FinalStatesIterator, MutableArcIterator, MutableFst,
StateIterator,
};
use rand::{rngs::StdRng, Rng, SeedableRng};
use semirings::{ProbabilityWeight, Semiring};
#[test]
fn test_small_fst() {
let mut fst = VectorFst::new();
let s1 = fst.add_state();
let s2 = fst.add_state();
fst.set_start(&s1).unwrap();
let arc_1 = Arc::new(3, 5, ProbabilityWeight::new(10.0), s2);
fst.add_arc(&s1, arc_1.clone()).unwrap();
assert_eq!(fst.num_arcs(), 1);
let arc_2 = Arc::new(5, 7, ProbabilityWeight::new(18.0), s2);
fst.add_arc(&s1, arc_2.clone()).unwrap();
assert_eq!(fst.num_arcs(), 2);
assert_eq!(fst.arcs_iter(&s1).unwrap().count(), 2);
let mut it_s1 = fst.arcs_iter(&s1).unwrap();
let arc = it_s1.next().unwrap();
assert_eq!(arc_1, *arc);
let arc = it_s1.next().unwrap();
assert_eq!(arc_2, *arc);
let arc = it_s1.next();
assert!(arc.is_none());
let mut it_s2 = fst.arcs_iter(&s2).unwrap();
let d = it_s2.next();
assert!(d.is_none());
}
#[test]
fn test_mutable_iter_arcs_small() {
let mut fst = VectorFst::new();
let s1 = fst.add_state();
let s2 = fst.add_state();
fst.set_start(&s1).unwrap();
let arc_1 = Arc::new(3, 5, ProbabilityWeight::new(10.0), s2);
fst.add_arc(&s1, arc_1.clone()).unwrap();
let arc_2 = Arc::new(5, 7, ProbabilityWeight::new(18.0), s2);
fst.add_arc(&s1, arc_2.clone()).unwrap();
let new_arc_1 = Arc::new(15, 29, ProbabilityWeight::new(33.0), s2 + 55);
fst.arcs_iter_mut(&s1)
.unwrap()
.next()
.unwrap()
.set_value(&new_arc_1);
let mut it_s1 = fst.arcs_iter(&s1).unwrap();
let arc = it_s1.next().unwrap();
assert_eq!(new_arc_1, *arc);
let arc = it_s1.next().unwrap();
assert_eq!(arc_2, *arc);
assert!(it_s1.next().is_none());
}
#[test]
fn test_start_states() {
let mut fst = VectorFst::<ProbabilityWeight>::new();
let n_states = 1000;
let states: Vec<_> = (0..n_states).map(|_| fst.add_state()).collect();
assert_eq!(fst.start(), None);
fst.set_start(&states[18]).unwrap();
assert_eq!(fst.start(), Some(states[18]));
fst.set_start(&states[32]).unwrap();
assert_eq!(fst.start(), Some(states[32]));
}
#[test]
fn test_only_final_states() {
let mut fst = VectorFst::<ProbabilityWeight>::new();
let n_states = 1000;
let states: Vec<_> = (0..n_states).map(|_| fst.add_state()).collect();
assert_eq!(fst.final_states_iter().count(), 0);
states
.iter()
.for_each(|v| fst.set_final(&v, ProbabilityWeight::one()).unwrap());
assert_eq!(fst.final_states_iter().count(), n_states);
}
#[test]
fn test_final_weight() {
let mut fst = VectorFst::<ProbabilityWeight>::new();
let n_states = 1000;
let n_final_states = 300;
let mut states: Vec<_> = (0..n_states).map(|_| fst.add_state()).collect();
assert!(
fst.states_iter()
.map(|state_id| fst.final_weight(&state_id))
.all(|v| v.is_none())
);
let mut rg = StdRng::from_seed([53; 32]);
rg.shuffle(&mut states);
let final_states: Vec<_> = states.into_iter().take(n_final_states).collect();
final_states.iter().enumerate().for_each(|(idx, state_id)| {
fst.set_final(state_id, ProbabilityWeight::new(idx as f32))
.unwrap()
});
assert!(final_states.iter().all(|state_id| fst.is_final(state_id)));
assert!(
final_states
.iter()
.enumerate()
.all(|(idx, state_id)| fst.final_weight(state_id)
== Some(ProbabilityWeight::new(idx as f32)))
);
}
#[test]
fn test_del_state_arcs() {
let mut fst = VectorFst::<ProbabilityWeight>::new();
let s1 = fst.add_state();
let s2 = fst.add_state();
fst.add_arc(&s1, Arc::new(0, 0, ProbabilityWeight::one(), s2))
.unwrap();
fst.add_arc(&s2, Arc::new(0, 0, ProbabilityWeight::one(), s1))
.unwrap();
fst.add_arc(&s2, Arc::new(0, 0, ProbabilityWeight::one(), s2))
.unwrap();
assert_eq!(fst.num_arcs(), 3);
assert_eq!(fst.arcs_iter(&s1).unwrap().count(), 1);
assert_eq!(fst.arcs_iter(&s2).unwrap().count(), 2);
fst.del_state(&s1).unwrap();
assert_eq!(fst.num_arcs(), 1);
let only_state = fst.states_iter().next().unwrap();
assert_eq!(fst.arcs_iter(&only_state).unwrap().count(), 1);
}
#[test]
fn test_deleting_twice_same_state() {
let mut fst1 = VectorFst::<ProbabilityWeight>::new();
let s = fst1.add_state();
let mut fst2 = fst1.clone();
assert!(fst1.del_state(&s).is_ok());
assert!(fst1.del_state(&s).is_err());
let states_to_remove = vec![s, s];
assert!(fst2.del_states(states_to_remove.into_iter()).is_err());
}
#[test]
fn test_del_multiple_states() {
let mut fst1 = VectorFst::<ProbabilityWeight>::new();
let s1 = fst1.add_state();
let s2 = fst1.add_state();
let mut fst2 = fst1.clone();
assert!(fst1.del_state(&s1).is_ok());
assert!(fst1.del_state(&s2).is_err());
let states_to_remove = vec![s1, s2];
assert!(fst2.del_states(states_to_remove.into_iter()).is_ok());
}
#[test]
fn test_del_states_big() {
let n_states = 1000;
let n_states_to_delete = 300;
let mut fst = VectorFst::<ProbabilityWeight>::new();
let mut states: Vec<_> = (0..n_states).map(|_| fst.add_state()).collect();
assert_eq!(fst.num_states(), n_states);
let mut rg = StdRng::from_seed([53; 32]);
rg.shuffle(&mut states);
let states_to_delete: Vec<_> = states.into_iter().take(n_states_to_delete).collect();
fst.del_states(states_to_delete).unwrap();
assert_eq!(fst.num_states(), n_states - n_states_to_delete);
}
}