blob: 0633997f3f4ef9a6c447517fc81baf7258c52d8a [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 Nashcda21492012-08-16 18:47:41 +010012#ifdef __clang__
Phil Nash778f9c42012-10-30 09:09:30 +000013#pragma clang diagnostic ignored "-Wglobal-constructors"
Phil Nasha695eb92012-08-13 07:46:10 +010014
15#pragma clang diagnostic push
16#pragma clang diagnostic ignored "-Wpadded"
Phil Nashcda21492012-08-16 18:47:41 +010017#endif
Phil Nasha695eb92012-08-13 07:46:10 +010018
Phil Nash1091ca82012-08-06 20:16:53 +010019#include "internal/catch_notimplemented_exception.h"
Phil Nash5ec53b22012-05-10 07:58:48 +010020#include "internal/catch_context.h"
Phil Nash896a04f2011-01-05 21:16:54 +000021#include "internal/catch_test_registry.hpp"
Phil Nashd8026002010-11-09 23:24:00 +000022#include "internal/catch_capture.hpp"
23#include "internal/catch_section.hpp"
Phil Nash5cad9d52011-01-27 22:29:36 +000024#include "internal/catch_generators.hpp"
Phil Nash9430a2c2011-04-20 15:40:40 +010025#include "internal/catch_interfaces_exception.h"
Phil Nashd7c203c2011-04-28 08:03:28 +010026#include "internal/catch_approx.hpp"
Phil Nasha6a40b32012-03-04 20:10:36 +000027#include "internal/catch_matchers.hpp"
Phil Nashd8026002010-11-09 23:24:00 +000028
Phil Nash0f9c5512012-06-02 23:12:42 +010029// These files are included here so the single_include script doesn't put them
30// in the conditionally compiled sections
Phil Nashddfe9632012-08-14 19:30:30 +010031#include "internal/catch_test_case_info.h"
Phil Nash0f9c5512012-06-02 23:12:42 +010032#include "internal/catch_interfaces_runner.h"
33
Phil Nash8350ef62011-08-12 18:52:10 +010034#ifdef __OBJC__
35#include "internal/catch_objc.hpp"
36#endif
37
Phil Nash89d1e6c2011-05-24 08:23:02 +010038#if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER )
Phil Nash1091ca82012-08-06 20:16:53 +010039#include "internal/catch_impl.hpp"
Phil Nash89d1e6c2011-05-24 08:23:02 +010040#endif
41
42#ifdef CATCH_CONFIG_MAIN
43#include "internal/catch_default_main.hpp"
44#endif
45
Phil Nashd8026002010-11-09 23:24:00 +000046//////
47
Phil Nash46bcd4b2012-07-20 18:43:48 +010048// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
49#ifdef CATCH_CONFIG_PREFIX_ALL
50
Phil Nashb2ef9982012-11-10 10:35:09 +000051#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" )
52#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "CATCH_REQUIRE_FALSE" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010053
Phil Nash1af13db2012-11-10 10:20:08 +000054#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" )
55#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" )
56#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010057
Phil Nashb2ef9982012-11-10 10:35:09 +000058#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" )
59#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CATCH_CHECK_FALSE" )
60#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" )
61#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" )
Phil Nash7717c292012-11-13 09:45:29 +000062#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010063
Phil Nash1af13db2012-11-10 10:20:08 +000064#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" )
65#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" )
66#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010067
Phil Nash1af13db2012-11-10 10:20:08 +000068#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
69#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010070
Phil Nash207b27b2013-02-02 19:58:04 +000071#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
Phil Nash1af13db2012-11-10 10:20:08 +000072#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" )
73#define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" )
74#define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" )
Phil Nashe04e74f2012-10-24 21:59:47 +010075#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "CATCH_SCOPED_INFO" )
Phil Nash207b27b2013-02-02 19:58:04 +000076#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
Phil Nashe04e74f2012-10-24 21:59:47 +010077#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "CATCH_SCOPED_CAPTURE" )
Phil Nash46bcd4b2012-07-20 18:43:48 +010078
79#define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
80
81#define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
82#define CATCH_TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
83#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
84#define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
85
86#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
Phil Nash8255acf2012-11-30 19:29:03 +000087#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
Phil Nash46bcd4b2012-07-20 18:43:48 +010088
89#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
90
Phil Nash37186a12013-03-13 12:19:30 +000091// "BDD-style" convenience wrappers
92#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags )
93#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" )
94#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" )
95#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" )
96#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" )
97#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" )
98
Phil Nash46bcd4b2012-07-20 18:43:48 +010099// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
100#else
101
Phil Nashb2ef9982012-11-10 10:35:09 +0000102#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" )
103#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "REQUIRE_FALSE" )
Phil Nashd8026002010-11-09 23:24:00 +0000104
Phil Nash1af13db2012-11-10 10:20:08 +0000105#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "REQUIRE_THROWS" )
106#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" )
107#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" )
Phil Nashd8026002010-11-09 23:24:00 +0000108
Phil Nashb2ef9982012-11-10 10:35:09 +0000109#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" )
110#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CHECK_FALSE" )
111#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" )
112#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" )
Phil Nashd539da92012-11-13 09:44:52 +0000113#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" )
Phil Nashd8026002010-11-09 23:24:00 +0000114
Phil Nash1af13db2012-11-10 10:20:08 +0000115#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" )
116#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" )
117#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" )
Phil Nashd8026002010-11-09 23:24:00 +0000118
Phil Nash1af13db2012-11-10 10:20:08 +0000119#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
120#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
Phil Nasheca56372012-03-04 11:14:21 +0000121
Phil Nash207b27b2013-02-02 19:58:04 +0000122#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
Phil Nash1af13db2012-11-10 10:20:08 +0000123#define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" )
124#define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" )
125#define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" )
Phil Nashe04e74f2012-10-24 21:59:47 +0100126#define SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "SCOPED_INFO" )
Phil Nash207b27b2013-02-02 19:58:04 +0000127#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
Phil Nashe04e74f2012-10-24 21:59:47 +0100128#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "SCOPED_CAPTURE" )
Phil Nashd8026002010-11-09 23:24:00 +0000129
Phil Nash5cad9d52011-01-27 22:29:36 +0000130#define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
Phil Nashd8026002010-11-09 23:24:00 +0000131
Phil Nash3455e552010-11-10 07:42:15 +0000132#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
Phil Nashd1ee9642011-01-31 20:15:40 +0000133#define TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
Phil Nash2b05dfa2011-01-18 20:09:21 +0000134#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
Phil Nash46bcd4b2012-07-20 18:43:48 +0100135#define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
Phil Nashd8026002010-11-09 23:24:00 +0000136
Phil Nash5cad9d52011-01-27 22:29:36 +0000137#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
Phil Nash8255acf2012-11-30 19:29:03 +0000138#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
Phil Nash5cad9d52011-01-27 22:29:36 +0000139
140#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
Phil Nashd8026002010-11-09 23:24:00 +0000141
Phil Nash46bcd4b2012-07-20 18:43:48 +0100142#endif
143
144#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
Phil Nashd8026002010-11-09 23:24:00 +0000145
Phil Nash37186a12013-03-13 12:19:30 +0000146// "BDD-style" convenience wrappers
147#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags )
148#define GIVEN( desc ) SECTION( "Given: " desc, "" )
149#define WHEN( desc ) SECTION( " When: " desc, "" )
150#define AND_WHEN( desc ) SECTION( " And: " desc, "" )
151#define THEN( desc ) SECTION( " Then: " desc, "" )
152#define AND_THEN( desc ) SECTION( " And: " desc, "" )
153
Phil Nash01db6c42011-04-04 07:56:44 +0100154using Catch::Detail::Approx;
Phil Nashd8026002010-11-09 23:24:00 +0000155
Phil Nashcda21492012-08-16 18:47:41 +0100156#ifdef __clang__
Phil Nasha695eb92012-08-13 07:46:10 +0100157#pragma clang diagnostic pop
Phil Nashcda21492012-08-16 18:47:41 +0100158#endif
Phil Nasha695eb92012-08-13 07:46:10 +0100159
Phil Nash73acd942011-02-16 19:02:09 +0000160#endif // TWOBLUECUBES_CATCH_HPP_INCLUDED