diff --git a/cmake/mu.tiny.cmake b/cmake/mu.tiny.cmake index 3b04c53dd..e360534c1 100644 --- a/cmake/mu.tiny.cmake +++ b/cmake/mu.tiny.cmake @@ -73,13 +73,6 @@ Commands :prop_tgt:`CROSSCOMPILING_EMULATOR ` defined; if absent, discovery is skipped with a warning. - **CMake version compatibility:** CMake older than 3.10 supports only one - ``mutiny_discover_tests()`` call per directory because - :prop_dir:`TEST_INCLUDE_FILE ` accepts a - single value. CMake 3.10 and later use the list-capable - :prop_dir:`TEST_INCLUDE_FILES ` property - and support multiple calls per directory. - #]=======================================================================] set(_MUTINY_DISCOVERY_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_mutiny_discovery.cmake @@ -91,11 +84,6 @@ option(MUTINY_JUNIT_REPORT "Output JUnit test reports") set(MUTINY_EXTRA_ARGS "-v" CACHE STRING "Default extra arguments passed to each discovered test run" ) -# _MUTINY_CMAKE_VERSION_OVERRIDE lets tests exercise the legacy code path. -set(_MUTINY_CMAKE_VERSION_OVERRIDE "" CACHE STRING - "Override the cmake version used by mutiny_discover_tests (for testing only)" -) -mark_as_advanced(_MUTINY_CMAKE_VERSION_OVERRIDE) function(mutiny_discover_tests target) if(DEFINED BUILD_TESTING AND NOT BUILD_TESTING) @@ -189,33 +177,9 @@ function(mutiny_discover_tests target) VERBATIM ) - if(_MUTINY_CMAKE_VERSION_OVERRIDE) - set(_mutiny_cmake_version "${_MUTINY_CMAKE_VERSION_OVERRIDE}") - else() - set(_mutiny_cmake_version "${CMAKE_VERSION}") - endif() - - if(_mutiny_cmake_version VERSION_LESS "3.10") - # We can only set one. - get_property(already_set - DIRECTORY - PROPERTY TEST_INCLUDE_FILE - SET - ) - if(${already_set}) - message(FATAL_ERROR - "Cannot discover multiple tests from the same file" - ) - endif() - set_property( - DIRECTORY - PROPERTY TEST_INCLUDE_FILE "${CTEST_INCLUDE_FILE}" - ) - else() - set_property( - DIRECTORY APPEND - PROPERTY TEST_INCLUDE_FILES "${CTEST_INCLUDE_FILE}" - ) - endif() + set_property( + DIRECTORY APPEND + PROPERTY TEST_INCLUDE_FILES "${CTEST_INCLUDE_FILE}" + ) endfunction() diff --git a/tests/RunCMake.cmake b/tests/RunCMake.cmake index 6a9722ff8..ad5a2bb80 100644 --- a/tests/RunCMake.cmake +++ b/tests/RunCMake.cmake @@ -66,10 +66,10 @@ function(run_cmake test) execute_process( COMMAND ${CMAKE_COMMAND} ${gen_opts} - -S "${RunCMake_SOURCE_DIR}" + -S "${RunCMake_SOURCE_DIR}/${test}" -B "${RunCMake_BINARY_DIR}/${test}" - -D "RunCMake_TEST=${test}" ${RunCMake_TEST_OPTIONS} + ${ARGN} RESULT_VARIABLE result OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr diff --git a/tests/cmake/RunCMakeTest.cmake b/tests/cmake/RunCMakeTest.cmake index c127fdc78..f1292485b 100644 --- a/tests/cmake/RunCMakeTest.cmake +++ b/tests/cmake/RunCMakeTest.cmake @@ -19,50 +19,24 @@ set(RunCMake_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/configure") run_cmake(NotATarget) run_cmake(NotAnExecutable) -# Happy path — single-config generator +# Happy path — single-config and multi-config generators run_cmake(ValidTarget) - -# Multi-configuration generator (CMAKE_CONFIGURATION_TYPES is non-empty) -list(APPEND RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug") -run_cmake(MultiConfig) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug") +run_cmake(MultiConfig -DCMAKE_CONFIGURATION_TYPES=Debug) # Per-call function arguments run_cmake(DetailedArgOn) run_cmake(ExtraArgsArg) -# Cache-variable defaults -list(APPEND RunCMake_TEST_OPTIONS "-DMUTINY_TESTS_DETAILED:BOOL=ON") -run_cmake(CacheDetailedVar) -# Interaction: DETAILED OFF arg must take precedence over MUTINY_TESTS_DETAILED=ON -run_cmake(DetailedArgOffOverridesCache) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-DMUTINY_TESTS_DETAILED:BOOL=ON") - -list(APPEND RunCMake_TEST_OPTIONS "-DMUTINY_JUNIT_REPORT:BOOL=ON") -run_cmake(CacheJUnitVar) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-DMUTINY_JUNIT_REPORT:BOOL=ON") - -list(APPEND RunCMake_TEST_OPTIONS "-DMUTINY_EXTRA_ARGS=--custom-arg") -run_cmake(CacheExtraArgs) -# Interaction: EXTRA_ARGS function argument must take precedence over MUTINY_EXTRA_ARGS -run_cmake(ExtraArgsArgOverridesCache) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-DMUTINY_EXTRA_ARGS=--custom-arg") +# Cache-variable defaults and override interactions +run_cmake(CacheDetailedVar -DMUTINY_TESTS_DETAILED:BOOL=ON) +run_cmake(DetailedArgOffOverridesCache -DMUTINY_TESTS_DETAILED:BOOL=ON) +run_cmake(CacheJUnitVar -DMUTINY_JUNIT_REPORT:BOOL=ON) +run_cmake(CacheExtraArgs -DMUTINY_EXTRA_ARGS=--custom-arg) +run_cmake(ExtraArgsArgOverridesCache -DMUTINY_EXTRA_ARGS=--custom-arg) -# No emulator: LANGUAGES NONE skips toolchain detection, so CMAKE_CROSSCOMPILING is set -# explicitly inside CMakeLists.txt after project() — no extra -D option needed here. +# Cross-compilation run_cmake(CrossCompilingNoEmulator) - -# With emulator: enable_language(CXX) runs full detection; CMAKE_SYSTEM_NAME=Generic -# causes CMake to derive CMAKE_CROSSCOMPILING=TRUE automatically. -list(APPEND RunCMake_TEST_OPTIONS "-DCMAKE_SYSTEM_NAME=Generic") -run_cmake(CrossCompilingWithEmulator) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-DCMAKE_SYSTEM_NAME=Generic") - -# Legacy cmake <3.10 code path (simulated via override variable) -list(APPEND RunCMake_TEST_OPTIONS "-D_MUTINY_CMAKE_VERSION_OVERRIDE=3.9.0") -run_cmake(LegacySingleInclude) -run_cmake(LegacyDuplicateError) -list(REMOVE_ITEM RunCMake_TEST_OPTIONS "-D_MUTINY_CMAKE_VERSION_OVERRIDE=3.9.0") +run_cmake(CrossCompilingWithEmulator -DCMAKE_SYSTEM_NAME=Generic) # ── _mutiny_discovery.cmake script tests ─────────────────────────────────────── # diff --git a/tests/cmake/configure/CMakeLists.txt b/tests/cmake/configure/CMakeLists.txt deleted file mode 100644 index c01ac4edd..000000000 --- a/tests/cmake/configure/CMakeLists.txt +++ /dev/null @@ -1,81 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(mutinyConfigTests LANGUAGES NONE) - -list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") -include(mu.tiny) - -# ── Error cases (no compiler needed) ───────────────────────────────────────── - -if(RunCMake_TEST STREQUAL "NotATarget") - mutiny_discover_tests(NotATarget) - -elseif(RunCMake_TEST STREQUAL "NotAnExecutable") - add_library(MyLib INTERFACE) - mutiny_discover_tests(MyLib) - -# ── Cross-compile: no emulator (uses IMPORTED target, returns before add_custom_command) ── - -elseif(RunCMake_TEST STREQUAL "CrossCompilingNoEmulator") - # With LANGUAGES NONE cmake skips toolchain detection, so CMAKE_CROSSCOMPILING - # is never derived from CMAKE_SYSTEM_NAME. Set it explicitly after project(). - set(CMAKE_CROSSCOMPILING TRUE) - add_executable(MyTests IMPORTED GLOBAL) - set_target_properties(MyTests PROPERTIES IMPORTED_LOCATION "${CMAKE_COMMAND}") - mutiny_discover_tests(MyTests) - -# ── Tests requiring a real compiled executable ──────────────────────────────── - -else() - enable_language(CXX) - add_executable(MyTests empty.cpp) - - if(RunCMake_TEST STREQUAL "CrossCompilingWithEmulator") - set_target_properties(MyTests PROPERTIES - CROSSCOMPILING_EMULATOR "${CMAKE_COMMAND}" - ) - mutiny_discover_tests(MyTests) - - elseif(RunCMake_TEST STREQUAL "DetailedArgOn") - mutiny_discover_tests(MyTests DETAILED ON) - - elseif(RunCMake_TEST STREQUAL "ExtraArgsArg") - mutiny_discover_tests(MyTests EXTRA_ARGS --custom-arg) - - elseif(RunCMake_TEST STREQUAL "CacheExtraArgs") - mutiny_discover_tests(MyTests) - get_target_property(p MyTests MUTINY_DISCOVER_ARGS) - message(STATUS "DISCOVER_ARGS: ${p}") - - elseif(RunCMake_TEST STREQUAL "ExtraArgsArgOverridesCache") - mutiny_discover_tests(MyTests EXTRA_ARGS --function-arg) - get_target_property(p MyTests MUTINY_DISCOVER_ARGS) - message(STATUS "DISCOVER_ARGS: ${p}") - - elseif(RunCMake_TEST STREQUAL "DetailedArgOffOverridesCache") - mutiny_discover_tests(MyTests DETAILED OFF) - get_target_property(p MyTests MUTINY_DISCOVER_DETAILED) - message(STATUS "DISCOVER_DETAILED: ${p}") - - elseif(RunCMake_TEST STREQUAL "LegacySingleInclude") - mutiny_discover_tests(MyTests) - - elseif(RunCMake_TEST STREQUAL "LegacyDuplicateError") - mutiny_discover_tests(MyTests) - add_executable(MyTests2 empty.cpp) - mutiny_discover_tests(MyTests2) # should FATAL_ERROR - - else() - # ValidTarget, MultiConfig, CacheDetailedVar, CacheJUnitVar - mutiny_discover_tests(MyTests) - endif() - - # Print the property set by mutiny_discover_tests for stdout verification. - # The legacy path uses the singular TEST_INCLUDE_FILE property. - if(RunCMake_TEST STREQUAL "LegacySingleInclude") - get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILE) - message(STATUS "TEST_INCLUDE_FILE: ${p}") - elseif(NOT RunCMake_TEST STREQUAL "LegacyDuplicateError") - get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) - message(STATUS "TEST_INCLUDE_FILES: ${p}") - endif() -endif() diff --git a/tests/cmake/configure/CacheDetailedVar/CMakeLists.txt b/tests/cmake/configure/CacheDetailedVar/CMakeLists.txt new file mode 100644 index 000000000..31e2d0ba2 --- /dev/null +++ b/tests/cmake/configure/CacheDetailedVar/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/CacheExtraArgs/CMakeLists.txt b/tests/cmake/configure/CacheExtraArgs/CMakeLists.txt new file mode 100644 index 000000000..924e93e4f --- /dev/null +++ b/tests/cmake/configure/CacheExtraArgs/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests) +get_target_property(p MyTests MUTINY_DISCOVER_ARGS) +message(STATUS "DISCOVER_ARGS: ${p}") diff --git a/tests/cmake/configure/CacheJUnitVar/CMakeLists.txt b/tests/cmake/configure/CacheJUnitVar/CMakeLists.txt new file mode 100644 index 000000000..31e2d0ba2 --- /dev/null +++ b/tests/cmake/configure/CacheJUnitVar/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/CrossCompilingNoEmulator/CMakeLists.txt b/tests/cmake/configure/CrossCompilingNoEmulator/CMakeLists.txt new file mode 100644 index 000000000..275f8d8f7 --- /dev/null +++ b/tests/cmake/configure/CrossCompilingNoEmulator/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES NONE) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +# With LANGUAGES NONE cmake skips toolchain detection, so CMAKE_CROSSCOMPILING +# is never derived from CMAKE_SYSTEM_NAME. Set it explicitly after project(). +set(CMAKE_CROSSCOMPILING TRUE) +add_executable(MyTests IMPORTED GLOBAL) +set_target_properties(MyTests PROPERTIES IMPORTED_LOCATION "${CMAKE_COMMAND}") +mutiny_discover_tests(MyTests) diff --git a/tests/cmake/configure/CrossCompilingWithEmulator/CMakeLists.txt b/tests/cmake/configure/CrossCompilingWithEmulator/CMakeLists.txt new file mode 100644 index 000000000..eca0a1f70 --- /dev/null +++ b/tests/cmake/configure/CrossCompilingWithEmulator/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +# CMAKE_SYSTEM_NAME=Generic is passed on the command line; CMake derives +# CMAKE_CROSSCOMPILING=TRUE from it automatically during project() detection. +set_target_properties(MyTests PROPERTIES CROSSCOMPILING_EMULATOR "${CMAKE_COMMAND}") +mutiny_discover_tests(MyTests) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/DetailedArgOffOverridesCache/CMakeLists.txt b/tests/cmake/configure/DetailedArgOffOverridesCache/CMakeLists.txt new file mode 100644 index 000000000..d59ec2011 --- /dev/null +++ b/tests/cmake/configure/DetailedArgOffOverridesCache/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests DETAILED OFF) +get_target_property(p MyTests MUTINY_DISCOVER_DETAILED) +message(STATUS "DISCOVER_DETAILED: ${p}") diff --git a/tests/cmake/configure/DetailedArgOn/CMakeLists.txt b/tests/cmake/configure/DetailedArgOn/CMakeLists.txt new file mode 100644 index 000000000..748c11f1e --- /dev/null +++ b/tests/cmake/configure/DetailedArgOn/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests DETAILED ON) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/ExtraArgsArg/CMakeLists.txt b/tests/cmake/configure/ExtraArgsArg/CMakeLists.txt new file mode 100644 index 000000000..debb670d2 --- /dev/null +++ b/tests/cmake/configure/ExtraArgsArg/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests EXTRA_ARGS --custom-arg) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/ExtraArgsArgOverridesCache/CMakeLists.txt b/tests/cmake/configure/ExtraArgsArgOverridesCache/CMakeLists.txt new file mode 100644 index 000000000..32cd3b222 --- /dev/null +++ b/tests/cmake/configure/ExtraArgsArgOverridesCache/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests EXTRA_ARGS --function-arg) +get_target_property(p MyTests MUTINY_DISCOVER_ARGS) +message(STATUS "DISCOVER_ARGS: ${p}") diff --git a/tests/cmake/configure/LegacyDuplicateError/result.txt b/tests/cmake/configure/LegacyDuplicateError/result.txt deleted file mode 100644 index d00491fd7..000000000 --- a/tests/cmake/configure/LegacyDuplicateError/result.txt +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/tests/cmake/configure/LegacyDuplicateError/stderr.txt b/tests/cmake/configure/LegacyDuplicateError/stderr.txt deleted file mode 100644 index 2e5601c9b..000000000 --- a/tests/cmake/configure/LegacyDuplicateError/stderr.txt +++ /dev/null @@ -1 +0,0 @@ -Cannot discover multiple tests from the same file diff --git a/tests/cmake/configure/LegacySingleInclude/stdout.txt b/tests/cmake/configure/LegacySingleInclude/stdout.txt deleted file mode 100644 index 7b7bdea39..000000000 --- a/tests/cmake/configure/LegacySingleInclude/stdout.txt +++ /dev/null @@ -1 +0,0 @@ -TEST_INCLUDE_FILE: .*/MyTests_include\.cmake diff --git a/tests/cmake/configure/MultiConfig/CMakeLists.txt b/tests/cmake/configure/MultiConfig/CMakeLists.txt new file mode 100644 index 000000000..31e2d0ba2 --- /dev/null +++ b/tests/cmake/configure/MultiConfig/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}") diff --git a/tests/cmake/configure/NotATarget/CMakeLists.txt b/tests/cmake/configure/NotATarget/CMakeLists.txt new file mode 100644 index 000000000..1e6fc1457 --- /dev/null +++ b/tests/cmake/configure/NotATarget/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES NONE) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +mutiny_discover_tests(NotATarget) diff --git a/tests/cmake/configure/NotAnExecutable/CMakeLists.txt b/tests/cmake/configure/NotAnExecutable/CMakeLists.txt new file mode 100644 index 000000000..11d3fe684 --- /dev/null +++ b/tests/cmake/configure/NotAnExecutable/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES NONE) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_library(MyLib INTERFACE) +mutiny_discover_tests(MyLib) diff --git a/tests/cmake/configure/ValidTarget/CMakeLists.txt b/tests/cmake/configure/ValidTarget/CMakeLists.txt new file mode 100644 index 000000000..31e2d0ba2 --- /dev/null +++ b/tests/cmake/configure/ValidTarget/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) +project(test LANGUAGES CXX) +list(APPEND CMAKE_MODULE_PATH "${MUTINY_MODULE_PATH}") +include(mu.tiny) +add_executable(MyTests "${CMAKE_CURRENT_LIST_DIR}/../empty.cpp") +mutiny_discover_tests(MyTests) +get_property(p DIRECTORY PROPERTY TEST_INCLUDE_FILES) +message(STATUS "TEST_INCLUDE_FILES: ${p}")