Files
scc/tests/simple/test.py
zzy 097dbdcc2a feat(ir2mcode): 实现AMD64代码生成器支持控制流和函数调用
- 实现了条件分支、无条件跳转和函数调用的机器码生成
- 添加了跳转目标地址回填机制,处理条件分支和跳转指令的偏移量
- 改进了寄存器分配逻辑,支持函数调用返回值的处理
- 重构了位置解析函数,从返回指针改为传入引用参数

fix(ast2ir): 移除无用的注释代码

- 删除了关于一元操作符映射的注释代码

test: 更新测试框架和测试用例

- 修改测试框架以支持新的可执行文件输出格式
- 添加了条件分支、循环和函数调用的测试用例
- 使用TOML配置文件管理期望的返回值
- 替换标准库头文件为自定义头文件以减少依赖
2026-03-21 14:38:30 +08:00

91 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from pprint import PrettyPrinter
import subprocess
import os
from pathlib import Path
import tomllib
# 配置参数
WORKSPACE = Path(__file__).resolve().parent # 测试工作目录
TEST_DIR = Path(WORKSPACE)
CC_PATH = Path(WORKSPACE / "../../build/dev/scc")
def run_command(cmd, capture_output=True):
"""执行命令并捕获 stdout"""
try:
result = subprocess.run(
cmd,
cwd=WORKSPACE,
stdout=subprocess.PIPE if capture_output else None,
stderr=subprocess.PIPE,
text=True,
timeout=5, # 增加超时时间以防虚拟机启动慢
)
# 返回 stdout 用于获取返回值,同时检查是否有运行时错误
return result.stdout.strip(), result.stderr.strip(), result.returncode
except subprocess.TimeoutExpired:
return None, "Timeout expired", -1
except Exception as e:
return None, str(e), -1
def run_test(test_file, expected):
print(f"\nTesting {test_file}...")
# 1. 编译
compile_cmd = [str(CC_PATH), str(test_file), "-o", "test.exe"]
# 编译时关注 stderr 和返回码
_, compile_err, compile_ret = run_command(compile_cmd)
exe_path = WORKSPACE / "test.exe"
if not exe_path.exists() or compile_ret != 0:
print(f" Compilation failed: {compile_err}")
return False
# 2. 执行虚拟机并获取输出
vm_cmd = [str(exe_path)]
actual_output, vm_err, vm_ret = run_command(vm_cmd)
# 如果存在 stderr 且返回码异常(例如负数表示信号终止),则视为运行时错误
if vm_err and vm_ret < 0:
print(f" Runtime error: {vm_err}")
return False
# 3. 获取返回值 (修改进程返回值而非 stdout)
actual = vm_ret
# 4. 验证结果
# 注意toml 中读取的 expected 可能是整数actual 也是整数,直接比较
if actual == expected:
print(f" PASSED {test_file}")
return True
else:
print(f" FAILED: Expected '{expected}', got '{actual}'")
return False
def main():
passed = 0
total = 0
config = {}
config_path = WORKSPACE / "expect.toml"
if not config_path.exists():
print(f"Config file not found: {config_path}")
return
with open(config_path, "rb") as f:
config = tomllib.load(f)
PrettyPrinter().pprint(config)
for test_file, expected in config.get("return_val_cases", {}).items():
total += 1
if run_test(TEST_DIR / test_file, expected):
passed += 1
# 清理中间文件
exe_path = WORKSPACE / "test.exe"
if exe_path.exists():
os.remove(exe_path)
print(f"\nTest Summary: {passed}/{total} passed")
if __name__ == "__main__":
main()