use aicoin::blockchain::{Block, Blockchain, Transaction}; use aicoin::wallet::Wallet; #[test] fn test_genesis_block() { let blockchain = Blockchain::new(); assert_eq!(blockchain.chain.len(), 1); assert_eq!(blockchain.chain[0].index, 0); assert_eq!(blockchain.chain[0].previous_hash, "0"); } #[test] fn test_add_transaction() { let mut blockchain = Blockchain::new(); let wallet1 = Wallet::new(None); let wallet2 = Wallet::new(None); // Give wallet1 some coins *blockchain.balances.entry(wallet1.address.clone()).or_insert(0.0) = 100.0; let transaction = Transaction::new( wallet1.address.clone(), wallet2.address.clone(), 50.0, None, ); assert!(blockchain.add_transaction(transaction).is_ok()); assert_eq!(blockchain.pending_transactions.len(), 1); } #[test] fn test_insufficient_balance() { let mut blockchain = Blockchain::new(); let wallet1 = Wallet::new(None); let wallet2 = Wallet::new(None); let transaction = Transaction::new( wallet1.address.clone(), wallet2.address.clone(), 50.0, None, ); assert!(blockchain.add_transaction(transaction).is_err()); } #[test] fn test_mining() { let mut blockchain = Blockchain::new(); let wallet1 = Wallet::new(None); let wallet2 = Wallet::new(None); let miner = Wallet::new(None); // Give wallet1 some coins *blockchain.balances.entry(wallet1.address.clone()).or_insert(0.0) = 100.0; let transaction = Transaction::new( wallet1.address.clone(), wallet2.address.clone(), 30.0, None, ); blockchain.add_transaction(transaction).unwrap(); blockchain.mine_pending_transactions(miner.address.clone()); assert_eq!(blockchain.chain.len(), 2); assert_eq!(blockchain.pending_transactions.len(), 0); // Check balances let wallet1_balance = blockchain.get_balance(&wallet1.address); let wallet2_balance = blockchain.get_balance(&wallet2.address); let miner_balance = blockchain.get_balance(&miner.address); assert!(wallet1_balance < 70.0); // Less due to fees assert_eq!(wallet2_balance, 30.0); assert!(miner_balance > 50.0); // Mining reward + fees } #[test] fn test_blockchain_validity() { let mut blockchain = Blockchain::new(); assert!(blockchain.is_valid()); let wallet = Wallet::new(None); blockchain.mine_pending_transactions(wallet.address); assert!(blockchain.is_valid()); } #[test] fn test_transaction_fee_calculation() { assert_eq!(Transaction::calculate_fee(100.0), 0.1); assert_eq!(Transaction::calculate_fee(5.0), 0.01); // Minimum fee assert_eq!(Transaction::calculate_fee(1000.0), 1.0); } #[test] fn test_difficulty_adjustment() { let mut blockchain = Blockchain::new(); blockchain.difficulty_adjustment_interval = 2; // Adjust every 2 blocks let initial_difficulty = blockchain.difficulty; let wallet = Wallet::new(None); // Mine several blocks for _ in 0..3 { blockchain.mine_pending_transactions(wallet.address.clone()); } // Difficulty might have changed assert!(blockchain.difficulty >= 1); }