#*******************************************************************************
# Copyright (c) 2025-2026 ZF Friedrichshafen AG
#
# This program and the accompanying materials are made available under the 
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0 
#*******************************************************************************

# Define project
project(Tests VERSION 1.0 LANGUAGES CXX)

# Enable testing for all subsequent projects
enable_testing()

# Re-set target directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/tests/lib>)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/tests/bin>)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/tests/bin>)

# Include export into the include directory path
include_directories(../export)

# Get Google Test from github
include(FetchContent)
# Fetch the Google Test library from GitHub.
FetchContent_Declare(
    googletest
    GIT_REPOSITORY                https://github.com/google/googletest.git
    GIT_TAG                       v1.17.0
)

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

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
endif()

FetchContent_MakeAvailable(googletest)

add_library(GTest::GTest INTERFACE IMPORTED)
add_library(GMock::GMock INTERFACE IMPORTED)
target_link_libraries(GTest::GTest INTERFACE gtest_main)
target_link_libraries(GMock::GMock INTERFACE gmock_main)

file (COPY ${PROJECT_SOURCE_DIR}/sdv_core_reloc.toml DESTINATION ${CMAKE_BINARY_DIR}/tests/bin/)
file (COPY ${PROJECT_SOURCE_DIR}/sdv_core_reloc.toml DESTINATION ${CMAKE_BINARY_DIR}/examples/bin/)
file (COPY ${PROJECT_SOURCE_DIR}/sdv_core_reloc.toml DESTINATION ${CMAKE_BINARY_DIR}/framework_tests/bin/)

# Copy shell script to the build directory
if(WIN32)
  file (COPY ${PROJECT_SOURCE_DIR}/run_tests_on_windows.ps1 DESTINATION ${CMAKE_BINARY_DIR}/tests/)
  file (COPY ${PROJECT_SOURCE_DIR}/loop_test_runner_windows.ps1 DESTINATION ${CMAKE_BINARY_DIR}/tests/)
else()
  file (COPY ${PROJECT_SOURCE_DIR}/run_tests_on_linux.sh DESTINATION ${CMAKE_BINARY_DIR}/tests/)
  file (COPY ${PROJECT_SOURCE_DIR}/loop_test_runner_linux.sh DESTINATION ${CMAKE_BINARY_DIR}/tests/)
endif()

# Add test projects
add_subdirectory(unit_tests/concurrency)
add_subdirectory(unit_tests/flags_type)
add_subdirectory(unit_tests/scheduler)
add_subdirectory(unit_tests/idl_compiler)
add_subdirectory(unit_tests/commandline_parser)
add_subdirectory(unit_tests/dbc_parser)
add_subdirectory(unit_tests/asc_format)
add_subdirectory(unit_tests/basic_types)
add_subdirectory(unit_tests/smart_ifc)
add_subdirectory(unit_tests/toml_parser)
add_subdirectory(unit_tests/parameters)
add_subdirectory(unit_tests/module_control)
add_subdirectory(unit_tests/repository)
add_subdirectory(unit_tests/shared_mem)
add_subdirectory(unit_tests/memory_manager)
add_subdirectory(unit_tests/core_loader)
add_subdirectory(unit_tests/named_mutex)
add_subdirectory(unit_tests/trace_fifo)
add_subdirectory(unit_tests/socket_can_com_tests)
add_subdirectory(unit_tests/app_connect)
add_subdirectory(unit_tests/process_control)
add_subdirectory(unit_tests/ipc_com)
add_subdirectory(unit_tests/ipc_connect)
add_subdirectory(unit_tests/sdv_control)
add_subdirectory(unit_tests/sdv_macro_test)
add_subdirectory(unit_tests/install_package_composer)
add_subdirectory(unit_tests/path_match)
add_subdirectory(unit_tests/unix_sockets)
add_subdirectory(unit_tests/unix_tunnel)
add_subdirectory(unit_tests/win_sockets)
add_subdirectory(unit_tests/win_tunnel)
add_subdirectory(component_tests/config)
add_subdirectory(component_tests/logger)
add_subdirectory(component_tests/data_dispatch_service)
add_subdirectory(component_tests/repository)
add_subdirectory(component_tests/config_install)
add_subdirectory(component_tests/dbc_util)
add_subdirectory(component_tests/vss_util)
add_subdirectory(component_tests/task_timer)
add_subdirectory(component_tests/app_control)
add_subdirectory(component_tests/toml_parser)
add_subdirectory(manual_tests/silkit_can_com_tests)
