175 lines
6.0 KiB
Plaintext
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);
|
|
}
|
|
|
|
// 运行所有测试
|
|
函数 运行所有测试() {
|
|
测试基本信息();
|
|
测试转账();
|
|
测试授权();
|
|
测试转移从();
|
|
测试增发();
|
|
测试销毁();
|
|
测试暂停();
|
|
}
|
|
}
|