mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Merge pull request #1492 from Lotterleben/fix_1394
fix #1394: avoid superfluous re-run when specific section is selected
This commit is contained in:
		| @@ -190,6 +190,17 @@ namespace TestCaseTracking { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     bool SectionTracker::isComplete() const { | ||||
|         bool complete = true; | ||||
|  | ||||
|         if ((m_filters.empty() || m_filters[0] == "") || | ||||
|              std::find(m_filters.begin(), m_filters.end(), | ||||
|                        m_nameAndLocation.name) != m_filters.end()) | ||||
|             complete = TrackerBase::isComplete(); | ||||
|         return complete; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     bool SectionTracker::isSectionTracker() const { return true; } | ||||
|  | ||||
|     SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { | ||||
|   | ||||
| @@ -140,6 +140,8 @@ namespace TestCaseTracking { | ||||
|  | ||||
|         bool isSectionTracker() const override; | ||||
|  | ||||
|         bool isComplete() const override; | ||||
|  | ||||
|         static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); | ||||
|  | ||||
|         void tryOpen(); | ||||
|   | ||||
| @@ -9,6 +9,38 @@ | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| std::string escape_arg(const std::string& arg) { | ||||
|     if (arg.empty() == false && | ||||
|         arg.find_first_of(" \t\n\v\"") == arg.npos) { | ||||
|         return arg; | ||||
|     } | ||||
|  | ||||
|     std::string escaped; | ||||
|     escaped.push_back('"'); | ||||
|     for (auto it = arg.begin(); ; ++it) { | ||||
|         int num_backslashes = 0; | ||||
|  | ||||
|         while (it != arg.end() && *it == '\\') { | ||||
|             ++it; | ||||
|             ++num_backslashes; | ||||
|         } | ||||
|  | ||||
|         if (it == arg.end()) { | ||||
|             escaped.append(num_backslashes * 2, '\\'); | ||||
|             break; | ||||
|         } else if (*it == '"') { | ||||
|             escaped.append(num_backslashes * 2 + 1, '\\'); | ||||
|             escaped.push_back(*it); | ||||
|         } else { | ||||
|             escaped.append(num_backslashes, '\\'); | ||||
|             escaped.push_back(*it); | ||||
|         } | ||||
|     } | ||||
|     escaped.push_back('"'); | ||||
|  | ||||
|     return escaped; | ||||
| } | ||||
|  | ||||
|  | ||||
| void create_empty_file(std::string const& path) { | ||||
|     std::ofstream ofs(path); | ||||
| @@ -60,8 +92,9 @@ std::string windowsify_path(std::string path) { | ||||
| void exec_cmd(std::string const& cmd, int log_num, std::string const& path) { | ||||
|     std::array<char, 128> buffer; | ||||
| #if defined(_WIN32) | ||||
|     // cmd has already been escaped outside this function. | ||||
|     auto real_cmd = "OpenCppCoverage --export_type binary:cov-report" + std::to_string(log_num) | ||||
|         + ".bin --quiet " + "--sources " + path + " --cover_children -- " + cmd; | ||||
|         + ".bin --quiet " + "--sources " + escape_arg(path) + " --cover_children -- " + cmd; | ||||
|     std::cout << "=== Marker ===: Cmd: " << real_cmd << '\n'; | ||||
|     std::shared_ptr<FILE> pipe(_popen(real_cmd.c_str(), "r"), _pclose); | ||||
| #else // Just for testing, in the real world we will always work under WIN32 | ||||
| @@ -93,7 +126,7 @@ int main(int argc, char** argv) { | ||||
|     auto num = parse_log_file_arg(args[1]); | ||||
|      | ||||
|     auto cmdline = std::accumulate(++sep, end(args), std::string{}, [] (const std::string& lhs, const std::string& rhs) { | ||||
|         return lhs + ' ' + rhs; | ||||
|         return lhs + ' ' + escape_arg(rhs); | ||||
|     }); | ||||
|  | ||||
|     try { | ||||
|   | ||||
| @@ -345,10 +345,16 @@ set_tests_properties(NoAssertions PROPERTIES PASS_REGULAR_EXPRESSION "No asserti | ||||
| add_test(NAME NoTest COMMAND $<TARGET_FILE:SelfTest> -w NoTests "___nonexistent_test___") | ||||
| set_tests_properties(NoTest PROPERTIES PASS_REGULAR_EXPRESSION "No test cases matched") | ||||
|  | ||||
| add_test(NAME FilteredSection-1 COMMAND $<TARGET_FILE:SelfTest> \#1394 -c RunSection) | ||||
| set_tests_properties(FilteredSection-1 PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran") | ||||
| 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") | ||||
|  | ||||
| # 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") | ||||
|  | ||||
|  | ||||
| if (CATCH_USE_VALGRIND) | ||||
|     add_test(NAME ValgrindRunTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest>) | ||||
|     add_test(NAME ValgrindListTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest> --list-tests --verbosity high) | ||||
|   | ||||
| @@ -324,3 +324,33 @@ TEST_CASE( "Tracker" ) { | ||||
|         //   two sections within a generator | ||||
|     } | ||||
| } | ||||
|  | ||||
| static bool previouslyRun = false; | ||||
| static bool previouslyRunNested = false; | ||||
|  | ||||
| TEST_CASE( "#1394", "[.][approvals][tracker]" ) { | ||||
|     // -- Don't re-run after specified section is done | ||||
|     REQUIRE(previouslyRun == false); | ||||
|  | ||||
|     SECTION( "RunSection" ) { | ||||
|         previouslyRun = true; | ||||
|     } | ||||
|     SECTION( "SkipSection" ) { | ||||
|         // cause an error if this section is called because it shouldn't be | ||||
|         REQUIRE(1 == 0); | ||||
|     } | ||||
| } | ||||
|  | ||||
| TEST_CASE( "#1394 nested", "[.][approvals][tracker]" ) { | ||||
|     REQUIRE(previouslyRunNested == false); | ||||
|  | ||||
|     SECTION( "NestedRunSection" ) { | ||||
|         SECTION( "s1" ) { | ||||
|             previouslyRunNested = true; | ||||
|         } | ||||
|     } | ||||
|     SECTION( "NestedSkipSection" ) { | ||||
|         // cause an error if this section is called because it shouldn't be | ||||
|         REQUIRE(1 == 0); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský