blob: 65a77b8a8ce87d047368cbfa93275d7fbbe7ae82 [file] [log] [blame]
Phil Nashd8026002010-11-09 23:24:00 +00001/*
Phil Nashd8026002010-11-09 23:24:00 +00002 * Created by Phil on 22/10/2010.
3 * Copyright 2010 Two Blue Cubes Ltd
4 *
5 * Distributed under the Boost Software License, Version 1.0. (See accompanying
6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Phil Nashd8026002010-11-09 23:24:00 +00007 */
8
Phil Nashd8026002010-11-09 23:24:00 +00009#ifndef TWOBLUECUBES_CATCH_HPP_INCLUDED
10#define TWOBLUECUBES_CATCH_HPP_INCLUDED
Phil Nash0f9c5512012-06-02 23:12:42 +010011
Phil Nashfc63b022015-05-21 06:15:53 +010012#ifdef __clang__
13# pragma clang system_header
14#elif defined __GNUC__
15# pragma GCC system_header
16#endif
17
Phil Nash3bdc97d2014-05-19 18:57:14 +010018#include "internal/catch_suppress_warnings.h"
Phil Nasha695eb92012-08-13 07:46:10 +010019
Phil Nashdb0421e2014-12-19 17:52:33 +000020#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
21# define CATCH_IMPL
Phil Nashf9df35b2014-03-10 18:02:18 +000022#endif
23
Phil Nashdb0421e2014-12-19 17:52:33 +000024#ifdef CATCH_IMPL
Phil Nash9abb2762014-03-06 21:53:34 +000025# ifndef CLARA_CONFIG_MAIN
26# define CLARA_CONFIG_MAIN_NOT_DEFINED
27# define CLARA_CONFIG_MAIN
28# endif
29#endif
30
Phil Nash1091ca82012-08-06 20:16:53 +010031#include "internal/catch_notimplemented_exception.h"
Phil Nash5ec53b22012-05-10 07:58:48 +010032#include "internal/catch_context.h"
Phil Nash896a04f2011-01-05 21:16:54 +000033#include "internal/catch_test_registry.hpp"
Phil Nashd8026002010-11-09 23:24:00 +000034#include "internal/catch_capture.hpp"
Phil Nashc4a089c2013-12-03 18:52:41 +000035#include "internal/catch_section.h"
Phil Nash9430a2c2011-04-20 15:40:40 +010036#include "internal/catch_interfaces_exception.h"
Phil Nashd7c203c2011-04-28 08:03:28 +010037#include "internal/catch_approx.hpp"
Phil Nash14001272017-02-08 15:14:51 +000038#include "internal/catch_matchers_string.h"
Phil Nash10dfca32017-02-21 16:05:04 +000039#include "internal/catch_matchers_vector.h"
Phil Nash4dd3f682013-04-22 08:19:17 +010040#include "internal/catch_compiler_capabilities.h"
Phil Nash1d210eb2014-06-30 07:33:17 +010041#include "internal/catch_interfaces_tag_alias_registry.h"
Phil Nashd8026002010-11-09 23:24:00 +000042
Phil Nash0f9c5512012-06-02 23:12:42 +010043// These files are included here so the single_include script doesn't put them
44// in the conditionally compiled sections
Phil Nashddfe9632012-08-14 19:30:30 +010045#include "internal/catch_test_case_info.h"
Phil Nash0f9c5512012-06-02 23:12:42 +010046#include "internal/catch_interfaces_runner.h"
47
Phil Nash8350ef62011-08-12 18:52:10 +010048#ifdef __OBJC__
49#include "internal/catch_objc.hpp"
50#endif
51
Phil Nashdb0421e2014-12-19 17:52:33 +000052#ifdef CATCH_IMPL
philsquaredb1835e12017-02-17 23:43:31 +000053
54// !TBD: Move the leak detector code into a separate header
55#ifdef CATCH_CONFIG_WINDOWS_CRTDBG
56#include <crtdbg.h>
57class LeakDetector {
58public:
59 LeakDetector() {
60 int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
61 flag |= _CRTDBG_LEAK_CHECK_DF;
62 flag |= _CRTDBG_ALLOC_MEM_DF;
63 _CrtSetDbgFlag(flag);
64 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
65 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
66 // Change this to leaking allocation's number to break there
67 _CrtSetBreakAlloc(-1);
68 }
69};
70#else
71class LeakDetector {};
72#endif
73
74LeakDetector leakDetector;
75
Phil Nash1091ca82012-08-06 20:16:53 +010076#include "internal/catch_impl.hpp"
Phil Nash9abb2762014-03-06 21:53:34 +000077#endif
Phil Nash89d1e6c2011-05-24 08:23:02 +010078
79#ifdef CATCH_CONFIG_MAIN
80#include "internal/catch_default_main.hpp"
Phil Nash9abb2762014-03-06 21:53:34 +000081#endif
82
83
84#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
85# undef CLARA_CONFIG_MAIN
86#endif
Phil Nash89d1e6c2011-05-24 08:23:02 +010087
Phil Nashd8026002010-11-09 23:24:00 +000088//////
89
Phil Nash46bcd4b2012-07-20 18:43:48 +010090// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
91#ifdef CATCH_CONFIG_PREFIX_ALL
92
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +010093#if defined(CATCH_CONFIG_FAST_COMPILE)
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +020094#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
95#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +010096#else
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +020097#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
98#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +010099#endif
Phil Nash46bcd4b2012-07-20 18:43:48 +0100100
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200101#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", __VA_ARGS__ )
Phil Nashf3ec8432017-03-21 13:22:39 +0000102#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
103#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200104#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100105
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200106#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
107#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
108#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
109#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
110#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100111
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200112#define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", __VA_ARGS__ )
Phil Nashf3ec8432017-03-21 13:22:39 +0000113#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
114#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200115#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100116
Phil Nashf3ec8432017-03-21 13:22:39 +0000117#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100118
119#if defined(CATCH_CONFIG_FAST_COMPILE)
Phil Nashf3ec8432017-03-21 13:22:39 +0000120#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100121#else
Phil Nashf3ec8432017-03-21 13:22:39 +0000122#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100123#endif
124
Phil Nash46bcd4b2012-07-20 18:43:48 +0100125
Phil Nashf3ec8432017-03-21 13:22:39 +0000126#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
127#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
128#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
Martin Hořeňovský33ed1772017-05-02 23:51:03 +0200129#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
130#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100131
Martin Hořeňovský71df6632017-04-25 12:41:30 +0200132#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
133#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
134#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
135#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
136#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
Martin Hořeňovský40130e52017-04-28 18:33:52 +0200137#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
Martin Hořeňovský71df6632017-04-25 12:41:30 +0200138#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
139#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
140
Phil Nashc0b69802013-03-16 20:18:52 +0000141#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100142
143#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
144
145#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
146
Phil Nash37186a12013-03-13 12:19:30 +0000147// "BDD-style" convenience wrappers
Phil Nash444f4dd2013-03-16 20:39:19 +0000148#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
James Wilkinson63005a12014-07-10 10:22:20 +0100149#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
Phil Nash6de135c2015-07-22 18:07:28 +0100150#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" )
151#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" )
152#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" )
153#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" )
154#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" )
Phil Nash37186a12013-03-13 12:19:30 +0000155
Phil Nash46bcd4b2012-07-20 18:43:48 +0100156// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
157#else
158
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100159#if defined(CATCH_CONFIG_FAST_COMPILE)
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200160#define REQUIRE( ... ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
161#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100162
163#else
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200164#define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
165#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100166#endif
Phil Nashd8026002010-11-09 23:24:00 +0000167
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200168#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", __VA_ARGS__ )
Phil Nashf3ec8432017-03-21 13:22:39 +0000169#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
170#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
Martin Hořeňovský950cae92017-06-05 18:40:50 +0200171#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200172#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
Phil Nashd8026002010-11-09 23:24:00 +0000173
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200174#define CHECK( ... ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
175#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
176#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
177#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
178#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )
Phil Nashd8026002010-11-09 23:24:00 +0000179
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200180#define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", __VA_ARGS__ )
Phil Nashf3ec8432017-03-21 13:22:39 +0000181#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
182#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
Martin Hořeňovský950cae92017-06-05 18:40:50 +0200183#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
Martin Hořeňovskýe1bca702017-04-25 20:20:46 +0200184#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
Phil Nashd8026002010-11-09 23:24:00 +0000185
Phil Nashf3ec8432017-03-21 13:22:39 +0000186#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100187
188#if defined(CATCH_CONFIG_FAST_COMPILE)
Phil Nashf3ec8432017-03-21 13:22:39 +0000189#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100190#else
Phil Nashf3ec8432017-03-21 13:22:39 +0000191#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
Martin Hořeňovský7a8a0202017-03-17 13:21:40 +0100192#endif
193
Phil Nasheca56372012-03-04 11:14:21 +0000194
Phil Nashf3ec8432017-03-21 13:22:39 +0000195#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
196#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
197#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
Martin Hořeňovský33ed1772017-05-02 23:51:03 +0200198#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
199#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
Phil Nashd8026002010-11-09 23:24:00 +0000200
Phil Nash5dd06392017-03-08 15:40:20 +0000201#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
202#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
203#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
204#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
205#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
Phil Nashf3ec8432017-03-21 13:22:39 +0000206#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
207#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
208#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
Phil Nashc0b69802013-03-16 20:18:52 +0000209#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
Phil Nashd8026002010-11-09 23:24:00 +0000210
Phil Nash5cad9d52011-01-27 22:29:36 +0000211#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
212
213#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
Phil Nashd8026002010-11-09 23:24:00 +0000214
Phil Nash46bcd4b2012-07-20 18:43:48 +0100215#endif
216
217#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
Phil Nashd8026002010-11-09 23:24:00 +0000218
Phil Nash37186a12013-03-13 12:19:30 +0000219// "BDD-style" convenience wrappers
Phil Nash444f4dd2013-03-16 20:39:19 +0000220#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
James Wilkinson63005a12014-07-10 10:22:20 +0100221#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
Martin Hořeňovský71df6632017-04-25 12:41:30 +0200222
Phil Nash6de135c2015-07-22 18:07:28 +0100223#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" )
224#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" )
225#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" )
226#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" )
227#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" )
Phil Nash37186a12013-03-13 12:19:30 +0000228
Phil Nash01db6c42011-04-04 07:56:44 +0100229using Catch::Detail::Approx;
Phil Nashd8026002010-11-09 23:24:00 +0000230
Phil Nash3bdc97d2014-05-19 18:57:14 +0100231#include "internal/catch_reenable_warnings.h"
Phil Nasha695eb92012-08-13 07:46:10 +0100232
Phil Nash73acd942011-02-16 19:02:09 +0000233#endif // TWOBLUECUBES_CATCH_HPP_INCLUDED