mod helpers;
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_new_returns_ok() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let store = CoinStore::new(dir.path());
assert!(
store.is_ok(),
"CoinStore::new() must return Ok for valid path"
);
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_with_config_returns_ok() {
use dig_coinstore::coin_store::CoinStore;
use dig_coinstore::config::CoinStoreConfig;
let dir = helpers::temp_dir();
let config = CoinStoreConfig::default_with_path(dir.path());
let store = CoinStore::with_config(config);
assert!(store.is_ok(), "CoinStore::with_config() must return Ok");
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_empty_before_genesis() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let store = CoinStore::new(dir.path()).unwrap();
assert!(store.is_empty(), "Store must be empty before genesis");
assert_eq!(store.height(), 0, "Height must be 0 before genesis");
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_init_genesis_with_coins() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let mut store = CoinStore::new(dir.path()).unwrap();
let coin1 = helpers::test_coin(1, 10, 1_000_000);
let coin2 = helpers::test_coin(2, 20, 2_000_000);
let initial_coins = vec![(coin1, false), (coin2, true)];
let result = store.init_genesis(initial_coins, 1_700_000_000);
assert!(result.is_ok(), "init_genesis must succeed");
let state_root = result.unwrap();
assert_ne!(
state_root,
dig_coinstore::Bytes32::from([0u8; 32]),
"Genesis state root must be non-zero when coins exist"
);
assert_eq!(store.height(), 0, "Height must be 0 after genesis");
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_init_genesis_empty_coins() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let mut store = CoinStore::new(dir.path()).unwrap();
let result = store.init_genesis(vec![], 1_700_000_000);
assert!(result.is_ok(), "Empty genesis must succeed");
assert_eq!(store.height(), 0);
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_double_genesis_rejected() {
use dig_coinstore::coin_store::CoinStore;
use dig_coinstore::error::CoinStoreError;
let dir = helpers::temp_dir();
let mut store = CoinStore::new(dir.path()).unwrap();
store.init_genesis(vec![], 1_700_000_000).unwrap();
let result = store.init_genesis(vec![], 1_700_000_001);
assert!(
matches!(result, Err(CoinStoreError::GenesisAlreadyInitialized)),
"Double genesis must return GenesisAlreadyInitialized, got: {:?}",
result
);
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_001_reopen_existing_store() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
{
let mut store = CoinStore::new(dir.path()).unwrap();
let coin = helpers::test_coin(1, 10, 1_000);
store
.init_genesis(vec![(coin, false)], 1_700_000_000)
.unwrap();
}
{
let store = CoinStore::new(dir.path()).unwrap();
assert!(!store.is_empty(), "Re-opened store must not be empty");
assert_eq!(store.height(), 0, "Re-opened store must preserve height");
}
}