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"
2012-05-04 07:55:11 +01:00
2011-01-07 10:22:24 +00:00
#include <iostream>
2010-11-29 19:40:44 +00:00
2013-11-19 07:21:03 +00:00
TEST_CASE ( "random SECTION tests" , "[.][sections][failing]" )
2010-11-29 19:40:44 +00:00
{
int a = 1 ;
int b = 2 ;
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
2010-11-29 19:40:44 +00: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
2013-11-19 07:21:03 +00:00
TEST_CASE ( "nested SECTION tests" , "[.][sections][failing]" )
2010-12-15 19:36:39 +00:00
{
int a = 1 ;
int b = 2 ;
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 );
SECTION ( "s2" , "not equal" )
{
2011-02-17 20:15:20 +00:00
REQUIRE ( a != b );
}
}
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "more nested SECTION tests" , "[sections][failing][.]" )
2011-02-17 20:15:20 +00:00
{
int a = 1 ;
int b = 2 ;
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
}
SECTION ( "s3" , "not equal" )
{
2011-02-21 08:50:05 +00:00
REQUIRE ( a != b );
}
SECTION ( "s4" , "less than" )
{
2011-02-28 08:18:52 +00:00
REQUIRE ( a < b );
2010-12-15 19:36:39 +00:00
}
}
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "even more nested SECTION tests" , "[sections]" )
2012-05-04 07:55:11 +01:00
{
SECTION ( "c" , "" )
{
SECTION ( "d (leaf)" , "" )
{
}
SECTION ( "e (leaf)" , "" )
{
}
}
SECTION ( "f (leaf)" , "" )
{
}
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "looped SECTION tests" , "[.][failing][sections]" )
2010-12-28 14:41:57 +00:00
{
int a = 1 ;
for ( int b = 0 ; b < 10 ; ++ b )
{
std :: ostringstream oss ;
oss << "b is currently: " << b ;
SECTION ( "s1" , oss . str () )
{
CHECK ( b > a );
}
}
}
2013-11-19 07:21:03 +00: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 };
for ( size_t i = 0 ; i < sizeof ( fib ) / sizeof ( int ); ++ i )
{
INFO ( "Testing if fib[" << i << "] (" << fib [ i ] << ") is even" );
CHECK ( ( fib [ i ] % 2 ) == 0 );
}
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "Sends stuff to stdout and stderr" , "" )
2010-11-30 06:48:21 +00:00
{
2013-12-19 08:07:33 +00:00
std :: cout << "A string sent directly to stdout" << std :: endl ;
2010-11-30 06:48:21 +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
2011-12-27 10:59:41 +00:00
inline const char * makeString ( bool makeNull )
2011-02-23 20:02:18 +00:00
{
return makeNull ? NULL : "valid string" ;
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "null strings" , "" )
2011-02-23 20:02:18 +00:00
{
REQUIRE ( makeString ( false ) != static_cast < char *> ( NULL ));
REQUIRE ( makeString ( true ) == static_cast < char *> ( NULL ));
}
2011-03-09 19:45:05 +00:00
2012-02-10 08:30:13 +00:00
inline bool testCheckedIf ( bool flag )
{
CHECKED_IF ( flag )
return true ;
else
return false ;
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "checkedIf" , "" )
2012-02-10 08:30:13 +00:00
{
REQUIRE ( testCheckedIf ( true ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "checkedIf, failing" , "[failing][.]" )
2012-02-10 08:30:13 +00:00
{
REQUIRE ( testCheckedIf ( false ) );
}
inline bool testCheckedElse ( bool flag )
{
CHECKED_ELSE ( flag )
return false ;
return true ;
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "checkedElse" , "" )
2012-02-10 08:30:13 +00:00
{
REQUIRE ( testCheckedElse ( true ) );
}
2013-11-19 07:21:03 +00: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
2013-11-19 07:21:03 +00:00
TEST_CASE ( "xmlentitycheck" , "" )
2012-02-10 18:58:06 +00: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>" )
{
// No test
}
SECTION ( "encoded chars" , "these should all be encoded: &&& \"\"\" <<<& \" <<& \" " )
{
// No test
}
}
2012-02-28 20:04:25 +00:00
2013-11-19 07:21:03 +00:00
TEST_CASE ( "send a single char to INFO" , "[failing][.]" )
2012-02-28 20:04:25 +00:00
{
INFO ( 3 );
REQUIRE ( false );
}
2012-02-29 08:39:22 +00:00
2013-11-19 07:21:03 +00:00
TEST_CASE ( "atomic if" , "[failing][0]" )
2012-02-29 08:39:22 +00:00
{
size_t x = 0 ;
if ( x )
REQUIRE ( x > 0 );
else
REQUIRE ( x == 0 );
}
2012-03-04 11:14:21 +00:00
2012-03-04 20:10:36 +00:00
inline const char * testStringForMatching ()
2012-03-04 11:14:21 +00:00
{
2012-03-04 20:10:36 +00:00
return "this string contains 'abc' as a substring" ;
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "String matchers" , "[matchers]" )
2012-03-17 18:20:06 +00:00
{
2012-03-04 20:10:36 +00:00
REQUIRE_THAT ( testStringForMatching (), Contains ( "string" ) );
CHECK_THAT ( testStringForMatching (), Contains ( "abc" ) );
CHECK_THAT ( testStringForMatching (), StartsWith ( "this" ) );
CHECK_THAT ( testStringForMatching (), EndsWith ( "substring" ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "Contains string matcher" , "[.][failing][matchers]" )
2012-03-04 20:10:36 +00:00
{
CHECK_THAT ( testStringForMatching (), Contains ( "not there" ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "StartsWith string matcher" , "[.][failing][matchers]" )
2012-03-04 20:10:36 +00:00
{
CHECK_THAT ( testStringForMatching (), StartsWith ( "string" ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "EndsWith string matcher" , "[.][failing][matchers]" )
2012-03-04 20:10:36 +00:00
{
CHECK_THAT ( testStringForMatching (), EndsWith ( "this" ) );
2012-03-04 11:14:21 +00:00
}
2012-05-24 08:29:03 +01:00
2013-11-19 07:21:03 +00:00
TEST_CASE ( "Equals string matcher" , "[.][failing][matchers]" )
2012-05-24 08:29:03 +01:00
{
CHECK_THAT ( testStringForMatching (), Equals ( "something else" ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "Equals string matcher, with NULL" , "[matchers]" )
2013-04-23 07:59:56 +01:00
{
REQUIRE_THAT ( "" , Equals ( NULL ));
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "AllOf matcher" , "[matchers]" )
2012-10-12 07:58:17 +01:00
{
CHECK_THAT ( testStringForMatching (), AllOf ( Catch :: Contains ( "string" ), Catch :: Contains ( "abc" ) ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "AnyOf matcher" , "[matchers]" )
2012-10-12 07:58:17 +01:00
{
CHECK_THAT ( testStringForMatching (), AnyOf ( Catch :: Contains ( "string" ), Catch :: Contains ( "not there" ) ) );
CHECK_THAT ( testStringForMatching (), AnyOf ( Catch :: Contains ( "not there" ), Catch :: Contains ( "string" ) ) );
}
2013-11-19 07:21:03 +00:00
TEST_CASE ( "Equals" , "[matchers]" )
2012-05-24 08:29:03 +01:00
{
CHECK_THAT ( testStringForMatching (), Equals ( "this string contains 'abc' as a substring" ) );
}
2012-05-31 19:40:26 +01:00
inline unsigned int Factorial ( unsigned int number )
{
// return number <= 1 ? number : Factorial(number-1)*number;
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
2013-11-19 07:21:03 +00:00
TEST_CASE ( "An empty test with no assertions" , "[empty]" )
2012-08-31 08:10:36 +01:00
{
}
2012-09-15 17:53:27 +01:00
2013-06-28 16:05:13 +01:00
TEST_CASE ( "Nice descriptive name" , "[tag1][tag2][tag3][.]" )
2012-09-15 17:53:27 +01:00
{
WARN ( "This one ran" );
}
2012-09-26 18:38:26 +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 );
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 < int > 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" , "" ) {
v . reserve ( 0 );
REQUIRE ( v . size () == 5 );
REQUIRE ( v . capacity () >= 5 );
}
}
2013-05-13 08:20:45 +01:00
// https://github.com/philsquared/Catch/issues/166
2013-11-19 07:21:03 +00: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" );
}