enable_testing()

include(FetchContent)

FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)

# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

set(yagi_TEST_INCLUDE
	mock_logger_test.h
	mock_symbol_test.h
	mock_loader_test.h
	mock_type_test.h
	mock_type_test.cc
)

if(MSVC)
	add_definitions(
		/wd4996
	)
endif()

add_executable(
  yagi_unit_test
  x86_payload_64bits_test.cc
  x86_payload_32bits_test.cc
  x86_payload_64bits_parameters.cc
  ARM_payload_32bits_test.cc
  PPC_payload_32bits_test.cc
  MIPS_payload_32bits_test.cc
  x86_payload_64bits_gcc_test.cc
  Sparc_payload_32bits_test.cc
  x86_payload_32bits_test_local_var.cc
  ${yagi_TEST_INCLUDE}
)

target_link_libraries(
  yagi_unit_test
  gtest_main
  yagi_static
)

target_compile_features(yagi_unit_test PRIVATE cxx_std_17)

# This is a trick for compiling on visual studio
# static initializer are stripped because libdecomp are a static library
# and no PrintLanguage are registred because singleton ctor are never called
if(MSVC)
	target_link_options(yagi_unit_test PRIVATE /WHOLEARCHIVE:libbase.lib)
endif()


# Try to install files for loading test
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/../ghidra/ghidra/Ghidra/Processors DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Ghidra)

# copy sla file generated by target
set(SLEIGH_DIR "${CMAKE_CURRENT_BINARY_DIR}/../ghidra/sleigh")

add_custom_target(copy_sla_files ALL
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/x86.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/x86/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/x86-64.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/x86/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ARM7_be.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/ARM/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ARM7_le.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/ARM/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/AARCH64.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/AARCH64/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/AARCH64BE.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/AARCH64/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ppc_32_le.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ppc_32_be.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ppc_64_le.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/ppc_64_be.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/mips32le.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/mips32be.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/mips64le.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/mips64be.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/PowerPC/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/SparcV9_32.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/Sparc/data/languages/"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SLEIGH_DIR}/SparcV9_64.sla" "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/Sparc/data/languages/"
    DEPENDS sla_x86 sla_x86_64 sla_ARM_BE sla_ARM_LE sla_AARCH64_LE sla_AARCH64_BE sla_PPC_LE_32 sla_PPC_LE_64 sla_PPC_BE_32 sla_PPC_BE_64 sla_MIPS_LE_32 sla_MIPS_BE_32 sla_MIPS_LE_64 sla_MIPS_BE_64 sla_SPARC_32 sla_SPARC_64
)

add_dependencies(yagi_unit_test copy_sla_files)

include(GoogleTest)
gtest_discover_tests(yagi_unit_test
PROPERTIES ENVIRONMENT "GHIDRADIRTEST=${CMAKE_CURRENT_BINARY_DIR}"
)
