# make sure the generated headers can be found
include_directories(${CMAKE_CURRENT_BINARY_DIR})

include(ECMMarkAsTest)
include(${CMAKE_SOURCE_DIR}/KF6ConfigMacros.cmake)

macro(GEN_KCFG_TEST_SOURCE _testName _srcs)
    KCONFIG_ADD_KCFG_FILES(${_srcs} ${_testName}.kcfgc ${ARGN})
endmacro()

function(kconfig_compiler_test ARG_NAME)
    cmake_parse_arguments(PARSE_ARGV 1 ARG "GENERATE_MOC" "MAIN;CLASS_NAME;KCFG;KCFGC" "")

    string(TOLOWER "${ARG_NAME}" _name_lc)

    if("${ARG_MAIN}" STREQUAL "")
        set(ARG_MAIN "${_name_lc}main.cpp")
    endif()

    if("${ARG_CLASS_NAME}" STREQUAL "")
        set(ARG_CLASS_NAME "${ARG_NAME}")
    endif()

    if("${ARG_KCFG}" STREQUAL "")
        set(ARG_KCFG "${_name_lc}.kcfg")
    endif()

    if("${ARG_KCFGC}" STREQUAL "")
        set(ARG_KCFGC "${_name_lc}.kcfgc")
    endif()

    if(${ARG_GENERATE_MOC})
        set(_moc GENERATE_MOC)
    endif()

    # execute the tests in ${CMAKE_CURRENT_BINARY_DIR} to ensure we can easily find the generated files

    ecm_add_test(TEST_NAME ${ARG_NAME} ${ARG_MAIN} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    KCONFIG_ADD_KCFG_FILES(${ARG_NAME} "${ARG_KCFGC}" ${_moc})
    target_link_libraries(${ARG_NAME} Qt6::Test Qt6::Qml KF6::ConfigGui)

    ecm_add_test(TEST_NAME ${ARG_NAME}_cmake ${ARG_MAIN} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    get_filename_component(_kcfg_we "${ARG_KCFG}" NAME_WE)
    configure_file("${ARG_KCFG}" "${_kcfg_we}_cmake.kcfg" COPYONLY)
    kconfig_target_kcfg_file(${ARG_NAME}_cmake FILE "${CMAKE_CURRENT_BINARY_DIR}/${_kcfg_we}_cmake.kcfg" CLASS_NAME "${ARG_CLASS_NAME}" ${_moc} ${ARG_UNPARSED_ARGUMENTS})
    target_link_libraries(${ARG_NAME}_cmake Qt6::Test Qt6::Qml KF6::ConfigGui)
    add_dependencies(${ARG_NAME}_cmake ${ARG_NAME})
endfunction()

kconfig_compiler_test(Test1 PARENT_IN_CONSTRUCTOR MUTATORS)
kconfig_compiler_test(Test2 MUTATORS GLOBAL_ENUMS ITEM_ACCESSORS SET_USER_TEXTS INHERITS MyPrefs INCLUDE_FILES myprefs.h MEMBER_VARIABLES public)
kconfig_compiler_test(Test3 MUTATORS GLOBAL_ENUMS ITEM_ACCESSORS NAME_SPACE TestNameSpace)
kconfig_compiler_test(Test3a MUTATORS GLOBAL_ENUMS ITEM_ACCESSORS NAME_SPACE TestNameSpace::InnerNameSpace)
kconfig_compiler_test(Test4 SINGLETON MUTATORS)
kconfig_compiler_test(Test5 PARENT_IN_CONSTRUCTOR SINGLETON MUTATORS GLOBAL_ENUMS)
kconfig_compiler_test(Test6 MUTATORS GLOBAL_ENUMS)
kconfig_compiler_test(Test7 MUTATORS GLOBAL_ENUMS)

kconfig_compiler_test(Test8 KCFGC test8a.kcfgc KCFG test8a.kcfg CLASS_NAME Test8a PARENT_IN_CONSTRUCTOR MUTATORS)
KCONFIG_ADD_KCFG_FILES(Test8 test8c.kcfgc)
KCONFIG_ADD_KCFG_FILES(Test8 test8b.kcfgc)
kconfig_target_kcfg_file(Test8_cmake FILE test8b.kcfg CLASS_NAME Test8b SINGLETON MUTATORS INCLUDE_FILES test8a.h INHERITS Test8a)
kconfig_target_kcfg_file(Test8_cmake FILE test8c.kcfg CLASS_NAME Test8c SINGLETON PARENT_IN_CONSTRUCTOR MUTATORS)

kconfig_compiler_test(Test9 MEMBER_VARIABLES public MUTATORS)
kconfig_compiler_test(Test10 SINGLETON)

kconfig_compiler_test(Test11 PARENT_IN_CONSTRUCTOR MUTATORS INHERITS MyPrefs INCLUDE_FILES myprefs.h MEMBER_VARIABLES public ITEM_ACCESSORS SET_USER_TEXTS USE_ENUM_TYPES DEFAULT_VALUE_GETTERS)
KCONFIG_ADD_KCFG_FILES(Test11 test11a.kcfgc)
kconfig_target_kcfg_file(Test11_cmake FILE test11a.kcfg CLASS_NAME Test11a MUTATORS INHERITS MyPrefs INCLUDE_FILES myprefs.h MEMBER_VARIABLES public ITEM_ACCESSORS SET_USER_TEXTS USE_ENUM_TYPES DEFAULT_VALUE_GETTERS)

kconfig_compiler_test(Test12 test12main.cpp)
kconfig_compiler_test(Test13 test13main.cpp MUTATORS GENERATE_PROPERTIES GENERATE_MOC)
kconfig_compiler_test(Test14 KCFGC test14.kcfgc KCFG test14.kcfg CLASS_NAME Test14 GENERATE_PROPERTIES GENERATE_MOC SINGLETON QML_REGISTRATION)
kconfig_compiler_test(Test15 CLASS_NAME Test15 GENERATE_PROPERTIES GENERATE_MOC SINGLETON QML_REGISTRATION)
kconfig_compiler_test(Test16 CLASS_NAME Test16 GENERATE_PROPERTIES GENERATE_MOC SINGLETON QML_REGISTRATION QML_UNCREATABLE)
kconfig_compiler_test(Test17 CLASS_NAME Test17 GENERATE_PROPERTIES GENERATE_MOC SINGLETON QML_REGISTRATION DEFAULT_VALUE_GETTERS)

kconfig_compiler_test(test_state_config MAIN test_state_config_main.cpp CLASS_NAME MyStateConfig MUTATORS ITEM_ACCESSORS GENERATE_MOC)
kconfig_compiler_test(test_state_config_nameless MAIN test_state_config_nameless_main.cpp CLASS_NAME MyStateConfig MUTATORS ITEM_ACCESSORS GENERATE_MOC)
kconfig_compiler_test(test_emptyentries MAIN test_emptyentries_main.cpp CLASS_NAME QMakeBuilderSettings SINGLETON GENERATE_MOC)
kconfig_compiler_test(test_subgroups MAIN test_subgroups_main.cpp CLASS_NAME TestSubgroups NOTIFIERS GENERATE_MOC)
kconfig_compiler_test(test_dpointer MAIN test_dpointer_main.cpp CLASS_NAME TestDPointer SINGLETON MUTATORS MEMBER_VARIABLES dpointer ITEM_ACCESSORS SET_USER_TEXTS)
kconfig_compiler_test(test_signal MAIN test_signal_main.cpp CLASS_NAME TestSignal SINGLETON MUTATORS MEMBER_VARIABLES private GENERATE_MOC)
kconfig_compiler_test(test_notifiers MAIN test_notifiers_main.cpp CLASS_NAME TestNotifiers MUTATORS GLOBAL_ENUMS NOTIFIERS)
kconfig_compiler_test(test_time MAIN test_time_main.cpp CLASS_NAME TestTime MUTATORS)

########### next target ###############

set(kconfigcompiler_test_signals_SRCS kconfigcompiler_test_signals.cpp)
gen_kcfg_test_source(signals_test_singleton kconfigcompiler_test_signals_SRCS GENERATE_MOC)
gen_kcfg_test_source(signals_test_no_singleton kconfigcompiler_test_signals_SRCS GENERATE_MOC)
gen_kcfg_test_source(signals_test_singleton_dpointer kconfigcompiler_test_signals_SRCS GENERATE_MOC)
gen_kcfg_test_source(signals_test_no_singleton_dpointer kconfigcompiler_test_signals_SRCS GENERATE_MOC)
gen_kcfg_test_source(signals_test_singleton_itemaccessors kconfigcompiler_test_signals_SRCS GENERATE_MOC)

ecm_add_test(${kconfigcompiler_test_signals_SRCS}
    TEST_NAME kconfigcompiler-signals-test
    LINK_LIBRARIES Qt6::Test KF6::ConfigGui
)

########### next target ###############

set(test_properties_minmax_SRCS test_properties_minmax_main.cpp)
gen_kcfg_test_source(test_properties_minmax test_properties_minmax_SRCS GENERATE_MOC)

ecm_add_test(${test_properties_minmax_SRCS}
    TEST_NAME test_properties_minmax
    LINK_LIBRARIES KF6::ConfigGui
)

########### next target ###############

set(test_param_minmax_SRCS test_param_minmax_main.cpp)
gen_kcfg_test_source(test_param_minmax test_param_minmax_SRCS)

ecm_add_test(${test_param_minmax_SRCS}
    TEST_NAME test_param_minmax
    LINK_LIBRARIES KF6::ConfigGui
)

########### next target ###############

ecm_add_test(kconfigcompiler_test.cpp
    TEST_NAME kconfigcompiler-basic-test
    LINK_LIBRARIES Qt6::Test
)


########### next target ###############

set(test_qcategory_SRCS test_qdebugcategorymain.cpp test_qdebugcategory_debug.cpp)
gen_kcfg_test_source(test_qdebugcategory test_qcategory_SRCS)
ecm_add_test(TEST_NAME test_qdebugcategory ${test_qcategory_SRCS})
target_link_libraries(test_qdebugcategory KF6::ConfigGui)

########### next target ###############

set(test_translation_qt_SRCS test_translation_qt_main.cpp)
gen_kcfg_test_source(test_translation_qt test_translation_qt_SRCS)

ecm_add_test(TEST_NAME test_translation_qt ${test_translation_qt_SRCS})
target_link_libraries(test_translation_qt KF6::ConfigGui)

########### next target ###############

set(test_translation_kde_SRCS test_translation_kde_main.cpp)
gen_kcfg_test_source(test_translation_kde test_translation_kde_SRCS)

ecm_add_test(TEST_NAME test_translation_kde ${test_translation_kde_SRCS})
target_link_libraries(test_translation_kde KF6::ConfigGui)

########### next target ###############

set(test_translation_kde_domain_SRCS test_translation_kde_domain_main.cpp)
gen_kcfg_test_source(test_translation_kde_domain test_translation_kde_domain_SRCS)

ecm_add_test(TEST_NAME test_translation_kde_domain ${test_translation_kde_domain_SRCS})
target_link_libraries(test_translation_kde_domain KF6::ConfigGui)

########### next target ###############

set(test_fileextensions_SRCS test_fileextensions_main.cxx)
gen_kcfg_test_source(test_fileextensions test_fileextensions_SRCS)

ecm_add_test(TEST_NAME test_fileextensions ${test_fileextensions_SRCS})
target_link_libraries(test_fileextensions KF6::ConfigGui)


####### next target ##########
## If this to compiles, we are sure that the generation is correct.
set(test_enums_and_properties_SRCS enum_group_main.cpp)
gen_kcfg_test_source(test_enums_and_properties test_enums_and_properties_SRCS GENERATE_MOC)
ecm_add_test(TEST_NAME test_enums_and_properties ${test_enums_and_properties_SRCS})
target_link_libraries(test_enums_and_properties KF6::ConfigGui)

ecm_add_test(test14qml.cpp TEST_NAME test14qml)
qt6_add_qml_module(test14qml URI "org.kde.kconfig.test14" QML_FILES Test14Qml.qml)
kconfig_add_kcfg_files(test14qml "test14.kcfgc" GENERATE_MOC)
target_link_libraries(test14qml PRIVATE Qt6::Gui Qt6::Qml Qt6::Test KF6::ConfigGui)
if (NOT QT6_IS_SHARED_LIBS_BUILD)
    qt6_import_qml_plugins(test14qml)
endif()

ecm_add_test(test15qml.cpp TEST_NAME test15qml)
qt6_add_qml_module(test15qml URI "org.kde.kconfig.test15" QML_FILES Test15Qml.qml)
kconfig_add_kcfg_files(test15qml "test15.kcfgc" GENERATE_MOC)
target_link_libraries(test15qml PRIVATE Qt6::Gui Qt6::Qml Qt6::Test KF6::ConfigGui)
if (NOT QT6_IS_SHARED_LIBS_BUILD)
    qt6_import_qml_plugins(test15qml)
endif()

ecm_add_test(test16qml.cpp TEST_NAME test16qml)
qt6_add_qml_module(test16qml URI "org.kde.kconfig.test16" QML_FILES Test16Qml.qml)
kconfig_add_kcfg_files(test16qml "test16.kcfgc" GENERATE_MOC)
target_link_libraries(test16qml PRIVATE Qt6::Gui Qt6::Qml Qt6::Test KF6::ConfigGui)
if (NOT QT6_IS_SHARED_LIBS_BUILD)
    qt6_import_qml_plugins(test16qml)
endif()

ecm_add_test(test17qml.cpp TEST_NAME test17qml)
qt6_add_qml_module(test17qml URI "org.kde.kconfig.test17" QML_FILES Test17Qml.qml)
kconfig_add_kcfg_files(test17qml "test17.kcfgc" GENERATE_MOC)
target_link_libraries(test17qml PRIVATE Qt6::Gui Qt6::Qml Qt6::Test KF6::ConfigGui)
if (NOT QT6_IS_SHARED_LIBS_BUILD)
    qt6_import_qml_plugins(test17qml)
endif()
