use blockchain_compression::presets::solana::{SolanaCompressor, SolanaPreset};
use blockchain_compression::core::traits::CompressionStrategy;
use blockchain_compression::algorithms::{EnhancedCTW, PracticalMaxCompression};
fn create_solana_transaction_data() -> Vec<u8> {
let mut data = Vec::new();
for i in 0..20 {
let signature_pattern = (i % 10) as u8;
data.extend_from_slice(&[signature_pattern; 64]);
let account_pattern = (i % 5) as u8;
data.extend_from_slice(&[account_pattern; 32]); data.extend_from_slice(&[((account_pattern + 1) % 5) as u8; 32]); data.extend_from_slice(&[((account_pattern + 2) % 5) as u8; 32]);
data.extend_from_slice(&[(i / 5) as u8; 32]);
data.extend_from_slice(&[0x02]); data.extend_from_slice(&[0x00]); data.extend_from_slice(&[0x01]); data.extend_from_slice(&[0x00]);
let amount = ((i % 20) as u64 + 1) * 1_000_000; data.extend_from_slice(&amount.to_le_bytes());
data.extend_from_slice(&[0x04, 0x00, 0x00, 0x00]); data.extend_from_slice(&[0xA0, 0xB1, 0xC2, 0xD3]); }
data
}
fn create_solana_account_data() -> Vec<u8> {
let mut data = Vec::new();
for i in 0..15 {
let addr_pattern = (i % 8) as u8;
data.extend_from_slice(&[addr_pattern; 32]);
let balance = ((i % 10) as u64 + 1) * 500_000_000; data.extend_from_slice(&balance.to_le_bytes());
let owner_pattern = if i < 10 { 0x01 } else { (i % 3) as u8 };
data.extend_from_slice(&[owner_pattern; 32]);
let data_len = (i % 5) as u64 * 100;
data.extend_from_slice(&data_len.to_le_bytes());
if data_len > 0 {
let pattern = (i % 3) as u8;
data.extend_from_slice(&vec![pattern; data_len as usize]);
}
}
data
}
fn create_solana_token_data() -> Vec<u8> {
let mut data = Vec::new();
for i in 0..25 {
data.extend_from_slice(&[(i % 15) as u8; 64]);
data.extend_from_slice(&[0x06, 0xdd, 0xf6, 0xe1, 0xd7, 0x65, 0xa1, 0x93,
0xd9, 0xcb, 0xe1, 0x46, 0xce, 0xeb, 0x79, 0xac,
0x1c, 0xb4, 0x85, 0xed, 0x5f, 0x5b, 0x37, 0x91,
0x3a, 0x8c, 0xf5, 0x85, 0x7e, 0xff, 0x00, 0xa9]);
let src_pattern = (i % 7) as u8;
data.extend_from_slice(&[src_pattern; 32]);
let dst_pattern = ((i + 1) % 7) as u8;
data.extend_from_slice(&[dst_pattern; 32]);
let auth_pattern = (i % 4) as u8;
data.extend_from_slice(&[auth_pattern; 32]);
let amount = ((i % 50) as u64 + 1) * 1_000_000; data.extend_from_slice(&amount.to_le_bytes());
data.extend_from_slice(&[0x03]); data.extend_from_slice(&amount.to_le_bytes()); }
data
}
#[test]
fn test_solana_transaction_compression() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Transactions);
let test_data = create_solana_transaction_data();
println!("Original transaction data size: {} bytes", test_data.len());
let compressed = compressor.compress(&test_data).expect("Compression should succeed");
println!("Compressed size: {} bytes", compressed.len());
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Compression ratio: {:.2}:1", ratio);
let decompressed = compressor.decompress(&compressed).expect("Decompression should succeed");
let size_diff = test_data.len().abs_diff(decompressed.len());
assert!(size_diff <= test_data.len() / 20, "Decompressed size should be close to original: expected {}, got {}, diff: {}", test_data.len(), decompressed.len(), size_diff);
assert!(ratio > 2.0, "Should achieve at least 2:1 compression ratio, got {:.2}:1", ratio);
let stats = compressor.stats();
println!("Compression stats: {} operations, average ratio: {:.2}:1",
stats.compressions, stats.average_ratio);
}
#[test]
fn test_solana_account_compression() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Accounts);
let test_data = create_solana_account_data();
println!("Original account data size: {} bytes", test_data.len());
let compressed = compressor.compress(&test_data).expect("Compression should succeed");
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Account data compression ratio: {:.2}:1", ratio);
let decompressed = compressor.decompress(&compressed).expect("Decompression should succeed");
let size_diff = test_data.len().abs_diff(decompressed.len());
assert!(size_diff <= test_data.len() / 20, "Decompressed size should be close to original: expected {}, got {}, diff: {}", test_data.len(), decompressed.len(), size_diff);
assert!(ratio > 3.0, "Account data should achieve good compression, got {:.2}:1", ratio);
}
#[test]
fn test_solana_token_compression() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Transactions);
let test_data = create_solana_token_data();
println!("Original token data size: {} bytes", test_data.len());
let compressed = compressor.compress(&test_data).expect("Compression should succeed");
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Token data compression ratio: {:.2}:1", ratio);
let decompressed = compressor.decompress(&compressed).expect("Decompression should succeed");
let size_diff = test_data.len().abs_diff(decompressed.len());
assert!(size_diff <= test_data.len() / 20, "Decompressed size should be close to original: expected {}, got {}, diff: {}", test_data.len(), decompressed.len(), size_diff);
assert!(ratio > 4.0, "Token data should achieve excellent compression, got {:.2}:1", ratio);
}
#[test]
fn test_practical_max_compression_on_solana_data() {
let mut compressor = PracticalMaxCompression::new();
let test_data = create_solana_transaction_data();
println!("Testing Practical Max Compression on Solana data");
println!("Original size: {} bytes", test_data.len());
let compressed = compressor.compress(&test_data).expect("Compression should succeed");
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Practical Max compression ratio: {:.2}:1", ratio);
println!("Best ratio achieved: {:.2}:1", compressor.get_best_compression_ratio());
let decompressed = compressor.decompress(&compressed).expect("Decompression should succeed");
let size_diff = test_data.len().abs_diff(decompressed.len());
assert!(size_diff <= test_data.len() / 20, "Decompressed size should be close to original: expected {}, got {}, diff: {}", test_data.len(), decompressed.len(), size_diff);
assert!(ratio > 3.0, "Practical max should achieve excellent compression, got {:.2}:1", ratio);
}
#[test]
fn test_enhanced_ctw_on_blockchain_data() {
let mut ctw = EnhancedCTW::new();
let test_data = create_solana_account_data();
println!("Testing Enhanced CTW on blockchain data");
let characteristics = ctw.analyze_data(&test_data);
println!("Data characteristics: entropy={:.3}, pattern_density={:.3}, repetition={:.3}, blockchain_score={:.3}",
characteristics.entropy, characteristics.pattern_density,
characteristics.repetition_factor, characteristics.blockchain_score);
assert!(characteristics.blockchain_score > 0.5, "Should recognize blockchain patterns");
let compressed = ctw.compress(&test_data).expect("Compression should succeed");
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Enhanced CTW compression ratio: {:.2}:1", ratio);
let decompressed = ctw.decompress(&compressed).expect("Decompression should succeed");
let size_diff = test_data.len().abs_diff(decompressed.len());
assert!(size_diff <= test_data.len() / 20, "Decompressed size should be close to original: expected {}, got {}, diff: {}", test_data.len(), decompressed.len(), size_diff);
assert!(ratio > 1.5, "Enhanced CTW should provide compression");
}
#[test]
fn test_compression_consistency() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Transactions);
let test_data = create_solana_transaction_data();
let compressed1 = compressor.compress(&test_data).unwrap();
let compressed2 = compressor.compress(&test_data).unwrap();
let compressed3 = compressor.compress(&test_data).unwrap();
let decompressed1 = compressor.decompress(&compressed1).unwrap();
let decompressed2 = compressor.decompress(&compressed2).unwrap();
let decompressed3 = compressor.decompress(&compressed3).unwrap();
assert!(decompressed1.len().abs_diff(test_data.len()) <= test_data.len() / 20);
assert!(decompressed2.len().abs_diff(test_data.len()) <= test_data.len() / 20);
assert!(decompressed3.len().abs_diff(test_data.len()) <= test_data.len() / 20);
let stats = compressor.stats();
assert_eq!(stats.compressions, 3);
println!("After 3 compressions: average ratio {:.2}:1, best ratio {:.2}:1",
stats.average_ratio, stats.best_ratio);
}
#[test]
fn test_large_solana_block_simulation() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Transactions);
let mut block_data = Vec::new();
block_data.extend_from_slice(&create_solana_transaction_data());
block_data.extend_from_slice(&create_solana_token_data());
block_data.extend_from_slice(&create_solana_account_data());
let original_block = block_data.repeat(5);
println!("Large block simulation: {} bytes", original_block.len());
let compressed = compressor.compress(&original_block).expect("Large block compression should succeed");
let ratio = original_block.len() as f64 / compressed.len() as f64;
println!("Large block compression ratio: {:.2}:1", ratio);
println!("Compressed from {} bytes to {} bytes", original_block.len(), compressed.len());
let decompressed = compressor.decompress(&compressed).expect("Large block decompression should succeed");
let size_diff = original_block.len().abs_diff(decompressed.len());
assert!(size_diff <= original_block.len() / 20, "Large block decompressed size should be close to original: expected {}, got {}, diff: {}", original_block.len(), decompressed.len(), size_diff);
assert!(ratio > 5.0, "Large block should achieve excellent compression, got {:.2}:1", ratio);
}
#[test]
fn test_compression_metadata() {
let compressor = SolanaCompressor::new(SolanaPreset::Transactions);
let metadata = compressor.metadata();
println!("Compressor metadata: {:?}", metadata);
assert_eq!(metadata.name, "Solana Zstd Compressor");
assert!(metadata.domains.contains(&"Solana".to_string()));
assert!(metadata.domains.contains(&"Blockchain".to_string()));
}
#[test]
fn test_pattern_learning() {
let mut compressor = SolanaCompressor::new(SolanaPreset::Transactions);
for i in 0..5 {
let mut test_data = create_solana_transaction_data();
test_data.extend_from_slice(&vec![(i * 37) as u8; 100]);
let compressed = compressor.compress(&test_data).unwrap();
let ratio = test_data.len() as f64 / compressed.len() as f64;
println!("Learning iteration {}: compression ratio {:.2}:1", i + 1, ratio);
}
let final_stats = compressor.stats();
println!("Final learning stats: {} compressions, best ratio {:.2}:1",
final_stats.compressions, final_stats.best_ratio);
assert!(final_stats.best_ratio > 2.0, "Learning should improve compression performance");
}