2010-11-29 19:40:44 +00:00
/*
* Created by Phil on 29/11/2010.
* Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
*
* 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 18:47:41 +01:00
2011-04-26 08:32:40 +01:00
#include "catch.hpp"
2015-08-07 08:20:56 +01:00
#ifdef __clang__
# pragma clang diagnostic ignored "-Wc++98-compat"
# pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
#endif
2017-09-07 11:24:33 +01:00
#include "internal/catch_xmlwriter.h"
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>
2010-11-29 19:40:44 +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
2017-07-13 09:20:37 +01:00
SECTION ( "s1" , "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
2017-07-13 09:20:37 +01:00
SECTION ( "s2" , "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
2017-07-13 09:20:37 +01:00
SECTION ( "s1" , "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 );
2017-07-13 09:20:37 +01:00
SECTION ( "s2" , "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
2017-07-13 09:20:37 +01:00
SECTION ( "s1" , "doesn't equal" ) {
SECTION ( "s2" , "equal" ) {
2011-02-21 08:50:05 +00:00
REQUIRE ( a == b );
2011-02-17 20:15:20 +00:00
}
2017-07-13 09:20:37 +01:00
SECTION ( "s3" , "not equal" ) {
2011-02-21 08:50:05 +00:00
REQUIRE ( a != b );
}
2017-07-13 09:20:37 +01:00
SECTION ( "s4" , "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)" ) {
2015-11-03 07:46:37 +00: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)" ) {
2015-11-03 07:46:37 +00: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)" ) {
2015-11-03 07:46:37 +00: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 ) {
2010-12-28 14:41:57 +00:00
std :: ostringstream oss ;
oss << "b is currently: " << b ;
2017-07-13 09:20:37 +01:00
SECTION ( "s1" , oss . str () ) {
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" , "[.]" ) {
2013-12-19 08:07:33 +00:00
std :: cout << "A string sent directly to stdout" << std :: endl ;
2015-11-04 18:01:28 +00:00
2013-12-19 08:07:33 +00:00
std :: cerr << "A string sent directly to stderr" << std :: endl ;
2010-12-28 14:41:57 +00:00
}
2011-02-23 20:02:18 +00:00
2017-07-13 09:20:37 +01:00
inline const char * makeString ( bool makeNull ) {
2017-04-25 12:41:30 +02:00
return makeNull ? nullptr : "valid string" ;
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
2012-02-10 08:30:13 +00:00
2017-07-13 09:20:37 +01:00
inline bool testCheckedIf ( bool flag ) {
2012-02-10 08:30:13 +00:00
CHECKED_IF ( flag )
return true ;
else
return false ;
}
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
inline bool testCheckedElse ( bool flag ) {
2012-02-10 08:30:13 +00:00
CHECKED_ELSE ( flag )
return false ;
2015-11-04 18:01:28 +00:00
2012-02-10 08:30:13 +00:00
return true ;
}
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
2017-07-13 09:20:37 +01:00
TEST_CASE ( "xmlentitycheck" ) {
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>" ) {
2015-11-03 07:46:37 +00:00
SUCCEED ( "" ); // We need this here to stop it failing due to no tests
2012-02-10 18:58:06 +00:00
}
2017-07-13 09:20:37 +01:00
SECTION ( "encoded chars" , "these should all be encoded: &&& \"\"\" <<<& \" <<& \" " ) {
2015-11-03 07:46:37 +00:00
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
2017-07-13 09:20:37 +01:00
TEST_CASE ( "atomic if" , "[failing][0]" ) {
2017-09-18 17:13:17 +01:00
std :: size_t x = 0 ;
2015-11-04 18:01:28 +00:00
2012-02-29 08:39:22 +00:00
if ( x )
REQUIRE ( x > 0 );
else
REQUIRE ( x == 0 );
}
2012-03-04 11:14:21 +00:00
2017-07-13 09:20:37 +01:00
inline unsigned int Factorial ( unsigned int number ) {
2012-05-31 19:40:26 +01:00
return number > 1 ? Factorial ( number - 1 ) * number : 1 ;
}
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]" ) {}
2012-10-04 08:19:09 +01:00
//
2013-06-28 16:05:13 +01:00
//TEST_CASE( "spawn a new process", "[.]" )
2012-10-04 08:19:09 +01:00
//{
// // !TBD Work in progress
// char line[200];
// FILE* output = popen("./CatchSelfTest ./failing/matchers/StartsWith", "r");
// while ( fgets(line, 199, output) )
// std::cout << line;
//}
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" ) {
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
// 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][.]" ) {
2013-07-24 19:13:08 +01:00
SECTION ( "Outer" , "" )
SECTION ( "Inner" , "" )
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
2014-06-30 07:53:11 +01:00
SUCCEED ( "" );
2014-04-15 18:44:37 +01:00
}
2014-04-22 08:19:11 +01:00
//TEST_CASE( "Is big endian" ) {
// CHECK( Catch::Detail::Endianness::which() == Catch::Detail::Endianness::Little );
//}
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
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]" ) {
2016-08-24 09:38:24 -05:00
wchar_t * const s = const_cast < wchar_t * const > ( 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]" ) {
2016-08-24 09:38:24 -05:00
wchar_t * 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
}
2014-08-22 08:07:39 +01:00
2017-02-06 16:21:01 +00:00
inline std :: string encode ( std :: string const & str , Catch :: XmlEncode :: ForWhat forWhat = Catch :: XmlEncode :: ForTextNodes ) {
2015-07-23 18:45:31 +01:00
std :: ostringstream oss ;
2017-02-06 16:21:01 +00:00
oss << Catch :: XmlEncode ( str , forWhat );
2015-07-23 18:45:31 +01:00
return oss . str ();
}
TEST_CASE ( "XmlEncode" ) {
SECTION ( "normal string" ) {
REQUIRE ( encode ( "normal string" ) == "normal string" );
}
SECTION ( "empty string" ) {
REQUIRE ( encode ( "" ) == "" );
}
SECTION ( "string with ampersand" ) {
REQUIRE ( encode ( "smith & jones" ) == "smith & jones" );
}
SECTION ( "string with less-than" ) {
REQUIRE ( encode ( "smith < jones" ) == "smith < jones" );
}
SECTION ( "string with greater-than" ) {
REQUIRE ( encode ( "smith > jones" ) == "smith > jones" );
REQUIRE ( encode ( "smith ]]> jones" ) == "smith ]]> jones" );
}
SECTION ( "string with quotes" ) {
std :: string stringWithQuotes = "don't \" quote \" me on that" ;
REQUIRE ( encode ( stringWithQuotes ) == stringWithQuotes );
REQUIRE ( encode ( stringWithQuotes , Catch :: XmlEncode :: ForAttributes ) == "don't "quote" me on that" );
}
2017-02-06 16:21:01 +00:00
SECTION ( "string with control char (1)" ) {
2017-02-06 16:00:05 +00:00
REQUIRE ( encode ( "[ \x01 ]" ) == "[ \\ x01]" );
2015-07-23 18:45:31 +01:00
}
2017-02-06 16:21:01 +00:00
SECTION ( "string with control char (x7F)" ) {
2017-02-06 16:00:05 +00:00
REQUIRE ( encode ( "[ \x7F ]" ) == "[ \\ x7F]" );
2015-07-23 18:45:31 +01:00
}
}
2017-07-13 08:52:51 +01:00
TEST_CASE ( "long long" ) {
2015-07-23 19:03:33 +01:00
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 () );
}
2014-08-22 08:13:15 +01:00
//TEST_CASE( "Divide by Zero signal handler", "[.][sig]" ) {
// int i = 0;
// int x = 10/i; // This should cause the signal to fire
// CHECK( x == 0 );
//}
2016-03-14 19:13:34 +00:00
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
static int f () {
return 1 ;
}
2017-08-11 10:38:29 +01:00
TEST_CASE ( "#835 -- errno should not be touched by Catch" , "[.][failing][!shouldfail]" ) {
2017-03-07 10:17:59 +01:00
errno = 1 ;
CHECK ( f () == 0 );
2017-05-27 14:42:54 +02:00
REQUIRE ( errno == 1 ); // Check that f() doesn't touch errno.
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" );
}
}
}