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