Add CaseInsensitiveEqualTo comparison type

This commit is contained in:
Martin Hořeňovský 2021-12-26 18:54:47 +01:00
parent 156e6fdfa9
commit cbb6764fb1
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
12 changed files with 358 additions and 8 deletions

View File

@ -22,5 +22,14 @@ namespace Catch {
[]( char l, char r ) { return toLower( l ) < toLower( r ); } );
}
bool
CaseInsensitiveEqualTo::operator()( StringRef lhs,
StringRef rhs ) const {
return std::equal(
lhs.begin(), lhs.end(),
rhs.begin(), rhs.end(),
[]( char l, char r ) { return toLower( l ) == toLower( r ); } );
}
} // namespace Detail
} // namespace Catch

View File

@ -20,6 +20,12 @@ namespace Catch {
StringRef rhs ) const;
};
//! Provides case-insensitive `op==` semantics when called
struct CaseInsensitiveEqualTo {
bool operator()( StringRef lhs,
StringRef rhs ) const;
};
} // namespace Detail
} // namespace Catch

View File

@ -100,6 +100,8 @@ Nor would this
:test-result: PASS CAPTURE can deal with complex expressions involving commas
:test-result: PASS CAPTURE parses string and character constants
:test-result: PASS Capture and info messages
:test-result: PASS CaseInsensitiveEqualsTo is case insensitive
:test-result: PASS CaseInsensitiveLess is case insensitive
:test-result: PASS Character pretty printing
:test-result: PASS Clara::Arg supports single-arg parse the way Opt does
:test-result: PASS Clara::Opt supports accept-many lambdas

View File

@ -334,6 +334,21 @@ Message.tests.cpp:<line number>: passed: with 7 messages: 'std::vector<int>{1, 2
Message.tests.cpp:<line number>: passed: with 11 messages: '("comma, in string", "escaped, \", ") := "escaped, ", "' and '"single quote in string,'," := "single quote in string,',"' and '"some escapes, \\,\\\\" := "some escapes, \,\\"' and '"some, ), unmatched, } prenheses {[<" := "some, ), unmatched, } prenheses {[<"' and ''"' := '"'' and ''\'' := '''' and '',' := ','' and ''}' := '}'' and '')' := ')'' and ''(' := '('' and ''{' := '{''
ToStringGeneral.tests.cpp:<line number>: passed: true with 1 message: 'i := 2'
ToStringGeneral.tests.cpp:<line number>: passed: true with 1 message: '3'
Details.tests.cpp:<line number>: passed: eq( "", "" ) for: true
Details.tests.cpp:<line number>: passed: !(eq( "", "a" )) for: !false
Details.tests.cpp:<line number>: passed: eq( "a", "a" ) for: true
Details.tests.cpp:<line number>: passed: eq( "a", "A" ) for: true
Details.tests.cpp:<line number>: passed: eq( "A", "a" ) for: true
Details.tests.cpp:<line number>: passed: eq( "A", "A" ) for: true
Details.tests.cpp:<line number>: passed: !(eq( "a", "b" )) for: !false
Details.tests.cpp:<line number>: passed: !(eq( "a", "B" )) for: !false
Details.tests.cpp:<line number>: passed: lt( "", "a" ) for: true
Details.tests.cpp:<line number>: passed: !(lt( "a", "a" )) for: !false
Details.tests.cpp:<line number>: passed: !(lt( "", "" )) for: !false
Details.tests.cpp:<line number>: passed: lt( "a", "b" ) for: true
Details.tests.cpp:<line number>: passed: lt( "a", "B" ) for: true
Details.tests.cpp:<line number>: passed: lt( "A", "b" ) for: true
Details.tests.cpp:<line number>: passed: lt( "A", "B" ) for: true
ToStringGeneral.tests.cpp:<line number>: passed: tab == '\t' for: '\t' == '\t'
ToStringGeneral.tests.cpp:<line number>: passed: newline == '\n' for: '\n' == '\n'
ToStringGeneral.tests.cpp:<line number>: passed: carr_return == '\r' for: '\r' == '\r'

View File

@ -1426,6 +1426,6 @@ due to unexpected exception with message:
Why would you throw a std::string?
===============================================================================
test cases: 377 | 300 passed | 70 failed | 7 failed as expected
assertions: 2154 | 1998 passed | 129 failed | 27 failed as expected
test cases: 379 | 302 passed | 70 failed | 7 failed as expected
assertions: 2169 | 2013 passed | 129 failed | 27 failed as expected

View File

@ -2801,6 +2801,109 @@ ToStringGeneral.tests.cpp:<line number>: PASSED:
with message:
3
-------------------------------------------------------------------------------
CaseInsensitiveEqualsTo is case insensitive
Degenerate cases
-------------------------------------------------------------------------------
Details.tests.cpp:<line number>
...............................................................................
Details.tests.cpp:<line number>: PASSED:
REQUIRE( eq( "", "" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( eq( "", "a" ) )
with expansion:
!false
-------------------------------------------------------------------------------
CaseInsensitiveEqualsTo is case insensitive
Plain comparisons
-------------------------------------------------------------------------------
Details.tests.cpp:<line number>
...............................................................................
Details.tests.cpp:<line number>: PASSED:
REQUIRE( eq( "a", "a" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( eq( "a", "A" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( eq( "A", "a" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( eq( "A", "A" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( eq( "a", "b" ) )
with expansion:
!false
Details.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( eq( "a", "B" ) )
with expansion:
!false
-------------------------------------------------------------------------------
CaseInsensitiveLess is case insensitive
Degenerate cases
-------------------------------------------------------------------------------
Details.tests.cpp:<line number>
...............................................................................
Details.tests.cpp:<line number>: PASSED:
REQUIRE( lt( "", "a" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( lt( "a", "a" ) )
with expansion:
!false
Details.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( lt( "", "" ) )
with expansion:
!false
-------------------------------------------------------------------------------
CaseInsensitiveLess is case insensitive
Plain comparisons
-------------------------------------------------------------------------------
Details.tests.cpp:<line number>
...............................................................................
Details.tests.cpp:<line number>: PASSED:
REQUIRE( lt( "a", "b" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( lt( "a", "B" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( lt( "A", "b" ) )
with expansion:
true
Details.tests.cpp:<line number>: PASSED:
REQUIRE( lt( "A", "B" ) )
with expansion:
true
-------------------------------------------------------------------------------
Character pretty printing
Specifically escaped
@ -17321,6 +17424,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
test cases: 377 | 284 passed | 86 failed | 7 failed as expected
assertions: 2171 | 1998 passed | 146 failed | 27 failed as expected
test cases: 379 | 286 passed | 86 failed | 7 failed as expected
assertions: 2186 | 2013 passed | 146 failed | 27 failed as expected

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuitesloose text artifact
>
<testsuite name="<exe-name>" errors="17" failures="129" tests="2171" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<testsuite name="<exe-name>" errors="17" failures="129" tests="2186" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
@ -378,6 +378,10 @@ Exception.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="CAPTURE parses string and character constants" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Capture and info messages/Capture should stringify like assertions" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Capture and info messages/Info should NOT stringify the way assertions do" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="CaseInsensitiveEqualsTo is case insensitive/Degenerate cases" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="CaseInsensitiveEqualsTo is case insensitive/Plain comparisons" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="CaseInsensitiveLess is case insensitive/Degenerate cases" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="CaseInsensitiveLess is case insensitive/Plain comparisons" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Character pretty printing/Specifically escaped" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Character pretty printing/General chars" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Character pretty printing/Low ASCII" time="{duration}" status="run"/>

View File

@ -89,6 +89,12 @@
<testCase name="Process can be configured on command line/Benchmark options/warmup-time" duration="{duration}"/>
<testCase name="Test with special, characters &quot;in name" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp">
<testCase name="CaseInsensitiveEqualsTo is case insensitive/Degenerate cases" duration="{duration}"/>
<testCase name="CaseInsensitiveEqualsTo is case insensitive/Plain comparisons" duration="{duration}"/>
<testCase name="CaseInsensitiveLess is case insensitive/Degenerate cases" duration="{duration}"/>
<testCase name="CaseInsensitiveLess is case insensitive/Plain comparisons" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/FloatingPoint.tests.cpp">
<testCase name="convertToBits" duration="{duration}"/>
</file>

View File

@ -666,6 +666,36 @@ ok {test-number} - with 11 messages: '("comma, in string", "escaped, \", ") := "
ok {test-number} - true with 1 message: 'i := 2'
# Capture and info messages
ok {test-number} - true with 1 message: '3'
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - eq( "", "" ) for: true
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - !(eq( "", "a" )) for: !false
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - eq( "a", "a" ) for: true
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - eq( "a", "A" ) for: true
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - eq( "A", "a" ) for: true
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - eq( "A", "A" ) for: true
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - !(eq( "a", "b" )) for: !false
# CaseInsensitiveEqualsTo is case insensitive
ok {test-number} - !(eq( "a", "B" )) for: !false
# CaseInsensitiveLess is case insensitive
ok {test-number} - lt( "", "a" ) for: true
# CaseInsensitiveLess is case insensitive
ok {test-number} - !(lt( "a", "a" )) for: !false
# CaseInsensitiveLess is case insensitive
ok {test-number} - !(lt( "", "" )) for: !false
# CaseInsensitiveLess is case insensitive
ok {test-number} - lt( "a", "b" ) for: true
# CaseInsensitiveLess is case insensitive
ok {test-number} - lt( "a", "B" ) for: true
# CaseInsensitiveLess is case insensitive
ok {test-number} - lt( "A", "b" ) for: true
# CaseInsensitiveLess is case insensitive
ok {test-number} - lt( "A", "B" ) for: true
# Character pretty printing
ok {test-number} - tab == '\t' for: '\t' == '\t'
# Character pretty printing
@ -4344,5 +4374,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
1..2171
1..2186

View File

@ -233,6 +233,10 @@ Exception.tests.cpp:<line number>|nunexpected exception with message:|n "unexpe
##teamcity[testFinished name='CAPTURE parses string and character constants' duration="{duration}"]
##teamcity[testStarted name='Capture and info messages']
##teamcity[testFinished name='Capture and info messages' duration="{duration}"]
##teamcity[testStarted name='CaseInsensitiveEqualsTo is case insensitive']
##teamcity[testFinished name='CaseInsensitiveEqualsTo is case insensitive' duration="{duration}"]
##teamcity[testStarted name='CaseInsensitiveLess is case insensitive']
##teamcity[testFinished name='CaseInsensitiveLess is case insensitive' duration="{duration}"]
##teamcity[testStarted name='Character pretty printing']
##teamcity[testFinished name='Character pretty printing' duration="{duration}"]
##teamcity[testStarted name='Clara::Arg supports single-arg parse the way Opt does']

View File

@ -3013,6 +3013,144 @@ Nor would this
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="CaseInsensitiveEqualsTo is case insensitive" tags="[comparisons][string-case]" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Section name="Degenerate cases" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
eq( "", "" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
!(eq( "", "a" ))
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<OverallResults successes="2" failures="0" expectedFailures="0"/>
</Section>
<Section name="Plain comparisons" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
eq( "a", "a" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
eq( "a", "A" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
eq( "A", "a" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
eq( "A", "A" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
!(eq( "a", "b" ))
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
!(eq( "a", "B" ))
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<OverallResults successes="6" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="CaseInsensitiveLess is case insensitive" tags="[comparisons][string-case]" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Section name="Degenerate cases" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
lt( "", "a" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
!(lt( "a", "a" ))
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
!(lt( "", "" ))
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<OverallResults successes="3" failures="0" expectedFailures="0"/>
</Section>
<Section name="Plain comparisons" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
lt( "a", "b" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
lt( "a", "B" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
lt( "A", "b" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Details.tests.cpp" >
<Original>
lt( "A", "B" )
</Original>
<Expanded>
true
</Expanded>
</Expression>
<OverallResults successes="4" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="Character pretty printing" filename="tests/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
<Section name="Specifically escaped" filename="tests/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
@ -20290,6 +20428,6 @@ loose text artifact
</Section>
<OverallResult success="true"/>
</TestCase>
<OverallResults successes="1998" failures="146" expectedFailures="27"/>
<OverallResultsCases successes="284" failures="86" expectedFailures="7"/>
<OverallResults successes="2013" failures="146" expectedFailures="27"/>
<OverallResultsCases successes="286" failures="86" expectedFailures="7"/>
</Catch2TestRun>

View File

@ -5,6 +5,7 @@
#include <catch2/catch_test_macros.hpp>
#include <catch2/internal/catch_enforce.hpp>
#include <catch2/internal/catch_case_insensitive_comparisons.hpp>
#if defined(_MSC_VER)
#pragma warning(push)
@ -22,3 +23,35 @@ TEST_CASE("Check that our error handling macros throw the right exceptions", "[!
#if defined(_MSC_VER)
#pragma warning(pop) // unreachable code in the macro expansions
#endif
TEST_CASE("CaseInsensitiveLess is case insensitive", "[comparisons][string-case]") {
Catch::Detail::CaseInsensitiveLess lt;
SECTION( "Degenerate cases" ) {
REQUIRE( lt( "", "a" ) );
REQUIRE_FALSE( lt( "a", "a" ) );
REQUIRE_FALSE( lt( "", "" ) );
}
SECTION("Plain comparisons") {
REQUIRE( lt( "a", "b" ) );
REQUIRE( lt( "a", "B" ) );
REQUIRE( lt( "A", "b" ) );
REQUIRE( lt( "A", "B" ) );
}
}
TEST_CASE( "CaseInsensitiveEqualsTo is case insensitive",
"[comparisons][string-case]" ) {
Catch::Detail::CaseInsensitiveEqualTo eq;
SECTION( "Degenerate cases" ) {
REQUIRE( eq( "", "" ) );
REQUIRE_FALSE( eq( "", "a" ) );
}
SECTION( "Plain comparisons" ) {
REQUIRE( eq( "a", "a" ) );
REQUIRE( eq( "a", "A" ) );
REQUIRE( eq( "A", "a" ) );
REQUIRE( eq( "A", "A" ) );
REQUIRE_FALSE( eq( "a", "b" ) );
REQUIRE_FALSE( eq( "a", "B" ) );
}
}