#------------------------------------------------------------------------------- # Macros for generating google unit tests. #------------------------------------------------------------------------------- set(GOOGLETESTDIR ${CMAKE_CURRENT_LIST_DIR}) find_package(GTest) #------------------------------------------------------------------------------- # gtest_suite_begin(name) # Begin defining a unit test suite. # function(gtest_suite_begin name) if (UNITTESTS) set(options NO_TEMPLATE) set(oneValueArgs TEMPLATE) set(multiValueArgs) cmake_parse_arguments(${name} "${options}" "${oneValueArgs}" "" ${ARGN}) if (${name}_UNPARSED_ARGUMENTS) message(FATAL_ERROR "gtest_suite_begin(): called with invalid args '${${name}_UNPARSED_ARGUMENTS}'") endif() set_property(GLOBAL PROPERTY ${name}_Sources "") set_property(GLOBAL PROPERTY ${name}_Files "") set_property(GLOBAL PROPERTY ${name}_LUAFiles "") set_property(GLOBAL PROPERTY ${name}_Deps "") set_property(GLOBAL PROPERTY ${name}_EXECUTABLE True) set_property(GLOBAL PROPERTY ${name}_INSTALL False) if (NOT ${name}_NO_TEMPLATE) set(main_path ${CMAKE_CURRENT_BINARY_DIR}/${name}_main.cpp) if (${name}_TEMPLATE) configure_file(${${name}_TEMPLATE} ${main_path}) else() configure_file(${GOOGLETESTDIR}/main.cpp.in ${main_path}) endif() add_executable(${name} ${main_path}) else() add_executable(${name}) endif() # add googletest lib dependency if (GTEST_FOUND) target_include_directories(${name} PRIVATE ${GTEST_INCLUDE_DIRS}) target_link_libraries(${name} ${GTEST_LIBRARIES}) else() target_link_libraries(${name} gtest) endif() endif() endfunction() function(gtest_suite_sources name) if (UNITTESTS) set(ARG_LIST ${ARGV}) list(REMOVE_AT ARG_LIST 0) get_property(list GLOBAL PROPERTY ${name}_Sources) foreach(entry ${ARG_LIST}) list(APPEND list ${CMAKE_CURRENT_SOURCE_DIR}/${entry}) endforeach() set_property(GLOBAL PROPERTY ${name}_Sources ${list}) endif() endfunction() function(gtest_suite_files name) if (UNITTESTS) set(ARG_LIST ${ARGV}) list(REMOVE_AT ARG_LIST 0) get_property(list GLOBAL PROPERTY ${name}_Files) foreach(entry ${ARG_LIST}) list(APPEND list ${entry}) endforeach() set_property(GLOBAL PROPERTY ${name}_Files ${list}) endif() endfunction() function(gtest_suite_lua_sources name) if (UNITTESTS) set(ARG_LIST ${ARGV}) list(REMOVE_AT ARG_LIST 0) get_property(list GLOBAL PROPERTY ${name}_LUAFiles) foreach(entry ${ARG_LIST}) list(APPEND list ${entry}) endforeach() set_property(GLOBAL PROPERTY ${name}_LUAFiles ${list}) endif() endfunction() function(gtest_suite_deps name) if (UNITTESTS) set(ARG_LIST ${ARGV}) list(REMOVE_AT ARG_LIST 0) get_property(list GLOBAL PROPERTY ${name}_Deps) list(APPEND list ${ARG_LIST}) set_property(GLOBAL PROPERTY ${name}_Deps ${list}) endif() endfunction() function(gtest_suite_end name) if (UNITTESTS) project(${name}) get_property(srcs GLOBAL PROPERTY ${name}_Sources) get_property(deps GLOBAL PROPERTY ${name}_Deps) target_sources(${name} PRIVATE ${srcs}) set_target_properties(${name} PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}-${name}") set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${name}" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${name}" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${name}" ) foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/${name}" LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/${name}" RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_BINARY_DIR}/${name}" ) endforeach() target_compile_options(${name} PRIVATE $<$:-Wno-undef>) get_property(models GLOBAL PROPERTY ${name}_Models) foreach(entry ${models}) string(REPLACE ":" ";" inout ${entry}) list(GET inout 0 in) list(GET inout 1 out) generate_db_models(${name} ${in} ${out}) endforeach() get_property(files GLOBAL PROPERTY ${name}_Files) foreach (datafile ${files}) string(REGEX REPLACE "^[^/]+" "" target_datafile "${datafile}") string(LENGTH ${target_datafile} target_datafile_length) string(SUBSTRING ${target_datafile} 1 ${target_datafile_length} target_datafile) get_filename_component(datafiledir ${target_datafile} DIRECTORY) get_filename_component(filename ${target_datafile} NAME) configure_file(${DATA_DIR}/${datafile} ${CMAKE_BINARY_DIR}/${name}/${datafiledir}/${filename} COPYONLY) endforeach() get_property(luafiles GLOBAL PROPERTY ${name}_LUAFiles) foreach (luafile ${luafiles}) get_filename_component(luafiledir ${luafile} DIRECTORY) get_filename_component(filename ${luafile} NAME) configure_file(lua/${luafile} ${CMAKE_BINARY_DIR}/${name}/${luafiledir}/${filename} COPYONLY) endforeach() engine_target_link_libraries(TARGET ${name} DEPENDENCIES ${deps}) set_target_properties(${name} PROPERTIES FOLDER ${name}) add_test(NAME ${name} COMMAND $ --gtest_output=xml:${CMAKE_BINARY_DIR}/${name}.xml WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${name}") add_custom_target(${name}-run COMMAND $ --gtest_output=xml:${CMAKE_BINARY_DIR}/${name}.xml DEPENDS ${name} USES_TERMINAL WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${name}") engine_add_debuggger(${name}) engine_add_valgrind(${name}) engine_add_perf(${name}) endif() endfunction()