include(CodeCoverage)

find_package(Threads REQUIRED)

add_library(zipdirfs_test_root_obj OBJECT
        gtest.cpp
        StateReporter.cpp
        ZipDirFs/Integration.cpp
)

add_library(zipdirfs_test_helper_root_obj OBJECT
        gtest_helper.cpp
)

set(ZIPDIRFS_GTEST_ROOT "${PROJECT_SOURCE_DIR}/googletest")
if(NOT EXISTS "${ZIPDIRFS_GTEST_ROOT}/googletest/src/gtest-all.cc")
    set(ZIPDIRFS_GTEST_ROOT "/usr/src/googletest")
endif()

add_subdirectory(ZipDirFs)

if(NOT EXISTS "${ZIPDIRFS_GTEST_ROOT}/googletest/src/gtest-all.cc")
    add_custom_target(check
            COMMAND ${CMAKE_COMMAND} -E echo "googletest sources are required (copy to ./googletest or install in /usr/src/googletest)"
            COMMAND ${CMAKE_COMMAND} -E false
            VERBATIM
    )
    add_custom_target(coverage
            COMMAND ${CMAKE_COMMAND} -E echo "googletest sources are required (copy to ./googletest or install in /usr/src/googletest)"
            COMMAND ${CMAKE_COMMAND} -E false
            VERBATIM
    )
    return()
endif()

add_library(zipdirfs_gtest STATIC EXCLUDE_FROM_ALL
        ${ZIPDIRFS_GTEST_ROOT}/googletest/src/gtest-all.cc
)
target_include_directories(zipdirfs_gtest
        PUBLIC
        ${ZIPDIRFS_GTEST_ROOT}/googletest/include
        ${ZIPDIRFS_GTEST_ROOT}/googletest
)
target_link_libraries(zipdirfs_gtest PUBLIC Threads::Threads)
target_compile_features(zipdirfs_gtest PUBLIC cxx_std_11)

add_library(zipdirfs_gmock STATIC EXCLUDE_FROM_ALL
        ${ZIPDIRFS_GTEST_ROOT}/googlemock/src/gmock-all.cc
)
target_include_directories(zipdirfs_gmock
        PUBLIC
        ${ZIPDIRFS_GTEST_ROOT}/googlemock/include
        ${ZIPDIRFS_GTEST_ROOT}/googlemock
)
target_link_libraries(zipdirfs_gmock PUBLIC zipdirfs_gtest Threads::Threads)
target_compile_features(zipdirfs_gmock PUBLIC cxx_std_11)

add_library(zipdirfs_gmock_main STATIC EXCLUDE_FROM_ALL
        ${ZIPDIRFS_GTEST_ROOT}/googlemock/src/gmock_main.cc
)
target_link_libraries(zipdirfs_gmock_main PUBLIC zipdirfs_gmock zipdirfs_gtest Threads::Threads)
target_compile_features(zipdirfs_gmock_main PUBLIC cxx_std_11)

set(ZIPDIRFS_TEST_CORE_OBJECTS
        $<TARGET_OBJECTS:zipdirfs_options_obj>
        $<TARGET_OBJECTS:zipdirfs_statereporter_obj>
        $<TARGET_OBJECTS:zipdirfs_components_obj>
        $<TARGET_OBJECTS:zipdirfs_containers_obj_test>
        $<TARGET_OBJECTS:zipdirfs_fuse_obj>
        $<TARGET_OBJECTS:zipdirfs_utilities_obj>
        $<TARGET_OBJECTS:zipdirfs_zip_obj>
        $<TARGET_OBJECTS:zipdirfs_zip_base_obj>
)

add_library(zipdirfs_core_test STATIC ${ZIPDIRFS_TEST_CORE_OBJECTS})
target_compile_features(zipdirfs_core_test PUBLIC cxx_std_11)
target_link_libraries(zipdirfs_core_test
        PUBLIC
        ${LIBZIP_LIBRARIES}
)
target_link_options(zipdirfs_core_test PRIVATE ${FUSEKIT_LDFLAGS_OTHER} ${LIBZIP_LDFLAGS_OTHER})

set(ZIPDIRFS_TEST_OBJECT_TARGETS
        zipdirfs_test_root_obj
        zipdirfs_test_helper_root_obj
        zipdirfs_test_components_obj
        zipdirfs_test_components_fixtures_obj
        zipdirfs_test_containers_obj
        zipdirfs_test_containers_fixtures_obj
        zipdirfs_test_containers_helpers_fixtures_obj
        zipdirfs_test_fuse_obj
        zipdirfs_test_fuse_fixtures_obj
        zipdirfs_test_fuse_worker_obj
        zipdirfs_test_utilities_obj
        zipdirfs_test_utilities_fixtures_obj
        zipdirfs_test_worker_obj
        zipdirfs_test_zip_obj
        zipdirfs_test_zip_fixtures_obj
        zipdirfs_test_zip_base_obj
)

