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 ms = MerkleStore::from(&mt);
 39
 40    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 41
 42    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 43
 44    assert_eq!(pmt.root(), expected_root.into());
 45}
 46
 47#[test]
 48fn add_and_get_paths() {
 49    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 50    let expected_root = mt.root();
 51
 52    let ms = MerkleStore::from(&mt);
 53
 54    let expected_path33 = ms.get_path(expected_root, NODE33).unwrap();
 55    let expected_path22 = ms.get_path(expected_root, NODE22).unwrap();
 56
 57    let pmt = PartialMerkleTree::with_paths([
 58        (3_u64, expected_path33.value.into(), expected_path33.path.clone()),
 59        (2, expected_path22.value.into(), expected_path22.path.clone()),
 60    ])
 61    .unwrap();
 62
 63    let path33 = pmt.get_path(NODE33).unwrap();
 64    let path22 = pmt.get_path(NODE22).unwrap();
 65
 66    assert_eq!(expected_path33.path, path33);
 67    assert_eq!(expected_path22.path, path22);
 68}
 69
 70#[test]
 71fn get_node() {
 72    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 73    let expected_root = mt.root();
 74
 75    let ms = MerkleStore::from(&mt);
 76
 77    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 78
 79    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 80
 81    assert_eq!(ms.get_node(expected_root, NODE32).unwrap(), *pmt.get_node(NODE32).unwrap());
 82    assert_eq!(ms.get_node(expected_root, NODE10).unwrap(), *pmt.get_node(NODE10).unwrap());
 83}
 84
 85#[test]
 86fn update_leaf() {
 87    let mut mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 88    let root = mt.root();
 89
 90    let ms = MerkleStore::from(&mt);
 91    let path33 = ms.get_path(root, NODE33).unwrap();
 92
 93    let mut pmt =
 94        PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
 95
 96    let new_value32 = int_to_node(132);
 97    mt.update_leaf(2_u64, new_value32).unwrap();
 98    let expected_root = mt.root();
 99
100    pmt.update_leaf(NODE32, new_value32.into()).unwrap();
101    let actual_root = pmt.root();
102
103    assert_eq!(expected_root, *actual_root);
104}
105
106#[test]
107fn check_leaf_depth() {
108    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
109    let expected_root = mt.root();
110
111    let ms = MerkleStore::from(&mt);
112
113    let path33 = ms.get_path(expected_root, NODE33).unwrap();
114
115    let pmt = PartialMerkleTree::with_paths([(3_u64, path33.value.into(), path33.path)]).unwrap();
116
117    assert_eq!(pmt.get_leaf_depth(0), 2);
118    assert_eq!(pmt.get_leaf_depth(1), 2);
119    assert_eq!(pmt.get_leaf_depth(2), 3);
120    assert_eq!(pmt.get_leaf_depth(3), 3);
121    assert_eq!(pmt.get_leaf_depth(4), 1);
122    assert_eq!(pmt.get_leaf_depth(5), 1);
123    assert_eq!(pmt.get_leaf_depth(6), 1);
124    assert_eq!(pmt.get_leaf_depth(7), 1);
125}
126
127// TODO: add test for add_path function and check correctness of leaf determination (requires
128// inner_nodes iter)