arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
miden-crypto/src/merkle/partial_mt/tests.rs
src/merkle/partial_mt/tests.rsRaw
  1use super::{
  2    super::{int_to_node, MerkleStore, MerkleTree, NodeIndex, PartialMerkleTree},
  3    Word,
  4};
  5
  6// TEST DATA
  7// ================================================================================================
  8
  9const NODE10: NodeIndex = NodeIndex::new_unchecked(1, 0);
 10
 11const NODE22: NodeIndex = NodeIndex::new_unchecked(2, 2);
 12
 13const NODE32: NodeIndex = NodeIndex::new_unchecked(3, 2);
 14const NODE33: NodeIndex = NodeIndex::new_unchecked(3, 3);
 15
 16const VALUES8: [Word; 8] = [
 17    int_to_node(1),
 18    int_to_node(2),
 19    int_to_node(3),
 20    int_to_node(4),
 21    int_to_node(5),
 22    int_to_node(6),
 23    int_to_node(7),
 24    int_to_node(8),
 25];
 26
 27// TESTS
 28// ================================================================================================
 29
 30// with_paths CONSTRUCTOR TESTS
 31// ------------------------------------------------------------------------------------------------
 32
 33#[test]
 34fn get_root() {
 35    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 36    let expected_root = mt.root();
 37
 38    let mut store = MerkleStore::new();
 39    let ms = MerkleStore::extend(&mut store, mt.inner_nodes());
 40
 41    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 42
 43    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 44
 45    assert_eq!(pmt.root(), expected_root.into());
 46}
 47
 48#[test]
 49fn add_and_get_paths() {
 50    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 51    let expected_root = mt.root();
 52
 53    let mut store = MerkleStore::new();
 54    let ms = MerkleStore::extend(&mut store, mt.inner_nodes());
 55
 56    let expected_path33 = ms.get_path(expected_root, NODE33).unwrap();
 57    let expected_path22 = ms.get_path(expected_root, NODE22).unwrap();
 58
 59    let pmt = PartialMerkleTree::with_paths([
 60        (3_u64, expected_path33.value.into(), expected_path33.path.clone()),
 61        (2, expected_path22.value.into(), expected_path22.path.clone()),
 62    ])
 63    .unwrap();
 64
 65    let path33 = pmt.get_path(NODE33).unwrap();
 66    let path22 = pmt.get_path(NODE22).unwrap();
 67
 68    assert_eq!(expected_path33.path, path33);
 69    assert_eq!(expected_path22.path, path22);
 70}
 71
 72#[test]
 73fn get_node() {
 74    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 75    let expected_root = mt.root();
 76
 77    let mut store = MerkleStore::new();
 78    let ms = MerkleStore::extend(&mut store, mt.inner_nodes());
 79
 80    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 81
 82    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 83
 84    assert_eq!(ms.get_node(expected_root, NODE32).unwrap(), *pmt.get_node(NODE32).unwrap());
 85    assert_eq!(ms.get_node(expected_root, NODE10).unwrap(), *pmt.get_node(NODE10).unwrap());
 86}
 87
 88#[test]
 89fn update_leaf() {
 90    let mut mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 91    let root = mt.root();
 92
 93    let mut store = MerkleStore::new();
 94    let ms = MerkleStore::extend(&mut store, mt.inner_nodes());
 95    let path33 = ms.get_path(root, NODE33).unwrap();
 96
 97    let mut pmt =
 98        PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 99
100    let new_value32 = int_to_node(132);
101    mt.update_leaf(2_u64, new_value32).unwrap();
102    let expected_root = mt.root();
103
104    pmt.update_leaf(NODE32, new_value32.into()).unwrap();
105    let actual_root = pmt.root();
106
107    assert_eq!(expected_root, *actual_root);
108}
109
110#[test]
111fn check_leaf_depth() {
112    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
113    let expected_root = mt.root();
114
115    let mut store = MerkleStore::new();
116    let ms = MerkleStore::extend(&mut store, mt.inner_nodes());
117
118    let path33 = ms.get_path(expected_root, NODE33).unwrap();
119
120    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
121
122    assert_eq!(pmt.get_leaf_depth(0).unwrap(), 2);
123    assert_eq!(pmt.get_leaf_depth(1).unwrap(), 2);
124    assert_eq!(pmt.get_leaf_depth(2).unwrap(), 3);
125    assert_eq!(pmt.get_leaf_depth(3).unwrap(), 3);
126    assert_eq!(pmt.get_leaf_depth(4).unwrap(), 1);
127    assert_eq!(pmt.get_leaf_depth(5).unwrap(), 1);
128    assert_eq!(pmt.get_leaf_depth(6).unwrap(), 1);
129    assert_eq!(pmt.get_leaf_depth(7).unwrap(), 1);
130    assert!(pmt.get_leaf_depth(8).is_err());
131}
132
133// TODO: add test for add_path function and check correctness of leaf determination (requires
134// inner_nodes iter)