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
2012-08-16 18:47:41 +01:00
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>
2020-12-28 20:29:05 +01:00
#include <catch2/internal/catch_config_wchar.hpp>
2021-12-15 09:51:04 -07:00
#include <catch2/internal/catch_windows_h_proxy.hpp>
2015-08-07 08:20:56 +01:00
2012-05-04 07:55:11 +01:00
2011-01-07 10:22:24 +00:00
#include <iostream>
2017-03-06 22:07:33 +01:00
#include <cerrno>
2017-07-28 15:11:05 +02:00
#include <limits>
2019-04-17 20:23:24 +02:00
#include <array>
2020-05-25 09:45:24 +02:00
#include <tuple>
2010-11-29 19:40:44 +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
static const char * makeString ( bool makeNull ) {
return makeNull ? nullptr : "valid string" ;
2017-11-15 07:48:21 +00:00
}
2021-06-20 16:25:57 +02:00
static bool testCheckedIf ( bool flag ) {
CHECKED_IF ( flag )
return true ;
else
return false ;
}
static bool testCheckedElse ( bool flag ) {
CHECKED_ELSE ( flag )
return false ;
2019-10-27 21:07:21 +01:00
2021-06-20 16:25:57 +02:00
return true ;
}
2017-11-15 07:48:21 +00:00
2021-06-20 16:25:57 +02:00
static unsigned int Factorial ( unsigned int number ) {
return number > 1 ? Factorial ( number - 1 ) * number : 1 ;
}
2018-12-06 19:27:33 +01:00
2021-06-20 16:25:57 +02:00
static int f () {
return 1 ;
}
static void manuallyRegisteredTestFunction () {
SUCCEED ( "was called" );
}
struct AutoTestReg {
AutoTestReg () {
REGISTER_TEST_CASE ( manuallyRegisteredTestFunction , "ManuallyRegistered" );
}
};
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
static AutoTestReg autoTestReg ;
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
template < typename T >
struct Foo {
size_t size () { return 0 ; }
};
template < typename T , size_t S >
struct Bar {
size_t size () { return S ; }
};
}
2017-11-15 07:48:21 +00:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "random SECTION tests" , "[.][sections][failing]" ) {
2010-11-29 19:40:44 +00:00
int a = 1 ;
int b = 2 ;
2015-11-04 18:01:28 +00:00
2018-06-25 19:04:29 +01:00
SECTION ( "doesn't equal" ) {
2010-12-14 09:00:09 +00:00
REQUIRE ( a != b );
REQUIRE ( b != a );
2010-11-29 19:40:44 +00:00
}
2010-11-30 06:48:21 +00:00
2018-06-25 19:04:29 +01:00
SECTION ( "not equal" ) {
2011-02-17 20:15:20 +00:00
REQUIRE ( a != b );
2010-11-29 19:40:44 +00:00
}
}
2010-11-30 06:48:21 +00:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "nested SECTION tests" , "[.][sections][failing]" ) {
2010-12-15 19:36:39 +00:00
int a = 1 ;
int b = 2 ;
2015-11-04 18:01:28 +00:00
2018-06-25 19:04:29 +01:00
SECTION ( "doesn't equal" ) {
2010-12-28 17:21:29 +00:00
REQUIRE ( a != b );
2010-12-15 19:36:39 +00:00
REQUIRE ( b != a );
2018-06-25 19:04:29 +01:00
SECTION ( "not equal" ) {
2011-02-17 20:15:20 +00:00
REQUIRE ( a != b );
}
}
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "more nested SECTION tests" , "[sections][failing][.]" ) {
2011-02-17 20:15:20 +00:00
int a = 1 ;
int b = 2 ;
2015-11-04 18:01:28 +00:00
2018-06-25 19:04:29 +01:00
SECTION ( "doesn't equal" ) {
SECTION ( "equal" ) {
2011-02-21 08:50:05 +00:00
REQUIRE ( a == b );
2011-02-17 20:15:20 +00:00
}
2018-06-25 19:04:29 +01:00
SECTION ( "not equal" ) {
2011-02-21 08:50:05 +00:00
REQUIRE ( a != b );
}
2018-06-25 19:04:29 +01:00
SECTION ( "less than" ) {
2011-02-28 08:18:52 +00:00
REQUIRE ( a < b );
2010-12-15 19:36:39 +00:00
}
}
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "even more nested SECTION tests" , "[sections]" ) {
SECTION ( "c" ) {
SECTION ( "d (leaf)" ) {
2018-06-25 19:04:29 +01:00
SUCCEED (); // avoid failing due to no tests
2012-05-04 07:55:11 +01:00
}
2015-11-04 18:01:28 +00:00
2017-07-13 09:20:37 +01:00
SECTION ( "e (leaf)" ) {
2018-06-25 19:04:29 +01:00
SUCCEED (); // avoid failing due to no tests
2012-05-04 07:55:11 +01:00
}
}
2017-07-13 09:20:37 +01:00
SECTION ( "f (leaf)" ) {
2018-06-25 19:04:29 +01:00
SUCCEED (); // avoid failing due to no tests
2012-05-04 07:55:11 +01:00
}
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "looped SECTION tests" , "[.][failing][sections]" ) {
2010-12-28 14:41:57 +00:00
int a = 1 ;
2015-11-04 18:01:28 +00:00
2017-07-13 09:20:37 +01:00
for ( int b = 0 ; b < 10 ; ++ b ) {
2018-06-25 19:19:21 +01:00
DYNAMIC_SECTION ( "b is currently: " << b ) {
2015-11-04 18:01:28 +00:00
CHECK ( b > a );
2010-12-28 14:41:57 +00:00
}
}
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "looped tests" , "[.][failing]" ) {
2010-12-28 14:41:57 +00:00
static const int fib [] = { 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 };
2015-11-04 18:01:28 +00:00
2017-09-18 17:13:17 +01:00
for ( std :: size_t i = 0 ; i < sizeof ( fib ) / sizeof ( int ); ++ i ) {
2010-12-28 14:41:57 +00:00
INFO ( "Testing if fib[" << i << "] (" << fib [ i ] << ") is even" );
2015-11-04 18:01:28 +00:00
CHECK ( ( fib [ i ] % 2 ) == 0 );
2010-12-28 14:41:57 +00:00
}
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "Sends stuff to stdout and stderr" , "[.]" ) {
2024-03-01 11:15:27 +01:00
std :: cout << "A string sent directly to stdout \n " << std :: flush ;
std :: cerr << "A string sent directly to stderr \n " << std :: flush ;
std :: clog << "A string sent to stderr via clog \n " << std :: flush ;
2010-12-28 14:41:57 +00:00
}
2011-02-23 20:02:18 +00:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "null strings" ) {
2017-04-25 12:41:30 +02:00
REQUIRE ( makeString ( false ) != static_cast < char *> ( nullptr ));
REQUIRE ( makeString ( true ) == static_cast < char *> ( nullptr ));
2011-02-23 20:02:18 +00:00
}
2011-03-09 19:45:05 +00:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "checkedIf" ) {
2012-02-10 08:30:13 +00:00
REQUIRE ( testCheckedIf ( true ) );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "checkedIf, failing" , "[failing][.]" ) {
2012-02-10 08:30:13 +00:00
REQUIRE ( testCheckedIf ( false ) );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "checkedElse" ) {
2012-02-10 08:30:13 +00:00
REQUIRE ( testCheckedElse ( true ) );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "checkedElse, failing" , "[failing][.]" ) {
2012-02-10 08:30:13 +00:00
REQUIRE ( testCheckedElse ( false ) );
}
2012-02-10 18:58:06 +00:00
2021-05-10 21:42:47 +02:00
TEST_CASE ( "Testing checked-if" , "[checked-if]" ) {
CHECKED_IF ( true ) {
SUCCEED ();
}
CHECKED_IF ( false ) {
FAIL ();
}
CHECKED_ELSE ( true ) {
FAIL ();
}
CHECKED_ELSE ( false ) {
SUCCEED ();
}
}
TEST_CASE ( "Testing checked-if 2" , "[checked-if][!shouldfail]" ) {
CHECKED_IF ( true ) {
FAIL ();
}
// If the checked if is not entered, this passes and the test
// fails, because of the [!shouldfail] tag.
SUCCEED ();
}
TEST_CASE ( "Testing checked-if 3" , "[checked-if][!shouldfail]" ) {
CHECKED_ELSE ( false ) {
FAIL ();
}
// If the checked false is not entered, this passes and the test
// fails, because of the [!shouldfail] tag.
SUCCEED ();
}
2023-08-08 04:07:31 +08:00
[[noreturn]]
TEST_CASE ( "Testing checked-if 4" , "[checked-if][!shouldfail]" ) {
CHECKED_ELSE ( true ) {}
throw std :: runtime_error ( "Uncaught exception should fail!" );
}
[[noreturn]]
TEST_CASE ( "Testing checked-if 5" , "[checked-if][!shouldfail]" ) {
CHECKED_ELSE ( false ) {}
throw std :: runtime_error ( "Uncaught exception should fail!" );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "xmlentitycheck" ) {
2018-06-25 19:04:29 +01:00
SECTION ( "embedded xml: <test>it should be possible to embed xml characters, such as <, \" or &, or even whole <xml>documents</xml> within an attribute</test>" ) {
SUCCEED (); // We need this here to stop it failing due to no tests
2012-02-10 18:58:06 +00:00
}
2018-06-25 19:04:29 +01:00
SECTION ( "encoded chars: these should all be encoded: &&& \"\"\" <<<& \" <<& \" " ) {
SUCCEED (); // We need this here to stop it failing due to no tests
2012-02-10 18:58:06 +00:00
}
}
2012-02-28 20:04:25 +00:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "send a single char to INFO" , "[failing][.]" ) {
2012-02-28 20:04:25 +00:00
INFO ( 3 );
2015-11-04 18:01:28 +00:00
REQUIRE ( false );
2012-02-28 20:04:25 +00:00
}
2012-02-29 08:39:22 +00:00
2013-06-04 08:37:28 +01:00
TEST_CASE ( "Factorials are computed" , "[factorial]" ) {
2012-05-31 19:40:26 +01:00
REQUIRE ( Factorial ( 0 ) == 1 );
REQUIRE ( Factorial ( 1 ) == 1 );
REQUIRE ( Factorial ( 2 ) == 2 );
REQUIRE ( Factorial ( 3 ) == 6 );
REQUIRE ( Factorial ( 10 ) == 3628800 );
}
2012-08-31 08:10:36 +01:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "An empty test with no assertions" , "[empty]" ) {}
2012-09-15 17:53:27 +01:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "Nice descriptive name" , "[tag1][tag2][tag3][.]" ) {
2012-09-15 17:53:27 +01:00
WARN ( "This one ran" );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "first tag" , "[tag1]" ) {}
TEST_CASE ( "second tag" , "[tag2]" ) {}
2013-03-25 08:47:36 +00:00
TEST_CASE ( "vectors can be sized and resized" , "[vector]" ) {
std :: vector < int > v ( 5 );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 5 );
2015-11-04 18:01:28 +00:00
2017-07-13 09:20:37 +01:00
SECTION ( "resizing bigger changes size and capacity" ) {
2013-03-25 08:47:36 +00:00
v . resize ( 10 );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . size () == 10 );
REQUIRE ( v . capacity () >= 10 );
}
2017-07-13 09:20:37 +01:00
SECTION ( "resizing smaller changes size but not capacity" ) {
2013-03-25 08:47:36 +00:00
v . resize ( 0 );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . size () == 0 );
REQUIRE ( v . capacity () >= 5 );
2015-11-04 18:01:28 +00:00
2017-07-13 09:20:37 +01:00
SECTION ( "We can use the 'swap trick' to reset the capacity" ) {
2013-03-25 08:47:36 +00:00
std :: vector < int > empty ;
empty . swap ( v );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . capacity () == 0 );
}
}
2017-07-13 09:20:37 +01:00
SECTION ( "reserving bigger changes capacity but not size" ) {
2013-03-25 08:47:36 +00:00
v . reserve ( 10 );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 10 );
}
2017-07-13 09:20:37 +01:00
SECTION ( "reserving smaller does not change size or capacity" ) {
2018-11-08 07:26:39 +01:00
v . reserve ( 0 );
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 5 );
}
}
TEMPLATE_TEST_CASE ( "TemplateTest: vectors can be sized and resized" , "[vector][template]" , int , float , std :: string , ( std :: tuple < int , float > ) ) {
std :: vector < TestType > v ( 5 );
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 5 );
SECTION ( "resizing bigger changes size and capacity" ) {
v . resize ( 10 );
REQUIRE ( v . size () == 10 );
REQUIRE ( v . capacity () >= 10 );
}
SECTION ( "resizing smaller changes size but not capacity" ) {
v . resize ( 0 );
REQUIRE ( v . size () == 0 );
REQUIRE ( v . capacity () >= 5 );
SECTION ( "We can use the 'swap trick' to reset the capacity" ) {
std :: vector < TestType > empty ;
empty . swap ( v );
REQUIRE ( v . capacity () == 0 );
}
}
SECTION ( "reserving bigger changes capacity but not size" ) {
v . reserve ( 10 );
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 10 );
}
SECTION ( "reserving smaller does not change size or capacity" ) {
2013-03-25 08:47:36 +00:00
v . reserve ( 0 );
2015-11-04 18:01:28 +00:00
2013-03-25 08:47:36 +00:00
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 5 );
}
}
2013-05-13 08:20:45 +01:00
2019-04-17 20:23:24 +02:00
TEMPLATE_TEST_CASE_SIG ( "TemplateTestSig: vectors can be sized and resized" , "[vector][template][nttp]" , (( typename TestType , int V ), TestType , V ), ( int , 5 ), ( float , 4 ), ( std :: string , 15 ), (( std :: tuple < int , float > ), 6 )) {
std :: vector < TestType > v ( V );
REQUIRE ( v . size () == V );
REQUIRE ( v . capacity () >= V );
SECTION ( "resizing bigger changes size and capacity" ) {
v . resize ( 2 * V );
REQUIRE ( v . size () == 2 * V );
REQUIRE ( v . capacity () >= 2 * V );
}
SECTION ( "resizing smaller changes size but not capacity" ) {
v . resize ( 0 );
REQUIRE ( v . size () == 0 );
REQUIRE ( v . capacity () >= V );
SECTION ( "We can use the 'swap trick' to reset the capacity" ) {
std :: vector < TestType > empty ;
empty . swap ( v );
REQUIRE ( v . capacity () == 0 );
}
}
SECTION ( "reserving bigger changes capacity but not size" ) {
v . reserve ( 2 * V );
REQUIRE ( v . size () == V );
REQUIRE ( v . capacity () >= 2 * V );
}
SECTION ( "reserving smaller does not change size or capacity" ) {
v . reserve ( 0 );
REQUIRE ( v . size () == V );
REQUIRE ( v . capacity () >= V );
}
}
2018-12-06 19:27:33 +01:00
TEMPLATE_PRODUCT_TEST_CASE ( "A Template product test case" , "[template][product]" , ( std :: vector , Foo ), ( int , float )) {
TestType x ;
REQUIRE ( x . size () == 0 );
}
2019-04-17 20:23:24 +02:00
TEMPLATE_PRODUCT_TEST_CASE_SIG ( "A Template product test case with array signature" , "[template][product][nttp]" , (( typename T , size_t S ), T , S ), ( std :: array , Bar ), (( int , 9 ), ( float , 42 ))) {
TestType x ;
REQUIRE ( x . size () > 0 );
}
2018-12-06 19:27:33 +01:00
TEMPLATE_PRODUCT_TEST_CASE ( "Product with differing arities" , "[template][product]" , std :: tuple , ( int , ( int , double ), ( int , double , float ))) {
REQUIRE ( std :: tuple_size < TestType >:: value >= 1 );
}
2019-05-27 17:25:48 +02:00
using MyTypes = std :: tuple < int , char , float > ;
TEMPLATE_LIST_TEST_CASE ( "Template test case with test types specified inside std::tuple" , "[template][list]" , MyTypes )
{
2024-03-01 11:15:27 +01:00
REQUIRE ( std :: is_arithmetic < TestType >:: value );
2019-05-27 17:25:48 +02:00
}
2019-07-22 12:56:33 +02:00
struct NonDefaultConstructibleType {
NonDefaultConstructibleType () = delete ;
};
2019-08-17 11:48:42 +02:00
using MyNonDefaultConstructibleTypes = std :: tuple < NonDefaultConstructibleType , float > ;
2019-07-22 12:56:33 +02:00
TEMPLATE_LIST_TEST_CASE ( "Template test case with test types specified inside non-default-constructible std::tuple" , "[template][list]" , MyNonDefaultConstructibleTypes )
{
2024-03-01 11:15:27 +01:00
REQUIRE ( std :: is_trivially_copyable < TestType >:: value );
2019-07-22 12:56:33 +02:00
}
2019-08-17 11:48:42 +02:00
struct NonCopyableAndNonMovableType {
NonCopyableAndNonMovableType () = default ;
NonCopyableAndNonMovableType ( NonCopyableAndNonMovableType const & ) = delete ;
NonCopyableAndNonMovableType ( NonCopyableAndNonMovableType && ) = delete ;
auto operator = ( NonCopyableAndNonMovableType const & ) -> NonCopyableAndNonMovableType & = delete ;
auto operator = ( NonCopyableAndNonMovableType && ) -> NonCopyableAndNonMovableType & = delete ;
};
using NonCopyableAndNonMovableTypes = std :: tuple < NonCopyableAndNonMovableType , float > ;
TEMPLATE_LIST_TEST_CASE ( "Template test case with test types specified inside non-copyable and non-movable std::tuple" , "[template][list]" , NonCopyableAndNonMovableTypes )
{
2024-03-01 11:15:27 +01:00
REQUIRE ( std :: is_default_constructible < TestType >:: value );
2019-08-17 11:48:42 +02:00
}
2013-05-13 08:20:45 +01:00
// https://github.com/philsquared/Catch/issues/166
2017-07-13 09:20:37 +01:00
TEST_CASE ( "A couple of nested sections followed by a failure" , "[failing][.]" ) {
2018-06-25 19:04:29 +01:00
SECTION ( "Outer" )
SECTION ( "Inner" )
2013-07-24 19:13:08 +01:00
SUCCEED ( "that's not flying - that's failing in style" );
FAIL ( "to infinity and beyond" );
}
2014-04-15 18:44:37 +01:00
2017-07-13 09:20:37 +01:00
TEST_CASE ( "not allowed" , "[!throws]" ) {
2014-04-15 18:44:37 +01:00
// This test case should not be included if you run with -e on the command line
2018-06-25 19:04:29 +01:00
SUCCEED ();
2014-04-15 18:44:37 +01:00
}
2014-04-22 08:19:11 +01:00
2014-04-23 07:07:27 +01:00
TEST_CASE ( "Tabs and newlines show in output" , "[.][whitespace][failing]" ) {
// Based on issue #242
std :: string s1 = "if ($b == 10) { \n\t\t $a \t = 20; \n }" ;
std :: string s2 = "if ($b == 10) { \n\t $a = 20; \n } \n " ;
CHECK ( s1 == s2 );
}
2014-08-14 12:28:23 +01:00
2020-12-28 20:29:05 +01:00
#if defined(CATCH_CONFIG_WCHAR)
2014-08-14 12:28:23 +01:00
TEST_CASE ( "toString on const wchar_t const pointer returns the string contents" , "[toString]" ) {
2016-08-24 09:38:24 -05:00
const wchar_t * const s = L "wide load" ;
2017-05-02 23:51:03 +02:00
std :: string result = :: Catch :: Detail :: stringify ( s );
2016-08-24 09:38:24 -05:00
CHECK ( result == " \" wide load \" " );
2014-08-14 12:28:23 +01:00
}
TEST_CASE ( "toString on const wchar_t pointer returns the string contents" , "[toString]" ) {
2016-08-24 09:38:24 -05:00
const wchar_t * s = L "wide load" ;
2017-05-02 23:51:03 +02:00
std :: string result = :: Catch :: Detail :: stringify ( s );
2016-08-24 09:38:24 -05:00
CHECK ( result == " \" wide load \" " );
2014-08-14 12:28:23 +01:00
}
TEST_CASE ( "toString on wchar_t const pointer returns the string contents" , "[toString]" ) {
2018-05-05 09:39:55 +01:00
auto const s = const_cast < wchar_t *> ( L "wide load" );
2017-05-02 23:51:03 +02:00
std :: string result = :: Catch :: Detail :: stringify ( s );
2016-08-24 09:38:24 -05:00
CHECK ( result == " \" wide load \" " );
2014-08-14 12:28:23 +01:00
}
TEST_CASE ( "toString on wchar_t returns the string contents" , "[toString]" ) {
2017-12-07 00:02:19 +00:00
auto s = const_cast < wchar_t *> ( L "wide load" );
2017-05-02 23:51:03 +02:00
std :: string result = :: Catch :: Detail :: stringify ( s );
2016-08-24 09:38:24 -05:00
CHECK ( result == " \" wide load \" " );
2014-08-19 08:16:44 +01:00
}
2020-12-28 20:29:05 +01:00
#endif // CATCH_CONFIG_WCHAR
2014-08-22 08:07:39 +01:00
2017-07-13 08:52:51 +01:00
TEST_CASE ( "long long" ) {
2021-11-12 01:13:46 +01:00
constexpr long long l = std :: numeric_limits < long long >:: max ();
2015-11-04 18:01:28 +00:00
2015-07-23 19:03:33 +01:00
REQUIRE ( l == std :: numeric_limits < long long >:: max () );
}
2017-07-13 09:20:37 +01:00
TEST_CASE ( "This test 'should' fail but doesn't" , "[.][failing][!shouldfail]" ) {
2016-03-14 19:13:34 +00:00
SUCCEED ( "oops!" );
}
2016-09-27 10:27:28 +01:00
TEST_CASE ( "# A test name that starts with a #" ) {
SUCCEED ( "yay" );
}
2017-03-06 22:07:33 +01:00
2022-01-26 23:47:40 +01:00
TEST_CASE ( "#835 -- errno should not be touched by Catch2" , "[.][failing][!shouldfail]" ) {
2017-03-07 10:17:59 +01:00
errno = 1 ;
2022-01-26 23:47:40 +01:00
// Check that reporting failed test doesn't change errno.
2017-03-07 10:17:59 +01:00
CHECK ( f () == 0 );
2022-01-26 23:47:40 +01:00
// We want to avoid expanding `errno` macro in assertion, because
// we capture the expression after macro expansion, and would have
// to normalize the ways different platforms spell `errno`.
const auto errno_after = errno ;
REQUIRE ( errno_after == 1 );
2017-03-06 22:07:33 +01:00
}
2017-08-10 21:38:07 +02:00
TEST_CASE ( "#961 -- Dynamically created sections should all be reported" , "[.]" ) {
for ( char i = '0' ; i < '5' ; ++ i ) {
SECTION ( std :: string ( "Looped section " ) + i ) {
SUCCEED ( "Everything is OK" );
}
}
}
2017-11-13 16:03:27 +00:00
2018-02-09 00:18:32 +02:00
TEST_CASE ( "#1175 - Hidden Test" , "[.]" ) {
// Just for checking that hidden test is not listed by default
SUCCEED ();
}
2020-06-13 15:41:25 +02:00
TEMPLATE_TEST_CASE_SIG ( "#1954 - 7 arg template test case sig compiles" , "[regression][.compilation]" ,
(( int Tnx , int Tnu , int Tny , int Tph , int Tch , int Tineq , int Teq ), Tnx , Tnu , Tny , Tph , Tch , Tineq , Teq ),
( 1 , 1 , 1 , 1 , 1 , 0 , 0 ), ( 5 , 1 , 1 , 1 , 1 , 0 , 0 ), ( 5 , 3 , 1 , 1 , 1 , 0 , 0 )) {
SUCCEED ();
}
2021-09-25 21:37:03 +02:00
TEST_CASE ( "Same test name but with different tags is fine" , "[.approvals][some-tag]" ) {}
TEST_CASE ( "Same test name but with different tags is fine" , "[.approvals][other-tag]" ) {}
2021-12-15 09:51:04 -07:00
2022-06-05 14:51:34 +02:00
// MinGW doesn't support __try, and Clang has only very partial support
#if defined(_MSC_VER)
2021-12-15 09:51:04 -07:00
void throw_and_catch ()
{
__try {
RaiseException ( 0xC0000005 , 0 , 0 , NULL );
}
__except ( 1 )
{
}
}
TEST_CASE ( "Validate SEH behavior - handled" , "[approvals][FatalConditionHandler][CATCH_PLATFORM_WINDOWS]" )
{
// Validate that Catch2 framework correctly handles tests raising and handling SEH exceptions.
throw_and_catch ();
}
void throw_no_catch ()
{
RaiseException ( 0xC0000005 , 0 , 0 , NULL );
}
TEST_CASE ( "Validate SEH behavior - unhandled" , "[.approvals][FatalConditionHandler][CATCH_PLATFORM_WINDOWS]" )
{
// Validate that Catch2 framework correctly handles tests raising and not handling SEH exceptions.
throw_no_catch ();
}
2022-03-02 15:42:07 +03:00
static LONG CALLBACK dummyExceptionFilter ( PEXCEPTION_POINTERS ExceptionInfo ) {
return EXCEPTION_CONTINUE_SEARCH ;
}
TEST_CASE ( "Validate SEH behavior - no crash for stack unwinding" , "[approvals][!throws][!shouldfail][FatalConditionHandler][CATCH_PLATFORM_WINDOWS]" )
{
// Trigger stack unwinding with SEH top-level filter changed and validate the test fails expectedly with no application crash
SetUnhandledExceptionFilter ( dummyExceptionFilter );
throw 1 ;
}
2022-06-05 14:51:34 +02:00
#endif // _MSC_VER