use blvm_consensus::opcodes::OP_1;
use blvm_consensus::{
mining::calculate_merkle_root,
optimizations::{prealloc_block_buffer, prealloc_tx_buffer},
serialization::transaction::serialize_transaction,
types::{OutPoint, Transaction, TransactionInput, TransactionOutput},
};
fn create_test_transaction() -> Transaction {
Transaction {
version: 1,
inputs: vec![TransactionInput {
prevout: OutPoint {
hash: [1; 32].into(),
index: 0,
},
script_sig: vec![OP_1], sequence: 0xffffffff,
}]
.into(),
outputs: vec![TransactionOutput {
value: 1000,
script_pubkey: vec![OP_1].into(), }]
.into(),
lock_time: 0,
}
}
fn create_test_transactions(count: usize) -> Vec<Transaction> {
(0..count)
.map(|i| {
let mut tx = create_test_transaction();
tx.inputs[0].prevout.index = i as u32;
tx
})
.collect()
}
#[test]
#[cfg(feature = "production")]
fn test_preallocation_reduces_reallocations() {
let tx = create_test_transaction();
let serialized = serialize_transaction(&tx);
#[cfg(feature = "production")]
{
assert!(serialized.len() > 0);
}
}
#[test]
#[cfg(feature = "production")]
fn test_batch_operations_memory_patterns() {
use blvm_consensus::optimizations::simd_vectorization;
let transactions = create_test_transactions(1000);
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);
assert_eq!(aligned_hashes.len(), 1000);
}
#[test]
#[cfg(feature = "production")]
fn test_merkle_root_memory_allocation() {
let transactions = create_test_transactions(500);
let root = calculate_merkle_root(&transactions).expect("Should calculate merkle root");
assert_eq!(root.len(), 32);
}
#[test]
#[cfg(feature = "production")]
fn test_preallocation_buffer_sizes() {
let tx_buffer = prealloc_tx_buffer();
assert!(
tx_buffer.capacity() >= 100_000,
"Transaction buffer should be pre-allocated"
);
let block_buffer = prealloc_block_buffer();
assert!(
block_buffer.capacity() >= 1_000_000,
"Block buffer should be pre-allocated"
);
}
#[test]
#[cfg(feature = "production")]
fn test_memory_usage_scaling() {
for count in [10, 100, 500, 1000].iter() {
let transactions = create_test_transactions(*count);
let serialized: Vec<Vec<u8>> = transactions
.iter()
.map(|tx| serialize_transaction(tx))
.collect();
assert_eq!(serialized.len(), *count);
}
}
#[test]
#[cfg(feature = "production")]
fn test_cache_alignment_impact() {
use blvm_consensus::optimizations::simd_vectorization;
let transactions = create_test_transactions(1000);
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(), regular_hashes.len());
}
#[test]
#[cfg(feature = "production")]
fn test_memory_fragmentation() {
for _ in 0..1000 {
let tx = create_test_transaction();
let _serialized = serialize_transaction(&tx);
}
}