Hello community, here is the log from the commit of package Catch2 for openSUSE:Factory checked in at 2020-12-03 18:41:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/Catch2 (Old) and /work/SRC/openSUSE:Factory/.Catch2.new.5913 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "Catch2" Thu Dec 3 18:41:11 2020 rev:3 rq:852325 version:2.13.3 Changes: -------- --- /work/SRC/openSUSE:Factory/Catch2/Catch2.changes 2020-08-15 21:20:51.631639785 +0200 +++ /work/SRC/openSUSE:Factory/.Catch2.new.5913/Catch2.changes 2020-12-03 18:42:46.214158295 +0100 @@ -1,0 +2,39 @@ +Tue Dec 1 11:27:06 UTC 2020 - aloi...@gmx.com + +- Update to version 2.13.3 + Fixes: + * Fixed possible infinite loop when combining generators with + section filter (`-c` option) + Miscellaneous: + * Fixed `ParseAndAddCatchTests` not finding `TEST_CASE`s + without tags + * `ParseAndAddCatchTests` supports `CMP0110` policy for + changing behaviour of `add_test` + + This was the shortlived change in CMake 3.18.0 that + temporarily broke `ParseAndAddCatchTests` + version 2.13.2 + Improvements: + * Implemented workaround for NVCC ICE + Fixes: + * Fixed detection of `std::uncaught_exceptions` support under + non-msvc platforms + Miscellaneous: + * `catch_discover_tests` has been improved significantly + + You can now specify which reporter should be used + + You can now modify where the output will be written + + `WORKING_DIRECTORY` setting is respected + * `ParseAndAddCatchTests` now supports `TEMPLATE_TEST_CASE` + macros + * Various documentation fixes and improvements + version 2.13.1 + Improvements: + * `ParseAndAddCatchTests` handles CMake v3.18.0 correctly + * Improved autodetection of `std::byte` + * Simplified implementation of templated test cases + + This should have a tiny positive effect on its compilation + throughput + Fixes: + * Automatic stringification of ranges handles sentinel ranges + properly + +------------------------------------------------------------------- Old: ---- Catch2-2.13.0.tar.gz New: ---- Catch2-2.13.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ Catch2.spec ++++++ --- /var/tmp/diff_new_pack.xz0QQS/_old 2020-12-03 18:42:46.814159446 +0100 +++ /var/tmp/diff_new_pack.xz0QQS/_new 2020-12-03 18:42:46.818159453 +0100 @@ -17,7 +17,7 @@ Name: Catch2 -Version: 2.13.0 +Version: 2.13.3 Release: 0 Summary: A modern, C++-native, header-only, test framework for unit-tests, TDD and BDD License: BSL-1.0 ++++++ Catch2-2.13.0.tar.gz -> Catch2-2.13.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/CMakeLists.txt new/Catch2-2.13.3/CMakeLists.txt --- old/Catch2-2.13.0/CMakeLists.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/CMakeLists.txt 2020-10-31 18:21:23.000000000 +0100 @@ -3,7 +3,7 @@ # detect if Catch is being bundled, # disable testsuite in that case if(NOT DEFINED PROJECT_NAME) - set(NOT_SUBPROJECT ON) + set(NOT_SUBPROJECT ON) endif() # Catch2's build breaks if done in-tree. You probably should not build @@ -14,14 +14,12 @@ endif() -project(Catch2 LANGUAGES CXX VERSION 2.13.0) +project(Catch2 LANGUAGES CXX VERSION 2.13.3) # Provide path for scripts list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") include(GNUInstallDirs) -include(CMakePackageConfigHelpers) -include(CTest) option(CATCH_USE_VALGRIND "Perform SelfTests with Valgrind" OFF) option(CATCH_BUILD_TESTING "Build SelfTest project" ON) @@ -33,8 +31,6 @@ option(CATCH_INSTALL_HELPERS "Install contrib alongside library" ON) -set_property(GLOBAL PROPERTY USE_FOLDERS ON) - # define some folders set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(SELF_TEST_DIR ${CATCH_DIR}/projects/SelfTest) @@ -45,12 +41,16 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup") endif() -if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT) - find_package(PythonInterp) - if (NOT PYTHONINTERP_FOUND) - message(FATAL_ERROR "Python not found, but required for tests") +if(NOT_SUBPROJECT) + include(CTest) + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + if(BUILD_TESTING AND CATCH_BUILD_TESTING) + find_package(PythonInterp) + if (NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "Python not found, but required for tests") + endif() + add_subdirectory(projects) endif() - add_subdirectory(projects) endif() if(CATCH_BUILD_EXAMPLES) @@ -107,6 +107,7 @@ # a subproject via `add_subdirectory`, or the destinations will break, # see https://github.com/catchorg/Catch2/issues/1373 if (NOT_SUBPROJECT) + include(CMakePackageConfigHelpers) set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2") configure_package_config_file( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/README.md new/Catch2-2.13.3/README.md --- old/Catch2-2.13.0/README.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/README.md 2020-10-31 18:21:23.000000000 +0100 @@ -2,14 +2,14 @@ ![catch logo](artwork/catch2-logo-small.png) [![Github Releases](https://img.shields.io/github/release/catchorg/catch2.svg)](https://github.com/catchorg/catch2/releases) -[![Build Status](https://travis-ci.org/catchorg/Catch2.svg?branch=master)](https://travis-ci.org/catchorg/Catch2) +[![Build Status](https://travis-ci.org/catchorg/Catch2.svg?branch=v2.x)](https://travis-ci.org/catchorg/Catch2) [![Build status](https://ci.appveyor.com/api/projects/status/github/catchorg/Catch2?svg=true)](https://ci.appveyor.com/project/catchorg/catch2) -[![codecov](https://codecov.io/gh/catchorg/Catch2/branch/master/graph/badge.svg)](https://codecov.io/gh/catchorg/Catch2) -[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/aavJBzemrxUgGV9S) +[![codecov](https://codecov.io/gh/catchorg/Catch2/branch/v2.x/graph/badge.svg)](https://codecov.io/gh/catchorg/Catch2) +[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/6JUH8Eybx4CtvkJS) [![Join the chat in Discord: https://discord.gg/4CWS9zD](https://img.shields.io/badge/Discord-Chat!-brightgreen.svg)](https://discord.gg/4CWS9zD) -<a href="https://github.com/catchorg/Catch2/releases/download/v2.13.0/catch.hpp">The latest version of the single header can be downloaded directly using this link</a> +<a href="https://github.com/catchorg/Catch2/releases/download/v2.13.3/catch.hpp">The latest version of the single header can be downloaded directly using this link</a> ## Catch2 is released! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/codecov.yml new/Catch2-2.13.3/codecov.yml --- old/Catch2-2.13.0/codecov.yml 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/codecov.yml 2020-10-31 18:21:23.000000000 +0100 @@ -19,7 +19,7 @@ codecov: - branch: master + branch: v2.x comment: layout: "diff" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/contrib/Catch.cmake new/Catch2-2.13.3/contrib/Catch.cmake --- old/Catch2-2.13.0/contrib/Catch.cmake 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/contrib/Catch.cmake 2020-10-31 18:21:23.000000000 +0100 @@ -33,6 +33,10 @@ [TEST_SUFFIX suffix] [PROPERTIES name1 value1...] [TEST_LIST var] + [REPORTER reporter] + [OUTPUT_DIR dir] + [OUTPUT_PREFIX prefix} + [OUTPUT_SUFFIX suffix] ) ``catch_discover_tests`` sets up a post-build command on the test executable @@ -90,6 +94,28 @@ executable is being used in multiple calls to ``catch_discover_tests()``. Note that this variable is only available in CTest. + ``REPORTER reporter`` + Use the specified reporter when running the test case. The reporter will + be passed to the Catch executable as ``--reporter reporter``. + + ``OUTPUT_DIR dir`` + If specified, the parameter is passed along as + ``--out dir/<test_name>`` to Catch executable. The actual file name is the + same as the test name. This should be used instead of + ``EXTRA_ARGS --out foo`` to avoid race conditions writing the result output + when using parallel test execution. + + ``OUTPUT_PREFIX prefix`` + May be used in conjunction with ``OUTPUT_DIR``. + If specified, ``prefix`` is added to each output file name, like so + ``--out dir/prefix<test_name>``. + + ``OUTPUT_SUFFIX suffix`` + May be used in conjunction with ``OUTPUT_DIR``. + If specified, ``suffix`` is added to each output file name, like so + ``--out dir/<test_name>suffix``. This can be used to add a file extension to + the output e.g. ".xml". + #]=======================================================================] #------------------------------------------------------------------------------ @@ -97,7 +123,7 @@ cmake_parse_arguments( "" "" - "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" + "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;REPORTER;OUTPUT_DIR;OUTPUT_PREFIX;OUTPUT_SUFFIX" "TEST_SPEC;EXTRA_ARGS;PROPERTIES" ${ARGN} ) @@ -110,7 +136,7 @@ endif() ## Generate a unique name based on the extra arguments - string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}") + string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS} ${_REPORTER} ${_OUTPUT_DIR} ${_OUTPUT_PREFIX} ${_OUTPUT_SUFFIX}") string(SUBSTRING ${args_hash} 0 7 args_hash) # Define rule to generate test list for aforementioned test executable @@ -134,6 +160,10 @@ -D "TEST_PREFIX=${_TEST_PREFIX}" -D "TEST_SUFFIX=${_TEST_SUFFIX}" -D "TEST_LIST=${_TEST_LIST}" + -D "TEST_REPORTER=${_REPORTER}" + -D "TEST_OUTPUT_DIR=${_OUTPUT_DIR}" + -D "TEST_OUTPUT_PREFIX=${_OUTPUT_PREFIX}" + -D "TEST_OUTPUT_SUFFIX=${_OUTPUT_SUFFIX}" -D "CTEST_FILE=${ctest_tests_file}" -P "${_CATCH_DISCOVER_TESTS_SCRIPT}" VERBATIM diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/contrib/CatchAddTests.cmake new/Catch2-2.13.3/contrib/CatchAddTests.cmake --- old/Catch2-2.13.0/contrib/CatchAddTests.cmake 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/contrib/CatchAddTests.cmake 2020-10-31 18:21:23.000000000 +0100 @@ -6,6 +6,10 @@ set(spec ${TEST_SPEC}) set(extra_args ${TEST_EXTRA_ARGS}) set(properties ${TEST_PROPERTIES}) +set(reporter ${TEST_REPORTER}) +set(output_dir ${TEST_OUTPUT_DIR}) +set(output_prefix ${TEST_OUTPUT_PREFIX}) +set(output_suffix ${TEST_OUTPUT_SUFFIX}) set(script) set(suite) set(tests) @@ -32,6 +36,7 @@ COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only OUTPUT_VARIABLE output RESULT_VARIABLE result + WORKING_DIRECTORY "${TEST_WORKING_DIR}" ) # Catch --list-test-names-only reports the number of tests, so 0 is... surprising if(${result} EQUAL 0) @@ -48,6 +53,44 @@ string(REPLACE "\n" ";" output "${output}") +# Run test executable to get list of available reporters +execute_process( + COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-reporters + OUTPUT_VARIABLE reporters_output + RESULT_VARIABLE reporters_result + WORKING_DIRECTORY "${TEST_WORKING_DIR}" +) +if(${reporters_result} EQUAL 0) + message(WARNING + "Test executable '${TEST_EXECUTABLE}' contains no reporters!\n" + ) +elseif(${reporters_result} LESS 0) + message(FATAL_ERROR + "Error running test executable '${TEST_EXECUTABLE}':\n" + " Result: ${reporters_result}\n" + " Output: ${reporters_output}\n" + ) +endif() +string(FIND "${reporters_output}" "${reporter}" reporter_is_valid) +if(reporter AND ${reporter_is_valid} EQUAL -1) + message(FATAL_ERROR + "\"${reporter}\" is not a valid reporter!\n" + ) +endif() + +# Prepare reporter +if(reporter) + set(reporter_arg "--reporter ${reporter}") +endif() + +# Prepare output dir +if(output_dir AND NOT IS_ABSOLUTE ${output_dir}) + set(output_dir "${TEST_WORKING_DIR}/${output_dir}") + if(NOT EXISTS ${output_dir}) + file(MAKE_DIRECTORY ${output_dir}) + endif() +endif() + # Parse output foreach(line ${output}) set(test ${line}) @@ -56,6 +99,12 @@ foreach(char , [ ]) string(REPLACE ${char} "\\${char}" test_name ${test_name}) endforeach(char) + # ...add output dir + if(output_dir) + string(REGEX REPLACE "[^A-Za-z0-9_]" "_" test_name_clean ${test_name}) + set(output_dir_arg "--out ${output_dir}/${output_prefix}${test_name_clean}${output_suffix}") + endif() + # ...and add to script add_command(add_test "${prefix}${test}${suffix}" @@ -63,6 +112,8 @@ "${TEST_EXECUTABLE}" "${test_name}" ${extra_args} + "${reporter_arg}" + "${output_dir_arg}" ) add_command(set_tests_properties "${prefix}${test}${suffix}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/contrib/ParseAndAddCatchTests.cmake new/Catch2-2.13.3/contrib/ParseAndAddCatchTests.cmake --- old/Catch2-2.13.0/contrib/ParseAndAddCatchTests.cmake 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/contrib/ParseAndAddCatchTests.cmake 2020-10-31 18:21:23.000000000 +0100 @@ -1,9 +1,11 @@ #==================================================================================================# # supported macros # # - TEST_CASE, # +# - TEMPLATE_TEST_CASE # # - SCENARIO, # # - TEST_CASE_METHOD, # # - CATCH_TEST_CASE, # +# - CATCH_TEMPLATE_TEST_CASE # # - CATCH_SCENARIO, # # - CATCH_TEST_CASE_METHOD. # # # @@ -106,7 +108,8 @@ ParseAndAddCatchTests_RemoveComments(Contents) # Find definition of test names - string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^\)]+\\)+[ \t\n]*{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") + # https://regex101.com/r/JygOND/1 + string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests) ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property") @@ -117,13 +120,21 @@ ) endif() + # check CMP0110 policy for new add_test() behavior + if(POLICY CMP0110) + cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior + else() + # just to be thorough explicitly set the variable + set(_cmp0110_value) + endif() + foreach(TestName ${Tests}) # Strip newlines string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}") # Get test type and fixture if applicable - string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") - string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") + string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") + string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}") # Get string parts of test definition @@ -189,24 +200,39 @@ # Escape commas in the test spec string(REPLACE "," "\\," Name ${Name}) + # Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were neccessary, + # only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1 + # And properly introduced in 3.19 with the CMP0110 policy + if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18") + ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround") + else() + ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround") + set(CTestName "\"${CTestName}\"") + endif() + + # Handle template test cases + if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*") + set(Name "${Name} - *") + endif() + # Add the test and set its properties - add_test(NAME "\"${CTestName}\"" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters}) + add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters}) # Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8") ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property") - set_tests_properties("\"${CTestName}\"" PROPERTIES DISABLED ON) + set_tests_properties("${CTestName}" PROPERTIES DISABLED ON) else() - set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" + set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" LABELS "${Labels}") endif() set_property( TARGET ${TestTarget} APPEND - PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"") + PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") set_property( SOURCE ${SourceFile} APPEND - PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"") + PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/cmake-integration.md new/Catch2-2.13.3/docs/cmake-integration.md --- old/Catch2-2.13.0/docs/cmake-integration.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/cmake-integration.md 2020-10-31 18:21:23.000000000 +0100 @@ -36,6 +36,20 @@ target_link_libraries(tests Catch2::Catch2) ``` +Another possibility is to use [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html): +```cmake +Include(FetchContent) + +FetchContent_Declare( + Catch2 + GIT_REPOSITORY https://github.com/catchorg/Catch2.git + GIT_TAG v2.13.1) + +FetchContent_MakeAvailable(Catch2) + +target_link_libraries(tests Catch2::Catch2) +``` + ## Automatic test registration Catch2's repository also contains two CMake scripts that help users @@ -83,6 +97,10 @@ [TEST_SUFFIX suffix] [PROPERTIES name1 value1...] [TEST_LIST var] + [REPORTER reporter] + [OUTPUT_DIR dir] + [OUTPUT_PREFIX prefix] + [OUTPUT_SUFFIX suffix] ) ``` @@ -129,6 +147,32 @@ executable is being used in multiple calls to `catch_discover_tests()`. Note that this variable is only available in CTest. +* `REPORTER reporter` + +Use the specified reporter when running the test case. The reporter will +be passed to the test runner as `--reporter reporter`. + +* `OUTPUT_DIR dir` + +If specified, the parameter is passed along as +`--out dir/<test_name>` to test executable. The actual file name is the +same as the test name. This should be used instead of +`EXTRA_ARGS --out foo` to avoid race conditions writing the result output +when using parallel test execution. + +* `OUTPUT_PREFIX prefix` + +May be used in conjunction with `OUTPUT_DIR`. +If specified, `prefix` is added to each output file name, like so +`--out dir/prefix<test_name>`. + +* `OUTPUT_SUFFIX suffix` + +May be used in conjunction with `OUTPUT_DIR`. +If specified, `suffix` is added to each output file name, like so +`--out dir/<test_name>suffix`. This can be used to add a file extension to +the output file name e.g. ".xml". + ### `ParseAndAddCatchTests.cmake` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/contributing.md new/Catch2-2.13.3/docs/contributing.md --- old/Catch2-2.13.0/docs/contributing.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/contributing.md 2020-10-31 18:21:23.000000000 +0100 @@ -21,8 +21,8 @@ ## Using Git(Hub) -Ongoing development happens in the `master` branch for Catch2 v2, and in -`dev-v3` for the next major version, v3. +Ongoing development happens in the `v2.x` branch for Catch2 v2, and in +`devel` for the next major version, v3. Commits should be small and atomic. A commit is atomic when, after it is applied, the codebase, tests and all, still works as expected. Small diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/generators.md new/Catch2-2.13.3/docs/generators.md --- old/Catch2-2.13.0/docs/generators.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/generators.md 2020-10-31 18:21:23.000000000 +0100 @@ -42,7 +42,7 @@ effects. The simplest usage is shown below, where the `SECTION` "one" runs 4 (2\*2) times, and `SECTION` "two" is run 6 times (2\*3). -``` +```cpp TEST_CASE("Generators") { auto i = GENERATE(1, 2); SECTION("one") { @@ -51,7 +51,7 @@ } SECTION("two") { auto k = GENERATE(4, 5, 6); - REQUIRE(j != k); + REQUIRE(i != k); } } ``` @@ -60,7 +60,7 @@ "two", "one"... -The fact that `GENERATE` introduces a virtual `SECTION` can als obe used +The fact that `GENERATE` introduces a virtual `SECTION` can also be used to make a generator replay only some `SECTION`s, without having to explicitly add a `SECTION`. As an example, the code below reports 3 assertions, because the "first" section is run once, but the "second" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/opensource-users.md new/Catch2-2.13.3/docs/opensource-users.md --- old/Catch2-2.13.0/docs/opensource-users.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/opensource-users.md 2020-10-31 18:21:23.000000000 +0100 @@ -94,6 +94,9 @@ ## Applications & Tools +### [App Mesh](https://github.com/laoshanxi/app-mesh) +A high available cloud native micro-service application management platform implemented by modern C++. + ### [ArangoDB](https://github.com/arangodb/arangodb) ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/release-notes.md new/Catch2-2.13.3/docs/release-notes.md --- old/Catch2-2.13.0/docs/release-notes.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/release-notes.md 2020-10-31 18:21:23.000000000 +0100 @@ -2,6 +2,9 @@ # Release notes **Contents**<br> +[2.13.3](#2133)<br> +[2.13.2](#2132)<br> +[2.13.1](#2131)<br> [2.13.0](#2130)<br> [2.12.4](#2124)<br> [2.12.3](#2123)<br> @@ -40,6 +43,49 @@ [Older versions](#older-versions)<br> [Even Older versions](#even-older-versions)<br> + +## 2.13.3 + +### Fixes +* Fixed possible infinite loop when combining generators with section filter (`-c` option) (#2025) + +### Miscellaneous +* Fixed `ParseAndAddCatchTests` not finding `TEST_CASE`s without tags (#2055, #2056) +* `ParseAndAddCatchTests` supports `CMP0110` policy for changing behaviour of `add_test` (#2057) + * This was the shortlived change in CMake 3.18.0 that temporarily broke `ParseAndAddCatchTests` + + +## 2.13.2 + +### Improvements +* Implemented workaround for AppleClang shadowing bug (#2030) +* Implemented workaround for NVCC ICE (#2005, #2027) + +### Fixes +* Fixed detection of `std::uncaught_exceptions` support under non-msvc platforms (#2021) +* Fixed the experimental stdout/stderr capture under Windows (#2013) + +### Miscellaneous +* `catch_discover_tests` has been improved significantly (#2023, #2039) + * You can now specify which reporter should be used + * You can now modify where the output will be written + * `WORKING_DIRECTORY` setting is respected +* `ParseAndAddCatchTests` now supports `TEMPLATE_TEST_CASE` macros (#2031) +* Various documentation fixes and improvements (#2022, #2028, #2034) + + +## 2.13.1 + +### Improvements +* `ParseAndAddCatchTests` handles CMake v3.18.0 correctly (#1984) +* Improved autodetection of `std::byte` (#1992) +* Simplified implementation of templated test cases (#2007) + * This should have a tiny positive effect on its compilation throughput + +### Fixes +* Automatic stringification of ranges handles sentinel ranges properly (#2004) + + ## 2.13.0 ### Improvements @@ -632,7 +678,7 @@ * CLR objects (`T^`) can now be stringified (#1216) * This affects code compiled as C++/CLI * Added `PredicateMatcher`, a matcher that takes an arbitrary predicate function (#1236) - * See [documentation for details](https://github.com/catchorg/Catch2/blob/master/docs/matchers.md) + * See [documentation for details](https://github.com/catchorg/Catch2/blob/v2.x/docs/matchers.md) ### Others * Modified CMake-installed pkg-config to allow `#include <catch.hpp>`(#1239) @@ -660,7 +706,7 @@ * Added an option to warn (+ exit with error) when no tests were ran (#1158) * Use as `-w NoTests` * Added provisional support for Emscripten (#1114) -* [Added a way to override the fallback stringifier](https://github.com/catchorg/Catch2/blob/master/docs/configuration.md#fallback-stringifier) (#1024) +* [Added a way to override the fallback stringifier](https://github.com/catchorg/Catch2/blob/v2.x/docs/configuration.md#fallback-stringifier) (#1024) * This allows project's own stringification machinery to be easily reused for Catch * `Catch::Session::run()` now accepts `char const * const *`, allowing it to accept array of string literals (#1031, #1178) * The embedded version of Clara was bumped to v1.1.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/docs/tutorial.md new/Catch2-2.13.3/docs/tutorial.md --- old/Catch2-2.13.0/docs/tutorial.md 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/docs/tutorial.md 2020-10-31 18:21:23.000000000 +0100 @@ -13,7 +13,7 @@ ## Getting Catch2 -The simplest way to get Catch2 is to download the latest [single header version](https://raw.githubusercontent.com/catchorg/Catch2/master/single_include/catch2/catch.hpp). The single header is generated by merging a set of individual headers but it is still just normal source code in a header file. +The simplest way to get Catch2 is to download the latest [single header version](https://raw.githubusercontent.com/catchorg/Catch2/v2.x/single_include/catch2/catch.hpp). The single header is generated by merging a set of individual headers but it is still just normal source code in a header file. Alternative ways of getting Catch2 include using your system package manager, or installing it using [its CMake package](cmake-integration.md#installing-catch2-from-git-repository). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/catch.hpp new/Catch2-2.13.3/include/catch.hpp --- old/Catch2-2.13.0/include/catch.hpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/catch.hpp 2020-10-31 18:21:23.000000000 +0100 @@ -11,7 +11,7 @@ #define CATCH_VERSION_MAJOR 2 #define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 0 +#define CATCH_VERSION_PATCH 3 #ifdef __clang__ # pragma clang system_header diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_compiler_capabilities.h new/Catch2-2.13.3/include/internal/catch_compiler_capabilities.h --- old/Catch2-2.13.0/include/internal/catch_compiler_capabilities.h 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_compiler_capabilities.h 2020-10-31 18:21:23.000000000 +0100 @@ -39,13 +39,9 @@ #endif -#if defined(__cpp_lib_uncaught_exceptions) -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - // We have to avoid both ICC and Clang, because they try to mask themselves // as gcc, and we want only GCC in this block -#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) # define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) # define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) @@ -69,7 +65,7 @@ // ``` // // Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. -# if !defined(__ibmxl__) +# if !defined(__ibmxl__) && !defined(__CUDACC__) # define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ # endif @@ -153,9 +149,6 @@ # define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) # define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) -# if _MSC_VER >= 1900 // Visual Studio 2015 or newer -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -# endif // Universal Windows platform does not support SEH // Or console colours (or console at all...) @@ -240,7 +233,10 @@ // Check if byte is available and usable # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # include <cstddef> + # if __cpp_lib_byte > 0 + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) // Check if variant is available and usable @@ -284,10 +280,6 @@ # define CATCH_CONFIG_CPP17_OPTIONAL #endif -#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) -# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) # define CATCH_CONFIG_CPP17_STRING_VIEW #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_config_uncaught_exceptions.hpp new/Catch2-2.13.3/include/internal/catch_config_uncaught_exceptions.hpp --- old/Catch2-2.13.0/include/internal/catch_config_uncaught_exceptions.hpp 1970-01-01 01:00:00.000000000 +0100 +++ new/Catch2-2.13.3/include/internal/catch_config_uncaught_exceptions.hpp 2020-10-31 18:21:23.000000000 +0100 @@ -0,0 +1,44 @@ + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +/** \file + * Wrapper for UNCAUGHT_EXCEPTIONS configuration option + * + * For some functionality, Catch2 requires to know whether there is + * an active exception. Because `std::uncaught_exception` is deprecated + * in C++17, we want to use `std::uncaught_exceptions` if possible. + */ + +#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP + +#if defined(_MSC_VER) +# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +# endif +#endif + + +#include <exception> + +#if defined(__cpp_lib_uncaught_exceptions) \ + && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif // __cpp_lib_uncaught_exceptions + + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + + +#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_output_redirect.cpp new/Catch2-2.13.3/include/internal/catch_output_redirect.cpp --- old/Catch2-2.13.0/include/internal/catch_output_redirect.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_output_redirect.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -66,7 +66,7 @@ if (tmpnam_s(m_buffer)) { CATCH_RUNTIME_ERROR("Could not get a temp filename"); } - if (fopen_s(&m_file, m_buffer, "w")) { + if (fopen_s(&m_file, m_buffer, "w+")) { char buffer[100]; if (strerror_s(buffer, errno)) { CATCH_RUNTIME_ERROR("Could not translate errno to a string"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_run_context.cpp new/Catch2-2.13.3/include/internal/catch_run_context.cpp --- old/Catch2-2.13.0/include/internal/catch_run_context.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_run_context.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -71,13 +71,53 @@ // `SECTION`s. // **The check for m_children.empty cannot be removed**. // doing so would break `GENERATE` _not_ followed by `SECTION`s. - const bool should_wait_for_child = - !m_children.empty() && - std::find_if( m_children.begin(), - m_children.end(), - []( TestCaseTracking::ITrackerPtr tracker ) { - return tracker->hasStarted(); - } ) == m_children.end(); + const bool should_wait_for_child = [&]() { + // No children -> nobody to wait for + if ( m_children.empty() ) { + return false; + } + // If at least one child started executing, don't wait + if ( std::find_if( + m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) != m_children.end() ) { + return false; + } + + // No children have started. We need to check if they _can_ + // start, and thus we should wait for them, or they cannot + // start (due to filters), and we shouldn't wait for them + auto* parent = m_parent; + // This is safe: there is always at least one section + // tracker in a test case tracking tree + while ( !parent->isSectionTracker() ) { + parent = &( parent->parent() ); + } + assert( parent && + "Missing root (test case) level section" ); + + auto const& parentSection = + static_cast<SectionTracker&>( *parent ); + auto const& filters = parentSection.getFilters(); + // No filters -> no restrictions on running sections + if ( filters.empty() ) { + return true; + } + + for ( auto const& child : m_children ) { + if ( child->isSectionTracker() && + std::find( filters.begin(), + filters.end(), + static_cast<SectionTracker&>( *child ) + .trimmedName() ) != + filters.end() ) { + return true; + } + } + return false; + }(); // This check is a bit tricky, because m_generator->next() // has a side-effect, where it consumes generator's current diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_test_case_registry_impl.cpp new/Catch2-2.13.3/include/internal/catch_test_case_registry_impl.cpp --- old/Catch2-2.13.0/include/internal/catch_test_case_registry_impl.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_test_case_registry_impl.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -22,10 +22,10 @@ namespace { struct TestHasher { - explicit TestHasher(Catch::SimplePcg32& rng) { - basis = rng(); + explicit TestHasher(Catch::SimplePcg32& rng_instance) { + basis = rng_instance(); basis <<= 32; - basis |= rng(); + basis |= rng_instance(); } uint64_t basis; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_test_case_tracker.cpp new/Catch2-2.13.3/include/internal/catch_test_case_tracker.cpp --- old/Catch2-2.13.0/include/internal/catch_test_case_tracker.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_test_case_tracker.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -233,6 +233,14 @@ m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); } + std::vector<std::string> const& SectionTracker::getFilters() const { + return m_filters; + } + + std::string const& SectionTracker::trimmedName() const { + return m_trimmed_name; + } + } // namespace TestCaseTracking using TestCaseTracking::ITracker; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_test_case_tracker.h new/Catch2-2.13.3/include/internal/catch_test_case_tracker.h --- old/Catch2-2.13.0/include/internal/catch_test_case_tracker.h 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_test_case_tracker.h 2020-10-31 18:21:23.000000000 +0100 @@ -163,6 +163,10 @@ void addInitialFilters( std::vector<std::string> const& filters ); void addNextFilters( std::vector<std::string> const& filters ); + //! Returns filters active in this tracker + std::vector<std::string> const& getFilters() const; + //! Returns whitespace-trimmed name of the tracked section + std::string const& trimmedName() const; }; } // namespace TestCaseTracking diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_test_registry.h new/Catch2-2.13.3/include/internal/catch_test_registry.h --- old/Catch2-2.13.0/include/internal/catch_test_registry.h 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_test_registry.h 2020-10-31 18:21:23.000000000 +0100 @@ -160,7 +160,7 @@ int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -206,7 +206,7 @@ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\ } \ }; \ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ @@ -250,7 +250,7 @@ void reg_tests() { \ int index = 0; \ using expander = int[]; \ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\ } \ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ @@ -285,7 +285,7 @@ int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -334,7 +334,7 @@ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -381,7 +381,7 @@ void reg_tests(){\ int index = 0;\ using expander = int[];\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_tostring.h new/Catch2-2.13.3/include/internal/catch_tostring.h --- old/Catch2-2.13.0/include/internal/catch_tostring.h 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_tostring.h 2020-10-31 18:21:23.000000000 +0100 @@ -309,8 +309,8 @@ #endif namespace Detail { - template<typename InputIterator> - std::string rangeToString(InputIterator first, InputIterator last) { + template<typename InputIterator, typename Sentinel = InputIterator> + std::string rangeToString(InputIterator first, Sentinel last) { ReusableStringStream rss; rss << "{ "; if (first != last) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_uncaught_exceptions.cpp new/Catch2-2.13.3/include/internal/catch_uncaught_exceptions.cpp --- old/Catch2-2.13.0/include/internal/catch_uncaught_exceptions.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_uncaught_exceptions.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -8,6 +8,8 @@ #include "catch_compiler_capabilities.h" #include "catch_uncaught_exceptions.h" +#include "catch_config_uncaught_exceptions.hpp" + #include <exception> namespace Catch { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/include/internal/catch_version.cpp new/Catch2-2.13.3/include/internal/catch_version.cpp --- old/Catch2-2.13.0/include/internal/catch_version.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/include/internal/catch_version.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -37,7 +37,7 @@ } Version const& libraryVersion() { - static Version version( 2, 13, 0, "", 0 ); + static Version version( 2, 13, 3, "", 0 ); return version; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/CMakeLists.txt new/Catch2-2.13.3/projects/CMakeLists.txt --- old/Catch2-2.13.0/projects/CMakeLists.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/CMakeLists.txt 2020-10-31 18:21:23.000000000 +0100 @@ -124,6 +124,7 @@ ${HEADER_DIR}/internal/catch_common.h ${HEADER_DIR}/internal/catch_compiler_capabilities.h ${HEADER_DIR}/internal/catch_config.hpp + ${HEADER_DIR}/internal/catch_config_uncaught_exceptions.hpp ${HEADER_DIR}/internal/catch_console_colour.h ${HEADER_DIR}/internal/catch_context.h ${HEADER_DIR}/internal/catch_debug_console.h @@ -418,6 +419,33 @@ add_test(NAME FilteredSection-2 COMMAND $<TARGET_FILE:SelfTest> \#1394\ nested -c NestedRunSection -c s1) set_tests_properties(FilteredSection-2 PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran") +add_test( + NAME + FilteredSection::GeneratorsDontCauseInfiniteLoop-1 + COMMAND + $<TARGET_FILE:SelfTest> "#2025: original repro" -c "fov_0" +) +set_tests_properties(FilteredSection::GeneratorsDontCauseInfiniteLoop-1 + PROPERTIES + PASS_REGULAR_EXPRESSION "inside with fov: 0" # This should happen + FAIL_REGULAR_EXPRESSION "inside with fov: 1" # This would mean there was no filtering +) + +# GENERATE between filtered sections (both are selected) +add_test( + NAME + FilteredSection::GeneratorsDontCauseInfiniteLoop-2 + COMMAND + $<TARGET_FILE:SelfTest> "#2025: same-level sections" + -c "A" + -c "B" +) +set_tests_properties(FilteredSection::GeneratorsDontCauseInfiniteLoop-2 + PROPERTIES + PASS_REGULAR_EXPRESSION "All tests passed \\(4 assertions in 1 test case\\)" +) + + # AppVeyor has a Python 2.7 in path, but doesn't have .py files as autorunnable add_test(NAME ApprovalTests COMMAND ${PYTHON_EXECUTABLE} ${CATCH_DIR}/scripts/approvalTests.py $<TARGET_FILE:SelfTest>) set_tests_properties(ApprovalTests PROPERTIES FAIL_REGULAR_EXPRESSION "Results differed") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/compact.sw.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/compact.sw.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/compact.sw.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/compact.sw.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -1203,6 +1203,7 @@ Misc.tests.cpp:<line number>: passed: std::tuple_size<TestType>::value >= 1 for: 3 >= 1 Misc.tests.cpp:<line number>: passed: std::tuple_size<TestType>::value >= 1 for: 2 >= 1 Misc.tests.cpp:<line number>: passed: std::tuple_size<TestType>::value >= 1 for: 1 >= 1 +ToString.tests.cpp:<line number>: passed: Catch::Detail::stringify(UsesSentinel{}) == "{ }" for: "{ }" == "{ }" Decomposition.tests.cpp:<line number>: failed: truthy(false) for: Hey, its truthy! Matchers.tests.cpp:<line number>: failed: testStringForMatching(), Matches("this STRING contains 'abc' as a substring") for: "this string contains 'abc' as a substring" matches "this STRING contains 'abc' as a substring" case sensitively Matchers.tests.cpp:<line number>: failed: testStringForMatching(), Matches("contains 'abc' as a substring") for: "this string contains 'abc' as a substring" matches "contains 'abc' as a substring" case sensitively diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/console.std.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/console.std.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/console.std.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/console.std.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -1380,6 +1380,6 @@ Why would you throw a std::string? =============================================================================== -test cases: 321 | 247 passed | 70 failed | 4 failed as expected -assertions: 1758 | 1606 passed | 131 failed | 21 failed as expected +test cases: 322 | 248 passed | 70 failed | 4 failed as expected +assertions: 1759 | 1607 passed | 131 failed | 21 failed as expected diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/console.sw.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/console.sw.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/console.sw.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/console.sw.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -8896,6 +8896,17 @@ 1 >= 1 ------------------------------------------------------------------------------- +Range type with sentinel +------------------------------------------------------------------------------- +ToString.tests.cpp:<line number> +............................................................................... + +ToString.tests.cpp:<line number>: PASSED: + CHECK( Catch::Detail::stringify(UsesSentinel{}) == "{ }" ) +with expansion: + "{ }" == "{ }" + +------------------------------------------------------------------------------- Reconstruction should be based on stringification: #914 ------------------------------------------------------------------------------- Decomposition.tests.cpp:<line number> @@ -14127,6 +14138,6 @@ Misc.tests.cpp:<line number>: PASSED: =============================================================================== -test cases: 321 | 231 passed | 86 failed | 4 failed as expected -assertions: 1775 | 1606 passed | 148 failed | 21 failed as expected +test cases: 322 | 232 passed | 86 failed | 4 failed as expected +assertions: 1776 | 1607 passed | 148 failed | 21 failed as expected diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/junit.sw.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/junit.sw.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/junit.sw.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/junit.sw.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <testsuitesloose text artifact > - <testsuite name="<exe-name>" errors="17" failures="132" tests="1776" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> + <testsuite name="<exe-name>" errors="17" failures="132" tests="1777" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> <properties> <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/> <property name="random-seed" value="1"/> @@ -1045,6 +1045,7 @@ <testcase classname="<exe-name>.global" name="Product with differing arities - std::tuple<int, double, float>" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Product with differing arities - std::tuple<int, double>" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Product with differing arities - std::tuple<int>" time="{duration}" status="run"/> + <testcase classname="<exe-name>.global" name="Range type with sentinel" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reconstruction should be based on stringification: #914" time="{duration}" status="run"> <failure message="truthy(false)" type="CHECK"> FAILED: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/sonarqube.sw.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/sonarqube.sw.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/sonarqube.sw.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/sonarqube.sw.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -162,6 +162,7 @@ </file> <file path="projects/<exe-name>/IntrospectiveTests/ToString.tests.cpp"> <testCase name="Directly creating an EnumInfo" duration="{duration}"/> + <testCase name="Range type with sentinel" duration="{duration}"/> <testCase name="parseEnums/No enums" duration="{duration}"/> <testCase name="parseEnums/One enum value" duration="{duration}"/> <testCase name="parseEnums/Multiple enum values" duration="{duration}"/> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/Baselines/xml.sw.approved.txt new/Catch2-2.13.3/projects/SelfTest/Baselines/xml.sw.approved.txt --- old/Catch2-2.13.0/projects/SelfTest/Baselines/xml.sw.approved.txt 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/Baselines/xml.sw.approved.txt 2020-10-31 18:21:23.000000000 +0100 @@ -10962,6 +10962,17 @@ </Expression> <OverallResult success="true"/> </TestCase> + <TestCase name="Range type with sentinel" filename="projects/<exe-name>/IntrospectiveTests/ToString.tests.cpp" > + <Expression success="true" type="CHECK" filename="projects/<exe-name>/IntrospectiveTests/ToString.tests.cpp" > + <Original> + Catch::Detail::stringify(UsesSentinel{}) == "{ }" + </Original> + <Expanded> + "{ }" == "{ }" + </Expanded> + </Expression> + <OverallResult success="true"/> + </TestCase> <TestCase name="Reconstruction should be based on stringification: #914" tags="[!hide][.][Decomposition][failing]" filename="projects/<exe-name>/UsageTests/Decomposition.tests.cpp" > <Expression success="false" type="CHECK" filename="projects/<exe-name>/UsageTests/Decomposition.tests.cpp" > <Original> @@ -16711,9 +16722,9 @@ </Section> <OverallResult success="true"/> </TestCase> - <OverallResults successes="1606" failures="149" expectedFailures="21"/> - <OverallResultsCases successes="231" failures="86" expectedFailures="4"/> + <OverallResults successes="1607" failures="149" expectedFailures="21"/> + <OverallResultsCases successes="232" failures="86" expectedFailures="4"/> </Group> - <OverallResults successes="1606" failures="148" expectedFailures="21"/> - <OverallResultsCases successes="231" failures="86" expectedFailures="4"/> + <OverallResults successes="1607" failures="148" expectedFailures="21"/> + <OverallResultsCases successes="232" failures="86" expectedFailures="4"/> </Catch> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp new/Catch2-2.13.3/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp --- old/Catch2-2.13.0/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/IntrospectiveTests/ToString.tests.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -4,6 +4,13 @@ enum class EnumClass3 { Value1, Value2, Value3, Value4 }; +struct UsesSentinel { + using const_iterator = int const*; + using const_sentinel = std::nullptr_t; + + const_iterator begin() const { return nullptr; } + const_iterator end() const { return nullptr; } +}; TEST_CASE( "parseEnums", "[Strings][enums]" ) { using namespace Catch::Matchers; @@ -40,3 +47,7 @@ CHECK( enumInfo->lookup(1) == "Value2" ); CHECK( enumInfo->lookup(3) == "{** unexpected enum value **}" ); } + +TEST_CASE("Range type with sentinel") { + CHECK( Catch::Detail::stringify(UsesSentinel{}) == "{ }" ); +} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/projects/SelfTest/UsageTests/Tricky.tests.cpp new/Catch2-2.13.3/projects/SelfTest/UsageTests/Tricky.tests.cpp --- old/Catch2-2.13.0/projects/SelfTest/UsageTests/Tricky.tests.cpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/projects/SelfTest/UsageTests/Tricky.tests.cpp 2020-10-31 18:21:23.000000000 +0100 @@ -402,3 +402,28 @@ // FAIL aborts the test by throwing a Catch exception FAIL("1514"); } + + +TEST_CASE( "#2025: -c shouldn't cause infinite loop", "[sections][generators][regression][.approvals]" ) { + SECTION( "Check cursor from buffer offset" ) { + auto bufPos = GENERATE_REF( range( 0, 44 ) ); + WHEN( "Buffer position is " << bufPos ) { REQUIRE( 1 == 1 ); } + } +} + +TEST_CASE("#2025: original repro", "[sections][generators][regression][.approvals]") { + auto fov = GENERATE(true, false); + DYNAMIC_SECTION("fov_" << fov) { + std::cout << "inside with fov: " << fov << '\n'; + } +} + +TEST_CASE("#2025: same-level sections", "[sections][generators][regression][.approvals]") { + SECTION("A") { + SUCCEED(); + } + auto i = GENERATE(1, 2, 3); + SECTION("B") { + REQUIRE(i < 4); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/scripts/releaseCommon.py new/Catch2-2.13.3/scripts/releaseCommon.py --- old/Catch2-2.13.0/scripts/releaseCommon.py 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/scripts/releaseCommon.py 2020-10-31 18:21:23.000000000 +0100 @@ -79,13 +79,15 @@ f.write( line + "\n" ) def updateReadmeFile(version): - import updateWandbox + + # Wandbox no longer accepts the single-header upload, skip + # import updateWandbox downloadParser = re.compile( r'<a href=\"https://github.com/catchorg/Catch2/releases/download/v\d+\.\d+\.\d+/catch.hpp\">' ) - success, wandboxLink = updateWandbox.uploadFiles() - if not success: - print('Error when uploading to wandbox: {}'.format(wandboxLink)) - exit(1) + # success, wandboxLink = updateWandbox.uploadFiles() + # if not success: + # print('Error when uploading to wandbox: {}'.format(wandboxLink)) + # exit(1) f = open( readmePath, 'r' ) lines = [] for line in f: @@ -94,8 +96,8 @@ f = open( readmePath, 'w' ) for line in lines: line = downloadParser.sub( r'<a href="https://github.com/catchorg/Catch2/releases/download/v{0}/catch.hpp">'.format(version.getVersionString()) , line) - if '[![Try online](https://img.shields.io/badge/try-online-blue.svg)]' in line: - line = '[![Try online](https://img.shields.io/badge/try-online-blue.svg)]({0})'.format(wandboxLink) +# if '[![Try online](https://img.shields.io/badge/try-online-blue.svg)]' in line: +# line = '[![Try online](https://img.shields.io/badge/try-online-blue.svg)]({0})'.format(wandboxLink) f.write( line + "\n" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Catch2-2.13.0/single_include/catch2/catch.hpp new/Catch2-2.13.3/single_include/catch2/catch.hpp --- old/Catch2-2.13.0/single_include/catch2/catch.hpp 2020-07-12 20:28:38.000000000 +0200 +++ new/Catch2-2.13.3/single_include/catch2/catch.hpp 2020-10-31 18:21:23.000000000 +0100 @@ -1,6 +1,6 @@ /* - * Catch v2.13.0 - * Generated: 2020-07-12 20:07:49.015950 + * Catch v2.13.3 + * Generated: 2020-10-31 18:20:31.045274 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. @@ -15,7 +15,7 @@ #define CATCH_VERSION_MAJOR 2 #define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 0 +#define CATCH_VERSION_PATCH 3 #ifdef __clang__ # pragma clang system_header @@ -132,13 +132,9 @@ #endif -#if defined(__cpp_lib_uncaught_exceptions) -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - // We have to avoid both ICC and Clang, because they try to mask themselves // as gcc, and we want only GCC in this block -#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) # define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) # define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) @@ -162,7 +158,7 @@ // ``` // // Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. -# if !defined(__ibmxl__) +# if !defined(__ibmxl__) && !defined(__CUDACC__) # define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ # endif @@ -244,10 +240,6 @@ # define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) # define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) -# if _MSC_VER >= 1900 // Visual Studio 2015 or newer -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -# endif - // Universal Windows platform does not support SEH // Or console colours (or console at all...) # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) @@ -330,7 +322,10 @@ // Check if byte is available and usable # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # include <cstddef> + # if __cpp_lib_byte > 0 + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) // Check if variant is available and usable @@ -373,10 +368,6 @@ # define CATCH_CONFIG_CPP17_OPTIONAL #endif -#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) -# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) # define CATCH_CONFIG_CPP17_STRING_VIEW #endif @@ -1105,7 +1096,7 @@ int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1151,7 +1142,7 @@ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\ } \ }; \ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ @@ -1195,7 +1186,7 @@ void reg_tests() { \ int index = 0; \ using expander = int[]; \ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\ } \ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ @@ -1229,7 +1220,7 @@ int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1278,7 +1269,7 @@ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1325,7 +1316,7 @@ void reg_tests(){\ int index = 0;\ using expander = int[];\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1829,8 +1820,8 @@ #endif namespace Detail { - template<typename InputIterator> - std::string rangeToString(InputIterator first, InputIterator last) { + template<typename InputIterator, typename Sentinel = InputIterator> + std::string rangeToString(InputIterator first, Sentinel last) { ReusableStringStream rss; rss << "{ "; if (first != last) { @@ -7611,6 +7602,10 @@ void addInitialFilters( std::vector<std::string> const& filters ); void addNextFilters( std::vector<std::string> const& filters ); + //! Returns filters active in this tracker + std::vector<std::string> const& getFilters() const; + //! Returns whitespace-trimmed name of the tracked section + std::string const& trimmedName() const; }; } // namespace TestCaseTracking @@ -12042,7 +12037,7 @@ if (tmpnam_s(m_buffer)) { CATCH_RUNTIME_ERROR("Could not get a temp filename"); } - if (fopen_s(&m_file, m_buffer, "w")) { + if (fopen_s(&m_file, m_buffer, "w+")) { char buffer[100]; if (strerror_s(buffer, errno)) { CATCH_RUNTIME_ERROR("Could not translate errno to a string"); @@ -12580,13 +12575,53 @@ // `SECTION`s. // **The check for m_children.empty cannot be removed**. // doing so would break `GENERATE` _not_ followed by `SECTION`s. - const bool should_wait_for_child = - !m_children.empty() && - std::find_if( m_children.begin(), - m_children.end(), - []( TestCaseTracking::ITrackerPtr tracker ) { - return tracker->hasStarted(); - } ) == m_children.end(); + const bool should_wait_for_child = [&]() { + // No children -> nobody to wait for + if ( m_children.empty() ) { + return false; + } + // If at least one child started executing, don't wait + if ( std::find_if( + m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) != m_children.end() ) { + return false; + } + + // No children have started. We need to check if they _can_ + // start, and thus we should wait for them, or they cannot + // start (due to filters), and we shouldn't wait for them + auto* parent = m_parent; + // This is safe: there is always at least one section + // tracker in a test case tracking tree + while ( !parent->isSectionTracker() ) { + parent = &( parent->parent() ); + } + assert( parent && + "Missing root (test case) level section" ); + + auto const& parentSection = + static_cast<SectionTracker&>( *parent ); + auto const& filters = parentSection.getFilters(); + // No filters -> no restrictions on running sections + if ( filters.empty() ) { + return true; + } + + for ( auto const& child : m_children ) { + if ( child->isSectionTracker() && + std::find( filters.begin(), + filters.end(), + static_cast<SectionTracker&>( *child ) + .trimmedName() ) != + filters.end() ) { + return true; + } + } + return false; + }(); // This check is a bit tricky, because m_generator->next() // has a side-effect, where it consumes generator's current @@ -14091,10 +14126,10 @@ namespace { struct TestHasher { - explicit TestHasher(Catch::SimplePcg32& rng) { - basis = rng(); + explicit TestHasher(Catch::SimplePcg32& rng_instance) { + basis = rng_instance(); basis <<= 32; - basis |= rng(); + basis |= rng_instance(); } uint64_t basis; @@ -14458,6 +14493,14 @@ m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); } + std::vector<std::string> const& SectionTracker::getFilters() const { + return m_filters; + } + + std::string const& SectionTracker::trimmedName() const { + return m_trimmed_name; + } + } // namespace TestCaseTracking using TestCaseTracking::ITracker; @@ -15192,6 +15235,41 @@ // end catch_totals.cpp // start catch_uncaught_exceptions.cpp +// start catch_config_uncaught_exceptions.hpp + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP + +#if defined(_MSC_VER) +# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +# endif +#endif + +#include <exception> + +#if defined(__cpp_lib_uncaught_exceptions) \ + && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif // __cpp_lib_uncaught_exceptions + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + +#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +// end catch_config_uncaught_exceptions.hpp #include <exception> namespace Catch { @@ -15238,7 +15316,7 @@ } Version const& libraryVersion() { - static Version version( 2, 13, 0, "", 0 ); + static Version version( 2, 13, 3, "", 0 ); return version; } _______________________________________________ openSUSE Commits mailing list -- commit@lists.opensuse.org To unsubscribe, email commit-le...@lists.opensuse.org List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette List Archives: https://lists.opensuse.org/archives/list/commit@lists.opensuse.org