1f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Copyright 2007-2010 Baptiste Lepilleur 2f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Distributed under MIT license, or public domain if desired and 3f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// recognized in your jurisdiction. 4f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 6f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef JSONTEST_H_INCLUDED 7f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# define JSONTEST_H_INCLUDED 8f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 9f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/config.h> 10f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/value.h> 11f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <json/writer.h> 12f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <stdio.h> 13f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <deque> 14f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <sstream> 15f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <string> 16f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 17f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// ////////////////////////////////////////////////////////////////// 18f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// ////////////////////////////////////////////////////////////////// 19f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Mini Unit Testing framework 20f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// ////////////////////////////////////////////////////////////////// 21f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// ////////////////////////////////////////////////////////////////// 22f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 23f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 24f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 25f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/** \brief Unit testing framework. 26f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \warning: all assertions are non-aborting, test case execution will continue 27f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * even if an assertion namespace. 28f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * This constraint is for portability: the framework needs to compile 29f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * on Visual Studio 6 and must not require exception usage. 30f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 31f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace JsonTest { 32f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 33f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 34f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class Failure 35f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 36f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 37f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *file_; 38f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int line_; 39f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string expr_; 40f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string message_; 41f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int nestingLevel_; 42f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 43f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 44f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 45f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Context used to create the assertion callstack on failure. 46f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Must be a POD to allow inline initialisation without stepping 47f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// into the debugger. 48f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III struct PredicateContext 49f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 50f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef unsigned int Id; 51f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Id id_; 52f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *file_; 53f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int line_; 54f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *expr_; 55f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PredicateContext *next_; 56f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Related Failure, set when the PredicateContext is converted 57f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// into a Failure. 58f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Failure *failure_; 59f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 60f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 61f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class TestResult 62f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 63f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 64f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult(); 65f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 66f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \internal Implementation detail for assertion macros 67f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Not encapsulated to prevent step into when debugging failed assertions 68f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Incremented by one on assertion predicate entry, decreased by one 69f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// by addPredicateContext(). 70f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PredicateContext::Id predicateId_; 71f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 72f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \internal Implementation detail for predicate macros 73f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PredicateContext *predicateStackTail_; 74f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 75f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void setTestName( const std::string &name ); 76f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 77f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Adds an assertion failure. 78f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &addFailure( const char *file, unsigned int line, 79f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *expr = 0 ); 80f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 81f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Removes the last PredicateContext added to the predicate stack 82f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// chained list. 83f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Next messages will be targed at the PredicateContext that was removed. 84f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &popPredicateContext(); 85f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 86f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool failed() const; 87f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 88f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void printFailure( bool printTestName ) const; 89f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 90f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // Generic operator that will work with anything ostream can deal with. 91f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III template <typename T> 92f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &operator << ( const T& value ) { 93f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::ostringstream oss; 94f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III oss.precision( 16 ); 95f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III oss.setf( std::ios_base::floatfield ); 96f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III oss << value; 97f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return addToLastFailure(oss.str()); 98f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 99f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // Specialized versions. 101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &operator << ( bool value ); 102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // std:ostream does not support 64bits integers on all STL implementation 103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &operator << ( Json::Int64 value ); 104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &operator << ( Json::UInt64 value ); 105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult &addToLastFailure( const std::string &message ); 108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int getAssertionNestingLevel() const; 109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Adds a failure or a predicate context 110f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void addFailureInfo( const char *file, unsigned int line, 111f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *expr, unsigned int nestingLevel ); 112f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static std::string indentText( const std::string &text, 113f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const std::string &indent ); 114f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 115f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::deque<Failure> Failures; 116f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Failures failures_; 117f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string name_; 118f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PredicateContext rootPredicateNode_; 119f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III PredicateContext::Id lastUsedPredicateId_; 120f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Failure which is the target of the messages added using operator << 121f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Failure *messageTarget_; 122f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 123f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 124f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 125f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class TestCase 126f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 127f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 128f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestCase(); 129f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 130f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual ~TestCase(); 131f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 132f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void run( TestResult &result ); 133f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 134f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual const char *testName() const = 0; 135f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 136f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III protected: 137f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult *result_; 138f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 139f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 140f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void runTestCase() = 0; 141f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 142f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 143f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Function pointer type for TestCase factory 144f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef TestCase *(*TestCaseFactory)(); 145f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class Runner 147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Runner(); 150f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 151f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Adds a test to the suite 152f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Runner &add( TestCaseFactory factory ); 153f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 154f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Runs test as specified on the command-line 155f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If no command-line arguments are provided, run all tests. 156f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If --list-tests is provided, then print the list of all test cases 157f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// If --test <testname> is provided, then run test testname. 158f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int runCommandLine( int argc, const char *argv[] ) const; 159f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 160f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Runs all the test cases 161f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool runAllTest( bool printSummary ) const; 162f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 163f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Returns the number of test case in the suite 164f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int testCount() const; 165f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 166f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Returns the name of the test case at the specified index 167f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string testNameAt( unsigned int index ) const; 168f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 169f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Runs the test case at the specified index using the specified TestResult 170f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void runTestAt( unsigned int index, TestResult &result ) const; 171f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 172f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void printUsage( const char *appName ); 173f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 174f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: // prevents copy construction and assignment 175f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Runner( const Runner &other ); 176f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Runner &operator =( const Runner &other ); 177f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 178f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 179f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void listTests() const; 180f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool testIndex( const std::string &testName, unsigned int &index ) const; 181f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static void preventDialogOnCrash(); 182f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 183f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 184f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::deque<TestCaseFactory> Factories; 185f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Factories tests_; 186f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 187f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 188f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III template<typename T, typename U> 189f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult & 190f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III checkEqual( TestResult &result, const T &expected, const U &actual, 191f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *file, unsigned int line, const char *expr ) 192f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 193f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( expected != actual ) 194f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 195f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result.addFailure( file, line, expr ); 196f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result << "Expected: " << expected << "\n"; 197f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result << "Actual : " << actual; 198f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 199f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return result; 200f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 201f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 202f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 203f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TestResult & 204f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III checkStringEqual( TestResult &result, 205f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const std::string &expected, const std::string &actual, 206f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III const char *file, unsigned int line, const char *expr ); 207f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 208f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace JsonTest 209f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 210f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 211f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// \brief Asserts that the given expression is true. 212f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// JSONTEST_ASSERT( x == y ) << "x=" << x << ", y=" << y; 213f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// JSONTEST_ASSERT( x == y ); 214f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_ASSERT( expr ) \ 215f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if ( expr ) \ 216f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { \ 217f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } \ 218f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III else \ 219f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->addFailure( __FILE__, __LINE__, #expr ) 220f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 221f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// \brief Asserts that the given predicate is true. 222f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// The predicate may do other assertions and be a member function of the fixture. 223f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_ASSERT_PRED( expr ) \ 224f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { \ 225f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III JsonTest::PredicateContext _minitest_Context = { \ 226f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->predicateId_, __FILE__, __LINE__, #expr }; \ 227f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->predicateStackTail_->next_ = &_minitest_Context; \ 228f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->predicateId_ += 1; \ 229f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->predicateStackTail_ = &_minitest_Context; \ 230f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III (expr); \ 231f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result_->popPredicateContext(); \ 232f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } \ 233f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III *result_ 234f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 235f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// \brief Asserts that two values are equals. 236f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_ASSERT_EQUAL( expected, actual ) \ 237f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III JsonTest::checkEqual( *result_, expected, actual, \ 238f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III __FILE__, __LINE__, \ 239f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III #expected " == " #actual ) 240f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 241f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// \brief Asserts that two values are equals. 242f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_ASSERT_STRING_EQUAL( expected, actual ) \ 243f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III JsonTest::checkStringEqual( *result_, \ 244f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string(expected), std::string(actual), \ 245f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III __FILE__, __LINE__, \ 246f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III #expected " == " #actual ) 247f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 248f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// \brief Begin a fixture test case. 249f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_FIXTURE( FixtureType, name ) \ 250f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class Test##FixtureType##name : public FixtureType \ 251f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { \ 252f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: \ 253f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III static JsonTest::TestCase *factory() \ 254f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { \ 255f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return new Test##FixtureType##name(); \ 256f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } \ 257f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: /* overidden from TestCase */ \ 258f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual const char *testName() const \ 259f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { \ 260f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return #FixtureType "/" #name; \ 261f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } \ 262f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III virtual void runTestCase(); \ 263f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; \ 264f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \ 265f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void Test##FixtureType##name::runTestCase() 266f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 267f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_FIXTURE_FACTORY( FixtureType, name ) \ 268f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III &Test##FixtureType##name::factory 269f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 270f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#define JSONTEST_REGISTER_FIXTURE( runner, FixtureType, name ) \ 271f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III (runner).add( JSONTEST_FIXTURE_FACTORY( FixtureType, name ) ) 272f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 273f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // ifndef JSONTEST_H_INCLUDED 274