use shadow_counted::IntoShadowCounted;
#[test]
fn test_nested_abort_doesnt_affect_parent() {
let mut parent = vec![1, 2, 3].into_iter().shadow_counted();
parent.next();
assert_eq!(parent.counter(), 1);
{
let mut nested = vec![10, 20, 30]
.into_iter()
.nested_shadow_counted(&mut parent);
nested.next();
nested.next();
nested.next();
assert_eq!(nested.counter(), 4);
}
assert_eq!(parent.counter(), 1);
parent.next();
assert_eq!(parent.counter(), 2);
}
#[test]
fn test_mixed_commit_and_abort_sequential() {
let mut parent = vec![1, 2, 3, 4, 5].into_iter().shadow_counted();
parent.next();
assert_eq!(parent.counter(), 1);
{
let mut nested1 = vec![10, 11].into_iter().nested_shadow_counted(&mut parent);
nested1.next();
nested1.next();
assert_eq!(nested1.counter(), 3);
nested1.commit().unwrap();
}
assert_eq!(parent.counter(), 3);
{
let mut nested2 = vec![20, 21, 22]
.into_iter()
.nested_shadow_counted(&mut parent);
nested2.next();
nested2.next();
nested2.next();
assert_eq!(nested2.counter(), 6);
}
assert_eq!(parent.counter(), 3);
{
let mut nested3 = vec![30].into_iter().nested_shadow_counted(&mut parent);
nested3.next();
assert_eq!(nested3.counter(), 4);
nested3.commit().unwrap();
}
assert_eq!(parent.counter(), 4);
parent.next();
assert_eq!(parent.counter(), 5);
}
#[test]
fn test_deep_nesting_with_middle_abort() {
let mut level1 = vec![1].into_iter().shadow_counted();
level1.next();
assert_eq!(level1.counter(), 1);
{
let mut level2 = vec![2, 3].into_iter().nested_shadow_counted(&mut level1);
level2.next();
assert_eq!(level2.counter(), 2);
{
let mut level3 = vec![4].into_iter().nested_shadow_counted(&mut level2);
level3.next();
assert_eq!(level3.counter(), 3);
level3.commit().unwrap();
}
assert_eq!(level2.counter(), 3);
level2.next(); assert_eq!(level2.counter(), 4);
}
assert_eq!(level1.counter(), 1);
}
#[test]
fn test_deep_nesting_with_bottom_abort() {
let mut level1 = vec![1].into_iter().shadow_counted();
level1.next();
assert_eq!(level1.counter(), 1);
{
let mut level2 = vec![2].into_iter().nested_shadow_counted(&mut level1);
level2.next();
assert_eq!(level2.counter(), 2);
{
let mut level3 = vec![3, 4, 5].into_iter().nested_shadow_counted(&mut level2);
level3.next();
level3.next();
level3.next();
assert_eq!(level3.counter(), 5);
}
assert_eq!(level2.counter(), 2);
level2.commit().unwrap();
}
assert_eq!(level1.counter(), 2);
}
#[test]
fn test_complex_multi_branch_scenario() {
let mut root = vec![1, 2, 3, 4, 5, 6, 7, 8].into_iter().shadow_counted();
root.next(); assert_eq!(root.counter(), 1);
{
let mut branch1 = vec![10, 11].into_iter().nested_shadow_counted(&mut root);
branch1.next();
branch1.next();
assert_eq!(branch1.counter(), 3);
branch1.commit().unwrap();
}
assert_eq!(root.counter(), 3);
root.next(); assert_eq!(root.counter(), 4);
{
let mut branch2 = vec![20, 21, 22]
.into_iter()
.nested_shadow_counted(&mut root);
branch2.next();
branch2.next();
assert_eq!(branch2.counter(), 6);
}
assert_eq!(root.counter(), 4);
{
let mut branch3 = vec![30].into_iter().nested_shadow_counted(&mut root);
branch3.next();
assert_eq!(branch3.counter(), 5);
{
let mut nested3a = vec![40, 41].into_iter().nested_shadow_counted(&mut branch3);
nested3a.next();
assert_eq!(nested3a.counter(), 6);
nested3a.commit().unwrap();
}
assert_eq!(branch3.counter(), 6);
{
let mut nested3b = vec![50, 51, 52]
.into_iter()
.nested_shadow_counted(&mut branch3);
nested3b.next();
nested3b.next();
nested3b.next();
assert_eq!(nested3b.counter(), 9);
}
assert_eq!(branch3.counter(), 6);
branch3.commit().unwrap();
}
assert_eq!(root.counter(), 6);
root.next(); root.next(); assert_eq!(root.counter(), 8);
}
#[test]
fn test_committed_sibling_survives_parent_abort() {
let mut level1 = vec![1].into_iter().shadow_counted();
level1.next();
assert_eq!(level1.counter(), 1);
{
let mut level2 = vec![2].into_iter().nested_shadow_counted(&mut level1);
level2.next();
assert_eq!(level2.counter(), 2);
{
let mut child1 = vec![10].into_iter().nested_shadow_counted(&mut level2);
child1.next();
assert_eq!(child1.counter(), 3);
child1.commit().unwrap();
}
assert_eq!(level2.counter(), 3);
{
let mut child2 = vec![20, 21].into_iter().nested_shadow_counted(&mut level2);
child2.next();
child2.next();
assert_eq!(child2.counter(), 5);
}
assert_eq!(level2.counter(), 3);
}
assert_eq!(level1.counter(), 1);
}
#[test]
fn test_alternating_commits_and_aborts() {
let mut parent = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.into_iter()
.shadow_counted();
let mut expected = 0;
for i in 0..5 {
parent.next();
expected += 1;
if i % 2 == 0 {
let mut nested = vec![100 + i].into_iter().nested_shadow_counted(&mut parent);
nested.next();
expected += 1;
nested.commit().unwrap();
assert_eq!(parent.counter(), expected);
} else {
let mut nested = vec![100 + i, 200 + i]
.into_iter()
.nested_shadow_counted(&mut parent);
nested.next();
nested.next();
assert_eq!(parent.counter(), expected);
}
}
assert_eq!(parent.counter(), 8); }
#[test]
fn test_very_deep_selective_commits() {
let mut l0 = vec![0].into_iter().shadow_counted();
l0.next();
{
let mut l1 = vec![1].into_iter().nested_shadow_counted(&mut l0);
l1.next();
{
let mut l2 = vec![2].into_iter().nested_shadow_counted(&mut l1);
l2.next();
{
let mut l3 = vec![3].into_iter().nested_shadow_counted(&mut l2);
l3.next();
{
let mut l4 = vec![4].into_iter().nested_shadow_counted(&mut l3);
l4.next();
}
assert_eq!(l3.counter(), 4);
l3.commit().unwrap();
}
assert_eq!(l2.counter(), 4);
}
assert_eq!(l1.counter(), 2);
l1.commit().unwrap();
}
assert_eq!(l0.counter(), 2); }
#[test]
fn test_clone_one_commits_one_aborts() {
let mut parent = vec![1, 2, 3].into_iter().shadow_counted();
parent.next();
let mut nested = vec![10, 11, 12]
.into_iter()
.nested_shadow_counted(&mut parent);
let _nested_clone = nested.clone();
nested.next();
nested.next();
assert_eq!(nested.counter(), 3);
nested.commit().unwrap();
assert_eq!(parent.counter(), 3);
}
#[test]
fn test_mixed_empty_and_nonempty_commits_aborts() {
let mut parent = vec![1, 2, 3].into_iter().shadow_counted();
parent.next();
assert_eq!(parent.counter(), 1);
{
let empty: Vec<i32> = vec![];
let nested = empty.into_iter().nested_shadow_counted(&mut parent);
nested.commit().unwrap();
}
assert_eq!(parent.counter(), 1);
{
let mut nested = vec![10, 11].into_iter().nested_shadow_counted(&mut parent);
nested.next();
nested.next();
}
assert_eq!(parent.counter(), 1);
{
let mut nested = vec![20].into_iter().nested_shadow_counted(&mut parent);
nested.next();
nested.commit().unwrap();
}
assert_eq!(parent.counter(), 2);
{
let empty: Vec<i32> = vec![];
let _nested = empty.into_iter().nested_shadow_counted(&mut parent);
}
assert_eq!(parent.counter(), 2);
}