401 lines
11 KiB
Rust
401 lines
11 KiB
Rust
use nac_acc_1410::*;
|
|
use nac_acc_1410::batch_operations::*;
|
|
use nac_acc_1410::cross_partition_transfer::*;
|
|
use nac_acc_1410::events::*;
|
|
use nac_acc_1410::optimization::*;
|
|
|
|
#[test]
|
|
fn test_complete_workflow() {
|
|
let mut acc1410 = Acc1410::new();
|
|
|
|
// 创建分区
|
|
let gnacs = ExtendedGNACS {
|
|
base_gnacs: vec![0x94, 0x01, 0x00, 0x04, 0x02, 0x01],
|
|
extension: GNACSExtension {
|
|
partition_type: 0x01,
|
|
vesting_years: 0,
|
|
voting_multiplier: 1,
|
|
dividend_priority: 1,
|
|
},
|
|
};
|
|
|
|
let partition_id = acc1410
|
|
.create_partition("Test Partition".to_string(), gnacs, PartitionType::CommonStock)
|
|
.unwrap();
|
|
|
|
// 发行代币
|
|
acc1410.issue_to_partition(&partition_id, "user1", 1000).unwrap();
|
|
|
|
// 转账
|
|
acc1410
|
|
.transfer_by_partition("user1", "user2", 300, &partition_id)
|
|
.unwrap();
|
|
|
|
// 验证余额
|
|
assert_eq!(
|
|
acc1410
|
|
.balance_of_by_partition(&partition_id, "user1")
|
|
.unwrap(),
|
|
700
|
|
);
|
|
assert_eq!(
|
|
acc1410
|
|
.balance_of_by_partition(&partition_id, "user2")
|
|
.unwrap(),
|
|
300
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_batch_operations_integration() {
|
|
let mut manager = BatchOperationsManager::new();
|
|
|
|
// 批量转账
|
|
let request = BatchTransferRequest {
|
|
from: "user1".to_string(),
|
|
recipients: vec![
|
|
("user2".to_string(), 100),
|
|
("user3".to_string(), 200),
|
|
("user4".to_string(), 300),
|
|
],
|
|
partition_id: [1u8; 32],
|
|
operator: None,
|
|
};
|
|
|
|
let result = manager.execute_batch_transfer(&request).unwrap();
|
|
assert_eq!(result.total_operations, 3);
|
|
assert_eq!(result.successful_operations, 3);
|
|
assert_eq!(result.total_amount, 600);
|
|
|
|
// 批量铸造
|
|
let mint_request = BatchMintRequest {
|
|
recipients: vec![
|
|
("user5".to_string(), 1000),
|
|
("user6".to_string(), 2000),
|
|
],
|
|
partition_id: [1u8; 32],
|
|
};
|
|
|
|
let mint_result = manager.execute_batch_mint(&mint_request).unwrap();
|
|
assert_eq!(mint_result.total_operations, 2);
|
|
assert_eq!(mint_result.total_amount, 3000);
|
|
|
|
// 批量销毁
|
|
let burn_request = BatchBurnRequest {
|
|
accounts: vec![
|
|
("user7".to_string(), 500),
|
|
("user8".to_string(), 300),
|
|
],
|
|
partition_id: [1u8; 32],
|
|
};
|
|
|
|
let burn_result = manager.execute_batch_burn(&burn_request).unwrap();
|
|
assert_eq!(burn_result.total_operations, 2);
|
|
assert_eq!(burn_result.total_amount, 800);
|
|
|
|
// 检查统计
|
|
let stats = manager.get_operation_statistics();
|
|
assert_eq!(stats.total_transfers, 1);
|
|
assert_eq!(stats.total_mints, 1);
|
|
assert_eq!(stats.total_burns, 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_cross_partition_transfer_integration() {
|
|
let mut manager = CrossPartitionTransferManager::new();
|
|
|
|
let source_partition = [1u8; 32];
|
|
let dest_partition = [2u8; 32];
|
|
|
|
// 创建转账请求
|
|
let request_id = manager
|
|
.create_transfer_request(
|
|
"user1".to_string(),
|
|
"user2".to_string(),
|
|
100,
|
|
source_partition,
|
|
dest_partition,
|
|
)
|
|
.unwrap();
|
|
|
|
// 验证转账
|
|
manager.validate_transfer(&request_id).unwrap();
|
|
|
|
// 执行转账
|
|
manager.execute_transfer(&request_id).unwrap();
|
|
|
|
// 确认转账
|
|
manager.confirm_transfer(&request_id).unwrap();
|
|
|
|
// 检查状态
|
|
let request = manager.get_transfer_request(&request_id).unwrap();
|
|
assert_eq!(request.status, TransferStatus::Completed);
|
|
|
|
// 检查统计
|
|
let stats = manager.get_transfer_statistics();
|
|
assert_eq!(stats.total_requests, 1);
|
|
assert_eq!(stats.completed_transfers, 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_events_integration() {
|
|
let mut event_manager = EventManager::new();
|
|
|
|
// 添加监听器
|
|
let listener = std::sync::Arc::new(ConsoleEventListener::new("test".to_string()));
|
|
event_manager.add_listener(listener);
|
|
|
|
// 触发多个事件
|
|
event_manager.emit_event(Acc1410Event::PartitionCreated {
|
|
partition_id: [1u8; 32],
|
|
name: "Test Partition".to_string(),
|
|
partition_type: 1,
|
|
});
|
|
|
|
event_manager.emit_event(Acc1410Event::Transfer {
|
|
from: "user1".to_string(),
|
|
to: "user2".to_string(),
|
|
amount: 100,
|
|
partition_id: [1u8; 32],
|
|
});
|
|
|
|
event_manager.emit_event(Acc1410Event::Mint {
|
|
to: "user3".to_string(),
|
|
amount: 200,
|
|
partition_id: [1u8; 32],
|
|
});
|
|
|
|
// 查询事件
|
|
let recent_events = event_manager.get_recent_events(3);
|
|
assert_eq!(recent_events.len(), 3);
|
|
|
|
// 查询账户事件
|
|
let user1_events = event_manager.get_account_events("user1");
|
|
assert_eq!(user1_events.len(), 1);
|
|
|
|
// 查询分区事件
|
|
let partition_events = event_manager.get_partition_events(&[1u8; 32]);
|
|
assert_eq!(partition_events.len(), 3);
|
|
|
|
// 统计
|
|
let stats = event_manager.get_event_statistics();
|
|
assert_eq!(stats.total_events, 3);
|
|
assert_eq!(stats.partition_created, 1);
|
|
assert_eq!(stats.transfers, 1);
|
|
assert_eq!(stats.mints, 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_optimization_integration() {
|
|
// 测试存储优化
|
|
let storage_optimizer = StorageOptimizer::new(100);
|
|
storage_optimizer.set("key1".to_string(), vec![1, 2, 3], 60);
|
|
|
|
let value = storage_optimizer.get("key1");
|
|
assert_eq!(value, Some(vec![1, 2, 3]));
|
|
|
|
let stats = storage_optimizer.get_cache_stats();
|
|
assert_eq!(stats.cache_hits, 1);
|
|
|
|
// 测试计算优化
|
|
let computation_optimizer = ComputationOptimizer::new();
|
|
let result = computation_optimizer.compute("test", || vec![4, 5, 6]);
|
|
assert_eq!(result, vec![4, 5, 6]);
|
|
|
|
// 测试Gas优化
|
|
let gas_optimizer = GasOptimizer::new(100);
|
|
let gas = gas_optimizer.estimate_gas("transfer");
|
|
assert_eq!(gas, 21000);
|
|
|
|
gas_optimizer.record_gas_usage("transfer".to_string(), 21000);
|
|
let gas_stats = gas_optimizer.get_gas_statistics();
|
|
assert_eq!(gas_stats.total_gas_used, 21000);
|
|
|
|
// 测试并发处理
|
|
let concurrent_processor = ConcurrentProcessor::new(4);
|
|
let items: Vec<u32> = (0..100).collect();
|
|
let results = concurrent_processor.process_batch(items, |x| x * 2);
|
|
assert_eq!(results.len(), 100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_batch_validation() {
|
|
let manager = BatchOperationsManager::new();
|
|
|
|
// 测试有效的批量转账
|
|
let valid_request = BatchTransferRequest {
|
|
from: "user1".to_string(),
|
|
recipients: vec![
|
|
("user2".to_string(), 100),
|
|
("user3".to_string(), 200),
|
|
],
|
|
partition_id: [1u8; 32],
|
|
operator: None,
|
|
};
|
|
|
|
let result = manager.validate_batch_transfer(&valid_request);
|
|
assert!(result.all_valid);
|
|
|
|
// 测试无效的批量转账(转给自己)
|
|
let invalid_request = BatchTransferRequest {
|
|
from: "user1".to_string(),
|
|
recipients: vec![
|
|
("user1".to_string(), 100), // 转给自己
|
|
],
|
|
partition_id: [1u8; 32],
|
|
operator: None,
|
|
};
|
|
|
|
let result = manager.validate_batch_transfer(&invalid_request);
|
|
assert!(!result.all_valid);
|
|
assert!(!result.invalid_items.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_event_filtering() {
|
|
let mut event_manager = EventManager::new();
|
|
|
|
// 添加多个事件
|
|
event_manager.emit_event(Acc1410Event::Transfer {
|
|
from: "user1".to_string(),
|
|
to: "user2".to_string(),
|
|
amount: 100,
|
|
partition_id: [1u8; 32],
|
|
});
|
|
|
|
event_manager.emit_event(Acc1410Event::Transfer {
|
|
from: "user3".to_string(),
|
|
to: "user4".to_string(),
|
|
amount: 200,
|
|
partition_id: [2u8; 32],
|
|
});
|
|
|
|
event_manager.emit_event(Acc1410Event::Mint {
|
|
to: "user5".to_string(),
|
|
amount: 300,
|
|
partition_id: [1u8; 32],
|
|
});
|
|
|
|
// 按分区过滤
|
|
let filter = EventFilter {
|
|
event_types: None,
|
|
accounts: None,
|
|
partitions: Some(vec![[1u8; 32]]),
|
|
time_range: None,
|
|
};
|
|
|
|
let filtered_events = event_manager.query_events(&filter);
|
|
assert_eq!(filtered_events.len(), 2);
|
|
|
|
// 按账户过滤
|
|
let filter = EventFilter {
|
|
event_types: None,
|
|
accounts: Some(vec!["user1".to_string()]),
|
|
partitions: None,
|
|
time_range: None,
|
|
};
|
|
|
|
let filtered_events = event_manager.query_events(&filter);
|
|
assert_eq!(filtered_events.len(), 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_gas_optimization_suggestions() {
|
|
let gas_optimizer = GasOptimizer::new(100);
|
|
|
|
// 记录一些操作
|
|
gas_optimizer.record_gas_usage("transfer".to_string(), 21000);
|
|
gas_optimizer.record_gas_usage("transfer".to_string(), 21000);
|
|
gas_optimizer.record_gas_usage("transfer".to_string(), 21000);
|
|
|
|
// 获取优化建议
|
|
let suggestions = gas_optimizer.get_optimization_suggestions();
|
|
assert!(!suggestions.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_cross_partition_transfer_cancellation() {
|
|
let mut manager = CrossPartitionTransferManager::new();
|
|
|
|
let source_partition = [1u8; 32];
|
|
let dest_partition = [2u8; 32];
|
|
|
|
// 创建转账请求
|
|
let request_id = manager
|
|
.create_transfer_request(
|
|
"user1".to_string(),
|
|
"user2".to_string(),
|
|
100,
|
|
source_partition,
|
|
dest_partition,
|
|
)
|
|
.unwrap();
|
|
|
|
// 取消转账
|
|
manager.cancel_transfer(&request_id).unwrap();
|
|
|
|
// 检查状态
|
|
let request = manager.get_transfer_request(&request_id).unwrap();
|
|
assert_eq!(request.status, TransferStatus::Cancelled);
|
|
}
|
|
|
|
#[test]
|
|
fn test_batch_operations_history() {
|
|
let mut manager = BatchOperationsManager::new();
|
|
|
|
// 执行多个批量操作
|
|
for i in 0..5 {
|
|
let request = BatchTransferRequest {
|
|
from: "user1".to_string(),
|
|
recipients: vec![("user2".to_string(), 100)],
|
|
partition_id: [1u8; 32],
|
|
operator: None,
|
|
};
|
|
manager.execute_batch_transfer(&request).unwrap();
|
|
}
|
|
|
|
// 检查历史
|
|
let history = manager.get_operation_history();
|
|
assert_eq!(history.len(), 5);
|
|
|
|
// 检查统计
|
|
let stats = manager.get_operation_statistics();
|
|
assert_eq!(stats.total_transfers, 5);
|
|
assert_eq!(stats.total_transfer_amount, 500);
|
|
}
|
|
|
|
#[test]
|
|
fn test_event_max_log_size() {
|
|
let mut event_manager = EventManager::new();
|
|
event_manager.set_max_log_size(5);
|
|
|
|
// 添加10个事件
|
|
for i in 0..10 {
|
|
event_manager.emit_event(Acc1410Event::Transfer {
|
|
from: format!("user{}", i),
|
|
to: format!("user{}", i + 1),
|
|
amount: 100,
|
|
partition_id: [1u8; 32],
|
|
});
|
|
}
|
|
|
|
// 日志应该只保留最后5个事件
|
|
let recent_events = event_manager.get_recent_events(10);
|
|
assert_eq!(recent_events.len(), 5);
|
|
}
|
|
|
|
#[test]
|
|
fn test_storage_optimizer_expiry() {
|
|
let optimizer = StorageOptimizer::new(100);
|
|
|
|
// 设置一个立即过期的缓存
|
|
optimizer.set("key1".to_string(), vec![1, 2, 3], 0);
|
|
|
|
// 等待1秒
|
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
|
|
|
// 应该无法获取(已过期)
|
|
let value = optimizer.get("key1");
|
|
assert_eq!(value, None);
|
|
}
|