#![forbid(unsafe_code)]
#[path = "common/mod.rs"]
#[allow(dead_code)]
mod common;
use dig_blockstore::BlockStore;
use common::{build_chain, temp_blockstore_dir, test_config};
#[test]
fn test_blocks_to_revert_basic() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(10);
for block in &chain {
store.extend_chain(block).expect("extend");
}
let reverted = store.blocks_to_revert(5).expect("preview");
assert_eq!(reverted.len(), 4, "should include heights 9,8,7,6");
assert_eq!(reverted[0], chain[9].hash(), "tip hash first");
assert_eq!(reverted[1], chain[8].hash());
assert_eq!(reverted[2], chain[7].hash());
assert_eq!(reverted[3], chain[6].hash(), "height 6 last");
}
#[test]
fn test_blocks_to_revert_no_tip() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let reverted = store.blocks_to_revert(0).expect("preview");
assert!(reverted.is_empty());
}
#[test]
fn test_blocks_to_revert_at_tip() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(5);
for block in &chain {
store.extend_chain(block).expect("extend");
}
assert!(store.blocks_to_revert(4).expect("at tip").is_empty());
assert!(store.blocks_to_revert(10).expect("above tip").is_empty());
}
#[test]
fn test_blocks_to_revert_to_zero() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(5);
for block in &chain {
store.extend_chain(block).expect("extend");
}
let reverted = store.blocks_to_revert(0).expect("to zero");
assert_eq!(reverted.len(), 4, "heights 4,3,2,1 reverted (not 0)");
assert_eq!(reverted[0], chain[4].hash(), "tip first");
assert_eq!(reverted[3], chain[1].hash(), "height 1 last");
}
#[test]
fn test_blocks_to_revert_no_mutation() {
let (_guard, path) = temp_blockstore_dir();
let store = BlockStore::open(test_config(path)).expect("open");
let chain = build_chain(5);
for block in &chain {
store.extend_chain(block).expect("extend");
}
let tip_before = store.tip();
let _ = store.blocks_to_revert(2).expect("preview");
assert_eq!(store.tip(), tip_before, "tip unchanged");
for (i, block) in chain.iter().enumerate() {
let hash = store
.get_hash_by_height(i as u64)
.expect("h")
.expect("still canonical");
assert_eq!(hash, block.hash());
}
}