181 lines
5.3 KiB
Rust
181 lines
5.3 KiB
Rust
use radixtree::{Node, NodeRef};
|
|
|
|
#[test]
|
|
fn test_node_serialization() {
|
|
// Create a node with some data
|
|
let node = Node {
|
|
key_segment: "test".to_string(),
|
|
value: b"test_value".to_vec(),
|
|
children: vec![
|
|
NodeRef {
|
|
key_part: "child1".to_string(),
|
|
node_id: 1,
|
|
},
|
|
NodeRef {
|
|
key_part: "child2".to_string(),
|
|
node_id: 2,
|
|
},
|
|
],
|
|
is_leaf: true,
|
|
};
|
|
|
|
// Serialize the node
|
|
let serialized = node.serialize();
|
|
|
|
// Deserialize the node
|
|
let deserialized = Node::deserialize(&serialized).expect("Failed to deserialize node");
|
|
|
|
// Verify the deserialized node matches the original
|
|
assert_eq!(deserialized.key_segment, node.key_segment);
|
|
assert_eq!(deserialized.value, node.value);
|
|
assert_eq!(deserialized.is_leaf, node.is_leaf);
|
|
assert_eq!(deserialized.children.len(), node.children.len());
|
|
|
|
for (i, child) in node.children.iter().enumerate() {
|
|
assert_eq!(deserialized.children[i].key_part, child.key_part);
|
|
assert_eq!(deserialized.children[i].node_id, child.node_id);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_empty_node_serialization() {
|
|
// Create an empty node
|
|
let node = Node {
|
|
key_segment: "".to_string(),
|
|
value: vec![],
|
|
children: vec![],
|
|
is_leaf: false,
|
|
};
|
|
|
|
// Serialize the node
|
|
let serialized = node.serialize();
|
|
|
|
// Deserialize the node
|
|
let deserialized = Node::deserialize(&serialized).expect("Failed to deserialize node");
|
|
|
|
// Verify the deserialized node matches the original
|
|
assert_eq!(deserialized.key_segment, node.key_segment);
|
|
assert_eq!(deserialized.value, node.value);
|
|
assert_eq!(deserialized.is_leaf, node.is_leaf);
|
|
assert_eq!(deserialized.children.len(), node.children.len());
|
|
}
|
|
|
|
#[test]
|
|
fn test_node_with_many_children() {
|
|
// Create a node with many children
|
|
let mut children = Vec::new();
|
|
for i in 0..100 {
|
|
children.push(NodeRef {
|
|
key_part: format!("child{}", i),
|
|
node_id: i as u32,
|
|
});
|
|
}
|
|
|
|
let node = Node {
|
|
key_segment: "parent".to_string(),
|
|
value: b"parent_value".to_vec(),
|
|
children,
|
|
is_leaf: true,
|
|
};
|
|
|
|
// Serialize the node
|
|
let serialized = node.serialize();
|
|
|
|
// Deserialize the node
|
|
let deserialized = Node::deserialize(&serialized).expect("Failed to deserialize node");
|
|
|
|
// Verify the deserialized node matches the original
|
|
assert_eq!(deserialized.key_segment, node.key_segment);
|
|
assert_eq!(deserialized.value, node.value);
|
|
assert_eq!(deserialized.is_leaf, node.is_leaf);
|
|
assert_eq!(deserialized.children.len(), node.children.len());
|
|
|
|
for (i, child) in node.children.iter().enumerate() {
|
|
assert_eq!(deserialized.children[i].key_part, child.key_part);
|
|
assert_eq!(deserialized.children[i].node_id, child.node_id);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_node_with_large_value() {
|
|
// Create a node with a large value
|
|
let large_value = vec![0u8; 4096]; // 4KB value
|
|
|
|
let node = Node {
|
|
key_segment: "large_value".to_string(),
|
|
value: large_value.clone(),
|
|
children: vec![],
|
|
is_leaf: true,
|
|
};
|
|
|
|
// Serialize the node
|
|
let serialized = node.serialize();
|
|
|
|
// Deserialize the node
|
|
let deserialized = Node::deserialize(&serialized).expect("Failed to deserialize node");
|
|
|
|
// Verify the deserialized node matches the original
|
|
assert_eq!(deserialized.key_segment, node.key_segment);
|
|
assert_eq!(deserialized.value, node.value);
|
|
assert_eq!(deserialized.is_leaf, node.is_leaf);
|
|
assert_eq!(deserialized.children.len(), node.children.len());
|
|
}
|
|
|
|
#[test]
|
|
fn test_version_compatibility() {
|
|
// This test ensures that the serialization format is compatible with version 1
|
|
|
|
// Create a node
|
|
let node = Node {
|
|
key_segment: "test".to_string(),
|
|
value: b"test_value".to_vec(),
|
|
children: vec![
|
|
NodeRef {
|
|
key_part: "child".to_string(),
|
|
node_id: 1,
|
|
},
|
|
],
|
|
is_leaf: true,
|
|
};
|
|
|
|
// Serialize the node
|
|
let serialized = node.serialize();
|
|
|
|
// Verify the first byte is the version byte (1)
|
|
assert_eq!(serialized[0], 1);
|
|
|
|
// Deserialize the node
|
|
let deserialized = Node::deserialize(&serialized).expect("Failed to deserialize node");
|
|
|
|
// Verify the deserialized node matches the original
|
|
assert_eq!(deserialized.key_segment, node.key_segment);
|
|
assert_eq!(deserialized.value, node.value);
|
|
assert_eq!(deserialized.is_leaf, node.is_leaf);
|
|
assert_eq!(deserialized.children.len(), node.children.len());
|
|
}
|
|
|
|
#[test]
|
|
fn test_invalid_serialization() {
|
|
// Test with empty data
|
|
let result = Node::deserialize(&[]);
|
|
assert!(result.is_err());
|
|
|
|
// Test with invalid version
|
|
let result = Node::deserialize(&[2, 0, 0, 0, 0]);
|
|
assert!(result.is_err());
|
|
|
|
// Test with truncated data
|
|
let node = Node {
|
|
key_segment: "test".to_string(),
|
|
value: b"test_value".to_vec(),
|
|
children: vec![],
|
|
is_leaf: true,
|
|
};
|
|
|
|
let serialized = node.serialize();
|
|
let truncated = &serialized[0..serialized.len() / 2];
|
|
|
|
let result = Node::deserialize(truncated);
|
|
assert!(result.is_err());
|
|
}
|