use data::Flow;
use doublets::{split, unit, Doublets, DoubletsExt, Error, Links};
use mem::Global;
#[test]
fn unit_count_links() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
assert_eq!(store.count(), 0);
store.create_point()?;
store.create_point()?;
store.create_point()?;
assert_eq!(store.count(), 3);
Ok(())
}
#[test]
fn split_count_links() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
assert_eq!(store.count(), 0);
store.create_point()?;
store.create_point()?;
assert_eq!(store.count(), 2);
Ok(())
}
#[test]
fn unit_found() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
assert!(store.found([a]));
assert!(!store.found([100]));
Ok(())
}
#[test]
fn unit_find() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let found = store.find([a]);
assert!(found.is_some());
assert_eq!(found.unwrap().index, a);
let not_found = store.find([100]);
assert!(not_found.is_none());
Ok(())
}
#[test]
fn unit_search() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
let found = store.search(a, b);
assert_eq!(found, Some(c));
let not_found = store.search(b, a);
assert!(not_found.is_none() || not_found != Some(c));
Ok(())
}
#[test]
fn unit_single() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let single = store.single([a]);
assert!(single.is_some());
assert_eq!(single.unwrap().index, a);
store.create_link(a, b)?;
store.create_link(b, b)?;
let any = Links::constants(&store).any;
let _multiple = store.single([any, any, b]);
Ok(())
}
#[test]
fn unit_get_or_create() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let link1 = store.get_or_create(a, b)?;
let link2 = store.get_or_create(a, b)?;
assert_eq!(link1, link2);
Ok(())
}
#[test]
fn unit_count_usages() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let usages = store.count_usages(a)?;
assert_eq!(usages, 0);
store.create_link(a, b)?;
let usages = store.count_usages(a)?;
assert_eq!(usages, 1);
Ok(())
}
#[test]
fn unit_usages() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let usages = store.usages(a)?;
assert!(usages.is_empty());
let c = store.create_link(a, b)?;
let usages = store.usages(a)?;
assert!(usages.contains(&c));
Ok(())
}
#[test]
fn unit_exist() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
assert!(store.exist(a));
assert!(!store.exist(100));
Ok(())
}
#[test]
fn unit_has_usages() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
assert!(!store.has_usages(a));
store.create_link(a, b)?;
assert!(store.has_usages(a));
Ok(())
}
#[test]
fn unit_delete_all() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
store.create_point()?;
store.create_point()?;
store.create_point()?;
assert_eq!(store.count(), 3);
store.delete_all()?;
assert_eq!(store.count(), 0);
Ok(())
}
#[test]
fn unit_delete_usages() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
assert!(store.has_usages(a));
store.delete_usages(a)?;
assert!(!store.has_usages(a));
Ok(())
}
#[test]
fn unit_create_point() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let point = store.create_point()?;
let link = store.get_link(point);
assert!(link.is_some());
let link = link.unwrap();
assert_eq!(link.index, link.source);
assert_eq!(link.source, link.target);
Ok(())
}
#[test]
fn unit_create_link() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
let link = store.get_link(c).unwrap();
assert_eq!(link.source, a);
assert_eq!(link.target, b);
Ok(())
}
#[test]
fn unit_rebase() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
store.rebase(a, b)?;
let link = store.get_link(c).unwrap();
assert_eq!(link.source, b);
Ok(())
}
#[test]
fn unit_rebase_and_delete() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
let initial_count = store.count();
store.rebase_and_delete(a, b)?;
assert!(store.get_link(a).is_none());
assert!(store.count() < initial_count);
Ok(())
}
#[test]
fn unit_try_get_link() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let link = store.try_get_link(a)?;
assert_eq!(link.index, a);
let result = store.try_get_link(100);
assert!(result.is_err());
Ok(())
}
#[test]
fn unit_iter() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let links: Vec<_> = store.iter().collect();
assert_eq!(links.len(), 2);
let indices: Vec<_> = links.iter().map(|l| l.index).collect();
assert!(indices.contains(&a));
assert!(indices.contains(&b));
Ok(())
}
#[test]
fn unit_each_iter() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
let any = Links::constants(&store).any;
let links: Vec<_> = store.each_iter([any, a, any]).collect();
assert!(!links.is_empty());
for link in &links {
assert_eq!(link.source, a);
}
Ok(())
}
#[test]
fn boxed_doublets() -> Result<(), Error<usize>> {
let store = unit::Store::<usize, _>::new(Global::new())?;
let mut boxed: Box<dyn Doublets<usize>> = Box::new(store);
let a = boxed.create_point()?;
let b = boxed.create_point()?;
assert_eq!(boxed.count(), 2);
boxed.create_link(a, b)?;
assert_eq!(boxed.count(), 3);
Ok(())
}
#[test]
fn split_found() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
assert!(store.found([a]));
assert!(!store.found([100]));
Ok(())
}
#[test]
fn split_get_or_create() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let link1 = store.get_or_create(a, b)?;
let link2 = store.get_or_create(a, b)?;
assert_eq!(link1, link2);
Ok(())
}
#[test]
fn split_delete_all() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
store.create_point()?;
store.create_point()?;
store.create_point()?;
assert_eq!(store.count(), 3);
store.delete_all()?;
assert_eq!(store.count(), 0);
Ok(())
}
#[test]
fn unit_each_by_with_flow() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
store.create_point()?;
store.create_point()?;
store.create_point()?;
let mut count = 0;
store.each(|_link| {
count += 1;
Flow::Continue
});
assert_eq!(count, 3);
Ok(())
}
#[test]
fn unit_each_by_with_break() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
store.create_point()?;
store.create_point()?;
store.create_point()?;
let mut count = 0;
store.each(|_link| {
count += 1;
if count >= 2 {
Flow::Break
} else {
Flow::Continue
}
});
assert_eq!(count, 2);
Ok(())
}
#[test]
fn unit_create_by_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let mut before_link = None;
let mut after_link = None;
store.create_by_with([], |before, after| {
before_link = Some(before);
after_link = Some(after);
Flow::Continue
})?;
assert!(before_link.is_some());
assert!(after_link.is_some());
Ok(())
}
#[test]
fn unit_update_by_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let mut before_link = None;
let mut after_link = None;
store.update_by_with([a], [a, a, b], |before, after| {
before_link = Some(before);
after_link = Some(after);
Flow::Continue
})?;
assert!(before_link.is_some());
assert!(after_link.is_some());
assert_eq!(after_link.unwrap().target, b);
Ok(())
}
#[test]
fn unit_delete_by_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let mut before_link = None;
let mut after_link = None;
store.delete_by_with([a], |before, after| {
before_link = Some(before);
after_link = Some(after);
Flow::Continue
})?;
assert!(before_link.is_some());
assert!(after_link.is_some());
assert!(store.get_link(a).is_none());
Ok(())
}
#[test]
fn unit_create_link_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let mut created_links = Vec::new();
store.create_link_with(a, b, |_before, after| {
created_links.push(after);
Flow::Continue
})?;
assert!(!created_links.is_empty());
Ok(())
}
#[test]
fn unit_delete_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let mut before_link = None;
store.delete_with(a, |before, _after| {
before_link = Some(before);
Flow::Continue
})?;
assert!(before_link.is_some());
assert_eq!(before_link.unwrap().index, a);
Ok(())
}
#[test]
fn unit_update_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let mut after_link = None;
store.update_with(a, a, b, |_before, after| {
after_link = Some(after);
Flow::Continue
})?;
assert!(after_link.is_some());
assert_eq!(after_link.unwrap().target, b);
Ok(())
}
#[test]
fn unit_delete_query_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_point()?;
store.create_link(a, b)?;
store.create_link(a, c)?;
let any = Links::constants(&store).any;
let initial_count = store.count();
let mut deleted_count = 0;
store.delete_query_with([any, a, any], |_before, _after| {
deleted_count += 1;
Flow::Continue
})?;
assert!(deleted_count > 0);
assert!(store.count() < initial_count);
Ok(())
}
#[test]
fn unit_delete_usages_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
let mut deleted_count = 0;
store.delete_usages_with(a, |_before, _after| {
deleted_count += 1;
Flow::Continue
})?;
assert!(deleted_count > 0);
assert!(!store.has_usages(a));
Ok(())
}
#[test]
fn unit_rebase_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
let mut updated_count = 0;
store.rebase_with(a, b, |_before, _after| {
updated_count += 1;
Flow::Continue
})?;
let link = store.get_link(c).unwrap();
assert_eq!(link.source, b);
Ok(())
}
#[test]
fn unit_rebase_same() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
store.rebase(a, a)?;
assert!(store.get_link(a).is_some());
Ok(())
}
#[test]
fn unit_rebase_and_delete_same() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let result = store.rebase_and_delete(a, a)?;
assert_eq!(result, a);
assert!(store.get_link(a).is_some());
Ok(())
}
#[test]
#[allow(deprecated)]
fn unit_search_or() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
let found = store.search_or(a, b, 0);
assert_eq!(found, c);
let not_found = store.search_or(b, a, 999);
assert_eq!(not_found, 999);
Ok(())
}
#[test]
fn unit_exist_external() -> Result<(), Error<usize>> {
let store = unit::Store::<usize, _>::new(Global::new())?;
let constants = Links::constants(&store);
let any = constants.any;
let _ = store.exist(any);
Ok(())
}
#[test]
fn unit_create_with() -> Result<(), Error<usize>> {
let mut store = unit::Store::<usize, _>::new(Global::new())?;
let mut created = None;
store.create_with(|_before, after| {
created = Some(after.index);
Flow::Continue
})?;
assert!(created.is_some());
assert!(store.get_link(created.unwrap()).is_some());
Ok(())
}
#[test]
fn split_create_by_with() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let mut created = false;
store.create_by_with([], |_before, _after| {
created = true;
Flow::Continue
})?;
assert!(created);
Ok(())
}
#[test]
fn split_update_with() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let mut updated = false;
store.update_with(a, a, b, |_before, _after| {
updated = true;
Flow::Continue
})?;
assert!(updated);
Ok(())
}
#[test]
fn split_delete_with() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let mut deleted = false;
store.delete_with(a, |_before, _after| {
deleted = true;
Flow::Continue
})?;
assert!(deleted);
assert!(store.get_link(a).is_none());
Ok(())
}
#[test]
fn split_rebase() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
store.rebase(a, b)?;
let link = store.get_link(c).unwrap();
assert_eq!(link.source, b);
Ok(())
}
#[test]
fn split_rebase_and_delete() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
let initial_count = store.count();
store.rebase_and_delete(a, b)?;
assert!(store.get_link(a).is_none());
assert!(store.count() < initial_count);
Ok(())
}
#[test]
fn split_count_usages() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
assert_eq!(store.count_usages(a)?, 0);
store.create_link(a, b)?;
assert_eq!(store.count_usages(a)?, 1);
Ok(())
}
#[test]
fn split_usages() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
let usages = store.usages(a)?;
assert!(usages.contains(&c));
Ok(())
}
#[test]
fn split_exist() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
assert!(store.exist(a));
assert!(!store.exist(100));
Ok(())
}
#[test]
fn split_has_usages() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
assert!(!store.has_usages(a));
store.create_link(a, b)?;
assert!(store.has_usages(a));
Ok(())
}
#[test]
fn split_search() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let c = store.create_link(a, b)?;
assert_eq!(store.search(a, b), Some(c));
assert_eq!(store.search(b, a), None);
Ok(())
}
#[test]
fn split_single() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let single = store.single([a]);
assert!(single.is_some());
assert_eq!(single.unwrap().index, a);
Ok(())
}
#[test]
fn split_find() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let found = store.find([a]);
assert!(found.is_some());
let not_found = store.find([100]);
assert!(not_found.is_none());
Ok(())
}
#[test]
fn split_try_get_link() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
assert!(store.try_get_link(a).is_ok());
assert!(store.try_get_link(100).is_err());
Ok(())
}
#[test]
fn split_delete_usages() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
assert!(store.has_usages(a));
store.delete_usages(a)?;
assert!(!store.has_usages(a));
Ok(())
}
#[test]
fn split_iter() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
let links: Vec<_> = store.iter().collect();
assert_eq!(links.len(), 2);
let indices: Vec<_> = links.iter().map(|l| l.index).collect();
assert!(indices.contains(&a));
assert!(indices.contains(&b));
Ok(())
}
#[test]
fn split_each_iter() -> Result<(), Error<usize>> {
let mut store = split::Store::<usize, _, _>::new(Global::new(), Global::new())?;
let a = store.create_point()?;
let b = store.create_point()?;
store.create_link(a, b)?;
let any = Links::constants(&store).any;
let links: Vec<_> = store.each_iter([any, a, any]).collect();
assert!(!links.is_empty());
for link in &links {
assert_eq!(link.source, a);
}
Ok(())
}