use super::super::{inter::*, node::*};
use super::{CounterI32, alive_count, reset_alive_count};
use core::mem::align_of;
#[test]
fn test_inter_align() {
let cap = InterNode::<u8, usize>::cap();
println!("align u8 {}, cap {}", align_of::<u8>(), cap);
let mut inter = unsafe { InterNode::<u8, usize>::alloc(1) };
inter.set_left_ptr(0 as *mut NodeHeader);
for i in 1..(cap + 1) {
inter.insert_no_split(i as u8, i as *mut NodeHeader);
}
for i in 1..(cap + 1) {
let idx = inter.search_child(&(i as u8));
assert_eq!(idx, i as u32);
}
inter.dealloc::<true>();
}
#[test]
fn test_inter_insert_and_search() {
unsafe {
let mut inter = InterNode::<usize, usize>::alloc(1);
let cap = InterNode::<usize, usize>::cap();
println!("InterNode<usize> cap {}", cap);
inter.set_left_ptr(0 as *mut NodeHeader);
for i in 1..(cap + 1) {
inter.insert_no_split(i as usize, i as *mut NodeHeader);
}
assert_eq!(*inter.child_ptr(0), 0 as *mut NodeHeader);
assert_eq!(inter.key_count(), cap);
for i in 1..(cap + 1) {
let idx = inter.search_child(&(i as usize));
assert_eq!(idx, i as u32);
assert_eq!(*inter.child_ptr(i), i as *mut NodeHeader);
}
let idx = inter.search_child(&0);
assert_eq!(idx, 0);
let idx = inter.search_child(&50);
assert_eq!(idx, cap as u32);
inter.dealloc::<true>();
}
}
#[test]
fn test_inter_split_insert_left() {
reset_alive_count();
let cap = InterNode::<CounterI32, CounterI32>::cap();
println!("InterNode<CounterI32> cap {}", cap);
unsafe {
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..cap {
node.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
assert_eq!(*node.child_ptr(0), 0x1000 as *mut NodeHeader);
for i in 0..cap {
let idx = node.search_child(&((i * 10) as i32));
assert_eq!(*node.child_ptr(idx), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
let split_idx = cap >> 1;
let insert_key: CounterI32 = ((split_idx * 10 - 15) as i32).into(); let insert_key_value = insert_key.value;
let insert_child = 0x5000 as *mut NodeHeader;
let insert_idx = node.search_key(&insert_key);
assert!(insert_idx < split_idx);
println!("cap {cap} split_idx {split_idx}, insert_idx {insert_idx}");
let (new_node, _promote_key) = node.insert_split(insert_key, insert_child);
let left_count = node.key_count();
let right_count = new_node.key_count();
println!("left {left_count} right {right_count}");
assert_eq!(left_count, split_idx + 1, "Left node should have split_idx keys");
assert_eq!(left_count, insert_idx + 2, "Left node should have split_idx keys");
assert_eq!(right_count, cap - split_idx - 1, "Right node should have cap - split_idx keys");
assert_eq!(left_count + right_count, cap);
assert_eq!(*node.child_ptr(0), 0x1000 as *mut NodeHeader);
for i in 0..insert_idx {
println!("check idx {i}={}", i * 10);
let idx = node.search_child(&((i * 10) as i32));
assert_eq!(idx, i + 1);
assert_eq!((*node.key_ptr(i)).assume_init_ref(), (i * 10) as i32);
assert_eq!(*node.child_ptr(i + 1), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
let idx = node.search_child(&insert_key_value);
println!("insert_idx {insert_idx} ={}", (*node.key_ptr(insert_idx)).assume_init_ref());
assert_eq!(idx, insert_idx + 1);
assert_eq!(*node.child_ptr(idx), insert_child);
assert_eq!((*node.key_ptr(insert_idx + 1)).assume_init_ref(), ((insert_idx) * 10) as i32);
assert_eq!(
*node.child_ptr(insert_idx + 2),
(0x1000 + (insert_idx + 1) * 0x100) as *mut NodeHeader
);
assert_eq!(*new_node.child_ptr(0), (0x1000 + (split_idx + 1) * 0x100) as *mut NodeHeader);
for i in 0..cap - split_idx - 1 {
assert_eq!((*new_node.key_ptr(i)).assume_init_ref(), ((split_idx + 1 + i) * 10) as i32);
assert_eq!(
*new_node.child_ptr(i + 1),
(0x1000 + (split_idx + i + 2) * 0x100) as *mut NodeHeader
);
}
new_node.dealloc::<true>();
node.dealloc::<true>();
println!("Test Case 2 completed successfully");
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_split_insert_at_promote() {
reset_alive_count();
unsafe {
let cap = InterNode::<CounterI32, CounterI32>::cap();
println!("=== Test Internal Node Split Basic ===");
println!("cap = {}", cap);
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..cap {
node.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
let split_idx = cap >> 1;
let insert_key: CounterI32 = ((split_idx * 10 - 5) as i32).into(); let insert_key_value = insert_key.value;
let insert_child = 0x5000 as *mut NodeHeader;
let insert_idx = node.search_key(&insert_key);
assert!(insert_idx == split_idx);
println!(
"split_idx = {}, insert_key = {}, insert_child = {:?}",
split_idx, insert_key_value, insert_child
);
let (new_node, promote_key) = node.insert_split(insert_key, insert_child);
println!(
"After split: left count = {}, right count = {}, promote_key = {}",
node.key_count(),
new_node.key_count(),
promote_key,
);
println!("left ptr = {:?}, right ptr = {:?}", node.get_ptr(), new_node.get_ptr());
let left_count = node.key_count() as u32;
let right_count = new_node.key_count() as u32;
println!("Asserting: left_count({}) == split_idx({})", left_count, split_idx);
assert_eq!(left_count, split_idx, "Left node should have split_idx keys");
assert_eq!(right_count, cap - split_idx, "Right node should have cap - split_idx keys");
assert_eq!(
left_count + right_count,
cap,
"Total keys should be cap when insert_key == promote_key"
);
assert_eq!(promote_key, insert_key_value, "Promoted key should be the inserted key");
for i in 0..split_idx {
assert_eq!((*node.key_ptr(i)).assume_init_ref(), ((i) * 10) as i32);
assert_eq!(*node.child_ptr(i + 1), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
assert_eq!(*new_node.child_ptr(0), insert_child);
for i in 0..cap - split_idx {
assert_eq!((*new_node.key_ptr(i)).assume_init_ref(), ((split_idx + i) * 10) as i32);
assert_eq!(
*new_node.child_ptr(i + 1),
(0x1000 + (split_idx + i + 1) * 0x100) as *mut NodeHeader
);
}
new_node.dealloc::<true>();
node.dealloc::<true>();
println!("Test Case 1 completed successfully");
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_split_insert_right_begin() {
reset_alive_count();
let cap = InterNode::<CounterI32, CounterI32>::cap() as u32;
unsafe {
println!("\n--- Test Case 3: Insert after split_idx (key goes to right node) ---");
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..cap {
node.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
node.get_header_mut().count = cap;
let split_idx = cap >> 1;
let insert_key: CounterI32 = ((split_idx * 10 + 5) as i32).into(); let insert_key_value = insert_key.value;
let insert_child = 0x5000 as *mut NodeHeader;
let insert_idx = node.search_key(&insert_key);
assert_eq!(insert_idx, split_idx + 1);
println!("cap {cap} split_idx {split_idx} insert_idx {insert_idx}");
let (new_node, promote_key) = node.insert_split(insert_key, insert_child);
assert_eq!(promote_key, (split_idx * 10) as i32);
let left_count = node.key_count() as u32;
let right_count = new_node.key_count() as u32;
assert_eq!(left_count, split_idx, "Left node should have split_idx keys");
assert_eq!(right_count, cap - split_idx, "Right node should have cap - split_idx keys");
assert_eq!(
left_count + right_count,
cap,
"Total keys should be cap when insert_key != promote_key"
);
for i in 0..split_idx {
assert_eq!((*node.key_ptr(i)).assume_init_ref(), ((i) * 10) as i32);
assert_eq!(*node.child_ptr(i + 1), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
assert_eq!(*new_node.child_ptr(0), (0x1000 + (split_idx + 1) * 0x100) as *mut NodeHeader);
assert_eq!((*new_node.key_ptr(0)).assume_init_ref(), insert_key_value);
assert_eq!((*new_node.child_ptr(1)), insert_child);
for i in 1..cap - split_idx {
assert_eq!((*new_node.key_ptr(i)).assume_init_ref(), ((split_idx + i) * 10) as i32);
assert_eq!(
*new_node.child_ptr(i + 1),
(0x1000 + (split_idx + i + 1) * 0x100) as *mut NodeHeader
);
}
new_node.dealloc::<true>();
node.dealloc::<true>();
println!("Test Case 3 completed successfully");
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_split_insert_right_mid() {
reset_alive_count();
let cap = InterNode::<CounterI32, CounterI32>::cap() as u32;
unsafe {
println!("\n--- Test Case 3: Insert after split_idx (key goes to right node) ---");
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..cap {
node.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
node.get_header_mut().count = cap;
let split_idx = cap >> 1;
let insert_key: CounterI32 = ((split_idx * 11 + 5) as i32).into(); let insert_key_value = insert_key.value;
let insert_child = 0x5000 as *mut NodeHeader;
let insert_idx = node.search_key(&insert_key);
assert_eq!(insert_idx, split_idx + 2);
println!("cap {cap} split_idx {split_idx} insert_idx {insert_idx}");
let (new_node, promote_key) = node.insert_split(insert_key, insert_child);
assert_eq!(promote_key.value, (split_idx * 10) as i32);
let left_count = node.key_count() as u32;
let right_count = new_node.key_count() as u32;
assert_eq!(left_count, split_idx, "Left node should have split_idx keys");
assert_eq!(right_count, cap - split_idx, "Right node should have cap - split_idx keys");
assert_eq!(
left_count + right_count,
cap,
"Total keys should be cap when insert_key != promote_key"
);
for i in 0..split_idx {
assert_eq!((*node.key_ptr(i)).assume_init_ref(), ((i) * 10) as i32);
assert_eq!(*node.child_ptr(i + 1), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
assert_eq!(*new_node.child_ptr(0), (0x1000 + (split_idx + 1) * 0x100) as *mut NodeHeader);
assert_eq!((*new_node.key_ptr(0)).assume_init_ref(), ((split_idx + 1) * 10) as i32);
assert_eq!(
*new_node.child_ptr(1),
(0x1000 + (split_idx + 1 + 1) * 0x100) as *mut NodeHeader
);
assert_eq!((*new_node.key_ptr(1)).assume_init_ref(), insert_key_value);
assert_eq!((*new_node.child_ptr(2)), insert_child);
for i in 2..cap - split_idx {
assert_eq!((*new_node.key_ptr(i)).assume_init_ref(), ((split_idx + i) * 10) as i32);
assert_eq!(
*new_node.child_ptr(i + 1),
(0x1000 + (split_idx + i + 1) * 0x100) as *mut NodeHeader
);
}
new_node.dealloc::<true>();
node.dealloc::<true>();
println!("Test Case 3 completed successfully");
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_split_insert_at_end() {
reset_alive_count();
let cap = InterNode::<CounterI32, CounterI32>::cap() as u32;
unsafe {
println!("\n--- Test Case 3: Insert after split_idx (key goes to right node) ---");
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..cap {
node.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
node.get_header_mut().count = cap;
let insert_key: CounterI32 = (((cap + 1) as i32) * 10).into(); let insert_key_value = insert_key.value;
let insert_child = 0x5000 as *mut NodeHeader;
let insert_idx = node.search_key(&insert_key);
assert_eq!(insert_idx, cap);
println!("cap {cap} insert_idx {insert_idx}");
let (new_node, promote_key) = node.insert_split(insert_key, insert_child);
assert_eq!(promote_key.value, insert_key_value);
let left_count = node.key_count() as u32;
let right_count = new_node.key_count() as u32;
assert_eq!(left_count, cap, "Left node should have split_idx keys");
assert_eq!(right_count, 0, "Right node should have cap - split_idx keys");
for i in 0..cap {
assert_eq!((*node.key_ptr(i)).assume_init_ref(), ((i) * 10) as i32);
assert_eq!(*node.child_ptr(i + 1), (0x1000 + (i + 1) * 0x100) as *mut NodeHeader);
}
assert_eq!(*new_node.child_ptr(0), insert_child);
new_node.dealloc::<true>();
node.dealloc::<true>();
println!("Test Case 3 completed successfully");
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_merge_basic() {
reset_alive_count();
unsafe {
let cap = InterNode::<CounterI32, CounterI32>::cap();
println!("InterNode<CounterI32> cap {}", cap);
let mut left = InterNode::<CounterI32, CounterI32>::alloc(1);
left.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..3 {
left.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
assert_eq!(left.key_count(), 3);
let mut right = InterNode::<CounterI32, CounterI32>::alloc(1);
right.set_left_ptr(0x2000 as *mut NodeHeader);
for i in 0..3 {
right.insert_no_split(
((30 + i * 10) as i32).into(),
(0x2000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
assert_eq!(right.key_count(), 3);
let mut grand = InterNode::<CounterI32, CounterI32>::alloc(2);
grand.set_left_ptr(left.get_ptr());
grand.insert_no_split(25_i32.into(), right.get_ptr()); assert_eq!(grand.key_count(), 1);
let alive_before = alive_count();
println!("Alive count before merge: {}", alive_before);
left.merge(right, &mut grand, 1);
assert_eq!(left.key_count(), 7, "Merged node should have 3 + 1 + 3 = 7 keys");
assert_eq!(grand.key_count(), 0, "Grandparent should have 0 keys after removing separator");
let expected_keys = [0, 10, 20, 25, 30, 40, 50];
for (i, &expected) in expected_keys.iter().enumerate() {
let actual = (*left.key_ptr(i as u32)).assume_init_ref().value;
assert_eq!(actual, expected, "Key at index {} should be {}", i, expected);
}
assert_eq!(
*left.child_ptr(0),
0x1000 as *mut NodeHeader,
"First child should be left's left_ptr"
);
assert_eq!(
*left.child_ptr(4),
0x2000 as *mut NodeHeader,
"Child at index 4 should be right's left_ptr"
);
let alive_after = alive_count();
println!("Alive count after merge: {}", alive_after);
assert_eq!(alive_after, alive_before, "No CounterI32 should be dropped during merge");
grand.dealloc::<false>(); left.dealloc::<true>();
println!("test_inter_merge_basic completed successfully");
}
assert_eq!(alive_count(), 0, "All CounterI32 should be dropped after cleanup");
}
#[test]
fn test_inter_merge_right_empty() {
reset_alive_count();
unsafe {
let mut left = InterNode::<CounterI32, CounterI32>::alloc(1);
left.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..3 {
left.insert_no_split(
((i * 10) as i32).into(),
(0x1000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
assert_eq!(left.key_count(), 3);
let right = InterNode::<CounterI32, CounterI32>::alloc(1);
(*right.child_ptr(0)) = 0x2000 as *mut NodeHeader;
assert_eq!(right.key_count(), 0);
let mut grand = InterNode::<CounterI32, CounterI32>::alloc(2);
grand.set_left_ptr(left.get_ptr());
grand.insert_no_split(25_i32.into(), right.get_ptr());
assert_eq!(grand.key_count(), 1);
left.merge(right, &mut grand, 1);
assert_eq!(left.key_count(), 4, "Merged node should have 3 + 1 + 0 = 4 keys");
let expected_keys = [0, 10, 20, 25];
for (i, &expected) in expected_keys.iter().enumerate() {
let actual = (*left.key_ptr(i as u32)).assume_init_ref().value;
assert_eq!(actual, expected, "Key at index {} should be {}", i, expected);
}
assert_eq!(*left.child_ptr(0), 0x1000 as *mut NodeHeader);
assert_eq!(*left.child_ptr(4), 0x2000 as *mut NodeHeader);
grand.dealloc::<false>();
left.dealloc::<true>();
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_merge_left_empty() {
reset_alive_count();
unsafe {
let mut left = InterNode::<CounterI32, CounterI32>::alloc(1);
(*left.child_ptr(0)) = 0x1000 as *mut NodeHeader;
assert_eq!(left.key_count(), 0);
let mut right = InterNode::<CounterI32, CounterI32>::alloc(1);
right.set_left_ptr(0x2000 as *mut NodeHeader);
for i in 0..3 {
right.insert_no_split(
((30 + i * 10) as i32).into(),
(0x2000 + (i + 1) * 0x100) as *mut NodeHeader,
);
}
assert_eq!(right.key_count(), 3);
let mut grand = InterNode::<CounterI32, CounterI32>::alloc(2);
grand.set_left_ptr(left.get_ptr());
grand.insert_no_split(25_i32.into(), right.get_ptr());
assert_eq!(grand.key_count(), 1);
left.merge(right, &mut grand, 1);
assert_eq!(left.key_count(), 4, "Merged node should have 0 + 1 + 3 = 4 keys");
let expected_keys = [25, 30, 40, 50];
for (i, &expected) in expected_keys.iter().enumerate() {
let actual = (*left.key_ptr(i as u32)).assume_init_ref().value;
assert_eq!(actual, expected, "Key at index {} should be {}", i, expected);
}
assert_eq!(*left.child_ptr(0), 0x1000 as *mut NodeHeader);
assert_eq!(*left.child_ptr(1), 0x2000 as *mut NodeHeader);
grand.dealloc::<false>();
left.dealloc::<true>();
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_insert_at_front() {
reset_alive_count();
unsafe {
let cap = InterNode::<CounterI32, CounterI32>::cap() as usize;
assert!(cap > 6);
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
for i in 0..5 {
node.insert_no_split(
CounterI32::new((i * 10) as i32),
((0x2000 + i * 0x100) as usize) as *mut NodeHeader,
);
}
assert_eq!(node.key_count() as usize, 5);
let original_first_key = node.get_keys()[0].value;
let original_first_child = node.get_child_ptr(0);
node.insert_at_front(0x9999 as *mut NodeHeader, CounterI32::new(999));
assert_eq!(node.key_count() as usize, 6);
assert_eq!(node.get_keys()[0].value, 999);
assert_eq!(node.get_child_ptr(0), 0x9999 as *mut NodeHeader);
assert_eq!(node.get_keys()[1].value, original_first_key);
assert_eq!(node.get_child_ptr(1), original_first_child);
for i in 1..5 {
assert_eq!(node.get_keys()[i + 1].value, (i * 10) as i32);
}
node.dealloc::<true>();
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_inter_insert_at_front_empty() {
reset_alive_count();
unsafe {
let mut node = InterNode::<CounterI32, CounterI32>::alloc(1);
node.set_left_ptr(0x1000 as *mut NodeHeader);
assert_eq!(node.key_count(), 0);
node.insert_at_front(0x2000 as *mut NodeHeader, CounterI32::new(100));
assert_eq!(node.key_count(), 1);
assert_eq!(node.get_keys()[0].value, 100);
assert_eq!(node.get_child_ptr(0), 0x2000 as *mut NodeHeader);
assert_eq!(node.get_child_ptr(1), 0x1000 as *mut NodeHeader);
node.dealloc::<true>();
}
assert_eq!(alive_count(), 0);
}
#[test]
fn test_insert_rotate_left_basic() {
unsafe {
let mut left = InterNode::<i32, i32>::alloc(1);
left.set_left_ptr(0x1000 as *mut NodeHeader);
left.insert_no_split(10_i32, 0x1001 as *mut NodeHeader);
left.insert_no_split(20_i32, 0x1002 as *mut NodeHeader);
let mut right = InterNode::<i32, i32>::alloc(1);
right.set_left_ptr(0x2000 as *mut NodeHeader);
right.insert_no_split(110_i32, 0x2001 as *mut NodeHeader);
right.insert_no_split(120_i32, 0x2002 as *mut NodeHeader);
right.insert_no_split(130_i32, 0x2003 as *mut NodeHeader);
let mut parent = InterNode::<i32, i32>::alloc(2);
parent.set_left_ptr(left.get_ptr());
parent.insert_no_split(100_i32, right.get_ptr());
let key: i32 = 115_i32;
let insert_idx = right.search_key(&key);
assert_eq!(insert_idx, 1, "key=115 should be inserted at idx=1");
right.insert_rotate_left(
&mut parent,
1,
&mut left,
insert_idx,
key,
0x2001A as *mut NodeHeader,
);
assert_eq!((*parent.key_ptr(0)).assume_init_read(), 110);
assert_eq!(left.key_count(), 3);
assert_eq!((*left.key_ptr(0)).assume_init_read(), 10);
assert_eq!((*left.key_ptr(1)).assume_init_read(), 20);
assert_eq!((*left.key_ptr(2)).assume_init_read(), 100);
assert_eq!(right.key_count(), 3);
assert_eq!((*right.key_ptr(0)).assume_init_read(), 115);
assert_eq!((*right.key_ptr(1)).assume_init_read(), 120);
assert_eq!((*right.key_ptr(2)).assume_init_read(), 130);
parent.dealloc::<false>();
left.dealloc::<true>();
right.dealloc::<true>();
}
}
#[test]
fn test_insert_rotate_left_middle() {
unsafe {
let mut left = InterNode::<i32, i32>::alloc(1);
left.set_left_ptr(0x3000 as *mut NodeHeader);
left.insert_no_split(30_i32, 0x3001 as *mut NodeHeader);
let mut right = InterNode::<i32, i32>::alloc(1);
right.set_left_ptr(0x4000 as *mut NodeHeader);
right.insert_no_split(210_i32, 0x4001 as *mut NodeHeader);
right.insert_no_split(220_i32, 0x4002 as *mut NodeHeader);
right.insert_no_split(230_i32, 0x4003 as *mut NodeHeader);
let mut parent = InterNode::<i32, i32>::alloc(2);
parent.set_left_ptr(left.get_ptr());
parent.insert_no_split(200_i32, right.get_ptr());
let key: i32 = 225_i32;
let insert_idx = right.search_key(&key);
assert_eq!(insert_idx, 2, "key=225 should be inserted at idx=2");
right.insert_rotate_left(
&mut parent,
1,
&mut left,
insert_idx,
key,
0x4002A as *mut NodeHeader,
);
assert_eq!((*parent.key_ptr(0)).assume_init_read(), 210);
assert_eq!(left.key_count(), 2);
assert_eq!((*left.key_ptr(0)).assume_init_read(), 30);
assert_eq!((*left.key_ptr(1)).assume_init_read(), 200);
assert_eq!(right.key_count(), 3);
assert_eq!((*right.key_ptr(0)).assume_init_read(), 220);
assert_eq!((*right.key_ptr(1)).assume_init_read(), 225);
assert_eq!((*right.key_ptr(2)).assume_init_read(), 230);
parent.dealloc::<false>();
left.dealloc::<true>();
right.dealloc::<true>();
}
}
#[test]
fn test_insert_rotate_left_last() {
unsafe {
let mut left = InterNode::<i32, i32>::alloc(1);
left.set_left_ptr(0x5000 as *mut NodeHeader);
left.insert_no_split(40_i32, 0x5001 as *mut NodeHeader);
let mut right = InterNode::<i32, i32>::alloc(1);
right.set_left_ptr(0x6000 as *mut NodeHeader);
right.insert_no_split(310_i32, 0x6001 as *mut NodeHeader);
right.insert_no_split(320_i32, 0x6002 as *mut NodeHeader);
let mut parent = InterNode::<i32, i32>::alloc(2);
parent.set_left_ptr(left.get_ptr());
parent.insert_no_split(300_i32, right.get_ptr());
let key: i32 = 330_i32;
let insert_idx = right.search_key(&key);
assert_eq!(insert_idx, 2, "key=330 should be inserted at idx=2 (key_count)");
right.insert_rotate_left(
&mut parent,
1,
&mut left,
insert_idx,
key,
0x6003 as *mut NodeHeader,
);
assert_eq!((*parent.key_ptr(0)).assume_init_read(), 310);
assert_eq!(left.key_count(), 2);
assert_eq!((*left.key_ptr(0)).assume_init_read(), 40);
assert_eq!((*left.key_ptr(1)).assume_init_read(), 300);
assert_eq!(right.key_count(), 2);
assert_eq!((*right.key_ptr(0)).assume_init_read(), 320);
assert_eq!((*right.key_ptr(1)).assume_init_read(), 330);
parent.dealloc::<false>();
left.dealloc::<true>();
right.dealloc::<true>();
}
}