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
2011-04-26 09:32:40 +02:00
# include "catch.hpp"
2012-05-04 08:55:11 +02:00
2011-01-07 11:22:24 +01:00
# include <iostream>
2010-11-29 20:40:44 +01:00
2013-12-09 17:01:23 +01:00
namespace MiscTests
2010-11-29 20:40:44 +01:00
{
2010-11-30 07:48:21 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " random SECTION tests " , " [.][sections][failing] " )
2010-11-29 20:40:44 +01:00
{
2013-12-09 17:01:23 +01:00
int a = 1 ;
int b = 2 ;
2010-12-15 20:36:39 +01:00
2013-12-09 17:01:23 +01:00
SECTION ( " s1 " , " doesn't equal " )
{
REQUIRE ( a ! = b ) ;
REQUIRE ( b ! = a ) ;
}
2010-12-15 20:36:39 +01:00
SECTION ( " s2 " , " not equal " )
{
2011-02-17 21:15:20 +01:00
REQUIRE ( a ! = b ) ;
}
}
2013-12-09 17:01:23 +01:00
TEST_CASE ( " nested SECTION tests " , " [.][sections][failing] " )
2013-12-09 16:14:47 +01:00
{
2013-12-09 17:01:23 +01:00
int a = 1 ;
int b = 2 ;
SECTION ( " s1 " , " doesn't equal " )
2013-12-09 16:14:47 +01:00
{
REQUIRE ( a ! = b ) ;
2013-12-09 17:01:23 +01:00
REQUIRE ( b ! = a ) ;
SECTION ( " s2 " , " not equal " )
{
REQUIRE ( a ! = b ) ;
}
2013-12-09 16:14:47 +01:00
}
2013-12-09 17:01:23 +01:00
}
TEST_CASE ( " more nested SECTION tests " , " [sections][failing][.] " )
{
int a = 1 ;
int b = 2 ;
SECTION ( " s1 " , " doesn't equal " )
2011-02-21 09:50:05 +01:00
{
2013-12-09 17:01:23 +01:00
SECTION ( " s2 " , " equal " )
{
REQUIRE ( a = = b ) ;
}
SECTION ( " s3 " , " not equal " )
{
REQUIRE ( a ! = b ) ;
}
SECTION ( " s4 " , " less than " )
{
REQUIRE ( a < b ) ;
}
2010-12-15 20:36:39 +01:00
}
}
2013-12-09 17:01:23 +01:00
TEST_CASE ( " even more nested SECTION tests " , " [sections] " )
2012-05-04 08:55:11 +02:00
{
2013-12-09 17:01:23 +01:00
SECTION ( " c " , " " )
2012-05-04 08:55:11 +02:00
{
2013-12-09 17:01:23 +01:00
SECTION ( " d (leaf) " , " " )
{
}
2013-12-09 16:14:47 +01:00
2013-12-09 17:01:23 +01:00
SECTION ( " e (leaf) " , " " )
{
}
}
SECTION ( " f (leaf) " , " " )
2012-05-04 08:55:11 +02:00
{
}
}
2013-12-09 17:01:23 +01:00
TEST_CASE ( " looped SECTION tests " , " [.][failing][sections] " )
2012-05-04 08:55:11 +02:00
{
2013-12-09 17:01:23 +01:00
int a = 1 ;
2013-11-17 15:18:02 +01:00
2013-12-09 17:01:23 +01:00
for ( int b = 0 ; b < 10 ; + + b )
2013-11-17 15:18:02 +01:00
{
2013-12-09 17:01:23 +01:00
std : : ostringstream oss ;
oss < < " b is currently: " < < b ;
SECTION ( " s1 " , oss . str ( ) )
{
CHECK ( b > a ) ;
}
2013-11-17 15:18:02 +01:00
}
2010-12-28 15:41:57 +01:00
}
2013-12-09 17:01:23 +01:00
TEST_CASE ( " looped tests " , " [.][failing] " )
2013-11-17 15:18:02 +01:00
{
2013-12-09 17:01:23 +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 ) ;
}
2013-11-17 15:18:02 +01:00
}
2011-02-23 21:02:18 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Sends stuff to stdout and stderr " , " " )
{
std : : cout < < " Some information " < < std : : endl ;
2013-12-09 16:14:47 +01:00
2013-12-09 17:01:23 +01:00
std : : cerr < < " An error " < < std : : endl ;
}
2011-03-09 20:45:05 +01:00
2013-12-09 17:01:23 +01:00
inline const char * makeString ( bool makeNull )
{
return makeNull ? NULL : " valid string " ;
}
2012-02-10 09:30:13 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " null strings " , " " )
{
REQUIRE ( makeString ( false ) ! = static_cast < char * > ( NULL ) ) ;
REQUIRE ( makeString ( true ) = = static_cast < char * > ( NULL ) ) ;
}
2012-02-10 09:30:13 +01:00
2013-12-09 17:01:23 +01:00
inline bool testCheckedIf ( bool flag )
{
CHECKED_IF ( flag )
return true ;
else
return false ;
}
2012-02-10 09:30:13 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " checkedIf " , " " )
{
REQUIRE ( testCheckedIf ( true ) ) ;
}
2013-12-09 16:14:47 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " checkedIf, failing " , " [failing][.] " )
{
REQUIRE ( testCheckedIf ( false ) ) ;
}
2013-12-09 16:14:47 +01:00
2013-12-09 17:01:23 +01:00
inline bool testCheckedElse ( bool flag )
{
CHECKED_ELSE ( flag )
return false ;
2012-02-10 09:30:13 +01:00
2013-12-09 17:01:23 +01:00
return true ;
}
2012-02-10 19:58:06 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " checkedElse " , " " )
{
REQUIRE ( testCheckedElse ( true ) ) ;
}
2013-11-17 15:18:02 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " checkedElse, failing " , " [failing][.] " )
2012-02-10 19:58:06 +01:00
{
2013-12-09 17:01:23 +01:00
REQUIRE ( testCheckedElse ( false ) ) ;
2012-02-10 19:58:06 +01:00
}
2013-12-09 17:01:23 +01:00
TEST_CASE ( " xmlentitycheck " , " " )
2013-11-17 15:18:02 +01:00
{
2013-12-09 17:01:23 +01: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
}
2013-11-17 15:18:02 +01:00
}
2012-02-29 09:39:22 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " send a single char to INFO " , " [failing][.] " )
{
INFO ( 3 ) ;
REQUIRE ( false ) ;
}
2013-12-09 16:14:47 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " atomic if " , " [failing][0] " )
{
size_t x = 0 ;
2012-02-29 09:39:22 +01:00
2013-12-09 17:01:23 +01:00
if ( x )
REQUIRE ( x > 0 ) ;
else
REQUIRE ( x = = 0 ) ;
}
2012-03-04 12:14:21 +01:00
2013-12-09 17:01:23 +01:00
inline const char * testStringForMatching ( )
{
return " this string contains 'abc' as a substring " ;
}
2012-03-04 21:10:36 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " String matchers " , " [matchers] " )
{
REQUIRE_THAT ( testStringForMatching ( ) , Contains ( " string " ) ) ;
CHECK_THAT ( testStringForMatching ( ) , Contains ( " abc " ) ) ;
2012-03-04 21:10:36 +01:00
2013-12-09 17:01:23 +01:00
CHECK_THAT ( testStringForMatching ( ) , StartsWith ( " this " ) ) ;
CHECK_THAT ( testStringForMatching ( ) , EndsWith ( " substring " ) ) ;
}
2012-03-04 12:14:21 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Contains string matcher " , " [.][failing][matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , Contains ( " not there " ) ) ;
}
2012-03-04 12:14:21 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " StartsWith string matcher " , " [.][failing][matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , StartsWith ( " string " ) ) ;
}
2012-03-04 12:14:21 +01:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " EndsWith string matcher " , " [.][failing][matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , EndsWith ( " this " ) ) ;
}
2012-05-24 09:29:03 +02:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Equals string matcher " , " [.][failing][matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , Equals ( " something else " ) ) ;
}
TEST_CASE ( " Equals string matcher, with NULL " , " [matchers] " )
{
REQUIRE_THAT ( " " , Equals ( NULL ) ) ;
}
TEST_CASE ( " AllOf matcher " , " [matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , AllOf ( Catch : : Contains ( " string " ) , Catch : : Contains ( " abc " ) ) ) ;
}
TEST_CASE ( " AnyOf matcher " , " [matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , AnyOf ( Catch : : Contains ( " string " ) , Catch : : Contains ( " not there " ) ) ) ;
CHECK_THAT ( testStringForMatching ( ) , AnyOf ( Catch : : Contains ( " not there " ) , Catch : : Contains ( " string " ) ) ) ;
}
2012-10-12 08:58:17 +02:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Equals " , " [matchers] " )
{
CHECK_THAT ( testStringForMatching ( ) , Equals ( " this string contains 'abc' as a substring " ) ) ;
}
2012-05-31 20:40:26 +02:00
2013-12-09 17:01:23 +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 ;
}
2012-05-31 20:40:26 +02:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Factorials are computed " , " [factorial] " ) {
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
2013-12-09 17:01:23 +01:00
TEST_CASE ( " An empty test with no assertions " , " [empty] " )
{
}
2012-09-15 18:53:27 +02:00
2013-12-09 17:01:23 +01:00
TEST_CASE ( " Nice descriptive name " , " [tag1][tag2][tag3][.] " )
{
WARN ( " This one ran " ) ;
}
TEST_CASE ( " first tag " , " [tag1] " )
{
}
TEST_CASE ( " second tag " , " [tag2] " )
{
}
//
//TEST_CASE( "spawn a new process", "[.]" )
//{
// // !TBD Work in progress
// char line[200];
// FILE* output = popen("./CatchSelfTest ./failing/matchers/StartsWith", "r");
// while ( fgets(line, 199, output) )
// std::cout << line;
//}
TEST_CASE ( " vectors can be sized and resized " , " [vector] " ) {
std : : vector < int > v ( 5 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . size ( ) = = 5 ) ;
REQUIRE ( v . capacity ( ) > = 5 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
SECTION ( " resizing bigger changes size and capacity " , " " ) {
v . resize ( 10 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . size ( ) = = 10 ) ;
REQUIRE ( v . capacity ( ) > = 10 ) ;
}
SECTION ( " resizing smaller changes size but not capacity " , " " ) {
v . resize ( 0 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . size ( ) = = 0 ) ;
REQUIRE ( v . capacity ( ) > = 5 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
SECTION ( " We can use the 'swap trick' to reset the capacity " , " " ) {
std : : vector < int > empty ;
empty . swap ( v ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . capacity ( ) = = 0 ) ;
}
2013-03-25 09:47:36 +01:00
}
2013-12-09 17:01:23 +01:00
SECTION ( " reserving bigger changes capacity but not size " , " " ) {
v . reserve ( 10 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . size ( ) = = 5 ) ;
REQUIRE ( v . capacity ( ) > = 10 ) ;
}
SECTION ( " reserving smaller does not change size or capacity " , " " ) {
v . reserve ( 0 ) ;
2013-03-25 09:47:36 +01:00
2013-12-09 17:01:23 +01:00
REQUIRE ( v . size ( ) = = 5 ) ;
REQUIRE ( v . capacity ( ) > = 5 ) ;
}
2013-03-25 09:47:36 +01:00
}
2013-05-13 09:20:45 +02:00
2013-12-09 17:01:23 +01:00
// https://github.com/philsquared/Catch/issues/166
TEST_CASE ( " A couple of nested sections followed by a failure " , " [failing][.] " )
{
SECTION ( " Outer " , " " )
SECTION ( " Inner " , " " )
SUCCEED ( " that's not flying - that's failing in style " ) ;
2013-07-24 20:13:08 +02:00
2013-12-09 17:01:23 +01:00
FAIL ( " to infinity and beyond " ) ;
}
2013-12-09 16:14:47 +01:00
}