Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/src/catch2/catch_test_spec.cpp
diff options
context:
space:
mode:
authorMartin Hořeňovský2022-10-27 17:10:28 +0200
committerMartin Hořeňovský2022-10-27 18:23:59 +0200
commite19ed221bde6b8d8a1a62a71ed942c238ae345a7 (patch)
tree954ce5e9334d0dd588d12d6290756896897d92a2 /src/catch2/catch_test_spec.cpp
parentc6dfeb5e7dc175ca4765e884414dab52736cde9e (diff)
downloadcatch3-e19ed221bde6b8d8a1a62a71ed942c238ae345a7.tar.gz
Provide round-tripping serialization for TestSpec
Diffstat (limited to 'src/catch2/catch_test_spec.cpp')
-rw-r--r--src/catch2/catch_test_spec.cpp50
1 files changed, 42 insertions, 8 deletions
diff --git a/src/catch2/catch_test_spec.cpp b/src/catch2/catch_test_spec.cpp
index a3235d43..0a64de0d 100644
--- a/src/catch2/catch_test_spec.cpp
+++ b/src/catch2/catch_test_spec.cpp
@@ -6,12 +6,14 @@
// SPDX-License-Identifier: BSL-1.0
#include <catch2/catch_test_spec.hpp>
+#include <catch2/internal/catch_reusable_string_stream.hpp>
#include <catch2/internal/catch_string_manip.hpp>
#include <catch2/catch_test_case_info.hpp>
#include <algorithm>
#include <string>
#include <vector>
+#include <ostream>
namespace Catch {
@@ -35,6 +37,10 @@ namespace Catch {
return m_wildcardPattern.matches( testCase.name );
}
+ void TestSpec::NamePattern::serializeTo( std::ostream& out ) const {
+ out << '"' << name() << '"';
+ }
+
TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString )
: Pattern( filterString )
@@ -47,6 +53,10 @@ namespace Catch {
Tag( m_tag ) ) != end( testCase.tags );
}
+ void TestSpec::TagPattern::serializeTo( std::ostream& out ) const {
+ out << name();
+ }
+
bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const {
bool should_use = !testCase.isHidden();
for (auto const& pattern : m_required) {
@@ -63,18 +73,31 @@ namespace Catch {
return should_use;
}
- std::string TestSpec::Filter::name() const {
- std::string name;
- for (auto const& p : m_required) {
- name += p->name();
+ void TestSpec::Filter::serializeTo( std::ostream& out ) const {
+ bool first = true;
+ for ( auto const& pattern : m_required ) {
+ if ( !first ) {
+ out << ' ';
+ }
+ out << *pattern;
+ first = false;
}
- for (auto const& p : m_forbidden) {
- name += p->name();
+ for ( auto const& pattern : m_forbidden ) {
+ if ( !first ) {
+ out << ' ';
+ }
+ out << *pattern;
+ first = false;
}
- return name;
}
+ std::string TestSpec::extractFilterName( Filter const& filter ) {
+ Catch::ReusableStringStream sstr;
+ sstr << filter;
+ return sstr.str();
+ }
+
bool TestSpec::hasFilters() const {
return !m_filters.empty();
}
@@ -91,7 +114,7 @@ namespace Catch {
for( auto const& test : testCases )
if( isThrowSafe( test, config ) && filter.matches( test.getTestCaseInfo() ) )
currentMatches.emplace_back( &test );
- return FilterMatch{ filter.name(), currentMatches };
+ return FilterMatch{ extractFilterName(filter), currentMatches };
} );
return matches;
}
@@ -100,4 +123,15 @@ namespace Catch {
return m_invalidSpecs;
}
+ void TestSpec::serializeTo( std::ostream& out ) const {
+ bool first = true;
+ for ( auto const& filter : m_filters ) {
+ if ( !first ) {
+ out << ',';
+ }
+ out << filter;
+ first = false;
+ }
+ }
+
}