Make reporter lookup case insensitive, registration case preserving

Previously registration was case preserving, but lookup used
lowercased reporter name, so a reporter whose name contained
upper case character could not be requested by the user.
This commit is contained in:
Martin Hořeňovský
2021-11-07 23:31:44 +01:00
parent 7800fe9708
commit 8780425385
6 changed files with 84 additions and 4 deletions

View File

@@ -76,8 +76,21 @@ namespace Catch {
#include <catch2/interfaces/catch_interfaces_reporter_registry.hpp>
#include <catch2/internal/catch_string_manip.hpp>
#include <algorithm>
namespace Catch {
IReporterRegistry::~IReporterRegistry() = default;
bool IReporterRegistry::CaseInsensitiveCmp::operator()(std::string const& lhs, std::string const& rhs) const {
return std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end(),
[](char l, char r) {
return toLower(l) < toLower(r);
});
}
}

View File

@@ -24,7 +24,11 @@ namespace Catch {
using IReporterFactoryPtr = Detail::unique_ptr<IReporterFactory>;
struct IReporterRegistry {
using FactoryMap = std::map<std::string, IReporterFactoryPtr>;
struct CaseInsensitiveCmp {
bool operator()(std::string const& lhs, std::string const& rhs) const;
};
using FactoryMap = std::map<std::string, IReporterFactoryPtr, CaseInsensitiveCmp>;
using Listeners = std::vector<IReporterFactoryPtr>;
virtual ~IReporterRegistry(); // = default

View File

@@ -140,11 +140,10 @@ namespace Catch {
auto const setReporter = [&]( std::string const& reporter ) {
IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
auto lcReporter = toLower( reporter );
auto result = factories.find( lcReporter );
auto result = factories.find( reporter );
if( factories.end() != result )
config.reporterName = lcReporter;
config.reporterName = reporter;
else
return ParserResult::runtimeError( "Unrecognized reporter, '" + reporter + "'. Check available with --list-reporters" );
return ParserResult::ok( ParseResultType::Matched );