use facet::Facet;
use facet_diff::FacetDiff;
fn create_nested_tree(depth: usize, width: usize) -> Tree {
if depth == 0 {
Tree {
value: 0,
children: vec![],
}
} else {
Tree {
value: depth,
children: (0..width)
.map(|_| create_nested_tree(depth - 1, width))
.collect(),
}
}
}
#[derive(Facet, Clone)]
struct Tree {
value: usize,
children: Vec<Tree>,
}
#[test]
fn test_shallow_wide_tree() {
let a = create_nested_tree(2, 5);
let b = create_nested_tree(2, 5);
let _diff = a.diff(&b);
}
#[test]
fn test_moderate_depth() {
let a = create_nested_tree(4, 2);
let b = create_nested_tree(4, 2);
let _diff = a.diff(&b);
}
#[test]
#[ignore] fn test_depth_5() {
let a = create_nested_tree(5, 3);
let b = create_nested_tree(5, 3);
let _diff = a.diff(&b);
}
#[test]
#[ignore] fn test_deep_nesting() {
let a = create_nested_tree(10, 5);
let b = create_nested_tree(10, 5);
let _diff = a.diff(&b);
}
#[test]
#[ignore] fn test_pathological_diff() {
let a = create_nested_tree(8, 4);
let mut b = create_nested_tree(8, 4);
fn mutate_tree(tree: &mut Tree) {
tree.value = tree.value.wrapping_add(1000);
for child in &mut tree.children {
mutate_tree(child);
}
}
mutate_tree(&mut b);
let _diff = a.diff(&b);
}
#[test]
#[cfg_attr(miri, ignore)]
fn test_single_difference_in_deep_tree() {
let a = create_nested_tree(8, 3);
let mut b = a.clone();
if let Some(level1) = b.children.get_mut(0)
&& let Some(level2) = level1.children.get_mut(0)
&& let Some(level3) = level2.children.get_mut(0)
{
level3.value = 999;
}
let _diff = a.diff(&b);
}
#[test]
fn test_vec_of_different_lengths() {
let a = Tree {
value: 1,
children: (0..100)
.map(|i| Tree {
value: i,
children: vec![],
})
.collect(),
};
let b = Tree {
value: 1,
children: (0..200)
.map(|i| Tree {
value: i,
children: vec![],
})
.collect(),
};
let _diff = a.diff(&b);
}