qt5_add_resources(QRC_FIXTURE "fixture/fixture.qrc")
ADD_OBJECT_LIBRARY(QRC_FIXTURE_OBJ ${QRC_FIXTURE} Qt5::Core)


FUNCTION(EXTRACT_TESTNAME result filepath)
	STRING(REPLACE ".cpp" "" testname ${filepath})
	STRING(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" testname ${testname})
	STRING(REPLACE "/" "_" testname ${testname})
	STRING(REPLACE "_test_" "_" testname ${testname})
	SET(${result} "Test_${testname}" PARENT_SCOPE)
ENDFUNCTION()


FUNCTION(GET_TEST_CMDLINE cmdline testname)
	cmake_parse_arguments(_PARAM "" "" "SELECTORS" ${ARGN})

	IF(NOT WIN32
		AND (
		"${testname}" MATCHES "export"
		OR "${testname}" MATCHES "widget"
		OR "${testname}" MATCHES "\\.qml"))

		SET(PLATFORM -platform offscreen)
	ENDIF()

	FOREACH(SELECTOR ${_PARAM_SELECTORS})
		SET(testname "${testname}_${SELECTOR}")
	ENDFOREACH()

	SET(${cmdline} ${PLATFORM} -v2 -o ${CMAKE_CURRENT_BINARY_DIR}/results.${testname}.log.xml,xml -o -,txt PARENT_SCOPE)
ENDFUNCTION()


FUNCTION(ADD_QML_TEST _sourcefile)
	cmake_parse_arguments(_PARAM "" "" "SELECTORS" ${ARGN})

	EXTRACT_TESTNAME(TESTNAME ${_sourcefile})
	GET_TEST_CMDLINE(CMD_PARAMS ${TESTNAME} SELECTORS ${_PARAM_SELECTORS})
	SET(CMD $<TARGET_FILE:QmlTestRunner> ${CMD_PARAMS} -input ${sourcefile} -import "qrc:///qml/")
	SET(ENV_FAIL_ON_WARNING "QT_FATAL_WARNINGS=true")
	# Emasculate ASAN since QtQuick causes problems
	SET(ENV_EMASCULATE_ASAN "ASAN_OPTIONS=detect_leaks=0,new_delete_type_mismatch=0")

	IF(_PARAM_SELECTORS)
		FOREACH(_PARAM_SELECTOR_LIST_ENTRY ${_PARAM_SELECTORS})
			SET(TESTNAME ${TESTNAME}_${_PARAM_SELECTOR_LIST_ENTRY})
			SET(CMD ${CMD} -file-selector ${_PARAM_SELECTOR_LIST_ENTRY})
		ENDFOREACH()
	ENDIF()

	ADD_TEST(NAME ${TESTNAME} COMMAND ${CMD})
	SET_TESTS_PROPERTIES(${TESTNAME} PROPERTIES LABELS "qml" ENVIRONMENT "${ENV_FAIL_ON_WARNING}" ENVIRONMENT "${ENV_EMASCULATE_ASAN}")
ENDFUNCTION()


FUNCTION(ADD_QML_TEST_FILES)
	cmake_parse_arguments(_PARAM "" "" "SELECTORS" ${ARGN})
	IF(NOT BSD AND (NOT Qt5Core_VERSION VERSION_LESS 5.11.0 OR QT_VENDOR STREQUAL "Governikus"))
		SET(HAS_FILE_SELECTOR_PATCH TRUE)
	ELSE()
		SET(HAS_FILE_SELECTOR_PATCH FALSE)
	ENDIF()

	FILE(GLOB_RECURSE TEST_SUBFILES "${CMAKE_CURRENT_SOURCE_DIR}/test_*.qml")
	FOREACH(sourcefile ${TEST_SUBFILES})
		IF(NOT _PARAM_SELECTORS)
			ADD_QML_TEST(${sourcefile})
		ELSEIF(HAS_FILE_SELECTOR_PATCH)
			ADD_QML_TEST(${sourcefile} SELECTORS ${_PARAM_SELECTORS})
		ENDIF()
	ENDFOREACH()
ENDFUNCTION()

IF(TARGET Qt5::Test)
	ADD_SUBDIRECTORY(helper)
	IF(TARGET Qt5::Qml AND TARGET Qt5::QuickTest)
		ADD_SUBDIRECTORY(qml)
	ENDIF()
	ADD_SUBDIRECTORY(qt)
ENDIF()
