Added TestCaseInfoHasher and tests. (#2394)

Test case hashing includes tags and class name

As the hasher involves more code now, it was split out into its own file
and it got its own set of tests.

Closes #2304
This commit is contained in:
Daniel Feist 2022-03-31 16:46:41 +02:00 committed by GitHub
parent 1a8a793178
commit 78e33ce51f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 493 additions and 42 deletions

View File

@ -157,6 +157,7 @@ set(INTERNAL_HEADERS
${SOURCES_DIR}/internal/catch_wildcard_pattern.hpp
${SOURCES_DIR}/internal/catch_windows_h_proxy.hpp
${SOURCES_DIR}/internal/catch_xmlwriter.hpp
${SOURCES_DIR}/internal/catch_test_case_info_hasher.hpp
)
set(IMPL_SOURCES
${SOURCES_DIR}/catch_approx.cpp
@ -213,6 +214,7 @@ set(IMPL_SOURCES
${SOURCES_DIR}/catch_version.cpp
${SOURCES_DIR}/internal/catch_wildcard_pattern.cpp
${SOURCES_DIR}/internal/catch_xmlwriter.cpp
${SOURCES_DIR}/internal/catch_test_case_info_hasher.cpp
)
set(INTERNAL_FILES ${IMPL_SOURCES} ${INTERNAL_HEADERS})

View File

@ -95,6 +95,7 @@
#include <catch2/internal/catch_stringref.hpp>
#include <catch2/internal/catch_tag_alias_registry.hpp>
#include <catch2/internal/catch_template_test_registry.hpp>
#include <catch2/internal/catch_test_case_info_hasher.hpp>
#include <catch2/internal/catch_test_case_registry_impl.hpp>
#include <catch2/internal/catch_test_case_tracker.hpp>
#include <catch2/internal/catch_test_failure_exception.hpp>

View File

@ -0,0 +1,31 @@
#include <catch2/catch_test_case_info.hpp>
#include <catch2/internal/catch_test_case_info_hasher.hpp>
namespace Catch {
TestCaseInfoHasher::TestCaseInfoHasher( hash_t seed ): m_seed( seed ) {}
uint32_t TestCaseInfoHasher::operator()( TestCaseInfo const& t ) const {
// FNV-1a hash algorithm that is designed for uniqueness:
const hash_t prime = 1099511628211u;
hash_t hash = 14695981039346656037u;
for ( const char c : t.name ) {
hash ^= c;
hash *= prime;
}
for ( const char c : t.className ) {
hash ^= c;
hash *= prime;
}
for ( const Tag& tag : t.tags ) {
for ( const char c : tag.original ) {
hash ^= c;
hash *= prime;
}
}
hash ^= m_seed;
hash *= prime;
const uint32_t low{ static_cast<uint32_t>( hash ) };
const uint32_t high{ static_cast<uint32_t>( hash >> 32 ) };
return low * high;
}
} // namespace Catch

View File

@ -0,0 +1,22 @@
#ifndef CATCH_TEST_CASE_INFO_HASHER_HPP_INCLUDED
#define CATCH_TEST_CASE_INFO_HASHER_HPP_INCLUDED
#include <cstdint>
namespace Catch {
struct TestCaseInfo;
class TestCaseInfoHasher {
public:
using hash_t = std::uint64_t;
TestCaseInfoHasher( hash_t seed );
uint32_t operator()( TestCaseInfo const& t ) const;
private:
hash_t m_seed;
};
} // namespace Catch
#endif /* CATCH_TEST_CASE_INFO_HASHER_HPP_INCLUDED */

View File

@ -16,38 +16,13 @@
#include <catch2/catch_test_case_info.hpp>
#include <catch2/catch_test_spec.hpp>
#include <catch2/internal/catch_move_and_forward.hpp>
#include <catch2/internal/catch_test_case_info_hasher.hpp>
#include <algorithm>
#include <set>
namespace Catch {
namespace {
struct TestHasher {
using hash_t = uint64_t;
explicit TestHasher( hash_t hashSuffix ):
m_hashSuffix( hashSuffix ) {}
uint64_t m_hashSuffix;
uint32_t operator()( TestCaseInfo const& t ) const {
// FNV-1a hash with multiplication fold.
const hash_t prime = 1099511628211u;
hash_t hash = 14695981039346656037u;
for (const char c : t.name) {
hash ^= c;
hash *= prime;
}
hash ^= m_hashSuffix;
hash *= prime;
const uint32_t low{ static_cast<uint32_t>(hash) };
const uint32_t high{ static_cast<uint32_t>(hash >> 32) };
return low * high;
}
};
} // end anonymous namespace
std::vector<TestCaseHandle> sortTests( IConfig const& config, std::vector<TestCaseHandle> const& unsortedTestCases ) {
switch (config.runOrder()) {
case TestRunOrder::Declared:
@ -66,9 +41,9 @@ namespace {
}
case TestRunOrder::Randomized: {
seedRng(config);
using TestWithHash = std::pair<TestHasher::hash_t, TestCaseHandle>;
using TestWithHash = std::pair<TestCaseInfoHasher::hash_t, TestCaseHandle>;
TestHasher h{ config.rngSeed() };
TestCaseInfoHasher h{ config.rngSeed() };
std::vector<TestWithHash> indexed_tests;
indexed_tests.reserve(unsortedTestCases.size());

View File

@ -88,6 +88,7 @@ set(TEST_SOURCES
${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Reporters.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Tag.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/TestCaseInfoHasher.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/TestSpecParser.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/TextFlow.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Sharding.tests.cpp

View File

@ -255,6 +255,8 @@ Message from section two
:test-result: PASS Test case with one argument
:test-result: PASS Test enum bit values
:test-result: PASS Test with special, characters "in name
:test-result: PASS TestCaseInfoHasher produces different hashes.
:test-result: PASS TestCaseInfoHasher produces equal hashes.
:test-result: PASS Testing checked-if
:test-result: XFAIL Testing checked-if 2
:test-result: XFAIL Testing checked-if 3

View File

@ -248,6 +248,8 @@
:test-result: PASS Test case with one argument
:test-result: PASS Test enum bit values
:test-result: PASS Test with special, characters "in name
:test-result: PASS TestCaseInfoHasher produces different hashes.
:test-result: PASS TestCaseInfoHasher produces equal hashes.
:test-result: PASS Testing checked-if
:test-result: XFAIL Testing checked-if 2
:test-result: XFAIL Testing checked-if 3

View File

@ -1868,6 +1868,21 @@ Tag.tests.cpp:<line number>: passed: testCase.tags[0] == Tag( "tag1" ) for: {?}
VariadicMacros.tests.cpp:<line number>: passed: with 1 message: 'no assertions'
Tricky.tests.cpp:<line number>: passed: 0x<hex digits> == bit30and31 for: 3221225472 (0x<hex digits>) == 3221225472
CmdLine.tests.cpp:<line number>: passed:
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: h1(testCase1) != h2(testCase2) for: 1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
Misc.tests.cpp:<line number>: passed: true
Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: failed - but was ok: false

View File

@ -1861,6 +1861,21 @@ Tag.tests.cpp:<line number>: passed: testCase.tags[0] == Tag( "tag1" ) for: {?}
VariadicMacros.tests.cpp:<line number>: passed: with 1 message: 'no assertions'
Tricky.tests.cpp:<line number>: passed: 0x<hex digits> == bit30and31 for: 3221225472 (0x<hex digits>) == 3221225472
CmdLine.tests.cpp:<line number>: passed:
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: h1(testCase1) != h2(testCase2) for: 1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
TestCaseInfoHasher.tests.cpp:<line number>: passed: hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
Misc.tests.cpp:<line number>: passed: true
Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: failed - but was ok: false

View File

@ -1395,6 +1395,6 @@ due to unexpected exception with message:
Why would you throw a std::string?
===============================================================================
test cases: 386 | 310 passed | 69 failed | 7 failed as expected
assertions: 2219 | 2064 passed | 128 failed | 27 failed as expected
test cases: 388 | 312 passed | 69 failed | 7 failed as expected
assertions: 2224 | 2069 passed | 128 failed | 27 failed as expected

View File

@ -13286,6 +13286,76 @@ CmdLine.tests.cpp:<line number>
CmdLine.tests.cpp:<line number>: PASSED:
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names are equal, names are equal but tags are different.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names are equal, tags are equal but names are different
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
names are equal, tags are equal but class names are different
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names and names and tags are equal but hashers are seeded differently.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( h1(testCase1) != h2(testCase2) )
with expansion:
1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces equal hashes.
class names and names and tags are equal.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) )
with expansion:
764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
-------------------------------------------------------------------------------
Testing checked-if
-------------------------------------------------------------------------------
@ -17871,6 +17941,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
test cases: 386 | 296 passed | 83 failed | 7 failed as expected
assertions: 2234 | 2064 passed | 143 failed | 27 failed as expected
test cases: 388 | 298 passed | 83 failed | 7 failed as expected
assertions: 2239 | 2069 passed | 143 failed | 27 failed as expected

View File

@ -13279,6 +13279,76 @@ CmdLine.tests.cpp:<line number>
CmdLine.tests.cpp:<line number>: PASSED:
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names are equal, names are equal but tags are different.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names are equal, tags are equal but names are different
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
names are equal, tags are equal but class names are different
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) )
with expansion:
1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces different hashes.
class names and names and tags are equal but hashers are seeded differently.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( h1(testCase1) != h2(testCase2) )
with expansion:
1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
-------------------------------------------------------------------------------
TestCaseInfoHasher produces equal hashes.
class names and names and tags are equal.
-------------------------------------------------------------------------------
TestCaseInfoHasher.tests.cpp:<line number>
...............................................................................
TestCaseInfoHasher.tests.cpp:<line number>: PASSED:
CHECK( hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) )
with expansion:
764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
-------------------------------------------------------------------------------
Testing checked-if
-------------------------------------------------------------------------------
@ -17863,6 +17933,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
test cases: 386 | 296 passed | 83 failed | 7 failed as expected
assertions: 2234 | 2064 passed | 143 failed | 27 failed as expected
test cases: 388 | 298 passed | 83 failed | 7 failed as expected
assertions: 2239 | 2069 passed | 143 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="126" tests="2234" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<testsuite name="<exe-name>" errors="17" failures="126" tests="2239" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
@ -1355,6 +1355,11 @@ Misc.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Test case with one argument" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Test enum bit values" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Test with special, characters &quot;in name" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names are equal, names are equal but tags are different." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names are equal, tags are equal but names are different" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./names are equal, tags are equal but class names are different" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names and names and tags are equal but hashers are seeded differently." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces equal hashes./class names and names and tags are equal." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Testing checked-if" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Testing checked-if 2" time="{duration}" status="run">
<skipped message="TEST_CASE tagged with !mayfail"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="<exe-name>" errors="17" failures="126" tests="2234" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<testsuite name="<exe-name>" errors="17" failures="126" tests="2239" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
@ -1354,6 +1354,11 @@ Misc.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Test case with one argument" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Test enum bit values" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Test with special, characters &quot;in name" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names are equal, names are equal but tags are different." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names are equal, tags are equal but names are different" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./names are equal, tags are equal but class names are different" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces different hashes./class names and names and tags are equal but hashers are seeded differently." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TestCaseInfoHasher produces equal hashes./class names and names and tags are equal." time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Testing checked-if" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Testing checked-if 2" time="{duration}" status="run">
<skipped message="TEST_CASE tagged with !mayfail"/>

View File

@ -273,6 +273,13 @@
<testCase name="shortened hide tags are split apart" duration="{duration}"/>
<testCase name="tags with dots in later positions are not parsed as hidden" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp">
<testCase name="TestCaseInfoHasher produces different hashes./class names are equal, names are equal but tags are different." duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./class names are equal, tags are equal but names are different" duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./names are equal, tags are equal but class names are different" duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./class names and names and tags are equal but hashers are seeded differently." duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces equal hashes./class names and names and tags are equal." duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/TestSpecParser.tests.cpp">
<testCase name="Parsed tags are matched case insensitive" duration="{duration}"/>
<testCase name="Parsing tags with non-alphabetical characters is pass-through" duration="{duration}"/>

View File

@ -272,6 +272,13 @@
<testCase name="shortened hide tags are split apart" duration="{duration}"/>
<testCase name="tags with dots in later positions are not parsed as hidden" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp">
<testCase name="TestCaseInfoHasher produces different hashes./class names are equal, names are equal but tags are different." duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./class names are equal, tags are equal but names are different" duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./names are equal, tags are equal but class names are different" duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces different hashes./class names and names and tags are equal but hashers are seeded differently." duration="{duration}"/>
<testCase name="TestCaseInfoHasher produces equal hashes./class names and names and tags are equal." duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/TestSpecParser.tests.cpp">
<testCase name="Parsed tags are matched case insensitive" duration="{duration}"/>
<testCase name="Parsing tags with non-alphabetical characters is pass-through" duration="{duration}"/>

View File

@ -3297,6 +3297,16 @@ ok {test-number} - with 1 message: 'no assertions'
ok {test-number} - 0x<hex digits> == bit30and31 for: 3221225472 (0x<hex digits>) == 3221225472
# Test with special, characters "in name
ok {test-number} -
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>) != 3472848544 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 869111496 (0x<hex digits>) != 2870097333 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 1172537240 (0x<hex digits>) != 1403724645 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - h1(testCase1) != h2(testCase2) for: 1836497244 (0x<hex digits>) != 430288597 (0x<hex digits>)
# TestCaseInfoHasher produces equal hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>) == 764519552 (0x<hex digits>)
# Testing checked-if
ok {test-number} - true
# Testing checked-if
@ -4470,5 +4480,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
1..2234
1..2239

View File

@ -3290,6 +3290,16 @@ ok {test-number} - with 1 message: 'no assertions'
ok {test-number} - 0x<hex digits> == bit30and31 for: 3221225472 (0x<hex digits>) == 3221225472
# Test with special, characters "in name
ok {test-number} -
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>) != 3472848544 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 869111496 (0x<hex digits>) != 2870097333 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2) for: 1172537240 (0x<hex digits>) != 1403724645 (0x<hex digits>)
# TestCaseInfoHasher produces different hashes.
ok {test-number} - h1(testCase1) != h2(testCase2) for: 1836497244 (0x<hex digits>) != 430288597 (0x<hex digits>)
# TestCaseInfoHasher produces equal hashes.
ok {test-number} - hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2) for: 764519552 (0x<hex digits>) == 764519552 (0x<hex digits>)
# Testing checked-if
ok {test-number} - true
# Testing checked-if
@ -4462,5 +4472,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
1..2234
1..2239

View File

@ -615,6 +615,10 @@ Misc.tests.cpp:<line number>|nexpression failed|n CHECK( s1 == s2 )|nwith expan
##teamcity[testFinished name='Test enum bit values' duration="{duration}"]
##teamcity[testStarted name='Test with special, characters "in name']
##teamcity[testFinished name='Test with special, characters "in name' duration="{duration}"]
##teamcity[testStarted name='TestCaseInfoHasher produces different hashes.']
##teamcity[testFinished name='TestCaseInfoHasher produces different hashes.' duration="{duration}"]
##teamcity[testStarted name='TestCaseInfoHasher produces equal hashes.']
##teamcity[testFinished name='TestCaseInfoHasher produces equal hashes.' duration="{duration}"]
##teamcity[testStarted name='Testing checked-if']
##teamcity[testFinished name='Testing checked-if' duration="{duration}"]
##teamcity[testStarted name='Testing checked-if 2']

View File

@ -615,6 +615,10 @@ Misc.tests.cpp:<line number>|nexpression failed|n CHECK( s1 == s2 )|nwith expan
##teamcity[testFinished name='Test enum bit values' duration="{duration}"]
##teamcity[testStarted name='Test with special, characters "in name']
##teamcity[testFinished name='Test with special, characters "in name' duration="{duration}"]
##teamcity[testStarted name='TestCaseInfoHasher produces different hashes.']
##teamcity[testFinished name='TestCaseInfoHasher produces different hashes.' duration="{duration}"]
##teamcity[testStarted name='TestCaseInfoHasher produces equal hashes.']
##teamcity[testFinished name='TestCaseInfoHasher produces equal hashes.' duration="{duration}"]
##teamcity[testStarted name='Testing checked-if']
##teamcity[testFinished name='Testing checked-if' duration="{duration}"]
##teamcity[testStarted name='Testing checked-if 2']

View File

@ -15579,6 +15579,77 @@ Message from section two
<TestCase name="Test with special, characters &quot;in name" tags="[cli][regression]" filename="tests/<exe-name>/IntrospectiveTests/CmdLine.tests.cpp" >
<OverallResult success="true"/>
</TestCase>
<TestCase name="TestCaseInfoHasher produces different hashes." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Section name="class names are equal, names are equal but tags are different." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="class names are equal, tags are equal but names are different" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="names are equal, tags are equal but class names are different" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="class names and names and tags are equal but hashers are seeded differently." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
h1(testCase1) != h2(testCase2)
</Original>
<Expanded>
1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="TestCaseInfoHasher produces equal hashes." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Section name="class names and names and tags are equal." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="Testing checked-if" tags="[checked-if]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Expression success="true" type="CHECKED_IF" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Original>
@ -20991,6 +21062,6 @@ loose text artifact
</Section>
<OverallResult success="true"/>
</TestCase>
<OverallResults successes="2064" failures="143" expectedFailures="27"/>
<OverallResultsCases successes="296" failures="83" expectedFailures="7"/>
<OverallResults successes="2069" failures="143" expectedFailures="27"/>
<OverallResultsCases successes="298" failures="83" expectedFailures="7"/>
</Catch2TestRun>

View File

@ -15579,6 +15579,77 @@ Message from section two
<TestCase name="Test with special, characters &quot;in name" tags="[cli][regression]" filename="tests/<exe-name>/IntrospectiveTests/CmdLine.tests.cpp" >
<OverallResult success="true"/>
</TestCase>
<TestCase name="TestCaseInfoHasher produces different hashes." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Section name="class names are equal, names are equal but tags are different." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
764519552 (0x<hex digits>)
!=
3472848544 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="class names are equal, tags are equal but names are different" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
869111496 (0x<hex digits>)
!=
2870097333 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="names are equal, tags are equal but class names are different" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
1172537240 (0x<hex digits>)
!=
1403724645 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<Section name="class names and names and tags are equal but hashers are seeded differently." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
h1(testCase1) != h2(testCase2)
</Original>
<Expanded>
1836497244 (0x<hex digits>)
!=
430288597 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="TestCaseInfoHasher produces equal hashes." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Section name="class names and names and tags are equal." filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/TestCaseInfoHasher.tests.cpp" >
<Original>
hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2)
</Original>
<Expanded>
764519552 (0x<hex digits>)
==
764519552 (0x<hex digits>)
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0"/>
</Section>
<OverallResult success="true"/>
</TestCase>
<TestCase name="Testing checked-if" tags="[checked-if]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Expression success="true" type="CHECKED_IF" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Original>
@ -20990,6 +21061,6 @@ There is no extra whitespace here
</Section>
<OverallResult success="true"/>
</TestCase>
<OverallResults successes="2064" failures="143" expectedFailures="27"/>
<OverallResultsCases successes="296" failures="83" expectedFailures="7"/>
<OverallResults successes="2069" failures="143" expectedFailures="27"/>
<OverallResultsCases successes="298" failures="83" expectedFailures="7"/>
</Catch2TestRun>

View File

@ -0,0 +1,51 @@
#include <catch2/catch_test_macros.hpp>
#include <catch2/catch_test_case_info.hpp>
#include <catch2/internal/catch_test_case_info_hasher.hpp>
static constexpr Catch::SourceLineInfo dummySourceLineInfo = CATCH_INTERNAL_LINEINFO;
TEST_CASE( "TestCaseInfoHasher produces equal hashes." ) {
SECTION( "class names and names and tags are equal." ) {
Catch::TestCaseInfo testCase1("", {"name", "[.magic-tag1]"}, dummySourceLineInfo);
Catch::TestCaseInfo testCase2("", {"name", "[.magic-tag1]"}, dummySourceLineInfo);
Catch::TestCaseInfoHasher hasherWithCustomSeed(123456789u);
CHECK(hasherWithCustomSeed(testCase1) == hasherWithCustomSeed(testCase2));
}
}
TEST_CASE( "TestCaseInfoHasher produces different hashes." ) {
SECTION( "class names are equal, names are equal but tags are different." ) {
Catch::TestCaseInfo testCase1("", {"name", "[.magic-tag1]"}, dummySourceLineInfo);
Catch::TestCaseInfo testCase2("", {"name", "[.magic-tag2]"}, dummySourceLineInfo);
Catch::TestCaseInfoHasher hasherWithCustomSeed(123456789u);
CHECK(hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2));
}
SECTION( "class names are equal, tags are equal but names are different" ) {
Catch::TestCaseInfo testCase1("", {"name1", "[.magic-tag]"}, dummySourceLineInfo);
Catch::TestCaseInfo testCase2("", {"name2", "[.magic-tag]"}, dummySourceLineInfo);
Catch::TestCaseInfoHasher hasherWithCustomSeed(123456789u);
CHECK(hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2));
}
SECTION( "names are equal, tags are equal but class names are different" ) {
Catch::TestCaseInfo testCase1("class1", {"name", "[.magic-tag]"}, dummySourceLineInfo);
Catch::TestCaseInfo testCase2("class2", {"name", "[.magic-tag]"}, dummySourceLineInfo);
Catch::TestCaseInfoHasher hasherWithCustomSeed(123456789u);
CHECK(hasherWithCustomSeed(testCase1) != hasherWithCustomSeed(testCase2));
}
SECTION( "class names and names and tags are equal but hashers are seeded differently." ) {
Catch::TestCaseInfo testCase1("", {"name", "[.magic-tag1]"}, dummySourceLineInfo);
Catch::TestCaseInfo testCase2("", {"name", "[.magic-tag1]"}, dummySourceLineInfo);
Catch::TestCaseInfoHasher h1(14695981039346656037u);
Catch::TestCaseInfoHasher h2(14695981039346656038u);
CHECK(h1(testCase1) != h2(testCase2));
}
}