use applejack::Rax;
#[test]
pub fn basic_test() {
let mut root = Rax::<()>::default();
assert!(!root.exists(&[]));
root.insert(&[], ());
assert!(root.exists(&[]));
}
#[test]
pub fn basic_insert_stuff() {
let a = b"hello alice";
let b = b"hello kyle";
let mut root = Rax::default();
root.insert(a, ());
root.insert(b, ());
assert!(root.exists(a));
assert!(root.exists(b));
assert!(!root.exists(b"h"));
assert!(!root.exists(b"hello"));
assert!(!root.exists(b"alice"));
assert!(!root.exists(&[]));
}
#[test]
pub fn insert_1_element() {
let a = b"hello alice";
let mut root = Rax::default();
root.insert(a, 10);
assert!(root.exists(a));
}
#[test]
pub fn basic_insert_and_remove_stuff() {
let a = b"hello alice";
let b = b"hello kyle";
let mut root = Rax::default();
root.insert(a, 10);
root.insert(b, 20);
assert!(root.exists(a));
assert!(root.exists(b));
assert_eq!(root.remove(a), Some(10));
assert!(!root.exists(a));
assert_eq!(root.remove(b), Some(20));
assert!(!root.exists(b));
}
#[test]
pub fn basic_insert_and_get_stuff() {
let a = b"hello alice";
let b = b"hello kyle";
let mut root = Rax::default();
root.insert(a, 10);
root.insert(b, 20);
assert_eq!(root.get(a), Some(&10));
assert_eq!(root.get(b), Some(&20));
assert_eq!(root.get(&[]), None);
assert_eq!(root.get(b"hello"), None);
assert_eq!(root.get(b"alice"), None);
}
#[test]
pub fn insert_and_remove_random_values() {
let a = b"hello alice";
let b = b"hello kyle";
let mut root = Rax::default();
root.insert(a, 10);
root.insert(b, 20);
assert_eq!(root.get(a), Some(&10));
assert_eq!(root.get(b), Some(&20));
assert_eq!(root.get(&[]), None);
assert_eq!(root.get(b"hello"), None);
assert_eq!(root.get(b"alice"), None);
}
#[test]
pub fn test_remove_remove_remove() {
let a = b"hello kye";
let mut root = Rax::default();
root.remove(a);
assert!(!root.exists(a));
root.insert(a, ());
assert!(root.exists(a));
root.remove(a);
root.remove(a);
assert!(!root.exists(a));
}
#[test]
pub fn test_get_empty() {
let root = Rax::<()>::default();
assert!(!root.exists(&[]));
}
#[test]
pub fn test_insert_empty() {
let mut root = Rax::default();
root.insert(&[], ());
root.insert(&[], ());
root.insert(b"hello", ());
root.remove(b"hello");
assert!(root.exists(&[]));
}
#[derive(Debug)]
enum Operation {
Insert(&'static [u8], u8),
Remove(&'static [u8]),
}
#[test]
pub fn test_only_delete_node_if_no_branches() {
let data = [
Operation::Insert(&[101, 212, 101, 101, 40, 83, 101, 101], 101),
Operation::Insert(&[101, 101, 101, 83, 83], 0),
Operation::Insert(&[101, 101], 233),
Operation::Insert(&[101, 101, 101, 101, 101], 212),
Operation::Remove(&[101, 101]),
Operation::Remove(&[101, 101, 101, 101, 101]),
];
let mut table = std::collections::HashMap::new();
let mut rax = Rax::default();
for operation in &data {
match operation {
Operation::Insert(key, value) => {
rax.insert(key, *value);
table.insert(key, *value);
}
Operation::Remove(key) => {
assert_eq!(rax.remove(key), table.remove(key));
}
};
}
}