use super::super::{inter::*, leaf::*, node::*, *};
use core::cell::UnsafeCell;
#[test]
fn test_borrow_from_left_insert_first_height_2() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
assert!(5 < leaf_cap);
let mut left_leaf = LeafNode::<i32, i32>::alloc();
let mut middle_leaf = LeafNode::<i32, i32>::alloc();
let mut right_leaf = LeafNode::<i32, i32>::alloc();
for i in 0..(leaf_cap - 1) {
let key = i as i32 * 2;
left_leaf.insert_no_split(key, i as i32 * 10);
}
for i in 0..leaf_cap {
let key = (leaf_cap + i) as i32 * 2;
middle_leaf.insert_no_split(key, (leaf_cap + i) as i32 * 10);
}
for i in 0..(leaf_cap - 1) {
right_leaf
.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
(*left_leaf.brothers()).next = middle_leaf.get_ptr();
(*middle_leaf.brothers()).prev = left_leaf.get_ptr();
(*middle_leaf.brothers()).next = right_leaf.get_ptr();
(*right_leaf.brothers()).prev = middle_leaf.get_ptr();
let insert_key = leaf_cap as i32 * 2 - 1;
println!("insert_key {insert_key}");
let insert_value = insert_key * 2 * 10 - 1;
assert!(insert_key > left_leaf.get_keys()[left_leaf.key_count() as usize - 1]);
let middle_first_key = middle_leaf.get_keys()[0];
let right_first_key = right_leaf.get_keys()[0];
assert!(insert_key < middle_first_key);
let (insert_idx, is_equal) = middle_leaf.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, 0);
println!("inserting key {insert_key} into middle_leaf idx {insert_idx}");
let mut root = InterNode::<i32, i32>::alloc(1);
root.set_left_ptr(left_leaf.get_ptr());
root.insert_no_split(insert_key, middle_leaf.get_ptr());
root.insert_no_split(right_first_key, right_leaf.get_ptr());
assert!(insert_key < middle_first_key);
assert!(insert_key > left_leaf.get_keys()[left_leaf.key_count() as usize - 1]);
assert!(middle_first_key < right_first_key);
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (3 * leaf_cap - 2) as usize,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 3,
triggers: 0,
};
assert!(middle_leaf.is_full());
assert!(!left_leaf.is_full());
assert!(!map.contains_key(&insert_key));
map.insert(insert_key, insert_value);
map.validate();
assert_eq!(middle_leaf.get_keys()[0], middle_first_key);
assert_eq!(map.get(&insert_key), Some(&insert_value));
let root = map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 2);
assert_eq!(root.height(), 1);
assert_eq!(root.get_keys()[0], middle_first_key);
assert_eq!(map.len(), (3 * leaf_cap - 1) as usize);
assert_eq!(map.leaf_count, 3); assert!(map.triggers & TestFlag::LeafMoveLeft as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map); }
}
#[test]
fn test_borrow_from_left_insert_mid_height_2() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
assert!(5 < leaf_cap);
let mut left_leaf = LeafNode::<i32, i32>::alloc();
let mut middle_leaf = LeafNode::<i32, i32>::alloc();
let mut right_leaf = LeafNode::<i32, i32>::alloc();
for i in 0..(leaf_cap - 1) {
left_leaf.insert_no_split(i as i32 * 2, i as i32 * 10);
}
for i in 0..leaf_cap {
let key = (leaf_cap + i) as i32 * 2;
middle_leaf.insert_no_split(key, (leaf_cap + i) as i32 * 10);
}
for i in 0..(leaf_cap - 1) {
right_leaf
.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
(*left_leaf.brothers()).next = middle_leaf.get_ptr();
(*middle_leaf.brothers()).prev = left_leaf.get_ptr();
(*middle_leaf.brothers()).next = right_leaf.get_ptr();
(*right_leaf.brothers()).prev = middle_leaf.get_ptr();
let mut root = InterNode::<i32, i32>::alloc(1);
root.set_left_ptr(left_leaf.get_ptr());
let middle_first_key = middle_leaf.get_keys()[0];
let right_first_key = right_leaf.get_keys()[0];
root.insert_no_split(middle_first_key, middle_leaf.get_ptr());
root.insert_no_split(right_first_key, right_leaf.get_ptr());
assert!(left_leaf.get_keys()[0] < middle_first_key);
assert!(middle_first_key < right_first_key);
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (3 * leaf_cap - 2) as usize,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 3,
triggers: 0,
};
let insert_key = leaf_cap as i32 * 2 + 5;
let insert_value = insert_key * 10;
assert!(insert_key > middle_first_key);
let (insert_idx, is_equal) = middle_leaf.search(&insert_key);
assert!(insert_idx > 0);
assert!(!is_equal);
println!("inserting key {insert_key} into middle_leaf idx {insert_idx}");
assert!(middle_leaf.is_full());
assert!(!left_leaf.is_full()); let old_middle_leaf_key1 = middle_leaf.get_keys()[1];
assert!(!map.contains_key(&insert_key));
map.insert(insert_key, insert_value);
map.validate();
assert!(middle_leaf.get_keys()[0] != middle_first_key);
assert_eq!(middle_leaf.get_keys()[0], old_middle_leaf_key1);
println!("middle_leaf keys[0] {}", middle_leaf.get_keys()[0]);
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), (3 * leaf_cap - 1) as usize);
let root = &map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 2);
assert_eq!(root.height(), 1);
assert_eq!(root.get_keys()[0], old_middle_leaf_key1);
assert_eq!(map.leaf_count, 3); assert!(map.triggers & TestFlag::LeafMoveLeft as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map); }
}
#[test]
fn test_borrow_from_right_height_2_not_last() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
println!("cap {}", leaf_cap);
let mut left_leaf = LeafNode::<i32, i32>::alloc();
let mut middle_leaf = LeafNode::<i32, i32>::alloc();
let mut right_leaf = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
left_leaf.insert_no_split(i as i32 * 2, i as i32 * 10);
}
for i in 0..leaf_cap {
middle_leaf.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
for i in 0..(leaf_cap - 1) {
right_leaf
.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
(*left_leaf.brothers()).next = middle_leaf.get_ptr();
(*middle_leaf.brothers()).prev = left_leaf.get_ptr();
(*middle_leaf.brothers()).next = right_leaf.get_ptr();
(*right_leaf.brothers()).prev = middle_leaf.get_ptr();
let mut root = InterNode::<i32, i32>::alloc(1);
root.set_left_ptr(left_leaf.get_ptr());
let middle_first_key = middle_leaf.get_keys()[0];
let right_first_key = right_leaf.get_keys()[0];
root.insert_no_split(middle_first_key, middle_leaf.get_ptr());
root.insert_no_split(right_first_key, right_leaf.get_ptr());
let middle_last_key = middle_leaf.get_keys()[middle_leaf.key_count() as usize - 1];
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (3 * leaf_cap - 1) as usize,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 3,
triggers: 0,
};
assert_eq!(map.get_root_unwrap().as_inter().get_keys()[1], right_leaf.get_keys()[0]);
let insert_key = 2 * leaf_cap as i32 * 2 - 3;
let insert_value = insert_key * 10;
let (insert_idx, is_equal) = middle_leaf.search(&insert_key);
assert!(!is_equal);
assert!(insert_idx < leaf_cap);
assert!(!map.contains_key(&insert_key));
assert!(insert_key < middle_leaf.get_keys()[leaf_cap as usize - 1]);
assert!(middle_leaf.is_full());
assert!(!right_leaf.is_full());
assert!(map.insert(insert_key, insert_value).is_none());
map.validate();
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), 3 * leaf_cap as usize);
let root = &map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 2);
assert_eq!(root.height(), 1);
assert_eq!(root.get_keys()[1], middle_last_key);
assert_eq!(map.leaf_count, 3); assert!(map.triggers & TestFlag::LeafMoveRight as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}
#[test]
fn test_borrow_from_right_height_2_last() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
println!("cap {}", leaf_cap);
let mut left_leaf = LeafNode::<i32, i32>::alloc();
let mut middle_leaf = LeafNode::<i32, i32>::alloc();
let mut right_leaf = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
left_leaf.insert_no_split(i as i32 * 2, i as i32 * 10);
}
for i in 0..leaf_cap {
middle_leaf.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
for i in 0..(leaf_cap - 1) {
right_leaf
.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
(*left_leaf.brothers()).next = middle_leaf.get_ptr();
(*middle_leaf.brothers()).prev = left_leaf.get_ptr();
(*middle_leaf.brothers()).next = right_leaf.get_ptr();
(*right_leaf.brothers()).prev = middle_leaf.get_ptr();
let mut root = InterNode::<i32, i32>::alloc(1);
root.set_left_ptr(left_leaf.get_ptr());
let middle_first_key = middle_leaf.get_keys()[0];
let right_first_key = right_leaf.get_keys()[0];
root.insert_no_split(middle_first_key, middle_leaf.get_ptr());
root.insert_no_split(right_first_key, right_leaf.get_ptr());
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (3 * leaf_cap - 1) as usize,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 3,
triggers: 0,
};
assert_eq!(map.get_root_unwrap().as_inter().get_keys()[1], right_leaf.get_keys()[0]);
let insert_key = (2 * leaf_cap as i32 - 1) * 2 + 1;
println!("insert_key {insert_key}");
println!("right_leaf {}", right_leaf.get_keys()[0]);
let insert_value = insert_key * 10;
let (insert_idx, is_equal) = middle_leaf.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, leaf_cap);
assert!(!map.contains_key(&insert_key));
assert!(insert_key > middle_leaf.get_keys()[leaf_cap as usize - 1]);
assert!(insert_key < right_leaf.get_keys()[0]);
assert!(middle_leaf.is_full());
assert!(!right_leaf.is_full());
assert!(map.insert(insert_key, insert_value).is_none());
map.validate();
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), 3 * leaf_cap as usize);
let root = &map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 2);
assert_eq!(root.height(), 1);
assert_eq!(root.get_keys()[1], insert_key);
assert_eq!(map.leaf_count, 3); assert!(map.triggers & TestFlag::LeafMoveRight as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}
#[test]
fn test_borrow_from_left_insert_first_height_3() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
let mut leaf_0 = LeafNode::<i32, i32>::alloc();
let mut leaf_1 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_0.insert_no_split(i as i32 * 2, i as i32 * 10);
}
for i in 0..leaf_cap - 1 {
leaf_1.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
let mut leaf_2 = LeafNode::<i32, i32>::alloc();
let mut leaf_3 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_2.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
leaf_3.insert_no_split((3 * leaf_cap + i) as i32 * 2, (3 * leaf_cap + i) as i32 * 10);
}
(*leaf_0.brothers()).next = leaf_1.get_ptr();
(*leaf_1.brothers()).prev = leaf_0.get_ptr();
(*leaf_1.brothers()).next = leaf_2.get_ptr();
(*leaf_2.brothers()).prev = leaf_1.get_ptr();
(*leaf_2.brothers()).next = leaf_3.get_ptr();
(*leaf_3.brothers()).prev = leaf_2.get_ptr();
let insert_key = leaf_cap as i32 * 4 - 1;
println!("insert_key {insert_key}");
let insert_value = insert_key * 2 * 10 - 1;
assert!(insert_key > leaf_1.get_keys()[leaf_1.key_count() as usize - 1]);
assert!(insert_key < leaf_2.get_keys()[0]);
let (insert_idx, is_equal) = leaf_2.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, 0);
println!("inserting key {insert_key} into leaf_2 idx {insert_idx}");
let mut internal_left = InterNode::<i32, i32>::alloc(1);
internal_left.set_left_ptr(leaf_0.get_ptr());
let leaf1_first_key = leaf_1.get_keys()[0];
internal_left.insert_no_split(leaf1_first_key, leaf_1.get_ptr());
let mut internal_right = InterNode::<i32, i32>::alloc(1);
internal_right.set_left_ptr(leaf_2.get_ptr());
let leaf3_first_key = leaf_3.get_keys()[0];
internal_right.insert_no_split(leaf3_first_key, leaf_3.get_ptr());
let mut root = InterNode::<i32, i32>::alloc(2);
root.set_left_ptr(internal_left.get_ptr());
root.insert_no_split(insert_key, internal_right.get_ptr());
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (4 * leaf_cap) as usize - 1,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 4,
triggers: 0,
};
assert_eq!(map.height(), 3);
println!("len {}", map.len());
map.insert(insert_key, insert_value);
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), (4 * leaf_cap) as usize);
assert_eq!(map.height(), 3);
let root = map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 1);
assert_eq!(root.get_keys()[0], leaf_2.get_keys()[0]);
assert_eq!(internal_left.key_count(), 1);
assert_eq!(internal_right.key_count(), 1);
map.validate();
assert_eq!(map.leaf_count, 4); assert!(map.triggers & TestFlag::LeafMoveLeft as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}
#[test]
fn test_borrow_from_left_insert_mid_height_3() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
let mut leaf_0 = LeafNode::<i32, i32>::alloc();
let mut leaf_1 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_0.insert_no_split(i as i32 * 2, i as i32 * 10);
}
for i in 0..leaf_cap - 1 {
leaf_1.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
let mut leaf_2 = LeafNode::<i32, i32>::alloc();
let mut leaf_3 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_2.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
leaf_3.insert_no_split((3 * leaf_cap + i) as i32 * 2, (3 * leaf_cap + i) as i32 * 10);
}
(*leaf_0.brothers()).next = leaf_1.get_ptr();
(*leaf_1.brothers()).prev = leaf_0.get_ptr();
(*leaf_1.brothers()).next = leaf_2.get_ptr();
(*leaf_2.brothers()).prev = leaf_1.get_ptr();
(*leaf_2.brothers()).next = leaf_3.get_ptr();
(*leaf_3.brothers()).prev = leaf_2.get_ptr();
let insert_key = leaf_cap as i32 * 4 + 1;
println!("insert_key {insert_key}");
let insert_value = insert_key * 2 * 10 - 1;
assert!(insert_key > leaf_1.get_keys()[leaf_1.key_count() as usize - 1]);
let old_leaf_2_first = leaf_2.get_keys()[0];
assert!(insert_key > old_leaf_2_first);
let (insert_idx, is_equal) = leaf_2.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, 1);
println!("inserting key {insert_key} into leaf_2 idx {insert_idx}");
let mut internal_left = InterNode::<i32, i32>::alloc(1);
internal_left.set_left_ptr(leaf_0.get_ptr());
let leaf1_first_key = leaf_1.get_keys()[0];
internal_left.insert_no_split(leaf1_first_key, leaf_1.get_ptr());
let mut internal_right = InterNode::<i32, i32>::alloc(1);
internal_right.set_left_ptr(leaf_2.get_ptr());
let leaf3_first_key = leaf_3.get_keys()[0];
internal_right.insert_no_split(leaf3_first_key, leaf_3.get_ptr());
let mut root = InterNode::<i32, i32>::alloc(2);
root.set_left_ptr(internal_left.get_ptr());
root.insert_no_split(old_leaf_2_first, internal_right.get_ptr());
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (4 * leaf_cap) as usize - 1,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 4,
triggers: 0,
};
assert_eq!(map.height(), 3);
map.insert(insert_key, insert_value);
map.validate();
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), (4 * leaf_cap) as usize);
assert_eq!(map.height(), 3);
let root = map.get_root_unwrap().as_inter();
assert_eq!(root.key_count(), 1);
assert_eq!(root.get_keys()[0], insert_key);
assert_eq!(internal_left.key_count(), 1);
assert_eq!(internal_right.key_count(), 1);
assert_eq!(map.leaf_count, 4); assert!(map.triggers & TestFlag::LeafMoveLeft as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}
#[test]
fn test_borrow_from_right_insert_not_last_height_3() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
let mut leaf_0 = LeafNode::<i32, i32>::alloc();
let mut leaf_1 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_0.insert_no_split(i as i32 * 2, i as i32 * 10);
leaf_1.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
let mut leaf_2 = LeafNode::<i32, i32>::alloc();
let mut leaf_3 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap - 1 {
leaf_2.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
for i in 0..leaf_cap {
leaf_3.insert_no_split((3 * leaf_cap + i) as i32 * 2, (3 * leaf_cap + i) as i32 * 10);
}
(*leaf_0.brothers()).next = leaf_1.get_ptr();
(*leaf_1.brothers()).prev = leaf_0.get_ptr();
(*leaf_1.brothers()).next = leaf_2.get_ptr();
(*leaf_2.brothers()).prev = leaf_1.get_ptr();
(*leaf_2.brothers()).next = leaf_3.get_ptr();
(*leaf_3.brothers()).prev = leaf_2.get_ptr();
let old_leaf_1_last = leaf_1.get_keys()[leaf_1.key_count() as usize - 1];
let insert_key = old_leaf_1_last - 1;
println!("insert_key {insert_key}");
let insert_value = insert_key * 2 * 10 - 1;
let old_leaf_2_first = leaf_2.get_keys()[0];
assert!(insert_key < old_leaf_2_first);
let (insert_idx, is_equal) = leaf_1.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, leaf_cap - 1);
println!("inserting key {insert_key} into leaf_1 idx {insert_idx}");
let mut internal_left = InterNode::<i32, i32>::alloc(1);
internal_left.set_left_ptr(leaf_0.get_ptr());
let leaf1_first_key = leaf_1.get_keys()[0];
internal_left.insert_no_split(leaf1_first_key, leaf_1.get_ptr());
let mut internal_right = InterNode::<i32, i32>::alloc(1);
internal_right.set_left_ptr(leaf_2.get_ptr());
let leaf3_first_key = leaf_3.get_keys()[0];
internal_right.insert_no_split(leaf3_first_key, leaf_3.get_ptr());
let mut root = InterNode::<i32, i32>::alloc(2);
root.set_left_ptr(internal_left.get_ptr());
root.insert_no_split(old_leaf_2_first, internal_right.get_ptr());
println!("old_leaf_2_first {old_leaf_2_first}");
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (4 * leaf_cap) as usize - 1,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 4,
triggers: 0,
};
assert_eq!(map.height(), 3);
map.insert(insert_key, insert_value);
map.validate();
assert_eq!(leaf_2.get_keys()[0], old_leaf_1_last);
let root = map.get_root_unwrap().as_inter();
assert_eq!(root.get_keys()[0], old_leaf_1_last);
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), (4 * leaf_cap) as usize);
assert_eq!(map.height(), 3);
assert_eq!(root.key_count(), 1);
assert_eq!(internal_left.key_count(), 1);
assert_eq!(internal_right.key_count(), 1);
assert_eq!(map.leaf_count, 4); assert!(map.triggers & TestFlag::LeafMoveRight as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}
#[test]
fn test_borrow_from_right_insert_last_height_3() {
unsafe {
let leaf_cap = LeafNode::<i32, i32>::cap();
let mut leaf_0 = LeafNode::<i32, i32>::alloc();
let mut leaf_1 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap {
leaf_0.insert_no_split(i as i32 * 2, i as i32 * 10);
leaf_1.insert_no_split((leaf_cap + i) as i32 * 2, (leaf_cap + i) as i32 * 10);
}
let mut leaf_2 = LeafNode::<i32, i32>::alloc();
let mut leaf_3 = LeafNode::<i32, i32>::alloc();
for i in 0..leaf_cap - 1 {
leaf_2.insert_no_split((2 * leaf_cap + i) as i32 * 2, (2 * leaf_cap + i) as i32 * 10);
}
for i in 0..leaf_cap {
leaf_3.insert_no_split((3 * leaf_cap + i) as i32 * 2, (3 * leaf_cap + i) as i32 * 10);
}
(*leaf_0.brothers()).next = leaf_1.get_ptr();
(*leaf_1.brothers()).prev = leaf_0.get_ptr();
(*leaf_1.brothers()).next = leaf_2.get_ptr();
(*leaf_2.brothers()).prev = leaf_1.get_ptr();
(*leaf_2.brothers()).next = leaf_3.get_ptr();
(*leaf_3.brothers()).prev = leaf_2.get_ptr();
let old_leaf_1_last = leaf_1.get_keys()[leaf_1.key_count() as usize - 1];
let insert_key = old_leaf_1_last + 1;
println!("insert_key {insert_key}");
let insert_value = insert_key * 2 * 10 - 1;
let old_leaf_2_first = leaf_2.get_keys()[0];
assert!(insert_key < old_leaf_2_first);
let (insert_idx, is_equal) = leaf_1.search(&insert_key);
assert!(!is_equal);
assert_eq!(insert_idx, leaf_cap);
println!("inserting key {insert_key} into leaf_1 idx {insert_idx}");
let mut internal_left = InterNode::<i32, i32>::alloc(1);
internal_left.set_left_ptr(leaf_0.get_ptr());
let leaf1_first_key = leaf_1.get_keys()[0];
internal_left.insert_no_split(leaf1_first_key, leaf_1.get_ptr());
let mut internal_right = InterNode::<i32, i32>::alloc(1);
internal_right.set_left_ptr(leaf_2.get_ptr());
let leaf3_first_key = leaf_3.get_keys()[0];
internal_right.insert_no_split(leaf3_first_key, leaf_3.get_ptr());
let mut root = InterNode::<i32, i32>::alloc(2);
root.set_left_ptr(internal_left.get_ptr());
root.insert_no_split(old_leaf_2_first, internal_right.get_ptr());
println!("old_leaf_2_first {old_leaf_2_first}");
let mut map = BTreeMap::<i32, i32> {
root: Some(Node::Inter(root)),
len: (4 * leaf_cap) as usize - 1,
cache: UnsafeCell::new(PathCache::new()),
leaf_count: 4,
triggers: 0,
};
assert_eq!(map.height(), 3);
map.insert(insert_key, insert_value);
map.validate();
assert_eq!(leaf_2.get_keys()[0], insert_key);
let root = map.get_root_unwrap().as_inter();
assert_eq!(root.get_keys()[0], insert_key);
assert_eq!(map.get(&insert_key), Some(&insert_value));
assert_eq!(map.len(), (4 * leaf_cap) as usize);
assert_eq!(map.height(), 3);
assert_eq!(root.key_count(), 1);
assert_eq!(internal_left.key_count(), 1);
assert_eq!(internal_right.key_count(), 1);
assert_eq!(map.leaf_count, 4); assert!(map.triggers & TestFlag::LeafMoveRight as u32 > 0);
assert!(map.triggers & TestFlag::UpdateSepKey as u32 > 0);
drop(map);
}
}