use self::chain::txhashset::BitmapAccumulator;
use self::core::core::hash::Hash;
use self::core::ser::PMMRIndexHashable;
use bit_vec::BitVec;
use epic_chain as chain;
use epic_core as core;
use epic_util as util;
#[test]
fn test_bitmap_accumulator() {
util::init_test_logger();
let mut accumulator = BitmapAccumulator::new();
assert_eq!(accumulator.root(), Hash::default());
accumulator.apply(vec![0], vec![0], 1).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(0, true);
bit_vec.to_bytes().hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![0], vec![0, 1], 2).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(0, true);
bit_vec.set(1, true);
bit_vec.to_bytes().hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![0], vec![1], 2).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
let expected_bytes = bit_vec.to_bytes();
expected_bytes.hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![1], vec![1], 2).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
let expected_bytes = bit_vec.to_bytes();
expected_bytes.hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![0], vec![1, 1023], 1024).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
bit_vec.set(1023, true);
let expected_bytes = bit_vec.to_bytes();
expected_bytes.hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator
.apply(vec![0], vec![1, 1023, 1024], 1025)
.unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
bit_vec.set(1023, true);
let mut bit_vec2 = BitVec::from_elem(1024, false);
bit_vec2.set(0, true);
let expected_bytes_0 = bit_vec.to_bytes();
let expected_bytes_1 = bit_vec2.to_bytes();
let expected_hash_0 = expected_bytes_0.hash_with_index(0);
let expected_hash_1 = expected_bytes_1.hash_with_index(1);
(expected_hash_0, expected_hash_1).hash_with_index(2)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![1025], vec![1025], 1026).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
bit_vec.set(1023, true);
let mut bit_vec2 = BitVec::from_elem(1024, false);
bit_vec2.set(1, true);
let expected_bytes_0 = bit_vec.to_bytes();
let expected_bytes_1 = bit_vec2.to_bytes();
let expected_hash_0 = expected_bytes_0.hash_with_index(0);
let expected_hash_1 = expected_bytes_1.hash_with_index(1);
(expected_hash_0, expected_hash_1).hash_with_index(2)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![1], vec![1, 1025], 1026).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1, true);
let mut bit_vec2 = BitVec::from_elem(1024, false);
bit_vec2.set(1, true);
let expected_bytes_0 = bit_vec.to_bytes();
let expected_bytes_1 = bit_vec2.to_bytes();
let expected_hash_0 = expected_bytes_0.hash_with_index(0);
let expected_hash_1 = expected_bytes_1.hash_with_index(1);
(expected_hash_0, expected_hash_1).hash_with_index(2)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![1], vec![1025], 1026).unwrap();
let expected_hash = {
let bit_vec = BitVec::from_elem(1024, false);
let mut bit_vec2 = BitVec::from_elem(1024, false);
bit_vec2.set(1, true);
let expected_bytes_0 = bit_vec.to_bytes();
let expected_bytes_1 = bit_vec2.to_bytes();
let expected_hash_0 = expected_bytes_0.hash_with_index(0);
let expected_hash_1 = expected_bytes_1.hash_with_index(1);
(expected_hash_0, expected_hash_1).hash_with_index(2)
};
assert_eq!(accumulator.root(), expected_hash);
accumulator.apply(vec![1023], vec![1023], 1024).unwrap();
let expected_hash = {
let mut bit_vec = BitVec::from_elem(1024, false);
bit_vec.set(1023, true);
let expected_bytes = bit_vec.to_bytes();
expected_bytes.hash_with_index(0)
};
assert_eq!(accumulator.root(), expected_hash);
let mut accumulator = BitmapAccumulator::new();
accumulator.apply(vec![4095], vec![4095], 4096).unwrap();
let expected_hash = {
let bit_vec0 = BitVec::from_elem(1024, false);
let bit_vec1 = BitVec::from_elem(1024, false);
let bit_vec2 = BitVec::from_elem(1024, false);
let mut bit_vec3 = BitVec::from_elem(1024, false);
bit_vec3.set(1023, true);
let expected_bytes_0 = bit_vec0.to_bytes();
let expected_bytes_1 = bit_vec1.to_bytes();
let expected_bytes_2 = bit_vec2.to_bytes();
let expected_bytes_3 = bit_vec3.to_bytes();
let expected_hash_0 = expected_bytes_0.hash_with_index(0);
let expected_hash_1 = expected_bytes_1.hash_with_index(1);
let expected_hash_2 = (expected_hash_0, expected_hash_1).hash_with_index(2);
let expected_hash_3 = expected_bytes_2.hash_with_index(3);
let expected_hash_4 = expected_bytes_3.hash_with_index(4);
let expected_hash_5 = (expected_hash_3, expected_hash_4).hash_with_index(5);
(expected_hash_2, expected_hash_5).hash_with_index(6)
};
assert_eq!(accumulator.root(), expected_hash);
}