Files
coin/tests/blockchain_tests.rs
2025-06-12 07:36:25 +09:00

114 lines
3.2 KiB
Rust

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);
}