mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-29 16:53:30 +01:00
Support for parenthesizing types with commas.
This commit is contained in:
parent
aa7b0c9104
commit
200d3ad824
@ -6,6 +6,7 @@
|
|||||||
[Exceptions](#exceptions)<br>
|
[Exceptions](#exceptions)<br>
|
||||||
[Matcher expressions](#matcher-expressions)<br>
|
[Matcher expressions](#matcher-expressions)<br>
|
||||||
[Thread Safety](#thread-safety)<br>
|
[Thread Safety](#thread-safety)<br>
|
||||||
|
[Expressions with commas](#expressions-with-commas)<br>
|
||||||
|
|
||||||
Most test frameworks have a large collection of assertion macros to capture all possible conditional forms (```_EQUALS```, ```_NOTEQUALS```, ```_GREATER_THAN``` etc).
|
Most test frameworks have a large collection of assertion macros to capture all possible conditional forms (```_EQUALS```, ```_NOTEQUALS```, ```_GREATER_THAN``` etc).
|
||||||
|
|
||||||
@ -155,6 +156,34 @@ Matchers can be composed using `&&`, `||` and `!` operators.
|
|||||||
Currently assertions in Catch are not thread safe.
|
Currently assertions in Catch are not thread safe.
|
||||||
For more details, along with workarounds, see the section on [the limitations page](limitations.md#thread-safe-assertions).
|
For more details, along with workarounds, see the section on [the limitations page](limitations.md#thread-safe-assertions).
|
||||||
|
|
||||||
|
## Expressions with commas
|
||||||
|
|
||||||
|
Because the preprocessor parses code using different rules than the
|
||||||
|
compiler, multiple-argument assertions (e.g. `REQUIRE_THROWS_AS`) have
|
||||||
|
problems with commas inside the provided expressions. As an example
|
||||||
|
`REQUIRE_THROWS_AS(std::pair<int, int>(1, 2), std::invalid_argument);`
|
||||||
|
will fails to compile, because the preprocessor sees 3 arguments provided,
|
||||||
|
but the macro accepts only 2. There are two possible workarounds.
|
||||||
|
|
||||||
|
1) Use typedef:
|
||||||
|
```cpp
|
||||||
|
using int_pair = std::pair<int, int>;
|
||||||
|
REQUIRE_THROWS_AS(int_pair(1, 2), std::invalid_argument);
|
||||||
|
```
|
||||||
|
|
||||||
|
This solution is always applicable, but makes the meaning of the code
|
||||||
|
less clear.
|
||||||
|
|
||||||
|
2) Parenthesize the expression:
|
||||||
|
```cpp
|
||||||
|
TEST_CASE_METHOD((Fixture<int, int>), "foo", "[bar]") {
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This solution is not always applicable, because it might require extra
|
||||||
|
changes on the Catch's side to work.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[Home](Readme.md#top)
|
[Home](Readme.md#top)
|
||||||
|
@ -47,12 +47,17 @@ struct AutoReg : NonCopyable {
|
|||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)
|
||||||
|
#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__
|
||||||
|
#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__
|
||||||
|
#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
|
||||||
|
|
||||||
#if defined(CATCH_CONFIG_DISABLE)
|
#if defined(CATCH_CONFIG_DISABLE)
|
||||||
#define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \
|
#define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \
|
||||||
static void TestName()
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \
|
#define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \
|
||||||
namespace{ \
|
namespace{ \
|
||||||
struct TestName : ClassName { \
|
struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
} \
|
} \
|
||||||
@ -80,7 +85,7 @@ struct AutoReg : NonCopyable {
|
|||||||
#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
|
#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
|
||||||
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||||
namespace{ \
|
namespace{ \
|
||||||
struct TestName : ClassName{ \
|
struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
|
||||||
|
@ -12,6 +12,7 @@ Compilation.tests.cpp:<line number>: passed: t1 >= t2 for: {?} >= {?}
|
|||||||
Misc.tests.cpp:<line number>: passed:
|
Misc.tests.cpp:<line number>: passed:
|
||||||
Compilation.tests.cpp:<line number>: passed: std::memcmp(uarr, "123", sizeof(uarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
Compilation.tests.cpp:<line number>: passed: std::memcmp(uarr, "123", sizeof(uarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
||||||
Compilation.tests.cpp:<line number>: passed: std::memcmp(sarr, "456", sizeof(sarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
Compilation.tests.cpp:<line number>: passed: std::memcmp(sarr, "456", sizeof(sarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
||||||
|
Compilation.tests.cpp:<line number>: passed:
|
||||||
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception'
|
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception'
|
||||||
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception'
|
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception'
|
||||||
Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42'
|
Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42'
|
||||||
|
@ -1084,6 +1084,6 @@ due to unexpected exception with message:
|
|||||||
Why would you throw a std::string?
|
Why would you throw a std::string?
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 205 | 152 passed | 49 failed | 4 failed as expected
|
test cases: 206 | 153 passed | 49 failed | 4 failed as expected
|
||||||
assertions: 1060 | 932 passed | 107 failed | 21 failed as expected
|
assertions: 1061 | 933 passed | 107 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -126,6 +126,15 @@ with messages:
|
|||||||
uarr := "123"
|
uarr := "123"
|
||||||
sarr := "456"
|
sarr := "456"
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1245
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -8941,6 +8950,6 @@ Misc.tests.cpp:<line number>:
|
|||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 205 | 139 passed | 62 failed | 4 failed as expected
|
test cases: 206 | 140 passed | 62 failed | 4 failed as expected
|
||||||
assertions: 1074 | 932 passed | 121 failed | 21 failed as expected
|
assertions: 1075 | 933 passed | 121 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -126,6 +126,15 @@ with messages:
|
|||||||
uarr := "123"
|
uarr := "123"
|
||||||
sarr := "456"
|
sarr := "456"
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1245
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -332,6 +341,6 @@ with expansion:
|
|||||||
!true
|
!true
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 13 | 10 passed | 1 failed | 2 failed as expected
|
test cases: 14 | 11 passed | 1 failed | 2 failed as expected
|
||||||
assertions: 37 | 30 passed | 4 failed | 3 failed as expected
|
assertions: 38 | 31 passed | 4 failed | 3 failed as expected
|
||||||
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
<?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="105" tests="1075" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="17" failures="105" tests="1076" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||||
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1147" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1147" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1175 - Hidden Test" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1175 - Hidden Test" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1238" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1238" time="{duration}"/>
|
||||||
|
<testcase classname="<exe-name>.(Fixture_1245<int, int>)" name="#1245" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
|
<testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
|
||||||
<error type="TEST_CASE">
|
<error type="TEST_CASE">
|
||||||
expected exception
|
expected exception
|
||||||
|
@ -127,6 +127,9 @@
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="#1245" tags="[compilation]" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<OverallResult success="true"/>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
<TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
||||||
<Section name="outside assertions" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
<Section name="outside assertions" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
||||||
<Info>
|
<Info>
|
||||||
@ -9889,7 +9892,7 @@ loose text artifact
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="932" failures="122" expectedFailures="21"/>
|
<OverallResults successes="933" failures="122" expectedFailures="21"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="932" failures="121" expectedFailures="21"/>
|
<OverallResults successes="933" failures="121" expectedFailures="21"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@ -88,6 +88,9 @@ namespace { namespace CompilationTests {
|
|||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template <typename, typename>
|
||||||
|
struct Fixture_1245 {};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEST_CASE("#809") {
|
TEST_CASE("#809") {
|
||||||
@ -147,4 +150,8 @@ namespace { namespace CompilationTests {
|
|||||||
REQUIRE(std::memcmp(sarr, "456", sizeof(sarr)) == 0);
|
REQUIRE(std::memcmp(sarr, "456", sizeof(sarr)) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE_METHOD((Fixture_1245<int, int>), "#1245", "[compilation]") {
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace CompilationTests
|
}} // namespace CompilationTests
|
||||||
|
Loading…
Reference in New Issue
Block a user