mirror of
https://github.com/catchorg/Catch2.git
synced 2025-08-01 21:05:39 +02:00
Ignore leading/trailing whitespace in test/section specs
The leading/trailing whitespace is problematic because of e.g. `WHEN` macro having preceeding whitespace for alignment, and it is generally messy. Credits to Phil who did lot of the original work. Closes #1708
This commit is contained in:
@@ -15,11 +15,23 @@ namespace Catch {
|
||||
: m_data( data ),
|
||||
m_stream( openStream() )
|
||||
{
|
||||
// We need to trim filter specs to avoid trouble with superfluous
|
||||
// whitespace (esp. important for bdd macros, as those are manually
|
||||
// aligned with whitespace).
|
||||
|
||||
for (auto& elem : m_data.testsOrTags) {
|
||||
elem = trim(elem);
|
||||
}
|
||||
for (auto& elem : m_data.sectionsToRun) {
|
||||
elem = trim(elem);
|
||||
}
|
||||
|
||||
TestSpecParser parser(ITagAliasRegistry::get());
|
||||
if (!data.testsOrTags.empty()) {
|
||||
if (!m_data.testsOrTags.empty()) {
|
||||
m_hasTestFilters = true;
|
||||
for( auto const& testOrTags : data.testsOrTags )
|
||||
parser.parse( testOrTags );
|
||||
for (auto const& testOrTags : m_data.testsOrTags) {
|
||||
parser.parse(testOrTags);
|
||||
}
|
||||
}
|
||||
m_testSpec = parser.testSpec();
|
||||
}
|
||||
@@ -32,7 +44,7 @@ namespace Catch {
|
||||
bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; }
|
||||
bool Config::listTags() const { return m_data.listTags; }
|
||||
bool Config::listReporters() const { return m_data.listReporters; }
|
||||
|
||||
|
||||
std::string Config::getProcessName() const { return m_data.processName; }
|
||||
std::string const& Config::getReporterName() const { return m_data.reporterName; }
|
||||
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#include "catch_test_case_tracker.h"
|
||||
|
||||
#include "catch_enforce.h"
|
||||
#include "catch_string_manip.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
@@ -174,7 +175,8 @@ namespace TestCaseTracking {
|
||||
}
|
||||
|
||||
SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
|
||||
: TrackerBase( nameAndLocation, ctx, parent )
|
||||
: TrackerBase( nameAndLocation, ctx, parent ),
|
||||
m_trimmed_name(trim(nameAndLocation.name))
|
||||
{
|
||||
if( parent ) {
|
||||
while( !parent->isSectionTracker() )
|
||||
@@ -188,12 +190,11 @@ 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())
|
||||
if ((m_filters.empty() || m_filters[0] == "")
|
||||
|| std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) {
|
||||
complete = TrackerBase::isComplete();
|
||||
}
|
||||
return complete;
|
||||
|
||||
}
|
||||
|
||||
bool SectionTracker::isSectionTracker() const { return true; }
|
||||
@@ -217,12 +218,13 @@ namespace TestCaseTracking {
|
||||
}
|
||||
|
||||
void SectionTracker::tryOpen() {
|
||||
if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) )
|
||||
if( !isComplete() )
|
||||
open();
|
||||
}
|
||||
|
||||
void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) {
|
||||
if( !filters.empty() ) {
|
||||
m_filters.reserve( m_filters.size() + filters.size() + 2 );
|
||||
m_filters.push_back(""); // Root - should never be consulted
|
||||
m_filters.push_back(""); // Test Case - not a section filter
|
||||
m_filters.insert( m_filters.end(), filters.begin(), filters.end() );
|
||||
@@ -230,7 +232,7 @@ namespace TestCaseTracking {
|
||||
}
|
||||
void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) {
|
||||
if( filters.size() > 1 )
|
||||
m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() );
|
||||
m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() );
|
||||
}
|
||||
|
||||
} // namespace TestCaseTracking
|
||||
|
@@ -133,6 +133,7 @@ namespace TestCaseTracking {
|
||||
|
||||
class SectionTracker : public TrackerBase {
|
||||
std::vector<std::string> m_filters;
|
||||
std::string m_trimmed_name;
|
||||
public:
|
||||
SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
|
||||
|
||||
|
@@ -33,7 +33,7 @@ namespace Catch {
|
||||
{}
|
||||
|
||||
bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const {
|
||||
return m_wildcardPattern.matches( toLower( testCase.name ) );
|
||||
return m_wildcardPattern.matches( testCase.name );
|
||||
}
|
||||
|
||||
|
||||
|
@@ -9,14 +9,12 @@
|
||||
#include "catch_enforce.h"
|
||||
#include "catch_string_manip.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace Catch {
|
||||
|
||||
WildcardPattern::WildcardPattern( std::string const& pattern,
|
||||
CaseSensitive::Choice caseSensitivity )
|
||||
: m_caseSensitivity( caseSensitivity ),
|
||||
m_pattern( adjustCase( pattern ) )
|
||||
m_pattern( normaliseString( pattern ) )
|
||||
{
|
||||
if( startsWith( m_pattern, '*' ) ) {
|
||||
m_pattern = m_pattern.substr( 1 );
|
||||
@@ -31,19 +29,19 @@ namespace Catch {
|
||||
bool WildcardPattern::matches( std::string const& str ) const {
|
||||
switch( m_wildcard ) {
|
||||
case NoWildcard:
|
||||
return m_pattern == adjustCase( str );
|
||||
return m_pattern == normaliseString( str );
|
||||
case WildcardAtStart:
|
||||
return endsWith( adjustCase( str ), m_pattern );
|
||||
return endsWith( normaliseString( str ), m_pattern );
|
||||
case WildcardAtEnd:
|
||||
return startsWith( adjustCase( str ), m_pattern );
|
||||
return startsWith( normaliseString( str ), m_pattern );
|
||||
case WildcardAtBothEnds:
|
||||
return contains( adjustCase( str ), m_pattern );
|
||||
return contains( normaliseString( str ), m_pattern );
|
||||
default:
|
||||
CATCH_INTERNAL_ERROR( "Unknown enum" );
|
||||
}
|
||||
}
|
||||
|
||||
std::string WildcardPattern::adjustCase( std::string const& str ) const {
|
||||
return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;
|
||||
std::string WildcardPattern::normaliseString( std::string const& str ) const {
|
||||
return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str );
|
||||
}
|
||||
}
|
||||
|
@@ -28,7 +28,7 @@ namespace Catch
|
||||
virtual bool matches( std::string const& str ) const;
|
||||
|
||||
private:
|
||||
std::string adjustCase( std::string const& str ) const;
|
||||
std::string normaliseString( std::string const& str ) const;
|
||||
CaseSensitive::Choice m_caseSensitivity;
|
||||
WildcardPosition m_wildcard = NoWildcard;
|
||||
std::string m_pattern;
|
||||
|
Reference in New Issue
Block a user