2010-11-29 20:40:44 +01: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 19:47:41 +02:00
# ifdef __clang__
2012-08-13 08:46:10 +02:00
# pragma clang diagnostic ignored "-Wpadded"
2012-08-16 19:47:41 +02:00
# endif
2010-11-29 20:40:44 +01:00
2011-04-26 09:32:40 +02:00
# include "catch.hpp"
2012-05-04 08:55:11 +02:00
# include "catch_self_test.hpp"
2011-01-07 11:22:24 +01:00
# include <iostream>
2010-11-29 20:40:44 +01:00
2011-01-14 09:47:43 +01:00
TEST_CASE ( " ./succeeding/Misc/Sections " , " random SECTION tests " )
2010-11-29 20:40:44 +01:00
{
int a = 1 ;
int b = 2 ;
SECTION ( " s1 " , " doesn't equal " )
{
2010-12-14 10:00:09 +01:00
REQUIRE ( a ! = b ) ;
REQUIRE ( b ! = a ) ;
2010-11-29 20:40:44 +01:00
}
2010-11-30 07:48:21 +01:00
2010-11-29 20:40:44 +01:00
SECTION ( " s2 " , " not equal " )
{
2011-02-17 21:15:20 +01:00
REQUIRE ( a ! = b ) ;
2010-11-29 20:40:44 +01:00
}
}
2010-11-30 07:48:21 +01:00
2011-01-14 09:47:43 +01:00
TEST_CASE ( " ./succeeding/Misc/Sections/nested " , " nested SECTION tests " )
2010-12-15 20:36:39 +01:00
{
int a = 1 ;
int b = 2 ;
SECTION ( " s1 " , " doesn't equal " )
{
2010-12-28 18:21:29 +01:00
REQUIRE ( a ! = b ) ;
2010-12-15 20:36:39 +01:00
REQUIRE ( b ! = a ) ;
SECTION ( " s2 " , " not equal " )
{
2011-02-17 21:15:20 +01:00
REQUIRE ( a ! = b ) ;
}
}
}
2011-02-21 19:50:35 +01:00
TEST_CASE ( " ./mixed/Misc/Sections/nested2 " , " nested SECTION tests " )
2011-02-17 21:15:20 +01:00
{
int a = 1 ;
int b = 2 ;
SECTION ( " s1 " , " doesn't equal " )
{
SECTION ( " s2 " , " equal " )
{
2011-02-21 09:50:05 +01:00
REQUIRE ( a = = b ) ;
2011-02-17 21:15:20 +01:00
}
SECTION ( " s3 " , " not equal " )
{
2011-02-21 09:50:05 +01:00
REQUIRE ( a ! = b ) ;
}
SECTION ( " s4 " , " less than " )
{
2011-02-28 09:18:52 +01:00
REQUIRE ( a < b ) ;
2010-12-15 20:36:39 +01:00
}
}
}
2012-05-04 08:55:11 +02:00
TEST_CASE ( " ./Sections/nested/a/b " , " nested SECTION tests " )
{
SECTION ( " c " , " " )
{
SECTION ( " d (leaf) " , " " )
{
}
SECTION ( " e (leaf) " , " " )
{
}
}
SECTION ( " f (leaf) " , " " )
{
}
}
TEST_CASE ( " Sections/nested3 " , " nested SECTION tests " )
{
Catch : : EmbeddedRunner runner ;
runner . runMatching ( " ./Sections/nested/a/b " , " mock " ) ;
CHECK ( runner . getLog ( ) = =
2012-07-16 09:58:28 +02:00
" \\ [g] ./Sections/nested/a/b \n "
" \\ [tc] ./Sections/nested/a/b \n "
2012-05-05 20:32:52 +02:00
2012-07-16 09:58:28 +02:00
" \\ [s] c \n "
" \\ [s] d (leaf) \n "
" / [s] d (leaf) \n "
" / [s] c \n "
2012-05-05 20:32:52 +02:00
2012-07-16 09:58:28 +02:00
" \\ [s] c \n "
" \\ [s] e (leaf) \n "
" / [s] e (leaf) \n "
" / [s] c \n "
2012-05-05 20:32:52 +02:00
2012-07-16 09:58:28 +02:00
" \\ [s] c \n "
" / [s] c \n "
2012-05-05 20:32:52 +02:00
2012-07-16 09:58:28 +02:00
" \\ [s] f (leaf) \n "
" / [s] f (leaf) \n "
2012-05-05 20:32:52 +02:00
2012-07-16 09:58:28 +02:00
" /[tc] ./Sections/nested/a/b \n "
" /[g] ./Sections/nested/a/b \n " ) ;
2012-05-04 08:55:11 +02:00
}
2011-01-14 09:47:43 +01:00
TEST_CASE ( " ./mixed/Misc/Sections/loops " , " looped SECTION tests " )
2010-12-28 15:41:57 +01: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 ) ;
}
}
}
2011-01-14 09:47:43 +01:00
TEST_CASE ( " ./mixed/Misc/loops " , " looped tests " )
2010-12-28 15:41:57 +01: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 ) ;
}
}
2011-01-14 09:47:43 +01:00
TEST_CASE ( " ./succeeding/Misc/stdout,stderr " , " Sends stuff to stdout and stderr " )
2010-11-30 07:48:21 +01:00
{
2012-02-22 10:42:34 +01:00
std : : cout < < " Some information " < < std : : endl ;
2010-11-30 07:48:21 +01:00
2012-02-22 10:42:34 +01:00
std : : cerr < < " An error " < < std : : endl ;
2010-12-28 15:41:57 +01:00
}
2011-02-23 21:02:18 +01:00
2011-12-27 11:59:41 +01:00
inline const char * makeString ( bool makeNull )
2011-02-23 21:02:18 +01:00
{
return makeNull ? NULL : " valid string " ;
}
TEST_CASE ( " ./succeeding/Misc/null strings " , " " )
{
REQUIRE ( makeString ( false ) ! = static_cast < char * > ( NULL ) ) ;
REQUIRE ( makeString ( true ) = = static_cast < char * > ( NULL ) ) ;
}
2011-03-09 20:45:05 +01:00
TEST_CASE ( " ./failing/info " , " sends information to INFO " )
{
INFO ( " hi " ) ;
int i = 7 ;
CAPTURE ( i ) ;
REQUIRE ( false ) ;
}
2012-02-10 09:30:13 +01:00
inline bool testCheckedIf ( bool flag )
{
CHECKED_IF ( flag )
return true ;
else
return false ;
}
TEST_CASE ( " ./succeeding/checkedif " , " " )
{
REQUIRE ( testCheckedIf ( true ) ) ;
}
TEST_CASE ( " ./failing/checkedif " , " " )
{
REQUIRE ( testCheckedIf ( false ) ) ;
}
inline bool testCheckedElse ( bool flag )
{
CHECKED_ELSE ( flag )
return false ;
return true ;
}
TEST_CASE ( " ./succeeding/checkedelse " , " " )
{
REQUIRE ( testCheckedElse ( true ) ) ;
}
TEST_CASE ( " ./failing/checkedelse " , " " )
{
REQUIRE ( testCheckedElse ( false ) ) ;
}
2012-02-10 19:58:06 +01:00
TEST_CASE ( " ./misc/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> " )
{
// No test
}
SECTION ( " encoded chars " , " these should all be encoded: &&& \" \" \" <<<& \" <<& \" " )
{
// No test
}
}
2012-02-28 21:04:25 +01:00
TEST_CASE ( " ./manual/onechar " , " send a single char to INFO " )
{
INFO ( 3 ) ;
REQUIRE ( false ) ;
}
2012-02-29 09:39:22 +01:00
TEST_CASE ( " ./succeeding/atomic if " , " " )
{
size_t x = 0 ;
if ( x )
REQUIRE ( x > 0 ) ;
else
REQUIRE ( x = = 0 ) ;
}
2012-03-04 12:14:21 +01:00
2012-03-04 21:10:36 +01:00
inline const char * testStringForMatching ( )
{
return " this string contains 'abc' as a substring " ;
}
TEST_CASE ( " ./succeeding/matchers " , " " )
2012-03-17 19:20:06 +01:00
{
2012-03-04 21:10:36 +01:00
REQUIRE_THAT ( testStringForMatching ( ) , Contains ( " string " ) ) ;
CHECK_THAT ( testStringForMatching ( ) , Contains ( " abc " ) ) ;
CHECK_THAT ( testStringForMatching ( ) , StartsWith ( " this " ) ) ;
CHECK_THAT ( testStringForMatching ( ) , EndsWith ( " substring " ) ) ;
2012-03-04 12:14:21 +01:00
}
2012-03-04 21:10:36 +01:00
TEST_CASE ( " ./failing/matchers/Contains " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , Contains ( " not there " ) ) ;
}
2012-03-04 12:14:21 +01:00
2012-03-04 21:10:36 +01:00
TEST_CASE ( " ./failing/matchers/StartsWith " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , StartsWith ( " string " ) ) ;
}
2012-03-04 12:14:21 +01:00
2012-03-04 21:10:36 +01:00
TEST_CASE ( " ./failing/matchers/EndsWith " , " " )
2012-03-04 12:14:21 +01:00
{
2012-03-04 21:10:36 +01:00
CHECK_THAT ( testStringForMatching ( ) , EndsWith ( " this " ) ) ;
2012-03-04 12:14:21 +01:00
}
2012-05-24 09:29:03 +02:00
TEST_CASE ( " ./failing/matchers/Equals " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , Equals ( " something else " ) ) ;
}
2012-10-12 08:58:17 +02:00
TEST_CASE ( " /succeeding/matchers/AllOf " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , AllOf ( Catch : : Contains ( " string " ) , Catch : : Contains ( " abc " ) ) ) ;
}
TEST_CASE ( " /succeeding/matchers/AnyOf " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , AnyOf ( Catch : : Contains ( " string " ) , Catch : : Contains ( " not there " ) ) ) ;
CHECK_THAT ( testStringForMatching ( ) , AnyOf ( Catch : : Contains ( " not there " ) , Catch : : Contains ( " string " ) ) ) ;
}
2012-05-24 09:29:03 +02:00
TEST_CASE ( " ./succeeding/matchers/Equals " , " " )
{
CHECK_THAT ( testStringForMatching ( ) , Equals ( " this string contains 'abc' as a substring " ) ) ;
}
2012-05-31 20:40:26 +02:00
inline unsigned int Factorial ( unsigned int number )
{
// return number <= 1 ? number : Factorial(number-1)*number;
return number > 1 ? Factorial ( number - 1 ) * number : 1 ;
}
TEST_CASE ( " example/factorial " , " The Factorial function should return the factorial of the number passed in " )
{
REQUIRE ( Factorial ( 0 ) = = 1 ) ;
REQUIRE ( Factorial ( 1 ) = = 1 ) ;
REQUIRE ( Factorial ( 2 ) = = 2 ) ;
REQUIRE ( Factorial ( 3 ) = = 6 ) ;
REQUIRE ( Factorial ( 10 ) = = 3628800 ) ;
}
2012-08-31 09:10:36 +02:00
TEST_CASE ( " empty " , " An empty test with no assertions " )
{
}
2012-09-15 18:53:27 +02:00
2012-09-26 19:38:26 +02:00
TEST_CASE ( " Nice descriptive name " , " [tag1][tag2][tag3][hide] " )
2012-09-15 18:53:27 +02:00
{
WARN ( " This one ran " ) ;
}
2012-09-26 19:38:26 +02:00
TEST_CASE ( " first tag " , " [tag1] " )
{
}
TEST_CASE ( " second tag " , " [tag2] " )
{
}
2012-10-04 09:19:09 +02:00
//
//TEST_CASE( "spawn a new process", "[hide]" )
//{
// // !TBD Work in progress
// char line[200];
// FILE* output = popen("./CatchSelfTest ./failing/matchers/StartsWith", "r");
// while ( fgets(line, 199, output) )
// std::cout << line;
//}