2010-11-10 00:24:00 +01:00
/*
* Created by Phil on 09 / 11 / 2010.
* Copyright 2010 Two Blue Cubes Ltd . All rights reserved .
*
* Distributed under the Boost Software License , Version 1.0 . ( See accompanying
* file LICENSE_1_0 . txt or copy at http : //www.boost.org/LICENSE_1_0.txt)
*/
2011-04-26 09:32:40 +02:00
# include "catch.hpp"
2019-04-17 20:23:24 +02:00
# include <array>
2010-11-10 00:24:00 +01:00
2017-11-15 08:48:21 +01:00
namespace { namespace ClassTests {
2010-12-27 21:51:06 +01:00
2017-11-15 08:48:21 +01:00
# ifndef CLASS_TEST_HELPERS_INCLUDED // Don't compile this more than once per TU
# define CLASS_TEST_HELPERS_INCLUDED
2010-12-27 21:51:06 +01:00
2017-11-15 08:48:21 +01:00
class TestClass
{
std : : string s ;
2010-12-27 21:51:06 +01:00
2017-11-15 08:48:21 +01:00
public :
TestClass ( )
: s ( " hello " )
{ }
void succeedingCase ( )
{
REQUIRE ( s = = " hello " ) ;
}
void failingCase ( )
{
REQUIRE ( s = = " world " ) ;
}
} ;
2010-12-27 21:51:06 +01:00
struct Fixture
{
Fixture ( ) : m_a ( 1 ) { }
2015-11-04 19:01:28 +01:00
2010-12-27 21:51:06 +01:00
int m_a ;
} ;
2018-11-08 07:26:39 +01:00
template < typename T >
struct Template_Fixture {
Template_Fixture ( ) : m_a ( 1 ) { }
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
template < typename T >
struct Template_Fixture_2 {
Template_Fixture_2 ( ) { }
T m_a ;
} ;
template < typename T >
struct Template_Foo {
size_t size ( ) { return 0 ; }
} ;
2019-04-17 20:23:24 +02:00
template < typename T , size_t V >
struct Template_Foo_2 {
size_t size ( ) { return V ; }
} ;
template < int V >
struct Nttp_Fixture {
int value = V ;
} ;
2017-11-15 08:48:21 +01:00
# endif
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
}
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 ) ;
}
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
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 ) ;
}
2010-12-27 21:51:06 +01:00
}
2017-11-15 08:48:21 +01:00
2018-11-08 07:26:39 +01:00
2017-11-15 08:48:21 +01:00
} } // namespace ClassTests