use crate::linkedlist::LinkedList;
use crate::prelude::CppMapError;
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_insert() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_1.0));
let _2 = list.insert(2, 2.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_1.0));
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_2.0));
let _4 = list.insert(4, 4.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_2.0));
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_3.0));
let _6 = list.insert(6, 6.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_3.0));
let _7 = list.insert(7, 7.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_4.0));
let _8 = list.insert(8, 8.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_4.0));
let _9 = list.insert(9, 9.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_5.0));
let _0 = list.insert(0, 0.0)?;
assert_eq!(list.mid_point_delta, -1);
assert_eq!(list.mid_point, Some(_5.0));
Ok(())
}
#[test]
fn test_midpoint_insert_edge_cases() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let k1 = list.insert(10, 1.0)?;
assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 0);
let _k2 = list.insert(20, 2.0)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 1);
let _k0 = list.insert(5, 0.5)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 0);
let _k_mid_left = list.insert(9, 0.9)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, -1);
let _k_mid_right = list.insert(11, 1.1)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 0);
let _ = list.insert(21, 2.1)?; let _ = list.insert(22, 2.2)?; list.debug_print();
assert_eq!(list.mid_point, Some(_k_mid_right.0));
assert_eq!(list.mid_point_delta, 0);
let _ = list.insert(8, 0.8)?; let _ = list.insert(7, 0.7)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 0);
let _k_new_tail = list.insert(30, 3.0)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 1);
let _k_new_head = list.insert(1, 0.1)?; assert_eq!(list.mid_point, Some(k1.0));
assert_eq!(list.mid_point_delta, 0);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_1.0));
let _2 = list.insert(2, 2.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_1.0));
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_2.0));
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.debug_print();
assert_eq!(index.unwrap().0, _2.0); assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_2.0));
let _ = list.remove_by_index(&mut index);
list.debug_print();
assert_eq!(index.unwrap().0, _3.0); assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_3.0));
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove_basic() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_1.0));
let _2 = list.insert(2, 2.0)?;
assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_1.0));
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_2.0));
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _2.0); assert_eq!(list.mid_point_delta, 1);
assert_eq!(list.mid_point, Some(_2.0));
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _3.0); assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_3.0));
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove_single_element() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point_delta, 0);
assert_eq!(list.mid_point, Some(_1.0));
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, None); assert_eq!(list.mid_point_delta, 0);
assert!(list.is_empty());
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove_middle_element() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _2.0);
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove_head_element() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _2.0);
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_remove_tail_element() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _2.0);
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_imbalanced_insertions() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let _6 = list.insert(6, 6.0)?;
list.validate();
let _7 = list.insert(7, 7.0)?;
list.validate();
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
let _0 = list.insert(0, 0.0)?;
list.validate();
let _m1 = list.insert(-1, -1.0)?;
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_alternating_insertions() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point, Some(_1.0));
assert_eq!(list.mid_point_delta, 0);
let _3 = list.insert(3, 3.0)?;
assert_eq!(list.mid_point, Some(_1.0));
assert_eq!(list.mid_point_delta, 1);
let _2 = list.insert(2, 2.0)?;
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 1);
let _4 = list.insert(4, 4.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_sequential_removals() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 1); assert_eq!(index.unwrap().0, _2.0);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
assert_eq!(index.unwrap().0, _3.0);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _4.0);
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(index.unwrap().0, _5.0);
assert_eq!(list.mid_point, Some(_5.0));
assert_eq!(list.mid_point_delta, 0);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, None);
assert_eq!(list.mid_point_delta, 0);
assert!(list.is_empty());
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_random_order_removals() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_4);
let _ = list.remove_by_index(&mut index);
list.validate();
let valid_next_indices = [_3.0, _5.0];
assert!(valid_next_indices.contains(&index.unwrap().0));
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, -1);
index = Some(_2);
let _ = list.remove_by_index(&mut index);
assert_eq!(list.mid_point_delta, 0);
index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_5.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_edge_case_rebalancing() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
let _6 = list.insert(6, 6.0)?;
let _7 = list.insert(7, 7.0)?;
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_2);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_5);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_6);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_4.0));
index = Some(_4);
let _ = list.remove_by_index(&mut index); list.validate();
assert_eq!(index, Some(_1));
assert_eq!(list.mid_point, Some(_7.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_edge_case_rebalancing() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
let _6 = list.insert(6, 6.0)?;
let _7 = list.insert(7, 7.0)?;
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_2);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_5);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_6);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_4.0));
index = Some(_4);
let _ = list.remove_by_index(&mut index); list.validate();
assert_eq!(index, Some(_1));
assert_eq!(list.mid_point, Some(_7.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_left_heavy() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_4);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_5);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
index = Some(_2);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_right_heavy() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
index = Some(_2);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
index = Some(_4);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_5.0));
assert_eq!(list.mid_point_delta, -1);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_edge_cases() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
list.validate();
let _2 = list.insert(2, 2.0)?;
list.validate();
let _3 = list.insert(3, 3.0)?;
list.validate();
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_2);
let _ = list.remove_by_index(&mut index);
list.validate();
assert!(list.mid_point == Some(_1.0) || list.mid_point == Some(_3.0));
if list.mid_point == Some(_1.0) {
assert_eq!(list.mid_point_delta, 1);
} else {
assert_eq!(list.mid_point_delta, -1);
}
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_series() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
let _6 = list.insert(6, 6.0)?;
let _7 = list.insert(7, 7.0)?;
assert_eq!(list.mid_point, Some(_4.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_4);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_5.0));
assert_eq!(list.mid_point_delta, -1);
index = Some(_5);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
index = Some(_3);
let _ = list.remove_by_index(&mut index);
list.validate();
assert!(list.mid_point == Some(_2.0) || list.mid_point == Some(_6.0));
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_when_head_or_tail_removed() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
let _3 = list.insert(3, 3.0)?;
let _4 = list.insert(4, 4.0)?;
let _5 = list.insert(5, 5.0)?;
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 1);
index = Some(_5);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_3.0));
assert_eq!(list.mid_point_delta, 0);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_two_element_list() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
let _2 = list.insert(2, 2.0)?;
list.validate();
assert_eq!(list.mid_point, Some(_1.0));
assert_eq!(list.mid_point_delta, 1);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, Some(_2.0));
assert_eq!(list.mid_point_delta, 0);
Ok(())
}
#[allow(clippy::just_underscores_and_digits)]
#[test]
fn test_midpoint_removal_to_empty_list() -> Result<(), CppMapError> {
let mut list = LinkedList::default();
let _1 = list.insert(1, 1.0)?;
assert_eq!(list.mid_point, Some(_1.0));
assert_eq!(list.mid_point_delta, 0);
let mut index = Some(_1);
let _ = list.remove_by_index(&mut index);
list.validate();
assert_eq!(list.mid_point, None);
assert_eq!(list.mid_point_delta, 0);
assert!(list.is_empty());
Ok(())
}
}