2022-01-29 00:03:43 +01:00
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
2022-10-28 11:22:53 +02:00
// (See accompanying file LICENSE.txt or copy at
2022-01-29 00:03:43 +01:00
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
2010-11-10 00:24:00 +01:00
2022-05-14 15:37:39 +02:00
# if defined( __GNUC__ ) || defined( __clang__ )
# pragma GCC diagnostic ignored "-Wfloat-equal"
# endif
2020-01-20 23:24:04 +01:00
# include <catch2/catch_test_macros.hpp>
2020-04-26 16:25:43 +02:00
# include <catch2/catch_template_test_macros.hpp>
2019-04-17 20:23:24 +02:00
# include <array>
2010-11-10 00:24:00 +01:00
2021-06-20 16:25:57 +02:00
namespace {
2010-12-27 21:51:06 +01:00
2021-06-20 16:25:57 +02:00
class TestClass {
std : : string s ;
2010-12-27 21:51:06 +01:00
2021-06-20 16:25:57 +02:00
public :
TestClass ( ) : s ( " hello " ) { }
2010-12-27 21:51:06 +01:00
2021-06-20 16:25:57 +02:00
void succeedingCase ( ) { REQUIRE ( s = = " hello " ) ; }
void failingCase ( ) { REQUIRE ( s = = " world " ) ; }
} ;
2017-11-15 08:48:21 +01:00
2021-06-20 16:25:57 +02:00
struct Fixture {
Fixture ( ) : m_a ( 1 ) { }
2010-12-27 21:51:06 +01:00
2021-06-20 16:25:57 +02:00
int m_a ;
} ;
2015-11-04 19:01:28 +01:00
2024-08-05 17:01:41 +02:00
struct Persistent_Fixture {
mutable int m_a = 0 ;
} ;
2021-06-20 16:25:57 +02:00
template < typename T > struct Template_Fixture {
Template_Fixture ( ) : m_a ( 1 ) { }
2010-12-27 21:51:06 +01:00
2021-06-20 16:25:57 +02:00
T m_a ;
} ;
2018-11-08 07:26:39 +01:00
2021-06-20 16:25:57 +02:00
template < typename T > struct Template_Fixture_2 {
2024-03-01 11:15:27 +01:00
Template_Fixture_2 ( ) = default ;
2018-11-08 07:26:39 +01:00
2021-06-20 16:25:57 +02:00
T m_a ;
} ;
Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
(std::tuple, std::pair, std::map),
((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
2018-12-06 19:27:33 +01:00
2021-06-20 16:25:57 +02:00
template < typename T > struct Template_Foo {
size_t size ( ) { return 0 ; }
} ;
Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
(std::tuple, std::pair, std::map),
((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
2018-12-06 19:27:33 +01:00
2021-06-20 16:25:57 +02:00
template < typename T , size_t V > struct Template_Foo_2 {
size_t size ( ) { return V ; }
} ;
2017-11-15 08:48:21 +01:00
2021-06-20 16:25:57 +02:00
template < int V > struct Nttp_Fixture { int value = V ; } ;
2017-11-15 08:48:21 +01:00
2021-06-20 16:25:57 +02:00
} // end unnamed namespace
2017-11-15 08:48:21 +01:00
METHOD_AS_TEST_CASE ( TestClass : : succeedingCase , " A METHOD_AS_TEST_CASE based test run that succeeds " , " [class] " )
METHOD_AS_TEST_CASE ( TestClass : : failingCase , " A METHOD_AS_TEST_CASE based test run that fails " , " [.][class][failing] " )
2013-11-19 08:21:03 +01:00
TEST_CASE_METHOD ( Fixture , " A TEST_CASE_METHOD based test run that succeeds " , " [class] " )
2015-11-04 19:01:28 +01:00
{
REQUIRE ( m_a = = 1 ) ;
2010-12-27 21:51:06 +01:00
}
2024-08-05 17:01:41 +02:00
TEST_CASE_PERSISTENT_FIXTURE ( Persistent_Fixture , " A TEST_CASE_PERSISTENT_FIXTURE based test run that succeeds " , " [class] " )
{
SECTION ( " First partial run " ) {
REQUIRE ( m_a + + = = 0 ) ;
}
SECTION ( " Second partial run " ) {
REQUIRE ( m_a = = 1 ) ;
}
}
2018-11-08 07:26:39 +01:00
TEMPLATE_TEST_CASE_METHOD ( Template_Fixture , " A TEMPLATE_TEST_CASE_METHOD based test run that succeeds " , " [class][template] " , int , float , double ) {
REQUIRE ( Template_Fixture < TestType > : : m_a = = 1 ) ;
}
2019-04-17 20:23:24 +02:00
TEMPLATE_TEST_CASE_METHOD_SIG ( Nttp_Fixture , " A TEMPLATE_TEST_CASE_METHOD_SIG based test run that succeeds " , " [class][template][nttp] " , ( ( int V ) , V ) , 1 , 3 , 6 ) {
REQUIRE ( Nttp_Fixture < V > : : value > 0 ) ;
}
Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
(std::tuple, std::pair, std::map),
((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
2018-12-06 19:27:33 +01:00
TEMPLATE_PRODUCT_TEST_CASE_METHOD ( Template_Fixture_2 , " A TEMPLATE_PRODUCT_TEST_CASE_METHOD based test run that succeeds " , " [class][template][product] " , ( std : : vector , Template_Foo ) , ( int , float ) )
{
REQUIRE ( Template_Fixture_2 < TestType > : : m_a . size ( ) = = 0 ) ;
}
2019-04-17 20:23:24 +02:00
TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG ( Template_Fixture_2 , " A TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG based test run that succeeds " , " [class][template][product][nttp] " , ( ( typename T , size_t S ) , T , S ) , ( std : : array , Template_Foo_2 ) , ( ( int , 2 ) , ( float , 6 ) ) )
{
REQUIRE ( Template_Fixture_2 < TestType > { } . m_a . size ( ) > = 2 ) ;
}
2019-05-27 17:25:48 +02:00
using MyTypes = std : : tuple < int , char , double > ;
TEMPLATE_LIST_TEST_CASE_METHOD ( Template_Fixture , " Template test case method with test types specified inside std::tuple " , " [class][template][list] " , MyTypes )
{
REQUIRE ( Template_Fixture < TestType > : : m_a = = 1 ) ;
}
2011-04-12 19:44:58 +02:00
// We should be able to write our tests within a different namespace
namespace Inner
{
2013-11-19 08:21:03 +01:00
TEST_CASE_METHOD ( Fixture , " A TEST_CASE_METHOD based test run that fails " , " [.][class][failing] " )
2015-11-04 19:01:28 +01:00
{
REQUIRE ( m_a = = 2 ) ;
2011-04-12 19:44:58 +02:00
}
2018-11-08 07:26:39 +01:00
2024-08-05 17:01:41 +02:00
TEST_CASE_PERSISTENT_FIXTURE ( Persistent_Fixture , " A TEST_CASE_PERSISTENT_FIXTURE based test run that fails " , " [.][class][failing] " )
{
SECTION ( " First partial run " ) {
REQUIRE ( m_a + + = = 0 ) ;
}
SECTION ( " Second partial run " ) {
REQUIRE ( m_a = = 0 ) ;
}
}
2018-11-08 07:26:39 +01:00
TEMPLATE_TEST_CASE_METHOD ( Template_Fixture , " A TEMPLATE_TEST_CASE_METHOD based test run that fails " , " [.][class][template][failing] " , int , float , double )
{
REQUIRE ( Template_Fixture < TestType > : : m_a = = 2 ) ;
}
Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
(std::tuple, std::pair, std::map),
((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
2018-12-06 19:27:33 +01:00
2019-04-17 20:23:24 +02:00
TEMPLATE_TEST_CASE_METHOD_SIG ( Nttp_Fixture , " A TEMPLATE_TEST_CASE_METHOD_SIG based test run that fails " , " [.][class][template][nttp][failing] " , ( ( int V ) , V ) , 1 , 3 , 6 ) {
REQUIRE ( Nttp_Fixture < V > : : value = = 0 ) ;
}
Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
(std::tuple, std::pair, std::map),
((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
2018-12-06 19:27:33 +01:00
TEMPLATE_PRODUCT_TEST_CASE_METHOD ( Template_Fixture_2 , " A TEMPLATE_PRODUCT_TEST_CASE_METHOD based test run that fails " , " [.][class][template][product][failing] " , ( std : : vector , Template_Foo ) , ( int , float ) )
{
REQUIRE ( Template_Fixture_2 < TestType > : : m_a . size ( ) = = 1 ) ;
}
2019-04-17 20:23:24 +02:00
TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG ( Template_Fixture_2 , " A TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG based test run that fails " , " [.][class][template][product][nttp][failing] " , ( ( typename T , size_t S ) , T , S ) , ( std : : array , Template_Foo_2 ) , ( ( int , 2 ) , ( float , 6 ) ) )
{
REQUIRE ( Template_Fixture_2 < TestType > { } . m_a . size ( ) < 2 ) ;
}
2022-07-17 14:00:04 +02:00
} // namespace
// We want a class in nested namespace so we can test JUnit's classname normalization.
namespace {
namespace A {
namespace B {
class TestClass { } ;
}
}
} // namespace
TEST_CASE_METHOD ( A : : B : : TestClass ,
" A TEST_CASE_METHOD testing junit classname normalization " ,
" [class][approvals] " ) {
SUCCEED ( ) ;
2010-12-27 21:51:06 +01:00
}