use prollytree::config::TreeConfig;
use prollytree::storage::InMemoryNodeStorage;
use prollytree::tree::{ProllyTree, Tree};
fn splitty_config() -> TreeConfig<32> {
TreeConfig {
min_chunk_size: 2,
max_chunk_size: 64,
pattern: 0b1111,
..TreeConfig::<32>::default()
}
}
#[test]
fn bug_proof_on_empty_internal_node_does_not_panic() {
let mut tree = ProllyTree::new(InMemoryNodeStorage::<32>::default(), splitty_config());
for i in 0..500u32 {
tree.insert(
format!("key-{i:08}").into_bytes(),
format!("v{i}").into_bytes(),
);
}
assert!(
!tree.root.is_leaf,
"test needs a multi-level tree (internal root)"
);
tree.root.values.clear();
let proof = tree.generate_proof(b"key-00000042");
let _ = tree.verify(proof, b"key-00000042", None);
}
#[test]
fn bug_proof_on_underfull_internal_node_does_not_panic() {
let mut tree = ProllyTree::new(InMemoryNodeStorage::<32>::default(), splitty_config());
for i in 0..500u32 {
tree.insert(
format!("key-{i:08}").into_bytes(),
format!("v{i}").into_bytes(),
);
}
assert!(
!tree.root.is_leaf,
"test needs a multi-level tree (internal root)"
);
tree.root.values.pop();
let proof = tree.generate_proof(b"key-99999999");
let _ = tree.verify(proof, b"key-99999999", None);
}
#[test]
fn proof_roundtrip_multilevel() {
let mut tree = ProllyTree::new(InMemoryNodeStorage::<32>::default(), splitty_config());
for i in 0..500u32 {
tree.insert(
format!("key-{i:08}").into_bytes(),
format!("v{i}").into_bytes(),
);
}
let key = b"key-00000042";
let proof = tree.generate_proof(key);
assert!(
tree.verify(proof, key, None),
"valid proof for a present key must verify"
);
let absent = b"key-does-not-exist";
let proof = tree.generate_proof(absent);
assert!(
!tree.verify(proof, absent, None),
"absent key must not verify"
);
}