From bb573d5b855f2b58061d4d8a13c90906dd05f8f0 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sun, 4 Sep 2022 08:47:17 +0200 Subject: [PATCH] Add some tests for remove_prefix --- src/trie/trie_structure/tests.rs | 281 +++++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) diff --git a/src/trie/trie_structure/tests.rs b/src/trie/trie_structure/tests.rs index 798f6f864d..5de123e83f 100644 --- a/src/trie/trie_structure/tests.rs +++ b/src/trie/trie_structure/tests.rs @@ -325,6 +325,287 @@ fn insert_branch() { .has_storage_value()); } +#[test] +fn remove_prefix_basic() { + let mut trie = TrieStructure::new(); + + trie.node([Nibble::try_from(1).unwrap()].iter().cloned()) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(4).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(4).unwrap(), + Nibble::try_from(5).unwrap(), + Nibble::try_from(6).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.remove_prefix( + [Nibble::try_from(1).unwrap(), Nibble::try_from(2).unwrap()] + .iter() + .cloned(), + ); + + assert_eq!(trie.len(), 1); + assert!(trie + .node([Nibble::try_from(1).unwrap(),].iter().cloned(),) + .into_occupied() + .unwrap() + .has_storage_value()); +} + +#[test] +fn remove_prefix_clear_all() { + let mut trie = TrieStructure::new(); + + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(4).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(4).unwrap(), + Nibble::try_from(5).unwrap(), + Nibble::try_from(6).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.remove_prefix( + [Nibble::try_from(1).unwrap(), Nibble::try_from(2).unwrap()] + .iter() + .cloned(), + ); + + assert!(trie.is_empty()); +} + +#[test] +fn remove_prefix_exact() { + let mut trie = TrieStructure::new(); + + trie.node([Nibble::try_from(1).unwrap()].iter().cloned()) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + Nibble::try_from(4).unwrap(), + Nibble::try_from(5).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + Nibble::try_from(4).unwrap(), + Nibble::try_from(6).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.remove_prefix( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ); + + assert_eq!(trie.len(), 1); + assert!(trie + .node([Nibble::try_from(1).unwrap(),].iter().cloned(),) + .into_occupied() + .unwrap() + .has_storage_value()); +} + +#[test] +fn remove_prefix_doesnt_match_anything() { + let mut trie = TrieStructure::new(); + + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.remove_prefix( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(5).unwrap(), + ] + .iter() + .cloned(), + ); + + assert_eq!(trie.len(), 1); + assert!(trie + .node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_occupied() + .unwrap() + .has_storage_value()); +} + +#[test] +fn remove_prefix_nothing_to_remove() { + let mut trie = TrieStructure::new(); + + trie.node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_vacant() + .unwrap() + .insert_storage_value() + .insert((), ()); + + trie.remove_prefix( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + Nibble::try_from(4).unwrap(), + ] + .iter() + .cloned(), + ); + + assert_eq!(trie.len(), 1); + assert!(trie + .node( + [ + Nibble::try_from(1).unwrap(), + Nibble::try_from(2).unwrap(), + Nibble::try_from(3).unwrap(), + ] + .iter() + .cloned(), + ) + .into_occupied() + .unwrap() + .has_storage_value()); +} + #[test] fn fuzzing() { fn uniform_sample(min: u8, max: u8) -> u8 {