#*******************************************************************************
# 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 
#
# Contributors:
#   Erik Verhoeven - initial API and implementation
#*******************************************************************************

# Define project
project (UnitTest_IDLCompiler VERSION 1.0 LANGUAGES CXX)

# Find the IDL compiler
# REMARKS The compiler can only be found after it has build. Having both the compiler and the unittest project build, causes an
# error during the scanning phase of CMake.
#find_program(SDVIDL NAMES "sdv_idl_compiler" PATHS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../../bin/" NO_CACHE)
set (SDVIDL "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../../bin/sdv_idl_compiler")
message("Use IDL compiler: ${SDVIDL}")

# Compile the IDL
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/linked.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/linked.idl
    COMMENT "Build linked.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/linked.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated"
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/test.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/test.idl
    COMMENT "Build test.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/test.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated"
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/array.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/array.idl
    COMMENT "Build array.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/array.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated"
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/union.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/union.idl
    COMMENT "Build union.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/union.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated"
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/interfaces.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/interfaces.idl
    COMMENT "Build interfaces.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/interfaces.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated"
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/test_ifc_id1.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/test_ifc_id1.idl
    COMMENT "Build test_ifc_id1.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/test_ifc_id1.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated" --no_ps
    VERBATIM
    )
add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/generated/test_ifc_id2.h
    DEPENDS sdv_idl_compiler
    MAIN_DEPENDENCY  ${PROJECT_SOURCE_DIR}/test_ifc_id2.idl
    COMMENT "Build test_ifc_id2.idl"
    COMMAND ${SDVIDL} "${PROJECT_SOURCE_DIR}/test_ifc_id2.idl" "-I${PROJECT_SOURCE_DIR}/../../../export" "-O${PROJECT_SOURCE_DIR}/generated" --no_ps
    VERBATIM
    )
set_source_files_properties(generator_interface_id_test.cpp OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/generated/test.h)
set_source_files_properties(generator_ps_test.cpp OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/generated/test.h)
set_source_files_properties(generator_ps_interface_test.cpp OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/generated/interfaces.h)

# Get xxHash from github
include(FetchContent)
FetchContent_Declare(
    xxhash
    GIT_REPOSITORY                https://github.com/Cyan4973/xxHash.git
    GIT_TAG                       v0.8.1
)
FetchContent_MakeAvailable(xxhash)

# Add include directories
include_directories(../../../export ${xxhash_SOURCE_DIR})

# Compile the source code
add_executable(UnitTest_IDLCompiler
    "generated/linked.h"
    "generated/test.h"
    "generated/array.h"
    "generated/test_ifc_id1.h"
    "generated/test_ifc_id2.h"
    "generated/union.h"
    "main.cpp"
    "lexer_test.cpp"
    "parser_test.cpp"
    "preproc_test.cpp"
    "source_test.cpp"
    "code_to_text_test.cpp"
    "parser_module_test.cpp"
    "constvariant_test.cpp"
    "parser_const_assignment_test.cpp"
    "parser_var_assignment_test.cpp"
    "parser_interface_test.cpp"
    "parser_struct_test.cpp"
    "parser_typedef_test.cpp"
    "parser_exception_test.cpp"
    "parser_union_test.cpp"
    "parser_enum_test.cpp"
    "commandline_test.cpp"
    "parser_meta_test.cpp"
    "parser_meta_test.cpp"
    "generator_interface_id_test.cpp"
    "generator_ps_test.cpp"
    "generator_test.cpp"
    "generator_test.h"
    "generator_ps_interface_test.cpp"
    "compiler_test.cpp"


    "idl_interface_id_compatibility.cpp"
    "parser_ext_test.cpp"
    )
target_link_libraries(UnitTest_IDLCompiler ${CMAKE_DL_LIBS} GTest::GTest)

# Add the IDL Compiler unittest
add_test(NAME UnitTest_IDLCompiler COMMAND UnitTest_IDLCompiler)

# Execute the test
add_custom_command(TARGET UnitTest_IDLCompiler POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E env TEST_EXECUTION_MODE=CMake "$<TARGET_FILE:UnitTest_IDLCompiler>" "--gtest_output=xml:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/UnitTest_IDLCompiler.xml"
    VERBATIM
)

# The unit-test project depends on a proper compilation of the compiler before
add_dependencies(UnitTest_IDLCompiler dependency_sdv_components)
