2010-11-09 18:24:00 -05:00
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
*/
|
|
|
|
|
2012-08-16 13:47:41 -04:00
|
|
|
#ifdef __clang__
|
2012-08-13 02:46:10 -04:00
|
|
|
#pragma clang diagnostic ignored "-Wpadded"
|
2012-08-16 13:47:41 -04:00
|
|
|
#endif
|
2012-08-13 02:46:10 -04:00
|
|
|
|
2017-05-07 19:26:06 -04:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
#pragma warning (disable : 4702) // Disable unreachable code warning for the last test
|
|
|
|
// that is triggered when compiling as Win32|Release
|
|
|
|
#endif
|
|
|
|
|
2020-01-20 17:24:04 -05:00
|
|
|
#include <catch2/catch_test_macros.hpp>
|
2010-11-09 18:24:00 -05:00
|
|
|
|
2020-02-04 12:41:11 -05:00
|
|
|
#include <cstdio>
|
2017-11-07 13:01:10 -05:00
|
|
|
#include <sstream>
|
2019-03-02 15:22:41 -05:00
|
|
|
#include <iostream>
|
2017-11-07 13:01:10 -05:00
|
|
|
|
2011-03-10 09:09:32 -05:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2014-12-22 15:17:26 -05:00
|
|
|
"Where there is more to the expression after the RHS",
|
2013-11-19 02:21:03 -05:00
|
|
|
"[Tricky][failing][.]"
|
2011-03-10 09:09:32 -05:00
|
|
|
)
|
2010-11-10 14:18:46 -05:00
|
|
|
{
|
2013-06-29 07:07:33 -04:00
|
|
|
// int a = 1, b = 2;
|
|
|
|
// REQUIRE( a == 2 || b == 2 );
|
2011-03-11 14:46:18 -05:00
|
|
|
WARN( "Uncomment the code in this test to check that it gives a sensible compiler error" );
|
2011-03-10 14:18:14 -05:00
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2014-12-22 15:17:26 -05:00
|
|
|
"Where the LHS is not a simple value",
|
2013-11-19 02:21:03 -05:00
|
|
|
"[Tricky][failing][.]"
|
2011-03-10 14:18:14 -05:00
|
|
|
)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
int a = 1;
|
|
|
|
int b = 2;
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2011-03-10 14:18:14 -05:00
|
|
|
// This only captures part of the expression, but issues a warning about the rest
|
|
|
|
REQUIRE( a+1 == b-1 );
|
|
|
|
*/
|
2011-03-11 14:46:18 -05:00
|
|
|
WARN( "Uncomment the code in this test to check that it gives a sensible compiler error" );
|
2010-11-11 15:37:46 -05:00
|
|
|
}
|
2010-11-29 14:40:44 -05:00
|
|
|
|
2010-11-16 14:30:41 -05:00
|
|
|
struct Opaque
|
|
|
|
{
|
|
|
|
int val;
|
2011-03-10 09:09:32 -05:00
|
|
|
bool operator ==( const Opaque& o ) const
|
2010-11-16 14:30:41 -05:00
|
|
|
{
|
2010-11-16 14:48:05 -05:00
|
|
|
return val == o.val;
|
2010-11-16 14:30:41 -05:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-03-10 09:09:32 -05:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2014-12-19 19:46:02 -05:00
|
|
|
"A failing expression with a non streamable type is still captured",
|
2013-11-19 02:21:03 -05:00
|
|
|
"[Tricky][failing][.]"
|
2011-03-10 09:09:32 -05:00
|
|
|
)
|
2010-11-16 14:30:41 -05:00
|
|
|
{
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2010-11-16 14:30:41 -05:00
|
|
|
Opaque o1, o2;
|
|
|
|
o1.val = 7;
|
|
|
|
o2.val = 8;
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2010-11-16 14:30:41 -05:00
|
|
|
CHECK( &o1 == &o2 );
|
|
|
|
CHECK( o1 == o2 );
|
2010-11-29 14:48:37 -05:00
|
|
|
}
|
2011-03-10 09:09:32 -05:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
2015-11-04 13:01:28 -05:00
|
|
|
(
|
2014-12-19 19:46:02 -05:00
|
|
|
"string literals of different sizes can be compared",
|
2013-11-19 02:21:03 -05:00
|
|
|
"[Tricky][failing][.]"
|
2011-03-10 09:09:32 -05:00
|
|
|
)
|
|
|
|
{
|
|
|
|
REQUIRE( std::string( "first" ) == "second" );
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2011-03-10 09:09:32 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
2015-11-04 13:01:28 -05:00
|
|
|
(
|
2013-11-19 02:21:03 -05:00
|
|
|
"An expression with side-effects should only be evaluated once",
|
|
|
|
"[Tricky]"
|
2011-03-10 09:09:32 -05:00
|
|
|
)
|
|
|
|
{
|
|
|
|
int i = 7;
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2011-03-10 09:09:32 -05:00
|
|
|
REQUIRE( i++ == 7 );
|
|
|
|
REQUIRE( i++ == 8 );
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2011-03-10 09:09:32 -05:00
|
|
|
}
|
2011-04-06 17:26:16 -04:00
|
|
|
|
|
|
|
namespace A {
|
|
|
|
struct X
|
|
|
|
{
|
|
|
|
X() : a(4), b(2), c(7) {}
|
|
|
|
X(int v) : a(v), b(2), c(7) {}
|
|
|
|
int a;
|
|
|
|
int b;
|
|
|
|
int c;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace B {
|
|
|
|
struct Y
|
|
|
|
{
|
|
|
|
Y() : a(4), b(2), c(7) {}
|
|
|
|
Y(int v) : a(v), b(2), c(7) {}
|
|
|
|
int a;
|
|
|
|
int b;
|
|
|
|
int c;
|
|
|
|
};
|
|
|
|
}
|
2011-12-27 05:59:41 -05:00
|
|
|
|
|
|
|
inline bool operator==(const A::X& lhs, const B::Y& rhs)
|
2011-04-06 17:26:16 -04:00
|
|
|
{
|
|
|
|
return (lhs.a == rhs.a);
|
|
|
|
}
|
|
|
|
|
2011-12-27 05:59:41 -05:00
|
|
|
inline bool operator==(const B::Y& lhs, const A::X& rhs)
|
2011-04-06 17:26:16 -04:00
|
|
|
{
|
|
|
|
return (lhs.a == rhs.a);
|
|
|
|
}
|
|
|
|
|
2011-12-27 05:59:41 -05:00
|
|
|
|
2011-04-06 17:26:16 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2011-12-27 05:59:41 -05:00
|
|
|
/* This, currently, does not compile with LLVM
|
2011-04-06 17:26:16 -04:00
|
|
|
TEST_CASE
|
|
|
|
(
|
|
|
|
"Operators at different namespace levels not hijacked by Koenig lookup"
|
2013-11-19 02:21:03 -05:00
|
|
|
"[Tricky]"
|
2011-04-06 17:26:16 -04:00
|
|
|
)
|
|
|
|
{
|
|
|
|
A::X x;
|
|
|
|
B::Y y;
|
|
|
|
REQUIRE( x == y );
|
|
|
|
}
|
2011-12-27 05:59:41 -05:00
|
|
|
*/
|
2011-04-06 17:26:16 -04:00
|
|
|
|
|
|
|
namespace ObjectWithConversions
|
2015-11-04 13:01:28 -05:00
|
|
|
{
|
|
|
|
struct Object
|
2011-04-06 17:26:16 -04:00
|
|
|
{
|
2017-10-13 09:16:14 -04:00
|
|
|
operator unsigned int() const {return 0xc0000000;}
|
2011-04-06 17:26:16 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2018-07-02 04:57:19 -04:00
|
|
|
"Implicit conversions are supported inside assertion macros",
|
2017-09-01 14:28:49 -04:00
|
|
|
"[Tricky][approvals]"
|
2011-04-06 17:26:16 -04:00
|
|
|
)
|
2015-11-04 13:01:28 -05:00
|
|
|
{
|
2013-04-16 17:55:31 -04:00
|
|
|
Object o;
|
2011-04-11 03:32:55 -04:00
|
|
|
REQUIRE(0xc0000000 == o );
|
2011-04-06 17:26:16 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace EnumBitFieldTests
|
|
|
|
{
|
2017-09-01 14:28:49 -04:00
|
|
|
enum Bits : uint32_t {
|
|
|
|
bit0 = 0x0001,
|
|
|
|
bit1 = 0x0002,
|
|
|
|
bit2 = 0x0004,
|
|
|
|
bit3 = 0x0008,
|
|
|
|
bit1and2 = bit1 | bit2,
|
|
|
|
bit30 = 0x40000000,
|
|
|
|
bit31 = 0x80000000,
|
|
|
|
bit30and31 = bit30 | bit31
|
|
|
|
};
|
2011-04-06 17:26:16 -04:00
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Test enum bit values", "[Tricky]" )
|
2011-04-06 17:26:16 -04:00
|
|
|
{
|
|
|
|
REQUIRE( 0xc0000000 == bit30and31 );
|
|
|
|
}
|
|
|
|
}
|
2011-04-11 03:32:55 -04:00
|
|
|
|
|
|
|
struct Obj
|
|
|
|
{
|
|
|
|
Obj():prop(&p){}
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2020-08-19 11:44:22 -04:00
|
|
|
int p = 0;
|
2011-04-11 03:32:55 -04:00
|
|
|
int* prop;
|
|
|
|
};
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE("boolean member", "[Tricky]")
|
2011-04-11 03:32:55 -04:00
|
|
|
{
|
|
|
|
Obj obj;
|
2017-04-25 06:41:30 -04:00
|
|
|
REQUIRE( obj.prop != nullptr );
|
2011-04-11 03:32:55 -04:00
|
|
|
}
|
2011-08-09 03:18:27 -04:00
|
|
|
|
|
|
|
// Tests for a problem submitted by Ralph McArdell
|
|
|
|
//
|
|
|
|
// The static bool value should not need to be defined outside the
|
|
|
|
// struct it is declared in - but when evaluating it in a deduced
|
|
|
|
// context it appears to require the extra definition.
|
|
|
|
// The issue was fixed by adding bool overloads to bypass the
|
2013-11-19 02:21:03 -05:00
|
|
|
// templates that were there to deduce it.
|
2011-08-09 03:18:27 -04:00
|
|
|
template <bool B>
|
|
|
|
struct is_true
|
|
|
|
{
|
|
|
|
static const bool value = B;
|
|
|
|
};
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "(unimplemented) static bools can be evaluated", "[Tricky]" )
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
2018-06-25 14:04:29 -04:00
|
|
|
SECTION("compare to true")
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
|
|
|
REQUIRE( is_true<true>::value == true );
|
|
|
|
REQUIRE( true == is_true<true>::value );
|
|
|
|
}
|
2018-06-25 14:04:29 -04:00
|
|
|
SECTION("compare to false")
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
|
|
|
REQUIRE( is_true<false>::value == false );
|
|
|
|
REQUIRE( false == is_true<false>::value );
|
|
|
|
}
|
|
|
|
|
2018-06-25 14:04:29 -04:00
|
|
|
SECTION("negation")
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
|
|
|
REQUIRE( !is_true<false>::value );
|
|
|
|
}
|
|
|
|
|
2018-06-25 14:04:29 -04:00
|
|
|
SECTION("double negation")
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
|
|
|
REQUIRE( !!is_true<true>::value );
|
|
|
|
}
|
|
|
|
|
2018-06-25 14:04:29 -04:00
|
|
|
SECTION("direct")
|
2011-08-09 03:18:27 -04:00
|
|
|
{
|
|
|
|
REQUIRE( is_true<true>::value );
|
|
|
|
REQUIRE_FALSE( is_true<false>::value );
|
|
|
|
}
|
|
|
|
}
|
2012-02-09 03:34:01 -05:00
|
|
|
|
|
|
|
// Uncomment these tests to produce an error at test registration time
|
|
|
|
/*
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Tests with the same name are not allowed", "[Tricky]" )
|
2012-02-09 03:34:01 -05:00
|
|
|
{
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2012-02-09 03:34:01 -05:00
|
|
|
}
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Tests with the same name are not allowed", "[Tricky]" )
|
2012-02-09 03:34:01 -05:00
|
|
|
{
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2012-02-09 03:34:01 -05:00
|
|
|
}
|
2012-05-24 03:23:55 -04:00
|
|
|
*/
|
2012-10-28 16:57:21 -04:00
|
|
|
|
|
|
|
struct Boolable
|
|
|
|
{
|
|
|
|
explicit Boolable( bool value ) : m_value( value ) {}
|
|
|
|
|
2017-04-25 10:46:48 -04:00
|
|
|
explicit operator bool() const {
|
|
|
|
return m_value;
|
2012-10-28 16:57:21 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool m_value;
|
|
|
|
};
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Objects that evaluated in boolean contexts can be checked", "[Tricky][SafeBool]" )
|
2012-10-28 16:57:21 -04:00
|
|
|
{
|
|
|
|
Boolable True( true );
|
|
|
|
Boolable False( false );
|
|
|
|
|
|
|
|
CHECK( True );
|
|
|
|
CHECK( !False );
|
|
|
|
CHECK_FALSE( False );
|
|
|
|
}
|
2013-03-06 14:40:16 -05:00
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Assertions then sections", "[Tricky]" )
|
2013-03-06 14:40:16 -05:00
|
|
|
{
|
|
|
|
// This was causing a failure due to the way the console reporter was handling
|
|
|
|
// the current section
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2017-11-21 15:39:40 -05:00
|
|
|
REQUIRE( true );
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2017-07-13 04:20:37 -04:00
|
|
|
SECTION( "A section" )
|
2013-03-06 14:40:16 -05:00
|
|
|
{
|
2017-11-21 15:39:40 -05:00
|
|
|
REQUIRE( true );
|
2015-11-04 13:01:28 -05:00
|
|
|
|
2017-07-13 04:20:37 -04:00
|
|
|
SECTION( "Another section" )
|
2013-03-06 14:40:16 -05:00
|
|
|
{
|
2017-11-21 15:39:40 -05:00
|
|
|
REQUIRE( true );
|
2013-03-06 14:40:16 -05:00
|
|
|
}
|
2017-07-13 04:20:37 -04:00
|
|
|
SECTION( "Another other section" )
|
2013-03-06 14:40:16 -05:00
|
|
|
{
|
2017-11-21 15:39:40 -05:00
|
|
|
REQUIRE( true );
|
2013-03-06 14:40:16 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-04-12 05:43:06 -04:00
|
|
|
|
2013-04-16 17:55:31 -04:00
|
|
|
struct Awkward
|
2013-04-12 05:43:06 -04:00
|
|
|
{
|
|
|
|
operator int() const { return 7; }
|
|
|
|
};
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "non streamable - with conv. op", "[Tricky]" )
|
2013-04-20 18:12:17 -04:00
|
|
|
{
|
|
|
|
Awkward awkward;
|
2017-05-02 17:51:03 -04:00
|
|
|
std::string s = ::Catch::Detail::stringify( awkward );
|
2013-04-20 18:12:17 -04:00
|
|
|
REQUIRE( s == "7" );
|
|
|
|
}
|
2013-04-22 13:55:12 -04:00
|
|
|
|
2013-07-01 13:45:19 -04:00
|
|
|
inline void foo() {}
|
|
|
|
|
|
|
|
typedef void (*fooptr_t)();
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "Comparing function pointers", "[Tricky][function pointer]" )
|
2013-07-01 13:45:19 -04:00
|
|
|
{
|
|
|
|
// This was giving a warning in VS2010
|
|
|
|
// #179
|
|
|
|
fooptr_t a = foo;
|
|
|
|
|
|
|
|
REQUIRE( a );
|
|
|
|
REQUIRE( a == &foo );
|
|
|
|
}
|
|
|
|
|
2014-01-07 12:25:27 -05:00
|
|
|
struct S
|
|
|
|
{
|
|
|
|
void f() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2017-09-01 14:28:49 -04:00
|
|
|
TEST_CASE( "Comparing member function pointers", "[Tricky][member function pointer][approvals]" )
|
2014-01-07 12:25:27 -05:00
|
|
|
{
|
|
|
|
typedef void (S::*MF)();
|
|
|
|
MF m = &S::f;
|
|
|
|
|
|
|
|
CHECK( m == &S::f );
|
|
|
|
}
|
|
|
|
|
2013-07-01 13:45:19 -04:00
|
|
|
class ClassName {};
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "pointer to class", "[Tricky]" )
|
2013-07-01 13:45:19 -04:00
|
|
|
{
|
|
|
|
ClassName *p = 0;
|
2013-07-01 14:00:55 -04:00
|
|
|
REQUIRE( p == 0 );
|
2013-07-01 13:45:19 -04:00
|
|
|
}
|
|
|
|
|
2013-04-22 13:55:12 -04:00
|
|
|
#include <memory>
|
|
|
|
|
2017-07-13 03:52:51 -04:00
|
|
|
TEST_CASE( "null_ptr", "[Tricky]" )
|
2013-04-22 13:55:12 -04:00
|
|
|
{
|
|
|
|
std::unique_ptr<int> ptr;
|
|
|
|
REQUIRE(ptr.get() == nullptr);
|
|
|
|
}
|
|
|
|
|
2013-11-19 02:21:03 -05:00
|
|
|
TEST_CASE( "X/level/0/a", "[Tricky]" ) { SUCCEED(""); }
|
|
|
|
TEST_CASE( "X/level/0/b", "[Tricky][fizz]" ){ SUCCEED(""); }
|
|
|
|
TEST_CASE( "X/level/1/a", "[Tricky]" ) { SUCCEED(""); }
|
|
|
|
TEST_CASE( "X/level/1/b", "[Tricky]" ) { SUCCEED(""); }
|
2017-02-13 10:56:25 -05:00
|
|
|
|
2017-07-13 04:20:37 -04:00
|
|
|
TEST_CASE( "has printf" ) {
|
2017-02-13 10:56:25 -05:00
|
|
|
|
2017-08-11 05:38:29 -04:00
|
|
|
// This can cause problems as, currently, stdout itself is not redirected - only the cout (and cerr) buffer
|
|
|
|
printf( "loose text artifact\n" );
|
2017-02-13 10:56:25 -05:00
|
|
|
}
|
2017-04-26 11:12:48 -04:00
|
|
|
|
2017-05-03 13:10:27 -04:00
|
|
|
namespace {
|
|
|
|
struct constructor_throws {
|
2017-09-07 10:51:33 -04:00
|
|
|
[[noreturn]] constructor_throws() {
|
2017-05-03 13:10:27 -04:00
|
|
|
throw 1;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2017-04-26 11:12:48 -04:00
|
|
|
|
2017-05-03 13:10:27 -04:00
|
|
|
TEST_CASE("Commas in various macros are allowed") {
|
|
|
|
REQUIRE_THROWS( std::vector<constructor_throws>{constructor_throws{}, constructor_throws{}} );
|
|
|
|
CHECK_THROWS( std::vector<constructor_throws>{constructor_throws{}, constructor_throws{}} );
|
|
|
|
REQUIRE_NOTHROW( std::vector<int>{1, 2, 3} == std::vector<int>{1, 2, 3} );
|
|
|
|
CHECK_NOTHROW( std::vector<int>{1, 2, 3} == std::vector<int>{1, 2, 3} );
|
|
|
|
|
|
|
|
REQUIRE(std::vector<int>{1, 2} == std::vector<int>{1, 2});
|
|
|
|
CHECK( std::vector<int>{1, 2} == std::vector<int>{1, 2} );
|
|
|
|
REQUIRE_FALSE(std::vector<int>{1, 2} == std::vector<int>{1, 2, 3});
|
|
|
|
CHECK_FALSE( std::vector<int>{1, 2} == std::vector<int>{1, 2, 3} );
|
|
|
|
|
|
|
|
CHECK_NOFAIL( std::vector<int>{1, 2} == std::vector<int>{1, 2} );
|
|
|
|
CHECKED_IF( std::vector<int>{1, 2} == std::vector<int>{1, 2} ) {
|
|
|
|
REQUIRE(true);
|
|
|
|
} CHECKED_ELSE( std::vector<int>{1, 2} == std::vector<int>{1, 2} ) {
|
|
|
|
CHECK(true);
|
|
|
|
}
|
2017-04-26 11:12:48 -04:00
|
|
|
}
|
2017-08-10 12:10:13 -04:00
|
|
|
|
2017-08-17 11:55:35 -04:00
|
|
|
TEST_CASE( "non-copyable objects", "[.][failing]" ) {
|
2017-08-17 11:48:46 -04:00
|
|
|
// Thanks to Agustin Bergé (@k-ballo on the cpplang Slack) for raising this
|
|
|
|
std::type_info const& ti = typeid(int);
|
|
|
|
CHECK( ti == typeid(int) );
|
|
|
|
}
|
2017-09-06 08:42:44 -04:00
|
|
|
|
2019-03-02 15:22:41 -05:00
|
|
|
TEST_CASE("#1514: stderr/stdout is not captured in tests aborted by an exception", "[output-capture][regression][.]") {
|
2019-03-06 15:53:17 -05:00
|
|
|
std::cout << "This would not be caught previously\n" << std::flush;
|
|
|
|
std::clog << "Nor would this\n" << std::flush;
|
2019-03-02 15:22:41 -05:00
|
|
|
// FAIL aborts the test by throwing a Catch exception
|
|
|
|
FAIL("1514");
|
|
|
|
}
|