foreach(test_object_target IN LISTS ZIPDIRFS_TEST_OBJECT_TARGETS)
    target_compile_features(${test_object_target} PUBLIC cxx_std_11)
    target_include_directories(${test_object_target}
            PRIVATE
            ${PROJECT_SOURCE_DIR}
            ${PROJECT_SOURCE_DIR}/include
            ${PROJECT_BINARY_DIR}
            ${FUSE_INCLUDE_DIRS}
            ${FUSEKIT_INCLUDE_DIRS}
            ${LIBZIP_INCLUDE_DIRS}
            ${ZIPDIRFS_GTEST_ROOT}/googletest/include
            ${ZIPDIRFS_GTEST_ROOT}/googlemock/include
    )
    target_compile_options(${test_object_target}
            PRIVATE
            ${FUSE_CFLAGS_OTHER}
            ${FUSEKIT_CFLAGS_OTHER}
            ${LIBZIP_CFLAGS_OTHER}
    )
endforeach()

add_executable(gtest EXCLUDE_FROM_ALL
        $<TARGET_OBJECTS:zipdirfs_test_root_obj>
        $<TARGET_OBJECTS:zipdirfs_test_components_obj>
        $<TARGET_OBJECTS:zipdirfs_test_components_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_containers_obj>
        $<TARGET_OBJECTS:zipdirfs_test_containers_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_containers_helpers_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_fuse_obj>
        $<TARGET_OBJECTS:zipdirfs_test_fuse_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_utilities_obj>
        $<TARGET_OBJECTS:zipdirfs_test_utilities_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_zip_obj>
        $<TARGET_OBJECTS:zipdirfs_test_zip_fixtures_obj>
        $<TARGET_OBJECTS:zipdirfs_test_zip_base_obj>
)
target_compile_features(gtest PRIVATE cxx_std_11)
target_include_directories(gtest PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR})
target_include_directories(gtest PRIVATE ${FUSE_INCLUDE_DIRS} ${FUSEKIT_INCLUDE_DIRS} ${LIBZIP_INCLUDE_DIRS})
target_compile_options(gtest PRIVATE ${FUSE_CFLAGS_OTHER} ${FUSEKIT_CFLAGS_OTHER} ${LIBZIP_CFLAGS_OTHER})
target_link_libraries(gtest
        PRIVATE
        zipdirfs_core_test
        zipdirfs_gtest
        zipdirfs_gmock
        zipdirfs_gmock_main
        Threads::Threads
        ${FUSE_LIBRARIES}
)
target_link_options(gtest PRIVATE ${FUSE_LDFLAGS_OTHER})

add_executable(gtest_helper EXCLUDE_FROM_ALL
        $<TARGET_OBJECTS:zipdirfs_test_helper_root_obj>
        $<TARGET_OBJECTS:zipdirfs_test_worker_obj>
        $<TARGET_OBJECTS:zipdirfs_test_fuse_worker_obj>
)
target_compile_features(gtest_helper PRIVATE cxx_std_11)
target_include_directories(gtest_helper PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR})
target_include_directories(gtest_helper PRIVATE ${FUSE_INCLUDE_DIRS} ${FUSEKIT_INCLUDE_DIRS} ${LIBZIP_INCLUDE_DIRS})
target_compile_options(gtest_helper PRIVATE ${FUSE_CFLAGS_OTHER} ${FUSEKIT_CFLAGS_OTHER} ${LIBZIP_CFLAGS_OTHER})
target_link_libraries(gtest_helper PRIVATE Threads::Threads)
# target_link_libraries(gtest_helper PRIVATE Boost::filesystem Boost::system)

zipdirfs_enable_coverage(gtest)
zipdirfs_enable_coverage(gtest_helper)
zipdirfs_enable_coverage(zipdirfs_core_test)

add_test(NAME gtest COMMAND gtest --gtest_filter=-ZipDirectoryEnumeratorTest.AutoCleanup)

add_custom_target(check
        COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
        DEPENDS gtest gtest_helper
        USES_TERMINAL
)

zipdirfs_add_coverage_target()
add_dependencies(coverage gtest gtest_helper)
