cmake_minimum_required(VERSION 3.16) project(saqut VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_compile_options(-Wall -Wextra) if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE) add_compile_options(-g -O0) message(STATUS "Debug modu aktif") else() add_compile_options(-O3) message(STATUS "Release modu aktif") endif() # Tüm kaynak dosyaları topla file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(saqut ${SOURCES}) target_include_directories(saqut PRIVATE src) # ── Testler ────────────────────────────────────────────────────────────────── enable_testing() set(SAQUT_BINARY "${CMAKE_BINARY_DIR}/saqut") set(GOLDEN_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/run_golden.cmake") # Birim testleri (tests/run.sh) add_test( NAME unit_tests COMMAND bash "${CMAKE_SOURCE_DIR}/tests/run.sh" ) # Golden testleri — tests/golden/**/*.sqt dosyalarını otomatik keşfet. # Her .sqt için iki olası expected dosyası kontrol edilir: # BASE.expected → saqut run (siyah-kutu çıktı testi) # BASE.ir_opt.expected → saqut ir --optimized (beyaz-kutu IR testi) file(GLOB_RECURSE ALL_GOLDEN_SQT CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/tests/golden/*.sqt" ) foreach(SQT_FILE ${ALL_GOLDEN_SQT}) file(RELATIVE_PATH REL "${CMAKE_SOURCE_DIR}/tests/golden" "${SQT_FILE}") string(REPLACE ".sqt" "" BASE "${REL}") string(REPLACE "/" "_" TNAME "${BASE}") # Siyah-kutu: saqut run çıktısı set(RUN_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.expected") if(EXISTS "${RUN_EXPECTED}") add_test( NAME "golden_${TNAME}" COMMAND ${CMAKE_COMMAND} -DBINARY=${SAQUT_BINARY} -DSOURCE=${SQT_FILE} -DEXPECTED=${RUN_EXPECTED} -P "${GOLDEN_SCRIPT}" ) endif() # Beyaz-kutu: saqut ir --optimized çıktısı set(IR_OPT_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.ir_opt.expected") if(EXISTS "${IR_OPT_EXPECTED}") add_test( NAME "golden_${TNAME}_ir_opt" COMMAND ${CMAKE_COMMAND} -DBINARY=${SAQUT_BINARY} -DSOURCE=${SQT_FILE} -DEXPECTED=${IR_OPT_EXPECTED} -DCOMMAND=ir -DOPTIMIZED=1 -P "${GOLDEN_SCRIPT}" ) endif() # Doğruluk kalkanı: saqut run --optimized çıktısı == beklenen golden değer # "Optimizasyon oldu" değil, "optimize IR doğru sonuç verdi" testleri. set(RUN_OPT_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.run_opt.expected") if(EXISTS "${RUN_OPT_EXPECTED}") add_test( NAME "golden_${TNAME}_run_opt" COMMAND ${CMAKE_COMMAND} -DBINARY=${SAQUT_BINARY} -DSOURCE=${SQT_FILE} -DEXPECTED=${RUN_OPT_EXPECTED} -DOPTIMIZED=1 -P "${GOLDEN_SCRIPT}" ) endif() # Negatif test: .compile_error — derleme hatası beklenen golden testler. # Dosya içeriği stderr'de aranır (regex/düz dize). set(COMPILE_ERROR_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.compile_error") if(EXISTS "${COMPILE_ERROR_EXPECTED}") add_test( NAME "golden_${TNAME}_compile_error" COMMAND ${CMAKE_COMMAND} -DBINARY=${SAQUT_BINARY} -DSOURCE=${SQT_FILE} -DEXPECTED=${COMPILE_ERROR_EXPECTED} -P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake" ) endif() # Negatif test: .runtime_error — çalışma zamanı hatası beklenen golden testler. # Aynı altyapı: exit code != 0 + stderr içeriği kontrolü. set(RUNTIME_ERROR_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.runtime_error") if(EXISTS "${RUNTIME_ERROR_EXPECTED}") add_test( NAME "golden_${TNAME}_runtime_error" COMMAND ${CMAKE_COMMAND} -DBINARY=${SAQUT_BINARY} -DSOURCE=${SQT_FILE} -DEXPECTED=${RUNTIME_ERROR_EXPECTED} -P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake" ) endif() endforeach()