summaryrefslogtreecommitdiffstats
path: root/cmake/UnitTest.cmake
blob: 2552b32ce881363edf6d74b7e6da2b8c0630b7d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
find_package(Qt5Test REQUIRED)

set(TEST_RESOURCE_PATH ${CMAKE_CURRENT_LIST_DIR})

message(${TEST_RESOURCE_PATH})

function(add_unit_test name)
	set(options "")
	set(oneValueArgs DATA)
	set(multiValueArgs SOURCES LIBS)

	cmake_parse_arguments(OPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

	if(WIN32)
		add_executable(${name}_test ${OPT_SOURCES} ${TEST_RESOURCE_PATH}/UnitTest/test.rc)
	else()
		add_executable(${name}_test ${OPT_SOURCES})
	endif()

	if(NOT "${OPT_DATA}" STREQUAL "")
		set(TEST_DATA_PATH "${CMAKE_CURRENT_BINARY_DIR}/data")
		set(TEST_DATA_PATH_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${OPT_DATA}")
		message("From ${TEST_DATA_PATH_SRC} to ${TEST_DATA_PATH}")
		string(REGEX REPLACE "[/\\:]" "_" DATA_TARGET_NAME "${TEST_DATA_PATH_SRC}")
		if(UNIX)
			# on unix we get the third / from the filename
			set(TEST_DATA_URL "file://${TEST_DATA_PATH}")
		else()
			# we don't on windows, so we have to add it ourselves
			set(TEST_DATA_URL "file:///${TEST_DATA_PATH}")
		endif()
		if(NOT TARGET "${DATA_TARGET_NAME}")
			add_custom_target(${DATA_TARGET_NAME})
			add_dependencies(${name}_test ${DATA_TARGET_NAME})
			add_custom_command(
				TARGET ${DATA_TARGET_NAME}
				COMMAND ${CMAKE_COMMAND} "-DTEST_DATA_URL=${TEST_DATA_URL}" -DSOURCE=${TEST_DATA_PATH_SRC} -DDESTINATION=${TEST_DATA_PATH} -P ${TEST_RESOURCE_PATH}/UnitTest/generate_test_data.cmake
				WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
			)
		endif()
	endif()

	target_link_libraries(${name}_test Qt5::Test ${OPT_LIBS})

	target_include_directories(${name}_test PRIVATE "${TEST_RESOURCE_PATH}/UnitTest/")

	add_test(NAME ${name} COMMAND ${name}_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endfunction()