mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Add test scaffolding for catch_discover_tests
This commit is contained in:
		| @@ -622,6 +622,18 @@ if (CATCH_ENABLE_CONFIGURE_TESTS) | ||||
|     endforeach() | ||||
| endif() | ||||
|  | ||||
| if (CATCH_ENABLE_CMAKE_HELPER_TESTS) | ||||
|     add_test(NAME "CMakeHelper::DiscoverTests" | ||||
|       COMMAND | ||||
|         "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/TestScripts/DiscoverTests/VerifyRegistration.py" "${CATCH_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" | ||||
|     ) | ||||
|     set_tests_properties("CMakeHelper::DiscoverTests" | ||||
|       PROPERTIES | ||||
|         COST 240 | ||||
|         LABELS "uses-python" | ||||
|     ) | ||||
| endif() | ||||
|  | ||||
| foreach (reporterName # "Automake" - the simple .trs format does not support any kind of comments/metadata | ||||
|                       "compact" | ||||
|                       "console" | ||||
|   | ||||
							
								
								
									
										16
									
								
								tests/TestScripts/DiscoverTests/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								tests/TestScripts/DiscoverTests/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| cmake_minimum_required(VERSION 3.10) | ||||
|  | ||||
| project(discover-tests-test | ||||
|   LANGUAGES CXX | ||||
| ) | ||||
|  | ||||
| add_executable(tests | ||||
|   register-tests.cpp | ||||
| ) | ||||
|  | ||||
| add_subdirectory(${CATCH2_PATH} catch2-build) | ||||
| target_link_libraries(tests PRIVATE Catch2::Catch2WithMain) | ||||
|  | ||||
| include(CTest) | ||||
| include(Catch) | ||||
| catch_discover_tests(tests) | ||||
							
								
								
									
										117
									
								
								tests/TestScripts/DiscoverTests/VerifyRegistration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								tests/TestScripts/DiscoverTests/VerifyRegistration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| #              Copyright Catch2 Authors | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| #   (See accompanying file LICENSE.txt or copy at | ||||
| #        https://www.boost.org/LICENSE_1_0.txt) | ||||
|  | ||||
| # SPDX-License-Identifier: BSL-1.0 | ||||
|  | ||||
| import os | ||||
| import subprocess | ||||
| import sys | ||||
|  | ||||
|  | ||||
| def build_project(sources_dir, output_base_path, catch2_path): | ||||
|     build_dir = os.path.join(output_base_path, 'ctest-registration-test') | ||||
|     config_cmd = ['cmake', | ||||
|                   '-B', build_dir, | ||||
|                   '-S', sources_dir, | ||||
|                   f'-DCATCH2_PATH={catch2_path}', | ||||
|                   '-DCMAKE_BUILD_TYPE=Debug'] | ||||
|                    | ||||
|     build_cmd = ['cmake', | ||||
|                  '--build', build_dir, | ||||
|                  '--config', 'Debug'] | ||||
|      | ||||
|     try: | ||||
|         subprocess.run(config_cmd, | ||||
|                        capture_output = True, | ||||
|                        check = True, | ||||
|                        text = True) | ||||
|         subprocess.run(build_cmd, | ||||
|                        capture_output = True, | ||||
|                        check = True, | ||||
|                        text = True) | ||||
|     except subprocess.CalledProcessError as err: | ||||
|         print('Error when building the test project') | ||||
|         print(f'cmd: {err.cmd}') | ||||
|         print(f'stderr: {err.stderr}') | ||||
|         print(f'stdout: {err.stdout}') | ||||
|         exit(3) | ||||
|      | ||||
|     return build_dir | ||||
|      | ||||
|  | ||||
|  | ||||
| def get_test_names(build_path): | ||||
|     # For now we assume that Windows builds are done using MSBuild under | ||||
|     # Debug configuration. This means that we need to add "Debug" folder | ||||
|     # to the path when constructing it. On Linux, we don't add anything. | ||||
|     config_path = "Debug" if os.name == 'nt' else "" | ||||
|     full_path = os.path.join(build_path, config_path, 'tests') | ||||
|  | ||||
|  | ||||
|     cmd = [full_path, '--reporter', 'xml', '--list-tests'] | ||||
|     result = subprocess.run(cmd, | ||||
|                             capture_output = True, | ||||
|                             check = True, | ||||
|                             text = True) | ||||
|  | ||||
|     import xml.etree.ElementTree as ET | ||||
|     root = ET.fromstring(result.stdout) | ||||
|     return [tc.text for tc in root.findall('TestCase/Name')] | ||||
|  | ||||
|  | ||||
| def list_ctest_tests(build_path): | ||||
|     old_path = os.getcwd() | ||||
|     os.chdir(build_path) | ||||
|  | ||||
|     cmd = ['ctest', '-C', 'debug', '--show-only=json-v1'] | ||||
|     result = subprocess.run(cmd, | ||||
|                             capture_output = True, | ||||
|                             check = True, | ||||
|                             text = True) | ||||
|     os.chdir(old_path) | ||||
|  | ||||
|     import json | ||||
|  | ||||
|     ctest_response = json.loads(result.stdout) | ||||
|     tests = ctest_response['tests'] | ||||
|     test_names = [] | ||||
|     for test in tests: | ||||
|         test_command = test['command'] | ||||
|         # First part of the command is the binary, second is the filter. | ||||
|         # If there are less, registration has failed. If there are more, | ||||
|         # registration has changed and the script needs updating. | ||||
|         assert len(test_command) == 2 | ||||
|         test_names.append(test_command[1]) | ||||
|         test_name = test_command[1] | ||||
|  | ||||
|     return test_names | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     if len(sys.argv) != 3: | ||||
|         print(f'Usage: {sys.argv[0]} path-to-catch2-cml output-path') | ||||
|         exit(2) | ||||
|     catch2_path = sys.argv[1] | ||||
|     output_base_path = sys.argv[2] | ||||
|     sources_dir = os.path.dirname(os.path.abspath(sys.argv[0])) | ||||
|  | ||||
|     build_path = build_project(sources_dir, output_base_path, catch2_path) | ||||
|  | ||||
|     catch_test_names = get_test_names(build_path) | ||||
|     ctest_test_names = list_ctest_tests(build_path) | ||||
|  | ||||
|     if len(catch_test_names) != len(ctest_test_names): | ||||
|         print("Mismatch between catch test names and ctest test names!") | ||||
|         for catch_test in catch_test_names: | ||||
|             if catch_test not in ctest_test_names: | ||||
|                 print(f"Catch2 test '{catch_test}' not found in CTest") | ||||
|         for ctest_test in ctest_test_names: | ||||
|             if ctest_test not in catch_test_names: | ||||
|                 print(f"CTest test '{ctest_test}' not found in Catch2") | ||||
|  | ||||
|         exit(1) | ||||
|  | ||||
							
								
								
									
										11
									
								
								tests/TestScripts/DiscoverTests/register-tests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tests/TestScripts/DiscoverTests/register-tests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
|  | ||||
| //              Copyright Catch2 Authors | ||||
| // Distributed under the Boost Software License, Version 1.0. | ||||
| //   (See accompanying file LICENSE.txt or copy at | ||||
| //        https://www.boost.org/LICENSE_1_0.txt) | ||||
|  | ||||
| // SPDX-License-Identifier: BSL-1.0 | ||||
|  | ||||
| #include <catch2/catch_test_macros.hpp> | ||||
|  | ||||
| TEST_CASE("Some test") {} | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský