NAC_Blockchain/charter-std-zh/tests/test_acc20.ch

175 lines
6.0 KiB
Plaintext

///! ACC-20中文标准测试
///! 测试ACC-20协议的所有功能
使用 ../acc/acc20;
// ============================================================================
// 测试合约
// ============================================================================
合约 ACC20测试 {
私有 代币: ACC20基础;
构造函数() {
代币 = ACC20基础::新建(
"测试代币",
"TEST",
18,
1000000 * (10 ** 18)
);
}
// 测试1: 基本信息查询
函数 测试基本信息() {
要求(代币.名称() == "测试代币", "名称错误");
要求(代币.符号() == "TEST", "符号错误");
要求(代币.小数位() == 18, "小数位错误");
要求(代币.总供应量() == 1000000 * (10 ** 18), "总供应量错误");
}
// 测试2: 转账功能
函数 测试转账() {
让 发送者 = 消息::发送者();
让 接收者 = 地址::从十六进制("0x1234567890123456789012345678901234567890");
让 数量 = 1000 * (10 ** 18);
// 转账前余额
让 发送者余额前 = 代币.持有量(发送者);
让 接收者余额前 = 代币.持有量(接收者);
// 执行转账
代币.转移(接收者, 数量);
// 转账后余额
让 发送者余额后 = 代币.持有量(发送者);
让 接收者余额后 = 代币.持有量(接收者);
// 验证
要求(发送者余额后 == 发送者余额前 - 数量, "发送者余额错误");
要求(接收者余额后 == 接收者余额前 + 数量, "接收者余额错误");
}
// 测试3: 授权功能
函数 测试授权() {
让 所有者 = 消息::发送者();
让 授权者 = 地址::从十六进制("0x1234567890123456789012345678901234567890");
让 数量 = 500 * (10 ** 18);
// 授权前额度
让 额度前 = 代币.授权额度(所有者, 授权者);
要求(额度前 == 0, "初始额度应为0");
// 执行授权
代币.授权(授权者, 数量);
// 授权后额度
让 额度后 = 代币.授权额度(所有者, 授权者);
要求(额度后 == 数量, "授权额度错误");
}
// 测试4: 转移从功能
函数 测试转移从() {
让 所有者 = 消息::发送者();
让 授权者 = 地址::从十六进制("0x1234567890123456789012345678901234567890");
让 接收者 = 地址::从十六进制("0x2345678901234567890123456789012345678901");
让 授权数量 = 500 * (10 ** 18);
让 转移数量 = 200 * (10 ** 18);
// 先授权
代币.授权(授权者, 授权数量);
// 转移前余额和额度
让 所有者余额前 = 代币.持有量(所有者);
让 接收者余额前 = 代币.持有量(接收者);
让 额度前 = 代币.授权额度(所有者, 授权者);
// 执行转移从(需要模拟授权者调用)
// 注意:实际测试需要切换调用者
代币.转移从(所有者, 接收者, 转移数量);
// 转移后余额和额度
让 所有者余额后 = 代币.持有量(所有者);
让 接收者余额后 = 代币.持有量(接收者);
让 额度后 = 代币.授权额度(所有者, 授权者);
// 验证
要求(所有者余额后 == 所有者余额前 - 转移数量, "所有者余额错误");
要求(接收者余额后 == 接收者余额前 + 转移数量, "接收者余额错误");
要求(额度后 == 额度前 - 转移数量, "授权额度错误");
}
// 测试5: 增发功能
函数 测试增发() {
让 接收者 = 消息::发送者();
让 增发数量 = 10000 * (10 ** 18);
// 增发前
让 总供应量前 = 代币.总供应量();
让 余额前 = 代币.持有量(接收者);
// 执行增发
代币.增发(接收者, 增发数量);
// 增发后
让 总供应量后 = 代币.总供应量();
让 余额后 = 代币.持有量(接收者);
// 验证
要求(总供应量后 == 总供应量前 + 增发数量, "总供应量错误");
要求(余额后 == 余额前 + 增发数量, "余额错误");
}
// 测试6: 销毁功能
函数 测试销毁() {
让 持有者 = 消息::发送者();
让 销毁数量 = 5000 * (10 ** 18);
// 销毁前
让 总供应量前 = 代币.总供应量();
让 余额前 = 代币.持有量(持有者);
// 执行销毁
代币.销毁(销毁数量);
// 销毁后
让 总供应量后 = 代币.总供应量();
让 余额后 = 代币.持有量(持有者);
// 验证
要求(总供应量后 == 总供应量前 - 销毁数量, "总供应量错误");
要求(余额后 == 余额前 - 销毁数量, "余额错误");
}
// 测试7: 暂停功能
函数 测试暂停() {
// 暂停前应该可以转账
让 接收者 = 地址::从十六进制("0x1234567890123456789012345678901234567890");
代币.转移(接收者, 100);
// 暂停
代币.暂停();
要求(代币.是否已暂停() == 真, "暂停状态错误");
// 暂停后不能转账(这里会失败)
// 代币.转移(接收者, 100); // 应该抛出错误
// 恢复
代币.恢复();
要求(代币.是否已暂停() == 假, "恢复状态错误");
// 恢复后可以转账
代币.转移(接收者, 100);
}
// 运行所有测试
函数 运行所有测试() {
测试基本信息();
测试转账();
测试授权();
测试转移从();
测试增发();
测试销毁();
测试暂停();
}
}