# 自动化用例
add_test(NAME stcompiler_version
         COMMAND STCompiler)
add_test(NAME bytecode_executor_version
         COMMAND BytecodeExecutor)

# CLI 级：编译需 --machine；缺参必须失败（WILL_FAIL）
add_test(NAME cli_compile
         COMMAND STCompiler ${CMAKE_SOURCE_DIR}/tests/cases/01_empty_main/project.toml
                 -o ${CMAKE_CURRENT_BINARY_DIR}/cli_case01.stb
                 --machine ${CMAKE_SOURCE_DIR}/compiler/machine.toml)
add_test(NAME cli_missing_machine
         COMMAND STCompiler ${CMAKE_SOURCE_DIR}/tests/cases/01_empty_main/project.toml
                 -o ${CMAKE_CURRENT_BINARY_DIR}/cli_nope.stb)
set_tests_properties(cli_missing_machine PROPERTIES WILL_FAIL TRUE)

# isa 合同测试：链接 isa 库，断言覆盖饱和/编解码/disasm/哈希/映像/sidecar
add_executable(isa_test
               ./src/isa_test.cpp)

target_link_libraries(isa_test PRIVATE isa)

add_test(NAME isa_roundtrip
         COMMAND isa_test)

# compiler 库测试：toml schema、文件集合、工程哈希（REPO_ROOT 注入源目录绝对路径）
add_executable(compiler_test
               ./src/compiler_test.cpp)

target_link_libraries(compiler_test PRIVATE compiler)
target_compile_definitions(compiler_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME compiler_toml
         COMMAND compiler_test)

# 词法测试：token 流 + 负例（REPO_ROOT 注入源目录绝对路径）
add_executable(lexer_test
               ./src/lexer_test.cpp)

target_link_libraries(lexer_test PRIVATE compiler)
target_compile_definitions(lexer_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME lexer_tokens
         COMMAND lexer_test)

# 语法测试：line1 AST 结构 + 负例（REPO_ROOT 注入源目录绝对路径）
add_executable(parser_test
               ./src/parser_test.cpp)

target_link_libraries(parser_test PRIVATE compiler)
target_compile_definitions(parser_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME parser_syntax
         COMMAND parser_test)

# 链接测试：用例 09/10/11/12/16/19 + line1 正例（REPO_ROOT 注入源目录绝对路径）
add_executable(linker_test
               ./src/linker_test.cpp)

target_link_libraries(linker_test PRIVATE compiler)
target_compile_definitions(linker_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME linker_links
         COMMAND linker_test)

# 类型检查测试：用例 14 + 负例 + 正例（REPO_ROOT 注入源目录绝对路径）
add_executable(typecheck_test
               ./src/typecheck_test.cpp)

target_link_libraries(typecheck_test PRIVATE compiler)
target_compile_definitions(typecheck_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME typecheck_types
         COMMAND typecheck_test)

# TODO(V2): 阶段 3 重写 codegen_test（用 compiler::Codec 断言 V2 产物，去 isa 依赖）
# 寄存器码测试（12.8 切片 1）：用例 01/02 出映像（REPO_ROOT 注入源目录绝对路径）
# add_executable(codegen_test
#                ./src/codegen_test.cpp)
#
# target_link_libraries(codegen_test PRIVATE compiler isa)
# target_compile_definitions(codegen_test PRIVATE
#                            REPO_ROOT="${CMAKE_SOURCE_DIR}")
#
# add_test(NAME codegen_slice1
#          COMMAND codegen_test)

# VM 测试：手工映像 + 编译器产物 + 定时器 + 确定性（REPO_ROOT 注入源目录绝对路径）
add_executable(vm_test
               ./src/vm_test.cpp)

target_link_libraries(vm_test PRIVATE compiler vm)
target_compile_definitions(vm_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME vm_cycles
         COMMAND vm_test)

# 12.2 二十用例点亮（12.11）：按 EXPECTED.md 期望跑完整管线（REPO_ROOT 注入源目录绝对路径）
add_executable(cases_test
               ./src/cases_test.cpp)

target_link_libraries(cases_test PRIVATE compiler vm)
target_compile_definitions(cases_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME cases_all
         COMMAND cases_test)

# machine.toml 加载与强校验（阶段 A 步骤 3；REPO_ROOT 注入源目录绝对路径）
add_executable(machine_test
               ./src/machine_test.cpp)

target_link_libraries(machine_test PRIVATE compiler)
target_compile_definitions(machine_test PRIVATE
                           REPO_ROOT="${CMAKE_SOURCE_DIR}")

add_test(NAME machine_config
         COMMAND machine_test)
