
set(YAZE_SRC_FILES "")
foreach (file 
  app/rom.cc
  ${YAZE_APP_CORE_SRC}
  ${YAZE_APP_EMU_SRC}
  ${YAZE_APP_GFX_SRC}
  ${YAZE_APP_ZELDA3_SRC}
  ${YAZE_APP_EDITOR_SRC}
  ${YAZE_UTIL_SRC}
  ${YAZE_GUI_SRC})
  list(APPEND YAZE_SRC_FILES ${CMAKE_SOURCE_DIR}/src/${file})
endforeach()

add_executable(
  yaze_test
  yaze_test.cc
  rom_test.cc
  test_editor.cc
  hex_test.cc
  core/asar_wrapper_test.cc
  gfx/snes_tile_test.cc
  gfx/compression_test.cc
  gfx/snes_palette_test.cc
  zelda3/message_test.cc
  zelda3/overworld_test.cc
  zelda3/overworld_integration_test.cc
  zelda3/comprehensive_integration_test.cc
  zelda3/dungeon_integration_test.cc
  zelda3/dungeon_object_renderer_integration_test.cc
  zelda3/dungeon_object_renderer_mock_test.cc
  zelda3/dungeon_editor_system_integration_test.cc
  zelda3/sprite_builder_test.cc
  zelda3/sprite_position_test.cc
  emu/cpu_test.cc
  emu/ppu_test.cc
  emu/spc700_test.cc
  emu/audio/apu_test.cc
  emu/audio/ipl_handshake_test.cc
  integration/dungeon_editor_test.cc
  dungeon_component_unit_test.cc
  integration/asar_integration_test.cc
  integration/asar_rom_test.cc
  zelda3/object_parser_test.cc
  zelda3/object_parser_structs_test.cc
  zelda3/test_dungeon_objects.cc
)

# Add vanilla value extraction utility (only for local development with ROM access)
if(NOT YAZE_MINIMAL_BUILD AND YAZE_ENABLE_ROM_TESTS)
  add_executable(
    extract_vanilla_values
    zelda3/extract_vanilla_values.cc
    ${YAZE_SRC_FILES}
  )

  target_include_directories(
    extract_vanilla_values PUBLIC
    ${CMAKE_SOURCE_DIR}/src/app/
    ${CMAKE_SOURCE_DIR}/src/lib/
    ${CMAKE_SOURCE_DIR}/incl/
    ${CMAKE_SOURCE_DIR}/src/
    ${CMAKE_SOURCE_DIR}/src/lib/imgui_test_engine
    ${CMAKE_SOURCE_DIR}/src/lib/asar/src
    ${CMAKE_SOURCE_DIR}/src/lib/asar/src/asar
    ${CMAKE_SOURCE_DIR}/src/lib/asar/src/asar-dll-bindings/c
    ${SDL2_INCLUDE_DIR}
    ${PNG_INCLUDE_DIRS}
    ${PROJECT_BINARY_DIR}
  )

  target_link_libraries(
    extract_vanilla_values
    ${SDL_TARGETS}
    asar-static
    ${ABSL_TARGETS}
    ${PNG_LIBRARIES}
    ${OPENGL_LIBRARIES}
    ${CMAKE_DL_LIBS}
  )

  # Conditionally link yaze_c only when library is built
  if(YAZE_BUILD_LIB)
    target_link_libraries(extract_vanilla_values yaze_c)
  endif()
endif()

target_include_directories(
  yaze_test PUBLIC
  ${CMAKE_SOURCE_DIR}/src/app/
  ${CMAKE_SOURCE_DIR}/src/lib/
  ${CMAKE_SOURCE_DIR}/incl/
  ${CMAKE_SOURCE_DIR}/src/
  ${CMAKE_SOURCE_DIR}/test/
  ${CMAKE_SOURCE_DIR}/src/lib/imgui_test_engine
  ${CMAKE_SOURCE_DIR}/src/lib/asar/src
  ${CMAKE_SOURCE_DIR}/src/lib/asar/src/asar
  ${CMAKE_SOURCE_DIR}/src/lib/asar/src/asar-dll-bindings/c
  ${SDL2_INCLUDE_DIR}
  ${PNG_INCLUDE_DIRS}
  ${PROJECT_BINARY_DIR}
)

target_link_libraries(
  yaze_test
  ${SDL_TARGETS}
  asar-static
  ${ABSL_TARGETS}
  ${PNG_LIBRARIES}
  ${OPENGL_LIBRARIES}
  ${CMAKE_DL_LIBS}
  ImGui
  gmock_main
  gmock
  gtest_main
  gtest
)

# Link core library for essential functionality (BPS, ASAR, etc.)
if(YAZE_BUILD_LIB)
  target_link_libraries(yaze_test yaze_core)
endif()

# Conditionally link ImGuiTestEngine only when UI tests are enabled
if(YAZE_ENABLE_UI_TESTS)
  target_link_libraries(yaze_test ${IMGUI_TEST_ENGINE_TARGET})
  target_compile_definitions(yaze_test PRIVATE ${IMGUI_TEST_ENGINE_DEFINITIONS})
endif()
# ROM Testing Configuration
if(YAZE_ENABLE_ROM_TESTS)
    target_compile_definitions(yaze_test PRIVATE 
        YAZE_ENABLE_ROM_TESTS=1
        YAZE_TEST_ROM_PATH="${YAZE_TEST_ROM_PATH}"
    )
endif()

# ImGui Test Engine definitions are now handled conditionally above

# Platform-specific definitions
if(UNIX AND NOT APPLE)
    target_compile_definitions(yaze_test PRIVATE "linux" "stricmp=strcasecmp")
elseif(APPLE)
    target_compile_definitions(yaze_test PRIVATE "MACOS" "stricmp=strcasecmp")
elseif(WIN32)
    target_compile_definitions(yaze_test PRIVATE "WINDOWS")
endif()

include(GoogleTest)

# Configure test discovery with efficient labeling for CI/CD
include(GoogleTest)

# Discover all tests with default properties
gtest_discover_tests(yaze_test)

# Add test labels using a simpler approach
# Note: Test names might have prefixes, we'll use regex patterns for CI