114 lines
3.2 KiB
Rust
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);
|
|
} |