cmake_minimum_required(VERSION 3.16)

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    project(ukui-panel-autotest LANGUAGES CXX)
    enable_testing()

    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
endif()

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test Gui Quick Widgets RemoteObjects DBus REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} CONFIG REQUIRED COMPONENTS Core Test Gui Quick Widgets RemoteObjects DBus)
find_package(ukui-quick COMPONENTS framework REQUIRED)
find_package(PkgConfig REQUIRED)
remove_definitions(-DQT_NO_CAST_FROM_ASCII)

if (QT_VERSION_MAJOR EQUAL "5")
    set(AUTOTEST_GSETTINGS_QT gsettings-qt)
elseif (QT_VERSION_MAJOR EQUAL "6")
    set(AUTOTEST_GSETTINGS_QT gsettings-qt6)
endif()

set(PANEL_AUTOTEST_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(PANEL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../src")

include_directories(${PANEL_AUTOTEST_SOURCE_DIR} ${PANEL_SOURCE_DIR})

add_executable(screenManagerTest
        screen-manager-test.cpp
        ../src/screens-manager.cpp)

target_link_libraries(screenManagerTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::Gui
        )
add_test(NAME screenManagerTest COMMAND screenManagerTest)

pkg_check_modules(KYSDK_DATACOLLECT REQUIRED IMPORTED_TARGET kysdk-datacollect)
find_program(QT_MOC_EXECUTABLE NAMES moc-qt6 moc-qt5 moc REQUIRED)
find_program(REPC_EXECUTABLE NAMES repc REQUIRED)

set(DATA_COLLECTOR_MOC ${CMAKE_CURRENT_BINARY_DIR}/data-collector.moc)
add_custom_command(
        OUTPUT ${DATA_COLLECTOR_MOC}
        COMMAND ${QT_MOC_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../src/data-collector.cpp -o ${DATA_COLLECTOR_MOC}
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../src/data-collector.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../src/data-collector.h
)
add_custom_target(dataCollectorMoc DEPENDS ${DATA_COLLECTOR_MOC})

add_executable(dataCollectorTest
        data-collector-test.cpp
        data-collector-test.h)
add_dependencies(dataCollectorTest dataCollectorMoc)
target_include_directories(dataCollectorTest PRIVATE
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/../src)
target_link_libraries(dataCollectorTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        PkgConfig::KYSDK_DATACOLLECT
        )
add_test(NAME dataCollectorTest COMMAND dataCollectorTest)
set_tests_properties(dataCollectorTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp")

add_executable(logUtilsTest
        log-utils-test.cpp
        log-utils-test.h
        ../src/log-utils.cpp)
target_link_libraries(logUtilsTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        )
add_test(NAME logUtilsTest COMMAND logUtilsTest)
set_tests_properties(logUtilsTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp")

pkg_check_modules(PANEL_GSETTINGS_QT REQUIRED IMPORTED_TARGET ${AUTOTEST_GSETTINGS_QT})
pkg_check_modules(PANEL_GSETTINGS_GIO REQUIRED IMPORTED_TARGET gio-2.0)
find_program(GLIB_COMPILE_SCHEMAS_EXECUTABLE NAMES glib-compile-schemas REQUIRED)

set(PANEL_GSETTINGS_SCHEMA_DIR ${CMAKE_CURRENT_BINARY_DIR}/panel-gsettings-schemas)
set(PANEL_GSETTINGS_SCHEMA_XML ${CMAKE_CURRENT_SOURCE_DIR}/../data/org.ukui.panel.settings.gschema.xml)
set(PANEL_GSETTINGS_SCHEMA_COMPILED ${PANEL_GSETTINGS_SCHEMA_DIR}/gschemas.compiled)

add_custom_command(
        OUTPUT ${PANEL_GSETTINGS_SCHEMA_COMPILED}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${PANEL_GSETTINGS_SCHEMA_DIR}
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PANEL_GSETTINGS_SCHEMA_XML} ${PANEL_GSETTINGS_SCHEMA_DIR}/org.ukui.panel.settings.gschema.xml
        COMMAND ${GLIB_COMPILE_SCHEMAS_EXECUTABLE} ${PANEL_GSETTINGS_SCHEMA_DIR}
        DEPENDS ${PANEL_GSETTINGS_SCHEMA_XML}
)
add_custom_target(panelGSettingsSchema DEPENDS ${PANEL_GSETTINGS_SCHEMA_COMPILED})

add_executable(panelGSettingsTest
        panel-gsettings-test.cpp
        panel-gsettings-test.h
        ../src/panel-gsettings.cpp)
add_dependencies(panelGSettingsTest panelGSettingsSchema)
target_compile_definitions(panelGSettingsTest PRIVATE
        PANEL_GSETTINGS_TEST_SCHEMA_DIR="${PANEL_GSETTINGS_SCHEMA_DIR}")
target_link_libraries(panelGSettingsTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        PkgConfig::PANEL_GSETTINGS_QT
        PkgConfig::PANEL_GSETTINGS_GIO
        )
add_test(NAME panelGSettingsTest COMMAND panelGSettingsTest)
set_tests_properties(panelGSettingsTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp")

set(REMOTE_CONFIG_REPLICA ${CMAKE_CURRENT_BINARY_DIR}/rep_remote-config_replica.h)
set(REMOTE_CONFIG_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/rep_remote-config_source.h)
add_custom_command(
        OUTPUT ${REMOTE_CONFIG_REPLICA} ${REMOTE_CONFIG_SOURCE}
        COMMAND ${REPC_EXECUTABLE} -o replica ${CMAKE_CURRENT_SOURCE_DIR}/../src/remote-config.rep ${REMOTE_CONFIG_REPLICA}
        COMMAND ${REPC_EXECUTABLE} -o source ${CMAKE_CURRENT_SOURCE_DIR}/../src/remote-config.rep ${REMOTE_CONFIG_SOURCE}
        COMMAND sed -i s/REP_REMOTE-CONFIG/REP_REMOTE_CONFIG/g ${REMOTE_CONFIG_REPLICA} ${REMOTE_CONFIG_SOURCE}
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../src/remote-config.rep ${CMAKE_CURRENT_SOURCE_DIR}/../src/general-config-define.h
)

add_executable(messageProcessorTest
        message-processor-test.cpp
        message-processor-test.h
        ../src/message-processor.cpp
        ../src/general-config-define.h
        ${REMOTE_CONFIG_REPLICA}
        ${REMOTE_CONFIG_SOURCE})
target_include_directories(messageProcessorTest PRIVATE
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/../src)
target_link_libraries(messageProcessorTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::RemoteObjects
        )
add_test(NAME messageProcessorTest COMMAND messageProcessorTest)
set_tests_properties(messageProcessorTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp")

add_executable(windowSuppressionStateTest
        window-suppression-state-test.cpp
        window-suppression-state-test.h)
target_link_libraries(windowSuppressionStateTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        )
add_test(NAME windowSuppressionStateTest COMMAND windowSuppressionStateTest)

add_executable(focusReturnSessionTest
        focus-return-session-test.cpp)
target_link_libraries(focusReturnSessionTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Gui
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test)
add_test(NAME focusReturnSessionTest COMMAND focusReturnSessionTest)
set_tests_properties(focusReturnSessionTest PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen")

add_executable(panelHostFocusStateTest
        panel-host-focus-state-test.cpp)
target_link_libraries(panelHostFocusStateTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::Widgets
        Qt${QT_VERSION_MAJOR}::Qml
        ukui-quick::framework)
add_test(NAME panelHostFocusStateTest COMMAND panelHostFocusStateTest)

add_executable(panelFocusWindowTest panel-focus-window-test.cpp)
target_link_libraries(panelFocusWindowTest PRIVATE
        Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Test)
add_test(NAME panelFocusWindowTest COMMAND panelFocusWindowTest)
set_tests_properties(panelFocusWindowTest PROPERTIES
        ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QT_QPA_PLATFORMTHEME=generic;QT_QUICK_BACKEND=software")

add_executable(taskMenuFocusFallbackTest task-menu-focus-fallback-test.cpp)
target_link_libraries(taskMenuFocusFallbackTest PRIVATE
        Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Test)
add_test(NAME taskMenuFocusFallbackTest COMMAND taskMenuFocusFallbackTest)
set_tests_properties(taskMenuFocusFallbackTest PROPERTIES
        ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QT_QPA_PLATFORMTHEME=generic;QT_QUICK_BACKEND=software")

add_executable(panelFocusVisualStateTest
        panel-focus-visual-state-test.cpp
        ../src/view/panel-focus-visual-state.h)
target_link_libraries(panelFocusVisualStateTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::Gui
        Qt${QT_VERSION_MAJOR}::Quick)
add_test(NAME panelFocusVisualStateTest COMMAND panelFocusVisualStateTest)
set_tests_properties(panelFocusVisualStateTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp;QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=software")

add_executable(panelDesktopFocusHandoffTest
        panel-desktop-focus-handoff-test.cpp
        ../src/view/panel-desktop-focus-handoff.cpp
        ../src/view/panel-desktop-focus-handoff.h
        ../src/view/panel-focus-visual-state.h)
target_link_libraries(panelDesktopFocusHandoffTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::Gui
        Qt${QT_VERSION_MAJOR}::Quick)
add_test(NAME panelDesktopFocusHandoffTest COMMAND panelDesktopFocusHandoffTest)
set_tests_properties(panelDesktopFocusHandoffTest PROPERTIES ENVIRONMENT "HOME=/tmp;XDG_RUNTIME_DIR=/tmp;QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=software")

add_executable(panelFocusFeatureTest
        panel-focus-feature-test.cpp
        ../src/focus/panel-focus-feature.h)
target_link_libraries(panelFocusFeatureTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        ukui-quick::framework)
add_test(NAME panelFocusFeatureTest COMMAND panelFocusFeatureTest)

add_executable(panelFocusProviderRegistryTest
        panel-focus-provider-registry-test.cpp
        ../src/focus/panel-focus-feature.h
        ../src/focus/panel-focus-provider-registry.h)
target_link_libraries(panelFocusProviderRegistryTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test
        Qt${QT_VERSION_MAJOR}::Widgets
        Qt${QT_VERSION_MAJOR}::Qml
        ukui-quick::framework)
add_test(NAME panelFocusProviderRegistryTest COMMAND panelFocusProviderRegistryTest)

add_executable(panelFocusQmlContractTest
        panel-focus-qml-contract-test.cpp)
target_link_libraries(panelFocusQmlContractTest PUBLIC
        Qt${QT_VERSION_MAJOR}::Core
        Qt${QT_VERSION_MAJOR}::Test)
add_test(NAME panelFocusQmlContractTest COMMAND panelFocusQmlContractTest)

add_custom_target(unit-tests
        DEPENDS
        screenManagerTest
        dataCollectorTest
        logUtilsTest
        panelGSettingsTest
        messageProcessorTest
        windowSuppressionStateTest
        focusReturnSessionTest
        panelHostFocusStateTest
        panelFocusWindowTest
        taskMenuFocusFallbackTest
        panelFocusVisualStateTest
        panelDesktopFocusHandoffTest
        panelFocusFeatureTest
        panelFocusProviderRegistryTest
        panelFocusQmlContractTest)

add_executable(dbusDesktopFocusRequesterTest dbus-desktop-focus-requester-test.cpp
        ../src/view/dbus-desktop-focus-requester.cpp)
target_link_libraries(dbusDesktopFocusRequesterTest PRIVATE
        Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::DBus)
find_program(DBUS_RUN_SESSION_EXECUTABLE dbus-run-session REQUIRED)
add_test(NAME dbusDesktopFocusRequesterTest
        COMMAND ${DBUS_RUN_SESSION_EXECUTABLE} -- $<TARGET_FILE:dbusDesktopFocusRequesterTest>)

add_executable(pluginFocusEntryTest plugin-focus-entry-test.cpp)
target_link_libraries(pluginFocusEntryTest PRIVATE Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Test)
add_test(NAME pluginFocusEntryTest COMMAND pluginFocusEntryTest)
set_tests_properties(pluginFocusEntryTest PROPERTIES ENVIRONMENT
        "QT_QPA_PLATFORM=offscreen;QT_QPA_PLATFORMTHEME=generic;QT_QUICK_BACKEND=software")
add_dependencies(unit-tests dbusDesktopFocusRequesterTest pluginFocusEntryTest)
