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)