mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-22 13:26:10 +01:00
Namespace our type traits in catch_meta
Previously they could conflict with user-defined type traits that were in the global namespace. Fixes #1548
This commit is contained in:
parent
ef5fd8d42f
commit
29b3b7ae6b
@ -11,65 +11,59 @@
|
|||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
template< typename... >
|
template< typename... >
|
||||||
struct TypeList{};
|
struct TypeList {};
|
||||||
|
|
||||||
template< typename... >
|
template< typename... >
|
||||||
struct append;
|
struct append;
|
||||||
|
|
||||||
template< template<typename...> class L1
|
template< template<typename...> class L1
|
||||||
, typename...E1
|
, typename...E1
|
||||||
, template<typename...> class L2
|
, template<typename...> class L2
|
||||||
, typename...E2
|
, typename...E2
|
||||||
>
|
>
|
||||||
struct append< L1<E1...>, L2<E2...> >
|
struct append< L1<E1...>, L2<E2...> > {
|
||||||
{
|
using type = L1<E1..., E2...>;
|
||||||
using type = L1<E1..., E2...>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template< template<typename...> class L1
|
template< template<typename...> class L1
|
||||||
, typename...E1
|
, typename...E1
|
||||||
, template<typename...> class L2
|
, template<typename...> class L2
|
||||||
, typename...E2
|
, typename...E2
|
||||||
, typename...Rest
|
, typename...Rest
|
||||||
>
|
>
|
||||||
struct append< L1<E1...>, L2<E2...>, Rest...>
|
struct append< L1<E1...>, L2<E2...>, Rest...> {
|
||||||
{
|
using type = typename append< L1<E1..., E2...>, Rest... >::type;
|
||||||
using type = typename append< L1<E1..., E2...>, Rest... >::type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template< template<typename...> class
|
template< template<typename...> class
|
||||||
, typename...
|
, typename...
|
||||||
>
|
>
|
||||||
struct rewrap;
|
struct rewrap;
|
||||||
|
|
||||||
template< template<typename...> class Container
|
template< template<typename...> class Container
|
||||||
, template<typename...> class List
|
, template<typename...> class List
|
||||||
, typename...elems
|
, typename...elems
|
||||||
>
|
>
|
||||||
struct rewrap<Container, List<elems...>>
|
struct rewrap<Container, List<elems...>> {
|
||||||
{
|
|
||||||
using type = TypeList< Container< elems... > >;
|
using type = TypeList< Container< elems... > >;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< template<typename...> class Container
|
template< template<typename...> class Container
|
||||||
, template<typename...> class List
|
, template<typename...> class List
|
||||||
, class...Elems
|
, class...Elems
|
||||||
, typename...Elements>
|
, typename...Elements>
|
||||||
struct rewrap<Container, List<Elems...>, Elements...>
|
struct rewrap<Container, List<Elems...>, Elements...> {
|
||||||
{
|
|
||||||
using type = typename append<TypeList<Container<Elems...>>, typename rewrap<Container, Elements...>::type>::type;
|
using type = typename append<TypeList<Container<Elems...>>, typename rewrap<Container, Elements...>::type>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< template<typename...> class...Containers >
|
template< template<typename...> class...Containers >
|
||||||
struct combine
|
struct combine {
|
||||||
{
|
|
||||||
template< typename...Types >
|
template< typename...Types >
|
||||||
struct with_types
|
struct with_types {
|
||||||
{
|
|
||||||
template< template <typename...> class Final >
|
template< template <typename...> class Final >
|
||||||
struct into
|
struct into {
|
||||||
{
|
|
||||||
using type = typename append<Final<>, typename rewrap<Containers, Types...>::type...>::type;
|
using type = typename append<Final<>, typename rewrap<Containers, Types...>::type...>::type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -78,4 +72,6 @@ struct combine
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
struct always_false : std::false_type {};
|
struct always_false : std::false_type {};
|
||||||
|
|
||||||
|
} // namespace Catch
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED
|
||||||
|
@ -81,7 +81,7 @@
|
|||||||
#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
|
#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define INTERNAL_CATCH_MAKE_TYPE_LIST(types) TypeList<INTERNAL_CATCH_REMOVE_PARENS(types)>
|
#define INTERNAL_CATCH_MAKE_TYPE_LIST(types) Catch::TypeList<INTERNAL_CATCH_REMOVE_PARENS(types)>
|
||||||
|
|
||||||
#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(types)\
|
#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(types)\
|
||||||
CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,INTERNAL_CATCH_REMOVE_PARENS(types))
|
CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,INTERNAL_CATCH_REMOVE_PARENS(types))
|
||||||
|
@ -168,7 +168,7 @@ struct AutoReg : NonCopyable {
|
|||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
|
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
|
||||||
using TestInit = combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)> \
|
using TestInit = Catch::combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)> \
|
||||||
::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestName>::type; \
|
::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestName>::type; \
|
||||||
TestInit(); \
|
TestInit(); \
|
||||||
return 0; \
|
return 0; \
|
||||||
@ -236,7 +236,7 @@ struct AutoReg : NonCopyable {
|
|||||||
}\
|
}\
|
||||||
};\
|
};\
|
||||||
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
|
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
|
||||||
using TestInit = combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>\
|
using TestInit = Catch::combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>\
|
||||||
::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestNameClass>::type;\
|
::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestNameClass>::type;\
|
||||||
TestInit();\
|
TestInit();\
|
||||||
return 0;\
|
return 0;\
|
||||||
|
@ -14,6 +14,7 @@ Compilation.tests.cpp:<line number>: passed: std::memcmp(uarr, "123", sizeof(uar
|
|||||||
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:
|
Compilation.tests.cpp:<line number>: passed:
|
||||||
Compilation.tests.cpp:<line number>: passed: h1 == h2 for: [1403 helper] == [1403 helper]
|
Compilation.tests.cpp:<line number>: passed: h1 == h2 for: [1403 helper] == [1403 helper]
|
||||||
|
Compilation.tests.cpp:<line number>: passed: std::is_same<TypeList<int>, TypeList<int>>::value for: true
|
||||||
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'
|
||||||
|
@ -1174,6 +1174,6 @@ due to unexpected exception with message:
|
|||||||
Why would you throw a std::string?
|
Why would you throw a std::string?
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 245 | 185 passed | 56 failed | 4 failed as expected
|
test cases: 246 | 186 passed | 56 failed | 4 failed as expected
|
||||||
assertions: 1379 | 1243 passed | 115 failed | 21 failed as expected
|
assertions: 1380 | 1244 passed | 115 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -133,6 +133,17 @@ Compilation.tests.cpp:<line number>: PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
[1403 helper] == [1403 helper]
|
[1403 helper] == [1403 helper]
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1548
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( std::is_same<TypeList<int>, TypeList<int>>::value )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -10698,6 +10709,6 @@ Misc.tests.cpp:<line number>
|
|||||||
Misc.tests.cpp:<line number>: PASSED:
|
Misc.tests.cpp:<line number>: PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 245 | 172 passed | 69 failed | 4 failed as expected
|
test cases: 246 | 173 passed | 69 failed | 4 failed as expected
|
||||||
assertions: 1393 | 1243 passed | 129 failed | 21 failed as expected
|
assertions: 1394 | 1244 passed | 129 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -133,6 +133,17 @@ Compilation.tests.cpp:<line number>: PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
[1403 helper] == [1403 helper]
|
[1403 helper] == [1403 helper]
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1548
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( std::is_same<TypeList<int>, TypeList<int>>::value )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -323,6 +334,6 @@ with expansion:
|
|||||||
!true
|
!true
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 15 | 12 passed | 1 failed | 2 failed as expected
|
test cases: 16 | 13 passed | 1 failed | 2 failed as expected
|
||||||
assertions: 39 | 32 passed | 4 failed | 3 failed as expected
|
assertions: 40 | 33 passed | 4 failed | 3 failed as expected
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<property name="random-seed" value="1"/>
|
<property name="random-seed" value="1"/>
|
||||||
</properties>
|
</properties>
|
||||||
loose text artifact
|
loose text artifact
|
||||||
<testsuite name="<exe-name>" errors="17" failures="113" tests="1394" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="17" failures="113" tests="1395" 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}"/>
|
||||||
@ -13,6 +13,7 @@ loose text artifact
|
|||||||
<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>.(Fixture_1245<int, int>)" name="#1245" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1403" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1403" time="{duration}"/>
|
||||||
|
<testcase classname="<exe-name>.global" name="#1548" 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
|
||||||
|
@ -142,6 +142,17 @@
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="#1548" tags="[compilation]" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
std::is_same<TypeList<int>, TypeList<int>>::value
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<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>
|
||||||
@ -12948,7 +12959,7 @@ loose text artifact
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="1243" failures="130" expectedFailures="21"/>
|
<OverallResults successes="1244" failures="130" expectedFailures="21"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="1243" failures="129" expectedFailures="21"/>
|
<OverallResults successes="1244" failures="129" expectedFailures="21"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@ -17,6 +17,11 @@ namespace foo {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace bar {
|
||||||
|
template <typename... Ts>
|
||||||
|
struct TypeList {};
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#pragma GCC diagnostic ignored "-Wmissing-declarations"
|
#pragma GCC diagnostic ignored "-Wmissing-declarations"
|
||||||
#endif
|
#endif
|
||||||
@ -184,6 +189,11 @@ namespace { namespace CompilationTests {
|
|||||||
STATIC_REQUIRE_FALSE( std::is_void<int>::value );
|
STATIC_REQUIRE_FALSE( std::is_void<int>::value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("#1548", "[compilation]") {
|
||||||
|
using namespace bar;
|
||||||
|
REQUIRE(std::is_same<TypeList<int>, TypeList<int>>::value);
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace CompilationTests
|
}} // namespace CompilationTests
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user