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-09 23:24:00 +00: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-09 23:24:00 +00:00
2021-06-20 16:25:57 +02:00
namespace {
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
class TestClass {
std :: string s ;
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
public :
TestClass () : s ( "hello" ) {}
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
void succeedingCase () { REQUIRE ( s == "hello" ); }
void failingCase () { REQUIRE ( s == "world" ); }
};
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
struct Fixture {
Fixture () : m_a ( 1 ) {}
2010-12-27 20:51:06 +00:00
2021-06-20 16:25:57 +02:00
int m_a ;
};
2015-11-04 18:01:28 +00:00
2024-08-05 16:01:41 +01: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 20:51:06 +00: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 ;
};
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 ; }
};
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 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
template < int V > struct Nttp_Fixture { int value = V ; };
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
} // end unnamed namespace
2017-11-15 07:48:21 +00: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 07:21:03 +00:00
TEST_CASE_METHOD ( Fixture , "A TEST_CASE_METHOD based test run that succeeds" , "[class]" )
2015-11-04 18:01:28 +00:00
{
REQUIRE ( m_a == 1 );
2010-12-27 20:51:06 +00:00
}
2024-08-05 16:01:41 +01: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 );
}
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 18:44:58 +01:00
// We should be able to write our tests within a different namespace
namespace Inner
{
2013-11-19 07:21:03 +00:00
TEST_CASE_METHOD ( Fixture , "A TEST_CASE_METHOD based test run that fails" , "[.][class][failing]" )
2015-11-04 18:01:28 +00:00
{
REQUIRE ( m_a == 2 );
2011-04-12 18:44:58 +01:00
}
2018-11-08 07:26:39 +01:00
2024-08-05 16:01:41 +01: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 );
}
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 );
}
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 20:51:06 +00:00
}