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    Rpo256, ValuePath, Vec, Word,
  4};
  5
  6// TEST DATA
  7// ================================================================================================
  8
  9const NODE10: NodeIndex = NodeIndex::new_unchecked(1, 0);
 10const NODE11: NodeIndex = NodeIndex::new_unchecked(1, 1);
 11
 12const NODE20: NodeIndex = NodeIndex::new_unchecked(2, 0);
 13const NODE22: NodeIndex = NodeIndex::new_unchecked(2, 2);
 14const NODE23: NodeIndex = NodeIndex::new_unchecked(2, 3);
 15
 16const NODE32: NodeIndex = NodeIndex::new_unchecked(3, 2);
 17const NODE33: NodeIndex = NodeIndex::new_unchecked(3, 3);
 18
 19const VALUES8: [Word; 8] = [
 20    int_to_node(1),
 21    int_to_node(2),
 22    int_to_node(3),
 23    int_to_node(4),
 24    int_to_node(5),
 25    int_to_node(6),
 26    int_to_node(7),
 27    int_to_node(8),
 28];
 29
 30// TESTS
 31// ================================================================================================
 32
 33// with_paths CONSTRUCTOR TESTS
 34// ------------------------------------------------------------------------------------------------
 35
 36#[test]
 37fn get_root() {
 38    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 39    let expected_root = mt.root();
 40
 41    let ms = MerkleStore::from(&mt);
 42
 43    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 44
 45    let pmt = PartialMerkleTree::with_paths([(3, path33.value.into(), path33.path)]).unwrap();
 46
 47    assert_eq!(pmt.root(), expected_root.into());
 48}
 49
 50#[test]
 51fn add_and_get_paths() {
 52    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 53    let expected_root = mt.root();
 54
 55    let ms = MerkleStore::from(&mt);
 56
 57    let expected_path33 = ms.get_path(expected_root, NODE33).unwrap();
 58    let expected_path22 = ms.get_path(expected_root, NODE22).unwrap();
 59
 60    let mut pmt = PartialMerkleTree::new();
 61    pmt.add_path(3, expected_path33.value.into(), expected_path33.path.clone())
 62        .unwrap();
 63    pmt.add_path(2, expected_path22.value.into(), expected_path22.path.clone())
 64        .unwrap();
 65
 66    let path33 = pmt.get_path(NODE33).unwrap();
 67    let path22 = pmt.get_path(NODE22).unwrap();
 68    let actual_root = pmt.root();
 69
 70    assert_eq!(expected_path33.path, path33);
 71    assert_eq!(expected_path22.path, path22);
 72    assert_eq!(expected_root, *actual_root);
 73}
 74
 75#[test]
 76fn get_node() {
 77    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 78    let expected_root = mt.root();
 79
 80    let ms = MerkleStore::from(&mt);
 81
 82    let path33 = ms.get_path(expected_root, NODE33).unwrap();
 83
 84    let pmt = PartialMerkleTree::with_paths([(3, path33.value.into(), path33.path)]).unwrap();
 85
 86    assert_eq!(ms.get_node(expected_root, NODE32).unwrap(), *pmt.get_node(NODE32).unwrap());
 87    assert_eq!(ms.get_node(expected_root, NODE10).unwrap(), *pmt.get_node(NODE10).unwrap());
 88}
 89
 90#[test]
 91fn update_leaf() {
 92    let mut mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
 93    let root = mt.root();
 94
 95    let ms = MerkleStore::from(&mt);
 96    let path33 = ms.get_path(root, NODE33).unwrap();
 97
 98    let mut pmt = PartialMerkleTree::with_paths([(3, path33.value.into(), path33.path)]).unwrap();
 99
100    let new_value32 = int_to_node(132);
101    mt.update_leaf(2, 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    let mut new_vals = VALUES8.clone();
110    new_vals[1] = int_to_node(131);
111    new_vals[2] = int_to_node(132);
112    let new_value20 = Rpo256::merge(&[new_vals[0].into(), new_vals[1].into()]);
113    let mt = MerkleTree::new(new_vals.to_vec()).unwrap();
114    let expected_root = mt.root();
115
116    pmt.update_leaf(NODE20, new_value20).unwrap();
117    let actual_root = pmt.root();
118
119    assert_eq!(expected_root, *actual_root);
120}
121
122#[test]
123fn check_leaf_depth() {
124    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
125    let expected_root = mt.root();
126
127    let ms = MerkleStore::from(&mt);
128
129    let path33 = ms.get_path(expected_root, NODE33).unwrap();
130
131    let pmt = PartialMerkleTree::with_paths([(3, path33.value.into(), path33.path)]).unwrap();
132
133    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(4, 1)), 2);
134    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(4, 6)), 3);
135    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(4, 10)), 1);
136
137    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(3, 1)), 2);
138    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(3, 2)), 3);
139    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(3, 5)), 1);
140    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(3, 7)), 1);
141
142    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(2, 0)), 2);
143    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(2, 1)), 0);
144    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(2, 2)), 1);
145    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(2, 3)), 1);
146
147    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(1, 0)), 0);
148    assert_eq!(pmt.get_leaf_depth(NodeIndex::make(1, 1)), 1);
149}
150
151#[test]
152fn get_paths() {
153    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
154    let expected_root = mt.root();
155
156    let ms = MerkleStore::from(&mt);
157
158    let path33 = ms.get_path(expected_root, NODE33).unwrap();
159    let path22 = ms.get_path(expected_root, NODE22).unwrap();
160
161    let mut pmt = PartialMerkleTree::new();
162    pmt.add_path(3, path33.value.into(), path33.path.clone()).unwrap();
163    pmt.add_path(2, path22.value.into(), path22.path.clone()).unwrap();
164
165    let leaves = vec![NODE20, NODE22, NODE23, NODE32, NODE33];
166    let expected_paths: Vec<(NodeIndex, ValuePath)> = leaves
167        .iter()
168        .map(|&leaf| {
169            (
170                leaf,
171                ValuePath {
172                    value: mt.get_node(leaf).unwrap().into(),
173                    path: mt.get_path(leaf).unwrap(),
174                },
175            )
176        })
177        .collect();
178
179    let actual_paths = pmt.paths();
180
181    assert_eq!(expected_paths, actual_paths);
182}
183
184#[test]
185fn leaves() {
186    let mt = MerkleTree::new(VALUES8.to_vec()).unwrap();
187    let expected_root = mt.root();
188
189    let ms = MerkleStore::from(&mt);
190
191    let path33 = ms.get_path(expected_root, NODE33).unwrap();
192    let path22 = ms.get_path(expected_root, NODE22).unwrap();
193
194    let mut pmt = PartialMerkleTree::with_paths([(3, path33.value.into(), path33.path)]).unwrap();
195
196    let value11 = mt.get_node(NODE11).unwrap().into();
197    let value20 = mt.get_node(NODE20).unwrap().into();
198    let value32 = mt.get_node(NODE32).unwrap().into();
199    let value33 = mt.get_node(NODE33).unwrap().into();
200
201    let leaves = vec![(NODE11, value11), (NODE20, value20), (NODE32, value32), (NODE33, value33)];
202
203    let expected_leaves = leaves.iter().map(|&tuple| tuple);
204    assert!(expected_leaves.eq(pmt.leaves()));
205
206    pmt.add_path(2, path22.value.into(), path22.path).unwrap();
207
208    let value20 = mt.get_node(NODE20).unwrap().into();
209    let value22 = mt.get_node(NODE22).unwrap().into();
210    let value23 = mt.get_node(NODE23).unwrap().into();
211    let value32 = mt.get_node(NODE32).unwrap().into();
212    let value33 = mt.get_node(NODE33).unwrap().into();
213
214    let leaves = vec![
215        (NODE20, value20),
216        (NODE22, value22),
217        (NODE23, value23),
218        (NODE32, value32),
219        (NODE33, value33),
220    ];
221
222    let expected_leaves = leaves.iter().map(|&tuple| tuple);
223    assert!(expected_leaves.eq(pmt.leaves()));
224}