use radix_immutable::StringTrie;
use std::collections::HashSet;
#[test]
fn test_prefix_view_creation() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2)
.insert("world".to_string(), 3);
let view = trie.view_subtrie("hel".to_string());
assert!(view.exists());
assert_eq!(view.prefix(), &"hel".to_string());
assert_eq!(view.trie(), &trie);
assert_eq!(view.len(), 2);
assert!(!view.is_empty());
}
#[test]
fn test_prefix_view_lexicographic_iteration() {
let trie = StringTrie::<String, u32>::new()
.insert("zebra".to_string(), 5)
.insert("apple".to_string(), 1)
.insert("banana".to_string(), 2)
.insert("cherry".to_string(), 3)
.insert("date".to_string(), 4)
.insert("apricot".to_string(), 6)
.insert("blueberry".to_string(), 7)
.insert("blackberry".to_string(), 8);
let view_a = trie.view_subtrie("a".to_string());
let mut a_keys = Vec::new();
for (key, _) in &view_a {
a_keys.push(key.clone());
}
let expected_a_keys = vec!["apple".to_string(), "apricot".to_string()];
assert_eq!(a_keys, expected_a_keys);
let view_b = trie.view_subtrie("b".to_string());
let mut b_keys = Vec::new();
for (key, _) in &view_b {
b_keys.push(key.clone());
}
let expected_b_keys = vec![
"banana".to_string(),
"blackberry".to_string(),
"blueberry".to_string(),
];
assert_eq!(b_keys, expected_b_keys);
let complex_trie = StringTrie::<String, u32>::new()
.insert("abcd".to_string(), 1)
.insert("abce".to_string(), 2)
.insert("abcf".to_string(), 3)
.insert("abcg".to_string(), 4)
.insert("abd".to_string(), 5);
let view_abc = complex_trie.view_subtrie("abc".to_string());
let mut abc_keys = Vec::new();
for (key, _) in &view_abc {
abc_keys.push(key.clone());
}
let expected_abc_keys = vec![
"abcd".to_string(),
"abce".to_string(),
"abcf".to_string(),
"abcg".to_string(),
];
assert_eq!(abc_keys, expected_abc_keys);
}
#[test]
fn test_prefix_view_nonexistent() {
let trie = StringTrie::<String, u32>::new()
.insert("hello".to_string(), 1)
.insert("world".to_string(), 2);
let view = trie.view_subtrie("xyz".to_string());
assert!(!view.exists());
assert_eq!(view.len(), 0);
assert!(view.is_empty());
assert!(!view.contains_key(&"hello".to_string()));
}
#[test]
fn test_prefix_view_subtree_equality() {
let trie1 = StringTrie::<String, u32>::new()
.insert("a".to_string(), 1)
.insert("b".to_string(), 2)
.insert("c".to_string(), 3);
let view1 = trie1.view_subtrie("a".to_string());
let view2 = trie1.view_subtrie("a".to_string());
assert_eq!(view1, view2);
let view3 = trie1.view_subtrie("b".to_string());
assert_ne!(view1, view3);
let trie2 = StringTrie::<String, u32>::new()
.insert("a".to_string(), 1)
.insert("x".to_string(), 9)
.insert("y".to_string(), 10);
let view4 = trie2.view_subtrie("a".to_string());
assert_eq!(view1, view4);
let trie3 = StringTrie::<String, u32>::new().insert("a".to_string(), 99);
let view5 = trie3.view_subtrie("a".to_string());
assert_ne!(view1, view5);
let view6 = trie1.view_subtrie("z".to_string());
let view7 = trie2.view_subtrie("z".to_string());
assert_eq!(view6, view7);
}
#[test]
fn test_prefix_view_equality() {
let trie1 = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2);
let trie2 = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2);
let view1 = trie1.view_subtrie("hel".to_string());
let view2 = trie2.view_subtrie("hel".to_string());
assert_eq!(view1, view2);
let trie3 = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 99) .insert("help".to_string(), 2);
let view3 = trie3.view_subtrie("hel".to_string());
assert_ne!(view1, view3);
}
#[test]
fn test_prefix_view_contains_key() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2)
.insert("world".to_string(), 3);
let view = trie.view_subtrie("hel".to_string());
assert!(view.contains_key(&"hello".to_string()));
assert!(view.contains_key(&"help".to_string()));
assert!(!view.contains_key(&"world".to_string()));
assert!(!view.contains_key(&"he".to_string()));
}
#[test]
fn test_prefix_view_get() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2)
.insert("world".to_string(), 3);
let view = trie.view_subtrie("hel".to_string());
assert_eq!(view.get(&"hello".to_string()), Some(&1));
assert_eq!(view.get(&"help".to_string()), Some(&2));
assert_eq!(view.get(&"world".to_string()), None);
assert_eq!(view.get(&"he".to_string()), None);
}
#[test]
fn test_prefix_view_iter() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2)
.insert("world".to_string(), 3);
let view = trie.view_subtrie("hel".to_string());
let results: HashSet<(String, i32)> = view.iter().collect();
let hello_key = "hello".to_string();
let help_key = "help".to_string();
let expected: HashSet<(String, i32)> =
vec![(hello_key, 1), (help_key, 2)].into_iter().collect();
assert_eq!(results, expected);
}
#[test]
fn test_prefix_view_non_existent_prefix() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2);
let view = trie.view_subtrie("he".to_string());
assert!(view.exists());
assert_eq!(view.len(), 2);
assert!(!view.contains_key(&"he".to_string()));
assert!(view.contains_key(&"hello".to_string()));
assert!(view.contains_key(&"help".to_string()));
}
#[test]
fn test_prefix_view_nested() {
let trie = StringTrie::<String, i32>::new()
.insert("a".to_string(), 1)
.insert("ab".to_string(), 2)
.insert("abc".to_string(), 3)
.insert("abcd".to_string(), 4);
let view_a = trie.view_subtrie("a".to_string());
let view_ab = trie.view_subtrie("ab".to_string());
let view_abc = trie.view_subtrie("abc".to_string());
assert_eq!(view_a.len(), 4);
assert_eq!(view_ab.len(), 3);
assert_eq!(view_abc.len(), 2);
assert!(view_a.contains_key(&"a".to_string()));
assert!(view_a.contains_key(&"abc".to_string()));
assert!(!view_ab.contains_key(&"a".to_string()));
assert!(view_ab.contains_key(&"ab".to_string()));
assert!(view_ab.contains_key(&"abc".to_string()));
assert!(!view_abc.contains_key(&"ab".to_string()));
assert!(view_abc.contains_key(&"abc".to_string()));
assert!(view_abc.contains_key(&"abcd".to_string()));
}
#[test]
fn test_prefix_view_empty_prefix() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("world".to_string(), 2);
let view = trie.view_subtrie("".to_string());
assert!(view.exists());
assert_eq!(view.len(), 2);
assert!(view.contains_key(&"hello".to_string()));
assert!(view.contains_key(&"world".to_string()));
}
#[test]
fn test_prefix_view_cloning() {
let trie = StringTrie::<String, i32>::new()
.insert("hello".to_string(), 1)
.insert("help".to_string(), 2);
let view = trie.view_subtrie("hel".to_string());
let view_clone = view.clone();
assert_eq!(view, view_clone);
assert_eq!(view.len(), view_clone.len());
assert!(view_clone.contains_key(&"hello".to_string()));
assert_eq!(
view.get(&"hello".to_string()),
view_clone.get(&"hello".to_string())
);
assert_eq!(
view.get(&"help".to_string()),
view_clone.get(&"help".to_string())
);
}