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)