use doublets::data::Flow;
use doublets::decorators::DecoratorsExt;
use doublets::mem::Global;
use doublets::unit::Store;
use doublets::Doublets;
fn dump(links: &impl Doublets<u32>) -> Vec<(u32, u32, u32)> {
let mut all = Vec::new();
links.each_links(&[], &mut |link| {
all.push((link.index, link.source, link.target));
Flow::Continue
});
all.sort_unstable();
all
}
#[test]
fn update_into_an_existing_pair_rebases_usages_onto_the_survivor() {
let mut links = Store::<u32, _>::new(Global::new())
.unwrap()
.with_automatic_uniqueness_and_usages_resolution();
let one = links.create_link(1, 2).unwrap();
let two = links.create_link(2, one).unwrap();
assert_eq!(dump(&links), vec![(1, 1, 2), (2, 2, 1)]);
links.update(one, 2, 1).unwrap();
assert_eq!(dump(&links), vec![(two, 2, two)]);
}
#[test]
fn deleting_a_link_cascades_to_its_usages() {
let mut links = Store::<u32, _>::new(Global::new())
.unwrap()
.with_automatic_uniqueness_and_usages_resolution();
let one = links.create_link(1, 1).unwrap();
let two = links.create_link(2, 2).unwrap();
let usage = links.create_link(one, two).unwrap();
assert_eq!(dump(&links), vec![(1, 1, 1), (2, 2, 2), (usage, one, two)]);
links.delete(two).unwrap();
assert_eq!(dump(&links), vec![(one, 1, 1)]);
}