use blvm_consensus::{
mining::{calculate_merkle_root, generate_block_template},
optimizations::simd_vectorization,
serialization::{block::serialize_block, transaction::serialize_transaction},
types::{Block, BlockHeader, Transaction},
ConsensusProof, ValidationResult, UtxoSet,
};
#[test]
fn test_block_validation_correctness() {
let block = create_test_block();
let utxo_set = UtxoSet::default();
let consensus = ConsensusProof::new();
let witnesses: Vec<blvm_consensus::segwit::Witness> =
block.transactions.iter().map(|_| Vec::new()).collect();
let time_context = None;
let network = blvm_consensus::types::Network::Mainnet;
let result = consensus.validate_block_with_time_context(
&block,
&witnesses,
utxo_set,
0,
time_context,
network,
);
let _ = result;
}
#[test]
fn test_batch_hashing_integration() {
#[cfg(feature = "production")]
{
let transactions = create_test_transactions(100);
let serialized: Vec<Vec<u8>> = transactions
.iter()
.map(|tx| serialize_transaction(tx))
.collect();
let tx_refs: Vec<&[u8]> = serialized.iter().map(|v| v.as_slice()).collect();
let aligned_hashes = simd_vectorization::batch_double_sha256_aligned(&tx_refs);
let regular_hashes = simd_vectorization::batch_double_sha256(&tx_refs);
assert_eq!(aligned_hashes.len(), transactions.len());
assert_eq!(regular_hashes.len(), transactions.len());
for (aligned, regular) in aligned_hashes.iter().zip(regular_hashes.iter()) {
assert_eq!(aligned.as_bytes(), regular);
}
}
}
#[test]
fn test_merkle_root_large_transaction_set() {
let transactions = create_test_transactions(2000);
let root = calculate_merkle_root(&transactions).expect("Should calculate merkle root");
assert_eq!(root.len(), 32);
let root2 = calculate_merkle_root(&transactions).expect("Should calculate merkle root again");
assert_eq!(root, root2, "Merkle root should be deterministic");
}
#[test]
fn test_serialization_round_trip() {
use blvm_consensus::serialization::transaction::deserialize_transaction;
let tx = create_test_transaction();
let serialized = serialize_transaction(&tx);
let deserialized = deserialize_transaction(&serialized)
.expect("Should deserialize transaction");
assert_eq!(tx.version, deserialized.version);
assert_eq!(tx.inputs.len(), deserialized.inputs.len());
assert_eq!(tx.outputs.len(), deserialized.outputs.len());
assert_eq!(tx.lock_time, deserialized.lock_time);
}
#[test]
#[cfg(feature = "production")]
#[cfg(feature = "rayon")]
fn test_batch_operations_parallel() {
let transactions = create_test_transactions(1000);
let serialized: Vec<Vec<u8>> = {
use rayon::prelude::*;
transactions
.par_iter()
.map(|tx| serialize_transaction(tx))
.collect()
};
let tx_refs: Vec<&[u8]> = serialized.iter().map(|v| v.as_slice()).collect();
let hashes = simd_vectorization::batch_double_sha256(&tx_refs);
assert_eq!(hashes.len(), transactions.len());
}
#[test]
fn test_optimizations_edge_cases() {
let empty_txs: Vec<Transaction> = vec![];
assert!(calculate_merkle_root(&empty_txs).is_err());
let single_tx = vec![create_test_transaction()];
let root = calculate_merkle_root(&single_tx).expect("Should work for single tx");
assert_eq!(root.len(), 32);
let large_tx = {
let mut tx = create_test_transaction();
tx.outputs[0].script_pubkey = vec![0u8; 10000];
tx
};
let serialized = serialize_transaction(&large_tx);
assert!(serialized.len() > 10000);
}