mirror of
https://github.com/catchorg/Catch2.git
synced 2025-09-25 14:41:06 +02:00
WIP
This commit is contained in:
@@ -6,11 +6,13 @@
|
|||||||
|
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
|
#include <catch2/benchmark/catch_benchmark.hpp>
|
||||||
|
#include <catch2/catch_template_test_macros.hpp>
|
||||||
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
#include <catch2/generators/catch_generators.hpp>
|
||||||
#include <catch2/internal/catch_enum_values_registry.hpp>
|
#include <catch2/internal/catch_enum_values_registry.hpp>
|
||||||
#include <catch2/matchers/catch_matchers_string.hpp>
|
#include <catch2/matchers/catch_matchers_string.hpp>
|
||||||
#include <catch2/matchers/catch_matchers_vector.hpp>
|
#include <catch2/matchers/catch_matchers_vector.hpp>
|
||||||
#include <catch2/catch_test_macros.hpp>
|
|
||||||
#include <catch2/catch_template_test_macros.hpp>
|
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
@@ -139,3 +141,70 @@ TEST_CASE( "Exception thrown inside stringify does not fail the test", "[toStrin
|
|||||||
ThrowsOnStringification tos;
|
ThrowsOnStringification tos;
|
||||||
CHECK( tos == tos );
|
CHECK( tos == tos );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
[[maybe_unused]]
|
||||||
|
std::string convertIntoString( Catch::StringRef string,
|
||||||
|
bool escapeInvisibles ) {
|
||||||
|
std::string ret;
|
||||||
|
// This is enough for the "don't escape invisibles" case, and a good
|
||||||
|
// lower bound on the "escape invisibles" case.
|
||||||
|
ret.reserve( string.size() + 2 );
|
||||||
|
|
||||||
|
if ( !escapeInvisibles ) {
|
||||||
|
ret += '"';
|
||||||
|
ret += string;
|
||||||
|
ret += '"';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t last_start = 0;
|
||||||
|
auto write_to = [&]( size_t idx ) {
|
||||||
|
if ( last_start < idx ) {
|
||||||
|
//ret.append( string.data() + last_start, idx - last_start );
|
||||||
|
ret += string.substr( last_start, idx - last_start );
|
||||||
|
}
|
||||||
|
last_start = idx + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
ret += '"';
|
||||||
|
for ( size_t i = 0; i < string.size(); ++i ) {
|
||||||
|
const char c = string[i];
|
||||||
|
if (c == '\r' || c == '\n' || c == '\t' || c == '\f') {
|
||||||
|
write_to( i );
|
||||||
|
if ( c == '\r' ) { ret.append( "\\r" ); }
|
||||||
|
if ( c == '\n' ) { ret.append( "\\n" ); }
|
||||||
|
if ( c == '\t' ) { ret.append( "\\t" ); }
|
||||||
|
if ( c == '\f' ) { ret.append( "\\f" ); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
write_to( string.size() );
|
||||||
|
ret += '"';
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_CASE( "string escaping benchmark", "[toString][!benchmark]" ) {
|
||||||
|
const auto input_length = GENERATE( as<size_t>{}, 10, 100, 10'000, 100'000 );
|
||||||
|
std::string test_input( input_length, 'a' );
|
||||||
|
BENCHMARK( "no-escape string, no-escaping, len=" +
|
||||||
|
std::to_string( input_length ) ) {
|
||||||
|
return Catch::Detail::convertIntoString( test_input, false );
|
||||||
|
};
|
||||||
|
BENCHMARK( "no-escape string, escaping, len=" +
|
||||||
|
std::to_string( input_length ) ) {
|
||||||
|
return Catch::Detail::convertIntoString( test_input, true );
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string escape_input( input_length, '\r' );
|
||||||
|
BENCHMARK( "full escape string, no-escaping, len=" +
|
||||||
|
std::to_string( input_length ) ) {
|
||||||
|
return Catch::Detail::convertIntoString( escape_input, false );
|
||||||
|
};
|
||||||
|
BENCHMARK( "full escape string, escaping, len=" +
|
||||||
|
std::to_string( input_length ) ) {
|
||||||
|
return Catch::Detail::convertIntoString( escape_input, true );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user