|
1 |
| -use miden_crypto::{hash::rpo::RpoDigest, ONE}; |
| 1 | +use miden_crypto::{hash::rpo::RpoDigest, Felt, ONE}; |
2 | 2 |
|
3 | 3 | use super::*;
|
4 | 4 | use crate::{Decorator, Operation};
|
@@ -794,3 +794,54 @@ fn mast_forest_merge_invalid_decorator_index() {
|
794 | 794 | let err = MastForest::merge([&forest_a, &forest_b]).unwrap_err();
|
795 | 795 | assert_matches!(err, MastForestError::DecoratorIdOverflow(_, _));
|
796 | 796 | }
|
| 797 | + |
| 798 | +/// Tests that forest's advice maps are merged correctly. |
| 799 | +#[test] |
| 800 | +fn mast_forest_merge_advice_maps_merged() { |
| 801 | + let mut forest_a = MastForest::new(); |
| 802 | + let id_foo = forest_a.add_node(block_foo()).unwrap(); |
| 803 | + let id_call_a = forest_a.add_call(id_foo).unwrap(); |
| 804 | + forest_a.make_root(id_call_a); |
| 805 | + let key_a = RpoDigest::new([Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]); |
| 806 | + let value_a = vec![ONE, ONE]; |
| 807 | + forest_a.advice_map_mut().insert(key_a, value_a.clone()); |
| 808 | + |
| 809 | + let mut forest_b = MastForest::new(); |
| 810 | + let id_bar = forest_b.add_node(block_bar()).unwrap(); |
| 811 | + let id_call_b = forest_b.add_call(id_bar).unwrap(); |
| 812 | + forest_b.make_root(id_call_b); |
| 813 | + let key_b = RpoDigest::new([Felt::new(1), Felt::new(3), Felt::new(2), Felt::new(1)]); |
| 814 | + let value_b = vec![Felt::new(2), Felt::new(2)]; |
| 815 | + forest_b.advice_map_mut().insert(key_b, value_b.clone()); |
| 816 | + |
| 817 | + let (merged, _root_maps) = MastForest::merge([&forest_a, &forest_b]).unwrap(); |
| 818 | + |
| 819 | + let merged_advice_map = merged.advice_map(); |
| 820 | + assert_eq!(merged_advice_map.len(), 2); |
| 821 | + assert_eq!(merged_advice_map.get(&key_a).unwrap(), &value_a); |
| 822 | + assert_eq!(merged_advice_map.get(&key_b).unwrap(), &value_b); |
| 823 | +} |
| 824 | + |
| 825 | +/// Tests that an error is returned when advice maps have a key collision. |
| 826 | +#[test] |
| 827 | +fn mast_forest_merge_advice_maps_collision() { |
| 828 | + let mut forest_a = MastForest::new(); |
| 829 | + let id_foo = forest_a.add_node(block_foo()).unwrap(); |
| 830 | + let id_call_a = forest_a.add_call(id_foo).unwrap(); |
| 831 | + forest_a.make_root(id_call_a); |
| 832 | + let key_a = RpoDigest::new([Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]); |
| 833 | + let value_a = vec![ONE, ONE]; |
| 834 | + forest_a.advice_map_mut().insert(key_a, value_a.clone()); |
| 835 | + |
| 836 | + let mut forest_b = MastForest::new(); |
| 837 | + let id_bar = forest_b.add_node(block_bar()).unwrap(); |
| 838 | + let id_call_b = forest_b.add_call(id_bar).unwrap(); |
| 839 | + forest_b.make_root(id_call_b); |
| 840 | + // The key collides with key_a in the forest_a. |
| 841 | + let key_b = key_a; |
| 842 | + let value_b = vec![Felt::new(2), Felt::new(2)]; |
| 843 | + forest_b.advice_map_mut().insert(key_b, value_b.clone()); |
| 844 | + |
| 845 | + let err = MastForest::merge([&forest_a, &forest_b]).unwrap_err(); |
| 846 | + assert_matches!(err, MastForestError::AdviceMapKeyCollisionOnMerge(_)); |
| 847 | +} |
0 commit comments