Add trim for StringRef

This commit is contained in:
Martin Hořeňovský 2019-09-07 11:31:00 +02:00
parent b77ab74b72
commit f2c2711bdc
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
8 changed files with 106 additions and 5 deletions

View File

@ -53,6 +53,18 @@ namespace Catch {
return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();
} }
StringRef trim(StringRef ref) {
const auto is_ws = [](char c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\r';
};
size_t real_begin = 0;
while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; }
size_t real_end = ref.size();
while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; }
return ref.substr(real_begin, real_end - real_begin);
}
bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
bool replaced = false; bool replaced = false;
std::size_t i = str.find( replaceThis ); std::size_t i = str.find( replaceThis );

View File

@ -22,7 +22,10 @@ namespace Catch {
bool contains( std::string const& s, std::string const& infix ); bool contains( std::string const& s, std::string const& infix );
void toLowerInPlace( std::string& s ); void toLowerInPlace( std::string& s );
std::string toLower( std::string const& s ); std::string toLower( std::string const& s );
//! Returns a new string without whitespace at the start/end
std::string trim( std::string const& str ); std::string trim( std::string const& str );
//! Returns a substring of the original ref without whitespace. Beware lifetimes!
StringRef trim(StringRef ref);
// !!! Be aware, returns refs into original string - make sure original string outlives them // !!! Be aware, returns refs into original string - make sure original string outlives them
std::vector<StringRef> splitStringRef( StringRef str, char delimiter ); std::vector<StringRef> splitStringRef( StringRef str, char delimiter );

View File

@ -1311,6 +1311,18 @@ StringManip.tests.cpp:<line number>: passed: trim(std::string(trailing_whitespac
StringManip.tests.cpp:<line number>: passed: trim(std::string(whitespace_at_both_ends)) == no_whitespace for: "There is no extra whitespace here" StringManip.tests.cpp:<line number>: passed: trim(std::string(whitespace_at_both_ends)) == no_whitespace for: "There is no extra whitespace here"
== ==
"There is no extra whitespace here" "There is no extra whitespace here"
StringManip.tests.cpp:<line number>: passed: trim(StringRef(no_whitespace)) == StringRef(no_whitespace) for: There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: passed: trim(StringRef(leading_whitespace)) == StringRef(no_whitespace) for: There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: passed: trim(StringRef(trailing_whitespace)) == StringRef(no_whitespace) for: There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: passed: trim(StringRef(whitespace_at_both_ends)) == StringRef(no_whitespace) for: There is no extra whitespace here
==
There is no extra whitespace here
Exception.tests.cpp:<line number>: failed: unexpected exception with message: '3.14' Exception.tests.cpp:<line number>: failed: unexpected exception with message: '3.14'
Approx.tests.cpp:<line number>: passed: d == approx( 1.23 ) for: 1.23 == Approx( 1.23 ) Approx.tests.cpp:<line number>: passed: d == approx( 1.23 ) for: 1.23 == Approx( 1.23 )
Approx.tests.cpp:<line number>: passed: d == approx( 1.22 ) for: 1.23 == Approx( 1.22 ) Approx.tests.cpp:<line number>: passed: d == approx( 1.22 ) for: 1.23 == Approx( 1.22 )

View File

@ -1381,5 +1381,5 @@ due to unexpected exception with message:
=============================================================================== ===============================================================================
test cases: 300 | 226 passed | 70 failed | 4 failed as expected test cases: 300 | 226 passed | 70 failed | 4 failed as expected
assertions: 1558 | 1406 passed | 131 failed | 21 failed as expected assertions: 1562 | 1410 passed | 131 failed | 21 failed as expected

View File

@ -9813,6 +9813,34 @@ with expansion:
== ==
"There is no extra whitespace here" "There is no extra whitespace here"
StringManip.tests.cpp:<line number>: PASSED:
REQUIRE( trim(StringRef(no_whitespace)) == StringRef(no_whitespace) )
with expansion:
There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: PASSED:
REQUIRE( trim(StringRef(leading_whitespace)) == StringRef(no_whitespace) )
with expansion:
There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: PASSED:
REQUIRE( trim(StringRef(trailing_whitespace)) == StringRef(no_whitespace) )
with expansion:
There is no extra whitespace here
==
There is no extra whitespace here
StringManip.tests.cpp:<line number>: PASSED:
REQUIRE( trim(StringRef(whitespace_at_both_ends)) == StringRef(no_whitespace) )
with expansion:
There is no extra whitespace here
==
There is no extra whitespace here
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Unexpected exceptions can be translated Unexpected exceptions can be translated
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -12456,5 +12484,5 @@ Misc.tests.cpp:<line number>: PASSED:
=============================================================================== ===============================================================================
test cases: 300 | 210 passed | 86 failed | 4 failed as expected test cases: 300 | 210 passed | 86 failed | 4 failed as expected
assertions: 1575 | 1406 passed | 148 failed | 21 failed as expected assertions: 1579 | 1410 passed | 148 failed | 21 failed as expected

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<testsuitesloose text artifact <testsuitesloose text artifact
> >
<testsuite name="<exe-name>" errors="17" failures="132" tests="1576" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> <testsuite name="<exe-name>" errors="17" failures="132" tests="1580" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties> <properties>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/> <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/>
<property name="random-seed" value="1"/> <property name="random-seed" value="1"/>

View File

@ -11854,6 +11854,46 @@ Message from section two
"There is no extra whitespace here" "There is no extra whitespace here"
</Expanded> </Expanded>
</Expression> </Expression>
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/StringManip.tests.cpp" >
<Original>
trim(StringRef(no_whitespace)) == StringRef(no_whitespace)
</Original>
<Expanded>
There is no extra whitespace here
==
There is no extra whitespace here
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/StringManip.tests.cpp" >
<Original>
trim(StringRef(leading_whitespace)) == StringRef(no_whitespace)
</Original>
<Expanded>
There is no extra whitespace here
==
There is no extra whitespace here
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/StringManip.tests.cpp" >
<Original>
trim(StringRef(trailing_whitespace)) == StringRef(no_whitespace)
</Original>
<Expanded>
There is no extra whitespace here
==
There is no extra whitespace here
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/StringManip.tests.cpp" >
<Original>
trim(StringRef(whitespace_at_both_ends)) == StringRef(no_whitespace)
</Original>
<Expanded>
There is no extra whitespace here
==
There is no extra whitespace here
</Expanded>
</Expression>
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<TestCase name="Unexpected exceptions can be translated" tags="[!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" > <TestCase name="Unexpected exceptions can be translated" tags="[!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
@ -14821,7 +14861,7 @@ loose text artifact
</Section> </Section>
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<OverallResults successes="1406" failures="149" expectedFailures="21"/> <OverallResults successes="1410" failures="149" expectedFailures="21"/>
</Group> </Group>
<OverallResults successes="1406" failures="148" expectedFailures="21"/> <OverallResults successes="1410" failures="148" expectedFailures="21"/>
</Catch> </Catch>

View File

@ -10,9 +10,15 @@ static const char * const whitespace_at_both_ends = " \r\n \t There is no extra
TEST_CASE("Trim strings", "[string-manip]") { TEST_CASE("Trim strings", "[string-manip]") {
using Catch::trim; using Catch::StringRef; using Catch::trim; using Catch::StringRef;
static_assert(std::is_same<std::string, decltype(trim(std::string{}))>::value, "Trimming std::string should return std::string"); static_assert(std::is_same<std::string, decltype(trim(std::string{}))>::value, "Trimming std::string should return std::string");
static_assert(std::is_same<StringRef, decltype(trim(StringRef{}))>::value, "Trimming StringRef should return StringRef");
REQUIRE(trim(std::string(no_whitespace)) == no_whitespace); REQUIRE(trim(std::string(no_whitespace)) == no_whitespace);
REQUIRE(trim(std::string(leading_whitespace)) == no_whitespace); REQUIRE(trim(std::string(leading_whitespace)) == no_whitespace);
REQUIRE(trim(std::string(trailing_whitespace)) == no_whitespace); REQUIRE(trim(std::string(trailing_whitespace)) == no_whitespace);
REQUIRE(trim(std::string(whitespace_at_both_ends)) == no_whitespace); REQUIRE(trim(std::string(whitespace_at_both_ends)) == no_whitespace);
REQUIRE(trim(StringRef(no_whitespace)) == StringRef(no_whitespace));
REQUIRE(trim(StringRef(leading_whitespace)) == StringRef(no_whitespace));
REQUIRE(trim(StringRef(trailing_whitespace)) == StringRef(no_whitespace));
REQUIRE(trim(StringRef(whitespace_at_both_ends)) == StringRef(no_whitespace));
} }