xref: /aosp_15_r20/external/bcc/tests/cc/catch.hpp (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  *  Catch v1.4.0
3*387f9dfdSAndroid Build Coastguard Worker  *  Generated: 2016-03-15 07:23:12.623111
4*387f9dfdSAndroid Build Coastguard Worker  *  ----------------------------------------------------------
5*387f9dfdSAndroid Build Coastguard Worker  *  This file has been merged from multiple headers. Please don't edit it directly
6*387f9dfdSAndroid Build Coastguard Worker  *  Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
7*387f9dfdSAndroid Build Coastguard Worker  *
8*387f9dfdSAndroid Build Coastguard Worker  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
9*387f9dfdSAndroid Build Coastguard Worker  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10*387f9dfdSAndroid Build Coastguard Worker  */
11*387f9dfdSAndroid Build Coastguard Worker #ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
12*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
13*387f9dfdSAndroid Build Coastguard Worker 
14*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_HPP_INCLUDED
15*387f9dfdSAndroid Build Coastguard Worker 
16*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
17*387f9dfdSAndroid Build Coastguard Worker #    pragma clang system_header
18*387f9dfdSAndroid Build Coastguard Worker #elif defined __GNUC__
19*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC system_header
20*387f9dfdSAndroid Build Coastguard Worker #endif
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_suppress_warnings.h
23*387f9dfdSAndroid Build Coastguard Worker 
24*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
25*387f9dfdSAndroid Build Coastguard Worker #   ifdef __ICC // icpc defines the __clang__ macro
26*387f9dfdSAndroid Build Coastguard Worker #       pragma warning(push)
27*387f9dfdSAndroid Build Coastguard Worker #       pragma warning(disable: 161 1682)
28*387f9dfdSAndroid Build Coastguard Worker #   else // __ICC
29*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wglobal-constructors"
30*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wvariadic-macros"
31*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wc99-extensions"
32*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wunused-variable"
33*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic push
34*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wpadded"
35*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wc++98-compat"
36*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
37*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wswitch-enum"
38*387f9dfdSAndroid Build Coastguard Worker #       pragma clang diagnostic ignored "-Wcovered-switch-default"
39*387f9dfdSAndroid Build Coastguard Worker #    endif
40*387f9dfdSAndroid Build Coastguard Worker #elif defined __GNUC__
41*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC diagnostic ignored "-Wvariadic-macros"
42*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC diagnostic ignored "-Wunused-variable"
43*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC diagnostic push
44*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC diagnostic ignored "-Wpadded"
45*387f9dfdSAndroid Build Coastguard Worker #endif
46*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
47*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_IMPL
48*387f9dfdSAndroid Build Coastguard Worker #endif
49*387f9dfdSAndroid Build Coastguard Worker 
50*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_IMPL
51*387f9dfdSAndroid Build Coastguard Worker #  ifndef CLARA_CONFIG_MAIN
52*387f9dfdSAndroid Build Coastguard Worker #    define CLARA_CONFIG_MAIN_NOT_DEFINED
53*387f9dfdSAndroid Build Coastguard Worker #    define CLARA_CONFIG_MAIN
54*387f9dfdSAndroid Build Coastguard Worker #  endif
55*387f9dfdSAndroid Build Coastguard Worker #endif
56*387f9dfdSAndroid Build Coastguard Worker 
57*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_notimplemented_exception.h
58*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED
59*387f9dfdSAndroid Build Coastguard Worker 
60*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_common.h
61*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
62*387f9dfdSAndroid Build Coastguard Worker 
63*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
64*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
65*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_COUNTER
66*387f9dfdSAndroid Build Coastguard Worker #  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
67*387f9dfdSAndroid Build Coastguard Worker #else
68*387f9dfdSAndroid Build Coastguard Worker #  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
69*387f9dfdSAndroid Build Coastguard Worker #endif
70*387f9dfdSAndroid Build Coastguard Worker 
71*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
72*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
73*387f9dfdSAndroid Build Coastguard Worker 
74*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
75*387f9dfdSAndroid Build Coastguard Worker #include <stdexcept>
76*387f9dfdSAndroid Build Coastguard Worker #include <algorithm>
77*387f9dfdSAndroid Build Coastguard Worker 
78*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_compiler_capabilities.h
79*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
80*387f9dfdSAndroid Build Coastguard Worker 
81*387f9dfdSAndroid Build Coastguard Worker // Detect a number of compiler features - mostly C++11/14 conformance - by compiler
82*387f9dfdSAndroid Build Coastguard Worker // The following features are defined:
83*387f9dfdSAndroid Build Coastguard Worker //
84*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported?
85*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported?
86*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods
87*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported?
88*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported
89*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_LONG_LONG : is long long supported?
90*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_OVERRIDE : is override supported?
91*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)
92*387f9dfdSAndroid Build Coastguard Worker 
93*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
94*387f9dfdSAndroid Build Coastguard Worker 
95*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?
96*387f9dfdSAndroid Build Coastguard Worker // CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
97*387f9dfdSAndroid Build Coastguard Worker // ****************
98*387f9dfdSAndroid Build Coastguard Worker // Note to maintainers: if new toggles are added please document them
99*387f9dfdSAndroid Build Coastguard Worker // in configuration.md, too
100*387f9dfdSAndroid Build Coastguard Worker // ****************
101*387f9dfdSAndroid Build Coastguard Worker 
102*387f9dfdSAndroid Build Coastguard Worker // In general each macro has a _NO_<feature name> form
103*387f9dfdSAndroid Build Coastguard Worker // (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature.
104*387f9dfdSAndroid Build Coastguard Worker // Many features, at point of detection, define an _INTERNAL_ macro, so they
105*387f9dfdSAndroid Build Coastguard Worker // can be combined, en-mass, with the _NO_ forms later.
106*387f9dfdSAndroid Build Coastguard Worker 
107*387f9dfdSAndroid Build Coastguard Worker // All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
108*387f9dfdSAndroid Build Coastguard Worker 
109*387f9dfdSAndroid Build Coastguard Worker #if defined(__cplusplus) && __cplusplus >= 201103L
110*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_CPP11_OR_GREATER
111*387f9dfdSAndroid Build Coastguard Worker #endif
112*387f9dfdSAndroid Build Coastguard Worker 
113*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
114*387f9dfdSAndroid Build Coastguard Worker 
115*387f9dfdSAndroid Build Coastguard Worker #  if __has_feature(cxx_nullptr)
116*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
117*387f9dfdSAndroid Build Coastguard Worker #  endif
118*387f9dfdSAndroid Build Coastguard Worker 
119*387f9dfdSAndroid Build Coastguard Worker #  if __has_feature(cxx_noexcept)
120*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
121*387f9dfdSAndroid Build Coastguard Worker #  endif
122*387f9dfdSAndroid Build Coastguard Worker 
123*387f9dfdSAndroid Build Coastguard Worker #   if defined(CATCH_CPP11_OR_GREATER)
124*387f9dfdSAndroid Build Coastguard Worker #       define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
125*387f9dfdSAndroid Build Coastguard Worker #   endif
126*387f9dfdSAndroid Build Coastguard Worker 
127*387f9dfdSAndroid Build Coastguard Worker #endif // __clang__
128*387f9dfdSAndroid Build Coastguard Worker 
129*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
130*387f9dfdSAndroid Build Coastguard Worker // Borland
131*387f9dfdSAndroid Build Coastguard Worker #ifdef __BORLANDC__
132*387f9dfdSAndroid Build Coastguard Worker 
133*387f9dfdSAndroid Build Coastguard Worker #endif // __BORLANDC__
134*387f9dfdSAndroid Build Coastguard Worker 
135*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
136*387f9dfdSAndroid Build Coastguard Worker // EDG
137*387f9dfdSAndroid Build Coastguard Worker #ifdef __EDG_VERSION__
138*387f9dfdSAndroid Build Coastguard Worker 
139*387f9dfdSAndroid Build Coastguard Worker #endif // __EDG_VERSION__
140*387f9dfdSAndroid Build Coastguard Worker 
141*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
142*387f9dfdSAndroid Build Coastguard Worker // Digital Mars
143*387f9dfdSAndroid Build Coastguard Worker #ifdef __DMC__
144*387f9dfdSAndroid Build Coastguard Worker 
145*387f9dfdSAndroid Build Coastguard Worker #endif // __DMC__
146*387f9dfdSAndroid Build Coastguard Worker 
147*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
148*387f9dfdSAndroid Build Coastguard Worker // GCC
149*387f9dfdSAndroid Build Coastguard Worker #ifdef __GNUC__
150*387f9dfdSAndroid Build Coastguard Worker 
151*387f9dfdSAndroid Build Coastguard Worker #   if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
152*387f9dfdSAndroid Build Coastguard Worker #       define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
153*387f9dfdSAndroid Build Coastguard Worker #   endif
154*387f9dfdSAndroid Build Coastguard Worker 
155*387f9dfdSAndroid Build Coastguard Worker #   if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER)
156*387f9dfdSAndroid Build Coastguard Worker #       define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" )
157*387f9dfdSAndroid Build Coastguard Worker #   endif
158*387f9dfdSAndroid Build Coastguard Worker 
159*387f9dfdSAndroid Build Coastguard Worker // - otherwise more recent versions define __cplusplus >= 201103L
160*387f9dfdSAndroid Build Coastguard Worker // and will get picked up below
161*387f9dfdSAndroid Build Coastguard Worker 
162*387f9dfdSAndroid Build Coastguard Worker #endif // __GNUC__
163*387f9dfdSAndroid Build Coastguard Worker 
164*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
165*387f9dfdSAndroid Build Coastguard Worker // Visual C++
166*387f9dfdSAndroid Build Coastguard Worker #ifdef _MSC_VER
167*387f9dfdSAndroid Build Coastguard Worker 
168*387f9dfdSAndroid Build Coastguard Worker #if (_MSC_VER >= 1600)
169*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
170*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
171*387f9dfdSAndroid Build Coastguard Worker #endif
172*387f9dfdSAndroid Build Coastguard Worker 
173*387f9dfdSAndroid Build Coastguard Worker #if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))
174*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
175*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
176*387f9dfdSAndroid Build Coastguard Worker #endif
177*387f9dfdSAndroid Build Coastguard Worker 
178*387f9dfdSAndroid Build Coastguard Worker #endif // _MSC_VER
179*387f9dfdSAndroid Build Coastguard Worker 
180*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
181*387f9dfdSAndroid Build Coastguard Worker 
182*387f9dfdSAndroid Build Coastguard Worker // Use variadic macros if the compiler supports them
183*387f9dfdSAndroid Build Coastguard Worker #if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \
184*387f9dfdSAndroid Build Coastguard Worker     ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \
185*387f9dfdSAndroid Build Coastguard Worker     ( defined __GNUC__ && __GNUC__ >= 3 ) || \
186*387f9dfdSAndroid Build Coastguard Worker     ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L )
187*387f9dfdSAndroid Build Coastguard Worker 
188*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
189*387f9dfdSAndroid Build Coastguard Worker 
190*387f9dfdSAndroid Build Coastguard Worker #endif
191*387f9dfdSAndroid Build Coastguard Worker 
192*387f9dfdSAndroid Build Coastguard Worker // Use __COUNTER__ if the compiler supports it
193*387f9dfdSAndroid Build Coastguard Worker #if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \
194*387f9dfdSAndroid Build Coastguard Worker     ( defined __GNUC__  && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \
195*387f9dfdSAndroid Build Coastguard Worker     ( defined __clang__ && __clang_major__ >= 3 )
196*387f9dfdSAndroid Build Coastguard Worker 
197*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_CONFIG_COUNTER
198*387f9dfdSAndroid Build Coastguard Worker 
199*387f9dfdSAndroid Build Coastguard Worker #endif
200*387f9dfdSAndroid Build Coastguard Worker 
201*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
202*387f9dfdSAndroid Build Coastguard Worker // C++ language feature support
203*387f9dfdSAndroid Build Coastguard Worker 
204*387f9dfdSAndroid Build Coastguard Worker // catch all support for C++11
205*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_CPP11_OR_GREATER)
206*387f9dfdSAndroid Build Coastguard Worker 
207*387f9dfdSAndroid Build Coastguard Worker #  if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)
208*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
209*387f9dfdSAndroid Build Coastguard Worker #  endif
210*387f9dfdSAndroid Build Coastguard Worker 
211*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
212*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
213*387f9dfdSAndroid Build Coastguard Worker #  endif
214*387f9dfdSAndroid Build Coastguard Worker 
215*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
216*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
217*387f9dfdSAndroid Build Coastguard Worker #  endif
218*387f9dfdSAndroid Build Coastguard Worker 
219*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
220*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
221*387f9dfdSAndroid Build Coastguard Worker #  endif
222*387f9dfdSAndroid Build Coastguard Worker 
223*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE
224*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_TUPLE
225*387f9dfdSAndroid Build Coastguard Worker #  endif
226*387f9dfdSAndroid Build Coastguard Worker 
227*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
228*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
229*387f9dfdSAndroid Build Coastguard Worker #  endif
230*387f9dfdSAndroid Build Coastguard Worker 
231*387f9dfdSAndroid Build Coastguard Worker #  if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG)
232*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG
233*387f9dfdSAndroid Build Coastguard Worker #  endif
234*387f9dfdSAndroid Build Coastguard Worker 
235*387f9dfdSAndroid Build Coastguard Worker #  if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE)
236*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE
237*387f9dfdSAndroid Build Coastguard Worker #  endif
238*387f9dfdSAndroid Build Coastguard Worker #  if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)
239*387f9dfdSAndroid Build Coastguard Worker #    define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
240*387f9dfdSAndroid Build Coastguard Worker #  endif
241*387f9dfdSAndroid Build Coastguard Worker 
242*387f9dfdSAndroid Build Coastguard Worker #endif // __cplusplus >= 201103L
243*387f9dfdSAndroid Build Coastguard Worker 
244*387f9dfdSAndroid Build Coastguard Worker // Now set the actual defines based on the above + anything the user has configured
245*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11)
246*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_NULLPTR
247*387f9dfdSAndroid Build Coastguard Worker #endif
248*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11)
249*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_NOEXCEPT
250*387f9dfdSAndroid Build Coastguard Worker #endif
251*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11)
252*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_GENERATED_METHODS
253*387f9dfdSAndroid Build Coastguard Worker #endif
254*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11)
255*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_IS_ENUM
256*387f9dfdSAndroid Build Coastguard Worker #endif
257*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11)
258*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_TUPLE
259*387f9dfdSAndroid Build Coastguard Worker #endif
260*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS)
261*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_VARIADIC_MACROS
262*387f9dfdSAndroid Build Coastguard Worker #endif
263*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11)
264*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_LONG_LONG
265*387f9dfdSAndroid Build Coastguard Worker #endif
266*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11)
267*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_OVERRIDE
268*387f9dfdSAndroid Build Coastguard Worker #endif
269*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)
270*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_CPP11_UNIQUE_PTR
271*387f9dfdSAndroid Build Coastguard Worker #endif
272*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)
273*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_CONFIG_COUNTER
274*387f9dfdSAndroid Build Coastguard Worker #endif
275*387f9dfdSAndroid Build Coastguard Worker 
276*387f9dfdSAndroid Build Coastguard Worker #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
277*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
278*387f9dfdSAndroid Build Coastguard Worker #endif
279*387f9dfdSAndroid Build Coastguard Worker 
280*387f9dfdSAndroid Build Coastguard Worker // noexcept support:
281*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
282*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_NOEXCEPT noexcept
283*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_NOEXCEPT_IS(x) noexcept(x)
284*387f9dfdSAndroid Build Coastguard Worker #else
285*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_NOEXCEPT throw()
286*387f9dfdSAndroid Build Coastguard Worker #  define CATCH_NOEXCEPT_IS(x)
287*387f9dfdSAndroid Build Coastguard Worker #endif
288*387f9dfdSAndroid Build Coastguard Worker 
289*387f9dfdSAndroid Build Coastguard Worker // nullptr support
290*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_NULLPTR
291*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_NULL nullptr
292*387f9dfdSAndroid Build Coastguard Worker #else
293*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_NULL NULL
294*387f9dfdSAndroid Build Coastguard Worker #endif
295*387f9dfdSAndroid Build Coastguard Worker 
296*387f9dfdSAndroid Build Coastguard Worker // override support
297*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_OVERRIDE
298*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_OVERRIDE override
299*387f9dfdSAndroid Build Coastguard Worker #else
300*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_OVERRIDE
301*387f9dfdSAndroid Build Coastguard Worker #endif
302*387f9dfdSAndroid Build Coastguard Worker 
303*387f9dfdSAndroid Build Coastguard Worker // unique_ptr support
304*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR
305*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_AUTO_PTR( T ) std::unique_ptr<T>
306*387f9dfdSAndroid Build Coastguard Worker #else
307*387f9dfdSAndroid Build Coastguard Worker #   define CATCH_AUTO_PTR( T ) std::auto_ptr<T>
308*387f9dfdSAndroid Build Coastguard Worker #endif
309*387f9dfdSAndroid Build Coastguard Worker 
310*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
311*387f9dfdSAndroid Build Coastguard Worker 
312*387f9dfdSAndroid Build Coastguard Worker     struct IConfig;
313*387f9dfdSAndroid Build Coastguard Worker 
314*387f9dfdSAndroid Build Coastguard Worker     struct CaseSensitive { enum Choice {
315*387f9dfdSAndroid Build Coastguard Worker         Yes,
316*387f9dfdSAndroid Build Coastguard Worker         No
317*387f9dfdSAndroid Build Coastguard Worker     }; };
318*387f9dfdSAndroid Build Coastguard Worker 
319*387f9dfdSAndroid Build Coastguard Worker     class NonCopyable {
320*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
321*387f9dfdSAndroid Build Coastguard Worker         NonCopyable( NonCopyable const& )              = delete;
322*387f9dfdSAndroid Build Coastguard Worker         NonCopyable( NonCopyable && )                  = delete;
323*387f9dfdSAndroid Build Coastguard Worker         NonCopyable& operator = ( NonCopyable const& ) = delete;
324*387f9dfdSAndroid Build Coastguard Worker         NonCopyable& operator = ( NonCopyable && )     = delete;
325*387f9dfdSAndroid Build Coastguard Worker #else
326*387f9dfdSAndroid Build Coastguard Worker         NonCopyable( NonCopyable const& info );
327*387f9dfdSAndroid Build Coastguard Worker         NonCopyable& operator = ( NonCopyable const& );
328*387f9dfdSAndroid Build Coastguard Worker #endif
329*387f9dfdSAndroid Build Coastguard Worker 
330*387f9dfdSAndroid Build Coastguard Worker     protected:
NonCopyable()331*387f9dfdSAndroid Build Coastguard Worker         NonCopyable() {}
332*387f9dfdSAndroid Build Coastguard Worker         virtual ~NonCopyable();
333*387f9dfdSAndroid Build Coastguard Worker     };
334*387f9dfdSAndroid Build Coastguard Worker 
335*387f9dfdSAndroid Build Coastguard Worker     class SafeBool {
336*387f9dfdSAndroid Build Coastguard Worker     public:
337*387f9dfdSAndroid Build Coastguard Worker         typedef void (SafeBool::*type)() const;
338*387f9dfdSAndroid Build Coastguard Worker 
makeSafe(bool value)339*387f9dfdSAndroid Build Coastguard Worker         static type makeSafe( bool value ) {
340*387f9dfdSAndroid Build Coastguard Worker             return value ? &SafeBool::trueValue : 0;
341*387f9dfdSAndroid Build Coastguard Worker         }
342*387f9dfdSAndroid Build Coastguard Worker     private:
trueValue() const343*387f9dfdSAndroid Build Coastguard Worker         void trueValue() const {}
344*387f9dfdSAndroid Build Coastguard Worker     };
345*387f9dfdSAndroid Build Coastguard Worker 
346*387f9dfdSAndroid Build Coastguard Worker     template<typename ContainerT>
deleteAll(ContainerT & container)347*387f9dfdSAndroid Build Coastguard Worker     inline void deleteAll( ContainerT& container ) {
348*387f9dfdSAndroid Build Coastguard Worker         typename ContainerT::const_iterator it = container.begin();
349*387f9dfdSAndroid Build Coastguard Worker         typename ContainerT::const_iterator itEnd = container.end();
350*387f9dfdSAndroid Build Coastguard Worker         for(; it != itEnd; ++it )
351*387f9dfdSAndroid Build Coastguard Worker             delete *it;
352*387f9dfdSAndroid Build Coastguard Worker     }
353*387f9dfdSAndroid Build Coastguard Worker     template<typename AssociativeContainerT>
deleteAllValues(AssociativeContainerT & container)354*387f9dfdSAndroid Build Coastguard Worker     inline void deleteAllValues( AssociativeContainerT& container ) {
355*387f9dfdSAndroid Build Coastguard Worker         typename AssociativeContainerT::const_iterator it = container.begin();
356*387f9dfdSAndroid Build Coastguard Worker         typename AssociativeContainerT::const_iterator itEnd = container.end();
357*387f9dfdSAndroid Build Coastguard Worker         for(; it != itEnd; ++it )
358*387f9dfdSAndroid Build Coastguard Worker             delete it->second;
359*387f9dfdSAndroid Build Coastguard Worker     }
360*387f9dfdSAndroid Build Coastguard Worker 
361*387f9dfdSAndroid Build Coastguard Worker     bool startsWith( std::string const& s, std::string const& prefix );
362*387f9dfdSAndroid Build Coastguard Worker     bool endsWith( std::string const& s, std::string const& suffix );
363*387f9dfdSAndroid Build Coastguard Worker     bool contains( std::string const& s, std::string const& infix );
364*387f9dfdSAndroid Build Coastguard Worker     void toLowerInPlace( std::string& s );
365*387f9dfdSAndroid Build Coastguard Worker     std::string toLower( std::string const& s );
366*387f9dfdSAndroid Build Coastguard Worker     std::string trim( std::string const& str );
367*387f9dfdSAndroid Build Coastguard Worker     bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );
368*387f9dfdSAndroid Build Coastguard Worker 
369*387f9dfdSAndroid Build Coastguard Worker     struct pluralise {
370*387f9dfdSAndroid Build Coastguard Worker         pluralise( std::size_t count, std::string const& label );
371*387f9dfdSAndroid Build Coastguard Worker 
372*387f9dfdSAndroid Build Coastguard Worker         friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );
373*387f9dfdSAndroid Build Coastguard Worker 
374*387f9dfdSAndroid Build Coastguard Worker         std::size_t m_count;
375*387f9dfdSAndroid Build Coastguard Worker         std::string m_label;
376*387f9dfdSAndroid Build Coastguard Worker     };
377*387f9dfdSAndroid Build Coastguard Worker 
378*387f9dfdSAndroid Build Coastguard Worker     struct SourceLineInfo {
379*387f9dfdSAndroid Build Coastguard Worker 
380*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo();
381*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo( char const* _file, std::size_t _line );
382*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo( SourceLineInfo const& other );
383*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
384*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo( SourceLineInfo && )                  = default;
385*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
386*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo& operator = ( SourceLineInfo && )     = default;
387*387f9dfdSAndroid Build Coastguard Worker #  endif
388*387f9dfdSAndroid Build Coastguard Worker         bool empty() const;
389*387f9dfdSAndroid Build Coastguard Worker         bool operator == ( SourceLineInfo const& other ) const;
390*387f9dfdSAndroid Build Coastguard Worker         bool operator < ( SourceLineInfo const& other ) const;
391*387f9dfdSAndroid Build Coastguard Worker 
392*387f9dfdSAndroid Build Coastguard Worker         std::string file;
393*387f9dfdSAndroid Build Coastguard Worker         std::size_t line;
394*387f9dfdSAndroid Build Coastguard Worker     };
395*387f9dfdSAndroid Build Coastguard Worker 
396*387f9dfdSAndroid Build Coastguard Worker     std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
397*387f9dfdSAndroid Build Coastguard Worker 
398*387f9dfdSAndroid Build Coastguard Worker     // This is just here to avoid compiler warnings with macro constants and boolean literals
isTrue(bool value)399*387f9dfdSAndroid Build Coastguard Worker     inline bool isTrue( bool value ){ return value; }
alwaysTrue()400*387f9dfdSAndroid Build Coastguard Worker     inline bool alwaysTrue() { return true; }
alwaysFalse()401*387f9dfdSAndroid Build Coastguard Worker     inline bool alwaysFalse() { return false; }
402*387f9dfdSAndroid Build Coastguard Worker 
403*387f9dfdSAndroid Build Coastguard Worker     void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );
404*387f9dfdSAndroid Build Coastguard Worker 
405*387f9dfdSAndroid Build Coastguard Worker     void seedRng( IConfig const& config );
406*387f9dfdSAndroid Build Coastguard Worker     unsigned int rngSeed();
407*387f9dfdSAndroid Build Coastguard Worker 
408*387f9dfdSAndroid Build Coastguard Worker     // Use this in variadic streaming macros to allow
409*387f9dfdSAndroid Build Coastguard Worker     //    >> +StreamEndStop
410*387f9dfdSAndroid Build Coastguard Worker     // as well as
411*387f9dfdSAndroid Build Coastguard Worker     //    >> stuff +StreamEndStop
412*387f9dfdSAndroid Build Coastguard Worker     struct StreamEndStop {
operator +Catch::StreamEndStop413*387f9dfdSAndroid Build Coastguard Worker         std::string operator+() {
414*387f9dfdSAndroid Build Coastguard Worker             return std::string();
415*387f9dfdSAndroid Build Coastguard Worker         }
416*387f9dfdSAndroid Build Coastguard Worker     };
417*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
operator +(T const & value,StreamEndStop)418*387f9dfdSAndroid Build Coastguard Worker     T const& operator + ( T const& value, StreamEndStop ) {
419*387f9dfdSAndroid Build Coastguard Worker         return value;
420*387f9dfdSAndroid Build Coastguard Worker     }
421*387f9dfdSAndroid Build Coastguard Worker }
422*387f9dfdSAndroid Build Coastguard Worker 
423*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
424*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );
425*387f9dfdSAndroid Build Coastguard Worker 
426*387f9dfdSAndroid Build Coastguard Worker #include <ostream>
427*387f9dfdSAndroid Build Coastguard Worker 
428*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
429*387f9dfdSAndroid Build Coastguard Worker 
430*387f9dfdSAndroid Build Coastguard Worker     class NotImplementedException : public std::exception
431*387f9dfdSAndroid Build Coastguard Worker     {
432*387f9dfdSAndroid Build Coastguard Worker     public:
433*387f9dfdSAndroid Build Coastguard Worker         NotImplementedException( SourceLineInfo const& lineInfo );
NotImplementedException(NotImplementedException const &)434*387f9dfdSAndroid Build Coastguard Worker         NotImplementedException( NotImplementedException const& ) {}
435*387f9dfdSAndroid Build Coastguard Worker 
~NotImplementedException()436*387f9dfdSAndroid Build Coastguard Worker         virtual ~NotImplementedException() CATCH_NOEXCEPT {}
437*387f9dfdSAndroid Build Coastguard Worker 
438*387f9dfdSAndroid Build Coastguard Worker         virtual const char* what() const CATCH_NOEXCEPT;
439*387f9dfdSAndroid Build Coastguard Worker 
440*387f9dfdSAndroid Build Coastguard Worker     private:
441*387f9dfdSAndroid Build Coastguard Worker         std::string m_what;
442*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo m_lineInfo;
443*387f9dfdSAndroid Build Coastguard Worker     };
444*387f9dfdSAndroid Build Coastguard Worker 
445*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
446*387f9dfdSAndroid Build Coastguard Worker 
447*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
448*387f9dfdSAndroid Build Coastguard Worker #define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO )
449*387f9dfdSAndroid Build Coastguard Worker 
450*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_context.h
451*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
452*387f9dfdSAndroid Build Coastguard Worker 
453*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_generators.h
454*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED
455*387f9dfdSAndroid Build Coastguard Worker 
456*387f9dfdSAndroid Build Coastguard Worker #include <string>
457*387f9dfdSAndroid Build Coastguard Worker 
458*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
459*387f9dfdSAndroid Build Coastguard Worker 
460*387f9dfdSAndroid Build Coastguard Worker     struct IGeneratorInfo {
461*387f9dfdSAndroid Build Coastguard Worker         virtual ~IGeneratorInfo();
462*387f9dfdSAndroid Build Coastguard Worker         virtual bool moveNext() = 0;
463*387f9dfdSAndroid Build Coastguard Worker         virtual std::size_t getCurrentIndex() const = 0;
464*387f9dfdSAndroid Build Coastguard Worker     };
465*387f9dfdSAndroid Build Coastguard Worker 
466*387f9dfdSAndroid Build Coastguard Worker     struct IGeneratorsForTest {
467*387f9dfdSAndroid Build Coastguard Worker         virtual ~IGeneratorsForTest();
468*387f9dfdSAndroid Build Coastguard Worker 
469*387f9dfdSAndroid Build Coastguard Worker         virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0;
470*387f9dfdSAndroid Build Coastguard Worker         virtual bool moveNext() = 0;
471*387f9dfdSAndroid Build Coastguard Worker     };
472*387f9dfdSAndroid Build Coastguard Worker 
473*387f9dfdSAndroid Build Coastguard Worker     IGeneratorsForTest* createGeneratorsForTest();
474*387f9dfdSAndroid Build Coastguard Worker 
475*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
476*387f9dfdSAndroid Build Coastguard Worker 
477*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_ptr.hpp
478*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
479*387f9dfdSAndroid Build Coastguard Worker 
480*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
481*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
482*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wpadded"
483*387f9dfdSAndroid Build Coastguard Worker #endif
484*387f9dfdSAndroid Build Coastguard Worker 
485*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
486*387f9dfdSAndroid Build Coastguard Worker 
487*387f9dfdSAndroid Build Coastguard Worker     // An intrusive reference counting smart pointer.
488*387f9dfdSAndroid Build Coastguard Worker     // T must implement addRef() and release() methods
489*387f9dfdSAndroid Build Coastguard Worker     // typically implementing the IShared interface
490*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
491*387f9dfdSAndroid Build Coastguard Worker     class Ptr {
492*387f9dfdSAndroid Build Coastguard Worker     public:
Ptr()493*387f9dfdSAndroid Build Coastguard Worker         Ptr() : m_p( CATCH_NULL ){}
Ptr(T * p)494*387f9dfdSAndroid Build Coastguard Worker         Ptr( T* p ) : m_p( p ){
495*387f9dfdSAndroid Build Coastguard Worker             if( m_p )
496*387f9dfdSAndroid Build Coastguard Worker                 m_p->addRef();
497*387f9dfdSAndroid Build Coastguard Worker         }
Ptr(Ptr const & other)498*387f9dfdSAndroid Build Coastguard Worker         Ptr( Ptr const& other ) : m_p( other.m_p ){
499*387f9dfdSAndroid Build Coastguard Worker             if( m_p )
500*387f9dfdSAndroid Build Coastguard Worker                 m_p->addRef();
501*387f9dfdSAndroid Build Coastguard Worker         }
~Ptr()502*387f9dfdSAndroid Build Coastguard Worker         ~Ptr(){
503*387f9dfdSAndroid Build Coastguard Worker             if( m_p )
504*387f9dfdSAndroid Build Coastguard Worker                 m_p->release();
505*387f9dfdSAndroid Build Coastguard Worker         }
reset()506*387f9dfdSAndroid Build Coastguard Worker         void reset() {
507*387f9dfdSAndroid Build Coastguard Worker             if( m_p )
508*387f9dfdSAndroid Build Coastguard Worker                 m_p->release();
509*387f9dfdSAndroid Build Coastguard Worker             m_p = CATCH_NULL;
510*387f9dfdSAndroid Build Coastguard Worker         }
operator =(T * p)511*387f9dfdSAndroid Build Coastguard Worker         Ptr& operator = ( T* p ){
512*387f9dfdSAndroid Build Coastguard Worker             Ptr temp( p );
513*387f9dfdSAndroid Build Coastguard Worker             swap( temp );
514*387f9dfdSAndroid Build Coastguard Worker             return *this;
515*387f9dfdSAndroid Build Coastguard Worker         }
operator =(Ptr const & other)516*387f9dfdSAndroid Build Coastguard Worker         Ptr& operator = ( Ptr const& other ){
517*387f9dfdSAndroid Build Coastguard Worker             Ptr temp( other );
518*387f9dfdSAndroid Build Coastguard Worker             swap( temp );
519*387f9dfdSAndroid Build Coastguard Worker             return *this;
520*387f9dfdSAndroid Build Coastguard Worker         }
swap(Ptr & other)521*387f9dfdSAndroid Build Coastguard Worker         void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }
get() const522*387f9dfdSAndroid Build Coastguard Worker         T* get() const{ return m_p; }
operator *() const523*387f9dfdSAndroid Build Coastguard Worker         T& operator*() const { return *m_p; }
operator ->() const524*387f9dfdSAndroid Build Coastguard Worker         T* operator->() const { return m_p; }
operator !() const525*387f9dfdSAndroid Build Coastguard Worker         bool operator !() const { return m_p == CATCH_NULL; }
operator SafeBool::type() const526*387f9dfdSAndroid Build Coastguard Worker         operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); }
527*387f9dfdSAndroid Build Coastguard Worker 
528*387f9dfdSAndroid Build Coastguard Worker     private:
529*387f9dfdSAndroid Build Coastguard Worker         T* m_p;
530*387f9dfdSAndroid Build Coastguard Worker     };
531*387f9dfdSAndroid Build Coastguard Worker 
532*387f9dfdSAndroid Build Coastguard Worker     struct IShared : NonCopyable {
533*387f9dfdSAndroid Build Coastguard Worker         virtual ~IShared();
534*387f9dfdSAndroid Build Coastguard Worker         virtual void addRef() const = 0;
535*387f9dfdSAndroid Build Coastguard Worker         virtual void release() const = 0;
536*387f9dfdSAndroid Build Coastguard Worker     };
537*387f9dfdSAndroid Build Coastguard Worker 
538*387f9dfdSAndroid Build Coastguard Worker     template<typename T = IShared>
539*387f9dfdSAndroid Build Coastguard Worker     struct SharedImpl : T {
540*387f9dfdSAndroid Build Coastguard Worker 
SharedImplCatch::SharedImpl541*387f9dfdSAndroid Build Coastguard Worker         SharedImpl() : m_rc( 0 ){}
542*387f9dfdSAndroid Build Coastguard Worker 
addRefCatch::SharedImpl543*387f9dfdSAndroid Build Coastguard Worker         virtual void addRef() const {
544*387f9dfdSAndroid Build Coastguard Worker             ++m_rc;
545*387f9dfdSAndroid Build Coastguard Worker         }
releaseCatch::SharedImpl546*387f9dfdSAndroid Build Coastguard Worker         virtual void release() const {
547*387f9dfdSAndroid Build Coastguard Worker             if( --m_rc == 0 )
548*387f9dfdSAndroid Build Coastguard Worker                 delete this;
549*387f9dfdSAndroid Build Coastguard Worker         }
550*387f9dfdSAndroid Build Coastguard Worker 
551*387f9dfdSAndroid Build Coastguard Worker         mutable unsigned int m_rc;
552*387f9dfdSAndroid Build Coastguard Worker     };
553*387f9dfdSAndroid Build Coastguard Worker 
554*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
555*387f9dfdSAndroid Build Coastguard Worker 
556*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
557*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
558*387f9dfdSAndroid Build Coastguard Worker #endif
559*387f9dfdSAndroid Build Coastguard Worker 
560*387f9dfdSAndroid Build Coastguard Worker #include <memory>
561*387f9dfdSAndroid Build Coastguard Worker #include <vector>
562*387f9dfdSAndroid Build Coastguard Worker #include <stdlib.h>
563*387f9dfdSAndroid Build Coastguard Worker 
564*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
565*387f9dfdSAndroid Build Coastguard Worker 
566*387f9dfdSAndroid Build Coastguard Worker     class TestCase;
567*387f9dfdSAndroid Build Coastguard Worker     class Stream;
568*387f9dfdSAndroid Build Coastguard Worker     struct IResultCapture;
569*387f9dfdSAndroid Build Coastguard Worker     struct IRunner;
570*387f9dfdSAndroid Build Coastguard Worker     struct IGeneratorsForTest;
571*387f9dfdSAndroid Build Coastguard Worker     struct IConfig;
572*387f9dfdSAndroid Build Coastguard Worker 
573*387f9dfdSAndroid Build Coastguard Worker     struct IContext
574*387f9dfdSAndroid Build Coastguard Worker     {
575*387f9dfdSAndroid Build Coastguard Worker         virtual ~IContext();
576*387f9dfdSAndroid Build Coastguard Worker 
577*387f9dfdSAndroid Build Coastguard Worker         virtual IResultCapture* getResultCapture() = 0;
578*387f9dfdSAndroid Build Coastguard Worker         virtual IRunner* getRunner() = 0;
579*387f9dfdSAndroid Build Coastguard Worker         virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0;
580*387f9dfdSAndroid Build Coastguard Worker         virtual bool advanceGeneratorsForCurrentTest() = 0;
581*387f9dfdSAndroid Build Coastguard Worker         virtual Ptr<IConfig const> getConfig() const = 0;
582*387f9dfdSAndroid Build Coastguard Worker     };
583*387f9dfdSAndroid Build Coastguard Worker 
584*387f9dfdSAndroid Build Coastguard Worker     struct IMutableContext : IContext
585*387f9dfdSAndroid Build Coastguard Worker     {
586*387f9dfdSAndroid Build Coastguard Worker         virtual ~IMutableContext();
587*387f9dfdSAndroid Build Coastguard Worker         virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
588*387f9dfdSAndroid Build Coastguard Worker         virtual void setRunner( IRunner* runner ) = 0;
589*387f9dfdSAndroid Build Coastguard Worker         virtual void setConfig( Ptr<IConfig const> const& config ) = 0;
590*387f9dfdSAndroid Build Coastguard Worker     };
591*387f9dfdSAndroid Build Coastguard Worker 
592*387f9dfdSAndroid Build Coastguard Worker     IContext& getCurrentContext();
593*387f9dfdSAndroid Build Coastguard Worker     IMutableContext& getCurrentMutableContext();
594*387f9dfdSAndroid Build Coastguard Worker     void cleanUpContext();
595*387f9dfdSAndroid Build Coastguard Worker     Stream createStream( std::string const& streamName );
596*387f9dfdSAndroid Build Coastguard Worker 
597*387f9dfdSAndroid Build Coastguard Worker }
598*387f9dfdSAndroid Build Coastguard Worker 
599*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_test_registry.hpp
600*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
601*387f9dfdSAndroid Build Coastguard Worker 
602*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_testcase.h
603*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED
604*387f9dfdSAndroid Build Coastguard Worker 
605*387f9dfdSAndroid Build Coastguard Worker #include <vector>
606*387f9dfdSAndroid Build Coastguard Worker 
607*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
608*387f9dfdSAndroid Build Coastguard Worker 
609*387f9dfdSAndroid Build Coastguard Worker     class TestSpec;
610*387f9dfdSAndroid Build Coastguard Worker 
611*387f9dfdSAndroid Build Coastguard Worker     struct ITestCase : IShared {
612*387f9dfdSAndroid Build Coastguard Worker         virtual void invoke () const = 0;
613*387f9dfdSAndroid Build Coastguard Worker     protected:
614*387f9dfdSAndroid Build Coastguard Worker         virtual ~ITestCase();
615*387f9dfdSAndroid Build Coastguard Worker     };
616*387f9dfdSAndroid Build Coastguard Worker 
617*387f9dfdSAndroid Build Coastguard Worker     class TestCase;
618*387f9dfdSAndroid Build Coastguard Worker     struct IConfig;
619*387f9dfdSAndroid Build Coastguard Worker 
620*387f9dfdSAndroid Build Coastguard Worker     struct ITestCaseRegistry {
621*387f9dfdSAndroid Build Coastguard Worker         virtual ~ITestCaseRegistry();
622*387f9dfdSAndroid Build Coastguard Worker         virtual std::vector<TestCase> const& getAllTests() const = 0;
623*387f9dfdSAndroid Build Coastguard Worker         virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;
624*387f9dfdSAndroid Build Coastguard Worker     };
625*387f9dfdSAndroid Build Coastguard Worker 
626*387f9dfdSAndroid Build Coastguard Worker     bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );
627*387f9dfdSAndroid Build Coastguard Worker     std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );
628*387f9dfdSAndroid Build Coastguard Worker     std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );
629*387f9dfdSAndroid Build Coastguard Worker 
630*387f9dfdSAndroid Build Coastguard Worker }
631*387f9dfdSAndroid Build Coastguard Worker 
632*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
633*387f9dfdSAndroid Build Coastguard Worker 
634*387f9dfdSAndroid Build Coastguard Worker template<typename C>
635*387f9dfdSAndroid Build Coastguard Worker class MethodTestCase : public SharedImpl<ITestCase> {
636*387f9dfdSAndroid Build Coastguard Worker 
637*387f9dfdSAndroid Build Coastguard Worker public:
MethodTestCase(void (C::* method)())638*387f9dfdSAndroid Build Coastguard Worker     MethodTestCase( void (C::*method)() ) : m_method( method ) {}
639*387f9dfdSAndroid Build Coastguard Worker 
invoke() const640*387f9dfdSAndroid Build Coastguard Worker     virtual void invoke() const {
641*387f9dfdSAndroid Build Coastguard Worker         C obj;
642*387f9dfdSAndroid Build Coastguard Worker         (obj.*m_method)();
643*387f9dfdSAndroid Build Coastguard Worker     }
644*387f9dfdSAndroid Build Coastguard Worker 
645*387f9dfdSAndroid Build Coastguard Worker private:
~MethodTestCase()646*387f9dfdSAndroid Build Coastguard Worker     virtual ~MethodTestCase() {}
647*387f9dfdSAndroid Build Coastguard Worker 
648*387f9dfdSAndroid Build Coastguard Worker     void (C::*m_method)();
649*387f9dfdSAndroid Build Coastguard Worker };
650*387f9dfdSAndroid Build Coastguard Worker 
651*387f9dfdSAndroid Build Coastguard Worker typedef void(*TestFunction)();
652*387f9dfdSAndroid Build Coastguard Worker 
653*387f9dfdSAndroid Build Coastguard Worker struct NameAndDesc {
NameAndDescCatch::NameAndDesc654*387f9dfdSAndroid Build Coastguard Worker     NameAndDesc( const char* _name = "", const char* _description= "" )
655*387f9dfdSAndroid Build Coastguard Worker     : name( _name ), description( _description )
656*387f9dfdSAndroid Build Coastguard Worker     {}
657*387f9dfdSAndroid Build Coastguard Worker 
658*387f9dfdSAndroid Build Coastguard Worker     const char* name;
659*387f9dfdSAndroid Build Coastguard Worker     const char* description;
660*387f9dfdSAndroid Build Coastguard Worker };
661*387f9dfdSAndroid Build Coastguard Worker 
662*387f9dfdSAndroid Build Coastguard Worker void registerTestCase
663*387f9dfdSAndroid Build Coastguard Worker     (   ITestCase* testCase,
664*387f9dfdSAndroid Build Coastguard Worker         char const* className,
665*387f9dfdSAndroid Build Coastguard Worker         NameAndDesc const& nameAndDesc,
666*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo const& lineInfo );
667*387f9dfdSAndroid Build Coastguard Worker 
668*387f9dfdSAndroid Build Coastguard Worker struct AutoReg {
669*387f9dfdSAndroid Build Coastguard Worker 
670*387f9dfdSAndroid Build Coastguard Worker     AutoReg
671*387f9dfdSAndroid Build Coastguard Worker         (   TestFunction function,
672*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo const& lineInfo,
673*387f9dfdSAndroid Build Coastguard Worker             NameAndDesc const& nameAndDesc );
674*387f9dfdSAndroid Build Coastguard Worker 
675*387f9dfdSAndroid Build Coastguard Worker     template<typename C>
AutoRegCatch::AutoReg676*387f9dfdSAndroid Build Coastguard Worker     AutoReg
677*387f9dfdSAndroid Build Coastguard Worker         (   void (C::*method)(),
678*387f9dfdSAndroid Build Coastguard Worker             char const* className,
679*387f9dfdSAndroid Build Coastguard Worker             NameAndDesc const& nameAndDesc,
680*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo const& lineInfo ) {
681*387f9dfdSAndroid Build Coastguard Worker 
682*387f9dfdSAndroid Build Coastguard Worker         registerTestCase
683*387f9dfdSAndroid Build Coastguard Worker             (   new MethodTestCase<C>( method ),
684*387f9dfdSAndroid Build Coastguard Worker                 className,
685*387f9dfdSAndroid Build Coastguard Worker                 nameAndDesc,
686*387f9dfdSAndroid Build Coastguard Worker                 lineInfo );
687*387f9dfdSAndroid Build Coastguard Worker     }
688*387f9dfdSAndroid Build Coastguard Worker 
689*387f9dfdSAndroid Build Coastguard Worker     ~AutoReg();
690*387f9dfdSAndroid Build Coastguard Worker 
691*387f9dfdSAndroid Build Coastguard Worker private:
692*387f9dfdSAndroid Build Coastguard Worker     AutoReg( AutoReg const& );
693*387f9dfdSAndroid Build Coastguard Worker     void operator= ( AutoReg const& );
694*387f9dfdSAndroid Build Coastguard Worker };
695*387f9dfdSAndroid Build Coastguard Worker 
696*387f9dfdSAndroid Build Coastguard Worker void registerTestCaseFunction
697*387f9dfdSAndroid Build Coastguard Worker     (   TestFunction function,
698*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo const& lineInfo,
699*387f9dfdSAndroid Build Coastguard Worker         NameAndDesc const& nameAndDesc );
700*387f9dfdSAndroid Build Coastguard Worker 
701*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
702*387f9dfdSAndroid Build Coastguard Worker 
703*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
704*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
705*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
706*387f9dfdSAndroid Build Coastguard Worker         static void TestName(); \
707*387f9dfdSAndroid Build Coastguard Worker         namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\
708*387f9dfdSAndroid Build Coastguard Worker         static void TestName()
709*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TESTCASE( ... ) \
710*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )
711*387f9dfdSAndroid Build Coastguard Worker 
712*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
713*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
714*387f9dfdSAndroid Build Coastguard Worker         namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }
715*387f9dfdSAndroid Build Coastguard Worker 
716*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
717*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
718*387f9dfdSAndroid Build Coastguard Worker         namespace{ \
719*387f9dfdSAndroid Build Coastguard Worker             struct TestName : ClassName{ \
720*387f9dfdSAndroid Build Coastguard Worker                 void test(); \
721*387f9dfdSAndroid Build Coastguard Worker             }; \
722*387f9dfdSAndroid Build Coastguard Worker             Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
723*387f9dfdSAndroid Build Coastguard Worker         } \
724*387f9dfdSAndroid Build Coastguard Worker         void TestName::test()
725*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
726*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )
727*387f9dfdSAndroid Build Coastguard Worker 
728*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
729*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
730*387f9dfdSAndroid Build Coastguard Worker         Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) );
731*387f9dfdSAndroid Build Coastguard Worker 
732*387f9dfdSAndroid Build Coastguard Worker #else
733*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
734*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
735*387f9dfdSAndroid Build Coastguard Worker         static void TestName(); \
736*387f9dfdSAndroid Build Coastguard Worker         namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
737*387f9dfdSAndroid Build Coastguard Worker         static void TestName()
738*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
739*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc )
740*387f9dfdSAndroid Build Coastguard Worker 
741*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
742*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
743*387f9dfdSAndroid Build Coastguard Worker         namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }
744*387f9dfdSAndroid Build Coastguard Worker 
745*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
746*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\
747*387f9dfdSAndroid Build Coastguard Worker         namespace{ \
748*387f9dfdSAndroid Build Coastguard Worker             struct TestCaseName : ClassName{ \
749*387f9dfdSAndroid Build Coastguard Worker                 void test(); \
750*387f9dfdSAndroid Build Coastguard Worker             }; \
751*387f9dfdSAndroid Build Coastguard Worker             Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
752*387f9dfdSAndroid Build Coastguard Worker         } \
753*387f9dfdSAndroid Build Coastguard Worker         void TestCaseName::test()
754*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
755*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc )
756*387f9dfdSAndroid Build Coastguard Worker 
757*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////////
758*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
759*387f9dfdSAndroid Build Coastguard Worker         Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) );
760*387f9dfdSAndroid Build Coastguard Worker #endif
761*387f9dfdSAndroid Build Coastguard Worker 
762*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_capture.hpp
763*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
764*387f9dfdSAndroid Build Coastguard Worker 
765*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_result_builder.h
766*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
767*387f9dfdSAndroid Build Coastguard Worker 
768*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_result_type.h
769*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED
770*387f9dfdSAndroid Build Coastguard Worker 
771*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
772*387f9dfdSAndroid Build Coastguard Worker 
773*387f9dfdSAndroid Build Coastguard Worker     // ResultWas::OfType enum
774*387f9dfdSAndroid Build Coastguard Worker     struct ResultWas { enum OfType {
775*387f9dfdSAndroid Build Coastguard Worker         Unknown = -1,
776*387f9dfdSAndroid Build Coastguard Worker         Ok = 0,
777*387f9dfdSAndroid Build Coastguard Worker         Info = 1,
778*387f9dfdSAndroid Build Coastguard Worker         Warning = 2,
779*387f9dfdSAndroid Build Coastguard Worker 
780*387f9dfdSAndroid Build Coastguard Worker         FailureBit = 0x10,
781*387f9dfdSAndroid Build Coastguard Worker 
782*387f9dfdSAndroid Build Coastguard Worker         ExpressionFailed = FailureBit | 1,
783*387f9dfdSAndroid Build Coastguard Worker         ExplicitFailure = FailureBit | 2,
784*387f9dfdSAndroid Build Coastguard Worker 
785*387f9dfdSAndroid Build Coastguard Worker         Exception = 0x100 | FailureBit,
786*387f9dfdSAndroid Build Coastguard Worker 
787*387f9dfdSAndroid Build Coastguard Worker         ThrewException = Exception | 1,
788*387f9dfdSAndroid Build Coastguard Worker         DidntThrowException = Exception | 2,
789*387f9dfdSAndroid Build Coastguard Worker 
790*387f9dfdSAndroid Build Coastguard Worker         FatalErrorCondition = 0x200 | FailureBit
791*387f9dfdSAndroid Build Coastguard Worker 
792*387f9dfdSAndroid Build Coastguard Worker     }; };
793*387f9dfdSAndroid Build Coastguard Worker 
isOk(ResultWas::OfType resultType)794*387f9dfdSAndroid Build Coastguard Worker     inline bool isOk( ResultWas::OfType resultType ) {
795*387f9dfdSAndroid Build Coastguard Worker         return ( resultType & ResultWas::FailureBit ) == 0;
796*387f9dfdSAndroid Build Coastguard Worker     }
isJustInfo(int flags)797*387f9dfdSAndroid Build Coastguard Worker     inline bool isJustInfo( int flags ) {
798*387f9dfdSAndroid Build Coastguard Worker         return flags == ResultWas::Info;
799*387f9dfdSAndroid Build Coastguard Worker     }
800*387f9dfdSAndroid Build Coastguard Worker 
801*387f9dfdSAndroid Build Coastguard Worker     // ResultDisposition::Flags enum
802*387f9dfdSAndroid Build Coastguard Worker     struct ResultDisposition { enum Flags {
803*387f9dfdSAndroid Build Coastguard Worker         Normal = 0x01,
804*387f9dfdSAndroid Build Coastguard Worker 
805*387f9dfdSAndroid Build Coastguard Worker         ContinueOnFailure = 0x02,   // Failures fail test, but execution continues
806*387f9dfdSAndroid Build Coastguard Worker         FalseTest = 0x04,           // Prefix expression with !
807*387f9dfdSAndroid Build Coastguard Worker         SuppressFail = 0x08         // Failures are reported but do not fail the test
808*387f9dfdSAndroid Build Coastguard Worker     }; };
809*387f9dfdSAndroid Build Coastguard Worker 
operator |(ResultDisposition::Flags lhs,ResultDisposition::Flags rhs)810*387f9dfdSAndroid Build Coastguard Worker     inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
811*387f9dfdSAndroid Build Coastguard Worker         return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
812*387f9dfdSAndroid Build Coastguard Worker     }
813*387f9dfdSAndroid Build Coastguard Worker 
shouldContinueOnFailure(int flags)814*387f9dfdSAndroid Build Coastguard Worker     inline bool shouldContinueOnFailure( int flags )    { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
isFalseTest(int flags)815*387f9dfdSAndroid Build Coastguard Worker     inline bool isFalseTest( int flags )                { return ( flags & ResultDisposition::FalseTest ) != 0; }
shouldSuppressFailure(int flags)816*387f9dfdSAndroid Build Coastguard Worker     inline bool shouldSuppressFailure( int flags )      { return ( flags & ResultDisposition::SuppressFail ) != 0; }
817*387f9dfdSAndroid Build Coastguard Worker 
818*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
819*387f9dfdSAndroid Build Coastguard Worker 
820*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_assertionresult.h
821*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
822*387f9dfdSAndroid Build Coastguard Worker 
823*387f9dfdSAndroid Build Coastguard Worker #include <string>
824*387f9dfdSAndroid Build Coastguard Worker 
825*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
826*387f9dfdSAndroid Build Coastguard Worker 
827*387f9dfdSAndroid Build Coastguard Worker     struct AssertionInfo
828*387f9dfdSAndroid Build Coastguard Worker     {
AssertionInfoCatch::AssertionInfo829*387f9dfdSAndroid Build Coastguard Worker         AssertionInfo() {}
830*387f9dfdSAndroid Build Coastguard Worker         AssertionInfo(  std::string const& _macroName,
831*387f9dfdSAndroid Build Coastguard Worker                         SourceLineInfo const& _lineInfo,
832*387f9dfdSAndroid Build Coastguard Worker                         std::string const& _capturedExpression,
833*387f9dfdSAndroid Build Coastguard Worker                         ResultDisposition::Flags _resultDisposition );
834*387f9dfdSAndroid Build Coastguard Worker 
835*387f9dfdSAndroid Build Coastguard Worker         std::string macroName;
836*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo lineInfo;
837*387f9dfdSAndroid Build Coastguard Worker         std::string capturedExpression;
838*387f9dfdSAndroid Build Coastguard Worker         ResultDisposition::Flags resultDisposition;
839*387f9dfdSAndroid Build Coastguard Worker     };
840*387f9dfdSAndroid Build Coastguard Worker 
841*387f9dfdSAndroid Build Coastguard Worker     struct AssertionResultData
842*387f9dfdSAndroid Build Coastguard Worker     {
AssertionResultDataCatch::AssertionResultData843*387f9dfdSAndroid Build Coastguard Worker         AssertionResultData() : resultType( ResultWas::Unknown ) {}
844*387f9dfdSAndroid Build Coastguard Worker 
845*387f9dfdSAndroid Build Coastguard Worker         std::string reconstructedExpression;
846*387f9dfdSAndroid Build Coastguard Worker         std::string message;
847*387f9dfdSAndroid Build Coastguard Worker         ResultWas::OfType resultType;
848*387f9dfdSAndroid Build Coastguard Worker     };
849*387f9dfdSAndroid Build Coastguard Worker 
850*387f9dfdSAndroid Build Coastguard Worker     class AssertionResult {
851*387f9dfdSAndroid Build Coastguard Worker     public:
852*387f9dfdSAndroid Build Coastguard Worker         AssertionResult();
853*387f9dfdSAndroid Build Coastguard Worker         AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
854*387f9dfdSAndroid Build Coastguard Worker         ~AssertionResult();
855*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
856*387f9dfdSAndroid Build Coastguard Worker          AssertionResult( AssertionResult const& )              = default;
857*387f9dfdSAndroid Build Coastguard Worker          AssertionResult( AssertionResult && )                  = default;
858*387f9dfdSAndroid Build Coastguard Worker          AssertionResult& operator = ( AssertionResult const& ) = default;
859*387f9dfdSAndroid Build Coastguard Worker          AssertionResult& operator = ( AssertionResult && )     = default;
860*387f9dfdSAndroid Build Coastguard Worker #  endif
861*387f9dfdSAndroid Build Coastguard Worker 
862*387f9dfdSAndroid Build Coastguard Worker         bool isOk() const;
863*387f9dfdSAndroid Build Coastguard Worker         bool succeeded() const;
864*387f9dfdSAndroid Build Coastguard Worker         ResultWas::OfType getResultType() const;
865*387f9dfdSAndroid Build Coastguard Worker         bool hasExpression() const;
866*387f9dfdSAndroid Build Coastguard Worker         bool hasMessage() const;
867*387f9dfdSAndroid Build Coastguard Worker         std::string getExpression() const;
868*387f9dfdSAndroid Build Coastguard Worker         std::string getExpressionInMacro() const;
869*387f9dfdSAndroid Build Coastguard Worker         bool hasExpandedExpression() const;
870*387f9dfdSAndroid Build Coastguard Worker         std::string getExpandedExpression() const;
871*387f9dfdSAndroid Build Coastguard Worker         std::string getMessage() const;
872*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo getSourceInfo() const;
873*387f9dfdSAndroid Build Coastguard Worker         std::string getTestMacroName() const;
874*387f9dfdSAndroid Build Coastguard Worker 
875*387f9dfdSAndroid Build Coastguard Worker     protected:
876*387f9dfdSAndroid Build Coastguard Worker         AssertionInfo m_info;
877*387f9dfdSAndroid Build Coastguard Worker         AssertionResultData m_resultData;
878*387f9dfdSAndroid Build Coastguard Worker     };
879*387f9dfdSAndroid Build Coastguard Worker 
880*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
881*387f9dfdSAndroid Build Coastguard Worker 
882*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_matchers.hpp
883*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED
884*387f9dfdSAndroid Build Coastguard Worker 
885*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
886*387f9dfdSAndroid Build Coastguard Worker namespace Matchers {
887*387f9dfdSAndroid Build Coastguard Worker     namespace Impl {
888*387f9dfdSAndroid Build Coastguard Worker 
889*387f9dfdSAndroid Build Coastguard Worker     namespace Generic {
890*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT> class AllOf;
891*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT> class AnyOf;
892*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT> class Not;
893*387f9dfdSAndroid Build Coastguard Worker     }
894*387f9dfdSAndroid Build Coastguard Worker 
895*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
896*387f9dfdSAndroid Build Coastguard Worker     struct Matcher : SharedImpl<IShared>
897*387f9dfdSAndroid Build Coastguard Worker     {
898*387f9dfdSAndroid Build Coastguard Worker         typedef ExpressionT ExpressionType;
899*387f9dfdSAndroid Build Coastguard Worker 
~MatcherCatch::Matchers::Impl::Matcher900*387f9dfdSAndroid Build Coastguard Worker         virtual ~Matcher() {}
901*387f9dfdSAndroid Build Coastguard Worker         virtual Ptr<Matcher> clone() const = 0;
902*387f9dfdSAndroid Build Coastguard Worker         virtual bool match( ExpressionT const& expr ) const = 0;
903*387f9dfdSAndroid Build Coastguard Worker         virtual std::string toString() const = 0;
904*387f9dfdSAndroid Build Coastguard Worker 
905*387f9dfdSAndroid Build Coastguard Worker         Generic::AllOf<ExpressionT> operator && ( Matcher<ExpressionT> const& other ) const;
906*387f9dfdSAndroid Build Coastguard Worker         Generic::AnyOf<ExpressionT> operator || ( Matcher<ExpressionT> const& other ) const;
907*387f9dfdSAndroid Build Coastguard Worker         Generic::Not<ExpressionT> operator ! () const;
908*387f9dfdSAndroid Build Coastguard Worker     };
909*387f9dfdSAndroid Build Coastguard Worker 
910*387f9dfdSAndroid Build Coastguard Worker     template<typename DerivedT, typename ExpressionT>
911*387f9dfdSAndroid Build Coastguard Worker     struct MatcherImpl : Matcher<ExpressionT> {
912*387f9dfdSAndroid Build Coastguard Worker 
cloneCatch::Matchers::Impl::MatcherImpl913*387f9dfdSAndroid Build Coastguard Worker         virtual Ptr<Matcher<ExpressionT> > clone() const {
914*387f9dfdSAndroid Build Coastguard Worker             return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) );
915*387f9dfdSAndroid Build Coastguard Worker         }
916*387f9dfdSAndroid Build Coastguard Worker     };
917*387f9dfdSAndroid Build Coastguard Worker 
918*387f9dfdSAndroid Build Coastguard Worker     namespace Generic {
919*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT>
920*387f9dfdSAndroid Build Coastguard Worker         class Not : public MatcherImpl<Not<ExpressionT>, ExpressionT> {
921*387f9dfdSAndroid Build Coastguard Worker         public:
Not(Matcher<ExpressionT> const & matcher)922*387f9dfdSAndroid Build Coastguard Worker             explicit Not( Matcher<ExpressionT> const& matcher ) : m_matcher(matcher.clone()) {}
Not(Not const & other)923*387f9dfdSAndroid Build Coastguard Worker             Not( Not const& other ) : m_matcher( other.m_matcher ) {}
924*387f9dfdSAndroid Build Coastguard Worker 
match(ExpressionT const & expr) const925*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( ExpressionT const& expr ) const CATCH_OVERRIDE {
926*387f9dfdSAndroid Build Coastguard Worker                 return !m_matcher->match( expr );
927*387f9dfdSAndroid Build Coastguard Worker             }
928*387f9dfdSAndroid Build Coastguard Worker 
toString() const929*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const CATCH_OVERRIDE {
930*387f9dfdSAndroid Build Coastguard Worker                 return "not " + m_matcher->toString();
931*387f9dfdSAndroid Build Coastguard Worker             }
932*387f9dfdSAndroid Build Coastguard Worker         private:
933*387f9dfdSAndroid Build Coastguard Worker             Ptr< Matcher<ExpressionT> > m_matcher;
934*387f9dfdSAndroid Build Coastguard Worker         };
935*387f9dfdSAndroid Build Coastguard Worker 
936*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT>
937*387f9dfdSAndroid Build Coastguard Worker         class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> {
938*387f9dfdSAndroid Build Coastguard Worker         public:
939*387f9dfdSAndroid Build Coastguard Worker 
AllOf()940*387f9dfdSAndroid Build Coastguard Worker             AllOf() {}
AllOf(AllOf const & other)941*387f9dfdSAndroid Build Coastguard Worker             AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {}
942*387f9dfdSAndroid Build Coastguard Worker 
add(Matcher<ExpressionT> const & matcher)943*387f9dfdSAndroid Build Coastguard Worker             AllOf& add( Matcher<ExpressionT> const& matcher ) {
944*387f9dfdSAndroid Build Coastguard Worker                 m_matchers.push_back( matcher.clone() );
945*387f9dfdSAndroid Build Coastguard Worker                 return *this;
946*387f9dfdSAndroid Build Coastguard Worker             }
match(ExpressionT const & expr) const947*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( ExpressionT const& expr ) const
948*387f9dfdSAndroid Build Coastguard Worker             {
949*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < m_matchers.size(); ++i )
950*387f9dfdSAndroid Build Coastguard Worker                     if( !m_matchers[i]->match( expr ) )
951*387f9dfdSAndroid Build Coastguard Worker                         return false;
952*387f9dfdSAndroid Build Coastguard Worker                 return true;
953*387f9dfdSAndroid Build Coastguard Worker             }
toString() const954*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
955*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
956*387f9dfdSAndroid Build Coastguard Worker                 oss << "( ";
957*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
958*387f9dfdSAndroid Build Coastguard Worker                     if( i != 0 )
959*387f9dfdSAndroid Build Coastguard Worker                         oss << " and ";
960*387f9dfdSAndroid Build Coastguard Worker                     oss << m_matchers[i]->toString();
961*387f9dfdSAndroid Build Coastguard Worker                 }
962*387f9dfdSAndroid Build Coastguard Worker                 oss << " )";
963*387f9dfdSAndroid Build Coastguard Worker                 return oss.str();
964*387f9dfdSAndroid Build Coastguard Worker             }
965*387f9dfdSAndroid Build Coastguard Worker 
operator &&(Matcher<ExpressionT> const & other) const966*387f9dfdSAndroid Build Coastguard Worker             AllOf operator && ( Matcher<ExpressionT> const& other ) const {
967*387f9dfdSAndroid Build Coastguard Worker                 AllOf allOfExpr( *this );
968*387f9dfdSAndroid Build Coastguard Worker                 allOfExpr.add( other );
969*387f9dfdSAndroid Build Coastguard Worker                 return allOfExpr;
970*387f9dfdSAndroid Build Coastguard Worker             }
971*387f9dfdSAndroid Build Coastguard Worker 
972*387f9dfdSAndroid Build Coastguard Worker         private:
973*387f9dfdSAndroid Build Coastguard Worker             std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
974*387f9dfdSAndroid Build Coastguard Worker         };
975*387f9dfdSAndroid Build Coastguard Worker 
976*387f9dfdSAndroid Build Coastguard Worker         template<typename ExpressionT>
977*387f9dfdSAndroid Build Coastguard Worker         class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> {
978*387f9dfdSAndroid Build Coastguard Worker         public:
979*387f9dfdSAndroid Build Coastguard Worker 
AnyOf()980*387f9dfdSAndroid Build Coastguard Worker             AnyOf() {}
AnyOf(AnyOf const & other)981*387f9dfdSAndroid Build Coastguard Worker             AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {}
982*387f9dfdSAndroid Build Coastguard Worker 
add(Matcher<ExpressionT> const & matcher)983*387f9dfdSAndroid Build Coastguard Worker             AnyOf& add( Matcher<ExpressionT> const& matcher ) {
984*387f9dfdSAndroid Build Coastguard Worker                 m_matchers.push_back( matcher.clone() );
985*387f9dfdSAndroid Build Coastguard Worker                 return *this;
986*387f9dfdSAndroid Build Coastguard Worker             }
match(ExpressionT const & expr) const987*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( ExpressionT const& expr ) const
988*387f9dfdSAndroid Build Coastguard Worker             {
989*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < m_matchers.size(); ++i )
990*387f9dfdSAndroid Build Coastguard Worker                     if( m_matchers[i]->match( expr ) )
991*387f9dfdSAndroid Build Coastguard Worker                         return true;
992*387f9dfdSAndroid Build Coastguard Worker                 return false;
993*387f9dfdSAndroid Build Coastguard Worker             }
toString() const994*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
995*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
996*387f9dfdSAndroid Build Coastguard Worker                 oss << "( ";
997*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
998*387f9dfdSAndroid Build Coastguard Worker                     if( i != 0 )
999*387f9dfdSAndroid Build Coastguard Worker                         oss << " or ";
1000*387f9dfdSAndroid Build Coastguard Worker                     oss << m_matchers[i]->toString();
1001*387f9dfdSAndroid Build Coastguard Worker                 }
1002*387f9dfdSAndroid Build Coastguard Worker                 oss << " )";
1003*387f9dfdSAndroid Build Coastguard Worker                 return oss.str();
1004*387f9dfdSAndroid Build Coastguard Worker             }
1005*387f9dfdSAndroid Build Coastguard Worker 
operator ||(Matcher<ExpressionT> const & other) const1006*387f9dfdSAndroid Build Coastguard Worker             AnyOf operator || ( Matcher<ExpressionT> const& other ) const {
1007*387f9dfdSAndroid Build Coastguard Worker                 AnyOf anyOfExpr( *this );
1008*387f9dfdSAndroid Build Coastguard Worker                 anyOfExpr.add( other );
1009*387f9dfdSAndroid Build Coastguard Worker                 return anyOfExpr;
1010*387f9dfdSAndroid Build Coastguard Worker             }
1011*387f9dfdSAndroid Build Coastguard Worker 
1012*387f9dfdSAndroid Build Coastguard Worker         private:
1013*387f9dfdSAndroid Build Coastguard Worker             std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
1014*387f9dfdSAndroid Build Coastguard Worker         };
1015*387f9dfdSAndroid Build Coastguard Worker 
1016*387f9dfdSAndroid Build Coastguard Worker     } // namespace Generic
1017*387f9dfdSAndroid Build Coastguard Worker 
1018*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
operator &&(Matcher<ExpressionT> const & other) const1019*387f9dfdSAndroid Build Coastguard Worker     Generic::AllOf<ExpressionT> Matcher<ExpressionT>::operator && ( Matcher<ExpressionT> const& other ) const {
1020*387f9dfdSAndroid Build Coastguard Worker         Generic::AllOf<ExpressionT> allOfExpr;
1021*387f9dfdSAndroid Build Coastguard Worker         allOfExpr.add( *this );
1022*387f9dfdSAndroid Build Coastguard Worker         allOfExpr.add( other );
1023*387f9dfdSAndroid Build Coastguard Worker         return allOfExpr;
1024*387f9dfdSAndroid Build Coastguard Worker     }
1025*387f9dfdSAndroid Build Coastguard Worker 
1026*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
operator ||(Matcher<ExpressionT> const & other) const1027*387f9dfdSAndroid Build Coastguard Worker     Generic::AnyOf<ExpressionT> Matcher<ExpressionT>::operator || ( Matcher<ExpressionT> const& other ) const {
1028*387f9dfdSAndroid Build Coastguard Worker         Generic::AnyOf<ExpressionT> anyOfExpr;
1029*387f9dfdSAndroid Build Coastguard Worker         anyOfExpr.add( *this );
1030*387f9dfdSAndroid Build Coastguard Worker         anyOfExpr.add( other );
1031*387f9dfdSAndroid Build Coastguard Worker         return anyOfExpr;
1032*387f9dfdSAndroid Build Coastguard Worker     }
1033*387f9dfdSAndroid Build Coastguard Worker 
1034*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
operator !() const1035*387f9dfdSAndroid Build Coastguard Worker     Generic::Not<ExpressionT> Matcher<ExpressionT>::operator ! () const {
1036*387f9dfdSAndroid Build Coastguard Worker         return Generic::Not<ExpressionT>( *this );
1037*387f9dfdSAndroid Build Coastguard Worker     }
1038*387f9dfdSAndroid Build Coastguard Worker 
1039*387f9dfdSAndroid Build Coastguard Worker     namespace StdString {
1040*387f9dfdSAndroid Build Coastguard Worker 
makeString(std::string const & str)1041*387f9dfdSAndroid Build Coastguard Worker         inline std::string makeString( std::string const& str ) { return str; }
makeString(const char * str)1042*387f9dfdSAndroid Build Coastguard Worker         inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); }
1043*387f9dfdSAndroid Build Coastguard Worker 
1044*387f9dfdSAndroid Build Coastguard Worker         struct CasedString
1045*387f9dfdSAndroid Build Coastguard Worker         {
CasedStringCatch::Matchers::Impl::StdString::CasedString1046*387f9dfdSAndroid Build Coastguard Worker             CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )
1047*387f9dfdSAndroid Build Coastguard Worker             :   m_caseSensitivity( caseSensitivity ),
1048*387f9dfdSAndroid Build Coastguard Worker                 m_str( adjustString( str ) )
1049*387f9dfdSAndroid Build Coastguard Worker             {}
adjustStringCatch::Matchers::Impl::StdString::CasedString1050*387f9dfdSAndroid Build Coastguard Worker             std::string adjustString( std::string const& str ) const {
1051*387f9dfdSAndroid Build Coastguard Worker                 return m_caseSensitivity == CaseSensitive::No
1052*387f9dfdSAndroid Build Coastguard Worker                     ? toLower( str )
1053*387f9dfdSAndroid Build Coastguard Worker                     : str;
1054*387f9dfdSAndroid Build Coastguard Worker 
1055*387f9dfdSAndroid Build Coastguard Worker             }
toStringSuffixCatch::Matchers::Impl::StdString::CasedString1056*387f9dfdSAndroid Build Coastguard Worker             std::string toStringSuffix() const
1057*387f9dfdSAndroid Build Coastguard Worker             {
1058*387f9dfdSAndroid Build Coastguard Worker                 return m_caseSensitivity == CaseSensitive::No
1059*387f9dfdSAndroid Build Coastguard Worker                     ? " (case insensitive)"
1060*387f9dfdSAndroid Build Coastguard Worker                     : "";
1061*387f9dfdSAndroid Build Coastguard Worker             }
1062*387f9dfdSAndroid Build Coastguard Worker             CaseSensitive::Choice m_caseSensitivity;
1063*387f9dfdSAndroid Build Coastguard Worker             std::string m_str;
1064*387f9dfdSAndroid Build Coastguard Worker         };
1065*387f9dfdSAndroid Build Coastguard Worker 
1066*387f9dfdSAndroid Build Coastguard Worker         struct Equals : MatcherImpl<Equals, std::string> {
EqualsCatch::Matchers::Impl::StdString::Equals1067*387f9dfdSAndroid Build Coastguard Worker             Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )
1068*387f9dfdSAndroid Build Coastguard Worker             :   m_data( str, caseSensitivity )
1069*387f9dfdSAndroid Build Coastguard Worker             {}
EqualsCatch::Matchers::Impl::StdString::Equals1070*387f9dfdSAndroid Build Coastguard Worker             Equals( Equals const& other ) : m_data( other.m_data ){}
1071*387f9dfdSAndroid Build Coastguard Worker 
1072*387f9dfdSAndroid Build Coastguard Worker             virtual ~Equals();
1073*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::StdString::Equals1074*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( std::string const& expr ) const {
1075*387f9dfdSAndroid Build Coastguard Worker                 return m_data.m_str == m_data.adjustString( expr );;
1076*387f9dfdSAndroid Build Coastguard Worker             }
toStringCatch::Matchers::Impl::StdString::Equals1077*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
1078*387f9dfdSAndroid Build Coastguard Worker                 return "equals: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
1079*387f9dfdSAndroid Build Coastguard Worker             }
1080*387f9dfdSAndroid Build Coastguard Worker 
1081*387f9dfdSAndroid Build Coastguard Worker             CasedString m_data;
1082*387f9dfdSAndroid Build Coastguard Worker         };
1083*387f9dfdSAndroid Build Coastguard Worker 
1084*387f9dfdSAndroid Build Coastguard Worker         struct Contains : MatcherImpl<Contains, std::string> {
ContainsCatch::Matchers::Impl::StdString::Contains1085*387f9dfdSAndroid Build Coastguard Worker             Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )
1086*387f9dfdSAndroid Build Coastguard Worker             : m_data( substr, caseSensitivity ){}
ContainsCatch::Matchers::Impl::StdString::Contains1087*387f9dfdSAndroid Build Coastguard Worker             Contains( Contains const& other ) : m_data( other.m_data ){}
1088*387f9dfdSAndroid Build Coastguard Worker 
1089*387f9dfdSAndroid Build Coastguard Worker             virtual ~Contains();
1090*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::StdString::Contains1091*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( std::string const& expr ) const {
1092*387f9dfdSAndroid Build Coastguard Worker                 return m_data.adjustString( expr ).find( m_data.m_str ) != std::string::npos;
1093*387f9dfdSAndroid Build Coastguard Worker             }
toStringCatch::Matchers::Impl::StdString::Contains1094*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
1095*387f9dfdSAndroid Build Coastguard Worker                 return "contains: \"" + m_data.m_str  + "\"" + m_data.toStringSuffix();
1096*387f9dfdSAndroid Build Coastguard Worker             }
1097*387f9dfdSAndroid Build Coastguard Worker 
1098*387f9dfdSAndroid Build Coastguard Worker             CasedString m_data;
1099*387f9dfdSAndroid Build Coastguard Worker         };
1100*387f9dfdSAndroid Build Coastguard Worker 
1101*387f9dfdSAndroid Build Coastguard Worker         struct StartsWith : MatcherImpl<StartsWith, std::string> {
StartsWithCatch::Matchers::Impl::StdString::StartsWith1102*387f9dfdSAndroid Build Coastguard Worker             StartsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )
1103*387f9dfdSAndroid Build Coastguard Worker             : m_data( substr, caseSensitivity ){}
1104*387f9dfdSAndroid Build Coastguard Worker 
StartsWithCatch::Matchers::Impl::StdString::StartsWith1105*387f9dfdSAndroid Build Coastguard Worker             StartsWith( StartsWith const& other ) : m_data( other.m_data ){}
1106*387f9dfdSAndroid Build Coastguard Worker 
1107*387f9dfdSAndroid Build Coastguard Worker             virtual ~StartsWith();
1108*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::StdString::StartsWith1109*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( std::string const& expr ) const {
1110*387f9dfdSAndroid Build Coastguard Worker                 return startsWith( m_data.adjustString( expr ), m_data.m_str );
1111*387f9dfdSAndroid Build Coastguard Worker             }
toStringCatch::Matchers::Impl::StdString::StartsWith1112*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
1113*387f9dfdSAndroid Build Coastguard Worker                 return "starts with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
1114*387f9dfdSAndroid Build Coastguard Worker             }
1115*387f9dfdSAndroid Build Coastguard Worker 
1116*387f9dfdSAndroid Build Coastguard Worker             CasedString m_data;
1117*387f9dfdSAndroid Build Coastguard Worker         };
1118*387f9dfdSAndroid Build Coastguard Worker 
1119*387f9dfdSAndroid Build Coastguard Worker         struct EndsWith : MatcherImpl<EndsWith, std::string> {
EndsWithCatch::Matchers::Impl::StdString::EndsWith1120*387f9dfdSAndroid Build Coastguard Worker             EndsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )
1121*387f9dfdSAndroid Build Coastguard Worker             : m_data( substr, caseSensitivity ){}
EndsWithCatch::Matchers::Impl::StdString::EndsWith1122*387f9dfdSAndroid Build Coastguard Worker             EndsWith( EndsWith const& other ) : m_data( other.m_data ){}
1123*387f9dfdSAndroid Build Coastguard Worker 
1124*387f9dfdSAndroid Build Coastguard Worker             virtual ~EndsWith();
1125*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::StdString::EndsWith1126*387f9dfdSAndroid Build Coastguard Worker             virtual bool match( std::string const& expr ) const {
1127*387f9dfdSAndroid Build Coastguard Worker                 return endsWith( m_data.adjustString( expr ), m_data.m_str );
1128*387f9dfdSAndroid Build Coastguard Worker             }
toStringCatch::Matchers::Impl::StdString::EndsWith1129*387f9dfdSAndroid Build Coastguard Worker             virtual std::string toString() const {
1130*387f9dfdSAndroid Build Coastguard Worker                 return "ends with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
1131*387f9dfdSAndroid Build Coastguard Worker             }
1132*387f9dfdSAndroid Build Coastguard Worker 
1133*387f9dfdSAndroid Build Coastguard Worker             CasedString m_data;
1134*387f9dfdSAndroid Build Coastguard Worker         };
1135*387f9dfdSAndroid Build Coastguard Worker     } // namespace StdString
1136*387f9dfdSAndroid Build Coastguard Worker     } // namespace Impl
1137*387f9dfdSAndroid Build Coastguard Worker 
1138*387f9dfdSAndroid Build Coastguard Worker     // The following functions create the actual matcher objects.
1139*387f9dfdSAndroid Build Coastguard Worker     // This allows the types to be inferred
1140*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
Not(Impl::Matcher<ExpressionT> const & m)1141*387f9dfdSAndroid Build Coastguard Worker     inline Impl::Generic::Not<ExpressionT> Not( Impl::Matcher<ExpressionT> const& m ) {
1142*387f9dfdSAndroid Build Coastguard Worker         return Impl::Generic::Not<ExpressionT>( m );
1143*387f9dfdSAndroid Build Coastguard Worker     }
1144*387f9dfdSAndroid Build Coastguard Worker 
1145*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
AllOf(Impl::Matcher<ExpressionT> const & m1,Impl::Matcher<ExpressionT> const & m2)1146*387f9dfdSAndroid Build Coastguard Worker     inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
1147*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m2 ) {
1148*387f9dfdSAndroid Build Coastguard Worker         return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );
1149*387f9dfdSAndroid Build Coastguard Worker     }
1150*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
AllOf(Impl::Matcher<ExpressionT> const & m1,Impl::Matcher<ExpressionT> const & m2,Impl::Matcher<ExpressionT> const & m3)1151*387f9dfdSAndroid Build Coastguard Worker     inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
1152*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m2,
1153*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m3 ) {
1154*387f9dfdSAndroid Build Coastguard Worker         return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
1155*387f9dfdSAndroid Build Coastguard Worker     }
1156*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
AnyOf(Impl::Matcher<ExpressionT> const & m1,Impl::Matcher<ExpressionT> const & m2)1157*387f9dfdSAndroid Build Coastguard Worker     inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
1158*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m2 ) {
1159*387f9dfdSAndroid Build Coastguard Worker         return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );
1160*387f9dfdSAndroid Build Coastguard Worker     }
1161*387f9dfdSAndroid Build Coastguard Worker     template<typename ExpressionT>
AnyOf(Impl::Matcher<ExpressionT> const & m1,Impl::Matcher<ExpressionT> const & m2,Impl::Matcher<ExpressionT> const & m3)1162*387f9dfdSAndroid Build Coastguard Worker     inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
1163*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m2,
1164*387f9dfdSAndroid Build Coastguard Worker                                                     Impl::Matcher<ExpressionT> const& m3 ) {
1165*387f9dfdSAndroid Build Coastguard Worker         return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
1166*387f9dfdSAndroid Build Coastguard Worker     }
1167*387f9dfdSAndroid Build Coastguard Worker 
Equals(std::string const & str,CaseSensitive::Choice caseSensitivity=CaseSensitive::Yes)1168*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::Equals      Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {
1169*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::Equals( str, caseSensitivity );
1170*387f9dfdSAndroid Build Coastguard Worker     }
Equals(const char * str,CaseSensitive::Choice caseSensitivity=CaseSensitive::Yes)1171*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::Equals      Equals( const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {
1172*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::Equals( Impl::StdString::makeString( str ), caseSensitivity );
1173*387f9dfdSAndroid Build Coastguard Worker     }
Contains(std::string const & substr,CaseSensitive::Choice caseSensitivity=CaseSensitive::Yes)1174*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::Contains    Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {
1175*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::Contains( substr, caseSensitivity );
1176*387f9dfdSAndroid Build Coastguard Worker     }
Contains(const char * substr,CaseSensitive::Choice caseSensitivity=CaseSensitive::Yes)1177*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::Contains    Contains( const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {
1178*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::Contains( Impl::StdString::makeString( substr ), caseSensitivity );
1179*387f9dfdSAndroid Build Coastguard Worker     }
StartsWith(std::string const & substr)1180*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::StartsWith  StartsWith( std::string const& substr ) {
1181*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::StartsWith( substr );
1182*387f9dfdSAndroid Build Coastguard Worker     }
StartsWith(const char * substr)1183*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::StartsWith  StartsWith( const char* substr ) {
1184*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) );
1185*387f9dfdSAndroid Build Coastguard Worker     }
EndsWith(std::string const & substr)1186*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::EndsWith    EndsWith( std::string const& substr ) {
1187*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::EndsWith( substr );
1188*387f9dfdSAndroid Build Coastguard Worker     }
EndsWith(const char * substr)1189*387f9dfdSAndroid Build Coastguard Worker     inline Impl::StdString::EndsWith    EndsWith( const char* substr ) {
1190*387f9dfdSAndroid Build Coastguard Worker         return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) );
1191*387f9dfdSAndroid Build Coastguard Worker     }
1192*387f9dfdSAndroid Build Coastguard Worker 
1193*387f9dfdSAndroid Build Coastguard Worker } // namespace Matchers
1194*387f9dfdSAndroid Build Coastguard Worker 
1195*387f9dfdSAndroid Build Coastguard Worker using namespace Matchers;
1196*387f9dfdSAndroid Build Coastguard Worker 
1197*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
1198*387f9dfdSAndroid Build Coastguard Worker 
1199*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1200*387f9dfdSAndroid Build Coastguard Worker 
1201*387f9dfdSAndroid Build Coastguard Worker     struct TestFailureException{};
1202*387f9dfdSAndroid Build Coastguard Worker 
1203*387f9dfdSAndroid Build Coastguard Worker     template<typename T> class ExpressionLhs;
1204*387f9dfdSAndroid Build Coastguard Worker 
1205*387f9dfdSAndroid Build Coastguard Worker     struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
1206*387f9dfdSAndroid Build Coastguard Worker 
1207*387f9dfdSAndroid Build Coastguard Worker     struct CopyableStream {
CopyableStreamCatch::CopyableStream1208*387f9dfdSAndroid Build Coastguard Worker         CopyableStream() {}
CopyableStreamCatch::CopyableStream1209*387f9dfdSAndroid Build Coastguard Worker         CopyableStream( CopyableStream const& other ) {
1210*387f9dfdSAndroid Build Coastguard Worker             oss << other.oss.str();
1211*387f9dfdSAndroid Build Coastguard Worker         }
operator =Catch::CopyableStream1212*387f9dfdSAndroid Build Coastguard Worker         CopyableStream& operator=( CopyableStream const& other ) {
1213*387f9dfdSAndroid Build Coastguard Worker             oss.str("");
1214*387f9dfdSAndroid Build Coastguard Worker             oss << other.oss.str();
1215*387f9dfdSAndroid Build Coastguard Worker             return *this;
1216*387f9dfdSAndroid Build Coastguard Worker         }
1217*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream oss;
1218*387f9dfdSAndroid Build Coastguard Worker     };
1219*387f9dfdSAndroid Build Coastguard Worker 
1220*387f9dfdSAndroid Build Coastguard Worker     class ResultBuilder {
1221*387f9dfdSAndroid Build Coastguard Worker     public:
1222*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder(  char const* macroName,
1223*387f9dfdSAndroid Build Coastguard Worker                         SourceLineInfo const& lineInfo,
1224*387f9dfdSAndroid Build Coastguard Worker                         char const* capturedExpression,
1225*387f9dfdSAndroid Build Coastguard Worker                         ResultDisposition::Flags resultDisposition,
1226*387f9dfdSAndroid Build Coastguard Worker                         char const* secondArg = "" );
1227*387f9dfdSAndroid Build Coastguard Worker 
1228*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
1229*387f9dfdSAndroid Build Coastguard Worker         ExpressionLhs<T const&> operator <= ( T const& operand );
1230*387f9dfdSAndroid Build Coastguard Worker         ExpressionLhs<bool> operator <= ( bool value );
1231*387f9dfdSAndroid Build Coastguard Worker 
1232*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
operator <<(T const & value)1233*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& operator << ( T const& value ) {
1234*387f9dfdSAndroid Build Coastguard Worker             m_stream.oss << value;
1235*387f9dfdSAndroid Build Coastguard Worker             return *this;
1236*387f9dfdSAndroid Build Coastguard Worker         }
1237*387f9dfdSAndroid Build Coastguard Worker 
1238*387f9dfdSAndroid Build Coastguard Worker         template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );
1239*387f9dfdSAndroid Build Coastguard Worker         template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );
1240*387f9dfdSAndroid Build Coastguard Worker 
1241*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& setResultType( ResultWas::OfType result );
1242*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& setResultType( bool result );
1243*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& setLhs( std::string const& lhs );
1244*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& setRhs( std::string const& rhs );
1245*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder& setOp( std::string const& op );
1246*387f9dfdSAndroid Build Coastguard Worker 
1247*387f9dfdSAndroid Build Coastguard Worker         void endExpression();
1248*387f9dfdSAndroid Build Coastguard Worker 
1249*387f9dfdSAndroid Build Coastguard Worker         std::string reconstructExpression() const;
1250*387f9dfdSAndroid Build Coastguard Worker         AssertionResult build() const;
1251*387f9dfdSAndroid Build Coastguard Worker 
1252*387f9dfdSAndroid Build Coastguard Worker         void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal );
1253*387f9dfdSAndroid Build Coastguard Worker         void captureResult( ResultWas::OfType resultType );
1254*387f9dfdSAndroid Build Coastguard Worker         void captureExpression();
1255*387f9dfdSAndroid Build Coastguard Worker         void captureExpectedException( std::string const& expectedMessage );
1256*387f9dfdSAndroid Build Coastguard Worker         void captureExpectedException( Matchers::Impl::Matcher<std::string> const& matcher );
1257*387f9dfdSAndroid Build Coastguard Worker         void handleResult( AssertionResult const& result );
1258*387f9dfdSAndroid Build Coastguard Worker         void react();
1259*387f9dfdSAndroid Build Coastguard Worker         bool shouldDebugBreak() const;
1260*387f9dfdSAndroid Build Coastguard Worker         bool allowThrows() const;
1261*387f9dfdSAndroid Build Coastguard Worker 
1262*387f9dfdSAndroid Build Coastguard Worker     private:
1263*387f9dfdSAndroid Build Coastguard Worker         AssertionInfo m_assertionInfo;
1264*387f9dfdSAndroid Build Coastguard Worker         AssertionResultData m_data;
1265*387f9dfdSAndroid Build Coastguard Worker         struct ExprComponents {
ExprComponentsCatch::ResultBuilder::ExprComponents1266*387f9dfdSAndroid Build Coastguard Worker             ExprComponents() : testFalse( false ) {}
1267*387f9dfdSAndroid Build Coastguard Worker             bool testFalse;
1268*387f9dfdSAndroid Build Coastguard Worker             std::string lhs, rhs, op;
1269*387f9dfdSAndroid Build Coastguard Worker         } m_exprComponents;
1270*387f9dfdSAndroid Build Coastguard Worker         CopyableStream m_stream;
1271*387f9dfdSAndroid Build Coastguard Worker 
1272*387f9dfdSAndroid Build Coastguard Worker         bool m_shouldDebugBreak;
1273*387f9dfdSAndroid Build Coastguard Worker         bool m_shouldThrow;
1274*387f9dfdSAndroid Build Coastguard Worker     };
1275*387f9dfdSAndroid Build Coastguard Worker 
1276*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
1277*387f9dfdSAndroid Build Coastguard Worker 
1278*387f9dfdSAndroid Build Coastguard Worker // Include after due to circular dependency:
1279*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_expression_lhs.hpp
1280*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
1281*387f9dfdSAndroid Build Coastguard Worker 
1282*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_evaluate.hpp
1283*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
1284*387f9dfdSAndroid Build Coastguard Worker 
1285*387f9dfdSAndroid Build Coastguard Worker #ifdef _MSC_VER
1286*387f9dfdSAndroid Build Coastguard Worker #pragma warning(push)
1287*387f9dfdSAndroid Build Coastguard Worker #pragma warning(disable:4389) // '==' : signed/unsigned mismatch
1288*387f9dfdSAndroid Build Coastguard Worker #endif
1289*387f9dfdSAndroid Build Coastguard Worker 
1290*387f9dfdSAndroid Build Coastguard Worker #include <cstddef>
1291*387f9dfdSAndroid Build Coastguard Worker 
1292*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1293*387f9dfdSAndroid Build Coastguard Worker namespace Internal {
1294*387f9dfdSAndroid Build Coastguard Worker 
1295*387f9dfdSAndroid Build Coastguard Worker     enum Operator {
1296*387f9dfdSAndroid Build Coastguard Worker         IsEqualTo,
1297*387f9dfdSAndroid Build Coastguard Worker         IsNotEqualTo,
1298*387f9dfdSAndroid Build Coastguard Worker         IsLessThan,
1299*387f9dfdSAndroid Build Coastguard Worker         IsGreaterThan,
1300*387f9dfdSAndroid Build Coastguard Worker         IsLessThanOrEqualTo,
1301*387f9dfdSAndroid Build Coastguard Worker         IsGreaterThanOrEqualTo
1302*387f9dfdSAndroid Build Coastguard Worker     };
1303*387f9dfdSAndroid Build Coastguard Worker 
getNameCatch::Internal::OperatorTraits1304*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> struct OperatorTraits             { static const char* getName(){ return "*error*"; } };
getNameCatch::Internal::OperatorTraits1305*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsEqualTo>             { static const char* getName(){ return "=="; } };
getNameCatch::Internal::OperatorTraits1306*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsNotEqualTo>          { static const char* getName(){ return "!="; } };
getNameCatch::Internal::OperatorTraits1307*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsLessThan>            { static const char* getName(){ return "<"; } };
getNameCatch::Internal::OperatorTraits1308*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsGreaterThan>         { static const char* getName(){ return ">"; } };
getNameCatch::Internal::OperatorTraits1309*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsLessThanOrEqualTo>   { static const char* getName(){ return "<="; } };
getNameCatch::Internal::OperatorTraits1310*387f9dfdSAndroid Build Coastguard Worker     template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
1311*387f9dfdSAndroid Build Coastguard Worker 
1312*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
opCast(T const & t)1313*387f9dfdSAndroid Build Coastguard Worker     inline T& opCast(T const& t) { return const_cast<T&>(t); }
1314*387f9dfdSAndroid Build Coastguard Worker 
1315*387f9dfdSAndroid Build Coastguard Worker // nullptr_t support based on pull request #154 from Konstantin Baumann
1316*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_NULLPTR
opCast(std::nullptr_t)1317*387f9dfdSAndroid Build Coastguard Worker     inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; }
1318*387f9dfdSAndroid Build Coastguard Worker #endif // CATCH_CONFIG_CPP11_NULLPTR
1319*387f9dfdSAndroid Build Coastguard Worker 
1320*387f9dfdSAndroid Build Coastguard Worker     // So the compare overloads can be operator agnostic we convey the operator as a template
1321*387f9dfdSAndroid Build Coastguard Worker     // enum, which is used to specialise an Evaluator for doing the comparison.
1322*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2, Operator Op>
1323*387f9dfdSAndroid Build Coastguard Worker     class Evaluator{};
1324*387f9dfdSAndroid Build Coastguard Worker 
1325*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1326*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsEqualTo> {
evaluateCatch::Internal::Evaluator1327*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs) {
1328*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) ==  opCast( rhs ) );
1329*387f9dfdSAndroid Build Coastguard Worker         }
1330*387f9dfdSAndroid Build Coastguard Worker     };
1331*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1332*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsNotEqualTo> {
evaluateCatch::Internal::Evaluator1333*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs ) {
1334*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) != opCast( rhs ) );
1335*387f9dfdSAndroid Build Coastguard Worker         }
1336*387f9dfdSAndroid Build Coastguard Worker     };
1337*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1338*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsLessThan> {
evaluateCatch::Internal::Evaluator1339*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs ) {
1340*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) < opCast( rhs ) );
1341*387f9dfdSAndroid Build Coastguard Worker         }
1342*387f9dfdSAndroid Build Coastguard Worker     };
1343*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1344*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsGreaterThan> {
evaluateCatch::Internal::Evaluator1345*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs ) {
1346*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) > opCast( rhs ) );
1347*387f9dfdSAndroid Build Coastguard Worker         }
1348*387f9dfdSAndroid Build Coastguard Worker     };
1349*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1350*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
evaluateCatch::Internal::Evaluator1351*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs ) {
1352*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) >= opCast( rhs ) );
1353*387f9dfdSAndroid Build Coastguard Worker         }
1354*387f9dfdSAndroid Build Coastguard Worker     };
1355*387f9dfdSAndroid Build Coastguard Worker     template<typename T1, typename T2>
1356*387f9dfdSAndroid Build Coastguard Worker     struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
evaluateCatch::Internal::Evaluator1357*387f9dfdSAndroid Build Coastguard Worker         static bool evaluate( T1 const& lhs, T2 const& rhs ) {
1358*387f9dfdSAndroid Build Coastguard Worker             return bool( opCast( lhs ) <= opCast( rhs ) );
1359*387f9dfdSAndroid Build Coastguard Worker         }
1360*387f9dfdSAndroid Build Coastguard Worker     };
1361*387f9dfdSAndroid Build Coastguard Worker 
1362*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T1, typename T2>
applyEvaluator(T1 const & lhs,T2 const & rhs)1363*387f9dfdSAndroid Build Coastguard Worker     bool applyEvaluator( T1 const& lhs, T2 const& rhs ) {
1364*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
1365*387f9dfdSAndroid Build Coastguard Worker     }
1366*387f9dfdSAndroid Build Coastguard Worker 
1367*387f9dfdSAndroid Build Coastguard Worker     // This level of indirection allows us to specialise for integer types
1368*387f9dfdSAndroid Build Coastguard Worker     // to avoid signed/ unsigned warnings
1369*387f9dfdSAndroid Build Coastguard Worker 
1370*387f9dfdSAndroid Build Coastguard Worker     // "base" overload
1371*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T1, typename T2>
compare(T1 const & lhs,T2 const & rhs)1372*387f9dfdSAndroid Build Coastguard Worker     bool compare( T1 const& lhs, T2 const& rhs ) {
1373*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
1374*387f9dfdSAndroid Build Coastguard Worker     }
1375*387f9dfdSAndroid Build Coastguard Worker 
1376*387f9dfdSAndroid Build Coastguard Worker     // unsigned X to int
compare(unsigned int lhs,int rhs)1377*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned int lhs, int rhs ) {
1378*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
1379*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned long lhs,int rhs)1380*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long lhs, int rhs ) {
1381*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
1382*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned char lhs,int rhs)1383*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned char lhs, int rhs ) {
1384*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
1385*387f9dfdSAndroid Build Coastguard Worker     }
1386*387f9dfdSAndroid Build Coastguard Worker 
1387*387f9dfdSAndroid Build Coastguard Worker     // unsigned X to long
compare(unsigned int lhs,long rhs)1388*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned int lhs, long rhs ) {
1389*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
1390*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned long lhs,long rhs)1391*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long lhs, long rhs ) {
1392*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
1393*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned char lhs,long rhs)1394*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned char lhs, long rhs ) {
1395*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
1396*387f9dfdSAndroid Build Coastguard Worker     }
1397*387f9dfdSAndroid Build Coastguard Worker 
1398*387f9dfdSAndroid Build Coastguard Worker     // int to unsigned X
compare(int lhs,unsigned int rhs)1399*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( int lhs, unsigned int rhs ) {
1400*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
1401*387f9dfdSAndroid Build Coastguard Worker     }
compare(int lhs,unsigned long rhs)1402*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( int lhs, unsigned long rhs ) {
1403*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
1404*387f9dfdSAndroid Build Coastguard Worker     }
compare(int lhs,unsigned char rhs)1405*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( int lhs, unsigned char rhs ) {
1406*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
1407*387f9dfdSAndroid Build Coastguard Worker     }
1408*387f9dfdSAndroid Build Coastguard Worker 
1409*387f9dfdSAndroid Build Coastguard Worker     // long to unsigned X
compare(long lhs,unsigned int rhs)1410*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long lhs, unsigned int rhs ) {
1411*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1412*387f9dfdSAndroid Build Coastguard Worker     }
compare(long lhs,unsigned long rhs)1413*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long lhs, unsigned long rhs ) {
1414*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1415*387f9dfdSAndroid Build Coastguard Worker     }
compare(long lhs,unsigned char rhs)1416*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long lhs, unsigned char rhs ) {
1417*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1418*387f9dfdSAndroid Build Coastguard Worker     }
1419*387f9dfdSAndroid Build Coastguard Worker 
1420*387f9dfdSAndroid Build Coastguard Worker     // pointer to long (when comparing against NULL)
compare(long lhs,T * rhs)1421*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( long lhs, T* rhs ) {
1422*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
1423*387f9dfdSAndroid Build Coastguard Worker     }
compare(T * lhs,long rhs)1424*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( T* lhs, long rhs ) {
1425*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
1426*387f9dfdSAndroid Build Coastguard Worker     }
1427*387f9dfdSAndroid Build Coastguard Worker 
1428*387f9dfdSAndroid Build Coastguard Worker     // pointer to int (when comparing against NULL)
compare(int lhs,T * rhs)1429*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( int lhs, T* rhs ) {
1430*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
1431*387f9dfdSAndroid Build Coastguard Worker     }
compare(T * lhs,int rhs)1432*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( T* lhs, int rhs ) {
1433*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
1434*387f9dfdSAndroid Build Coastguard Worker     }
1435*387f9dfdSAndroid Build Coastguard Worker 
1436*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_LONG_LONG
1437*387f9dfdSAndroid Build Coastguard Worker     // long long to unsigned X
compare(long long lhs,unsigned int rhs)1438*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long long lhs, unsigned int rhs ) {
1439*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1440*387f9dfdSAndroid Build Coastguard Worker     }
compare(long long lhs,unsigned long rhs)1441*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long long lhs, unsigned long rhs ) {
1442*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1443*387f9dfdSAndroid Build Coastguard Worker     }
compare(long long lhs,unsigned long long rhs)1444*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long long lhs, unsigned long long rhs ) {
1445*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1446*387f9dfdSAndroid Build Coastguard Worker     }
compare(long long lhs,unsigned char rhs)1447*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( long long lhs, unsigned char rhs ) {
1448*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
1449*387f9dfdSAndroid Build Coastguard Worker     }
1450*387f9dfdSAndroid Build Coastguard Worker 
1451*387f9dfdSAndroid Build Coastguard Worker     // unsigned long long to X
compare(unsigned long long lhs,int rhs)1452*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long long lhs, int rhs ) {
1453*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
1454*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned long long lhs,long rhs)1455*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long long lhs, long rhs ) {
1456*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
1457*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned long long lhs,long long rhs)1458*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long long lhs, long long rhs ) {
1459*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
1460*387f9dfdSAndroid Build Coastguard Worker     }
compare(unsigned long long lhs,char rhs)1461*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op> bool compare( unsigned long long lhs, char rhs ) {
1462*387f9dfdSAndroid Build Coastguard Worker         return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
1463*387f9dfdSAndroid Build Coastguard Worker     }
1464*387f9dfdSAndroid Build Coastguard Worker 
1465*387f9dfdSAndroid Build Coastguard Worker     // pointer to long long (when comparing against NULL)
compare(long long lhs,T * rhs)1466*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( long long lhs, T* rhs ) {
1467*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
1468*387f9dfdSAndroid Build Coastguard Worker     }
compare(T * lhs,long long rhs)1469*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( T* lhs, long long rhs ) {
1470*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
1471*387f9dfdSAndroid Build Coastguard Worker     }
1472*387f9dfdSAndroid Build Coastguard Worker #endif // CATCH_CONFIG_CPP11_LONG_LONG
1473*387f9dfdSAndroid Build Coastguard Worker 
1474*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_NULLPTR
1475*387f9dfdSAndroid Build Coastguard Worker     // pointer to nullptr_t (when comparing against nullptr)
compare(std::nullptr_t,T * rhs)1476*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) {
1477*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( nullptr, rhs );
1478*387f9dfdSAndroid Build Coastguard Worker     }
compare(T * lhs,std::nullptr_t)1479*387f9dfdSAndroid Build Coastguard Worker     template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) {
1480*387f9dfdSAndroid Build Coastguard Worker         return Evaluator<T*, T*, Op>::evaluate( lhs, nullptr );
1481*387f9dfdSAndroid Build Coastguard Worker     }
1482*387f9dfdSAndroid Build Coastguard Worker #endif // CATCH_CONFIG_CPP11_NULLPTR
1483*387f9dfdSAndroid Build Coastguard Worker 
1484*387f9dfdSAndroid Build Coastguard Worker } // end of namespace Internal
1485*387f9dfdSAndroid Build Coastguard Worker } // end of namespace Catch
1486*387f9dfdSAndroid Build Coastguard Worker 
1487*387f9dfdSAndroid Build Coastguard Worker #ifdef _MSC_VER
1488*387f9dfdSAndroid Build Coastguard Worker #pragma warning(pop)
1489*387f9dfdSAndroid Build Coastguard Worker #endif
1490*387f9dfdSAndroid Build Coastguard Worker 
1491*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_tostring.h
1492*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED
1493*387f9dfdSAndroid Build Coastguard Worker 
1494*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
1495*387f9dfdSAndroid Build Coastguard Worker #include <iomanip>
1496*387f9dfdSAndroid Build Coastguard Worker #include <limits>
1497*387f9dfdSAndroid Build Coastguard Worker #include <vector>
1498*387f9dfdSAndroid Build Coastguard Worker #include <cstddef>
1499*387f9dfdSAndroid Build Coastguard Worker 
1500*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
1501*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_objc_arc.hpp
1502*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED
1503*387f9dfdSAndroid Build Coastguard Worker 
1504*387f9dfdSAndroid Build Coastguard Worker #import <Foundation/Foundation.h>
1505*387f9dfdSAndroid Build Coastguard Worker 
1506*387f9dfdSAndroid Build Coastguard Worker #ifdef __has_feature
1507*387f9dfdSAndroid Build Coastguard Worker #define CATCH_ARC_ENABLED __has_feature(objc_arc)
1508*387f9dfdSAndroid Build Coastguard Worker #else
1509*387f9dfdSAndroid Build Coastguard Worker #define CATCH_ARC_ENABLED 0
1510*387f9dfdSAndroid Build Coastguard Worker #endif
1511*387f9dfdSAndroid Build Coastguard Worker 
1512*387f9dfdSAndroid Build Coastguard Worker void arcSafeRelease( NSObject* obj );
1513*387f9dfdSAndroid Build Coastguard Worker id performOptionalSelector( id obj, SEL sel );
1514*387f9dfdSAndroid Build Coastguard Worker 
1515*387f9dfdSAndroid Build Coastguard Worker #if !CATCH_ARC_ENABLED
arcSafeRelease(NSObject * obj)1516*387f9dfdSAndroid Build Coastguard Worker inline void arcSafeRelease( NSObject* obj ) {
1517*387f9dfdSAndroid Build Coastguard Worker     [obj release];
1518*387f9dfdSAndroid Build Coastguard Worker }
performOptionalSelector(id obj,SEL sel)1519*387f9dfdSAndroid Build Coastguard Worker inline id performOptionalSelector( id obj, SEL sel ) {
1520*387f9dfdSAndroid Build Coastguard Worker     if( [obj respondsToSelector: sel] )
1521*387f9dfdSAndroid Build Coastguard Worker         return [obj performSelector: sel];
1522*387f9dfdSAndroid Build Coastguard Worker     return nil;
1523*387f9dfdSAndroid Build Coastguard Worker }
1524*387f9dfdSAndroid Build Coastguard Worker #define CATCH_UNSAFE_UNRETAINED
1525*387f9dfdSAndroid Build Coastguard Worker #define CATCH_ARC_STRONG
1526*387f9dfdSAndroid Build Coastguard Worker #else
arcSafeRelease(NSObject *)1527*387f9dfdSAndroid Build Coastguard Worker inline void arcSafeRelease( NSObject* ){}
performOptionalSelector(id obj,SEL sel)1528*387f9dfdSAndroid Build Coastguard Worker inline id performOptionalSelector( id obj, SEL sel ) {
1529*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
1530*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
1531*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
1532*387f9dfdSAndroid Build Coastguard Worker #endif
1533*387f9dfdSAndroid Build Coastguard Worker     if( [obj respondsToSelector: sel] )
1534*387f9dfdSAndroid Build Coastguard Worker         return [obj performSelector: sel];
1535*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
1536*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
1537*387f9dfdSAndroid Build Coastguard Worker #endif
1538*387f9dfdSAndroid Build Coastguard Worker     return nil;
1539*387f9dfdSAndroid Build Coastguard Worker }
1540*387f9dfdSAndroid Build Coastguard Worker #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
1541*387f9dfdSAndroid Build Coastguard Worker #define CATCH_ARC_STRONG __strong
1542*387f9dfdSAndroid Build Coastguard Worker #endif
1543*387f9dfdSAndroid Build Coastguard Worker 
1544*387f9dfdSAndroid Build Coastguard Worker #endif
1545*387f9dfdSAndroid Build Coastguard Worker 
1546*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_TUPLE
1547*387f9dfdSAndroid Build Coastguard Worker #include <tuple>
1548*387f9dfdSAndroid Build Coastguard Worker #endif
1549*387f9dfdSAndroid Build Coastguard Worker 
1550*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_IS_ENUM
1551*387f9dfdSAndroid Build Coastguard Worker #include <type_traits>
1552*387f9dfdSAndroid Build Coastguard Worker #endif
1553*387f9dfdSAndroid Build Coastguard Worker 
1554*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1555*387f9dfdSAndroid Build Coastguard Worker 
1556*387f9dfdSAndroid Build Coastguard Worker // Why we're here.
1557*387f9dfdSAndroid Build Coastguard Worker template<typename T>
1558*387f9dfdSAndroid Build Coastguard Worker std::string toString( T const& value );
1559*387f9dfdSAndroid Build Coastguard Worker 
1560*387f9dfdSAndroid Build Coastguard Worker // Built in overloads
1561*387f9dfdSAndroid Build Coastguard Worker 
1562*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::string const& value );
1563*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::wstring const& value );
1564*387f9dfdSAndroid Build Coastguard Worker std::string toString( const char* const value );
1565*387f9dfdSAndroid Build Coastguard Worker std::string toString( char* const value );
1566*387f9dfdSAndroid Build Coastguard Worker std::string toString( const wchar_t* const value );
1567*387f9dfdSAndroid Build Coastguard Worker std::string toString( wchar_t* const value );
1568*387f9dfdSAndroid Build Coastguard Worker std::string toString( int value );
1569*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned long value );
1570*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned int value );
1571*387f9dfdSAndroid Build Coastguard Worker std::string toString( const double value );
1572*387f9dfdSAndroid Build Coastguard Worker std::string toString( const float value );
1573*387f9dfdSAndroid Build Coastguard Worker std::string toString( bool value );
1574*387f9dfdSAndroid Build Coastguard Worker std::string toString( char value );
1575*387f9dfdSAndroid Build Coastguard Worker std::string toString( signed char value );
1576*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned char value );
1577*387f9dfdSAndroid Build Coastguard Worker 
1578*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_LONG_LONG
1579*387f9dfdSAndroid Build Coastguard Worker std::string toString( long long value );
1580*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned long long value );
1581*387f9dfdSAndroid Build Coastguard Worker #endif
1582*387f9dfdSAndroid Build Coastguard Worker 
1583*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_NULLPTR
1584*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::nullptr_t );
1585*387f9dfdSAndroid Build Coastguard Worker #endif
1586*387f9dfdSAndroid Build Coastguard Worker 
1587*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
1588*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSString const * const& nsstring );
1589*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSString * CATCH_ARC_STRONG const& nsstring );
1590*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSObject* const& nsObject );
1591*387f9dfdSAndroid Build Coastguard Worker #endif
1592*387f9dfdSAndroid Build Coastguard Worker 
1593*387f9dfdSAndroid Build Coastguard Worker namespace Detail {
1594*387f9dfdSAndroid Build Coastguard Worker 
1595*387f9dfdSAndroid Build Coastguard Worker     extern const std::string unprintableString;
1596*387f9dfdSAndroid Build Coastguard Worker 
1597*387f9dfdSAndroid Build Coastguard Worker     struct BorgType {
1598*387f9dfdSAndroid Build Coastguard Worker         template<typename T> BorgType( T const& );
1599*387f9dfdSAndroid Build Coastguard Worker     };
1600*387f9dfdSAndroid Build Coastguard Worker 
1601*387f9dfdSAndroid Build Coastguard Worker     struct TrueType { char sizer[1]; };
1602*387f9dfdSAndroid Build Coastguard Worker     struct FalseType { char sizer[2]; };
1603*387f9dfdSAndroid Build Coastguard Worker 
1604*387f9dfdSAndroid Build Coastguard Worker     TrueType& testStreamable( std::ostream& );
1605*387f9dfdSAndroid Build Coastguard Worker     FalseType testStreamable( FalseType );
1606*387f9dfdSAndroid Build Coastguard Worker 
1607*387f9dfdSAndroid Build Coastguard Worker     FalseType operator<<( std::ostream const&, BorgType const& );
1608*387f9dfdSAndroid Build Coastguard Worker 
1609*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
1610*387f9dfdSAndroid Build Coastguard Worker     struct IsStreamInsertable {
1611*387f9dfdSAndroid Build Coastguard Worker         static std::ostream &s;
1612*387f9dfdSAndroid Build Coastguard Worker         static T  const&t;
1613*387f9dfdSAndroid Build Coastguard Worker         enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) };
1614*387f9dfdSAndroid Build Coastguard Worker     };
1615*387f9dfdSAndroid Build Coastguard Worker 
1616*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_CONFIG_CPP11_IS_ENUM)
1617*387f9dfdSAndroid Build Coastguard Worker     template<typename T,
1618*387f9dfdSAndroid Build Coastguard Worker              bool IsEnum = std::is_enum<T>::value
1619*387f9dfdSAndroid Build Coastguard Worker              >
1620*387f9dfdSAndroid Build Coastguard Worker     struct EnumStringMaker
1621*387f9dfdSAndroid Build Coastguard Worker     {
convertCatch::Detail::EnumStringMaker1622*387f9dfdSAndroid Build Coastguard Worker         static std::string convert( T const& ) { return unprintableString; }
1623*387f9dfdSAndroid Build Coastguard Worker     };
1624*387f9dfdSAndroid Build Coastguard Worker 
1625*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
1626*387f9dfdSAndroid Build Coastguard Worker     struct EnumStringMaker<T,true>
1627*387f9dfdSAndroid Build Coastguard Worker     {
convertCatch::Detail::EnumStringMaker1628*387f9dfdSAndroid Build Coastguard Worker         static std::string convert( T const& v )
1629*387f9dfdSAndroid Build Coastguard Worker         {
1630*387f9dfdSAndroid Build Coastguard Worker             return ::Catch::toString(
1631*387f9dfdSAndroid Build Coastguard Worker                 static_cast<typename std::underlying_type<T>::type>(v)
1632*387f9dfdSAndroid Build Coastguard Worker                 );
1633*387f9dfdSAndroid Build Coastguard Worker         }
1634*387f9dfdSAndroid Build Coastguard Worker     };
1635*387f9dfdSAndroid Build Coastguard Worker #endif
1636*387f9dfdSAndroid Build Coastguard Worker     template<bool C>
1637*387f9dfdSAndroid Build Coastguard Worker     struct StringMakerBase {
1638*387f9dfdSAndroid Build Coastguard Worker #if defined(CATCH_CONFIG_CPP11_IS_ENUM)
1639*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
convertCatch::Detail::StringMakerBase1640*387f9dfdSAndroid Build Coastguard Worker         static std::string convert( T const& v )
1641*387f9dfdSAndroid Build Coastguard Worker         {
1642*387f9dfdSAndroid Build Coastguard Worker             return EnumStringMaker<T>::convert( v );
1643*387f9dfdSAndroid Build Coastguard Worker         }
1644*387f9dfdSAndroid Build Coastguard Worker #else
1645*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
1646*387f9dfdSAndroid Build Coastguard Worker         static std::string convert( T const& ) { return unprintableString; }
1647*387f9dfdSAndroid Build Coastguard Worker #endif
1648*387f9dfdSAndroid Build Coastguard Worker     };
1649*387f9dfdSAndroid Build Coastguard Worker 
1650*387f9dfdSAndroid Build Coastguard Worker     template<>
1651*387f9dfdSAndroid Build Coastguard Worker     struct StringMakerBase<true> {
1652*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
convertCatch::Detail::StringMakerBase1653*387f9dfdSAndroid Build Coastguard Worker         static std::string convert( T const& _value ) {
1654*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
1655*387f9dfdSAndroid Build Coastguard Worker             oss << _value;
1656*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
1657*387f9dfdSAndroid Build Coastguard Worker         }
1658*387f9dfdSAndroid Build Coastguard Worker     };
1659*387f9dfdSAndroid Build Coastguard Worker 
1660*387f9dfdSAndroid Build Coastguard Worker     std::string rawMemoryToString( const void *object, std::size_t size );
1661*387f9dfdSAndroid Build Coastguard Worker 
1662*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
rawMemoryToString(const T & object)1663*387f9dfdSAndroid Build Coastguard Worker     inline std::string rawMemoryToString( const T& object ) {
1664*387f9dfdSAndroid Build Coastguard Worker       return rawMemoryToString( &object, sizeof(object) );
1665*387f9dfdSAndroid Build Coastguard Worker     }
1666*387f9dfdSAndroid Build Coastguard Worker 
1667*387f9dfdSAndroid Build Coastguard Worker } // end namespace Detail
1668*387f9dfdSAndroid Build Coastguard Worker 
1669*387f9dfdSAndroid Build Coastguard Worker template<typename T>
1670*387f9dfdSAndroid Build Coastguard Worker struct StringMaker :
1671*387f9dfdSAndroid Build Coastguard Worker     Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};
1672*387f9dfdSAndroid Build Coastguard Worker 
1673*387f9dfdSAndroid Build Coastguard Worker template<typename T>
1674*387f9dfdSAndroid Build Coastguard Worker struct StringMaker<T*> {
1675*387f9dfdSAndroid Build Coastguard Worker     template<typename U>
convertCatch::StringMaker1676*387f9dfdSAndroid Build Coastguard Worker     static std::string convert( U* p ) {
1677*387f9dfdSAndroid Build Coastguard Worker         if( !p )
1678*387f9dfdSAndroid Build Coastguard Worker             return "NULL";
1679*387f9dfdSAndroid Build Coastguard Worker         else
1680*387f9dfdSAndroid Build Coastguard Worker             return Detail::rawMemoryToString( p );
1681*387f9dfdSAndroid Build Coastguard Worker     }
1682*387f9dfdSAndroid Build Coastguard Worker };
1683*387f9dfdSAndroid Build Coastguard Worker 
1684*387f9dfdSAndroid Build Coastguard Worker template<typename R, typename C>
1685*387f9dfdSAndroid Build Coastguard Worker struct StringMaker<R C::*> {
convertCatch::StringMaker1686*387f9dfdSAndroid Build Coastguard Worker     static std::string convert( R C::* p ) {
1687*387f9dfdSAndroid Build Coastguard Worker         if( !p )
1688*387f9dfdSAndroid Build Coastguard Worker             return "NULL";
1689*387f9dfdSAndroid Build Coastguard Worker         else
1690*387f9dfdSAndroid Build Coastguard Worker             return Detail::rawMemoryToString( p );
1691*387f9dfdSAndroid Build Coastguard Worker     }
1692*387f9dfdSAndroid Build Coastguard Worker };
1693*387f9dfdSAndroid Build Coastguard Worker 
1694*387f9dfdSAndroid Build Coastguard Worker namespace Detail {
1695*387f9dfdSAndroid Build Coastguard Worker     template<typename InputIterator>
1696*387f9dfdSAndroid Build Coastguard Worker     std::string rangeToString( InputIterator first, InputIterator last );
1697*387f9dfdSAndroid Build Coastguard Worker }
1698*387f9dfdSAndroid Build Coastguard Worker 
1699*387f9dfdSAndroid Build Coastguard Worker //template<typename T, typename Allocator>
1700*387f9dfdSAndroid Build Coastguard Worker //struct StringMaker<std::vector<T, Allocator> > {
1701*387f9dfdSAndroid Build Coastguard Worker //    static std::string convert( std::vector<T,Allocator> const& v ) {
1702*387f9dfdSAndroid Build Coastguard Worker //        return Detail::rangeToString( v.begin(), v.end() );
1703*387f9dfdSAndroid Build Coastguard Worker //    }
1704*387f9dfdSAndroid Build Coastguard Worker //};
1705*387f9dfdSAndroid Build Coastguard Worker 
1706*387f9dfdSAndroid Build Coastguard Worker template<typename T, typename Allocator>
toString(std::vector<T,Allocator> const & v)1707*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::vector<T,Allocator> const& v ) {
1708*387f9dfdSAndroid Build Coastguard Worker     return Detail::rangeToString( v.begin(), v.end() );
1709*387f9dfdSAndroid Build Coastguard Worker }
1710*387f9dfdSAndroid Build Coastguard Worker 
1711*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_TUPLE
1712*387f9dfdSAndroid Build Coastguard Worker 
1713*387f9dfdSAndroid Build Coastguard Worker // toString for tuples
1714*387f9dfdSAndroid Build Coastguard Worker namespace TupleDetail {
1715*387f9dfdSAndroid Build Coastguard Worker   template<
1716*387f9dfdSAndroid Build Coastguard Worker       typename Tuple,
1717*387f9dfdSAndroid Build Coastguard Worker       std::size_t N = 0,
1718*387f9dfdSAndroid Build Coastguard Worker       bool = (N < std::tuple_size<Tuple>::value)
1719*387f9dfdSAndroid Build Coastguard Worker       >
1720*387f9dfdSAndroid Build Coastguard Worker   struct ElementPrinter {
printCatch::TupleDetail::ElementPrinter1721*387f9dfdSAndroid Build Coastguard Worker       static void print( const Tuple& tuple, std::ostream& os )
1722*387f9dfdSAndroid Build Coastguard Worker       {
1723*387f9dfdSAndroid Build Coastguard Worker           os << ( N ? ", " : " " )
1724*387f9dfdSAndroid Build Coastguard Worker              << Catch::toString(std::get<N>(tuple));
1725*387f9dfdSAndroid Build Coastguard Worker           ElementPrinter<Tuple,N+1>::print(tuple,os);
1726*387f9dfdSAndroid Build Coastguard Worker       }
1727*387f9dfdSAndroid Build Coastguard Worker   };
1728*387f9dfdSAndroid Build Coastguard Worker 
1729*387f9dfdSAndroid Build Coastguard Worker   template<
1730*387f9dfdSAndroid Build Coastguard Worker       typename Tuple,
1731*387f9dfdSAndroid Build Coastguard Worker       std::size_t N
1732*387f9dfdSAndroid Build Coastguard Worker       >
1733*387f9dfdSAndroid Build Coastguard Worker   struct ElementPrinter<Tuple,N,false> {
printCatch::TupleDetail::ElementPrinter1734*387f9dfdSAndroid Build Coastguard Worker       static void print( const Tuple&, std::ostream& ) {}
1735*387f9dfdSAndroid Build Coastguard Worker   };
1736*387f9dfdSAndroid Build Coastguard Worker 
1737*387f9dfdSAndroid Build Coastguard Worker }
1738*387f9dfdSAndroid Build Coastguard Worker 
1739*387f9dfdSAndroid Build Coastguard Worker template<typename ...Types>
1740*387f9dfdSAndroid Build Coastguard Worker struct StringMaker<std::tuple<Types...>> {
1741*387f9dfdSAndroid Build Coastguard Worker 
convertCatch::StringMaker1742*387f9dfdSAndroid Build Coastguard Worker     static std::string convert( const std::tuple<Types...>& tuple )
1743*387f9dfdSAndroid Build Coastguard Worker     {
1744*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream os;
1745*387f9dfdSAndroid Build Coastguard Worker         os << '{';
1746*387f9dfdSAndroid Build Coastguard Worker         TupleDetail::ElementPrinter<std::tuple<Types...>>::print( tuple, os );
1747*387f9dfdSAndroid Build Coastguard Worker         os << " }";
1748*387f9dfdSAndroid Build Coastguard Worker         return os.str();
1749*387f9dfdSAndroid Build Coastguard Worker     }
1750*387f9dfdSAndroid Build Coastguard Worker };
1751*387f9dfdSAndroid Build Coastguard Worker #endif // CATCH_CONFIG_CPP11_TUPLE
1752*387f9dfdSAndroid Build Coastguard Worker 
1753*387f9dfdSAndroid Build Coastguard Worker namespace Detail {
1754*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
makeString(T const & value)1755*387f9dfdSAndroid Build Coastguard Worker     std::string makeString( T const& value ) {
1756*387f9dfdSAndroid Build Coastguard Worker         return StringMaker<T>::convert( value );
1757*387f9dfdSAndroid Build Coastguard Worker     }
1758*387f9dfdSAndroid Build Coastguard Worker } // end namespace Detail
1759*387f9dfdSAndroid Build Coastguard Worker 
1760*387f9dfdSAndroid Build Coastguard Worker /// \brief converts any type to a string
1761*387f9dfdSAndroid Build Coastguard Worker ///
1762*387f9dfdSAndroid Build Coastguard Worker /// The default template forwards on to ostringstream - except when an
1763*387f9dfdSAndroid Build Coastguard Worker /// ostringstream overload does not exist - in which case it attempts to detect
1764*387f9dfdSAndroid Build Coastguard Worker /// that and writes {?}.
1765*387f9dfdSAndroid Build Coastguard Worker /// Overload (not specialise) this template for custom typs that you don't want
1766*387f9dfdSAndroid Build Coastguard Worker /// to provide an ostream overload for.
1767*387f9dfdSAndroid Build Coastguard Worker template<typename T>
toString(T const & value)1768*387f9dfdSAndroid Build Coastguard Worker std::string toString( T const& value ) {
1769*387f9dfdSAndroid Build Coastguard Worker     return StringMaker<T>::convert( value );
1770*387f9dfdSAndroid Build Coastguard Worker }
1771*387f9dfdSAndroid Build Coastguard Worker 
1772*387f9dfdSAndroid Build Coastguard Worker     namespace Detail {
1773*387f9dfdSAndroid Build Coastguard Worker     template<typename InputIterator>
rangeToString(InputIterator first,InputIterator last)1774*387f9dfdSAndroid Build Coastguard Worker     std::string rangeToString( InputIterator first, InputIterator last ) {
1775*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream oss;
1776*387f9dfdSAndroid Build Coastguard Worker         oss << "{ ";
1777*387f9dfdSAndroid Build Coastguard Worker         if( first != last ) {
1778*387f9dfdSAndroid Build Coastguard Worker             oss << Catch::toString( *first );
1779*387f9dfdSAndroid Build Coastguard Worker             for( ++first ; first != last ; ++first )
1780*387f9dfdSAndroid Build Coastguard Worker                 oss << ", " << Catch::toString( *first );
1781*387f9dfdSAndroid Build Coastguard Worker         }
1782*387f9dfdSAndroid Build Coastguard Worker         oss << " }";
1783*387f9dfdSAndroid Build Coastguard Worker         return oss.str();
1784*387f9dfdSAndroid Build Coastguard Worker     }
1785*387f9dfdSAndroid Build Coastguard Worker }
1786*387f9dfdSAndroid Build Coastguard Worker 
1787*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
1788*387f9dfdSAndroid Build Coastguard Worker 
1789*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1790*387f9dfdSAndroid Build Coastguard Worker 
1791*387f9dfdSAndroid Build Coastguard Worker // Wraps the LHS of an expression and captures the operator and RHS (if any) -
1792*387f9dfdSAndroid Build Coastguard Worker // wrapping them all in a ResultBuilder object
1793*387f9dfdSAndroid Build Coastguard Worker template<typename T>
1794*387f9dfdSAndroid Build Coastguard Worker class ExpressionLhs {
1795*387f9dfdSAndroid Build Coastguard Worker     ExpressionLhs& operator = ( ExpressionLhs const& );
1796*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
1797*387f9dfdSAndroid Build Coastguard Worker     ExpressionLhs& operator = ( ExpressionLhs && ) = delete;
1798*387f9dfdSAndroid Build Coastguard Worker #  endif
1799*387f9dfdSAndroid Build Coastguard Worker 
1800*387f9dfdSAndroid Build Coastguard Worker public:
ExpressionLhs(ResultBuilder & rb,T lhs)1801*387f9dfdSAndroid Build Coastguard Worker     ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {}
1802*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
1803*387f9dfdSAndroid Build Coastguard Worker     ExpressionLhs( ExpressionLhs const& ) = default;
1804*387f9dfdSAndroid Build Coastguard Worker     ExpressionLhs( ExpressionLhs && )     = default;
1805*387f9dfdSAndroid Build Coastguard Worker #  endif
1806*387f9dfdSAndroid Build Coastguard Worker 
1807*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator ==(RhsT const & rhs)1808*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator == ( RhsT const& rhs ) {
1809*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsEqualTo>( rhs );
1810*387f9dfdSAndroid Build Coastguard Worker     }
1811*387f9dfdSAndroid Build Coastguard Worker 
1812*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator !=(RhsT const & rhs)1813*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator != ( RhsT const& rhs ) {
1814*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsNotEqualTo>( rhs );
1815*387f9dfdSAndroid Build Coastguard Worker     }
1816*387f9dfdSAndroid Build Coastguard Worker 
1817*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator <(RhsT const & rhs)1818*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator < ( RhsT const& rhs ) {
1819*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsLessThan>( rhs );
1820*387f9dfdSAndroid Build Coastguard Worker     }
1821*387f9dfdSAndroid Build Coastguard Worker 
1822*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator >(RhsT const & rhs)1823*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator > ( RhsT const& rhs ) {
1824*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsGreaterThan>( rhs );
1825*387f9dfdSAndroid Build Coastguard Worker     }
1826*387f9dfdSAndroid Build Coastguard Worker 
1827*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator <=(RhsT const & rhs)1828*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator <= ( RhsT const& rhs ) {
1829*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
1830*387f9dfdSAndroid Build Coastguard Worker     }
1831*387f9dfdSAndroid Build Coastguard Worker 
1832*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT>
operator >=(RhsT const & rhs)1833*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator >= ( RhsT const& rhs ) {
1834*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
1835*387f9dfdSAndroid Build Coastguard Worker     }
1836*387f9dfdSAndroid Build Coastguard Worker 
operator ==(bool rhs)1837*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator == ( bool rhs ) {
1838*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsEqualTo>( rhs );
1839*387f9dfdSAndroid Build Coastguard Worker     }
1840*387f9dfdSAndroid Build Coastguard Worker 
operator !=(bool rhs)1841*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& operator != ( bool rhs ) {
1842*387f9dfdSAndroid Build Coastguard Worker         return captureExpression<Internal::IsNotEqualTo>( rhs );
1843*387f9dfdSAndroid Build Coastguard Worker     }
1844*387f9dfdSAndroid Build Coastguard Worker 
endExpression()1845*387f9dfdSAndroid Build Coastguard Worker     void endExpression() {
1846*387f9dfdSAndroid Build Coastguard Worker         bool value = m_lhs ? true : false;
1847*387f9dfdSAndroid Build Coastguard Worker         m_rb
1848*387f9dfdSAndroid Build Coastguard Worker             .setLhs( Catch::toString( value ) )
1849*387f9dfdSAndroid Build Coastguard Worker             .setResultType( value )
1850*387f9dfdSAndroid Build Coastguard Worker             .endExpression();
1851*387f9dfdSAndroid Build Coastguard Worker     }
1852*387f9dfdSAndroid Build Coastguard Worker 
1853*387f9dfdSAndroid Build Coastguard Worker     // Only simple binary expressions are allowed on the LHS.
1854*387f9dfdSAndroid Build Coastguard Worker     // If more complex compositions are required then place the sub expression in parentheses
1855*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& );
1856*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& );
1857*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& );
1858*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& );
1859*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );
1860*387f9dfdSAndroid Build Coastguard Worker     template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );
1861*387f9dfdSAndroid Build Coastguard Worker 
1862*387f9dfdSAndroid Build Coastguard Worker private:
1863*387f9dfdSAndroid Build Coastguard Worker     template<Internal::Operator Op, typename RhsT>
captureExpression(RhsT const & rhs)1864*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& captureExpression( RhsT const& rhs ) {
1865*387f9dfdSAndroid Build Coastguard Worker         return m_rb
1866*387f9dfdSAndroid Build Coastguard Worker             .setResultType( Internal::compare<Op>( m_lhs, rhs ) )
1867*387f9dfdSAndroid Build Coastguard Worker             .setLhs( Catch::toString( m_lhs ) )
1868*387f9dfdSAndroid Build Coastguard Worker             .setRhs( Catch::toString( rhs ) )
1869*387f9dfdSAndroid Build Coastguard Worker             .setOp( Internal::OperatorTraits<Op>::getName() );
1870*387f9dfdSAndroid Build Coastguard Worker     }
1871*387f9dfdSAndroid Build Coastguard Worker 
1872*387f9dfdSAndroid Build Coastguard Worker private:
1873*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& m_rb;
1874*387f9dfdSAndroid Build Coastguard Worker     T m_lhs;
1875*387f9dfdSAndroid Build Coastguard Worker };
1876*387f9dfdSAndroid Build Coastguard Worker 
1877*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
1878*387f9dfdSAndroid Build Coastguard Worker 
1879*387f9dfdSAndroid Build Coastguard Worker 
1880*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1881*387f9dfdSAndroid Build Coastguard Worker 
1882*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
operator <=(T const & operand)1883*387f9dfdSAndroid Build Coastguard Worker     inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
1884*387f9dfdSAndroid Build Coastguard Worker         return ExpressionLhs<T const&>( *this, operand );
1885*387f9dfdSAndroid Build Coastguard Worker     }
1886*387f9dfdSAndroid Build Coastguard Worker 
operator <=(bool value)1887*387f9dfdSAndroid Build Coastguard Worker     inline ExpressionLhs<bool> ResultBuilder::operator <= ( bool value ) {
1888*387f9dfdSAndroid Build Coastguard Worker         return ExpressionLhs<bool>( *this, value );
1889*387f9dfdSAndroid Build Coastguard Worker     }
1890*387f9dfdSAndroid Build Coastguard Worker 
1891*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
1892*387f9dfdSAndroid Build Coastguard Worker 
1893*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_message.h
1894*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
1895*387f9dfdSAndroid Build Coastguard Worker 
1896*387f9dfdSAndroid Build Coastguard Worker #include <string>
1897*387f9dfdSAndroid Build Coastguard Worker 
1898*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1899*387f9dfdSAndroid Build Coastguard Worker 
1900*387f9dfdSAndroid Build Coastguard Worker     struct MessageInfo {
1901*387f9dfdSAndroid Build Coastguard Worker         MessageInfo(    std::string const& _macroName,
1902*387f9dfdSAndroid Build Coastguard Worker                         SourceLineInfo const& _lineInfo,
1903*387f9dfdSAndroid Build Coastguard Worker                         ResultWas::OfType _type );
1904*387f9dfdSAndroid Build Coastguard Worker 
1905*387f9dfdSAndroid Build Coastguard Worker         std::string macroName;
1906*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo lineInfo;
1907*387f9dfdSAndroid Build Coastguard Worker         ResultWas::OfType type;
1908*387f9dfdSAndroid Build Coastguard Worker         std::string message;
1909*387f9dfdSAndroid Build Coastguard Worker         unsigned int sequence;
1910*387f9dfdSAndroid Build Coastguard Worker 
operator ==Catch::MessageInfo1911*387f9dfdSAndroid Build Coastguard Worker         bool operator == ( MessageInfo const& other ) const {
1912*387f9dfdSAndroid Build Coastguard Worker             return sequence == other.sequence;
1913*387f9dfdSAndroid Build Coastguard Worker         }
operator <Catch::MessageInfo1914*387f9dfdSAndroid Build Coastguard Worker         bool operator < ( MessageInfo const& other ) const {
1915*387f9dfdSAndroid Build Coastguard Worker             return sequence < other.sequence;
1916*387f9dfdSAndroid Build Coastguard Worker         }
1917*387f9dfdSAndroid Build Coastguard Worker     private:
1918*387f9dfdSAndroid Build Coastguard Worker         static unsigned int globalCount;
1919*387f9dfdSAndroid Build Coastguard Worker     };
1920*387f9dfdSAndroid Build Coastguard Worker 
1921*387f9dfdSAndroid Build Coastguard Worker     struct MessageBuilder {
MessageBuilderCatch::MessageBuilder1922*387f9dfdSAndroid Build Coastguard Worker         MessageBuilder( std::string const& macroName,
1923*387f9dfdSAndroid Build Coastguard Worker                         SourceLineInfo const& lineInfo,
1924*387f9dfdSAndroid Build Coastguard Worker                         ResultWas::OfType type )
1925*387f9dfdSAndroid Build Coastguard Worker         : m_info( macroName, lineInfo, type )
1926*387f9dfdSAndroid Build Coastguard Worker         {}
1927*387f9dfdSAndroid Build Coastguard Worker 
1928*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
operator <<Catch::MessageBuilder1929*387f9dfdSAndroid Build Coastguard Worker         MessageBuilder& operator << ( T const& value ) {
1930*387f9dfdSAndroid Build Coastguard Worker             m_stream << value;
1931*387f9dfdSAndroid Build Coastguard Worker             return *this;
1932*387f9dfdSAndroid Build Coastguard Worker         }
1933*387f9dfdSAndroid Build Coastguard Worker 
1934*387f9dfdSAndroid Build Coastguard Worker         MessageInfo m_info;
1935*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream m_stream;
1936*387f9dfdSAndroid Build Coastguard Worker     };
1937*387f9dfdSAndroid Build Coastguard Worker 
1938*387f9dfdSAndroid Build Coastguard Worker     class ScopedMessage {
1939*387f9dfdSAndroid Build Coastguard Worker     public:
1940*387f9dfdSAndroid Build Coastguard Worker         ScopedMessage( MessageBuilder const& builder );
1941*387f9dfdSAndroid Build Coastguard Worker         ScopedMessage( ScopedMessage const& other );
1942*387f9dfdSAndroid Build Coastguard Worker         ~ScopedMessage();
1943*387f9dfdSAndroid Build Coastguard Worker 
1944*387f9dfdSAndroid Build Coastguard Worker         MessageInfo m_info;
1945*387f9dfdSAndroid Build Coastguard Worker     };
1946*387f9dfdSAndroid Build Coastguard Worker 
1947*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
1948*387f9dfdSAndroid Build Coastguard Worker 
1949*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_capture.h
1950*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED
1951*387f9dfdSAndroid Build Coastguard Worker 
1952*387f9dfdSAndroid Build Coastguard Worker #include <string>
1953*387f9dfdSAndroid Build Coastguard Worker 
1954*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
1955*387f9dfdSAndroid Build Coastguard Worker 
1956*387f9dfdSAndroid Build Coastguard Worker     class TestCase;
1957*387f9dfdSAndroid Build Coastguard Worker     class AssertionResult;
1958*387f9dfdSAndroid Build Coastguard Worker     struct AssertionInfo;
1959*387f9dfdSAndroid Build Coastguard Worker     struct SectionInfo;
1960*387f9dfdSAndroid Build Coastguard Worker     struct SectionEndInfo;
1961*387f9dfdSAndroid Build Coastguard Worker     struct MessageInfo;
1962*387f9dfdSAndroid Build Coastguard Worker     class ScopedMessageBuilder;
1963*387f9dfdSAndroid Build Coastguard Worker     struct Counts;
1964*387f9dfdSAndroid Build Coastguard Worker 
1965*387f9dfdSAndroid Build Coastguard Worker     struct IResultCapture {
1966*387f9dfdSAndroid Build Coastguard Worker 
1967*387f9dfdSAndroid Build Coastguard Worker         virtual ~IResultCapture();
1968*387f9dfdSAndroid Build Coastguard Worker 
1969*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionEnded( AssertionResult const& result ) = 0;
1970*387f9dfdSAndroid Build Coastguard Worker         virtual bool sectionStarted(    SectionInfo const& sectionInfo,
1971*387f9dfdSAndroid Build Coastguard Worker                                         Counts& assertions ) = 0;
1972*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;
1973*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;
1974*387f9dfdSAndroid Build Coastguard Worker         virtual void pushScopedMessage( MessageInfo const& message ) = 0;
1975*387f9dfdSAndroid Build Coastguard Worker         virtual void popScopedMessage( MessageInfo const& message ) = 0;
1976*387f9dfdSAndroid Build Coastguard Worker 
1977*387f9dfdSAndroid Build Coastguard Worker         virtual std::string getCurrentTestName() const = 0;
1978*387f9dfdSAndroid Build Coastguard Worker         virtual const AssertionResult* getLastResult() const = 0;
1979*387f9dfdSAndroid Build Coastguard Worker 
1980*387f9dfdSAndroid Build Coastguard Worker         virtual void handleFatalErrorCondition( std::string const& message ) = 0;
1981*387f9dfdSAndroid Build Coastguard Worker     };
1982*387f9dfdSAndroid Build Coastguard Worker 
1983*387f9dfdSAndroid Build Coastguard Worker     IResultCapture& getResultCapture();
1984*387f9dfdSAndroid Build Coastguard Worker }
1985*387f9dfdSAndroid Build Coastguard Worker 
1986*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_debugger.h
1987*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED
1988*387f9dfdSAndroid Build Coastguard Worker 
1989*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_platform.h
1990*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED
1991*387f9dfdSAndroid Build Coastguard Worker 
1992*387f9dfdSAndroid Build Coastguard Worker #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
1993*387f9dfdSAndroid Build Coastguard Worker #define CATCH_PLATFORM_MAC
1994*387f9dfdSAndroid Build Coastguard Worker #elif  defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
1995*387f9dfdSAndroid Build Coastguard Worker #define CATCH_PLATFORM_IPHONE
1996*387f9dfdSAndroid Build Coastguard Worker #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
1997*387f9dfdSAndroid Build Coastguard Worker #define CATCH_PLATFORM_WINDOWS
1998*387f9dfdSAndroid Build Coastguard Worker #endif
1999*387f9dfdSAndroid Build Coastguard Worker 
2000*387f9dfdSAndroid Build Coastguard Worker #include <string>
2001*387f9dfdSAndroid Build Coastguard Worker 
2002*387f9dfdSAndroid Build Coastguard Worker namespace Catch{
2003*387f9dfdSAndroid Build Coastguard Worker 
2004*387f9dfdSAndroid Build Coastguard Worker     bool isDebuggerActive();
2005*387f9dfdSAndroid Build Coastguard Worker     void writeToDebugConsole( std::string const& text );
2006*387f9dfdSAndroid Build Coastguard Worker }
2007*387f9dfdSAndroid Build Coastguard Worker 
2008*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_MAC
2009*387f9dfdSAndroid Build Coastguard Worker 
2010*387f9dfdSAndroid Build Coastguard Worker     // The following code snippet based on:
2011*387f9dfdSAndroid Build Coastguard Worker     // http://cocoawithlove.com/2008/03/break-into-debugger.html
2012*387f9dfdSAndroid Build Coastguard Worker     #ifdef DEBUG
2013*387f9dfdSAndroid Build Coastguard Worker         #if defined(__ppc64__) || defined(__ppc__)
2014*387f9dfdSAndroid Build Coastguard Worker             #define CATCH_BREAK_INTO_DEBUGGER() \
2015*387f9dfdSAndroid Build Coastguard Worker                 if( Catch::isDebuggerActive() ) { \
2016*387f9dfdSAndroid Build Coastguard Worker                     __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
2017*387f9dfdSAndroid Build Coastguard Worker                     : : : "memory","r0","r3","r4" ); \
2018*387f9dfdSAndroid Build Coastguard Worker                 }
2019*387f9dfdSAndroid Build Coastguard Worker         #else
2020*387f9dfdSAndroid Build Coastguard Worker             #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );}
2021*387f9dfdSAndroid Build Coastguard Worker         #endif
2022*387f9dfdSAndroid Build Coastguard Worker     #endif
2023*387f9dfdSAndroid Build Coastguard Worker 
2024*387f9dfdSAndroid Build Coastguard Worker #elif defined(_MSC_VER)
2025*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); }
2026*387f9dfdSAndroid Build Coastguard Worker #elif defined(__MINGW32__)
2027*387f9dfdSAndroid Build Coastguard Worker     extern "C" __declspec(dllimport) void __stdcall DebugBreak();
2028*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); }
2029*387f9dfdSAndroid Build Coastguard Worker #endif
2030*387f9dfdSAndroid Build Coastguard Worker 
2031*387f9dfdSAndroid Build Coastguard Worker #ifndef CATCH_BREAK_INTO_DEBUGGER
2032*387f9dfdSAndroid Build Coastguard Worker #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
2033*387f9dfdSAndroid Build Coastguard Worker #endif
2034*387f9dfdSAndroid Build Coastguard Worker 
2035*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_runner.h
2036*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED
2037*387f9dfdSAndroid Build Coastguard Worker 
2038*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2039*387f9dfdSAndroid Build Coastguard Worker     class TestCase;
2040*387f9dfdSAndroid Build Coastguard Worker 
2041*387f9dfdSAndroid Build Coastguard Worker     struct IRunner {
2042*387f9dfdSAndroid Build Coastguard Worker         virtual ~IRunner();
2043*387f9dfdSAndroid Build Coastguard Worker         virtual bool aborting() const = 0;
2044*387f9dfdSAndroid Build Coastguard Worker     };
2045*387f9dfdSAndroid Build Coastguard Worker }
2046*387f9dfdSAndroid Build Coastguard Worker 
2047*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2048*387f9dfdSAndroid Build Coastguard Worker // In the event of a failure works out if the debugger needs to be invoked
2049*387f9dfdSAndroid Build Coastguard Worker // and/or an exception thrown and takes appropriate action.
2050*387f9dfdSAndroid Build Coastguard Worker // This needs to be done as a macro so the debugger will stop in the user
2051*387f9dfdSAndroid Build Coastguard Worker // source code rather than in Catch library code
2052*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_REACT( resultBuilder ) \
2053*387f9dfdSAndroid Build Coastguard Worker     if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \
2054*387f9dfdSAndroid Build Coastguard Worker     resultBuilder.react();
2055*387f9dfdSAndroid Build Coastguard Worker 
2056*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2057*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
2058*387f9dfdSAndroid Build Coastguard Worker     do { \
2059*387f9dfdSAndroid Build Coastguard Worker         Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
2060*387f9dfdSAndroid Build Coastguard Worker         try { \
2061*387f9dfdSAndroid Build Coastguard Worker             CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
2062*387f9dfdSAndroid Build Coastguard Worker             ( __catchResult <= expr ).endExpression(); \
2063*387f9dfdSAndroid Build Coastguard Worker         } \
2064*387f9dfdSAndroid Build Coastguard Worker         catch( ... ) { \
2065*387f9dfdSAndroid Build Coastguard Worker             __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
2066*387f9dfdSAndroid Build Coastguard Worker         } \
2067*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_REACT( __catchResult ) \
2068*387f9dfdSAndroid Build Coastguard Worker     } while( Catch::isTrue( false && static_cast<bool>(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
2069*387f9dfdSAndroid Build Coastguard Worker 
2070*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2071*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \
2072*387f9dfdSAndroid Build Coastguard Worker     INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
2073*387f9dfdSAndroid Build Coastguard Worker     if( Catch::getResultCapture().getLastResult()->succeeded() )
2074*387f9dfdSAndroid Build Coastguard Worker 
2075*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2076*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \
2077*387f9dfdSAndroid Build Coastguard Worker     INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
2078*387f9dfdSAndroid Build Coastguard Worker     if( !Catch::getResultCapture().getLastResult()->succeeded() )
2079*387f9dfdSAndroid Build Coastguard Worker 
2080*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2081*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \
2082*387f9dfdSAndroid Build Coastguard Worker     do { \
2083*387f9dfdSAndroid Build Coastguard Worker         Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
2084*387f9dfdSAndroid Build Coastguard Worker         try { \
2085*387f9dfdSAndroid Build Coastguard Worker             expr; \
2086*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureResult( Catch::ResultWas::Ok ); \
2087*387f9dfdSAndroid Build Coastguard Worker         } \
2088*387f9dfdSAndroid Build Coastguard Worker         catch( ... ) { \
2089*387f9dfdSAndroid Build Coastguard Worker             __catchResult.useActiveException( resultDisposition ); \
2090*387f9dfdSAndroid Build Coastguard Worker         } \
2091*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_REACT( __catchResult ) \
2092*387f9dfdSAndroid Build Coastguard Worker     } while( Catch::alwaysFalse() )
2093*387f9dfdSAndroid Build Coastguard Worker 
2094*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2095*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_THROWS( expr, resultDisposition, matcher, macroName ) \
2096*387f9dfdSAndroid Build Coastguard Worker     do { \
2097*387f9dfdSAndroid Build Coastguard Worker         Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \
2098*387f9dfdSAndroid Build Coastguard Worker         if( __catchResult.allowThrows() ) \
2099*387f9dfdSAndroid Build Coastguard Worker             try { \
2100*387f9dfdSAndroid Build Coastguard Worker                 expr; \
2101*387f9dfdSAndroid Build Coastguard Worker                 __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
2102*387f9dfdSAndroid Build Coastguard Worker             } \
2103*387f9dfdSAndroid Build Coastguard Worker             catch( ... ) { \
2104*387f9dfdSAndroid Build Coastguard Worker                 __catchResult.captureExpectedException( matcher ); \
2105*387f9dfdSAndroid Build Coastguard Worker             } \
2106*387f9dfdSAndroid Build Coastguard Worker         else \
2107*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureResult( Catch::ResultWas::Ok ); \
2108*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_REACT( __catchResult ) \
2109*387f9dfdSAndroid Build Coastguard Worker     } while( Catch::alwaysFalse() )
2110*387f9dfdSAndroid Build Coastguard Worker 
2111*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2112*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \
2113*387f9dfdSAndroid Build Coastguard Worker     do { \
2114*387f9dfdSAndroid Build Coastguard Worker         Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
2115*387f9dfdSAndroid Build Coastguard Worker         if( __catchResult.allowThrows() ) \
2116*387f9dfdSAndroid Build Coastguard Worker             try { \
2117*387f9dfdSAndroid Build Coastguard Worker                 expr; \
2118*387f9dfdSAndroid Build Coastguard Worker                 __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
2119*387f9dfdSAndroid Build Coastguard Worker             } \
2120*387f9dfdSAndroid Build Coastguard Worker             catch( exceptionType ) { \
2121*387f9dfdSAndroid Build Coastguard Worker                 __catchResult.captureResult( Catch::ResultWas::Ok ); \
2122*387f9dfdSAndroid Build Coastguard Worker             } \
2123*387f9dfdSAndroid Build Coastguard Worker             catch( ... ) { \
2124*387f9dfdSAndroid Build Coastguard Worker                 __catchResult.useActiveException( resultDisposition ); \
2125*387f9dfdSAndroid Build Coastguard Worker             } \
2126*387f9dfdSAndroid Build Coastguard Worker         else \
2127*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureResult( Catch::ResultWas::Ok ); \
2128*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_REACT( __catchResult ) \
2129*387f9dfdSAndroid Build Coastguard Worker     } while( Catch::alwaysFalse() )
2130*387f9dfdSAndroid Build Coastguard Worker 
2131*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2132*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
2133*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \
2134*387f9dfdSAndroid Build Coastguard Worker         do { \
2135*387f9dfdSAndroid Build Coastguard Worker             Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
2136*387f9dfdSAndroid Build Coastguard Worker             __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \
2137*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureResult( messageType ); \
2138*387f9dfdSAndroid Build Coastguard Worker             INTERNAL_CATCH_REACT( __catchResult ) \
2139*387f9dfdSAndroid Build Coastguard Worker         } while( Catch::alwaysFalse() )
2140*387f9dfdSAndroid Build Coastguard Worker #else
2141*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \
2142*387f9dfdSAndroid Build Coastguard Worker         do { \
2143*387f9dfdSAndroid Build Coastguard Worker             Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
2144*387f9dfdSAndroid Build Coastguard Worker             __catchResult << log + ::Catch::StreamEndStop(); \
2145*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureResult( messageType ); \
2146*387f9dfdSAndroid Build Coastguard Worker             INTERNAL_CATCH_REACT( __catchResult ) \
2147*387f9dfdSAndroid Build Coastguard Worker         } while( Catch::alwaysFalse() )
2148*387f9dfdSAndroid Build Coastguard Worker #endif
2149*387f9dfdSAndroid Build Coastguard Worker 
2150*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2151*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_INFO( log, macroName ) \
2152*387f9dfdSAndroid Build Coastguard Worker     Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log;
2153*387f9dfdSAndroid Build Coastguard Worker 
2154*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2155*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
2156*387f9dfdSAndroid Build Coastguard Worker     do { \
2157*387f9dfdSAndroid Build Coastguard Worker         Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \
2158*387f9dfdSAndroid Build Coastguard Worker         try { \
2159*387f9dfdSAndroid Build Coastguard Worker             std::string matcherAsString = (matcher).toString(); \
2160*387f9dfdSAndroid Build Coastguard Worker             __catchResult \
2161*387f9dfdSAndroid Build Coastguard Worker                 .setLhs( Catch::toString( arg ) ) \
2162*387f9dfdSAndroid Build Coastguard Worker                 .setRhs( matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString ) \
2163*387f9dfdSAndroid Build Coastguard Worker                 .setOp( "matches" ) \
2164*387f9dfdSAndroid Build Coastguard Worker                 .setResultType( (matcher).match( arg ) ); \
2165*387f9dfdSAndroid Build Coastguard Worker             __catchResult.captureExpression(); \
2166*387f9dfdSAndroid Build Coastguard Worker         } catch( ... ) { \
2167*387f9dfdSAndroid Build Coastguard Worker             __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \
2168*387f9dfdSAndroid Build Coastguard Worker         } \
2169*387f9dfdSAndroid Build Coastguard Worker         INTERNAL_CATCH_REACT( __catchResult ) \
2170*387f9dfdSAndroid Build Coastguard Worker     } while( Catch::alwaysFalse() )
2171*387f9dfdSAndroid Build Coastguard Worker 
2172*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_section.h
2173*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED
2174*387f9dfdSAndroid Build Coastguard Worker 
2175*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_section_info.h
2176*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED
2177*387f9dfdSAndroid Build Coastguard Worker 
2178*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_totals.hpp
2179*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED
2180*387f9dfdSAndroid Build Coastguard Worker 
2181*387f9dfdSAndroid Build Coastguard Worker #include <cstddef>
2182*387f9dfdSAndroid Build Coastguard Worker 
2183*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2184*387f9dfdSAndroid Build Coastguard Worker 
2185*387f9dfdSAndroid Build Coastguard Worker     struct Counts {
CountsCatch::Counts2186*387f9dfdSAndroid Build Coastguard Worker         Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {}
2187*387f9dfdSAndroid Build Coastguard Worker 
operator -Catch::Counts2188*387f9dfdSAndroid Build Coastguard Worker         Counts operator - ( Counts const& other ) const {
2189*387f9dfdSAndroid Build Coastguard Worker             Counts diff;
2190*387f9dfdSAndroid Build Coastguard Worker             diff.passed = passed - other.passed;
2191*387f9dfdSAndroid Build Coastguard Worker             diff.failed = failed - other.failed;
2192*387f9dfdSAndroid Build Coastguard Worker             diff.failedButOk = failedButOk - other.failedButOk;
2193*387f9dfdSAndroid Build Coastguard Worker             return diff;
2194*387f9dfdSAndroid Build Coastguard Worker         }
operator +=Catch::Counts2195*387f9dfdSAndroid Build Coastguard Worker         Counts& operator += ( Counts const& other ) {
2196*387f9dfdSAndroid Build Coastguard Worker             passed += other.passed;
2197*387f9dfdSAndroid Build Coastguard Worker             failed += other.failed;
2198*387f9dfdSAndroid Build Coastguard Worker             failedButOk += other.failedButOk;
2199*387f9dfdSAndroid Build Coastguard Worker             return *this;
2200*387f9dfdSAndroid Build Coastguard Worker         }
2201*387f9dfdSAndroid Build Coastguard Worker 
totalCatch::Counts2202*387f9dfdSAndroid Build Coastguard Worker         std::size_t total() const {
2203*387f9dfdSAndroid Build Coastguard Worker             return passed + failed + failedButOk;
2204*387f9dfdSAndroid Build Coastguard Worker         }
allPassedCatch::Counts2205*387f9dfdSAndroid Build Coastguard Worker         bool allPassed() const {
2206*387f9dfdSAndroid Build Coastguard Worker             return failed == 0 && failedButOk == 0;
2207*387f9dfdSAndroid Build Coastguard Worker         }
allOkCatch::Counts2208*387f9dfdSAndroid Build Coastguard Worker         bool allOk() const {
2209*387f9dfdSAndroid Build Coastguard Worker             return failed == 0;
2210*387f9dfdSAndroid Build Coastguard Worker         }
2211*387f9dfdSAndroid Build Coastguard Worker 
2212*387f9dfdSAndroid Build Coastguard Worker         std::size_t passed;
2213*387f9dfdSAndroid Build Coastguard Worker         std::size_t failed;
2214*387f9dfdSAndroid Build Coastguard Worker         std::size_t failedButOk;
2215*387f9dfdSAndroid Build Coastguard Worker     };
2216*387f9dfdSAndroid Build Coastguard Worker 
2217*387f9dfdSAndroid Build Coastguard Worker     struct Totals {
2218*387f9dfdSAndroid Build Coastguard Worker 
operator -Catch::Totals2219*387f9dfdSAndroid Build Coastguard Worker         Totals operator - ( Totals const& other ) const {
2220*387f9dfdSAndroid Build Coastguard Worker             Totals diff;
2221*387f9dfdSAndroid Build Coastguard Worker             diff.assertions = assertions - other.assertions;
2222*387f9dfdSAndroid Build Coastguard Worker             diff.testCases = testCases - other.testCases;
2223*387f9dfdSAndroid Build Coastguard Worker             return diff;
2224*387f9dfdSAndroid Build Coastguard Worker         }
2225*387f9dfdSAndroid Build Coastguard Worker 
deltaCatch::Totals2226*387f9dfdSAndroid Build Coastguard Worker         Totals delta( Totals const& prevTotals ) const {
2227*387f9dfdSAndroid Build Coastguard Worker             Totals diff = *this - prevTotals;
2228*387f9dfdSAndroid Build Coastguard Worker             if( diff.assertions.failed > 0 )
2229*387f9dfdSAndroid Build Coastguard Worker                 ++diff.testCases.failed;
2230*387f9dfdSAndroid Build Coastguard Worker             else if( diff.assertions.failedButOk > 0 )
2231*387f9dfdSAndroid Build Coastguard Worker                 ++diff.testCases.failedButOk;
2232*387f9dfdSAndroid Build Coastguard Worker             else
2233*387f9dfdSAndroid Build Coastguard Worker                 ++diff.testCases.passed;
2234*387f9dfdSAndroid Build Coastguard Worker             return diff;
2235*387f9dfdSAndroid Build Coastguard Worker         }
2236*387f9dfdSAndroid Build Coastguard Worker 
operator +=Catch::Totals2237*387f9dfdSAndroid Build Coastguard Worker         Totals& operator += ( Totals const& other ) {
2238*387f9dfdSAndroid Build Coastguard Worker             assertions += other.assertions;
2239*387f9dfdSAndroid Build Coastguard Worker             testCases += other.testCases;
2240*387f9dfdSAndroid Build Coastguard Worker             return *this;
2241*387f9dfdSAndroid Build Coastguard Worker         }
2242*387f9dfdSAndroid Build Coastguard Worker 
2243*387f9dfdSAndroid Build Coastguard Worker         Counts assertions;
2244*387f9dfdSAndroid Build Coastguard Worker         Counts testCases;
2245*387f9dfdSAndroid Build Coastguard Worker     };
2246*387f9dfdSAndroid Build Coastguard Worker }
2247*387f9dfdSAndroid Build Coastguard Worker 
2248*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2249*387f9dfdSAndroid Build Coastguard Worker 
2250*387f9dfdSAndroid Build Coastguard Worker     struct SectionInfo {
2251*387f9dfdSAndroid Build Coastguard Worker         SectionInfo
2252*387f9dfdSAndroid Build Coastguard Worker             (   SourceLineInfo const& _lineInfo,
2253*387f9dfdSAndroid Build Coastguard Worker                 std::string const& _name,
2254*387f9dfdSAndroid Build Coastguard Worker                 std::string const& _description = std::string() );
2255*387f9dfdSAndroid Build Coastguard Worker 
2256*387f9dfdSAndroid Build Coastguard Worker         std::string name;
2257*387f9dfdSAndroid Build Coastguard Worker         std::string description;
2258*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo lineInfo;
2259*387f9dfdSAndroid Build Coastguard Worker     };
2260*387f9dfdSAndroid Build Coastguard Worker 
2261*387f9dfdSAndroid Build Coastguard Worker     struct SectionEndInfo {
SectionEndInfoCatch::SectionEndInfo2262*387f9dfdSAndroid Build Coastguard Worker         SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds )
2263*387f9dfdSAndroid Build Coastguard Worker         : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds )
2264*387f9dfdSAndroid Build Coastguard Worker         {}
2265*387f9dfdSAndroid Build Coastguard Worker 
2266*387f9dfdSAndroid Build Coastguard Worker         SectionInfo sectionInfo;
2267*387f9dfdSAndroid Build Coastguard Worker         Counts prevAssertions;
2268*387f9dfdSAndroid Build Coastguard Worker         double durationInSeconds;
2269*387f9dfdSAndroid Build Coastguard Worker     };
2270*387f9dfdSAndroid Build Coastguard Worker 
2271*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2272*387f9dfdSAndroid Build Coastguard Worker 
2273*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_timer.h
2274*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
2275*387f9dfdSAndroid Build Coastguard Worker 
2276*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_WINDOWS
2277*387f9dfdSAndroid Build Coastguard Worker typedef unsigned long long uint64_t;
2278*387f9dfdSAndroid Build Coastguard Worker #else
2279*387f9dfdSAndroid Build Coastguard Worker #include <stdint.h>
2280*387f9dfdSAndroid Build Coastguard Worker #endif
2281*387f9dfdSAndroid Build Coastguard Worker 
2282*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2283*387f9dfdSAndroid Build Coastguard Worker 
2284*387f9dfdSAndroid Build Coastguard Worker     class Timer {
2285*387f9dfdSAndroid Build Coastguard Worker     public:
Timer()2286*387f9dfdSAndroid Build Coastguard Worker         Timer() : m_ticks( 0 ) {}
2287*387f9dfdSAndroid Build Coastguard Worker         void start();
2288*387f9dfdSAndroid Build Coastguard Worker         unsigned int getElapsedMicroseconds() const;
2289*387f9dfdSAndroid Build Coastguard Worker         unsigned int getElapsedMilliseconds() const;
2290*387f9dfdSAndroid Build Coastguard Worker         double getElapsedSeconds() const;
2291*387f9dfdSAndroid Build Coastguard Worker 
2292*387f9dfdSAndroid Build Coastguard Worker     private:
2293*387f9dfdSAndroid Build Coastguard Worker         uint64_t m_ticks;
2294*387f9dfdSAndroid Build Coastguard Worker     };
2295*387f9dfdSAndroid Build Coastguard Worker 
2296*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
2297*387f9dfdSAndroid Build Coastguard Worker 
2298*387f9dfdSAndroid Build Coastguard Worker #include <string>
2299*387f9dfdSAndroid Build Coastguard Worker 
2300*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2301*387f9dfdSAndroid Build Coastguard Worker 
2302*387f9dfdSAndroid Build Coastguard Worker     class Section : NonCopyable {
2303*387f9dfdSAndroid Build Coastguard Worker     public:
2304*387f9dfdSAndroid Build Coastguard Worker         Section( SectionInfo const& info );
2305*387f9dfdSAndroid Build Coastguard Worker         ~Section();
2306*387f9dfdSAndroid Build Coastguard Worker 
2307*387f9dfdSAndroid Build Coastguard Worker         // This indicates whether the section should be executed or not
2308*387f9dfdSAndroid Build Coastguard Worker         operator bool() const;
2309*387f9dfdSAndroid Build Coastguard Worker 
2310*387f9dfdSAndroid Build Coastguard Worker     private:
2311*387f9dfdSAndroid Build Coastguard Worker         SectionInfo m_info;
2312*387f9dfdSAndroid Build Coastguard Worker 
2313*387f9dfdSAndroid Build Coastguard Worker         std::string m_name;
2314*387f9dfdSAndroid Build Coastguard Worker         Counts m_assertions;
2315*387f9dfdSAndroid Build Coastguard Worker         bool m_sectionIncluded;
2316*387f9dfdSAndroid Build Coastguard Worker         Timer m_timer;
2317*387f9dfdSAndroid Build Coastguard Worker     };
2318*387f9dfdSAndroid Build Coastguard Worker 
2319*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2320*387f9dfdSAndroid Build Coastguard Worker 
2321*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
2322*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_SECTION( ... ) \
2323*387f9dfdSAndroid Build Coastguard Worker         if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) )
2324*387f9dfdSAndroid Build Coastguard Worker #else
2325*387f9dfdSAndroid Build Coastguard Worker     #define INTERNAL_CATCH_SECTION( name, desc ) \
2326*387f9dfdSAndroid Build Coastguard Worker         if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) )
2327*387f9dfdSAndroid Build Coastguard Worker #endif
2328*387f9dfdSAndroid Build Coastguard Worker 
2329*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_generators.hpp
2330*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
2331*387f9dfdSAndroid Build Coastguard Worker 
2332*387f9dfdSAndroid Build Coastguard Worker #include <iterator>
2333*387f9dfdSAndroid Build Coastguard Worker #include <vector>
2334*387f9dfdSAndroid Build Coastguard Worker #include <string>
2335*387f9dfdSAndroid Build Coastguard Worker #include <stdlib.h>
2336*387f9dfdSAndroid Build Coastguard Worker 
2337*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2338*387f9dfdSAndroid Build Coastguard Worker 
2339*387f9dfdSAndroid Build Coastguard Worker template<typename T>
2340*387f9dfdSAndroid Build Coastguard Worker struct IGenerator {
~IGeneratorCatch::IGenerator2341*387f9dfdSAndroid Build Coastguard Worker     virtual ~IGenerator() {}
2342*387f9dfdSAndroid Build Coastguard Worker     virtual T getValue( std::size_t index ) const = 0;
2343*387f9dfdSAndroid Build Coastguard Worker     virtual std::size_t size () const = 0;
2344*387f9dfdSAndroid Build Coastguard Worker };
2345*387f9dfdSAndroid Build Coastguard Worker 
2346*387f9dfdSAndroid Build Coastguard Worker template<typename T>
2347*387f9dfdSAndroid Build Coastguard Worker class BetweenGenerator : public IGenerator<T> {
2348*387f9dfdSAndroid Build Coastguard Worker public:
BetweenGenerator(T from,T to)2349*387f9dfdSAndroid Build Coastguard Worker     BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
2350*387f9dfdSAndroid Build Coastguard Worker 
getValue(std::size_t index) const2351*387f9dfdSAndroid Build Coastguard Worker     virtual T getValue( std::size_t index ) const {
2352*387f9dfdSAndroid Build Coastguard Worker         return m_from+static_cast<int>( index );
2353*387f9dfdSAndroid Build Coastguard Worker     }
2354*387f9dfdSAndroid Build Coastguard Worker 
size() const2355*387f9dfdSAndroid Build Coastguard Worker     virtual std::size_t size() const {
2356*387f9dfdSAndroid Build Coastguard Worker         return static_cast<std::size_t>( 1+m_to-m_from );
2357*387f9dfdSAndroid Build Coastguard Worker     }
2358*387f9dfdSAndroid Build Coastguard Worker 
2359*387f9dfdSAndroid Build Coastguard Worker private:
2360*387f9dfdSAndroid Build Coastguard Worker 
2361*387f9dfdSAndroid Build Coastguard Worker     T m_from;
2362*387f9dfdSAndroid Build Coastguard Worker     T m_to;
2363*387f9dfdSAndroid Build Coastguard Worker };
2364*387f9dfdSAndroid Build Coastguard Worker 
2365*387f9dfdSAndroid Build Coastguard Worker template<typename T>
2366*387f9dfdSAndroid Build Coastguard Worker class ValuesGenerator : public IGenerator<T> {
2367*387f9dfdSAndroid Build Coastguard Worker public:
ValuesGenerator()2368*387f9dfdSAndroid Build Coastguard Worker     ValuesGenerator(){}
2369*387f9dfdSAndroid Build Coastguard Worker 
add(T value)2370*387f9dfdSAndroid Build Coastguard Worker     void add( T value ) {
2371*387f9dfdSAndroid Build Coastguard Worker         m_values.push_back( value );
2372*387f9dfdSAndroid Build Coastguard Worker     }
2373*387f9dfdSAndroid Build Coastguard Worker 
getValue(std::size_t index) const2374*387f9dfdSAndroid Build Coastguard Worker     virtual T getValue( std::size_t index ) const {
2375*387f9dfdSAndroid Build Coastguard Worker         return m_values[index];
2376*387f9dfdSAndroid Build Coastguard Worker     }
2377*387f9dfdSAndroid Build Coastguard Worker 
size() const2378*387f9dfdSAndroid Build Coastguard Worker     virtual std::size_t size() const {
2379*387f9dfdSAndroid Build Coastguard Worker         return m_values.size();
2380*387f9dfdSAndroid Build Coastguard Worker     }
2381*387f9dfdSAndroid Build Coastguard Worker 
2382*387f9dfdSAndroid Build Coastguard Worker private:
2383*387f9dfdSAndroid Build Coastguard Worker     std::vector<T> m_values;
2384*387f9dfdSAndroid Build Coastguard Worker };
2385*387f9dfdSAndroid Build Coastguard Worker 
2386*387f9dfdSAndroid Build Coastguard Worker template<typename T>
2387*387f9dfdSAndroid Build Coastguard Worker class CompositeGenerator {
2388*387f9dfdSAndroid Build Coastguard Worker public:
CompositeGenerator()2389*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator() : m_totalSize( 0 ) {}
2390*387f9dfdSAndroid Build Coastguard Worker 
2391*387f9dfdSAndroid Build Coastguard Worker     // *** Move semantics, similar to auto_ptr ***
CompositeGenerator(CompositeGenerator & other)2392*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator( CompositeGenerator& other )
2393*387f9dfdSAndroid Build Coastguard Worker     :   m_fileInfo( other.m_fileInfo ),
2394*387f9dfdSAndroid Build Coastguard Worker         m_totalSize( 0 )
2395*387f9dfdSAndroid Build Coastguard Worker     {
2396*387f9dfdSAndroid Build Coastguard Worker         move( other );
2397*387f9dfdSAndroid Build Coastguard Worker     }
2398*387f9dfdSAndroid Build Coastguard Worker 
setFileInfo(const char * fileInfo)2399*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator& setFileInfo( const char* fileInfo ) {
2400*387f9dfdSAndroid Build Coastguard Worker         m_fileInfo = fileInfo;
2401*387f9dfdSAndroid Build Coastguard Worker         return *this;
2402*387f9dfdSAndroid Build Coastguard Worker     }
2403*387f9dfdSAndroid Build Coastguard Worker 
~CompositeGenerator()2404*387f9dfdSAndroid Build Coastguard Worker     ~CompositeGenerator() {
2405*387f9dfdSAndroid Build Coastguard Worker         deleteAll( m_composed );
2406*387f9dfdSAndroid Build Coastguard Worker     }
2407*387f9dfdSAndroid Build Coastguard Worker 
operator T() const2408*387f9dfdSAndroid Build Coastguard Worker     operator T () const {
2409*387f9dfdSAndroid Build Coastguard Worker         size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize );
2410*387f9dfdSAndroid Build Coastguard Worker 
2411*387f9dfdSAndroid Build Coastguard Worker         typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();
2412*387f9dfdSAndroid Build Coastguard Worker         typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();
2413*387f9dfdSAndroid Build Coastguard Worker         for( size_t index = 0; it != itEnd; ++it )
2414*387f9dfdSAndroid Build Coastguard Worker         {
2415*387f9dfdSAndroid Build Coastguard Worker             const IGenerator<T>* generator = *it;
2416*387f9dfdSAndroid Build Coastguard Worker             if( overallIndex >= index && overallIndex < index + generator->size() )
2417*387f9dfdSAndroid Build Coastguard Worker             {
2418*387f9dfdSAndroid Build Coastguard Worker                 return generator->getValue( overallIndex-index );
2419*387f9dfdSAndroid Build Coastguard Worker             }
2420*387f9dfdSAndroid Build Coastguard Worker             index += generator->size();
2421*387f9dfdSAndroid Build Coastguard Worker         }
2422*387f9dfdSAndroid Build Coastguard Worker         CATCH_INTERNAL_ERROR( "Indexed past end of generated range" );
2423*387f9dfdSAndroid Build Coastguard Worker         return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so
2424*387f9dfdSAndroid Build Coastguard Worker     }
2425*387f9dfdSAndroid Build Coastguard Worker 
add(const IGenerator<T> * generator)2426*387f9dfdSAndroid Build Coastguard Worker     void add( const IGenerator<T>* generator ) {
2427*387f9dfdSAndroid Build Coastguard Worker         m_totalSize += generator->size();
2428*387f9dfdSAndroid Build Coastguard Worker         m_composed.push_back( generator );
2429*387f9dfdSAndroid Build Coastguard Worker     }
2430*387f9dfdSAndroid Build Coastguard Worker 
then(CompositeGenerator & other)2431*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator& then( CompositeGenerator& other ) {
2432*387f9dfdSAndroid Build Coastguard Worker         move( other );
2433*387f9dfdSAndroid Build Coastguard Worker         return *this;
2434*387f9dfdSAndroid Build Coastguard Worker     }
2435*387f9dfdSAndroid Build Coastguard Worker 
then(T value)2436*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator& then( T value ) {
2437*387f9dfdSAndroid Build Coastguard Worker         ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
2438*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( value );
2439*387f9dfdSAndroid Build Coastguard Worker         add( valuesGen );
2440*387f9dfdSAndroid Build Coastguard Worker         return *this;
2441*387f9dfdSAndroid Build Coastguard Worker     }
2442*387f9dfdSAndroid Build Coastguard Worker 
2443*387f9dfdSAndroid Build Coastguard Worker private:
2444*387f9dfdSAndroid Build Coastguard Worker 
move(CompositeGenerator & other)2445*387f9dfdSAndroid Build Coastguard Worker     void move( CompositeGenerator& other ) {
2446*387f9dfdSAndroid Build Coastguard Worker         std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) );
2447*387f9dfdSAndroid Build Coastguard Worker         m_totalSize += other.m_totalSize;
2448*387f9dfdSAndroid Build Coastguard Worker         other.m_composed.clear();
2449*387f9dfdSAndroid Build Coastguard Worker     }
2450*387f9dfdSAndroid Build Coastguard Worker 
2451*387f9dfdSAndroid Build Coastguard Worker     std::vector<const IGenerator<T>*> m_composed;
2452*387f9dfdSAndroid Build Coastguard Worker     std::string m_fileInfo;
2453*387f9dfdSAndroid Build Coastguard Worker     size_t m_totalSize;
2454*387f9dfdSAndroid Build Coastguard Worker };
2455*387f9dfdSAndroid Build Coastguard Worker 
2456*387f9dfdSAndroid Build Coastguard Worker namespace Generators
2457*387f9dfdSAndroid Build Coastguard Worker {
2458*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
between(T from,T to)2459*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator<T> between( T from, T to ) {
2460*387f9dfdSAndroid Build Coastguard Worker         CompositeGenerator<T> generators;
2461*387f9dfdSAndroid Build Coastguard Worker         generators.add( new BetweenGenerator<T>( from, to ) );
2462*387f9dfdSAndroid Build Coastguard Worker         return generators;
2463*387f9dfdSAndroid Build Coastguard Worker     }
2464*387f9dfdSAndroid Build Coastguard Worker 
2465*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
values(T val1,T val2)2466*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator<T> values( T val1, T val2 ) {
2467*387f9dfdSAndroid Build Coastguard Worker         CompositeGenerator<T> generators;
2468*387f9dfdSAndroid Build Coastguard Worker         ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
2469*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val1 );
2470*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val2 );
2471*387f9dfdSAndroid Build Coastguard Worker         generators.add( valuesGen );
2472*387f9dfdSAndroid Build Coastguard Worker         return generators;
2473*387f9dfdSAndroid Build Coastguard Worker     }
2474*387f9dfdSAndroid Build Coastguard Worker 
2475*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
values(T val1,T val2,T val3)2476*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator<T> values( T val1, T val2, T val3 ){
2477*387f9dfdSAndroid Build Coastguard Worker         CompositeGenerator<T> generators;
2478*387f9dfdSAndroid Build Coastguard Worker         ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
2479*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val1 );
2480*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val2 );
2481*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val3 );
2482*387f9dfdSAndroid Build Coastguard Worker         generators.add( valuesGen );
2483*387f9dfdSAndroid Build Coastguard Worker         return generators;
2484*387f9dfdSAndroid Build Coastguard Worker     }
2485*387f9dfdSAndroid Build Coastguard Worker 
2486*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
values(T val1,T val2,T val3,T val4)2487*387f9dfdSAndroid Build Coastguard Worker     CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) {
2488*387f9dfdSAndroid Build Coastguard Worker         CompositeGenerator<T> generators;
2489*387f9dfdSAndroid Build Coastguard Worker         ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
2490*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val1 );
2491*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val2 );
2492*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val3 );
2493*387f9dfdSAndroid Build Coastguard Worker         valuesGen->add( val4 );
2494*387f9dfdSAndroid Build Coastguard Worker         generators.add( valuesGen );
2495*387f9dfdSAndroid Build Coastguard Worker         return generators;
2496*387f9dfdSAndroid Build Coastguard Worker     }
2497*387f9dfdSAndroid Build Coastguard Worker 
2498*387f9dfdSAndroid Build Coastguard Worker } // end namespace Generators
2499*387f9dfdSAndroid Build Coastguard Worker 
2500*387f9dfdSAndroid Build Coastguard Worker using namespace Generators;
2501*387f9dfdSAndroid Build Coastguard Worker 
2502*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2503*387f9dfdSAndroid Build Coastguard Worker 
2504*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_LINESTR2( line ) #line
2505*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line )
2506*387f9dfdSAndroid Build Coastguard Worker 
2507*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" )
2508*387f9dfdSAndroid Build Coastguard Worker 
2509*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_interfaces_exception.h
2510*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
2511*387f9dfdSAndroid Build Coastguard Worker 
2512*387f9dfdSAndroid Build Coastguard Worker #include <string>
2513*387f9dfdSAndroid Build Coastguard Worker #include <vector>
2514*387f9dfdSAndroid Build Coastguard Worker 
2515*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_registry_hub.h
2516*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
2517*387f9dfdSAndroid Build Coastguard Worker 
2518*387f9dfdSAndroid Build Coastguard Worker #include <string>
2519*387f9dfdSAndroid Build Coastguard Worker 
2520*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2521*387f9dfdSAndroid Build Coastguard Worker 
2522*387f9dfdSAndroid Build Coastguard Worker     class TestCase;
2523*387f9dfdSAndroid Build Coastguard Worker     struct ITestCaseRegistry;
2524*387f9dfdSAndroid Build Coastguard Worker     struct IExceptionTranslatorRegistry;
2525*387f9dfdSAndroid Build Coastguard Worker     struct IExceptionTranslator;
2526*387f9dfdSAndroid Build Coastguard Worker     struct IReporterRegistry;
2527*387f9dfdSAndroid Build Coastguard Worker     struct IReporterFactory;
2528*387f9dfdSAndroid Build Coastguard Worker 
2529*387f9dfdSAndroid Build Coastguard Worker     struct IRegistryHub {
2530*387f9dfdSAndroid Build Coastguard Worker         virtual ~IRegistryHub();
2531*387f9dfdSAndroid Build Coastguard Worker 
2532*387f9dfdSAndroid Build Coastguard Worker         virtual IReporterRegistry const& getReporterRegistry() const = 0;
2533*387f9dfdSAndroid Build Coastguard Worker         virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
2534*387f9dfdSAndroid Build Coastguard Worker         virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
2535*387f9dfdSAndroid Build Coastguard Worker     };
2536*387f9dfdSAndroid Build Coastguard Worker 
2537*387f9dfdSAndroid Build Coastguard Worker     struct IMutableRegistryHub {
2538*387f9dfdSAndroid Build Coastguard Worker         virtual ~IMutableRegistryHub();
2539*387f9dfdSAndroid Build Coastguard Worker         virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) = 0;
2540*387f9dfdSAndroid Build Coastguard Worker         virtual void registerListener( Ptr<IReporterFactory> const& factory ) = 0;
2541*387f9dfdSAndroid Build Coastguard Worker         virtual void registerTest( TestCase const& testInfo ) = 0;
2542*387f9dfdSAndroid Build Coastguard Worker         virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
2543*387f9dfdSAndroid Build Coastguard Worker     };
2544*387f9dfdSAndroid Build Coastguard Worker 
2545*387f9dfdSAndroid Build Coastguard Worker     IRegistryHub& getRegistryHub();
2546*387f9dfdSAndroid Build Coastguard Worker     IMutableRegistryHub& getMutableRegistryHub();
2547*387f9dfdSAndroid Build Coastguard Worker     void cleanUp();
2548*387f9dfdSAndroid Build Coastguard Worker     std::string translateActiveException();
2549*387f9dfdSAndroid Build Coastguard Worker 
2550*387f9dfdSAndroid Build Coastguard Worker }
2551*387f9dfdSAndroid Build Coastguard Worker 
2552*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2553*387f9dfdSAndroid Build Coastguard Worker 
2554*387f9dfdSAndroid Build Coastguard Worker     typedef std::string(*exceptionTranslateFunction)();
2555*387f9dfdSAndroid Build Coastguard Worker 
2556*387f9dfdSAndroid Build Coastguard Worker     struct IExceptionTranslator;
2557*387f9dfdSAndroid Build Coastguard Worker     typedef std::vector<const IExceptionTranslator*> ExceptionTranslators;
2558*387f9dfdSAndroid Build Coastguard Worker 
2559*387f9dfdSAndroid Build Coastguard Worker     struct IExceptionTranslator {
2560*387f9dfdSAndroid Build Coastguard Worker         virtual ~IExceptionTranslator();
2561*387f9dfdSAndroid Build Coastguard Worker         virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;
2562*387f9dfdSAndroid Build Coastguard Worker     };
2563*387f9dfdSAndroid Build Coastguard Worker 
2564*387f9dfdSAndroid Build Coastguard Worker     struct IExceptionTranslatorRegistry {
2565*387f9dfdSAndroid Build Coastguard Worker         virtual ~IExceptionTranslatorRegistry();
2566*387f9dfdSAndroid Build Coastguard Worker 
2567*387f9dfdSAndroid Build Coastguard Worker         virtual std::string translateActiveException() const = 0;
2568*387f9dfdSAndroid Build Coastguard Worker     };
2569*387f9dfdSAndroid Build Coastguard Worker 
2570*387f9dfdSAndroid Build Coastguard Worker     class ExceptionTranslatorRegistrar {
2571*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
2572*387f9dfdSAndroid Build Coastguard Worker         class ExceptionTranslator : public IExceptionTranslator {
2573*387f9dfdSAndroid Build Coastguard Worker         public:
2574*387f9dfdSAndroid Build Coastguard Worker 
ExceptionTranslator(std::string (* translateFunction)(T &))2575*387f9dfdSAndroid Build Coastguard Worker             ExceptionTranslator( std::string(*translateFunction)( T& ) )
2576*387f9dfdSAndroid Build Coastguard Worker             : m_translateFunction( translateFunction )
2577*387f9dfdSAndroid Build Coastguard Worker             {}
2578*387f9dfdSAndroid Build Coastguard Worker 
translate(ExceptionTranslators::const_iterator it,ExceptionTranslators::const_iterator itEnd) const2579*387f9dfdSAndroid Build Coastguard Worker             virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE {
2580*387f9dfdSAndroid Build Coastguard Worker                 try {
2581*387f9dfdSAndroid Build Coastguard Worker                     if( it == itEnd )
2582*387f9dfdSAndroid Build Coastguard Worker                         throw;
2583*387f9dfdSAndroid Build Coastguard Worker                     else
2584*387f9dfdSAndroid Build Coastguard Worker                         return (*it)->translate( it+1, itEnd );
2585*387f9dfdSAndroid Build Coastguard Worker                 }
2586*387f9dfdSAndroid Build Coastguard Worker                 catch( T& ex ) {
2587*387f9dfdSAndroid Build Coastguard Worker                     return m_translateFunction( ex );
2588*387f9dfdSAndroid Build Coastguard Worker                 }
2589*387f9dfdSAndroid Build Coastguard Worker             }
2590*387f9dfdSAndroid Build Coastguard Worker 
2591*387f9dfdSAndroid Build Coastguard Worker         protected:
2592*387f9dfdSAndroid Build Coastguard Worker             std::string(*m_translateFunction)( T& );
2593*387f9dfdSAndroid Build Coastguard Worker         };
2594*387f9dfdSAndroid Build Coastguard Worker 
2595*387f9dfdSAndroid Build Coastguard Worker     public:
2596*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
ExceptionTranslatorRegistrar(std::string (* translateFunction)(T &))2597*387f9dfdSAndroid Build Coastguard Worker         ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
2598*387f9dfdSAndroid Build Coastguard Worker             getMutableRegistryHub().registerTranslator
2599*387f9dfdSAndroid Build Coastguard Worker                 ( new ExceptionTranslator<T>( translateFunction ) );
2600*387f9dfdSAndroid Build Coastguard Worker         }
2601*387f9dfdSAndroid Build Coastguard Worker     };
2602*387f9dfdSAndroid Build Coastguard Worker }
2603*387f9dfdSAndroid Build Coastguard Worker 
2604*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2605*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
2606*387f9dfdSAndroid Build Coastguard Worker     static std::string translatorName( signature ); \
2607*387f9dfdSAndroid Build Coastguard Worker     namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\
2608*387f9dfdSAndroid Build Coastguard Worker     static std::string translatorName( signature )
2609*387f9dfdSAndroid Build Coastguard Worker 
2610*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
2611*387f9dfdSAndroid Build Coastguard Worker 
2612*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_approx.hpp
2613*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
2614*387f9dfdSAndroid Build Coastguard Worker 
2615*387f9dfdSAndroid Build Coastguard Worker #include <cmath>
2616*387f9dfdSAndroid Build Coastguard Worker #include <limits>
2617*387f9dfdSAndroid Build Coastguard Worker 
2618*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2619*387f9dfdSAndroid Build Coastguard Worker namespace Detail {
2620*387f9dfdSAndroid Build Coastguard Worker 
2621*387f9dfdSAndroid Build Coastguard Worker     class Approx {
2622*387f9dfdSAndroid Build Coastguard Worker     public:
Approx(double value)2623*387f9dfdSAndroid Build Coastguard Worker         explicit Approx ( double value )
2624*387f9dfdSAndroid Build Coastguard Worker         :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
2625*387f9dfdSAndroid Build Coastguard Worker             m_scale( 1.0 ),
2626*387f9dfdSAndroid Build Coastguard Worker             m_value( value )
2627*387f9dfdSAndroid Build Coastguard Worker         {}
2628*387f9dfdSAndroid Build Coastguard Worker 
Approx(Approx const & other)2629*387f9dfdSAndroid Build Coastguard Worker         Approx( Approx const& other )
2630*387f9dfdSAndroid Build Coastguard Worker         :   m_epsilon( other.m_epsilon ),
2631*387f9dfdSAndroid Build Coastguard Worker             m_scale( other.m_scale ),
2632*387f9dfdSAndroid Build Coastguard Worker             m_value( other.m_value )
2633*387f9dfdSAndroid Build Coastguard Worker         {}
2634*387f9dfdSAndroid Build Coastguard Worker 
custom()2635*387f9dfdSAndroid Build Coastguard Worker         static Approx custom() {
2636*387f9dfdSAndroid Build Coastguard Worker             return Approx( 0 );
2637*387f9dfdSAndroid Build Coastguard Worker         }
2638*387f9dfdSAndroid Build Coastguard Worker 
operator ()(double value)2639*387f9dfdSAndroid Build Coastguard Worker         Approx operator()( double value ) {
2640*387f9dfdSAndroid Build Coastguard Worker             Approx approx( value );
2641*387f9dfdSAndroid Build Coastguard Worker             approx.epsilon( m_epsilon );
2642*387f9dfdSAndroid Build Coastguard Worker             approx.scale( m_scale );
2643*387f9dfdSAndroid Build Coastguard Worker             return approx;
2644*387f9dfdSAndroid Build Coastguard Worker         }
2645*387f9dfdSAndroid Build Coastguard Worker 
operator ==(double lhs,Approx const & rhs)2646*387f9dfdSAndroid Build Coastguard Worker         friend bool operator == ( double lhs, Approx const& rhs ) {
2647*387f9dfdSAndroid Build Coastguard Worker             // Thanks to Richard Harris for his help refining this formula
2648*387f9dfdSAndroid Build Coastguard Worker             return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
2649*387f9dfdSAndroid Build Coastguard Worker         }
2650*387f9dfdSAndroid Build Coastguard Worker 
operator ==(Approx const & lhs,double rhs)2651*387f9dfdSAndroid Build Coastguard Worker         friend bool operator == ( Approx const& lhs, double rhs ) {
2652*387f9dfdSAndroid Build Coastguard Worker             return operator==( rhs, lhs );
2653*387f9dfdSAndroid Build Coastguard Worker         }
2654*387f9dfdSAndroid Build Coastguard Worker 
operator !=(double lhs,Approx const & rhs)2655*387f9dfdSAndroid Build Coastguard Worker         friend bool operator != ( double lhs, Approx const& rhs ) {
2656*387f9dfdSAndroid Build Coastguard Worker             return !operator==( lhs, rhs );
2657*387f9dfdSAndroid Build Coastguard Worker         }
2658*387f9dfdSAndroid Build Coastguard Worker 
operator !=(Approx const & lhs,double rhs)2659*387f9dfdSAndroid Build Coastguard Worker         friend bool operator != ( Approx const& lhs, double rhs ) {
2660*387f9dfdSAndroid Build Coastguard Worker             return !operator==( rhs, lhs );
2661*387f9dfdSAndroid Build Coastguard Worker         }
2662*387f9dfdSAndroid Build Coastguard Worker 
epsilon(double newEpsilon)2663*387f9dfdSAndroid Build Coastguard Worker         Approx& epsilon( double newEpsilon ) {
2664*387f9dfdSAndroid Build Coastguard Worker             m_epsilon = newEpsilon;
2665*387f9dfdSAndroid Build Coastguard Worker             return *this;
2666*387f9dfdSAndroid Build Coastguard Worker         }
2667*387f9dfdSAndroid Build Coastguard Worker 
scale(double newScale)2668*387f9dfdSAndroid Build Coastguard Worker         Approx& scale( double newScale ) {
2669*387f9dfdSAndroid Build Coastguard Worker             m_scale = newScale;
2670*387f9dfdSAndroid Build Coastguard Worker             return *this;
2671*387f9dfdSAndroid Build Coastguard Worker         }
2672*387f9dfdSAndroid Build Coastguard Worker 
toString() const2673*387f9dfdSAndroid Build Coastguard Worker         std::string toString() const {
2674*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
2675*387f9dfdSAndroid Build Coastguard Worker             oss << "Approx( " << Catch::toString( m_value ) << " )";
2676*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
2677*387f9dfdSAndroid Build Coastguard Worker         }
2678*387f9dfdSAndroid Build Coastguard Worker 
2679*387f9dfdSAndroid Build Coastguard Worker     private:
2680*387f9dfdSAndroid Build Coastguard Worker         double m_epsilon;
2681*387f9dfdSAndroid Build Coastguard Worker         double m_scale;
2682*387f9dfdSAndroid Build Coastguard Worker         double m_value;
2683*387f9dfdSAndroid Build Coastguard Worker     };
2684*387f9dfdSAndroid Build Coastguard Worker }
2685*387f9dfdSAndroid Build Coastguard Worker 
2686*387f9dfdSAndroid Build Coastguard Worker template<>
toString(Detail::Approx const & value)2687*387f9dfdSAndroid Build Coastguard Worker inline std::string toString<Detail::Approx>( Detail::Approx const& value ) {
2688*387f9dfdSAndroid Build Coastguard Worker     return value.toString();
2689*387f9dfdSAndroid Build Coastguard Worker }
2690*387f9dfdSAndroid Build Coastguard Worker 
2691*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2692*387f9dfdSAndroid Build Coastguard Worker 
2693*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_interfaces_tag_alias_registry.h
2694*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED
2695*387f9dfdSAndroid Build Coastguard Worker 
2696*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_tag_alias.h
2697*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED
2698*387f9dfdSAndroid Build Coastguard Worker 
2699*387f9dfdSAndroid Build Coastguard Worker #include <string>
2700*387f9dfdSAndroid Build Coastguard Worker 
2701*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2702*387f9dfdSAndroid Build Coastguard Worker 
2703*387f9dfdSAndroid Build Coastguard Worker     struct TagAlias {
TagAliasCatch::TagAlias2704*387f9dfdSAndroid Build Coastguard Worker         TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {}
2705*387f9dfdSAndroid Build Coastguard Worker 
2706*387f9dfdSAndroid Build Coastguard Worker         std::string tag;
2707*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo lineInfo;
2708*387f9dfdSAndroid Build Coastguard Worker     };
2709*387f9dfdSAndroid Build Coastguard Worker 
2710*387f9dfdSAndroid Build Coastguard Worker     struct RegistrarForTagAliases {
2711*387f9dfdSAndroid Build Coastguard Worker         RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
2712*387f9dfdSAndroid Build Coastguard Worker     };
2713*387f9dfdSAndroid Build Coastguard Worker 
2714*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2715*387f9dfdSAndroid Build Coastguard Worker 
2716*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); }
2717*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_option.hpp
2718*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
2719*387f9dfdSAndroid Build Coastguard Worker 
2720*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2721*387f9dfdSAndroid Build Coastguard Worker 
2722*387f9dfdSAndroid Build Coastguard Worker     // An optional type
2723*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
2724*387f9dfdSAndroid Build Coastguard Worker     class Option {
2725*387f9dfdSAndroid Build Coastguard Worker     public:
Option()2726*387f9dfdSAndroid Build Coastguard Worker         Option() : nullableValue( CATCH_NULL ) {}
Option(T const & _value)2727*387f9dfdSAndroid Build Coastguard Worker         Option( T const& _value )
2728*387f9dfdSAndroid Build Coastguard Worker         : nullableValue( new( storage ) T( _value ) )
2729*387f9dfdSAndroid Build Coastguard Worker         {}
Option(Option const & _other)2730*387f9dfdSAndroid Build Coastguard Worker         Option( Option const& _other )
2731*387f9dfdSAndroid Build Coastguard Worker         : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL )
2732*387f9dfdSAndroid Build Coastguard Worker         {}
2733*387f9dfdSAndroid Build Coastguard Worker 
~Option()2734*387f9dfdSAndroid Build Coastguard Worker         ~Option() {
2735*387f9dfdSAndroid Build Coastguard Worker             reset();
2736*387f9dfdSAndroid Build Coastguard Worker         }
2737*387f9dfdSAndroid Build Coastguard Worker 
operator =(Option const & _other)2738*387f9dfdSAndroid Build Coastguard Worker         Option& operator= ( Option const& _other ) {
2739*387f9dfdSAndroid Build Coastguard Worker             if( &_other != this ) {
2740*387f9dfdSAndroid Build Coastguard Worker                 reset();
2741*387f9dfdSAndroid Build Coastguard Worker                 if( _other )
2742*387f9dfdSAndroid Build Coastguard Worker                     nullableValue = new( storage ) T( *_other );
2743*387f9dfdSAndroid Build Coastguard Worker             }
2744*387f9dfdSAndroid Build Coastguard Worker             return *this;
2745*387f9dfdSAndroid Build Coastguard Worker         }
operator =(T const & _value)2746*387f9dfdSAndroid Build Coastguard Worker         Option& operator = ( T const& _value ) {
2747*387f9dfdSAndroid Build Coastguard Worker             reset();
2748*387f9dfdSAndroid Build Coastguard Worker             nullableValue = new( storage ) T( _value );
2749*387f9dfdSAndroid Build Coastguard Worker             return *this;
2750*387f9dfdSAndroid Build Coastguard Worker         }
2751*387f9dfdSAndroid Build Coastguard Worker 
reset()2752*387f9dfdSAndroid Build Coastguard Worker         void reset() {
2753*387f9dfdSAndroid Build Coastguard Worker             if( nullableValue )
2754*387f9dfdSAndroid Build Coastguard Worker                 nullableValue->~T();
2755*387f9dfdSAndroid Build Coastguard Worker             nullableValue = CATCH_NULL;
2756*387f9dfdSAndroid Build Coastguard Worker         }
2757*387f9dfdSAndroid Build Coastguard Worker 
operator *()2758*387f9dfdSAndroid Build Coastguard Worker         T& operator*() { return *nullableValue; }
operator *() const2759*387f9dfdSAndroid Build Coastguard Worker         T const& operator*() const { return *nullableValue; }
operator ->()2760*387f9dfdSAndroid Build Coastguard Worker         T* operator->() { return nullableValue; }
operator ->() const2761*387f9dfdSAndroid Build Coastguard Worker         const T* operator->() const { return nullableValue; }
2762*387f9dfdSAndroid Build Coastguard Worker 
valueOr(T const & defaultValue) const2763*387f9dfdSAndroid Build Coastguard Worker         T valueOr( T const& defaultValue ) const {
2764*387f9dfdSAndroid Build Coastguard Worker             return nullableValue ? *nullableValue : defaultValue;
2765*387f9dfdSAndroid Build Coastguard Worker         }
2766*387f9dfdSAndroid Build Coastguard Worker 
some() const2767*387f9dfdSAndroid Build Coastguard Worker         bool some() const { return nullableValue != CATCH_NULL; }
none() const2768*387f9dfdSAndroid Build Coastguard Worker         bool none() const { return nullableValue == CATCH_NULL; }
2769*387f9dfdSAndroid Build Coastguard Worker 
operator !() const2770*387f9dfdSAndroid Build Coastguard Worker         bool operator !() const { return nullableValue == CATCH_NULL; }
operator SafeBool::type() const2771*387f9dfdSAndroid Build Coastguard Worker         operator SafeBool::type() const {
2772*387f9dfdSAndroid Build Coastguard Worker             return SafeBool::makeSafe( some() );
2773*387f9dfdSAndroid Build Coastguard Worker         }
2774*387f9dfdSAndroid Build Coastguard Worker 
2775*387f9dfdSAndroid Build Coastguard Worker     private:
2776*387f9dfdSAndroid Build Coastguard Worker         T* nullableValue;
2777*387f9dfdSAndroid Build Coastguard Worker         char storage[sizeof(T)];
2778*387f9dfdSAndroid Build Coastguard Worker     };
2779*387f9dfdSAndroid Build Coastguard Worker 
2780*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2781*387f9dfdSAndroid Build Coastguard Worker 
2782*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2783*387f9dfdSAndroid Build Coastguard Worker 
2784*387f9dfdSAndroid Build Coastguard Worker     struct ITagAliasRegistry {
2785*387f9dfdSAndroid Build Coastguard Worker         virtual ~ITagAliasRegistry();
2786*387f9dfdSAndroid Build Coastguard Worker         virtual Option<TagAlias> find( std::string const& alias ) const = 0;
2787*387f9dfdSAndroid Build Coastguard Worker         virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;
2788*387f9dfdSAndroid Build Coastguard Worker 
2789*387f9dfdSAndroid Build Coastguard Worker         static ITagAliasRegistry const& get();
2790*387f9dfdSAndroid Build Coastguard Worker     };
2791*387f9dfdSAndroid Build Coastguard Worker 
2792*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
2793*387f9dfdSAndroid Build Coastguard Worker 
2794*387f9dfdSAndroid Build Coastguard Worker // These files are included here so the single_include script doesn't put them
2795*387f9dfdSAndroid Build Coastguard Worker // in the conditionally compiled sections
2796*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_test_case_info.h
2797*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
2798*387f9dfdSAndroid Build Coastguard Worker 
2799*387f9dfdSAndroid Build Coastguard Worker #include <string>
2800*387f9dfdSAndroid Build Coastguard Worker #include <set>
2801*387f9dfdSAndroid Build Coastguard Worker 
2802*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
2803*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
2804*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wpadded"
2805*387f9dfdSAndroid Build Coastguard Worker #endif
2806*387f9dfdSAndroid Build Coastguard Worker 
2807*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2808*387f9dfdSAndroid Build Coastguard Worker 
2809*387f9dfdSAndroid Build Coastguard Worker     struct ITestCase;
2810*387f9dfdSAndroid Build Coastguard Worker 
2811*387f9dfdSAndroid Build Coastguard Worker     struct TestCaseInfo {
2812*387f9dfdSAndroid Build Coastguard Worker         enum SpecialProperties{
2813*387f9dfdSAndroid Build Coastguard Worker             None = 0,
2814*387f9dfdSAndroid Build Coastguard Worker             IsHidden = 1 << 1,
2815*387f9dfdSAndroid Build Coastguard Worker             ShouldFail = 1 << 2,
2816*387f9dfdSAndroid Build Coastguard Worker             MayFail = 1 << 3,
2817*387f9dfdSAndroid Build Coastguard Worker             Throws = 1 << 4
2818*387f9dfdSAndroid Build Coastguard Worker         };
2819*387f9dfdSAndroid Build Coastguard Worker 
2820*387f9dfdSAndroid Build Coastguard Worker         TestCaseInfo(   std::string const& _name,
2821*387f9dfdSAndroid Build Coastguard Worker                         std::string const& _className,
2822*387f9dfdSAndroid Build Coastguard Worker                         std::string const& _description,
2823*387f9dfdSAndroid Build Coastguard Worker                         std::set<std::string> const& _tags,
2824*387f9dfdSAndroid Build Coastguard Worker                         SourceLineInfo const& _lineInfo );
2825*387f9dfdSAndroid Build Coastguard Worker 
2826*387f9dfdSAndroid Build Coastguard Worker         TestCaseInfo( TestCaseInfo const& other );
2827*387f9dfdSAndroid Build Coastguard Worker 
2828*387f9dfdSAndroid Build Coastguard Worker         friend void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags );
2829*387f9dfdSAndroid Build Coastguard Worker 
2830*387f9dfdSAndroid Build Coastguard Worker         bool isHidden() const;
2831*387f9dfdSAndroid Build Coastguard Worker         bool throws() const;
2832*387f9dfdSAndroid Build Coastguard Worker         bool okToFail() const;
2833*387f9dfdSAndroid Build Coastguard Worker         bool expectedToFail() const;
2834*387f9dfdSAndroid Build Coastguard Worker 
2835*387f9dfdSAndroid Build Coastguard Worker         std::string name;
2836*387f9dfdSAndroid Build Coastguard Worker         std::string className;
2837*387f9dfdSAndroid Build Coastguard Worker         std::string description;
2838*387f9dfdSAndroid Build Coastguard Worker         std::set<std::string> tags;
2839*387f9dfdSAndroid Build Coastguard Worker         std::set<std::string> lcaseTags;
2840*387f9dfdSAndroid Build Coastguard Worker         std::string tagsAsString;
2841*387f9dfdSAndroid Build Coastguard Worker         SourceLineInfo lineInfo;
2842*387f9dfdSAndroid Build Coastguard Worker         SpecialProperties properties;
2843*387f9dfdSAndroid Build Coastguard Worker     };
2844*387f9dfdSAndroid Build Coastguard Worker 
2845*387f9dfdSAndroid Build Coastguard Worker     class TestCase : public TestCaseInfo {
2846*387f9dfdSAndroid Build Coastguard Worker     public:
2847*387f9dfdSAndroid Build Coastguard Worker 
2848*387f9dfdSAndroid Build Coastguard Worker         TestCase( ITestCase* testCase, TestCaseInfo const& info );
2849*387f9dfdSAndroid Build Coastguard Worker         TestCase( TestCase const& other );
2850*387f9dfdSAndroid Build Coastguard Worker 
2851*387f9dfdSAndroid Build Coastguard Worker         TestCase withName( std::string const& _newName ) const;
2852*387f9dfdSAndroid Build Coastguard Worker 
2853*387f9dfdSAndroid Build Coastguard Worker         void invoke() const;
2854*387f9dfdSAndroid Build Coastguard Worker 
2855*387f9dfdSAndroid Build Coastguard Worker         TestCaseInfo const& getTestCaseInfo() const;
2856*387f9dfdSAndroid Build Coastguard Worker 
2857*387f9dfdSAndroid Build Coastguard Worker         void swap( TestCase& other );
2858*387f9dfdSAndroid Build Coastguard Worker         bool operator == ( TestCase const& other ) const;
2859*387f9dfdSAndroid Build Coastguard Worker         bool operator < ( TestCase const& other ) const;
2860*387f9dfdSAndroid Build Coastguard Worker         TestCase& operator = ( TestCase const& other );
2861*387f9dfdSAndroid Build Coastguard Worker 
2862*387f9dfdSAndroid Build Coastguard Worker     private:
2863*387f9dfdSAndroid Build Coastguard Worker         Ptr<ITestCase> test;
2864*387f9dfdSAndroid Build Coastguard Worker     };
2865*387f9dfdSAndroid Build Coastguard Worker 
2866*387f9dfdSAndroid Build Coastguard Worker     TestCase makeTestCase(  ITestCase* testCase,
2867*387f9dfdSAndroid Build Coastguard Worker                             std::string const& className,
2868*387f9dfdSAndroid Build Coastguard Worker                             std::string const& name,
2869*387f9dfdSAndroid Build Coastguard Worker                             std::string const& description,
2870*387f9dfdSAndroid Build Coastguard Worker                             SourceLineInfo const& lineInfo );
2871*387f9dfdSAndroid Build Coastguard Worker }
2872*387f9dfdSAndroid Build Coastguard Worker 
2873*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
2874*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
2875*387f9dfdSAndroid Build Coastguard Worker #endif
2876*387f9dfdSAndroid Build Coastguard Worker 
2877*387f9dfdSAndroid Build Coastguard Worker 
2878*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
2879*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_objc.hpp
2880*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED
2881*387f9dfdSAndroid Build Coastguard Worker 
2882*387f9dfdSAndroid Build Coastguard Worker #import <objc/runtime.h>
2883*387f9dfdSAndroid Build Coastguard Worker 
2884*387f9dfdSAndroid Build Coastguard Worker #include <string>
2885*387f9dfdSAndroid Build Coastguard Worker 
2886*387f9dfdSAndroid Build Coastguard Worker // NB. Any general catch headers included here must be included
2887*387f9dfdSAndroid Build Coastguard Worker // in catch.hpp first to make sure they are included by the single
2888*387f9dfdSAndroid Build Coastguard Worker // header for non obj-usage
2889*387f9dfdSAndroid Build Coastguard Worker 
2890*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2891*387f9dfdSAndroid Build Coastguard Worker // This protocol is really only here for (self) documenting purposes, since
2892*387f9dfdSAndroid Build Coastguard Worker // all its methods are optional.
2893*387f9dfdSAndroid Build Coastguard Worker @protocol OcFixture
2894*387f9dfdSAndroid Build Coastguard Worker 
2895*387f9dfdSAndroid Build Coastguard Worker @optional
2896*387f9dfdSAndroid Build Coastguard Worker 
2897*387f9dfdSAndroid Build Coastguard Worker -(void) setUp;
2898*387f9dfdSAndroid Build Coastguard Worker -(void) tearDown;
2899*387f9dfdSAndroid Build Coastguard Worker 
2900*387f9dfdSAndroid Build Coastguard Worker @end
2901*387f9dfdSAndroid Build Coastguard Worker 
2902*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
2903*387f9dfdSAndroid Build Coastguard Worker 
2904*387f9dfdSAndroid Build Coastguard Worker     class OcMethod : public SharedImpl<ITestCase> {
2905*387f9dfdSAndroid Build Coastguard Worker 
2906*387f9dfdSAndroid Build Coastguard Worker     public:
OcMethod(Class cls,SEL sel)2907*387f9dfdSAndroid Build Coastguard Worker         OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}
2908*387f9dfdSAndroid Build Coastguard Worker 
invoke() const2909*387f9dfdSAndroid Build Coastguard Worker         virtual void invoke() const {
2910*387f9dfdSAndroid Build Coastguard Worker             id obj = [[m_cls alloc] init];
2911*387f9dfdSAndroid Build Coastguard Worker 
2912*387f9dfdSAndroid Build Coastguard Worker             performOptionalSelector( obj, @selector(setUp)  );
2913*387f9dfdSAndroid Build Coastguard Worker             performOptionalSelector( obj, m_sel );
2914*387f9dfdSAndroid Build Coastguard Worker             performOptionalSelector( obj, @selector(tearDown)  );
2915*387f9dfdSAndroid Build Coastguard Worker 
2916*387f9dfdSAndroid Build Coastguard Worker             arcSafeRelease( obj );
2917*387f9dfdSAndroid Build Coastguard Worker         }
2918*387f9dfdSAndroid Build Coastguard Worker     private:
~OcMethod()2919*387f9dfdSAndroid Build Coastguard Worker         virtual ~OcMethod() {}
2920*387f9dfdSAndroid Build Coastguard Worker 
2921*387f9dfdSAndroid Build Coastguard Worker         Class m_cls;
2922*387f9dfdSAndroid Build Coastguard Worker         SEL m_sel;
2923*387f9dfdSAndroid Build Coastguard Worker     };
2924*387f9dfdSAndroid Build Coastguard Worker 
2925*387f9dfdSAndroid Build Coastguard Worker     namespace Detail{
2926*387f9dfdSAndroid Build Coastguard Worker 
getAnnotation(Class cls,std::string const & annotationName,std::string const & testCaseName)2927*387f9dfdSAndroid Build Coastguard Worker         inline std::string getAnnotation(   Class cls,
2928*387f9dfdSAndroid Build Coastguard Worker                                             std::string const& annotationName,
2929*387f9dfdSAndroid Build Coastguard Worker                                             std::string const& testCaseName ) {
2930*387f9dfdSAndroid Build Coastguard Worker             NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
2931*387f9dfdSAndroid Build Coastguard Worker             SEL sel = NSSelectorFromString( selStr );
2932*387f9dfdSAndroid Build Coastguard Worker             arcSafeRelease( selStr );
2933*387f9dfdSAndroid Build Coastguard Worker             id value = performOptionalSelector( cls, sel );
2934*387f9dfdSAndroid Build Coastguard Worker             if( value )
2935*387f9dfdSAndroid Build Coastguard Worker                 return [(NSString*)value UTF8String];
2936*387f9dfdSAndroid Build Coastguard Worker             return "";
2937*387f9dfdSAndroid Build Coastguard Worker         }
2938*387f9dfdSAndroid Build Coastguard Worker     }
2939*387f9dfdSAndroid Build Coastguard Worker 
registerTestMethods()2940*387f9dfdSAndroid Build Coastguard Worker     inline size_t registerTestMethods() {
2941*387f9dfdSAndroid Build Coastguard Worker         size_t noTestMethods = 0;
2942*387f9dfdSAndroid Build Coastguard Worker         int noClasses = objc_getClassList( CATCH_NULL, 0 );
2943*387f9dfdSAndroid Build Coastguard Worker 
2944*387f9dfdSAndroid Build Coastguard Worker         Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);
2945*387f9dfdSAndroid Build Coastguard Worker         objc_getClassList( classes, noClasses );
2946*387f9dfdSAndroid Build Coastguard Worker 
2947*387f9dfdSAndroid Build Coastguard Worker         for( int c = 0; c < noClasses; c++ ) {
2948*387f9dfdSAndroid Build Coastguard Worker             Class cls = classes[c];
2949*387f9dfdSAndroid Build Coastguard Worker             {
2950*387f9dfdSAndroid Build Coastguard Worker                 u_int count;
2951*387f9dfdSAndroid Build Coastguard Worker                 Method* methods = class_copyMethodList( cls, &count );
2952*387f9dfdSAndroid Build Coastguard Worker                 for( u_int m = 0; m < count ; m++ ) {
2953*387f9dfdSAndroid Build Coastguard Worker                     SEL selector = method_getName(methods[m]);
2954*387f9dfdSAndroid Build Coastguard Worker                     std::string methodName = sel_getName(selector);
2955*387f9dfdSAndroid Build Coastguard Worker                     if( startsWith( methodName, "Catch_TestCase_" ) ) {
2956*387f9dfdSAndroid Build Coastguard Worker                         std::string testCaseName = methodName.substr( 15 );
2957*387f9dfdSAndroid Build Coastguard Worker                         std::string name = Detail::getAnnotation( cls, "Name", testCaseName );
2958*387f9dfdSAndroid Build Coastguard Worker                         std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
2959*387f9dfdSAndroid Build Coastguard Worker                         const char* className = class_getName( cls );
2960*387f9dfdSAndroid Build Coastguard Worker 
2961*387f9dfdSAndroid Build Coastguard Worker                         getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
2962*387f9dfdSAndroid Build Coastguard Worker                         noTestMethods++;
2963*387f9dfdSAndroid Build Coastguard Worker                     }
2964*387f9dfdSAndroid Build Coastguard Worker                 }
2965*387f9dfdSAndroid Build Coastguard Worker                 free(methods);
2966*387f9dfdSAndroid Build Coastguard Worker             }
2967*387f9dfdSAndroid Build Coastguard Worker         }
2968*387f9dfdSAndroid Build Coastguard Worker         return noTestMethods;
2969*387f9dfdSAndroid Build Coastguard Worker     }
2970*387f9dfdSAndroid Build Coastguard Worker 
2971*387f9dfdSAndroid Build Coastguard Worker     namespace Matchers {
2972*387f9dfdSAndroid Build Coastguard Worker         namespace Impl {
2973*387f9dfdSAndroid Build Coastguard Worker         namespace NSStringMatchers {
2974*387f9dfdSAndroid Build Coastguard Worker 
2975*387f9dfdSAndroid Build Coastguard Worker             template<typename MatcherT>
2976*387f9dfdSAndroid Build Coastguard Worker             struct StringHolder : MatcherImpl<MatcherT, NSString*>{
StringHolderCatch::Matchers::Impl::NSStringMatchers::StringHolder2977*387f9dfdSAndroid Build Coastguard Worker                 StringHolder( NSString* substr ) : m_substr( [substr copy] ){}
StringHolderCatch::Matchers::Impl::NSStringMatchers::StringHolder2978*387f9dfdSAndroid Build Coastguard Worker                 StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}
StringHolderCatch::Matchers::Impl::NSStringMatchers::StringHolder2979*387f9dfdSAndroid Build Coastguard Worker                 StringHolder() {
2980*387f9dfdSAndroid Build Coastguard Worker                     arcSafeRelease( m_substr );
2981*387f9dfdSAndroid Build Coastguard Worker                 }
2982*387f9dfdSAndroid Build Coastguard Worker 
2983*387f9dfdSAndroid Build Coastguard Worker                 NSString* m_substr;
2984*387f9dfdSAndroid Build Coastguard Worker             };
2985*387f9dfdSAndroid Build Coastguard Worker 
2986*387f9dfdSAndroid Build Coastguard Worker             struct Equals : StringHolder<Equals> {
EqualsCatch::Matchers::Impl::NSStringMatchers::Equals2987*387f9dfdSAndroid Build Coastguard Worker                 Equals( NSString* substr ) : StringHolder( substr ){}
2988*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::NSStringMatchers::Equals2989*387f9dfdSAndroid Build Coastguard Worker                 virtual bool match( ExpressionType const& str ) const {
2990*387f9dfdSAndroid Build Coastguard Worker                     return  (str != nil || m_substr == nil ) &&
2991*387f9dfdSAndroid Build Coastguard Worker                             [str isEqualToString:m_substr];
2992*387f9dfdSAndroid Build Coastguard Worker                 }
2993*387f9dfdSAndroid Build Coastguard Worker 
toStringCatch::Matchers::Impl::NSStringMatchers::Equals2994*387f9dfdSAndroid Build Coastguard Worker                 virtual std::string toString() const {
2995*387f9dfdSAndroid Build Coastguard Worker                     return "equals string: " + Catch::toString( m_substr );
2996*387f9dfdSAndroid Build Coastguard Worker                 }
2997*387f9dfdSAndroid Build Coastguard Worker             };
2998*387f9dfdSAndroid Build Coastguard Worker 
2999*387f9dfdSAndroid Build Coastguard Worker             struct Contains : StringHolder<Contains> {
ContainsCatch::Matchers::Impl::NSStringMatchers::Contains3000*387f9dfdSAndroid Build Coastguard Worker                 Contains( NSString* substr ) : StringHolder( substr ){}
3001*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::NSStringMatchers::Contains3002*387f9dfdSAndroid Build Coastguard Worker                 virtual bool match( ExpressionType const& str ) const {
3003*387f9dfdSAndroid Build Coastguard Worker                     return  (str != nil || m_substr == nil ) &&
3004*387f9dfdSAndroid Build Coastguard Worker                             [str rangeOfString:m_substr].location != NSNotFound;
3005*387f9dfdSAndroid Build Coastguard Worker                 }
3006*387f9dfdSAndroid Build Coastguard Worker 
toStringCatch::Matchers::Impl::NSStringMatchers::Contains3007*387f9dfdSAndroid Build Coastguard Worker                 virtual std::string toString() const {
3008*387f9dfdSAndroid Build Coastguard Worker                     return "contains string: " + Catch::toString( m_substr );
3009*387f9dfdSAndroid Build Coastguard Worker                 }
3010*387f9dfdSAndroid Build Coastguard Worker             };
3011*387f9dfdSAndroid Build Coastguard Worker 
3012*387f9dfdSAndroid Build Coastguard Worker             struct StartsWith : StringHolder<StartsWith> {
StartsWithCatch::Matchers::Impl::NSStringMatchers::StartsWith3013*387f9dfdSAndroid Build Coastguard Worker                 StartsWith( NSString* substr ) : StringHolder( substr ){}
3014*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::NSStringMatchers::StartsWith3015*387f9dfdSAndroid Build Coastguard Worker                 virtual bool match( ExpressionType const& str ) const {
3016*387f9dfdSAndroid Build Coastguard Worker                     return  (str != nil || m_substr == nil ) &&
3017*387f9dfdSAndroid Build Coastguard Worker                             [str rangeOfString:m_substr].location == 0;
3018*387f9dfdSAndroid Build Coastguard Worker                 }
3019*387f9dfdSAndroid Build Coastguard Worker 
toStringCatch::Matchers::Impl::NSStringMatchers::StartsWith3020*387f9dfdSAndroid Build Coastguard Worker                 virtual std::string toString() const {
3021*387f9dfdSAndroid Build Coastguard Worker                     return "starts with: " + Catch::toString( m_substr );
3022*387f9dfdSAndroid Build Coastguard Worker                 }
3023*387f9dfdSAndroid Build Coastguard Worker             };
3024*387f9dfdSAndroid Build Coastguard Worker             struct EndsWith : StringHolder<EndsWith> {
EndsWithCatch::Matchers::Impl::NSStringMatchers::EndsWith3025*387f9dfdSAndroid Build Coastguard Worker                 EndsWith( NSString* substr ) : StringHolder( substr ){}
3026*387f9dfdSAndroid Build Coastguard Worker 
matchCatch::Matchers::Impl::NSStringMatchers::EndsWith3027*387f9dfdSAndroid Build Coastguard Worker                 virtual bool match( ExpressionType const& str ) const {
3028*387f9dfdSAndroid Build Coastguard Worker                     return  (str != nil || m_substr == nil ) &&
3029*387f9dfdSAndroid Build Coastguard Worker                             [str rangeOfString:m_substr].location == [str length] - [m_substr length];
3030*387f9dfdSAndroid Build Coastguard Worker                 }
3031*387f9dfdSAndroid Build Coastguard Worker 
toStringCatch::Matchers::Impl::NSStringMatchers::EndsWith3032*387f9dfdSAndroid Build Coastguard Worker                 virtual std::string toString() const {
3033*387f9dfdSAndroid Build Coastguard Worker                     return "ends with: " + Catch::toString( m_substr );
3034*387f9dfdSAndroid Build Coastguard Worker                 }
3035*387f9dfdSAndroid Build Coastguard Worker             };
3036*387f9dfdSAndroid Build Coastguard Worker 
3037*387f9dfdSAndroid Build Coastguard Worker         } // namespace NSStringMatchers
3038*387f9dfdSAndroid Build Coastguard Worker         } // namespace Impl
3039*387f9dfdSAndroid Build Coastguard Worker 
3040*387f9dfdSAndroid Build Coastguard Worker         inline Impl::NSStringMatchers::Equals
Equals(NSString * substr)3041*387f9dfdSAndroid Build Coastguard Worker             Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }
3042*387f9dfdSAndroid Build Coastguard Worker 
3043*387f9dfdSAndroid Build Coastguard Worker         inline Impl::NSStringMatchers::Contains
Contains(NSString * substr)3044*387f9dfdSAndroid Build Coastguard Worker             Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }
3045*387f9dfdSAndroid Build Coastguard Worker 
3046*387f9dfdSAndroid Build Coastguard Worker         inline Impl::NSStringMatchers::StartsWith
StartsWith(NSString * substr)3047*387f9dfdSAndroid Build Coastguard Worker             StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }
3048*387f9dfdSAndroid Build Coastguard Worker 
3049*387f9dfdSAndroid Build Coastguard Worker         inline Impl::NSStringMatchers::EndsWith
EndsWith(NSString * substr)3050*387f9dfdSAndroid Build Coastguard Worker             EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }
3051*387f9dfdSAndroid Build Coastguard Worker 
3052*387f9dfdSAndroid Build Coastguard Worker     } // namespace Matchers
3053*387f9dfdSAndroid Build Coastguard Worker 
3054*387f9dfdSAndroid Build Coastguard Worker     using namespace Matchers;
3055*387f9dfdSAndroid Build Coastguard Worker 
3056*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
3057*387f9dfdSAndroid Build Coastguard Worker 
3058*387f9dfdSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
3059*387f9dfdSAndroid Build Coastguard Worker #define OC_TEST_CASE( name, desc )\
3060*387f9dfdSAndroid Build Coastguard Worker +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \
3061*387f9dfdSAndroid Build Coastguard Worker {\
3062*387f9dfdSAndroid Build Coastguard Worker return @ name; \
3063*387f9dfdSAndroid Build Coastguard Worker }\
3064*387f9dfdSAndroid Build Coastguard Worker +(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \
3065*387f9dfdSAndroid Build Coastguard Worker { \
3066*387f9dfdSAndroid Build Coastguard Worker return @ desc; \
3067*387f9dfdSAndroid Build Coastguard Worker } \
3068*387f9dfdSAndroid Build Coastguard Worker -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test )
3069*387f9dfdSAndroid Build Coastguard Worker 
3070*387f9dfdSAndroid Build Coastguard Worker #endif
3071*387f9dfdSAndroid Build Coastguard Worker 
3072*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_IMPL
3073*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_impl.hpp
3074*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED
3075*387f9dfdSAndroid Build Coastguard Worker 
3076*387f9dfdSAndroid Build Coastguard Worker // Collect all the implementation files together here
3077*387f9dfdSAndroid Build Coastguard Worker // These are the equivalent of what would usually be cpp files
3078*387f9dfdSAndroid Build Coastguard Worker 
3079*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3080*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
3081*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wweak-vtables"
3082*387f9dfdSAndroid Build Coastguard Worker #endif
3083*387f9dfdSAndroid Build Coastguard Worker 
3084*387f9dfdSAndroid Build Coastguard Worker // #included from: ../catch_session.hpp
3085*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED
3086*387f9dfdSAndroid Build Coastguard Worker 
3087*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_commandline.hpp
3088*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
3089*387f9dfdSAndroid Build Coastguard Worker 
3090*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_config.hpp
3091*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED
3092*387f9dfdSAndroid Build Coastguard Worker 
3093*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_test_spec_parser.hpp
3094*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
3095*387f9dfdSAndroid Build Coastguard Worker 
3096*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3097*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
3098*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wpadded"
3099*387f9dfdSAndroid Build Coastguard Worker #endif
3100*387f9dfdSAndroid Build Coastguard Worker 
3101*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_test_spec.hpp
3102*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED
3103*387f9dfdSAndroid Build Coastguard Worker 
3104*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3105*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
3106*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wpadded"
3107*387f9dfdSAndroid Build Coastguard Worker #endif
3108*387f9dfdSAndroid Build Coastguard Worker 
3109*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_wildcard_pattern.hpp
3110*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED
3111*387f9dfdSAndroid Build Coastguard Worker 
3112*387f9dfdSAndroid Build Coastguard Worker namespace Catch
3113*387f9dfdSAndroid Build Coastguard Worker {
3114*387f9dfdSAndroid Build Coastguard Worker     class WildcardPattern {
3115*387f9dfdSAndroid Build Coastguard Worker         enum WildcardPosition {
3116*387f9dfdSAndroid Build Coastguard Worker             NoWildcard = 0,
3117*387f9dfdSAndroid Build Coastguard Worker             WildcardAtStart = 1,
3118*387f9dfdSAndroid Build Coastguard Worker             WildcardAtEnd = 2,
3119*387f9dfdSAndroid Build Coastguard Worker             WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
3120*387f9dfdSAndroid Build Coastguard Worker         };
3121*387f9dfdSAndroid Build Coastguard Worker 
3122*387f9dfdSAndroid Build Coastguard Worker     public:
3123*387f9dfdSAndroid Build Coastguard Worker 
WildcardPattern(std::string const & pattern,CaseSensitive::Choice caseSensitivity)3124*387f9dfdSAndroid Build Coastguard Worker         WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity )
3125*387f9dfdSAndroid Build Coastguard Worker         :   m_caseSensitivity( caseSensitivity ),
3126*387f9dfdSAndroid Build Coastguard Worker             m_wildcard( NoWildcard ),
3127*387f9dfdSAndroid Build Coastguard Worker             m_pattern( adjustCase( pattern ) )
3128*387f9dfdSAndroid Build Coastguard Worker         {
3129*387f9dfdSAndroid Build Coastguard Worker             if( startsWith( m_pattern, "*" ) ) {
3130*387f9dfdSAndroid Build Coastguard Worker                 m_pattern = m_pattern.substr( 1 );
3131*387f9dfdSAndroid Build Coastguard Worker                 m_wildcard = WildcardAtStart;
3132*387f9dfdSAndroid Build Coastguard Worker             }
3133*387f9dfdSAndroid Build Coastguard Worker             if( endsWith( m_pattern, "*" ) ) {
3134*387f9dfdSAndroid Build Coastguard Worker                 m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );
3135*387f9dfdSAndroid Build Coastguard Worker                 m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );
3136*387f9dfdSAndroid Build Coastguard Worker             }
3137*387f9dfdSAndroid Build Coastguard Worker         }
3138*387f9dfdSAndroid Build Coastguard Worker         virtual ~WildcardPattern();
matches(std::string const & str) const3139*387f9dfdSAndroid Build Coastguard Worker         virtual bool matches( std::string const& str ) const {
3140*387f9dfdSAndroid Build Coastguard Worker             switch( m_wildcard ) {
3141*387f9dfdSAndroid Build Coastguard Worker                 case NoWildcard:
3142*387f9dfdSAndroid Build Coastguard Worker                     return m_pattern == adjustCase( str );
3143*387f9dfdSAndroid Build Coastguard Worker                 case WildcardAtStart:
3144*387f9dfdSAndroid Build Coastguard Worker                     return endsWith( adjustCase( str ), m_pattern );
3145*387f9dfdSAndroid Build Coastguard Worker                 case WildcardAtEnd:
3146*387f9dfdSAndroid Build Coastguard Worker                     return startsWith( adjustCase( str ), m_pattern );
3147*387f9dfdSAndroid Build Coastguard Worker                 case WildcardAtBothEnds:
3148*387f9dfdSAndroid Build Coastguard Worker                     return contains( adjustCase( str ), m_pattern );
3149*387f9dfdSAndroid Build Coastguard Worker             }
3150*387f9dfdSAndroid Build Coastguard Worker 
3151*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3152*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
3153*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunreachable-code"
3154*387f9dfdSAndroid Build Coastguard Worker #endif
3155*387f9dfdSAndroid Build Coastguard Worker             throw std::logic_error( "Unknown enum" );
3156*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3157*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
3158*387f9dfdSAndroid Build Coastguard Worker #endif
3159*387f9dfdSAndroid Build Coastguard Worker         }
3160*387f9dfdSAndroid Build Coastguard Worker     private:
adjustCase(std::string const & str) const3161*387f9dfdSAndroid Build Coastguard Worker         std::string adjustCase( std::string const& str ) const {
3162*387f9dfdSAndroid Build Coastguard Worker             return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;
3163*387f9dfdSAndroid Build Coastguard Worker         }
3164*387f9dfdSAndroid Build Coastguard Worker         CaseSensitive::Choice m_caseSensitivity;
3165*387f9dfdSAndroid Build Coastguard Worker         WildcardPosition m_wildcard;
3166*387f9dfdSAndroid Build Coastguard Worker         std::string m_pattern;
3167*387f9dfdSAndroid Build Coastguard Worker     };
3168*387f9dfdSAndroid Build Coastguard Worker }
3169*387f9dfdSAndroid Build Coastguard Worker 
3170*387f9dfdSAndroid Build Coastguard Worker #include <string>
3171*387f9dfdSAndroid Build Coastguard Worker #include <vector>
3172*387f9dfdSAndroid Build Coastguard Worker 
3173*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3174*387f9dfdSAndroid Build Coastguard Worker 
3175*387f9dfdSAndroid Build Coastguard Worker     class TestSpec {
3176*387f9dfdSAndroid Build Coastguard Worker         struct Pattern : SharedImpl<> {
3177*387f9dfdSAndroid Build Coastguard Worker             virtual ~Pattern();
3178*387f9dfdSAndroid Build Coastguard Worker             virtual bool matches( TestCaseInfo const& testCase ) const = 0;
3179*387f9dfdSAndroid Build Coastguard Worker         };
3180*387f9dfdSAndroid Build Coastguard Worker         class NamePattern : public Pattern {
3181*387f9dfdSAndroid Build Coastguard Worker         public:
NamePattern(std::string const & name)3182*387f9dfdSAndroid Build Coastguard Worker             NamePattern( std::string const& name )
3183*387f9dfdSAndroid Build Coastguard Worker             : m_wildcardPattern( toLower( name ), CaseSensitive::No )
3184*387f9dfdSAndroid Build Coastguard Worker             {}
3185*387f9dfdSAndroid Build Coastguard Worker             virtual ~NamePattern();
matches(TestCaseInfo const & testCase) const3186*387f9dfdSAndroid Build Coastguard Worker             virtual bool matches( TestCaseInfo const& testCase ) const {
3187*387f9dfdSAndroid Build Coastguard Worker                 return m_wildcardPattern.matches( toLower( testCase.name ) );
3188*387f9dfdSAndroid Build Coastguard Worker             }
3189*387f9dfdSAndroid Build Coastguard Worker         private:
3190*387f9dfdSAndroid Build Coastguard Worker             WildcardPattern m_wildcardPattern;
3191*387f9dfdSAndroid Build Coastguard Worker         };
3192*387f9dfdSAndroid Build Coastguard Worker 
3193*387f9dfdSAndroid Build Coastguard Worker         class TagPattern : public Pattern {
3194*387f9dfdSAndroid Build Coastguard Worker         public:
TagPattern(std::string const & tag)3195*387f9dfdSAndroid Build Coastguard Worker             TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {}
3196*387f9dfdSAndroid Build Coastguard Worker             virtual ~TagPattern();
matches(TestCaseInfo const & testCase) const3197*387f9dfdSAndroid Build Coastguard Worker             virtual bool matches( TestCaseInfo const& testCase ) const {
3198*387f9dfdSAndroid Build Coastguard Worker                 return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end();
3199*387f9dfdSAndroid Build Coastguard Worker             }
3200*387f9dfdSAndroid Build Coastguard Worker         private:
3201*387f9dfdSAndroid Build Coastguard Worker             std::string m_tag;
3202*387f9dfdSAndroid Build Coastguard Worker         };
3203*387f9dfdSAndroid Build Coastguard Worker 
3204*387f9dfdSAndroid Build Coastguard Worker         class ExcludedPattern : public Pattern {
3205*387f9dfdSAndroid Build Coastguard Worker         public:
ExcludedPattern(Ptr<Pattern> const & underlyingPattern)3206*387f9dfdSAndroid Build Coastguard Worker             ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {}
3207*387f9dfdSAndroid Build Coastguard Worker             virtual ~ExcludedPattern();
matches(TestCaseInfo const & testCase) const3208*387f9dfdSAndroid Build Coastguard Worker             virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); }
3209*387f9dfdSAndroid Build Coastguard Worker         private:
3210*387f9dfdSAndroid Build Coastguard Worker             Ptr<Pattern> m_underlyingPattern;
3211*387f9dfdSAndroid Build Coastguard Worker         };
3212*387f9dfdSAndroid Build Coastguard Worker 
3213*387f9dfdSAndroid Build Coastguard Worker         struct Filter {
3214*387f9dfdSAndroid Build Coastguard Worker             std::vector<Ptr<Pattern> > m_patterns;
3215*387f9dfdSAndroid Build Coastguard Worker 
matchesCatch::TestSpec::Filter3216*387f9dfdSAndroid Build Coastguard Worker             bool matches( TestCaseInfo const& testCase ) const {
3217*387f9dfdSAndroid Build Coastguard Worker                 // All patterns in a filter must match for the filter to be a match
3218*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it )
3219*387f9dfdSAndroid Build Coastguard Worker                     if( !(*it)->matches( testCase ) )
3220*387f9dfdSAndroid Build Coastguard Worker                         return false;
3221*387f9dfdSAndroid Build Coastguard Worker                     return true;
3222*387f9dfdSAndroid Build Coastguard Worker             }
3223*387f9dfdSAndroid Build Coastguard Worker         };
3224*387f9dfdSAndroid Build Coastguard Worker 
3225*387f9dfdSAndroid Build Coastguard Worker     public:
hasFilters() const3226*387f9dfdSAndroid Build Coastguard Worker         bool hasFilters() const {
3227*387f9dfdSAndroid Build Coastguard Worker             return !m_filters.empty();
3228*387f9dfdSAndroid Build Coastguard Worker         }
matches(TestCaseInfo const & testCase) const3229*387f9dfdSAndroid Build Coastguard Worker         bool matches( TestCaseInfo const& testCase ) const {
3230*387f9dfdSAndroid Build Coastguard Worker             // A TestSpec matches if any filter matches
3231*387f9dfdSAndroid Build Coastguard Worker             for( std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it )
3232*387f9dfdSAndroid Build Coastguard Worker                 if( it->matches( testCase ) )
3233*387f9dfdSAndroid Build Coastguard Worker                     return true;
3234*387f9dfdSAndroid Build Coastguard Worker             return false;
3235*387f9dfdSAndroid Build Coastguard Worker         }
3236*387f9dfdSAndroid Build Coastguard Worker 
3237*387f9dfdSAndroid Build Coastguard Worker     private:
3238*387f9dfdSAndroid Build Coastguard Worker         std::vector<Filter> m_filters;
3239*387f9dfdSAndroid Build Coastguard Worker 
3240*387f9dfdSAndroid Build Coastguard Worker         friend class TestSpecParser;
3241*387f9dfdSAndroid Build Coastguard Worker     };
3242*387f9dfdSAndroid Build Coastguard Worker }
3243*387f9dfdSAndroid Build Coastguard Worker 
3244*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3245*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
3246*387f9dfdSAndroid Build Coastguard Worker #endif
3247*387f9dfdSAndroid Build Coastguard Worker 
3248*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3249*387f9dfdSAndroid Build Coastguard Worker 
3250*387f9dfdSAndroid Build Coastguard Worker     class TestSpecParser {
3251*387f9dfdSAndroid Build Coastguard Worker         enum Mode{ None, Name, QuotedName, Tag };
3252*387f9dfdSAndroid Build Coastguard Worker         Mode m_mode;
3253*387f9dfdSAndroid Build Coastguard Worker         bool m_exclusion;
3254*387f9dfdSAndroid Build Coastguard Worker         std::size_t m_start, m_pos;
3255*387f9dfdSAndroid Build Coastguard Worker         std::string m_arg;
3256*387f9dfdSAndroid Build Coastguard Worker         TestSpec::Filter m_currentFilter;
3257*387f9dfdSAndroid Build Coastguard Worker         TestSpec m_testSpec;
3258*387f9dfdSAndroid Build Coastguard Worker         ITagAliasRegistry const* m_tagAliases;
3259*387f9dfdSAndroid Build Coastguard Worker 
3260*387f9dfdSAndroid Build Coastguard Worker     public:
TestSpecParser(ITagAliasRegistry const & tagAliases)3261*387f9dfdSAndroid Build Coastguard Worker         TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
3262*387f9dfdSAndroid Build Coastguard Worker 
parse(std::string const & arg)3263*387f9dfdSAndroid Build Coastguard Worker         TestSpecParser& parse( std::string const& arg ) {
3264*387f9dfdSAndroid Build Coastguard Worker             m_mode = None;
3265*387f9dfdSAndroid Build Coastguard Worker             m_exclusion = false;
3266*387f9dfdSAndroid Build Coastguard Worker             m_start = std::string::npos;
3267*387f9dfdSAndroid Build Coastguard Worker             m_arg = m_tagAliases->expandAliases( arg );
3268*387f9dfdSAndroid Build Coastguard Worker             for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )
3269*387f9dfdSAndroid Build Coastguard Worker                 visitChar( m_arg[m_pos] );
3270*387f9dfdSAndroid Build Coastguard Worker             if( m_mode == Name )
3271*387f9dfdSAndroid Build Coastguard Worker                 addPattern<TestSpec::NamePattern>();
3272*387f9dfdSAndroid Build Coastguard Worker             return *this;
3273*387f9dfdSAndroid Build Coastguard Worker         }
testSpec()3274*387f9dfdSAndroid Build Coastguard Worker         TestSpec testSpec() {
3275*387f9dfdSAndroid Build Coastguard Worker             addFilter();
3276*387f9dfdSAndroid Build Coastguard Worker             return m_testSpec;
3277*387f9dfdSAndroid Build Coastguard Worker         }
3278*387f9dfdSAndroid Build Coastguard Worker     private:
visitChar(char c)3279*387f9dfdSAndroid Build Coastguard Worker         void visitChar( char c ) {
3280*387f9dfdSAndroid Build Coastguard Worker             if( m_mode == None ) {
3281*387f9dfdSAndroid Build Coastguard Worker                 switch( c ) {
3282*387f9dfdSAndroid Build Coastguard Worker                 case ' ': return;
3283*387f9dfdSAndroid Build Coastguard Worker                 case '~': m_exclusion = true; return;
3284*387f9dfdSAndroid Build Coastguard Worker                 case '[': return startNewMode( Tag, ++m_pos );
3285*387f9dfdSAndroid Build Coastguard Worker                 case '"': return startNewMode( QuotedName, ++m_pos );
3286*387f9dfdSAndroid Build Coastguard Worker                 default: startNewMode( Name, m_pos ); break;
3287*387f9dfdSAndroid Build Coastguard Worker                 }
3288*387f9dfdSAndroid Build Coastguard Worker             }
3289*387f9dfdSAndroid Build Coastguard Worker             if( m_mode == Name ) {
3290*387f9dfdSAndroid Build Coastguard Worker                 if( c == ',' ) {
3291*387f9dfdSAndroid Build Coastguard Worker                     addPattern<TestSpec::NamePattern>();
3292*387f9dfdSAndroid Build Coastguard Worker                     addFilter();
3293*387f9dfdSAndroid Build Coastguard Worker                 }
3294*387f9dfdSAndroid Build Coastguard Worker                 else if( c == '[' ) {
3295*387f9dfdSAndroid Build Coastguard Worker                     if( subString() == "exclude:" )
3296*387f9dfdSAndroid Build Coastguard Worker                         m_exclusion = true;
3297*387f9dfdSAndroid Build Coastguard Worker                     else
3298*387f9dfdSAndroid Build Coastguard Worker                         addPattern<TestSpec::NamePattern>();
3299*387f9dfdSAndroid Build Coastguard Worker                     startNewMode( Tag, ++m_pos );
3300*387f9dfdSAndroid Build Coastguard Worker                 }
3301*387f9dfdSAndroid Build Coastguard Worker             }
3302*387f9dfdSAndroid Build Coastguard Worker             else if( m_mode == QuotedName && c == '"' )
3303*387f9dfdSAndroid Build Coastguard Worker                 addPattern<TestSpec::NamePattern>();
3304*387f9dfdSAndroid Build Coastguard Worker             else if( m_mode == Tag && c == ']' )
3305*387f9dfdSAndroid Build Coastguard Worker                 addPattern<TestSpec::TagPattern>();
3306*387f9dfdSAndroid Build Coastguard Worker         }
startNewMode(Mode mode,std::size_t start)3307*387f9dfdSAndroid Build Coastguard Worker         void startNewMode( Mode mode, std::size_t start ) {
3308*387f9dfdSAndroid Build Coastguard Worker             m_mode = mode;
3309*387f9dfdSAndroid Build Coastguard Worker             m_start = start;
3310*387f9dfdSAndroid Build Coastguard Worker         }
subString() const3311*387f9dfdSAndroid Build Coastguard Worker         std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); }
3312*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
addPattern()3313*387f9dfdSAndroid Build Coastguard Worker         void addPattern() {
3314*387f9dfdSAndroid Build Coastguard Worker             std::string token = subString();
3315*387f9dfdSAndroid Build Coastguard Worker             if( startsWith( token, "exclude:" ) ) {
3316*387f9dfdSAndroid Build Coastguard Worker                 m_exclusion = true;
3317*387f9dfdSAndroid Build Coastguard Worker                 token = token.substr( 8 );
3318*387f9dfdSAndroid Build Coastguard Worker             }
3319*387f9dfdSAndroid Build Coastguard Worker             if( !token.empty() ) {
3320*387f9dfdSAndroid Build Coastguard Worker                 Ptr<TestSpec::Pattern> pattern = new T( token );
3321*387f9dfdSAndroid Build Coastguard Worker                 if( m_exclusion )
3322*387f9dfdSAndroid Build Coastguard Worker                     pattern = new TestSpec::ExcludedPattern( pattern );
3323*387f9dfdSAndroid Build Coastguard Worker                 m_currentFilter.m_patterns.push_back( pattern );
3324*387f9dfdSAndroid Build Coastguard Worker             }
3325*387f9dfdSAndroid Build Coastguard Worker             m_exclusion = false;
3326*387f9dfdSAndroid Build Coastguard Worker             m_mode = None;
3327*387f9dfdSAndroid Build Coastguard Worker         }
addFilter()3328*387f9dfdSAndroid Build Coastguard Worker         void addFilter() {
3329*387f9dfdSAndroid Build Coastguard Worker             if( !m_currentFilter.m_patterns.empty() ) {
3330*387f9dfdSAndroid Build Coastguard Worker                 m_testSpec.m_filters.push_back( m_currentFilter );
3331*387f9dfdSAndroid Build Coastguard Worker                 m_currentFilter = TestSpec::Filter();
3332*387f9dfdSAndroid Build Coastguard Worker             }
3333*387f9dfdSAndroid Build Coastguard Worker         }
3334*387f9dfdSAndroid Build Coastguard Worker     };
parseTestSpec(std::string const & arg)3335*387f9dfdSAndroid Build Coastguard Worker     inline TestSpec parseTestSpec( std::string const& arg ) {
3336*387f9dfdSAndroid Build Coastguard Worker         return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();
3337*387f9dfdSAndroid Build Coastguard Worker     }
3338*387f9dfdSAndroid Build Coastguard Worker 
3339*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
3340*387f9dfdSAndroid Build Coastguard Worker 
3341*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3342*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
3343*387f9dfdSAndroid Build Coastguard Worker #endif
3344*387f9dfdSAndroid Build Coastguard Worker 
3345*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_config.h
3346*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
3347*387f9dfdSAndroid Build Coastguard Worker 
3348*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
3349*387f9dfdSAndroid Build Coastguard Worker #include <string>
3350*387f9dfdSAndroid Build Coastguard Worker #include <vector>
3351*387f9dfdSAndroid Build Coastguard Worker 
3352*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3353*387f9dfdSAndroid Build Coastguard Worker 
3354*387f9dfdSAndroid Build Coastguard Worker     struct Verbosity { enum Level {
3355*387f9dfdSAndroid Build Coastguard Worker         NoOutput = 0,
3356*387f9dfdSAndroid Build Coastguard Worker         Quiet,
3357*387f9dfdSAndroid Build Coastguard Worker         Normal
3358*387f9dfdSAndroid Build Coastguard Worker     }; };
3359*387f9dfdSAndroid Build Coastguard Worker 
3360*387f9dfdSAndroid Build Coastguard Worker     struct WarnAbout { enum What {
3361*387f9dfdSAndroid Build Coastguard Worker         Nothing = 0x00,
3362*387f9dfdSAndroid Build Coastguard Worker         NoAssertions = 0x01
3363*387f9dfdSAndroid Build Coastguard Worker     }; };
3364*387f9dfdSAndroid Build Coastguard Worker 
3365*387f9dfdSAndroid Build Coastguard Worker     struct ShowDurations { enum OrNot {
3366*387f9dfdSAndroid Build Coastguard Worker         DefaultForReporter,
3367*387f9dfdSAndroid Build Coastguard Worker         Always,
3368*387f9dfdSAndroid Build Coastguard Worker         Never
3369*387f9dfdSAndroid Build Coastguard Worker     }; };
3370*387f9dfdSAndroid Build Coastguard Worker     struct RunTests { enum InWhatOrder {
3371*387f9dfdSAndroid Build Coastguard Worker         InDeclarationOrder,
3372*387f9dfdSAndroid Build Coastguard Worker         InLexicographicalOrder,
3373*387f9dfdSAndroid Build Coastguard Worker         InRandomOrder
3374*387f9dfdSAndroid Build Coastguard Worker     }; };
3375*387f9dfdSAndroid Build Coastguard Worker     struct UseColour { enum YesOrNo {
3376*387f9dfdSAndroid Build Coastguard Worker         Auto,
3377*387f9dfdSAndroid Build Coastguard Worker         Yes,
3378*387f9dfdSAndroid Build Coastguard Worker         No
3379*387f9dfdSAndroid Build Coastguard Worker     }; };
3380*387f9dfdSAndroid Build Coastguard Worker 
3381*387f9dfdSAndroid Build Coastguard Worker     class TestSpec;
3382*387f9dfdSAndroid Build Coastguard Worker 
3383*387f9dfdSAndroid Build Coastguard Worker     struct IConfig : IShared {
3384*387f9dfdSAndroid Build Coastguard Worker 
3385*387f9dfdSAndroid Build Coastguard Worker         virtual ~IConfig();
3386*387f9dfdSAndroid Build Coastguard Worker 
3387*387f9dfdSAndroid Build Coastguard Worker         virtual bool allowThrows() const = 0;
3388*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const = 0;
3389*387f9dfdSAndroid Build Coastguard Worker         virtual std::string name() const = 0;
3390*387f9dfdSAndroid Build Coastguard Worker         virtual bool includeSuccessfulResults() const = 0;
3391*387f9dfdSAndroid Build Coastguard Worker         virtual bool shouldDebugBreak() const = 0;
3392*387f9dfdSAndroid Build Coastguard Worker         virtual bool warnAboutMissingAssertions() const = 0;
3393*387f9dfdSAndroid Build Coastguard Worker         virtual int abortAfter() const = 0;
3394*387f9dfdSAndroid Build Coastguard Worker         virtual bool showInvisibles() const = 0;
3395*387f9dfdSAndroid Build Coastguard Worker         virtual ShowDurations::OrNot showDurations() const = 0;
3396*387f9dfdSAndroid Build Coastguard Worker         virtual TestSpec const& testSpec() const = 0;
3397*387f9dfdSAndroid Build Coastguard Worker         virtual RunTests::InWhatOrder runOrder() const = 0;
3398*387f9dfdSAndroid Build Coastguard Worker         virtual unsigned int rngSeed() const = 0;
3399*387f9dfdSAndroid Build Coastguard Worker         virtual UseColour::YesOrNo useColour() const = 0;
3400*387f9dfdSAndroid Build Coastguard Worker     };
3401*387f9dfdSAndroid Build Coastguard Worker }
3402*387f9dfdSAndroid Build Coastguard Worker 
3403*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_stream.h
3404*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
3405*387f9dfdSAndroid Build Coastguard Worker 
3406*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_streambuf.h
3407*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
3408*387f9dfdSAndroid Build Coastguard Worker 
3409*387f9dfdSAndroid Build Coastguard Worker #include <streambuf>
3410*387f9dfdSAndroid Build Coastguard Worker 
3411*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3412*387f9dfdSAndroid Build Coastguard Worker 
3413*387f9dfdSAndroid Build Coastguard Worker     class StreamBufBase : public std::streambuf {
3414*387f9dfdSAndroid Build Coastguard Worker     public:
3415*387f9dfdSAndroid Build Coastguard Worker         virtual ~StreamBufBase() CATCH_NOEXCEPT;
3416*387f9dfdSAndroid Build Coastguard Worker     };
3417*387f9dfdSAndroid Build Coastguard Worker }
3418*387f9dfdSAndroid Build Coastguard Worker 
3419*387f9dfdSAndroid Build Coastguard Worker #include <streambuf>
3420*387f9dfdSAndroid Build Coastguard Worker #include <ostream>
3421*387f9dfdSAndroid Build Coastguard Worker #include <fstream>
3422*387f9dfdSAndroid Build Coastguard Worker 
3423*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3424*387f9dfdSAndroid Build Coastguard Worker 
3425*387f9dfdSAndroid Build Coastguard Worker     std::ostream& cout();
3426*387f9dfdSAndroid Build Coastguard Worker     std::ostream& cerr();
3427*387f9dfdSAndroid Build Coastguard Worker 
3428*387f9dfdSAndroid Build Coastguard Worker     struct IStream {
3429*387f9dfdSAndroid Build Coastguard Worker         virtual ~IStream() CATCH_NOEXCEPT;
3430*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const = 0;
3431*387f9dfdSAndroid Build Coastguard Worker     };
3432*387f9dfdSAndroid Build Coastguard Worker 
3433*387f9dfdSAndroid Build Coastguard Worker     class FileStream : public IStream {
3434*387f9dfdSAndroid Build Coastguard Worker         mutable std::ofstream m_ofs;
3435*387f9dfdSAndroid Build Coastguard Worker     public:
3436*387f9dfdSAndroid Build Coastguard Worker         FileStream( std::string const& filename );
3437*387f9dfdSAndroid Build Coastguard Worker         virtual ~FileStream() CATCH_NOEXCEPT;
3438*387f9dfdSAndroid Build Coastguard Worker     public: // IStream
3439*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const CATCH_OVERRIDE;
3440*387f9dfdSAndroid Build Coastguard Worker     };
3441*387f9dfdSAndroid Build Coastguard Worker 
3442*387f9dfdSAndroid Build Coastguard Worker     class CoutStream : public IStream {
3443*387f9dfdSAndroid Build Coastguard Worker         mutable std::ostream m_os;
3444*387f9dfdSAndroid Build Coastguard Worker     public:
3445*387f9dfdSAndroid Build Coastguard Worker         CoutStream();
3446*387f9dfdSAndroid Build Coastguard Worker         virtual ~CoutStream() CATCH_NOEXCEPT;
3447*387f9dfdSAndroid Build Coastguard Worker 
3448*387f9dfdSAndroid Build Coastguard Worker     public: // IStream
3449*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const CATCH_OVERRIDE;
3450*387f9dfdSAndroid Build Coastguard Worker     };
3451*387f9dfdSAndroid Build Coastguard Worker 
3452*387f9dfdSAndroid Build Coastguard Worker     class DebugOutStream : public IStream {
3453*387f9dfdSAndroid Build Coastguard Worker         std::auto_ptr<StreamBufBase> m_streamBuf;
3454*387f9dfdSAndroid Build Coastguard Worker         mutable std::ostream m_os;
3455*387f9dfdSAndroid Build Coastguard Worker     public:
3456*387f9dfdSAndroid Build Coastguard Worker         DebugOutStream();
3457*387f9dfdSAndroid Build Coastguard Worker         virtual ~DebugOutStream() CATCH_NOEXCEPT;
3458*387f9dfdSAndroid Build Coastguard Worker 
3459*387f9dfdSAndroid Build Coastguard Worker     public: // IStream
3460*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const CATCH_OVERRIDE;
3461*387f9dfdSAndroid Build Coastguard Worker     };
3462*387f9dfdSAndroid Build Coastguard Worker }
3463*387f9dfdSAndroid Build Coastguard Worker 
3464*387f9dfdSAndroid Build Coastguard Worker #include <memory>
3465*387f9dfdSAndroid Build Coastguard Worker #include <vector>
3466*387f9dfdSAndroid Build Coastguard Worker #include <string>
3467*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
3468*387f9dfdSAndroid Build Coastguard Worker #include <ctime>
3469*387f9dfdSAndroid Build Coastguard Worker 
3470*387f9dfdSAndroid Build Coastguard Worker #ifndef CATCH_CONFIG_CONSOLE_WIDTH
3471*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CONFIG_CONSOLE_WIDTH 80
3472*387f9dfdSAndroid Build Coastguard Worker #endif
3473*387f9dfdSAndroid Build Coastguard Worker 
3474*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
3475*387f9dfdSAndroid Build Coastguard Worker 
3476*387f9dfdSAndroid Build Coastguard Worker     struct ConfigData {
3477*387f9dfdSAndroid Build Coastguard Worker 
ConfigDataCatch::ConfigData3478*387f9dfdSAndroid Build Coastguard Worker         ConfigData()
3479*387f9dfdSAndroid Build Coastguard Worker         :   listTests( false ),
3480*387f9dfdSAndroid Build Coastguard Worker             listTags( false ),
3481*387f9dfdSAndroid Build Coastguard Worker             listReporters( false ),
3482*387f9dfdSAndroid Build Coastguard Worker             listTestNamesOnly( false ),
3483*387f9dfdSAndroid Build Coastguard Worker             showSuccessfulTests( false ),
3484*387f9dfdSAndroid Build Coastguard Worker             shouldDebugBreak( false ),
3485*387f9dfdSAndroid Build Coastguard Worker             noThrow( false ),
3486*387f9dfdSAndroid Build Coastguard Worker             showHelp( false ),
3487*387f9dfdSAndroid Build Coastguard Worker             showInvisibles( false ),
3488*387f9dfdSAndroid Build Coastguard Worker             filenamesAsTags( false ),
3489*387f9dfdSAndroid Build Coastguard Worker             abortAfter( -1 ),
3490*387f9dfdSAndroid Build Coastguard Worker             rngSeed( 0 ),
3491*387f9dfdSAndroid Build Coastguard Worker             verbosity( Verbosity::Normal ),
3492*387f9dfdSAndroid Build Coastguard Worker             warnings( WarnAbout::Nothing ),
3493*387f9dfdSAndroid Build Coastguard Worker             showDurations( ShowDurations::DefaultForReporter ),
3494*387f9dfdSAndroid Build Coastguard Worker             runOrder( RunTests::InDeclarationOrder ),
3495*387f9dfdSAndroid Build Coastguard Worker             useColour( UseColour::Auto )
3496*387f9dfdSAndroid Build Coastguard Worker         {}
3497*387f9dfdSAndroid Build Coastguard Worker 
3498*387f9dfdSAndroid Build Coastguard Worker         bool listTests;
3499*387f9dfdSAndroid Build Coastguard Worker         bool listTags;
3500*387f9dfdSAndroid Build Coastguard Worker         bool listReporters;
3501*387f9dfdSAndroid Build Coastguard Worker         bool listTestNamesOnly;
3502*387f9dfdSAndroid Build Coastguard Worker 
3503*387f9dfdSAndroid Build Coastguard Worker         bool showSuccessfulTests;
3504*387f9dfdSAndroid Build Coastguard Worker         bool shouldDebugBreak;
3505*387f9dfdSAndroid Build Coastguard Worker         bool noThrow;
3506*387f9dfdSAndroid Build Coastguard Worker         bool showHelp;
3507*387f9dfdSAndroid Build Coastguard Worker         bool showInvisibles;
3508*387f9dfdSAndroid Build Coastguard Worker         bool filenamesAsTags;
3509*387f9dfdSAndroid Build Coastguard Worker 
3510*387f9dfdSAndroid Build Coastguard Worker         int abortAfter;
3511*387f9dfdSAndroid Build Coastguard Worker         unsigned int rngSeed;
3512*387f9dfdSAndroid Build Coastguard Worker 
3513*387f9dfdSAndroid Build Coastguard Worker         Verbosity::Level verbosity;
3514*387f9dfdSAndroid Build Coastguard Worker         WarnAbout::What warnings;
3515*387f9dfdSAndroid Build Coastguard Worker         ShowDurations::OrNot showDurations;
3516*387f9dfdSAndroid Build Coastguard Worker         RunTests::InWhatOrder runOrder;
3517*387f9dfdSAndroid Build Coastguard Worker         UseColour::YesOrNo useColour;
3518*387f9dfdSAndroid Build Coastguard Worker 
3519*387f9dfdSAndroid Build Coastguard Worker         std::string outputFilename;
3520*387f9dfdSAndroid Build Coastguard Worker         std::string name;
3521*387f9dfdSAndroid Build Coastguard Worker         std::string processName;
3522*387f9dfdSAndroid Build Coastguard Worker 
3523*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> reporterNames;
3524*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> testsOrTags;
3525*387f9dfdSAndroid Build Coastguard Worker     };
3526*387f9dfdSAndroid Build Coastguard Worker 
3527*387f9dfdSAndroid Build Coastguard Worker     class Config : public SharedImpl<IConfig> {
3528*387f9dfdSAndroid Build Coastguard Worker     private:
3529*387f9dfdSAndroid Build Coastguard Worker         Config( Config const& other );
3530*387f9dfdSAndroid Build Coastguard Worker         Config& operator = ( Config const& other );
3531*387f9dfdSAndroid Build Coastguard Worker         virtual void dummy();
3532*387f9dfdSAndroid Build Coastguard Worker     public:
3533*387f9dfdSAndroid Build Coastguard Worker 
Config()3534*387f9dfdSAndroid Build Coastguard Worker         Config()
3535*387f9dfdSAndroid Build Coastguard Worker         {}
3536*387f9dfdSAndroid Build Coastguard Worker 
Config(ConfigData const & data)3537*387f9dfdSAndroid Build Coastguard Worker         Config( ConfigData const& data )
3538*387f9dfdSAndroid Build Coastguard Worker         :   m_data( data ),
3539*387f9dfdSAndroid Build Coastguard Worker             m_stream( openStream() )
3540*387f9dfdSAndroid Build Coastguard Worker         {
3541*387f9dfdSAndroid Build Coastguard Worker             if( !data.testsOrTags.empty() ) {
3542*387f9dfdSAndroid Build Coastguard Worker                 TestSpecParser parser( ITagAliasRegistry::get() );
3543*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < data.testsOrTags.size(); ++i )
3544*387f9dfdSAndroid Build Coastguard Worker                     parser.parse( data.testsOrTags[i] );
3545*387f9dfdSAndroid Build Coastguard Worker                 m_testSpec = parser.testSpec();
3546*387f9dfdSAndroid Build Coastguard Worker             }
3547*387f9dfdSAndroid Build Coastguard Worker         }
3548*387f9dfdSAndroid Build Coastguard Worker 
~Config()3549*387f9dfdSAndroid Build Coastguard Worker         virtual ~Config() {
3550*387f9dfdSAndroid Build Coastguard Worker         }
3551*387f9dfdSAndroid Build Coastguard Worker 
getFilename() const3552*387f9dfdSAndroid Build Coastguard Worker         std::string const& getFilename() const {
3553*387f9dfdSAndroid Build Coastguard Worker             return m_data.outputFilename ;
3554*387f9dfdSAndroid Build Coastguard Worker         }
3555*387f9dfdSAndroid Build Coastguard Worker 
listTests() const3556*387f9dfdSAndroid Build Coastguard Worker         bool listTests() const { return m_data.listTests; }
listTestNamesOnly() const3557*387f9dfdSAndroid Build Coastguard Worker         bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
listTags() const3558*387f9dfdSAndroid Build Coastguard Worker         bool listTags() const { return m_data.listTags; }
listReporters() const3559*387f9dfdSAndroid Build Coastguard Worker         bool listReporters() const { return m_data.listReporters; }
3560*387f9dfdSAndroid Build Coastguard Worker 
getProcessName() const3561*387f9dfdSAndroid Build Coastguard Worker         std::string getProcessName() const { return m_data.processName; }
3562*387f9dfdSAndroid Build Coastguard Worker 
shouldDebugBreak() const3563*387f9dfdSAndroid Build Coastguard Worker         bool shouldDebugBreak() const { return m_data.shouldDebugBreak; }
3564*387f9dfdSAndroid Build Coastguard Worker 
getReporterNames() const3565*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> getReporterNames() const { return m_data.reporterNames; }
3566*387f9dfdSAndroid Build Coastguard Worker 
abortAfter() const3567*387f9dfdSAndroid Build Coastguard Worker         int abortAfter() const { return m_data.abortAfter; }
3568*387f9dfdSAndroid Build Coastguard Worker 
testSpec() const3569*387f9dfdSAndroid Build Coastguard Worker         TestSpec const& testSpec() const { return m_testSpec; }
3570*387f9dfdSAndroid Build Coastguard Worker 
showHelp() const3571*387f9dfdSAndroid Build Coastguard Worker         bool showHelp() const { return m_data.showHelp; }
showInvisibles() const3572*387f9dfdSAndroid Build Coastguard Worker         bool showInvisibles() const { return m_data.showInvisibles; }
3573*387f9dfdSAndroid Build Coastguard Worker 
3574*387f9dfdSAndroid Build Coastguard Worker         // IConfig interface
allowThrows() const3575*387f9dfdSAndroid Build Coastguard Worker         virtual bool allowThrows() const        { return !m_data.noThrow; }
stream() const3576*387f9dfdSAndroid Build Coastguard Worker         virtual std::ostream& stream() const    { return m_stream->stream(); }
name() const3577*387f9dfdSAndroid Build Coastguard Worker         virtual std::string name() const        { return m_data.name.empty() ? m_data.processName : m_data.name; }
includeSuccessfulResults() const3578*387f9dfdSAndroid Build Coastguard Worker         virtual bool includeSuccessfulResults() const   { return m_data.showSuccessfulTests; }
warnAboutMissingAssertions() const3579*387f9dfdSAndroid Build Coastguard Worker         virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; }
showDurations() const3580*387f9dfdSAndroid Build Coastguard Worker         virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
runOrder() const3581*387f9dfdSAndroid Build Coastguard Worker         virtual RunTests::InWhatOrder runOrder() const  { return m_data.runOrder; }
rngSeed() const3582*387f9dfdSAndroid Build Coastguard Worker         virtual unsigned int rngSeed() const    { return m_data.rngSeed; }
useColour() const3583*387f9dfdSAndroid Build Coastguard Worker         virtual UseColour::YesOrNo useColour() const { return m_data.useColour; }
3584*387f9dfdSAndroid Build Coastguard Worker 
3585*387f9dfdSAndroid Build Coastguard Worker     private:
3586*387f9dfdSAndroid Build Coastguard Worker 
openStream()3587*387f9dfdSAndroid Build Coastguard Worker         IStream const* openStream() {
3588*387f9dfdSAndroid Build Coastguard Worker             if( m_data.outputFilename.empty() )
3589*387f9dfdSAndroid Build Coastguard Worker                 return new CoutStream();
3590*387f9dfdSAndroid Build Coastguard Worker             else if( m_data.outputFilename[0] == '%' ) {
3591*387f9dfdSAndroid Build Coastguard Worker                 if( m_data.outputFilename == "%debug" )
3592*387f9dfdSAndroid Build Coastguard Worker                     return new DebugOutStream();
3593*387f9dfdSAndroid Build Coastguard Worker                 else
3594*387f9dfdSAndroid Build Coastguard Worker                     throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename );
3595*387f9dfdSAndroid Build Coastguard Worker             }
3596*387f9dfdSAndroid Build Coastguard Worker             else
3597*387f9dfdSAndroid Build Coastguard Worker                 return new FileStream( m_data.outputFilename );
3598*387f9dfdSAndroid Build Coastguard Worker         }
3599*387f9dfdSAndroid Build Coastguard Worker         ConfigData m_data;
3600*387f9dfdSAndroid Build Coastguard Worker 
3601*387f9dfdSAndroid Build Coastguard Worker         std::auto_ptr<IStream const> m_stream;
3602*387f9dfdSAndroid Build Coastguard Worker         TestSpec m_testSpec;
3603*387f9dfdSAndroid Build Coastguard Worker     };
3604*387f9dfdSAndroid Build Coastguard Worker 
3605*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
3606*387f9dfdSAndroid Build Coastguard Worker 
3607*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_clara.h
3608*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED
3609*387f9dfdSAndroid Build Coastguard Worker 
3610*387f9dfdSAndroid Build Coastguard Worker // Use Catch's value for console width (store Clara's off to the side, if present)
3611*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_CONSOLE_WIDTH
3612*387f9dfdSAndroid Build Coastguard Worker #define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH
3613*387f9dfdSAndroid Build Coastguard Worker #undef CLARA_CONFIG_CONSOLE_WIDTH
3614*387f9dfdSAndroid Build Coastguard Worker #endif
3615*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
3616*387f9dfdSAndroid Build Coastguard Worker 
3617*387f9dfdSAndroid Build Coastguard Worker // Declare Clara inside the Catch namespace
3618*387f9dfdSAndroid Build Coastguard Worker #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
3619*387f9dfdSAndroid Build Coastguard Worker // #included from: ../external/clara.h
3620*387f9dfdSAndroid Build Coastguard Worker 
3621*387f9dfdSAndroid Build Coastguard Worker // Version 0.0.1.1
3622*387f9dfdSAndroid Build Coastguard Worker 
3623*387f9dfdSAndroid Build Coastguard Worker // Only use header guard if we are not using an outer namespace
3624*387f9dfdSAndroid Build Coastguard Worker #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
3625*387f9dfdSAndroid Build Coastguard Worker 
3626*387f9dfdSAndroid Build Coastguard Worker #ifndef STITCH_CLARA_OPEN_NAMESPACE
3627*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CLARA_H_INCLUDED
3628*387f9dfdSAndroid Build Coastguard Worker #define STITCH_CLARA_OPEN_NAMESPACE
3629*387f9dfdSAndroid Build Coastguard Worker #define STITCH_CLARA_CLOSE_NAMESPACE
3630*387f9dfdSAndroid Build Coastguard Worker #else
3631*387f9dfdSAndroid Build Coastguard Worker #define STITCH_CLARA_CLOSE_NAMESPACE }
3632*387f9dfdSAndroid Build Coastguard Worker #endif
3633*387f9dfdSAndroid Build Coastguard Worker 
3634*387f9dfdSAndroid Build Coastguard Worker #define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE
3635*387f9dfdSAndroid Build Coastguard Worker 
3636*387f9dfdSAndroid Build Coastguard Worker // ----------- #included from tbc_text_format.h -----------
3637*387f9dfdSAndroid Build Coastguard Worker 
3638*387f9dfdSAndroid Build Coastguard Worker // Only use header guard if we are not using an outer namespace
3639*387f9dfdSAndroid Build Coastguard Worker #if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE)
3640*387f9dfdSAndroid Build Coastguard Worker #ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
3641*387f9dfdSAndroid Build Coastguard Worker #define TBC_TEXT_FORMAT_H_INCLUDED
3642*387f9dfdSAndroid Build Coastguard Worker #endif
3643*387f9dfdSAndroid Build Coastguard Worker 
3644*387f9dfdSAndroid Build Coastguard Worker #include <string>
3645*387f9dfdSAndroid Build Coastguard Worker #include <vector>
3646*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
3647*387f9dfdSAndroid Build Coastguard Worker #include <algorithm>
3648*387f9dfdSAndroid Build Coastguard Worker 
3649*387f9dfdSAndroid Build Coastguard Worker // Use optional outer namespace
3650*387f9dfdSAndroid Build Coastguard Worker #ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
3651*387f9dfdSAndroid Build Coastguard Worker namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
3652*387f9dfdSAndroid Build Coastguard Worker #endif
3653*387f9dfdSAndroid Build Coastguard Worker 
3654*387f9dfdSAndroid Build Coastguard Worker namespace Tbc {
3655*387f9dfdSAndroid Build Coastguard Worker 
3656*387f9dfdSAndroid Build Coastguard Worker #ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
3657*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
3658*387f9dfdSAndroid Build Coastguard Worker #else
3659*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = 80;
3660*387f9dfdSAndroid Build Coastguard Worker #endif
3661*387f9dfdSAndroid Build Coastguard Worker 
3662*387f9dfdSAndroid Build Coastguard Worker     struct TextAttributes {
TextAttributesSTITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes3663*387f9dfdSAndroid Build Coastguard Worker         TextAttributes()
3664*387f9dfdSAndroid Build Coastguard Worker         :   initialIndent( std::string::npos ),
3665*387f9dfdSAndroid Build Coastguard Worker             indent( 0 ),
3666*387f9dfdSAndroid Build Coastguard Worker             width( consoleWidth-1 ),
3667*387f9dfdSAndroid Build Coastguard Worker             tabChar( '\t' )
3668*387f9dfdSAndroid Build Coastguard Worker         {}
3669*387f9dfdSAndroid Build Coastguard Worker 
setInitialIndentSTITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes3670*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setInitialIndent( std::size_t _value )  { initialIndent = _value; return *this; }
setIndentSTITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes3671*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setIndent( std::size_t _value )         { indent = _value; return *this; }
setWidthSTITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes3672*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setWidth( std::size_t _value )          { width = _value; return *this; }
setTabCharSTITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes3673*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setTabChar( char _value )               { tabChar = _value; return *this; }
3674*387f9dfdSAndroid Build Coastguard Worker 
3675*387f9dfdSAndroid Build Coastguard Worker         std::size_t initialIndent;  // indent of first line, or npos
3676*387f9dfdSAndroid Build Coastguard Worker         std::size_t indent;         // indent of subsequent lines, or all if initialIndent is npos
3677*387f9dfdSAndroid Build Coastguard Worker         std::size_t width;          // maximum width of text, including indent. Longer text will wrap
3678*387f9dfdSAndroid Build Coastguard Worker         char tabChar;               // If this char is seen the indent is changed to current pos
3679*387f9dfdSAndroid Build Coastguard Worker     };
3680*387f9dfdSAndroid Build Coastguard Worker 
3681*387f9dfdSAndroid Build Coastguard Worker     class Text {
3682*387f9dfdSAndroid Build Coastguard Worker     public:
Text(std::string const & _str,TextAttributes const & _attr=TextAttributes ())3683*387f9dfdSAndroid Build Coastguard Worker         Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
3684*387f9dfdSAndroid Build Coastguard Worker         : attr( _attr )
3685*387f9dfdSAndroid Build Coastguard Worker         {
3686*387f9dfdSAndroid Build Coastguard Worker             std::string wrappableChars = " [({.,/|\\-";
3687*387f9dfdSAndroid Build Coastguard Worker             std::size_t indent = _attr.initialIndent != std::string::npos
3688*387f9dfdSAndroid Build Coastguard Worker                 ? _attr.initialIndent
3689*387f9dfdSAndroid Build Coastguard Worker                 : _attr.indent;
3690*387f9dfdSAndroid Build Coastguard Worker             std::string remainder = _str;
3691*387f9dfdSAndroid Build Coastguard Worker 
3692*387f9dfdSAndroid Build Coastguard Worker             while( !remainder.empty() ) {
3693*387f9dfdSAndroid Build Coastguard Worker                 if( lines.size() >= 1000 ) {
3694*387f9dfdSAndroid Build Coastguard Worker                     lines.push_back( "... message truncated due to excessive size" );
3695*387f9dfdSAndroid Build Coastguard Worker                     return;
3696*387f9dfdSAndroid Build Coastguard Worker                 }
3697*387f9dfdSAndroid Build Coastguard Worker                 std::size_t tabPos = std::string::npos;
3698*387f9dfdSAndroid Build Coastguard Worker                 std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
3699*387f9dfdSAndroid Build Coastguard Worker                 std::size_t pos = remainder.find_first_of( '\n' );
3700*387f9dfdSAndroid Build Coastguard Worker                 if( pos <= width ) {
3701*387f9dfdSAndroid Build Coastguard Worker                     width = pos;
3702*387f9dfdSAndroid Build Coastguard Worker                 }
3703*387f9dfdSAndroid Build Coastguard Worker                 pos = remainder.find_last_of( _attr.tabChar, width );
3704*387f9dfdSAndroid Build Coastguard Worker                 if( pos != std::string::npos ) {
3705*387f9dfdSAndroid Build Coastguard Worker                     tabPos = pos;
3706*387f9dfdSAndroid Build Coastguard Worker                     if( remainder[width] == '\n' )
3707*387f9dfdSAndroid Build Coastguard Worker                         width--;
3708*387f9dfdSAndroid Build Coastguard Worker                     remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
3709*387f9dfdSAndroid Build Coastguard Worker                 }
3710*387f9dfdSAndroid Build Coastguard Worker 
3711*387f9dfdSAndroid Build Coastguard Worker                 if( width == remainder.size() ) {
3712*387f9dfdSAndroid Build Coastguard Worker                     spliceLine( indent, remainder, width );
3713*387f9dfdSAndroid Build Coastguard Worker                 }
3714*387f9dfdSAndroid Build Coastguard Worker                 else if( remainder[width] == '\n' ) {
3715*387f9dfdSAndroid Build Coastguard Worker                     spliceLine( indent, remainder, width );
3716*387f9dfdSAndroid Build Coastguard Worker                     if( width <= 1 || remainder.size() != 1 )
3717*387f9dfdSAndroid Build Coastguard Worker                         remainder = remainder.substr( 1 );
3718*387f9dfdSAndroid Build Coastguard Worker                     indent = _attr.indent;
3719*387f9dfdSAndroid Build Coastguard Worker                 }
3720*387f9dfdSAndroid Build Coastguard Worker                 else {
3721*387f9dfdSAndroid Build Coastguard Worker                     pos = remainder.find_last_of( wrappableChars, width );
3722*387f9dfdSAndroid Build Coastguard Worker                     if( pos != std::string::npos && pos > 0 ) {
3723*387f9dfdSAndroid Build Coastguard Worker                         spliceLine( indent, remainder, pos );
3724*387f9dfdSAndroid Build Coastguard Worker                         if( remainder[0] == ' ' )
3725*387f9dfdSAndroid Build Coastguard Worker                             remainder = remainder.substr( 1 );
3726*387f9dfdSAndroid Build Coastguard Worker                     }
3727*387f9dfdSAndroid Build Coastguard Worker                     else {
3728*387f9dfdSAndroid Build Coastguard Worker                         spliceLine( indent, remainder, width-1 );
3729*387f9dfdSAndroid Build Coastguard Worker                         lines.back() += "-";
3730*387f9dfdSAndroid Build Coastguard Worker                     }
3731*387f9dfdSAndroid Build Coastguard Worker                     if( lines.size() == 1 )
3732*387f9dfdSAndroid Build Coastguard Worker                         indent = _attr.indent;
3733*387f9dfdSAndroid Build Coastguard Worker                     if( tabPos != std::string::npos )
3734*387f9dfdSAndroid Build Coastguard Worker                         indent += tabPos;
3735*387f9dfdSAndroid Build Coastguard Worker                 }
3736*387f9dfdSAndroid Build Coastguard Worker             }
3737*387f9dfdSAndroid Build Coastguard Worker         }
3738*387f9dfdSAndroid Build Coastguard Worker 
spliceLine(std::size_t _indent,std::string & _remainder,std::size_t _pos)3739*387f9dfdSAndroid Build Coastguard Worker         void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
3740*387f9dfdSAndroid Build Coastguard Worker             lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
3741*387f9dfdSAndroid Build Coastguard Worker             _remainder = _remainder.substr( _pos );
3742*387f9dfdSAndroid Build Coastguard Worker         }
3743*387f9dfdSAndroid Build Coastguard Worker 
3744*387f9dfdSAndroid Build Coastguard Worker         typedef std::vector<std::string>::const_iterator const_iterator;
3745*387f9dfdSAndroid Build Coastguard Worker 
begin() const3746*387f9dfdSAndroid Build Coastguard Worker         const_iterator begin() const { return lines.begin(); }
end() const3747*387f9dfdSAndroid Build Coastguard Worker         const_iterator end() const { return lines.end(); }
last() const3748*387f9dfdSAndroid Build Coastguard Worker         std::string const& last() const { return lines.back(); }
size() const3749*387f9dfdSAndroid Build Coastguard Worker         std::size_t size() const { return lines.size(); }
operator [](std::size_t _index) const3750*387f9dfdSAndroid Build Coastguard Worker         std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
toString() const3751*387f9dfdSAndroid Build Coastguard Worker         std::string toString() const {
3752*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
3753*387f9dfdSAndroid Build Coastguard Worker             oss << *this;
3754*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
3755*387f9dfdSAndroid Build Coastguard Worker         }
3756*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & _stream,Text const & _text)3757*387f9dfdSAndroid Build Coastguard Worker         inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
3758*387f9dfdSAndroid Build Coastguard Worker             for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
3759*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd; ++it ) {
3760*387f9dfdSAndroid Build Coastguard Worker                 if( it != _text.begin() )
3761*387f9dfdSAndroid Build Coastguard Worker                     _stream << "\n";
3762*387f9dfdSAndroid Build Coastguard Worker                 _stream << *it;
3763*387f9dfdSAndroid Build Coastguard Worker             }
3764*387f9dfdSAndroid Build Coastguard Worker             return _stream;
3765*387f9dfdSAndroid Build Coastguard Worker         }
3766*387f9dfdSAndroid Build Coastguard Worker 
3767*387f9dfdSAndroid Build Coastguard Worker     private:
3768*387f9dfdSAndroid Build Coastguard Worker         std::string str;
3769*387f9dfdSAndroid Build Coastguard Worker         TextAttributes attr;
3770*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> lines;
3771*387f9dfdSAndroid Build Coastguard Worker     };
3772*387f9dfdSAndroid Build Coastguard Worker 
3773*387f9dfdSAndroid Build Coastguard Worker } // end namespace Tbc
3774*387f9dfdSAndroid Build Coastguard Worker 
3775*387f9dfdSAndroid Build Coastguard Worker #ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
3776*387f9dfdSAndroid Build Coastguard Worker } // end outer namespace
3777*387f9dfdSAndroid Build Coastguard Worker #endif
3778*387f9dfdSAndroid Build Coastguard Worker 
3779*387f9dfdSAndroid Build Coastguard Worker #endif // TBC_TEXT_FORMAT_H_INCLUDED
3780*387f9dfdSAndroid Build Coastguard Worker 
3781*387f9dfdSAndroid Build Coastguard Worker // ----------- end of #include from tbc_text_format.h -----------
3782*387f9dfdSAndroid Build Coastguard Worker // ........... back in clara.h
3783*387f9dfdSAndroid Build Coastguard Worker 
3784*387f9dfdSAndroid Build Coastguard Worker #undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE
3785*387f9dfdSAndroid Build Coastguard Worker 
3786*387f9dfdSAndroid Build Coastguard Worker // ----------- #included from clara_compilers.h -----------
3787*387f9dfdSAndroid Build Coastguard Worker 
3788*387f9dfdSAndroid Build Coastguard Worker #ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
3789*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
3790*387f9dfdSAndroid Build Coastguard Worker 
3791*387f9dfdSAndroid Build Coastguard Worker // Detect a number of compiler features - mostly C++11/14 conformance - by compiler
3792*387f9dfdSAndroid Build Coastguard Worker // The following features are defined:
3793*387f9dfdSAndroid Build Coastguard Worker //
3794*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported?
3795*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported?
3796*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods
3797*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_OVERRIDE : is override supported?
3798*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)
3799*387f9dfdSAndroid Build Coastguard Worker 
3800*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
3801*387f9dfdSAndroid Build Coastguard Worker 
3802*387f9dfdSAndroid Build Coastguard Worker // CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported?
3803*387f9dfdSAndroid Build Coastguard Worker 
3804*387f9dfdSAndroid Build Coastguard Worker // In general each macro has a _NO_<feature name> form
3805*387f9dfdSAndroid Build Coastguard Worker // (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature.
3806*387f9dfdSAndroid Build Coastguard Worker // Many features, at point of detection, define an _INTERNAL_ macro, so they
3807*387f9dfdSAndroid Build Coastguard Worker // can be combined, en-mass, with the _NO_ forms later.
3808*387f9dfdSAndroid Build Coastguard Worker 
3809*387f9dfdSAndroid Build Coastguard Worker // All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11
3810*387f9dfdSAndroid Build Coastguard Worker 
3811*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
3812*387f9dfdSAndroid Build Coastguard Worker 
3813*387f9dfdSAndroid Build Coastguard Worker #if __has_feature(cxx_nullptr)
3814*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
3815*387f9dfdSAndroid Build Coastguard Worker #endif
3816*387f9dfdSAndroid Build Coastguard Worker 
3817*387f9dfdSAndroid Build Coastguard Worker #if __has_feature(cxx_noexcept)
3818*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
3819*387f9dfdSAndroid Build Coastguard Worker #endif
3820*387f9dfdSAndroid Build Coastguard Worker 
3821*387f9dfdSAndroid Build Coastguard Worker #endif // __clang__
3822*387f9dfdSAndroid Build Coastguard Worker 
3823*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
3824*387f9dfdSAndroid Build Coastguard Worker // GCC
3825*387f9dfdSAndroid Build Coastguard Worker #ifdef __GNUC__
3826*387f9dfdSAndroid Build Coastguard Worker 
3827*387f9dfdSAndroid Build Coastguard Worker #if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
3828*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
3829*387f9dfdSAndroid Build Coastguard Worker #endif
3830*387f9dfdSAndroid Build Coastguard Worker 
3831*387f9dfdSAndroid Build Coastguard Worker // - otherwise more recent versions define __cplusplus >= 201103L
3832*387f9dfdSAndroid Build Coastguard Worker // and will get picked up below
3833*387f9dfdSAndroid Build Coastguard Worker 
3834*387f9dfdSAndroid Build Coastguard Worker #endif // __GNUC__
3835*387f9dfdSAndroid Build Coastguard Worker 
3836*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
3837*387f9dfdSAndroid Build Coastguard Worker // Visual C++
3838*387f9dfdSAndroid Build Coastguard Worker #ifdef _MSC_VER
3839*387f9dfdSAndroid Build Coastguard Worker 
3840*387f9dfdSAndroid Build Coastguard Worker #if (_MSC_VER >= 1600)
3841*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
3842*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
3843*387f9dfdSAndroid Build Coastguard Worker #endif
3844*387f9dfdSAndroid Build Coastguard Worker 
3845*387f9dfdSAndroid Build Coastguard Worker #if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))
3846*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
3847*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
3848*387f9dfdSAndroid Build Coastguard Worker #endif
3849*387f9dfdSAndroid Build Coastguard Worker 
3850*387f9dfdSAndroid Build Coastguard Worker #endif // _MSC_VER
3851*387f9dfdSAndroid Build Coastguard Worker 
3852*387f9dfdSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
3853*387f9dfdSAndroid Build Coastguard Worker // C++ language feature support
3854*387f9dfdSAndroid Build Coastguard Worker 
3855*387f9dfdSAndroid Build Coastguard Worker // catch all support for C++11
3856*387f9dfdSAndroid Build Coastguard Worker #if defined(__cplusplus) && __cplusplus >= 201103L
3857*387f9dfdSAndroid Build Coastguard Worker 
3858*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CPP11_OR_GREATER
3859*387f9dfdSAndroid Build Coastguard Worker 
3860*387f9dfdSAndroid Build Coastguard Worker #if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR)
3861*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
3862*387f9dfdSAndroid Build Coastguard Worker #endif
3863*387f9dfdSAndroid Build Coastguard Worker 
3864*387f9dfdSAndroid Build Coastguard Worker #ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
3865*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
3866*387f9dfdSAndroid Build Coastguard Worker #endif
3867*387f9dfdSAndroid Build Coastguard Worker 
3868*387f9dfdSAndroid Build Coastguard Worker #ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
3869*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
3870*387f9dfdSAndroid Build Coastguard Worker #endif
3871*387f9dfdSAndroid Build Coastguard Worker 
3872*387f9dfdSAndroid Build Coastguard Worker #if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE)
3873*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE
3874*387f9dfdSAndroid Build Coastguard Worker #endif
3875*387f9dfdSAndroid Build Coastguard Worker #if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)
3876*387f9dfdSAndroid Build Coastguard Worker #define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
3877*387f9dfdSAndroid Build Coastguard Worker #endif
3878*387f9dfdSAndroid Build Coastguard Worker 
3879*387f9dfdSAndroid Build Coastguard Worker #endif // __cplusplus >= 201103L
3880*387f9dfdSAndroid Build Coastguard Worker 
3881*387f9dfdSAndroid Build Coastguard Worker // Now set the actual defines based on the above + anything the user has configured
3882*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11)
3883*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CPP11_NULLPTR
3884*387f9dfdSAndroid Build Coastguard Worker #endif
3885*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11)
3886*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CPP11_NOEXCEPT
3887*387f9dfdSAndroid Build Coastguard Worker #endif
3888*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11)
3889*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CPP11_GENERATED_METHODS
3890*387f9dfdSAndroid Build Coastguard Worker #endif
3891*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11)
3892*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CPP11_OVERRIDE
3893*387f9dfdSAndroid Build Coastguard Worker #endif
3894*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11)
3895*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CPP11_UNIQUE_PTR
3896*387f9dfdSAndroid Build Coastguard Worker #endif
3897*387f9dfdSAndroid Build Coastguard Worker 
3898*387f9dfdSAndroid Build Coastguard Worker // noexcept support:
3899*387f9dfdSAndroid Build Coastguard Worker #if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT)
3900*387f9dfdSAndroid Build Coastguard Worker #define CLARA_NOEXCEPT noexcept
3901*387f9dfdSAndroid Build Coastguard Worker #  define CLARA_NOEXCEPT_IS(x) noexcept(x)
3902*387f9dfdSAndroid Build Coastguard Worker #else
3903*387f9dfdSAndroid Build Coastguard Worker #define CLARA_NOEXCEPT throw()
3904*387f9dfdSAndroid Build Coastguard Worker #  define CLARA_NOEXCEPT_IS(x)
3905*387f9dfdSAndroid Build Coastguard Worker #endif
3906*387f9dfdSAndroid Build Coastguard Worker 
3907*387f9dfdSAndroid Build Coastguard Worker // nullptr support
3908*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_CPP11_NULLPTR
3909*387f9dfdSAndroid Build Coastguard Worker #define CLARA_NULL nullptr
3910*387f9dfdSAndroid Build Coastguard Worker #else
3911*387f9dfdSAndroid Build Coastguard Worker #define CLARA_NULL NULL
3912*387f9dfdSAndroid Build Coastguard Worker #endif
3913*387f9dfdSAndroid Build Coastguard Worker 
3914*387f9dfdSAndroid Build Coastguard Worker // override support
3915*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_CPP11_OVERRIDE
3916*387f9dfdSAndroid Build Coastguard Worker #define CLARA_OVERRIDE override
3917*387f9dfdSAndroid Build Coastguard Worker #else
3918*387f9dfdSAndroid Build Coastguard Worker #define CLARA_OVERRIDE
3919*387f9dfdSAndroid Build Coastguard Worker #endif
3920*387f9dfdSAndroid Build Coastguard Worker 
3921*387f9dfdSAndroid Build Coastguard Worker // unique_ptr support
3922*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR
3923*387f9dfdSAndroid Build Coastguard Worker #   define CLARA_AUTO_PTR( T ) std::unique_ptr<T>
3924*387f9dfdSAndroid Build Coastguard Worker #else
3925*387f9dfdSAndroid Build Coastguard Worker #   define CLARA_AUTO_PTR( T ) std::auto_ptr<T>
3926*387f9dfdSAndroid Build Coastguard Worker #endif
3927*387f9dfdSAndroid Build Coastguard Worker 
3928*387f9dfdSAndroid Build Coastguard Worker #endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
3929*387f9dfdSAndroid Build Coastguard Worker 
3930*387f9dfdSAndroid Build Coastguard Worker // ----------- end of #include from clara_compilers.h -----------
3931*387f9dfdSAndroid Build Coastguard Worker // ........... back in clara.h
3932*387f9dfdSAndroid Build Coastguard Worker 
3933*387f9dfdSAndroid Build Coastguard Worker #include <map>
3934*387f9dfdSAndroid Build Coastguard Worker #include <stdexcept>
3935*387f9dfdSAndroid Build Coastguard Worker #include <memory>
3936*387f9dfdSAndroid Build Coastguard Worker 
3937*387f9dfdSAndroid Build Coastguard Worker // Use optional outer namespace
3938*387f9dfdSAndroid Build Coastguard Worker #ifdef STITCH_CLARA_OPEN_NAMESPACE
3939*387f9dfdSAndroid Build Coastguard Worker STITCH_CLARA_OPEN_NAMESPACE
3940*387f9dfdSAndroid Build Coastguard Worker #endif
3941*387f9dfdSAndroid Build Coastguard Worker 
3942*387f9dfdSAndroid Build Coastguard Worker namespace Clara {
3943*387f9dfdSAndroid Build Coastguard Worker 
3944*387f9dfdSAndroid Build Coastguard Worker     struct UnpositionalTag {};
3945*387f9dfdSAndroid Build Coastguard Worker 
3946*387f9dfdSAndroid Build Coastguard Worker     extern UnpositionalTag _;
3947*387f9dfdSAndroid Build Coastguard Worker 
3948*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_MAIN
3949*387f9dfdSAndroid Build Coastguard Worker     UnpositionalTag _;
3950*387f9dfdSAndroid Build Coastguard Worker #endif
3951*387f9dfdSAndroid Build Coastguard Worker 
3952*387f9dfdSAndroid Build Coastguard Worker     namespace Detail {
3953*387f9dfdSAndroid Build Coastguard Worker 
3954*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONSOLE_WIDTH
3955*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH;
3956*387f9dfdSAndroid Build Coastguard Worker #else
3957*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = 80;
3958*387f9dfdSAndroid Build Coastguard Worker #endif
3959*387f9dfdSAndroid Build Coastguard Worker 
3960*387f9dfdSAndroid Build Coastguard Worker         // Use this to try and stop compiler from warning about unreachable code
isTrue(bool value)3961*387f9dfdSAndroid Build Coastguard Worker         inline bool isTrue( bool value ) { return value; }
3962*387f9dfdSAndroid Build Coastguard Worker 
3963*387f9dfdSAndroid Build Coastguard Worker         using namespace Tbc;
3964*387f9dfdSAndroid Build Coastguard Worker 
startsWith(std::string const & str,std::string const & prefix)3965*387f9dfdSAndroid Build Coastguard Worker         inline bool startsWith( std::string const& str, std::string const& prefix ) {
3966*387f9dfdSAndroid Build Coastguard Worker             return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix;
3967*387f9dfdSAndroid Build Coastguard Worker         }
3968*387f9dfdSAndroid Build Coastguard Worker 
3969*387f9dfdSAndroid Build Coastguard Worker         template<typename T> struct RemoveConstRef{ typedef T type; };
3970*387f9dfdSAndroid Build Coastguard Worker         template<typename T> struct RemoveConstRef<T&>{ typedef T type; };
3971*387f9dfdSAndroid Build Coastguard Worker         template<typename T> struct RemoveConstRef<T const&>{ typedef T type; };
3972*387f9dfdSAndroid Build Coastguard Worker         template<typename T> struct RemoveConstRef<T const>{ typedef T type; };
3973*387f9dfdSAndroid Build Coastguard Worker 
3974*387f9dfdSAndroid Build Coastguard Worker         template<typename T>    struct IsBool       { static const bool value = false; };
3975*387f9dfdSAndroid Build Coastguard Worker         template<>              struct IsBool<bool> { static const bool value = true; };
3976*387f9dfdSAndroid Build Coastguard Worker 
3977*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
convertInto(std::string const & _source,T & _dest)3978*387f9dfdSAndroid Build Coastguard Worker         void convertInto( std::string const& _source, T& _dest ) {
3979*387f9dfdSAndroid Build Coastguard Worker             std::stringstream ss;
3980*387f9dfdSAndroid Build Coastguard Worker             ss << _source;
3981*387f9dfdSAndroid Build Coastguard Worker             ss >> _dest;
3982*387f9dfdSAndroid Build Coastguard Worker             if( ss.fail() )
3983*387f9dfdSAndroid Build Coastguard Worker                 throw std::runtime_error( "Unable to convert " + _source + " to destination type" );
3984*387f9dfdSAndroid Build Coastguard Worker         }
convertInto(std::string const & _source,std::string & _dest)3985*387f9dfdSAndroid Build Coastguard Worker         inline void convertInto( std::string const& _source, std::string& _dest ) {
3986*387f9dfdSAndroid Build Coastguard Worker             _dest = _source;
3987*387f9dfdSAndroid Build Coastguard Worker         }
convertInto(std::string const & _source,bool & _dest)3988*387f9dfdSAndroid Build Coastguard Worker         inline void convertInto( std::string const& _source, bool& _dest ) {
3989*387f9dfdSAndroid Build Coastguard Worker             std::string sourceLC = _source;
3990*387f9dfdSAndroid Build Coastguard Worker             std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower );
3991*387f9dfdSAndroid Build Coastguard Worker             if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" )
3992*387f9dfdSAndroid Build Coastguard Worker                 _dest = true;
3993*387f9dfdSAndroid Build Coastguard Worker             else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" )
3994*387f9dfdSAndroid Build Coastguard Worker                 _dest = false;
3995*387f9dfdSAndroid Build Coastguard Worker             else
3996*387f9dfdSAndroid Build Coastguard Worker                 throw std::runtime_error( "Expected a boolean value but did not recognise:\n  '" + _source + "'" );
3997*387f9dfdSAndroid Build Coastguard Worker         }
convertInto(bool _source,bool & _dest)3998*387f9dfdSAndroid Build Coastguard Worker         inline void convertInto( bool _source, bool& _dest ) {
3999*387f9dfdSAndroid Build Coastguard Worker             _dest = _source;
4000*387f9dfdSAndroid Build Coastguard Worker         }
4001*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
convertInto(bool,T &)4002*387f9dfdSAndroid Build Coastguard Worker         inline void convertInto( bool, T& ) {
4003*387f9dfdSAndroid Build Coastguard Worker             if( isTrue( true ) )
4004*387f9dfdSAndroid Build Coastguard Worker                 throw std::runtime_error( "Invalid conversion" );
4005*387f9dfdSAndroid Build Coastguard Worker         }
4006*387f9dfdSAndroid Build Coastguard Worker 
4007*387f9dfdSAndroid Build Coastguard Worker         template<typename ConfigT>
4008*387f9dfdSAndroid Build Coastguard Worker         struct IArgFunction {
~IArgFunctionClara::Detail::IArgFunction4009*387f9dfdSAndroid Build Coastguard Worker             virtual ~IArgFunction() {}
4010*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS
4011*387f9dfdSAndroid Build Coastguard Worker             IArgFunction()                      = default;
4012*387f9dfdSAndroid Build Coastguard Worker             IArgFunction( IArgFunction const& ) = default;
4013*387f9dfdSAndroid Build Coastguard Worker #endif
4014*387f9dfdSAndroid Build Coastguard Worker             virtual void set( ConfigT& config, std::string const& value ) const = 0;
4015*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( ConfigT& config ) const = 0;
4016*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const = 0;
4017*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction* clone() const = 0;
4018*387f9dfdSAndroid Build Coastguard Worker         };
4019*387f9dfdSAndroid Build Coastguard Worker 
4020*387f9dfdSAndroid Build Coastguard Worker         template<typename ConfigT>
4021*387f9dfdSAndroid Build Coastguard Worker         class BoundArgFunction {
4022*387f9dfdSAndroid Build Coastguard Worker         public:
BoundArgFunction()4023*387f9dfdSAndroid Build Coastguard Worker             BoundArgFunction() : functionObj( CLARA_NULL ) {}
BoundArgFunction(IArgFunction<ConfigT> * _functionObj)4024*387f9dfdSAndroid Build Coastguard Worker             BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {}
BoundArgFunction(BoundArgFunction const & other)4025*387f9dfdSAndroid Build Coastguard Worker             BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {}
operator =(BoundArgFunction const & other)4026*387f9dfdSAndroid Build Coastguard Worker             BoundArgFunction& operator = ( BoundArgFunction const& other ) {
4027*387f9dfdSAndroid Build Coastguard Worker                 IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL;
4028*387f9dfdSAndroid Build Coastguard Worker                 delete functionObj;
4029*387f9dfdSAndroid Build Coastguard Worker                 functionObj = newFunctionObj;
4030*387f9dfdSAndroid Build Coastguard Worker                 return *this;
4031*387f9dfdSAndroid Build Coastguard Worker             }
~BoundArgFunction()4032*387f9dfdSAndroid Build Coastguard Worker             ~BoundArgFunction() { delete functionObj; }
4033*387f9dfdSAndroid Build Coastguard Worker 
set(ConfigT & config,std::string const & value) const4034*387f9dfdSAndroid Build Coastguard Worker             void set( ConfigT& config, std::string const& value ) const {
4035*387f9dfdSAndroid Build Coastguard Worker                 functionObj->set( config, value );
4036*387f9dfdSAndroid Build Coastguard Worker             }
setFlag(ConfigT & config) const4037*387f9dfdSAndroid Build Coastguard Worker             void setFlag( ConfigT& config ) const {
4038*387f9dfdSAndroid Build Coastguard Worker                 functionObj->setFlag( config );
4039*387f9dfdSAndroid Build Coastguard Worker             }
takesArg() const4040*387f9dfdSAndroid Build Coastguard Worker             bool takesArg() const { return functionObj->takesArg(); }
4041*387f9dfdSAndroid Build Coastguard Worker 
isSet() const4042*387f9dfdSAndroid Build Coastguard Worker             bool isSet() const {
4043*387f9dfdSAndroid Build Coastguard Worker                 return functionObj != CLARA_NULL;
4044*387f9dfdSAndroid Build Coastguard Worker             }
4045*387f9dfdSAndroid Build Coastguard Worker         private:
4046*387f9dfdSAndroid Build Coastguard Worker             IArgFunction<ConfigT>* functionObj;
4047*387f9dfdSAndroid Build Coastguard Worker         };
4048*387f9dfdSAndroid Build Coastguard Worker 
4049*387f9dfdSAndroid Build Coastguard Worker         template<typename C>
4050*387f9dfdSAndroid Build Coastguard Worker         struct NullBinder : IArgFunction<C>{
setClara::Detail::NullBinder4051*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C&, std::string const& ) const {}
setFlagClara::Detail::NullBinder4052*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& ) const {}
takesArgClara::Detail::NullBinder4053*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return true; }
cloneClara::Detail::NullBinder4054*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
4055*387f9dfdSAndroid Build Coastguard Worker         };
4056*387f9dfdSAndroid Build Coastguard Worker 
4057*387f9dfdSAndroid Build Coastguard Worker         template<typename C, typename M>
4058*387f9dfdSAndroid Build Coastguard Worker         struct BoundDataMember : IArgFunction<C>{
BoundDataMemberClara::Detail::BoundDataMember4059*387f9dfdSAndroid Build Coastguard Worker             BoundDataMember( M C::* _member ) : member( _member ) {}
setClara::Detail::BoundDataMember4060*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C& p, std::string const& stringValue ) const {
4061*387f9dfdSAndroid Build Coastguard Worker                 convertInto( stringValue, p.*member );
4062*387f9dfdSAndroid Build Coastguard Worker             }
setFlagClara::Detail::BoundDataMember4063*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& p ) const {
4064*387f9dfdSAndroid Build Coastguard Worker                 convertInto( true, p.*member );
4065*387f9dfdSAndroid Build Coastguard Worker             }
takesArgClara::Detail::BoundDataMember4066*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return !IsBool<M>::value; }
cloneClara::Detail::BoundDataMember4067*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
4068*387f9dfdSAndroid Build Coastguard Worker             M C::* member;
4069*387f9dfdSAndroid Build Coastguard Worker         };
4070*387f9dfdSAndroid Build Coastguard Worker         template<typename C, typename M>
4071*387f9dfdSAndroid Build Coastguard Worker         struct BoundUnaryMethod : IArgFunction<C>{
BoundUnaryMethodClara::Detail::BoundUnaryMethod4072*387f9dfdSAndroid Build Coastguard Worker             BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {}
setClara::Detail::BoundUnaryMethod4073*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C& p, std::string const& stringValue ) const {
4074*387f9dfdSAndroid Build Coastguard Worker                 typename RemoveConstRef<M>::type value;
4075*387f9dfdSAndroid Build Coastguard Worker                 convertInto( stringValue, value );
4076*387f9dfdSAndroid Build Coastguard Worker                 (p.*member)( value );
4077*387f9dfdSAndroid Build Coastguard Worker             }
setFlagClara::Detail::BoundUnaryMethod4078*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& p ) const {
4079*387f9dfdSAndroid Build Coastguard Worker                 typename RemoveConstRef<M>::type value;
4080*387f9dfdSAndroid Build Coastguard Worker                 convertInto( true, value );
4081*387f9dfdSAndroid Build Coastguard Worker                 (p.*member)( value );
4082*387f9dfdSAndroid Build Coastguard Worker             }
takesArgClara::Detail::BoundUnaryMethod4083*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return !IsBool<M>::value; }
cloneClara::Detail::BoundUnaryMethod4084*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
4085*387f9dfdSAndroid Build Coastguard Worker             void (C::*member)( M );
4086*387f9dfdSAndroid Build Coastguard Worker         };
4087*387f9dfdSAndroid Build Coastguard Worker         template<typename C>
4088*387f9dfdSAndroid Build Coastguard Worker         struct BoundNullaryMethod : IArgFunction<C>{
BoundNullaryMethodClara::Detail::BoundNullaryMethod4089*387f9dfdSAndroid Build Coastguard Worker             BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {}
setClara::Detail::BoundNullaryMethod4090*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C& p, std::string const& stringValue ) const {
4091*387f9dfdSAndroid Build Coastguard Worker                 bool value;
4092*387f9dfdSAndroid Build Coastguard Worker                 convertInto( stringValue, value );
4093*387f9dfdSAndroid Build Coastguard Worker                 if( value )
4094*387f9dfdSAndroid Build Coastguard Worker                     (p.*member)();
4095*387f9dfdSAndroid Build Coastguard Worker             }
setFlagClara::Detail::BoundNullaryMethod4096*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& p ) const {
4097*387f9dfdSAndroid Build Coastguard Worker                 (p.*member)();
4098*387f9dfdSAndroid Build Coastguard Worker             }
takesArgClara::Detail::BoundNullaryMethod4099*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return false; }
cloneClara::Detail::BoundNullaryMethod4100*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
4101*387f9dfdSAndroid Build Coastguard Worker             void (C::*member)();
4102*387f9dfdSAndroid Build Coastguard Worker         };
4103*387f9dfdSAndroid Build Coastguard Worker 
4104*387f9dfdSAndroid Build Coastguard Worker         template<typename C>
4105*387f9dfdSAndroid Build Coastguard Worker         struct BoundUnaryFunction : IArgFunction<C>{
BoundUnaryFunctionClara::Detail::BoundUnaryFunction4106*387f9dfdSAndroid Build Coastguard Worker             BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {}
setClara::Detail::BoundUnaryFunction4107*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C& obj, std::string const& stringValue ) const {
4108*387f9dfdSAndroid Build Coastguard Worker                 bool value;
4109*387f9dfdSAndroid Build Coastguard Worker                 convertInto( stringValue, value );
4110*387f9dfdSAndroid Build Coastguard Worker                 if( value )
4111*387f9dfdSAndroid Build Coastguard Worker                     function( obj );
4112*387f9dfdSAndroid Build Coastguard Worker             }
setFlagClara::Detail::BoundUnaryFunction4113*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& p ) const {
4114*387f9dfdSAndroid Build Coastguard Worker                 function( p );
4115*387f9dfdSAndroid Build Coastguard Worker             }
takesArgClara::Detail::BoundUnaryFunction4116*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return false; }
cloneClara::Detail::BoundUnaryFunction4117*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
4118*387f9dfdSAndroid Build Coastguard Worker             void (*function)( C& );
4119*387f9dfdSAndroid Build Coastguard Worker         };
4120*387f9dfdSAndroid Build Coastguard Worker 
4121*387f9dfdSAndroid Build Coastguard Worker         template<typename C, typename T>
4122*387f9dfdSAndroid Build Coastguard Worker         struct BoundBinaryFunction : IArgFunction<C>{
BoundBinaryFunctionClara::Detail::BoundBinaryFunction4123*387f9dfdSAndroid Build Coastguard Worker             BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}
setClara::Detail::BoundBinaryFunction4124*387f9dfdSAndroid Build Coastguard Worker             virtual void set( C& obj, std::string const& stringValue ) const {
4125*387f9dfdSAndroid Build Coastguard Worker                 typename RemoveConstRef<T>::type value;
4126*387f9dfdSAndroid Build Coastguard Worker                 convertInto( stringValue, value );
4127*387f9dfdSAndroid Build Coastguard Worker                 function( obj, value );
4128*387f9dfdSAndroid Build Coastguard Worker             }
setFlagClara::Detail::BoundBinaryFunction4129*387f9dfdSAndroid Build Coastguard Worker             virtual void setFlag( C& obj ) const {
4130*387f9dfdSAndroid Build Coastguard Worker                 typename RemoveConstRef<T>::type value;
4131*387f9dfdSAndroid Build Coastguard Worker                 convertInto( true, value );
4132*387f9dfdSAndroid Build Coastguard Worker                 function( obj, value );
4133*387f9dfdSAndroid Build Coastguard Worker             }
takesArgClara::Detail::BoundBinaryFunction4134*387f9dfdSAndroid Build Coastguard Worker             virtual bool takesArg() const { return !IsBool<T>::value; }
cloneClara::Detail::BoundBinaryFunction4135*387f9dfdSAndroid Build Coastguard Worker             virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
4136*387f9dfdSAndroid Build Coastguard Worker             void (*function)( C&, T );
4137*387f9dfdSAndroid Build Coastguard Worker         };
4138*387f9dfdSAndroid Build Coastguard Worker 
4139*387f9dfdSAndroid Build Coastguard Worker     } // namespace Detail
4140*387f9dfdSAndroid Build Coastguard Worker 
4141*387f9dfdSAndroid Build Coastguard Worker     struct Parser {
ParserClara::Parser4142*387f9dfdSAndroid Build Coastguard Worker         Parser() : separators( " \t=:" ) {}
4143*387f9dfdSAndroid Build Coastguard Worker 
4144*387f9dfdSAndroid Build Coastguard Worker         struct Token {
4145*387f9dfdSAndroid Build Coastguard Worker             enum Type { Positional, ShortOpt, LongOpt };
TokenClara::Parser::Token4146*387f9dfdSAndroid Build Coastguard Worker             Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {}
4147*387f9dfdSAndroid Build Coastguard Worker             Type type;
4148*387f9dfdSAndroid Build Coastguard Worker             std::string data;
4149*387f9dfdSAndroid Build Coastguard Worker         };
4150*387f9dfdSAndroid Build Coastguard Worker 
parseIntoTokensClara::Parser4151*387f9dfdSAndroid Build Coastguard Worker         void parseIntoTokens( int argc, char const* const argv[], std::vector<Parser::Token>& tokens ) const {
4152*387f9dfdSAndroid Build Coastguard Worker             const std::string doubleDash = "--";
4153*387f9dfdSAndroid Build Coastguard Worker             for( int i = 1; i < argc && argv[i] != doubleDash; ++i )
4154*387f9dfdSAndroid Build Coastguard Worker                 parseIntoTokens( argv[i] , tokens);
4155*387f9dfdSAndroid Build Coastguard Worker         }
parseIntoTokensClara::Parser4156*387f9dfdSAndroid Build Coastguard Worker         void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const {
4157*387f9dfdSAndroid Build Coastguard Worker             while( !arg.empty() ) {
4158*387f9dfdSAndroid Build Coastguard Worker                 Parser::Token token( Parser::Token::Positional, arg );
4159*387f9dfdSAndroid Build Coastguard Worker                 arg = "";
4160*387f9dfdSAndroid Build Coastguard Worker                 if( token.data[0] == '-' ) {
4161*387f9dfdSAndroid Build Coastguard Worker                     if( token.data.size() > 1 && token.data[1] == '-' ) {
4162*387f9dfdSAndroid Build Coastguard Worker                         token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) );
4163*387f9dfdSAndroid Build Coastguard Worker                     }
4164*387f9dfdSAndroid Build Coastguard Worker                     else {
4165*387f9dfdSAndroid Build Coastguard Worker                         token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) );
4166*387f9dfdSAndroid Build Coastguard Worker                         if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) {
4167*387f9dfdSAndroid Build Coastguard Worker                             arg = "-" + token.data.substr( 1 );
4168*387f9dfdSAndroid Build Coastguard Worker                             token.data = token.data.substr( 0, 1 );
4169*387f9dfdSAndroid Build Coastguard Worker                         }
4170*387f9dfdSAndroid Build Coastguard Worker                     }
4171*387f9dfdSAndroid Build Coastguard Worker                 }
4172*387f9dfdSAndroid Build Coastguard Worker                 if( token.type != Parser::Token::Positional ) {
4173*387f9dfdSAndroid Build Coastguard Worker                     std::size_t pos = token.data.find_first_of( separators );
4174*387f9dfdSAndroid Build Coastguard Worker                     if( pos != std::string::npos ) {
4175*387f9dfdSAndroid Build Coastguard Worker                         arg = token.data.substr( pos+1 );
4176*387f9dfdSAndroid Build Coastguard Worker                         token.data = token.data.substr( 0, pos );
4177*387f9dfdSAndroid Build Coastguard Worker                     }
4178*387f9dfdSAndroid Build Coastguard Worker                 }
4179*387f9dfdSAndroid Build Coastguard Worker                 tokens.push_back( token );
4180*387f9dfdSAndroid Build Coastguard Worker             }
4181*387f9dfdSAndroid Build Coastguard Worker         }
4182*387f9dfdSAndroid Build Coastguard Worker         std::string separators;
4183*387f9dfdSAndroid Build Coastguard Worker     };
4184*387f9dfdSAndroid Build Coastguard Worker 
4185*387f9dfdSAndroid Build Coastguard Worker     template<typename ConfigT>
4186*387f9dfdSAndroid Build Coastguard Worker     struct CommonArgProperties {
CommonArgPropertiesClara::CommonArgProperties4187*387f9dfdSAndroid Build Coastguard Worker         CommonArgProperties() {}
CommonArgPropertiesClara::CommonArgProperties4188*387f9dfdSAndroid Build Coastguard Worker         CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}
4189*387f9dfdSAndroid Build Coastguard Worker 
4190*387f9dfdSAndroid Build Coastguard Worker         Detail::BoundArgFunction<ConfigT> boundField;
4191*387f9dfdSAndroid Build Coastguard Worker         std::string description;
4192*387f9dfdSAndroid Build Coastguard Worker         std::string detail;
4193*387f9dfdSAndroid Build Coastguard Worker         std::string placeholder; // Only value if boundField takes an arg
4194*387f9dfdSAndroid Build Coastguard Worker 
takesArgClara::CommonArgProperties4195*387f9dfdSAndroid Build Coastguard Worker         bool takesArg() const {
4196*387f9dfdSAndroid Build Coastguard Worker             return !placeholder.empty();
4197*387f9dfdSAndroid Build Coastguard Worker         }
validateClara::CommonArgProperties4198*387f9dfdSAndroid Build Coastguard Worker         void validate() const {
4199*387f9dfdSAndroid Build Coastguard Worker             if( !boundField.isSet() )
4200*387f9dfdSAndroid Build Coastguard Worker                 throw std::logic_error( "option not bound" );
4201*387f9dfdSAndroid Build Coastguard Worker         }
4202*387f9dfdSAndroid Build Coastguard Worker     };
4203*387f9dfdSAndroid Build Coastguard Worker     struct OptionArgProperties {
4204*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> shortNames;
4205*387f9dfdSAndroid Build Coastguard Worker         std::string longName;
4206*387f9dfdSAndroid Build Coastguard Worker 
hasShortNameClara::OptionArgProperties4207*387f9dfdSAndroid Build Coastguard Worker         bool hasShortName( std::string const& shortName ) const {
4208*387f9dfdSAndroid Build Coastguard Worker             return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();
4209*387f9dfdSAndroid Build Coastguard Worker         }
hasLongNameClara::OptionArgProperties4210*387f9dfdSAndroid Build Coastguard Worker         bool hasLongName( std::string const& _longName ) const {
4211*387f9dfdSAndroid Build Coastguard Worker             return _longName == longName;
4212*387f9dfdSAndroid Build Coastguard Worker         }
4213*387f9dfdSAndroid Build Coastguard Worker     };
4214*387f9dfdSAndroid Build Coastguard Worker     struct PositionalArgProperties {
PositionalArgPropertiesClara::PositionalArgProperties4215*387f9dfdSAndroid Build Coastguard Worker         PositionalArgProperties() : position( -1 ) {}
4216*387f9dfdSAndroid Build Coastguard Worker         int position; // -1 means non-positional (floating)
4217*387f9dfdSAndroid Build Coastguard Worker 
isFixedPositionalClara::PositionalArgProperties4218*387f9dfdSAndroid Build Coastguard Worker         bool isFixedPositional() const {
4219*387f9dfdSAndroid Build Coastguard Worker             return position != -1;
4220*387f9dfdSAndroid Build Coastguard Worker         }
4221*387f9dfdSAndroid Build Coastguard Worker     };
4222*387f9dfdSAndroid Build Coastguard Worker 
4223*387f9dfdSAndroid Build Coastguard Worker     template<typename ConfigT>
4224*387f9dfdSAndroid Build Coastguard Worker     class CommandLine {
4225*387f9dfdSAndroid Build Coastguard Worker 
4226*387f9dfdSAndroid Build Coastguard Worker         struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {
ArgClara::CommandLine::Arg4227*387f9dfdSAndroid Build Coastguard Worker             Arg() {}
ArgClara::CommandLine::Arg4228*387f9dfdSAndroid Build Coastguard Worker             Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}
4229*387f9dfdSAndroid Build Coastguard Worker 
4230*387f9dfdSAndroid Build Coastguard Worker             using CommonArgProperties<ConfigT>::placeholder; // !TBD
4231*387f9dfdSAndroid Build Coastguard Worker 
dbgNameClara::CommandLine::Arg4232*387f9dfdSAndroid Build Coastguard Worker             std::string dbgName() const {
4233*387f9dfdSAndroid Build Coastguard Worker                 if( !longName.empty() )
4234*387f9dfdSAndroid Build Coastguard Worker                     return "--" + longName;
4235*387f9dfdSAndroid Build Coastguard Worker                 if( !shortNames.empty() )
4236*387f9dfdSAndroid Build Coastguard Worker                     return "-" + shortNames[0];
4237*387f9dfdSAndroid Build Coastguard Worker                 return "positional args";
4238*387f9dfdSAndroid Build Coastguard Worker             }
commandsClara::CommandLine::Arg4239*387f9dfdSAndroid Build Coastguard Worker             std::string commands() const {
4240*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
4241*387f9dfdSAndroid Build Coastguard Worker                 bool first = true;
4242*387f9dfdSAndroid Build Coastguard Worker                 std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();
4243*387f9dfdSAndroid Build Coastguard Worker                 for(; it != itEnd; ++it ) {
4244*387f9dfdSAndroid Build Coastguard Worker                     if( first )
4245*387f9dfdSAndroid Build Coastguard Worker                         first = false;
4246*387f9dfdSAndroid Build Coastguard Worker                     else
4247*387f9dfdSAndroid Build Coastguard Worker                         oss << ", ";
4248*387f9dfdSAndroid Build Coastguard Worker                     oss << "-" << *it;
4249*387f9dfdSAndroid Build Coastguard Worker                 }
4250*387f9dfdSAndroid Build Coastguard Worker                 if( !longName.empty() ) {
4251*387f9dfdSAndroid Build Coastguard Worker                     if( !first )
4252*387f9dfdSAndroid Build Coastguard Worker                         oss << ", ";
4253*387f9dfdSAndroid Build Coastguard Worker                     oss << "--" << longName;
4254*387f9dfdSAndroid Build Coastguard Worker                 }
4255*387f9dfdSAndroid Build Coastguard Worker                 if( !placeholder.empty() )
4256*387f9dfdSAndroid Build Coastguard Worker                     oss << " <" << placeholder << ">";
4257*387f9dfdSAndroid Build Coastguard Worker                 return oss.str();
4258*387f9dfdSAndroid Build Coastguard Worker             }
4259*387f9dfdSAndroid Build Coastguard Worker         };
4260*387f9dfdSAndroid Build Coastguard Worker 
4261*387f9dfdSAndroid Build Coastguard Worker         typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr;
4262*387f9dfdSAndroid Build Coastguard Worker 
addOptName(Arg & arg,std::string const & optName)4263*387f9dfdSAndroid Build Coastguard Worker         friend void addOptName( Arg& arg, std::string const& optName )
4264*387f9dfdSAndroid Build Coastguard Worker         {
4265*387f9dfdSAndroid Build Coastguard Worker             if( optName.empty() )
4266*387f9dfdSAndroid Build Coastguard Worker                 return;
4267*387f9dfdSAndroid Build Coastguard Worker             if( Detail::startsWith( optName, "--" ) ) {
4268*387f9dfdSAndroid Build Coastguard Worker                 if( !arg.longName.empty() )
4269*387f9dfdSAndroid Build Coastguard Worker                     throw std::logic_error( "Only one long opt may be specified. '"
4270*387f9dfdSAndroid Build Coastguard Worker                         + arg.longName
4271*387f9dfdSAndroid Build Coastguard Worker                         + "' already specified, now attempting to add '"
4272*387f9dfdSAndroid Build Coastguard Worker                         + optName + "'" );
4273*387f9dfdSAndroid Build Coastguard Worker                 arg.longName = optName.substr( 2 );
4274*387f9dfdSAndroid Build Coastguard Worker             }
4275*387f9dfdSAndroid Build Coastguard Worker             else if( Detail::startsWith( optName, "-" ) )
4276*387f9dfdSAndroid Build Coastguard Worker                 arg.shortNames.push_back( optName.substr( 1 ) );
4277*387f9dfdSAndroid Build Coastguard Worker             else
4278*387f9dfdSAndroid Build Coastguard Worker                 throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
4279*387f9dfdSAndroid Build Coastguard Worker         }
setPositionalArg(Arg & arg,int position)4280*387f9dfdSAndroid Build Coastguard Worker         friend void setPositionalArg( Arg& arg, int position )
4281*387f9dfdSAndroid Build Coastguard Worker         {
4282*387f9dfdSAndroid Build Coastguard Worker             arg.position = position;
4283*387f9dfdSAndroid Build Coastguard Worker         }
4284*387f9dfdSAndroid Build Coastguard Worker 
4285*387f9dfdSAndroid Build Coastguard Worker         class ArgBuilder {
4286*387f9dfdSAndroid Build Coastguard Worker         public:
ArgBuilder(Arg * arg)4287*387f9dfdSAndroid Build Coastguard Worker             ArgBuilder( Arg* arg ) : m_arg( arg ) {}
4288*387f9dfdSAndroid Build Coastguard Worker 
4289*387f9dfdSAndroid Build Coastguard Worker             // Bind a non-boolean data member (requires placeholder string)
4290*387f9dfdSAndroid Build Coastguard Worker             template<typename C, typename M>
bind(M C::* field,std::string const & placeholder)4291*387f9dfdSAndroid Build Coastguard Worker             void bind( M C::* field, std::string const& placeholder ) {
4292*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundDataMember<C,M>( field );
4293*387f9dfdSAndroid Build Coastguard Worker                 m_arg->placeholder = placeholder;
4294*387f9dfdSAndroid Build Coastguard Worker             }
4295*387f9dfdSAndroid Build Coastguard Worker             // Bind a boolean data member (no placeholder required)
4296*387f9dfdSAndroid Build Coastguard Worker             template<typename C>
bind(bool C::* field)4297*387f9dfdSAndroid Build Coastguard Worker             void bind( bool C::* field ) {
4298*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );
4299*387f9dfdSAndroid Build Coastguard Worker             }
4300*387f9dfdSAndroid Build Coastguard Worker 
4301*387f9dfdSAndroid Build Coastguard Worker             // Bind a method taking a single, non-boolean argument (requires a placeholder string)
4302*387f9dfdSAndroid Build Coastguard Worker             template<typename C, typename M>
bind(void (C::* unaryMethod)(M),std::string const & placeholder)4303*387f9dfdSAndroid Build Coastguard Worker             void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {
4304*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );
4305*387f9dfdSAndroid Build Coastguard Worker                 m_arg->placeholder = placeholder;
4306*387f9dfdSAndroid Build Coastguard Worker             }
4307*387f9dfdSAndroid Build Coastguard Worker 
4308*387f9dfdSAndroid Build Coastguard Worker             // Bind a method taking a single, boolean argument (no placeholder string required)
4309*387f9dfdSAndroid Build Coastguard Worker             template<typename C>
bind(void (C::* unaryMethod)(bool))4310*387f9dfdSAndroid Build Coastguard Worker             void bind( void (C::* unaryMethod)( bool ) ) {
4311*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );
4312*387f9dfdSAndroid Build Coastguard Worker             }
4313*387f9dfdSAndroid Build Coastguard Worker 
4314*387f9dfdSAndroid Build Coastguard Worker             // Bind a method that takes no arguments (will be called if opt is present)
4315*387f9dfdSAndroid Build Coastguard Worker             template<typename C>
bind(void (C::* nullaryMethod)())4316*387f9dfdSAndroid Build Coastguard Worker             void bind( void (C::* nullaryMethod)() ) {
4317*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );
4318*387f9dfdSAndroid Build Coastguard Worker             }
4319*387f9dfdSAndroid Build Coastguard Worker 
4320*387f9dfdSAndroid Build Coastguard Worker             // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
4321*387f9dfdSAndroid Build Coastguard Worker             template<typename C>
bind(void (* unaryFunction)(C &))4322*387f9dfdSAndroid Build Coastguard Worker             void bind( void (* unaryFunction)( C& ) ) {
4323*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );
4324*387f9dfdSAndroid Build Coastguard Worker             }
4325*387f9dfdSAndroid Build Coastguard Worker 
4326*387f9dfdSAndroid Build Coastguard Worker             // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
4327*387f9dfdSAndroid Build Coastguard Worker             template<typename C, typename T>
bind(void (* binaryFunction)(C &,T),std::string const & placeholder)4328*387f9dfdSAndroid Build Coastguard Worker             void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {
4329*387f9dfdSAndroid Build Coastguard Worker                 m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );
4330*387f9dfdSAndroid Build Coastguard Worker                 m_arg->placeholder = placeholder;
4331*387f9dfdSAndroid Build Coastguard Worker             }
4332*387f9dfdSAndroid Build Coastguard Worker 
describe(std::string const & description)4333*387f9dfdSAndroid Build Coastguard Worker             ArgBuilder& describe( std::string const& description ) {
4334*387f9dfdSAndroid Build Coastguard Worker                 m_arg->description = description;
4335*387f9dfdSAndroid Build Coastguard Worker                 return *this;
4336*387f9dfdSAndroid Build Coastguard Worker             }
detail(std::string const & detail)4337*387f9dfdSAndroid Build Coastguard Worker             ArgBuilder& detail( std::string const& detail ) {
4338*387f9dfdSAndroid Build Coastguard Worker                 m_arg->detail = detail;
4339*387f9dfdSAndroid Build Coastguard Worker                 return *this;
4340*387f9dfdSAndroid Build Coastguard Worker             }
4341*387f9dfdSAndroid Build Coastguard Worker 
4342*387f9dfdSAndroid Build Coastguard Worker         protected:
4343*387f9dfdSAndroid Build Coastguard Worker             Arg* m_arg;
4344*387f9dfdSAndroid Build Coastguard Worker         };
4345*387f9dfdSAndroid Build Coastguard Worker 
4346*387f9dfdSAndroid Build Coastguard Worker         class OptBuilder : public ArgBuilder {
4347*387f9dfdSAndroid Build Coastguard Worker         public:
OptBuilder(Arg * arg)4348*387f9dfdSAndroid Build Coastguard Worker             OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}
OptBuilder(OptBuilder & other)4349*387f9dfdSAndroid Build Coastguard Worker             OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}
4350*387f9dfdSAndroid Build Coastguard Worker 
operator [](std::string const & optName)4351*387f9dfdSAndroid Build Coastguard Worker             OptBuilder& operator[]( std::string const& optName ) {
4352*387f9dfdSAndroid Build Coastguard Worker                 addOptName( *ArgBuilder::m_arg, optName );
4353*387f9dfdSAndroid Build Coastguard Worker                 return *this;
4354*387f9dfdSAndroid Build Coastguard Worker             }
4355*387f9dfdSAndroid Build Coastguard Worker         };
4356*387f9dfdSAndroid Build Coastguard Worker 
4357*387f9dfdSAndroid Build Coastguard Worker     public:
4358*387f9dfdSAndroid Build Coastguard Worker 
CommandLine()4359*387f9dfdSAndroid Build Coastguard Worker         CommandLine()
4360*387f9dfdSAndroid Build Coastguard Worker         :   m_boundProcessName( new Detail::NullBinder<ConfigT>() ),
4361*387f9dfdSAndroid Build Coastguard Worker             m_highestSpecifiedArgPosition( 0 ),
4362*387f9dfdSAndroid Build Coastguard Worker             m_throwOnUnrecognisedTokens( false )
4363*387f9dfdSAndroid Build Coastguard Worker         {}
CommandLine(CommandLine const & other)4364*387f9dfdSAndroid Build Coastguard Worker         CommandLine( CommandLine const& other )
4365*387f9dfdSAndroid Build Coastguard Worker         :   m_boundProcessName( other.m_boundProcessName ),
4366*387f9dfdSAndroid Build Coastguard Worker             m_options ( other.m_options ),
4367*387f9dfdSAndroid Build Coastguard Worker             m_positionalArgs( other.m_positionalArgs ),
4368*387f9dfdSAndroid Build Coastguard Worker             m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),
4369*387f9dfdSAndroid Build Coastguard Worker             m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )
4370*387f9dfdSAndroid Build Coastguard Worker         {
4371*387f9dfdSAndroid Build Coastguard Worker             if( other.m_floatingArg.get() )
4372*387f9dfdSAndroid Build Coastguard Worker                 m_floatingArg.reset( new Arg( *other.m_floatingArg ) );
4373*387f9dfdSAndroid Build Coastguard Worker         }
4374*387f9dfdSAndroid Build Coastguard Worker 
setThrowOnUnrecognisedTokens(bool shouldThrow=true)4375*387f9dfdSAndroid Build Coastguard Worker         CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {
4376*387f9dfdSAndroid Build Coastguard Worker             m_throwOnUnrecognisedTokens = shouldThrow;
4377*387f9dfdSAndroid Build Coastguard Worker             return *this;
4378*387f9dfdSAndroid Build Coastguard Worker         }
4379*387f9dfdSAndroid Build Coastguard Worker 
operator [](std::string const & optName)4380*387f9dfdSAndroid Build Coastguard Worker         OptBuilder operator[]( std::string const& optName ) {
4381*387f9dfdSAndroid Build Coastguard Worker             m_options.push_back( Arg() );
4382*387f9dfdSAndroid Build Coastguard Worker             addOptName( m_options.back(), optName );
4383*387f9dfdSAndroid Build Coastguard Worker             OptBuilder builder( &m_options.back() );
4384*387f9dfdSAndroid Build Coastguard Worker             return builder;
4385*387f9dfdSAndroid Build Coastguard Worker         }
4386*387f9dfdSAndroid Build Coastguard Worker 
operator [](int position)4387*387f9dfdSAndroid Build Coastguard Worker         ArgBuilder operator[]( int position ) {
4388*387f9dfdSAndroid Build Coastguard Worker             m_positionalArgs.insert( std::make_pair( position, Arg() ) );
4389*387f9dfdSAndroid Build Coastguard Worker             if( position > m_highestSpecifiedArgPosition )
4390*387f9dfdSAndroid Build Coastguard Worker                 m_highestSpecifiedArgPosition = position;
4391*387f9dfdSAndroid Build Coastguard Worker             setPositionalArg( m_positionalArgs[position], position );
4392*387f9dfdSAndroid Build Coastguard Worker             ArgBuilder builder( &m_positionalArgs[position] );
4393*387f9dfdSAndroid Build Coastguard Worker             return builder;
4394*387f9dfdSAndroid Build Coastguard Worker         }
4395*387f9dfdSAndroid Build Coastguard Worker 
4396*387f9dfdSAndroid Build Coastguard Worker         // Invoke this with the _ instance
operator [](UnpositionalTag)4397*387f9dfdSAndroid Build Coastguard Worker         ArgBuilder operator[]( UnpositionalTag ) {
4398*387f9dfdSAndroid Build Coastguard Worker             if( m_floatingArg.get() )
4399*387f9dfdSAndroid Build Coastguard Worker                 throw std::logic_error( "Only one unpositional argument can be added" );
4400*387f9dfdSAndroid Build Coastguard Worker             m_floatingArg.reset( new Arg() );
4401*387f9dfdSAndroid Build Coastguard Worker             ArgBuilder builder( m_floatingArg.get() );
4402*387f9dfdSAndroid Build Coastguard Worker             return builder;
4403*387f9dfdSAndroid Build Coastguard Worker         }
4404*387f9dfdSAndroid Build Coastguard Worker 
4405*387f9dfdSAndroid Build Coastguard Worker         template<typename C, typename M>
bindProcessName(M C::* field)4406*387f9dfdSAndroid Build Coastguard Worker         void bindProcessName( M C::* field ) {
4407*387f9dfdSAndroid Build Coastguard Worker             m_boundProcessName = new Detail::BoundDataMember<C,M>( field );
4408*387f9dfdSAndroid Build Coastguard Worker         }
4409*387f9dfdSAndroid Build Coastguard Worker         template<typename C, typename M>
bindProcessName(void (C::* _unaryMethod)(M))4410*387f9dfdSAndroid Build Coastguard Worker         void bindProcessName( void (C::*_unaryMethod)( M ) ) {
4411*387f9dfdSAndroid Build Coastguard Worker             m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );
4412*387f9dfdSAndroid Build Coastguard Worker         }
4413*387f9dfdSAndroid Build Coastguard Worker 
optUsage(std::ostream & os,std::size_t indent=0,std::size_t width=Detail::consoleWidth) const4414*387f9dfdSAndroid Build Coastguard Worker         void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {
4415*387f9dfdSAndroid Build Coastguard Worker             typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;
4416*387f9dfdSAndroid Build Coastguard Worker             std::size_t maxWidth = 0;
4417*387f9dfdSAndroid Build Coastguard Worker             for( it = itBegin; it != itEnd; ++it )
4418*387f9dfdSAndroid Build Coastguard Worker                 maxWidth = (std::max)( maxWidth, it->commands().size() );
4419*387f9dfdSAndroid Build Coastguard Worker 
4420*387f9dfdSAndroid Build Coastguard Worker             for( it = itBegin; it != itEnd; ++it ) {
4421*387f9dfdSAndroid Build Coastguard Worker                 Detail::Text usage( it->commands(), Detail::TextAttributes()
4422*387f9dfdSAndroid Build Coastguard Worker                                                         .setWidth( maxWidth+indent )
4423*387f9dfdSAndroid Build Coastguard Worker                                                         .setIndent( indent ) );
4424*387f9dfdSAndroid Build Coastguard Worker                 Detail::Text desc( it->description, Detail::TextAttributes()
4425*387f9dfdSAndroid Build Coastguard Worker                                                         .setWidth( width - maxWidth - 3 ) );
4426*387f9dfdSAndroid Build Coastguard Worker 
4427*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {
4428*387f9dfdSAndroid Build Coastguard Worker                     std::string usageCol = i < usage.size() ? usage[i] : "";
4429*387f9dfdSAndroid Build Coastguard Worker                     os << usageCol;
4430*387f9dfdSAndroid Build Coastguard Worker 
4431*387f9dfdSAndroid Build Coastguard Worker                     if( i < desc.size() && !desc[i].empty() )
4432*387f9dfdSAndroid Build Coastguard Worker                         os  << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' )
4433*387f9dfdSAndroid Build Coastguard Worker                             << desc[i];
4434*387f9dfdSAndroid Build Coastguard Worker                     os << "\n";
4435*387f9dfdSAndroid Build Coastguard Worker                 }
4436*387f9dfdSAndroid Build Coastguard Worker             }
4437*387f9dfdSAndroid Build Coastguard Worker         }
optUsage() const4438*387f9dfdSAndroid Build Coastguard Worker         std::string optUsage() const {
4439*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
4440*387f9dfdSAndroid Build Coastguard Worker             optUsage( oss );
4441*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
4442*387f9dfdSAndroid Build Coastguard Worker         }
4443*387f9dfdSAndroid Build Coastguard Worker 
argSynopsis(std::ostream & os) const4444*387f9dfdSAndroid Build Coastguard Worker         void argSynopsis( std::ostream& os ) const {
4445*387f9dfdSAndroid Build Coastguard Worker             for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) {
4446*387f9dfdSAndroid Build Coastguard Worker                 if( i > 1 )
4447*387f9dfdSAndroid Build Coastguard Worker                     os << " ";
4448*387f9dfdSAndroid Build Coastguard Worker                 typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
4449*387f9dfdSAndroid Build Coastguard Worker                 if( it != m_positionalArgs.end() )
4450*387f9dfdSAndroid Build Coastguard Worker                     os << "<" << it->second.placeholder << ">";
4451*387f9dfdSAndroid Build Coastguard Worker                 else if( m_floatingArg.get() )
4452*387f9dfdSAndroid Build Coastguard Worker                     os << "<" << m_floatingArg->placeholder << ">";
4453*387f9dfdSAndroid Build Coastguard Worker                 else
4454*387f9dfdSAndroid Build Coastguard Worker                     throw std::logic_error( "non consecutive positional arguments with no floating args" );
4455*387f9dfdSAndroid Build Coastguard Worker             }
4456*387f9dfdSAndroid Build Coastguard Worker             // !TBD No indication of mandatory args
4457*387f9dfdSAndroid Build Coastguard Worker             if( m_floatingArg.get() ) {
4458*387f9dfdSAndroid Build Coastguard Worker                 if( m_highestSpecifiedArgPosition > 1 )
4459*387f9dfdSAndroid Build Coastguard Worker                     os << " ";
4460*387f9dfdSAndroid Build Coastguard Worker                 os << "[<" << m_floatingArg->placeholder << "> ...]";
4461*387f9dfdSAndroid Build Coastguard Worker             }
4462*387f9dfdSAndroid Build Coastguard Worker         }
argSynopsis() const4463*387f9dfdSAndroid Build Coastguard Worker         std::string argSynopsis() const {
4464*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
4465*387f9dfdSAndroid Build Coastguard Worker             argSynopsis( oss );
4466*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
4467*387f9dfdSAndroid Build Coastguard Worker         }
4468*387f9dfdSAndroid Build Coastguard Worker 
usage(std::ostream & os,std::string const & procName) const4469*387f9dfdSAndroid Build Coastguard Worker         void usage( std::ostream& os, std::string const& procName ) const {
4470*387f9dfdSAndroid Build Coastguard Worker             validate();
4471*387f9dfdSAndroid Build Coastguard Worker             os << "usage:\n  " << procName << " ";
4472*387f9dfdSAndroid Build Coastguard Worker             argSynopsis( os );
4473*387f9dfdSAndroid Build Coastguard Worker             if( !m_options.empty() ) {
4474*387f9dfdSAndroid Build Coastguard Worker                 os << " [options]\n\nwhere options are: \n";
4475*387f9dfdSAndroid Build Coastguard Worker                 optUsage( os, 2 );
4476*387f9dfdSAndroid Build Coastguard Worker             }
4477*387f9dfdSAndroid Build Coastguard Worker             os << "\n";
4478*387f9dfdSAndroid Build Coastguard Worker         }
usage(std::string const & procName) const4479*387f9dfdSAndroid Build Coastguard Worker         std::string usage( std::string const& procName ) const {
4480*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
4481*387f9dfdSAndroid Build Coastguard Worker             usage( oss, procName );
4482*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
4483*387f9dfdSAndroid Build Coastguard Worker         }
4484*387f9dfdSAndroid Build Coastguard Worker 
parse(int argc,char const * const argv[]) const4485*387f9dfdSAndroid Build Coastguard Worker         ConfigT parse( int argc, char const* const argv[] ) const {
4486*387f9dfdSAndroid Build Coastguard Worker             ConfigT config;
4487*387f9dfdSAndroid Build Coastguard Worker             parseInto( argc, argv, config );
4488*387f9dfdSAndroid Build Coastguard Worker             return config;
4489*387f9dfdSAndroid Build Coastguard Worker         }
4490*387f9dfdSAndroid Build Coastguard Worker 
parseInto(int argc,char const * argv[],ConfigT & config) const4491*387f9dfdSAndroid Build Coastguard Worker         std::vector<Parser::Token> parseInto( int argc, char const* argv[], ConfigT& config ) const {
4492*387f9dfdSAndroid Build Coastguard Worker             std::string processName = argv[0];
4493*387f9dfdSAndroid Build Coastguard Worker             std::size_t lastSlash = processName.find_last_of( "/\\" );
4494*387f9dfdSAndroid Build Coastguard Worker             if( lastSlash != std::string::npos )
4495*387f9dfdSAndroid Build Coastguard Worker                 processName = processName.substr( lastSlash+1 );
4496*387f9dfdSAndroid Build Coastguard Worker             m_boundProcessName.set( config, processName );
4497*387f9dfdSAndroid Build Coastguard Worker             std::vector<Parser::Token> tokens;
4498*387f9dfdSAndroid Build Coastguard Worker             Parser parser;
4499*387f9dfdSAndroid Build Coastguard Worker             parser.parseIntoTokens( argc, argv, tokens );
4500*387f9dfdSAndroid Build Coastguard Worker             return populate( tokens, config );
4501*387f9dfdSAndroid Build Coastguard Worker         }
4502*387f9dfdSAndroid Build Coastguard Worker 
populate(std::vector<Parser::Token> const & tokens,ConfigT & config) const4503*387f9dfdSAndroid Build Coastguard Worker         std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
4504*387f9dfdSAndroid Build Coastguard Worker             validate();
4505*387f9dfdSAndroid Build Coastguard Worker             std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
4506*387f9dfdSAndroid Build Coastguard Worker             unusedTokens = populateFixedArgs( unusedTokens, config );
4507*387f9dfdSAndroid Build Coastguard Worker             unusedTokens = populateFloatingArgs( unusedTokens, config );
4508*387f9dfdSAndroid Build Coastguard Worker             return unusedTokens;
4509*387f9dfdSAndroid Build Coastguard Worker         }
4510*387f9dfdSAndroid Build Coastguard Worker 
populateOptions(std::vector<Parser::Token> const & tokens,ConfigT & config) const4511*387f9dfdSAndroid Build Coastguard Worker         std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
4512*387f9dfdSAndroid Build Coastguard Worker             std::vector<Parser::Token> unusedTokens;
4513*387f9dfdSAndroid Build Coastguard Worker             std::vector<std::string> errors;
4514*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < tokens.size(); ++i ) {
4515*387f9dfdSAndroid Build Coastguard Worker                 Parser::Token const& token = tokens[i];
4516*387f9dfdSAndroid Build Coastguard Worker                 typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();
4517*387f9dfdSAndroid Build Coastguard Worker                 for(; it != itEnd; ++it ) {
4518*387f9dfdSAndroid Build Coastguard Worker                     Arg const& arg = *it;
4519*387f9dfdSAndroid Build Coastguard Worker 
4520*387f9dfdSAndroid Build Coastguard Worker                     try {
4521*387f9dfdSAndroid Build Coastguard Worker                         if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) ||
4522*387f9dfdSAndroid Build Coastguard Worker                             ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) {
4523*387f9dfdSAndroid Build Coastguard Worker                             if( arg.takesArg() ) {
4524*387f9dfdSAndroid Build Coastguard Worker                                 if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional )
4525*387f9dfdSAndroid Build Coastguard Worker                                     errors.push_back( "Expected argument to option: " + token.data );
4526*387f9dfdSAndroid Build Coastguard Worker                                 else
4527*387f9dfdSAndroid Build Coastguard Worker                                     arg.boundField.set( config, tokens[++i].data );
4528*387f9dfdSAndroid Build Coastguard Worker                             }
4529*387f9dfdSAndroid Build Coastguard Worker                             else {
4530*387f9dfdSAndroid Build Coastguard Worker                                 arg.boundField.setFlag( config );
4531*387f9dfdSAndroid Build Coastguard Worker                             }
4532*387f9dfdSAndroid Build Coastguard Worker                             break;
4533*387f9dfdSAndroid Build Coastguard Worker                         }
4534*387f9dfdSAndroid Build Coastguard Worker                     }
4535*387f9dfdSAndroid Build Coastguard Worker                     catch( std::exception& ex ) {
4536*387f9dfdSAndroid Build Coastguard Worker                         errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" );
4537*387f9dfdSAndroid Build Coastguard Worker                     }
4538*387f9dfdSAndroid Build Coastguard Worker                 }
4539*387f9dfdSAndroid Build Coastguard Worker                 if( it == itEnd ) {
4540*387f9dfdSAndroid Build Coastguard Worker                     if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens )
4541*387f9dfdSAndroid Build Coastguard Worker                         unusedTokens.push_back( token );
4542*387f9dfdSAndroid Build Coastguard Worker                     else if( errors.empty() && m_throwOnUnrecognisedTokens )
4543*387f9dfdSAndroid Build Coastguard Worker                         errors.push_back( "unrecognised option: " + token.data );
4544*387f9dfdSAndroid Build Coastguard Worker                 }
4545*387f9dfdSAndroid Build Coastguard Worker             }
4546*387f9dfdSAndroid Build Coastguard Worker             if( !errors.empty() ) {
4547*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
4548*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end();
4549*387f9dfdSAndroid Build Coastguard Worker                         it != itEnd;
4550*387f9dfdSAndroid Build Coastguard Worker                         ++it ) {
4551*387f9dfdSAndroid Build Coastguard Worker                     if( it != errors.begin() )
4552*387f9dfdSAndroid Build Coastguard Worker                         oss << "\n";
4553*387f9dfdSAndroid Build Coastguard Worker                     oss << *it;
4554*387f9dfdSAndroid Build Coastguard Worker                 }
4555*387f9dfdSAndroid Build Coastguard Worker                 throw std::runtime_error( oss.str() );
4556*387f9dfdSAndroid Build Coastguard Worker             }
4557*387f9dfdSAndroid Build Coastguard Worker             return unusedTokens;
4558*387f9dfdSAndroid Build Coastguard Worker         }
populateFixedArgs(std::vector<Parser::Token> const & tokens,ConfigT & config) const4559*387f9dfdSAndroid Build Coastguard Worker         std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
4560*387f9dfdSAndroid Build Coastguard Worker             std::vector<Parser::Token> unusedTokens;
4561*387f9dfdSAndroid Build Coastguard Worker             int position = 1;
4562*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < tokens.size(); ++i ) {
4563*387f9dfdSAndroid Build Coastguard Worker                 Parser::Token const& token = tokens[i];
4564*387f9dfdSAndroid Build Coastguard Worker                 typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position );
4565*387f9dfdSAndroid Build Coastguard Worker                 if( it != m_positionalArgs.end() )
4566*387f9dfdSAndroid Build Coastguard Worker                     it->second.boundField.set( config, token.data );
4567*387f9dfdSAndroid Build Coastguard Worker                 else
4568*387f9dfdSAndroid Build Coastguard Worker                     unusedTokens.push_back( token );
4569*387f9dfdSAndroid Build Coastguard Worker                 if( token.type == Parser::Token::Positional )
4570*387f9dfdSAndroid Build Coastguard Worker                     position++;
4571*387f9dfdSAndroid Build Coastguard Worker             }
4572*387f9dfdSAndroid Build Coastguard Worker             return unusedTokens;
4573*387f9dfdSAndroid Build Coastguard Worker         }
populateFloatingArgs(std::vector<Parser::Token> const & tokens,ConfigT & config) const4574*387f9dfdSAndroid Build Coastguard Worker         std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
4575*387f9dfdSAndroid Build Coastguard Worker             if( !m_floatingArg.get() )
4576*387f9dfdSAndroid Build Coastguard Worker                 return tokens;
4577*387f9dfdSAndroid Build Coastguard Worker             std::vector<Parser::Token> unusedTokens;
4578*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < tokens.size(); ++i ) {
4579*387f9dfdSAndroid Build Coastguard Worker                 Parser::Token const& token = tokens[i];
4580*387f9dfdSAndroid Build Coastguard Worker                 if( token.type == Parser::Token::Positional )
4581*387f9dfdSAndroid Build Coastguard Worker                     m_floatingArg->boundField.set( config, token.data );
4582*387f9dfdSAndroid Build Coastguard Worker                 else
4583*387f9dfdSAndroid Build Coastguard Worker                     unusedTokens.push_back( token );
4584*387f9dfdSAndroid Build Coastguard Worker             }
4585*387f9dfdSAndroid Build Coastguard Worker             return unusedTokens;
4586*387f9dfdSAndroid Build Coastguard Worker         }
4587*387f9dfdSAndroid Build Coastguard Worker 
validate() const4588*387f9dfdSAndroid Build Coastguard Worker         void validate() const
4589*387f9dfdSAndroid Build Coastguard Worker         {
4590*387f9dfdSAndroid Build Coastguard Worker             if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )
4591*387f9dfdSAndroid Build Coastguard Worker                 throw std::logic_error( "No options or arguments specified" );
4592*387f9dfdSAndroid Build Coastguard Worker 
4593*387f9dfdSAndroid Build Coastguard Worker             for( typename std::vector<Arg>::const_iterator  it = m_options.begin(),
4594*387f9dfdSAndroid Build Coastguard Worker                                                             itEnd = m_options.end();
4595*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd; ++it )
4596*387f9dfdSAndroid Build Coastguard Worker                 it->validate();
4597*387f9dfdSAndroid Build Coastguard Worker         }
4598*387f9dfdSAndroid Build Coastguard Worker 
4599*387f9dfdSAndroid Build Coastguard Worker     private:
4600*387f9dfdSAndroid Build Coastguard Worker         Detail::BoundArgFunction<ConfigT> m_boundProcessName;
4601*387f9dfdSAndroid Build Coastguard Worker         std::vector<Arg> m_options;
4602*387f9dfdSAndroid Build Coastguard Worker         std::map<int, Arg> m_positionalArgs;
4603*387f9dfdSAndroid Build Coastguard Worker         ArgAutoPtr m_floatingArg;
4604*387f9dfdSAndroid Build Coastguard Worker         int m_highestSpecifiedArgPosition;
4605*387f9dfdSAndroid Build Coastguard Worker         bool m_throwOnUnrecognisedTokens;
4606*387f9dfdSAndroid Build Coastguard Worker     };
4607*387f9dfdSAndroid Build Coastguard Worker 
4608*387f9dfdSAndroid Build Coastguard Worker } // end namespace Clara
4609*387f9dfdSAndroid Build Coastguard Worker 
4610*387f9dfdSAndroid Build Coastguard Worker STITCH_CLARA_CLOSE_NAMESPACE
4611*387f9dfdSAndroid Build Coastguard Worker #undef STITCH_CLARA_OPEN_NAMESPACE
4612*387f9dfdSAndroid Build Coastguard Worker #undef STITCH_CLARA_CLOSE_NAMESPACE
4613*387f9dfdSAndroid Build Coastguard Worker 
4614*387f9dfdSAndroid Build Coastguard Worker #endif // TWOBLUECUBES_CLARA_H_INCLUDED
4615*387f9dfdSAndroid Build Coastguard Worker #undef STITCH_CLARA_OPEN_NAMESPACE
4616*387f9dfdSAndroid Build Coastguard Worker 
4617*387f9dfdSAndroid Build Coastguard Worker // Restore Clara's value for console width, if present
4618*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
4619*387f9dfdSAndroid Build Coastguard Worker #define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
4620*387f9dfdSAndroid Build Coastguard Worker #undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
4621*387f9dfdSAndroid Build Coastguard Worker #endif
4622*387f9dfdSAndroid Build Coastguard Worker 
4623*387f9dfdSAndroid Build Coastguard Worker #include <fstream>
4624*387f9dfdSAndroid Build Coastguard Worker 
4625*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
4626*387f9dfdSAndroid Build Coastguard Worker 
abortAfterFirst(ConfigData & config)4627*387f9dfdSAndroid Build Coastguard Worker     inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; }
abortAfterX(ConfigData & config,int x)4628*387f9dfdSAndroid Build Coastguard Worker     inline void abortAfterX( ConfigData& config, int x ) {
4629*387f9dfdSAndroid Build Coastguard Worker         if( x < 1 )
4630*387f9dfdSAndroid Build Coastguard Worker             throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" );
4631*387f9dfdSAndroid Build Coastguard Worker         config.abortAfter = x;
4632*387f9dfdSAndroid Build Coastguard Worker     }
addTestOrTags(ConfigData & config,std::string const & _testSpec)4633*387f9dfdSAndroid Build Coastguard Worker     inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }
addReporterName(ConfigData & config,std::string const & _reporterName)4634*387f9dfdSAndroid Build Coastguard Worker     inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); }
4635*387f9dfdSAndroid Build Coastguard Worker 
addWarning(ConfigData & config,std::string const & _warning)4636*387f9dfdSAndroid Build Coastguard Worker     inline void addWarning( ConfigData& config, std::string const& _warning ) {
4637*387f9dfdSAndroid Build Coastguard Worker         if( _warning == "NoAssertions" )
4638*387f9dfdSAndroid Build Coastguard Worker             config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions );
4639*387f9dfdSAndroid Build Coastguard Worker         else
4640*387f9dfdSAndroid Build Coastguard Worker             throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" );
4641*387f9dfdSAndroid Build Coastguard Worker     }
setOrder(ConfigData & config,std::string const & order)4642*387f9dfdSAndroid Build Coastguard Worker     inline void setOrder( ConfigData& config, std::string const& order ) {
4643*387f9dfdSAndroid Build Coastguard Worker         if( startsWith( "declared", order ) )
4644*387f9dfdSAndroid Build Coastguard Worker             config.runOrder = RunTests::InDeclarationOrder;
4645*387f9dfdSAndroid Build Coastguard Worker         else if( startsWith( "lexical", order ) )
4646*387f9dfdSAndroid Build Coastguard Worker             config.runOrder = RunTests::InLexicographicalOrder;
4647*387f9dfdSAndroid Build Coastguard Worker         else if( startsWith( "random", order ) )
4648*387f9dfdSAndroid Build Coastguard Worker             config.runOrder = RunTests::InRandomOrder;
4649*387f9dfdSAndroid Build Coastguard Worker         else
4650*387f9dfdSAndroid Build Coastguard Worker             throw std::runtime_error( "Unrecognised ordering: '" + order + "'" );
4651*387f9dfdSAndroid Build Coastguard Worker     }
setRngSeed(ConfigData & config,std::string const & seed)4652*387f9dfdSAndroid Build Coastguard Worker     inline void setRngSeed( ConfigData& config, std::string const& seed ) {
4653*387f9dfdSAndroid Build Coastguard Worker         if( seed == "time" ) {
4654*387f9dfdSAndroid Build Coastguard Worker             config.rngSeed = static_cast<unsigned int>( std::time(0) );
4655*387f9dfdSAndroid Build Coastguard Worker         }
4656*387f9dfdSAndroid Build Coastguard Worker         else {
4657*387f9dfdSAndroid Build Coastguard Worker             std::stringstream ss;
4658*387f9dfdSAndroid Build Coastguard Worker             ss << seed;
4659*387f9dfdSAndroid Build Coastguard Worker             ss >> config.rngSeed;
4660*387f9dfdSAndroid Build Coastguard Worker             if( ss.fail() )
4661*387f9dfdSAndroid Build Coastguard Worker                 throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" );
4662*387f9dfdSAndroid Build Coastguard Worker         }
4663*387f9dfdSAndroid Build Coastguard Worker     }
setVerbosity(ConfigData & config,int level)4664*387f9dfdSAndroid Build Coastguard Worker     inline void setVerbosity( ConfigData& config, int level ) {
4665*387f9dfdSAndroid Build Coastguard Worker         // !TBD: accept strings?
4666*387f9dfdSAndroid Build Coastguard Worker         config.verbosity = static_cast<Verbosity::Level>( level );
4667*387f9dfdSAndroid Build Coastguard Worker     }
setShowDurations(ConfigData & config,bool _showDurations)4668*387f9dfdSAndroid Build Coastguard Worker     inline void setShowDurations( ConfigData& config, bool _showDurations ) {
4669*387f9dfdSAndroid Build Coastguard Worker         config.showDurations = _showDurations
4670*387f9dfdSAndroid Build Coastguard Worker             ? ShowDurations::Always
4671*387f9dfdSAndroid Build Coastguard Worker             : ShowDurations::Never;
4672*387f9dfdSAndroid Build Coastguard Worker     }
setUseColour(ConfigData & config,std::string const & value)4673*387f9dfdSAndroid Build Coastguard Worker     inline void setUseColour( ConfigData& config, std::string const& value ) {
4674*387f9dfdSAndroid Build Coastguard Worker         std::string mode = toLower( value );
4675*387f9dfdSAndroid Build Coastguard Worker 
4676*387f9dfdSAndroid Build Coastguard Worker         if( mode == "yes" )
4677*387f9dfdSAndroid Build Coastguard Worker             config.useColour = UseColour::Yes;
4678*387f9dfdSAndroid Build Coastguard Worker         else if( mode == "no" )
4679*387f9dfdSAndroid Build Coastguard Worker             config.useColour = UseColour::No;
4680*387f9dfdSAndroid Build Coastguard Worker         else if( mode == "auto" )
4681*387f9dfdSAndroid Build Coastguard Worker             config.useColour = UseColour::Auto;
4682*387f9dfdSAndroid Build Coastguard Worker         else
4683*387f9dfdSAndroid Build Coastguard Worker             throw std::runtime_error( "colour mode must be one of: auto, yes or no" );
4684*387f9dfdSAndroid Build Coastguard Worker     }
forceColour(ConfigData & config)4685*387f9dfdSAndroid Build Coastguard Worker     inline void forceColour( ConfigData& config ) {
4686*387f9dfdSAndroid Build Coastguard Worker         config.useColour = UseColour::Yes;
4687*387f9dfdSAndroid Build Coastguard Worker     }
loadTestNamesFromFile(ConfigData & config,std::string const & _filename)4688*387f9dfdSAndroid Build Coastguard Worker     inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {
4689*387f9dfdSAndroid Build Coastguard Worker         std::ifstream f( _filename.c_str() );
4690*387f9dfdSAndroid Build Coastguard Worker         if( !f.is_open() )
4691*387f9dfdSAndroid Build Coastguard Worker             throw std::domain_error( "Unable to load input file: " + _filename );
4692*387f9dfdSAndroid Build Coastguard Worker 
4693*387f9dfdSAndroid Build Coastguard Worker         std::string line;
4694*387f9dfdSAndroid Build Coastguard Worker         while( std::getline( f, line ) ) {
4695*387f9dfdSAndroid Build Coastguard Worker             line = trim(line);
4696*387f9dfdSAndroid Build Coastguard Worker             if( !line.empty() && !startsWith( line, "#" ) )
4697*387f9dfdSAndroid Build Coastguard Worker                 addTestOrTags( config, "\"" + line + "\"," );
4698*387f9dfdSAndroid Build Coastguard Worker         }
4699*387f9dfdSAndroid Build Coastguard Worker     }
4700*387f9dfdSAndroid Build Coastguard Worker 
makeCommandLineParser()4701*387f9dfdSAndroid Build Coastguard Worker     inline Clara::CommandLine<ConfigData> makeCommandLineParser() {
4702*387f9dfdSAndroid Build Coastguard Worker 
4703*387f9dfdSAndroid Build Coastguard Worker         using namespace Clara;
4704*387f9dfdSAndroid Build Coastguard Worker         CommandLine<ConfigData> cli;
4705*387f9dfdSAndroid Build Coastguard Worker 
4706*387f9dfdSAndroid Build Coastguard Worker         cli.bindProcessName( &ConfigData::processName );
4707*387f9dfdSAndroid Build Coastguard Worker 
4708*387f9dfdSAndroid Build Coastguard Worker         cli["-?"]["-h"]["--help"]
4709*387f9dfdSAndroid Build Coastguard Worker             .describe( "display usage information" )
4710*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::showHelp );
4711*387f9dfdSAndroid Build Coastguard Worker 
4712*387f9dfdSAndroid Build Coastguard Worker         cli["-l"]["--list-tests"]
4713*387f9dfdSAndroid Build Coastguard Worker             .describe( "list all/matching test cases" )
4714*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::listTests );
4715*387f9dfdSAndroid Build Coastguard Worker 
4716*387f9dfdSAndroid Build Coastguard Worker         cli["-t"]["--list-tags"]
4717*387f9dfdSAndroid Build Coastguard Worker             .describe( "list all/matching tags" )
4718*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::listTags );
4719*387f9dfdSAndroid Build Coastguard Worker 
4720*387f9dfdSAndroid Build Coastguard Worker         cli["-s"]["--success"]
4721*387f9dfdSAndroid Build Coastguard Worker             .describe( "include successful tests in output" )
4722*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::showSuccessfulTests );
4723*387f9dfdSAndroid Build Coastguard Worker 
4724*387f9dfdSAndroid Build Coastguard Worker         cli["-b"]["--break"]
4725*387f9dfdSAndroid Build Coastguard Worker             .describe( "break into debugger on failure" )
4726*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::shouldDebugBreak );
4727*387f9dfdSAndroid Build Coastguard Worker 
4728*387f9dfdSAndroid Build Coastguard Worker         cli["-e"]["--nothrow"]
4729*387f9dfdSAndroid Build Coastguard Worker             .describe( "skip exception tests" )
4730*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::noThrow );
4731*387f9dfdSAndroid Build Coastguard Worker 
4732*387f9dfdSAndroid Build Coastguard Worker         cli["-i"]["--invisibles"]
4733*387f9dfdSAndroid Build Coastguard Worker             .describe( "show invisibles (tabs, newlines)" )
4734*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::showInvisibles );
4735*387f9dfdSAndroid Build Coastguard Worker 
4736*387f9dfdSAndroid Build Coastguard Worker         cli["-o"]["--out"]
4737*387f9dfdSAndroid Build Coastguard Worker             .describe( "output filename" )
4738*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::outputFilename, "filename" );
4739*387f9dfdSAndroid Build Coastguard Worker 
4740*387f9dfdSAndroid Build Coastguard Worker         cli["-r"]["--reporter"]
4741*387f9dfdSAndroid Build Coastguard Worker //            .placeholder( "name[:filename]" )
4742*387f9dfdSAndroid Build Coastguard Worker             .describe( "reporter to use (defaults to console)" )
4743*387f9dfdSAndroid Build Coastguard Worker             .bind( &addReporterName, "name" );
4744*387f9dfdSAndroid Build Coastguard Worker 
4745*387f9dfdSAndroid Build Coastguard Worker         cli["-n"]["--name"]
4746*387f9dfdSAndroid Build Coastguard Worker             .describe( "suite name" )
4747*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::name, "name" );
4748*387f9dfdSAndroid Build Coastguard Worker 
4749*387f9dfdSAndroid Build Coastguard Worker         cli["-a"]["--abort"]
4750*387f9dfdSAndroid Build Coastguard Worker             .describe( "abort at first failure" )
4751*387f9dfdSAndroid Build Coastguard Worker             .bind( &abortAfterFirst );
4752*387f9dfdSAndroid Build Coastguard Worker 
4753*387f9dfdSAndroid Build Coastguard Worker         cli["-x"]["--abortx"]
4754*387f9dfdSAndroid Build Coastguard Worker             .describe( "abort after x failures" )
4755*387f9dfdSAndroid Build Coastguard Worker             .bind( &abortAfterX, "no. failures" );
4756*387f9dfdSAndroid Build Coastguard Worker 
4757*387f9dfdSAndroid Build Coastguard Worker         cli["-w"]["--warn"]
4758*387f9dfdSAndroid Build Coastguard Worker             .describe( "enable warnings" )
4759*387f9dfdSAndroid Build Coastguard Worker             .bind( &addWarning, "warning name" );
4760*387f9dfdSAndroid Build Coastguard Worker 
4761*387f9dfdSAndroid Build Coastguard Worker // - needs updating if reinstated
4762*387f9dfdSAndroid Build Coastguard Worker //        cli.into( &setVerbosity )
4763*387f9dfdSAndroid Build Coastguard Worker //            .describe( "level of verbosity (0=no output)" )
4764*387f9dfdSAndroid Build Coastguard Worker //            .shortOpt( "v")
4765*387f9dfdSAndroid Build Coastguard Worker //            .longOpt( "verbosity" )
4766*387f9dfdSAndroid Build Coastguard Worker //            .placeholder( "level" );
4767*387f9dfdSAndroid Build Coastguard Worker 
4768*387f9dfdSAndroid Build Coastguard Worker         cli[_]
4769*387f9dfdSAndroid Build Coastguard Worker             .describe( "which test or tests to use" )
4770*387f9dfdSAndroid Build Coastguard Worker             .bind( &addTestOrTags, "test name, pattern or tags" );
4771*387f9dfdSAndroid Build Coastguard Worker 
4772*387f9dfdSAndroid Build Coastguard Worker         cli["-d"]["--durations"]
4773*387f9dfdSAndroid Build Coastguard Worker             .describe( "show test durations" )
4774*387f9dfdSAndroid Build Coastguard Worker             .bind( &setShowDurations, "yes|no" );
4775*387f9dfdSAndroid Build Coastguard Worker 
4776*387f9dfdSAndroid Build Coastguard Worker         cli["-f"]["--input-file"]
4777*387f9dfdSAndroid Build Coastguard Worker             .describe( "load test names to run from a file" )
4778*387f9dfdSAndroid Build Coastguard Worker             .bind( &loadTestNamesFromFile, "filename" );
4779*387f9dfdSAndroid Build Coastguard Worker 
4780*387f9dfdSAndroid Build Coastguard Worker         cli["-#"]["--filenames-as-tags"]
4781*387f9dfdSAndroid Build Coastguard Worker             .describe( "adds a tag for the filename" )
4782*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::filenamesAsTags );
4783*387f9dfdSAndroid Build Coastguard Worker 
4784*387f9dfdSAndroid Build Coastguard Worker         // Less common commands which don't have a short form
4785*387f9dfdSAndroid Build Coastguard Worker         cli["--list-test-names-only"]
4786*387f9dfdSAndroid Build Coastguard Worker             .describe( "list all/matching test cases names only" )
4787*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::listTestNamesOnly );
4788*387f9dfdSAndroid Build Coastguard Worker 
4789*387f9dfdSAndroid Build Coastguard Worker         cli["--list-reporters"]
4790*387f9dfdSAndroid Build Coastguard Worker             .describe( "list all reporters" )
4791*387f9dfdSAndroid Build Coastguard Worker             .bind( &ConfigData::listReporters );
4792*387f9dfdSAndroid Build Coastguard Worker 
4793*387f9dfdSAndroid Build Coastguard Worker         cli["--order"]
4794*387f9dfdSAndroid Build Coastguard Worker             .describe( "test case order (defaults to decl)" )
4795*387f9dfdSAndroid Build Coastguard Worker             .bind( &setOrder, "decl|lex|rand" );
4796*387f9dfdSAndroid Build Coastguard Worker 
4797*387f9dfdSAndroid Build Coastguard Worker         cli["--rng-seed"]
4798*387f9dfdSAndroid Build Coastguard Worker             .describe( "set a specific seed for random numbers" )
4799*387f9dfdSAndroid Build Coastguard Worker             .bind( &setRngSeed, "'time'|number" );
4800*387f9dfdSAndroid Build Coastguard Worker 
4801*387f9dfdSAndroid Build Coastguard Worker         cli["--force-colour"]
4802*387f9dfdSAndroid Build Coastguard Worker             .describe( "force colourised output (deprecated)" )
4803*387f9dfdSAndroid Build Coastguard Worker             .bind( &forceColour );
4804*387f9dfdSAndroid Build Coastguard Worker 
4805*387f9dfdSAndroid Build Coastguard Worker         cli["--use-colour"]
4806*387f9dfdSAndroid Build Coastguard Worker             .describe( "should output be colourised" )
4807*387f9dfdSAndroid Build Coastguard Worker             .bind( &setUseColour, "yes|no" );
4808*387f9dfdSAndroid Build Coastguard Worker 
4809*387f9dfdSAndroid Build Coastguard Worker         return cli;
4810*387f9dfdSAndroid Build Coastguard Worker     }
4811*387f9dfdSAndroid Build Coastguard Worker 
4812*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
4813*387f9dfdSAndroid Build Coastguard Worker 
4814*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_list.hpp
4815*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
4816*387f9dfdSAndroid Build Coastguard Worker 
4817*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_text.h
4818*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
4819*387f9dfdSAndroid Build Coastguard Worker 
4820*387f9dfdSAndroid Build Coastguard Worker #define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
4821*387f9dfdSAndroid Build Coastguard Worker 
4822*387f9dfdSAndroid Build Coastguard Worker #define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
4823*387f9dfdSAndroid Build Coastguard Worker // #included from: ../external/tbc_text_format.h
4824*387f9dfdSAndroid Build Coastguard Worker // Only use header guard if we are not using an outer namespace
4825*387f9dfdSAndroid Build Coastguard Worker #ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
4826*387f9dfdSAndroid Build Coastguard Worker # ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
4827*387f9dfdSAndroid Build Coastguard Worker #  ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
4828*387f9dfdSAndroid Build Coastguard Worker #   define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
4829*387f9dfdSAndroid Build Coastguard Worker #  endif
4830*387f9dfdSAndroid Build Coastguard Worker # else
4831*387f9dfdSAndroid Build Coastguard Worker #  define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
4832*387f9dfdSAndroid Build Coastguard Worker # endif
4833*387f9dfdSAndroid Build Coastguard Worker #endif
4834*387f9dfdSAndroid Build Coastguard Worker #ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
4835*387f9dfdSAndroid Build Coastguard Worker #include <string>
4836*387f9dfdSAndroid Build Coastguard Worker #include <vector>
4837*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
4838*387f9dfdSAndroid Build Coastguard Worker 
4839*387f9dfdSAndroid Build Coastguard Worker // Use optional outer namespace
4840*387f9dfdSAndroid Build Coastguard Worker #ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
4841*387f9dfdSAndroid Build Coastguard Worker namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
4842*387f9dfdSAndroid Build Coastguard Worker #endif
4843*387f9dfdSAndroid Build Coastguard Worker 
4844*387f9dfdSAndroid Build Coastguard Worker namespace Tbc {
4845*387f9dfdSAndroid Build Coastguard Worker 
4846*387f9dfdSAndroid Build Coastguard Worker #ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
4847*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
4848*387f9dfdSAndroid Build Coastguard Worker #else
4849*387f9dfdSAndroid Build Coastguard Worker     const unsigned int consoleWidth = 80;
4850*387f9dfdSAndroid Build Coastguard Worker #endif
4851*387f9dfdSAndroid Build Coastguard Worker 
4852*387f9dfdSAndroid Build Coastguard Worker     struct TextAttributes {
TextAttributesCLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes4853*387f9dfdSAndroid Build Coastguard Worker         TextAttributes()
4854*387f9dfdSAndroid Build Coastguard Worker         :   initialIndent( std::string::npos ),
4855*387f9dfdSAndroid Build Coastguard Worker             indent( 0 ),
4856*387f9dfdSAndroid Build Coastguard Worker             width( consoleWidth-1 ),
4857*387f9dfdSAndroid Build Coastguard Worker             tabChar( '\t' )
4858*387f9dfdSAndroid Build Coastguard Worker         {}
4859*387f9dfdSAndroid Build Coastguard Worker 
setInitialIndentCLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes4860*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setInitialIndent( std::size_t _value )  { initialIndent = _value; return *this; }
setIndentCLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes4861*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setIndent( std::size_t _value )         { indent = _value; return *this; }
setWidthCLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes4862*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setWidth( std::size_t _value )          { width = _value; return *this; }
setTabCharCLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE::Tbc::TextAttributes4863*387f9dfdSAndroid Build Coastguard Worker         TextAttributes& setTabChar( char _value )               { tabChar = _value; return *this; }
4864*387f9dfdSAndroid Build Coastguard Worker 
4865*387f9dfdSAndroid Build Coastguard Worker         std::size_t initialIndent;  // indent of first line, or npos
4866*387f9dfdSAndroid Build Coastguard Worker         std::size_t indent;         // indent of subsequent lines, or all if initialIndent is npos
4867*387f9dfdSAndroid Build Coastguard Worker         std::size_t width;          // maximum width of text, including indent. Longer text will wrap
4868*387f9dfdSAndroid Build Coastguard Worker         char tabChar;               // If this char is seen the indent is changed to current pos
4869*387f9dfdSAndroid Build Coastguard Worker     };
4870*387f9dfdSAndroid Build Coastguard Worker 
4871*387f9dfdSAndroid Build Coastguard Worker     class Text {
4872*387f9dfdSAndroid Build Coastguard Worker     public:
Text(std::string const & _str,TextAttributes const & _attr=TextAttributes ())4873*387f9dfdSAndroid Build Coastguard Worker         Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
4874*387f9dfdSAndroid Build Coastguard Worker         : attr( _attr )
4875*387f9dfdSAndroid Build Coastguard Worker         {
4876*387f9dfdSAndroid Build Coastguard Worker             std::string wrappableChars = " [({.,/|\\-";
4877*387f9dfdSAndroid Build Coastguard Worker             std::size_t indent = _attr.initialIndent != std::string::npos
4878*387f9dfdSAndroid Build Coastguard Worker                 ? _attr.initialIndent
4879*387f9dfdSAndroid Build Coastguard Worker                 : _attr.indent;
4880*387f9dfdSAndroid Build Coastguard Worker             std::string remainder = _str;
4881*387f9dfdSAndroid Build Coastguard Worker 
4882*387f9dfdSAndroid Build Coastguard Worker             while( !remainder.empty() ) {
4883*387f9dfdSAndroid Build Coastguard Worker                 if( lines.size() >= 1000 ) {
4884*387f9dfdSAndroid Build Coastguard Worker                     lines.push_back( "... message truncated due to excessive size" );
4885*387f9dfdSAndroid Build Coastguard Worker                     return;
4886*387f9dfdSAndroid Build Coastguard Worker                 }
4887*387f9dfdSAndroid Build Coastguard Worker                 std::size_t tabPos = std::string::npos;
4888*387f9dfdSAndroid Build Coastguard Worker                 std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
4889*387f9dfdSAndroid Build Coastguard Worker                 std::size_t pos = remainder.find_first_of( '\n' );
4890*387f9dfdSAndroid Build Coastguard Worker                 if( pos <= width ) {
4891*387f9dfdSAndroid Build Coastguard Worker                     width = pos;
4892*387f9dfdSAndroid Build Coastguard Worker                 }
4893*387f9dfdSAndroid Build Coastguard Worker                 pos = remainder.find_last_of( _attr.tabChar, width );
4894*387f9dfdSAndroid Build Coastguard Worker                 if( pos != std::string::npos ) {
4895*387f9dfdSAndroid Build Coastguard Worker                     tabPos = pos;
4896*387f9dfdSAndroid Build Coastguard Worker                     if( remainder[width] == '\n' )
4897*387f9dfdSAndroid Build Coastguard Worker                         width--;
4898*387f9dfdSAndroid Build Coastguard Worker                     remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
4899*387f9dfdSAndroid Build Coastguard Worker                 }
4900*387f9dfdSAndroid Build Coastguard Worker 
4901*387f9dfdSAndroid Build Coastguard Worker                 if( width == remainder.size() ) {
4902*387f9dfdSAndroid Build Coastguard Worker                     spliceLine( indent, remainder, width );
4903*387f9dfdSAndroid Build Coastguard Worker                 }
4904*387f9dfdSAndroid Build Coastguard Worker                 else if( remainder[width] == '\n' ) {
4905*387f9dfdSAndroid Build Coastguard Worker                     spliceLine( indent, remainder, width );
4906*387f9dfdSAndroid Build Coastguard Worker                     if( width <= 1 || remainder.size() != 1 )
4907*387f9dfdSAndroid Build Coastguard Worker                         remainder = remainder.substr( 1 );
4908*387f9dfdSAndroid Build Coastguard Worker                     indent = _attr.indent;
4909*387f9dfdSAndroid Build Coastguard Worker                 }
4910*387f9dfdSAndroid Build Coastguard Worker                 else {
4911*387f9dfdSAndroid Build Coastguard Worker                     pos = remainder.find_last_of( wrappableChars, width );
4912*387f9dfdSAndroid Build Coastguard Worker                     if( pos != std::string::npos && pos > 0 ) {
4913*387f9dfdSAndroid Build Coastguard Worker                         spliceLine( indent, remainder, pos );
4914*387f9dfdSAndroid Build Coastguard Worker                         if( remainder[0] == ' ' )
4915*387f9dfdSAndroid Build Coastguard Worker                             remainder = remainder.substr( 1 );
4916*387f9dfdSAndroid Build Coastguard Worker                     }
4917*387f9dfdSAndroid Build Coastguard Worker                     else {
4918*387f9dfdSAndroid Build Coastguard Worker                         spliceLine( indent, remainder, width-1 );
4919*387f9dfdSAndroid Build Coastguard Worker                         lines.back() += "-";
4920*387f9dfdSAndroid Build Coastguard Worker                     }
4921*387f9dfdSAndroid Build Coastguard Worker                     if( lines.size() == 1 )
4922*387f9dfdSAndroid Build Coastguard Worker                         indent = _attr.indent;
4923*387f9dfdSAndroid Build Coastguard Worker                     if( tabPos != std::string::npos )
4924*387f9dfdSAndroid Build Coastguard Worker                         indent += tabPos;
4925*387f9dfdSAndroid Build Coastguard Worker                 }
4926*387f9dfdSAndroid Build Coastguard Worker             }
4927*387f9dfdSAndroid Build Coastguard Worker         }
4928*387f9dfdSAndroid Build Coastguard Worker 
spliceLine(std::size_t _indent,std::string & _remainder,std::size_t _pos)4929*387f9dfdSAndroid Build Coastguard Worker         void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
4930*387f9dfdSAndroid Build Coastguard Worker             lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
4931*387f9dfdSAndroid Build Coastguard Worker             _remainder = _remainder.substr( _pos );
4932*387f9dfdSAndroid Build Coastguard Worker         }
4933*387f9dfdSAndroid Build Coastguard Worker 
4934*387f9dfdSAndroid Build Coastguard Worker         typedef std::vector<std::string>::const_iterator const_iterator;
4935*387f9dfdSAndroid Build Coastguard Worker 
begin() const4936*387f9dfdSAndroid Build Coastguard Worker         const_iterator begin() const { return lines.begin(); }
end() const4937*387f9dfdSAndroid Build Coastguard Worker         const_iterator end() const { return lines.end(); }
last() const4938*387f9dfdSAndroid Build Coastguard Worker         std::string const& last() const { return lines.back(); }
size() const4939*387f9dfdSAndroid Build Coastguard Worker         std::size_t size() const { return lines.size(); }
operator [](std::size_t _index) const4940*387f9dfdSAndroid Build Coastguard Worker         std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
toString() const4941*387f9dfdSAndroid Build Coastguard Worker         std::string toString() const {
4942*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
4943*387f9dfdSAndroid Build Coastguard Worker             oss << *this;
4944*387f9dfdSAndroid Build Coastguard Worker             return oss.str();
4945*387f9dfdSAndroid Build Coastguard Worker         }
4946*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & _stream,Text const & _text)4947*387f9dfdSAndroid Build Coastguard Worker         inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
4948*387f9dfdSAndroid Build Coastguard Worker             for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
4949*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd; ++it ) {
4950*387f9dfdSAndroid Build Coastguard Worker                 if( it != _text.begin() )
4951*387f9dfdSAndroid Build Coastguard Worker                     _stream << "\n";
4952*387f9dfdSAndroid Build Coastguard Worker                 _stream << *it;
4953*387f9dfdSAndroid Build Coastguard Worker             }
4954*387f9dfdSAndroid Build Coastguard Worker             return _stream;
4955*387f9dfdSAndroid Build Coastguard Worker         }
4956*387f9dfdSAndroid Build Coastguard Worker 
4957*387f9dfdSAndroid Build Coastguard Worker     private:
4958*387f9dfdSAndroid Build Coastguard Worker         std::string str;
4959*387f9dfdSAndroid Build Coastguard Worker         TextAttributes attr;
4960*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> lines;
4961*387f9dfdSAndroid Build Coastguard Worker     };
4962*387f9dfdSAndroid Build Coastguard Worker 
4963*387f9dfdSAndroid Build Coastguard Worker } // end namespace Tbc
4964*387f9dfdSAndroid Build Coastguard Worker 
4965*387f9dfdSAndroid Build Coastguard Worker #ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
4966*387f9dfdSAndroid Build Coastguard Worker } // end outer namespace
4967*387f9dfdSAndroid Build Coastguard Worker #endif
4968*387f9dfdSAndroid Build Coastguard Worker 
4969*387f9dfdSAndroid Build Coastguard Worker #endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
4970*387f9dfdSAndroid Build Coastguard Worker #undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
4971*387f9dfdSAndroid Build Coastguard Worker 
4972*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
4973*387f9dfdSAndroid Build Coastguard Worker     using Tbc::Text;
4974*387f9dfdSAndroid Build Coastguard Worker     using Tbc::TextAttributes;
4975*387f9dfdSAndroid Build Coastguard Worker }
4976*387f9dfdSAndroid Build Coastguard Worker 
4977*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_console_colour.hpp
4978*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED
4979*387f9dfdSAndroid Build Coastguard Worker 
4980*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
4981*387f9dfdSAndroid Build Coastguard Worker 
4982*387f9dfdSAndroid Build Coastguard Worker     struct Colour {
4983*387f9dfdSAndroid Build Coastguard Worker         enum Code {
4984*387f9dfdSAndroid Build Coastguard Worker             None = 0,
4985*387f9dfdSAndroid Build Coastguard Worker 
4986*387f9dfdSAndroid Build Coastguard Worker             White,
4987*387f9dfdSAndroid Build Coastguard Worker             Red,
4988*387f9dfdSAndroid Build Coastguard Worker             Green,
4989*387f9dfdSAndroid Build Coastguard Worker             Blue,
4990*387f9dfdSAndroid Build Coastguard Worker             Cyan,
4991*387f9dfdSAndroid Build Coastguard Worker             Yellow,
4992*387f9dfdSAndroid Build Coastguard Worker             Grey,
4993*387f9dfdSAndroid Build Coastguard Worker 
4994*387f9dfdSAndroid Build Coastguard Worker             Bright = 0x10,
4995*387f9dfdSAndroid Build Coastguard Worker 
4996*387f9dfdSAndroid Build Coastguard Worker             BrightRed = Bright | Red,
4997*387f9dfdSAndroid Build Coastguard Worker             BrightGreen = Bright | Green,
4998*387f9dfdSAndroid Build Coastguard Worker             LightGrey = Bright | Grey,
4999*387f9dfdSAndroid Build Coastguard Worker             BrightWhite = Bright | White,
5000*387f9dfdSAndroid Build Coastguard Worker 
5001*387f9dfdSAndroid Build Coastguard Worker             // By intention
5002*387f9dfdSAndroid Build Coastguard Worker             FileName = LightGrey,
5003*387f9dfdSAndroid Build Coastguard Worker             Warning = Yellow,
5004*387f9dfdSAndroid Build Coastguard Worker             ResultError = BrightRed,
5005*387f9dfdSAndroid Build Coastguard Worker             ResultSuccess = BrightGreen,
5006*387f9dfdSAndroid Build Coastguard Worker             ResultExpectedFailure = Warning,
5007*387f9dfdSAndroid Build Coastguard Worker 
5008*387f9dfdSAndroid Build Coastguard Worker             Error = BrightRed,
5009*387f9dfdSAndroid Build Coastguard Worker             Success = Green,
5010*387f9dfdSAndroid Build Coastguard Worker 
5011*387f9dfdSAndroid Build Coastguard Worker             OriginalExpression = Cyan,
5012*387f9dfdSAndroid Build Coastguard Worker             ReconstructedExpression = Yellow,
5013*387f9dfdSAndroid Build Coastguard Worker 
5014*387f9dfdSAndroid Build Coastguard Worker             SecondaryText = LightGrey,
5015*387f9dfdSAndroid Build Coastguard Worker             Headers = White
5016*387f9dfdSAndroid Build Coastguard Worker         };
5017*387f9dfdSAndroid Build Coastguard Worker 
5018*387f9dfdSAndroid Build Coastguard Worker         // Use constructed object for RAII guard
5019*387f9dfdSAndroid Build Coastguard Worker         Colour( Code _colourCode );
5020*387f9dfdSAndroid Build Coastguard Worker         Colour( Colour const& other );
5021*387f9dfdSAndroid Build Coastguard Worker         ~Colour();
5022*387f9dfdSAndroid Build Coastguard Worker 
5023*387f9dfdSAndroid Build Coastguard Worker         // Use static method for one-shot changes
5024*387f9dfdSAndroid Build Coastguard Worker         static void use( Code _colourCode );
5025*387f9dfdSAndroid Build Coastguard Worker 
5026*387f9dfdSAndroid Build Coastguard Worker     private:
5027*387f9dfdSAndroid Build Coastguard Worker         bool m_moved;
5028*387f9dfdSAndroid Build Coastguard Worker     };
5029*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,Colour const &)5030*387f9dfdSAndroid Build Coastguard Worker     inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; }
5031*387f9dfdSAndroid Build Coastguard Worker 
5032*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
5033*387f9dfdSAndroid Build Coastguard Worker 
5034*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_interfaces_reporter.h
5035*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
5036*387f9dfdSAndroid Build Coastguard Worker 
5037*387f9dfdSAndroid Build Coastguard Worker #include <string>
5038*387f9dfdSAndroid Build Coastguard Worker #include <ostream>
5039*387f9dfdSAndroid Build Coastguard Worker #include <map>
5040*387f9dfdSAndroid Build Coastguard Worker #include <assert.h>
5041*387f9dfdSAndroid Build Coastguard Worker 
5042*387f9dfdSAndroid Build Coastguard Worker namespace Catch
5043*387f9dfdSAndroid Build Coastguard Worker {
5044*387f9dfdSAndroid Build Coastguard Worker     struct ReporterConfig {
ReporterConfigCatch::ReporterConfig5045*387f9dfdSAndroid Build Coastguard Worker         explicit ReporterConfig( Ptr<IConfig const> const& _fullConfig )
5046*387f9dfdSAndroid Build Coastguard Worker         :   m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}
5047*387f9dfdSAndroid Build Coastguard Worker 
ReporterConfigCatch::ReporterConfig5048*387f9dfdSAndroid Build Coastguard Worker         ReporterConfig( Ptr<IConfig const> const& _fullConfig, std::ostream& _stream )
5049*387f9dfdSAndroid Build Coastguard Worker         :   m_stream( &_stream ), m_fullConfig( _fullConfig ) {}
5050*387f9dfdSAndroid Build Coastguard Worker 
streamCatch::ReporterConfig5051*387f9dfdSAndroid Build Coastguard Worker         std::ostream& stream() const    { return *m_stream; }
fullConfigCatch::ReporterConfig5052*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> fullConfig() const { return m_fullConfig; }
5053*387f9dfdSAndroid Build Coastguard Worker 
5054*387f9dfdSAndroid Build Coastguard Worker     private:
5055*387f9dfdSAndroid Build Coastguard Worker         std::ostream* m_stream;
5056*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> m_fullConfig;
5057*387f9dfdSAndroid Build Coastguard Worker     };
5058*387f9dfdSAndroid Build Coastguard Worker 
5059*387f9dfdSAndroid Build Coastguard Worker     struct ReporterPreferences {
ReporterPreferencesCatch::ReporterPreferences5060*387f9dfdSAndroid Build Coastguard Worker         ReporterPreferences()
5061*387f9dfdSAndroid Build Coastguard Worker         : shouldRedirectStdOut( false )
5062*387f9dfdSAndroid Build Coastguard Worker         {}
5063*387f9dfdSAndroid Build Coastguard Worker 
5064*387f9dfdSAndroid Build Coastguard Worker         bool shouldRedirectStdOut;
5065*387f9dfdSAndroid Build Coastguard Worker     };
5066*387f9dfdSAndroid Build Coastguard Worker 
5067*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
5068*387f9dfdSAndroid Build Coastguard Worker     struct LazyStat : Option<T> {
LazyStatCatch::LazyStat5069*387f9dfdSAndroid Build Coastguard Worker         LazyStat() : used( false ) {}
operator =Catch::LazyStat5070*387f9dfdSAndroid Build Coastguard Worker         LazyStat& operator=( T const& _value ) {
5071*387f9dfdSAndroid Build Coastguard Worker             Option<T>::operator=( _value );
5072*387f9dfdSAndroid Build Coastguard Worker             used = false;
5073*387f9dfdSAndroid Build Coastguard Worker             return *this;
5074*387f9dfdSAndroid Build Coastguard Worker         }
resetCatch::LazyStat5075*387f9dfdSAndroid Build Coastguard Worker         void reset() {
5076*387f9dfdSAndroid Build Coastguard Worker             Option<T>::reset();
5077*387f9dfdSAndroid Build Coastguard Worker             used = false;
5078*387f9dfdSAndroid Build Coastguard Worker         }
5079*387f9dfdSAndroid Build Coastguard Worker         bool used;
5080*387f9dfdSAndroid Build Coastguard Worker     };
5081*387f9dfdSAndroid Build Coastguard Worker 
5082*387f9dfdSAndroid Build Coastguard Worker     struct TestRunInfo {
TestRunInfoCatch::TestRunInfo5083*387f9dfdSAndroid Build Coastguard Worker         TestRunInfo( std::string const& _name ) : name( _name ) {}
5084*387f9dfdSAndroid Build Coastguard Worker         std::string name;
5085*387f9dfdSAndroid Build Coastguard Worker     };
5086*387f9dfdSAndroid Build Coastguard Worker     struct GroupInfo {
GroupInfoCatch::GroupInfo5087*387f9dfdSAndroid Build Coastguard Worker         GroupInfo(  std::string const& _name,
5088*387f9dfdSAndroid Build Coastguard Worker                     std::size_t _groupIndex,
5089*387f9dfdSAndroid Build Coastguard Worker                     std::size_t _groupsCount )
5090*387f9dfdSAndroid Build Coastguard Worker         :   name( _name ),
5091*387f9dfdSAndroid Build Coastguard Worker             groupIndex( _groupIndex ),
5092*387f9dfdSAndroid Build Coastguard Worker             groupsCounts( _groupsCount )
5093*387f9dfdSAndroid Build Coastguard Worker         {}
5094*387f9dfdSAndroid Build Coastguard Worker 
5095*387f9dfdSAndroid Build Coastguard Worker         std::string name;
5096*387f9dfdSAndroid Build Coastguard Worker         std::size_t groupIndex;
5097*387f9dfdSAndroid Build Coastguard Worker         std::size_t groupsCounts;
5098*387f9dfdSAndroid Build Coastguard Worker     };
5099*387f9dfdSAndroid Build Coastguard Worker 
5100*387f9dfdSAndroid Build Coastguard Worker     struct AssertionStats {
AssertionStatsCatch::AssertionStats5101*387f9dfdSAndroid Build Coastguard Worker         AssertionStats( AssertionResult const& _assertionResult,
5102*387f9dfdSAndroid Build Coastguard Worker                         std::vector<MessageInfo> const& _infoMessages,
5103*387f9dfdSAndroid Build Coastguard Worker                         Totals const& _totals )
5104*387f9dfdSAndroid Build Coastguard Worker         :   assertionResult( _assertionResult ),
5105*387f9dfdSAndroid Build Coastguard Worker             infoMessages( _infoMessages ),
5106*387f9dfdSAndroid Build Coastguard Worker             totals( _totals )
5107*387f9dfdSAndroid Build Coastguard Worker         {
5108*387f9dfdSAndroid Build Coastguard Worker             if( assertionResult.hasMessage() ) {
5109*387f9dfdSAndroid Build Coastguard Worker                 // Copy message into messages list.
5110*387f9dfdSAndroid Build Coastguard Worker                 // !TBD This should have been done earlier, somewhere
5111*387f9dfdSAndroid Build Coastguard Worker                 MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );
5112*387f9dfdSAndroid Build Coastguard Worker                 builder << assertionResult.getMessage();
5113*387f9dfdSAndroid Build Coastguard Worker                 builder.m_info.message = builder.m_stream.str();
5114*387f9dfdSAndroid Build Coastguard Worker 
5115*387f9dfdSAndroid Build Coastguard Worker                 infoMessages.push_back( builder.m_info );
5116*387f9dfdSAndroid Build Coastguard Worker             }
5117*387f9dfdSAndroid Build Coastguard Worker         }
5118*387f9dfdSAndroid Build Coastguard Worker         virtual ~AssertionStats();
5119*387f9dfdSAndroid Build Coastguard Worker 
5120*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
5121*387f9dfdSAndroid Build Coastguard Worker         AssertionStats( AssertionStats const& )              = default;
5122*387f9dfdSAndroid Build Coastguard Worker         AssertionStats( AssertionStats && )                  = default;
5123*387f9dfdSAndroid Build Coastguard Worker         AssertionStats& operator = ( AssertionStats const& ) = default;
5124*387f9dfdSAndroid Build Coastguard Worker         AssertionStats& operator = ( AssertionStats && )     = default;
5125*387f9dfdSAndroid Build Coastguard Worker #  endif
5126*387f9dfdSAndroid Build Coastguard Worker 
5127*387f9dfdSAndroid Build Coastguard Worker         AssertionResult assertionResult;
5128*387f9dfdSAndroid Build Coastguard Worker         std::vector<MessageInfo> infoMessages;
5129*387f9dfdSAndroid Build Coastguard Worker         Totals totals;
5130*387f9dfdSAndroid Build Coastguard Worker     };
5131*387f9dfdSAndroid Build Coastguard Worker 
5132*387f9dfdSAndroid Build Coastguard Worker     struct SectionStats {
SectionStatsCatch::SectionStats5133*387f9dfdSAndroid Build Coastguard Worker         SectionStats(   SectionInfo const& _sectionInfo,
5134*387f9dfdSAndroid Build Coastguard Worker                         Counts const& _assertions,
5135*387f9dfdSAndroid Build Coastguard Worker                         double _durationInSeconds,
5136*387f9dfdSAndroid Build Coastguard Worker                         bool _missingAssertions )
5137*387f9dfdSAndroid Build Coastguard Worker         :   sectionInfo( _sectionInfo ),
5138*387f9dfdSAndroid Build Coastguard Worker             assertions( _assertions ),
5139*387f9dfdSAndroid Build Coastguard Worker             durationInSeconds( _durationInSeconds ),
5140*387f9dfdSAndroid Build Coastguard Worker             missingAssertions( _missingAssertions )
5141*387f9dfdSAndroid Build Coastguard Worker         {}
5142*387f9dfdSAndroid Build Coastguard Worker         virtual ~SectionStats();
5143*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
5144*387f9dfdSAndroid Build Coastguard Worker         SectionStats( SectionStats const& )              = default;
5145*387f9dfdSAndroid Build Coastguard Worker         SectionStats( SectionStats && )                  = default;
5146*387f9dfdSAndroid Build Coastguard Worker         SectionStats& operator = ( SectionStats const& ) = default;
5147*387f9dfdSAndroid Build Coastguard Worker         SectionStats& operator = ( SectionStats && )     = default;
5148*387f9dfdSAndroid Build Coastguard Worker #  endif
5149*387f9dfdSAndroid Build Coastguard Worker 
5150*387f9dfdSAndroid Build Coastguard Worker         SectionInfo sectionInfo;
5151*387f9dfdSAndroid Build Coastguard Worker         Counts assertions;
5152*387f9dfdSAndroid Build Coastguard Worker         double durationInSeconds;
5153*387f9dfdSAndroid Build Coastguard Worker         bool missingAssertions;
5154*387f9dfdSAndroid Build Coastguard Worker     };
5155*387f9dfdSAndroid Build Coastguard Worker 
5156*387f9dfdSAndroid Build Coastguard Worker     struct TestCaseStats {
TestCaseStatsCatch::TestCaseStats5157*387f9dfdSAndroid Build Coastguard Worker         TestCaseStats(  TestCaseInfo const& _testInfo,
5158*387f9dfdSAndroid Build Coastguard Worker                         Totals const& _totals,
5159*387f9dfdSAndroid Build Coastguard Worker                         std::string const& _stdOut,
5160*387f9dfdSAndroid Build Coastguard Worker                         std::string const& _stdErr,
5161*387f9dfdSAndroid Build Coastguard Worker                         bool _aborting )
5162*387f9dfdSAndroid Build Coastguard Worker         : testInfo( _testInfo ),
5163*387f9dfdSAndroid Build Coastguard Worker             totals( _totals ),
5164*387f9dfdSAndroid Build Coastguard Worker             stdOut( _stdOut ),
5165*387f9dfdSAndroid Build Coastguard Worker             stdErr( _stdErr ),
5166*387f9dfdSAndroid Build Coastguard Worker             aborting( _aborting )
5167*387f9dfdSAndroid Build Coastguard Worker         {}
5168*387f9dfdSAndroid Build Coastguard Worker         virtual ~TestCaseStats();
5169*387f9dfdSAndroid Build Coastguard Worker 
5170*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
5171*387f9dfdSAndroid Build Coastguard Worker         TestCaseStats( TestCaseStats const& )              = default;
5172*387f9dfdSAndroid Build Coastguard Worker         TestCaseStats( TestCaseStats && )                  = default;
5173*387f9dfdSAndroid Build Coastguard Worker         TestCaseStats& operator = ( TestCaseStats const& ) = default;
5174*387f9dfdSAndroid Build Coastguard Worker         TestCaseStats& operator = ( TestCaseStats && )     = default;
5175*387f9dfdSAndroid Build Coastguard Worker #  endif
5176*387f9dfdSAndroid Build Coastguard Worker 
5177*387f9dfdSAndroid Build Coastguard Worker         TestCaseInfo testInfo;
5178*387f9dfdSAndroid Build Coastguard Worker         Totals totals;
5179*387f9dfdSAndroid Build Coastguard Worker         std::string stdOut;
5180*387f9dfdSAndroid Build Coastguard Worker         std::string stdErr;
5181*387f9dfdSAndroid Build Coastguard Worker         bool aborting;
5182*387f9dfdSAndroid Build Coastguard Worker     };
5183*387f9dfdSAndroid Build Coastguard Worker 
5184*387f9dfdSAndroid Build Coastguard Worker     struct TestGroupStats {
TestGroupStatsCatch::TestGroupStats5185*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats( GroupInfo const& _groupInfo,
5186*387f9dfdSAndroid Build Coastguard Worker                         Totals const& _totals,
5187*387f9dfdSAndroid Build Coastguard Worker                         bool _aborting )
5188*387f9dfdSAndroid Build Coastguard Worker         :   groupInfo( _groupInfo ),
5189*387f9dfdSAndroid Build Coastguard Worker             totals( _totals ),
5190*387f9dfdSAndroid Build Coastguard Worker             aborting( _aborting )
5191*387f9dfdSAndroid Build Coastguard Worker         {}
TestGroupStatsCatch::TestGroupStats5192*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats( GroupInfo const& _groupInfo )
5193*387f9dfdSAndroid Build Coastguard Worker         :   groupInfo( _groupInfo ),
5194*387f9dfdSAndroid Build Coastguard Worker             aborting( false )
5195*387f9dfdSAndroid Build Coastguard Worker         {}
5196*387f9dfdSAndroid Build Coastguard Worker         virtual ~TestGroupStats();
5197*387f9dfdSAndroid Build Coastguard Worker 
5198*387f9dfdSAndroid Build Coastguard Worker #  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
5199*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats( TestGroupStats const& )              = default;
5200*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats( TestGroupStats && )                  = default;
5201*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats& operator = ( TestGroupStats const& ) = default;
5202*387f9dfdSAndroid Build Coastguard Worker         TestGroupStats& operator = ( TestGroupStats && )     = default;
5203*387f9dfdSAndroid Build Coastguard Worker #  endif
5204*387f9dfdSAndroid Build Coastguard Worker 
5205*387f9dfdSAndroid Build Coastguard Worker         GroupInfo groupInfo;
5206*387f9dfdSAndroid Build Coastguard Worker         Totals totals;
5207*387f9dfdSAndroid Build Coastguard Worker         bool aborting;
5208*387f9dfdSAndroid Build Coastguard Worker     };
5209*387f9dfdSAndroid Build Coastguard Worker 
5210*387f9dfdSAndroid Build Coastguard Worker     struct TestRunStats {
TestRunStatsCatch::TestRunStats5211*387f9dfdSAndroid Build Coastguard Worker         TestRunStats(   TestRunInfo const& _runInfo,
5212*387f9dfdSAndroid Build Coastguard Worker                         Totals const& _totals,
5213*387f9dfdSAndroid Build Coastguard Worker                         bool _aborting )
5214*387f9dfdSAndroid Build Coastguard Worker         :   runInfo( _runInfo ),
5215*387f9dfdSAndroid Build Coastguard Worker             totals( _totals ),
5216*387f9dfdSAndroid Build Coastguard Worker             aborting( _aborting )
5217*387f9dfdSAndroid Build Coastguard Worker         {}
5218*387f9dfdSAndroid Build Coastguard Worker         virtual ~TestRunStats();
5219*387f9dfdSAndroid Build Coastguard Worker 
5220*387f9dfdSAndroid Build Coastguard Worker #  ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS
TestRunStatsCatch::TestRunStats5221*387f9dfdSAndroid Build Coastguard Worker         TestRunStats( TestRunStats const& _other )
5222*387f9dfdSAndroid Build Coastguard Worker         :   runInfo( _other.runInfo ),
5223*387f9dfdSAndroid Build Coastguard Worker             totals( _other.totals ),
5224*387f9dfdSAndroid Build Coastguard Worker             aborting( _other.aborting )
5225*387f9dfdSAndroid Build Coastguard Worker         {}
5226*387f9dfdSAndroid Build Coastguard Worker #  else
5227*387f9dfdSAndroid Build Coastguard Worker         TestRunStats( TestRunStats const& )              = default;
5228*387f9dfdSAndroid Build Coastguard Worker         TestRunStats( TestRunStats && )                  = default;
5229*387f9dfdSAndroid Build Coastguard Worker         TestRunStats& operator = ( TestRunStats const& ) = default;
5230*387f9dfdSAndroid Build Coastguard Worker         TestRunStats& operator = ( TestRunStats && )     = default;
5231*387f9dfdSAndroid Build Coastguard Worker #  endif
5232*387f9dfdSAndroid Build Coastguard Worker 
5233*387f9dfdSAndroid Build Coastguard Worker         TestRunInfo runInfo;
5234*387f9dfdSAndroid Build Coastguard Worker         Totals totals;
5235*387f9dfdSAndroid Build Coastguard Worker         bool aborting;
5236*387f9dfdSAndroid Build Coastguard Worker     };
5237*387f9dfdSAndroid Build Coastguard Worker 
5238*387f9dfdSAndroid Build Coastguard Worker     struct IStreamingReporter : IShared {
5239*387f9dfdSAndroid Build Coastguard Worker         virtual ~IStreamingReporter();
5240*387f9dfdSAndroid Build Coastguard Worker 
5241*387f9dfdSAndroid Build Coastguard Worker         // Implementing class must also provide the following static method:
5242*387f9dfdSAndroid Build Coastguard Worker         // static std::string getDescription();
5243*387f9dfdSAndroid Build Coastguard Worker 
5244*387f9dfdSAndroid Build Coastguard Worker         virtual ReporterPreferences getPreferences() const = 0;
5245*387f9dfdSAndroid Build Coastguard Worker 
5246*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& spec ) = 0;
5247*387f9dfdSAndroid Build Coastguard Worker 
5248*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
5249*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
5250*387f9dfdSAndroid Build Coastguard Worker 
5251*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
5252*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
5253*387f9dfdSAndroid Build Coastguard Worker 
5254*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
5255*387f9dfdSAndroid Build Coastguard Worker 
5256*387f9dfdSAndroid Build Coastguard Worker         // The return value indicates if the messages buffer should be cleared:
5257*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
5258*387f9dfdSAndroid Build Coastguard Worker 
5259*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
5260*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
5261*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
5262*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
5263*387f9dfdSAndroid Build Coastguard Worker 
5264*387f9dfdSAndroid Build Coastguard Worker         virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
5265*387f9dfdSAndroid Build Coastguard Worker     };
5266*387f9dfdSAndroid Build Coastguard Worker 
5267*387f9dfdSAndroid Build Coastguard Worker     struct IReporterFactory : IShared {
5268*387f9dfdSAndroid Build Coastguard Worker         virtual ~IReporterFactory();
5269*387f9dfdSAndroid Build Coastguard Worker         virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0;
5270*387f9dfdSAndroid Build Coastguard Worker         virtual std::string getDescription() const = 0;
5271*387f9dfdSAndroid Build Coastguard Worker     };
5272*387f9dfdSAndroid Build Coastguard Worker 
5273*387f9dfdSAndroid Build Coastguard Worker     struct IReporterRegistry {
5274*387f9dfdSAndroid Build Coastguard Worker         typedef std::map<std::string, Ptr<IReporterFactory> > FactoryMap;
5275*387f9dfdSAndroid Build Coastguard Worker         typedef std::vector<Ptr<IReporterFactory> > Listeners;
5276*387f9dfdSAndroid Build Coastguard Worker 
5277*387f9dfdSAndroid Build Coastguard Worker         virtual ~IReporterRegistry();
5278*387f9dfdSAndroid Build Coastguard Worker         virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const = 0;
5279*387f9dfdSAndroid Build Coastguard Worker         virtual FactoryMap const& getFactories() const = 0;
5280*387f9dfdSAndroid Build Coastguard Worker         virtual Listeners const& getListeners() const = 0;
5281*387f9dfdSAndroid Build Coastguard Worker     };
5282*387f9dfdSAndroid Build Coastguard Worker 
5283*387f9dfdSAndroid Build Coastguard Worker     Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter );
5284*387f9dfdSAndroid Build Coastguard Worker 
5285*387f9dfdSAndroid Build Coastguard Worker }
5286*387f9dfdSAndroid Build Coastguard Worker 
5287*387f9dfdSAndroid Build Coastguard Worker #include <limits>
5288*387f9dfdSAndroid Build Coastguard Worker #include <algorithm>
5289*387f9dfdSAndroid Build Coastguard Worker 
5290*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5291*387f9dfdSAndroid Build Coastguard Worker 
listTests(Config const & config)5292*387f9dfdSAndroid Build Coastguard Worker     inline std::size_t listTests( Config const& config ) {
5293*387f9dfdSAndroid Build Coastguard Worker 
5294*387f9dfdSAndroid Build Coastguard Worker         TestSpec testSpec = config.testSpec();
5295*387f9dfdSAndroid Build Coastguard Worker         if( config.testSpec().hasFilters() )
5296*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "Matching test cases:\n";
5297*387f9dfdSAndroid Build Coastguard Worker         else {
5298*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "All available test cases:\n";
5299*387f9dfdSAndroid Build Coastguard Worker             testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
5300*387f9dfdSAndroid Build Coastguard Worker         }
5301*387f9dfdSAndroid Build Coastguard Worker 
5302*387f9dfdSAndroid Build Coastguard Worker         std::size_t matchedTests = 0;
5303*387f9dfdSAndroid Build Coastguard Worker         TextAttributes nameAttr, tagsAttr;
5304*387f9dfdSAndroid Build Coastguard Worker         nameAttr.setInitialIndent( 2 ).setIndent( 4 );
5305*387f9dfdSAndroid Build Coastguard Worker         tagsAttr.setIndent( 6 );
5306*387f9dfdSAndroid Build Coastguard Worker 
5307*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
5308*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
5309*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
5310*387f9dfdSAndroid Build Coastguard Worker                 ++it ) {
5311*387f9dfdSAndroid Build Coastguard Worker             matchedTests++;
5312*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
5313*387f9dfdSAndroid Build Coastguard Worker             Colour::Code colour = testCaseInfo.isHidden()
5314*387f9dfdSAndroid Build Coastguard Worker                 ? Colour::SecondaryText
5315*387f9dfdSAndroid Build Coastguard Worker                 : Colour::None;
5316*387f9dfdSAndroid Build Coastguard Worker             Colour colourGuard( colour );
5317*387f9dfdSAndroid Build Coastguard Worker 
5318*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
5319*387f9dfdSAndroid Build Coastguard Worker             if( !testCaseInfo.tags.empty() )
5320*387f9dfdSAndroid Build Coastguard Worker                 Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
5321*387f9dfdSAndroid Build Coastguard Worker         }
5322*387f9dfdSAndroid Build Coastguard Worker 
5323*387f9dfdSAndroid Build Coastguard Worker         if( !config.testSpec().hasFilters() )
5324*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << pluralise( matchedTests, "test case" ) << "\n" << std::endl;
5325*387f9dfdSAndroid Build Coastguard Worker         else
5326*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl;
5327*387f9dfdSAndroid Build Coastguard Worker         return matchedTests;
5328*387f9dfdSAndroid Build Coastguard Worker     }
5329*387f9dfdSAndroid Build Coastguard Worker 
listTestsNamesOnly(Config const & config)5330*387f9dfdSAndroid Build Coastguard Worker     inline std::size_t listTestsNamesOnly( Config const& config ) {
5331*387f9dfdSAndroid Build Coastguard Worker         TestSpec testSpec = config.testSpec();
5332*387f9dfdSAndroid Build Coastguard Worker         if( !config.testSpec().hasFilters() )
5333*387f9dfdSAndroid Build Coastguard Worker             testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
5334*387f9dfdSAndroid Build Coastguard Worker         std::size_t matchedTests = 0;
5335*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
5336*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
5337*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
5338*387f9dfdSAndroid Build Coastguard Worker                 ++it ) {
5339*387f9dfdSAndroid Build Coastguard Worker             matchedTests++;
5340*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
5341*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << testCaseInfo.name << std::endl;
5342*387f9dfdSAndroid Build Coastguard Worker         }
5343*387f9dfdSAndroid Build Coastguard Worker         return matchedTests;
5344*387f9dfdSAndroid Build Coastguard Worker     }
5345*387f9dfdSAndroid Build Coastguard Worker 
5346*387f9dfdSAndroid Build Coastguard Worker     struct TagInfo {
TagInfoCatch::TagInfo5347*387f9dfdSAndroid Build Coastguard Worker         TagInfo() : count ( 0 ) {}
addCatch::TagInfo5348*387f9dfdSAndroid Build Coastguard Worker         void add( std::string const& spelling ) {
5349*387f9dfdSAndroid Build Coastguard Worker             ++count;
5350*387f9dfdSAndroid Build Coastguard Worker             spellings.insert( spelling );
5351*387f9dfdSAndroid Build Coastguard Worker         }
allCatch::TagInfo5352*387f9dfdSAndroid Build Coastguard Worker         std::string all() const {
5353*387f9dfdSAndroid Build Coastguard Worker             std::string out;
5354*387f9dfdSAndroid Build Coastguard Worker             for( std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end();
5355*387f9dfdSAndroid Build Coastguard Worker                         it != itEnd;
5356*387f9dfdSAndroid Build Coastguard Worker                         ++it )
5357*387f9dfdSAndroid Build Coastguard Worker                 out += "[" + *it + "]";
5358*387f9dfdSAndroid Build Coastguard Worker             return out;
5359*387f9dfdSAndroid Build Coastguard Worker         }
5360*387f9dfdSAndroid Build Coastguard Worker         std::set<std::string> spellings;
5361*387f9dfdSAndroid Build Coastguard Worker         std::size_t count;
5362*387f9dfdSAndroid Build Coastguard Worker     };
5363*387f9dfdSAndroid Build Coastguard Worker 
listTags(Config const & config)5364*387f9dfdSAndroid Build Coastguard Worker     inline std::size_t listTags( Config const& config ) {
5365*387f9dfdSAndroid Build Coastguard Worker         TestSpec testSpec = config.testSpec();
5366*387f9dfdSAndroid Build Coastguard Worker         if( config.testSpec().hasFilters() )
5367*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "Tags for matching test cases:\n";
5368*387f9dfdSAndroid Build Coastguard Worker         else {
5369*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "All available tags:\n";
5370*387f9dfdSAndroid Build Coastguard Worker             testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
5371*387f9dfdSAndroid Build Coastguard Worker         }
5372*387f9dfdSAndroid Build Coastguard Worker 
5373*387f9dfdSAndroid Build Coastguard Worker         std::map<std::string, TagInfo> tagCounts;
5374*387f9dfdSAndroid Build Coastguard Worker 
5375*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
5376*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
5377*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
5378*387f9dfdSAndroid Build Coastguard Worker                 ++it ) {
5379*387f9dfdSAndroid Build Coastguard Worker             for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),
5380*387f9dfdSAndroid Build Coastguard Worker                                                         tagItEnd = it->getTestCaseInfo().tags.end();
5381*387f9dfdSAndroid Build Coastguard Worker                     tagIt != tagItEnd;
5382*387f9dfdSAndroid Build Coastguard Worker                     ++tagIt ) {
5383*387f9dfdSAndroid Build Coastguard Worker                 std::string tagName = *tagIt;
5384*387f9dfdSAndroid Build Coastguard Worker                 std::string lcaseTagName = toLower( tagName );
5385*387f9dfdSAndroid Build Coastguard Worker                 std::map<std::string, TagInfo>::iterator countIt = tagCounts.find( lcaseTagName );
5386*387f9dfdSAndroid Build Coastguard Worker                 if( countIt == tagCounts.end() )
5387*387f9dfdSAndroid Build Coastguard Worker                     countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;
5388*387f9dfdSAndroid Build Coastguard Worker                 countIt->second.add( tagName );
5389*387f9dfdSAndroid Build Coastguard Worker             }
5390*387f9dfdSAndroid Build Coastguard Worker         }
5391*387f9dfdSAndroid Build Coastguard Worker 
5392*387f9dfdSAndroid Build Coastguard Worker         for( std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(),
5393*387f9dfdSAndroid Build Coastguard Worker                                                             countItEnd = tagCounts.end();
5394*387f9dfdSAndroid Build Coastguard Worker                 countIt != countItEnd;
5395*387f9dfdSAndroid Build Coastguard Worker                 ++countIt ) {
5396*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
5397*387f9dfdSAndroid Build Coastguard Worker             oss << "  " << std::setw(2) << countIt->second.count << "  ";
5398*387f9dfdSAndroid Build Coastguard Worker             Text wrapper( countIt->second.all(), TextAttributes()
5399*387f9dfdSAndroid Build Coastguard Worker                                                     .setInitialIndent( 0 )
5400*387f9dfdSAndroid Build Coastguard Worker                                                     .setIndent( oss.str().size() )
5401*387f9dfdSAndroid Build Coastguard Worker                                                     .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) );
5402*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << oss.str() << wrapper << "\n";
5403*387f9dfdSAndroid Build Coastguard Worker         }
5404*387f9dfdSAndroid Build Coastguard Worker         Catch::cout() << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl;
5405*387f9dfdSAndroid Build Coastguard Worker         return tagCounts.size();
5406*387f9dfdSAndroid Build Coastguard Worker     }
5407*387f9dfdSAndroid Build Coastguard Worker 
listReporters(Config const &)5408*387f9dfdSAndroid Build Coastguard Worker     inline std::size_t listReporters( Config const& /*config*/ ) {
5409*387f9dfdSAndroid Build Coastguard Worker         Catch::cout() << "Available reporters:\n";
5410*387f9dfdSAndroid Build Coastguard Worker         IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
5411*387f9dfdSAndroid Build Coastguard Worker         IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;
5412*387f9dfdSAndroid Build Coastguard Worker         std::size_t maxNameLen = 0;
5413*387f9dfdSAndroid Build Coastguard Worker         for(it = itBegin; it != itEnd; ++it )
5414*387f9dfdSAndroid Build Coastguard Worker             maxNameLen = (std::max)( maxNameLen, it->first.size() );
5415*387f9dfdSAndroid Build Coastguard Worker 
5416*387f9dfdSAndroid Build Coastguard Worker         for(it = itBegin; it != itEnd; ++it ) {
5417*387f9dfdSAndroid Build Coastguard Worker             Text wrapper( it->second->getDescription(), TextAttributes()
5418*387f9dfdSAndroid Build Coastguard Worker                                                         .setInitialIndent( 0 )
5419*387f9dfdSAndroid Build Coastguard Worker                                                         .setIndent( 7+maxNameLen )
5420*387f9dfdSAndroid Build Coastguard Worker                                                         .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) );
5421*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "  "
5422*387f9dfdSAndroid Build Coastguard Worker                     << it->first
5423*387f9dfdSAndroid Build Coastguard Worker                     << ":"
5424*387f9dfdSAndroid Build Coastguard Worker                     << std::string( maxNameLen - it->first.size() + 2, ' ' )
5425*387f9dfdSAndroid Build Coastguard Worker                     << wrapper << "\n";
5426*387f9dfdSAndroid Build Coastguard Worker         }
5427*387f9dfdSAndroid Build Coastguard Worker         Catch::cout() << std::endl;
5428*387f9dfdSAndroid Build Coastguard Worker         return factories.size();
5429*387f9dfdSAndroid Build Coastguard Worker     }
5430*387f9dfdSAndroid Build Coastguard Worker 
list(Config const & config)5431*387f9dfdSAndroid Build Coastguard Worker     inline Option<std::size_t> list( Config const& config ) {
5432*387f9dfdSAndroid Build Coastguard Worker         Option<std::size_t> listedCount;
5433*387f9dfdSAndroid Build Coastguard Worker         if( config.listTests() )
5434*387f9dfdSAndroid Build Coastguard Worker             listedCount = listedCount.valueOr(0) + listTests( config );
5435*387f9dfdSAndroid Build Coastguard Worker         if( config.listTestNamesOnly() )
5436*387f9dfdSAndroid Build Coastguard Worker             listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
5437*387f9dfdSAndroid Build Coastguard Worker         if( config.listTags() )
5438*387f9dfdSAndroid Build Coastguard Worker             listedCount = listedCount.valueOr(0) + listTags( config );
5439*387f9dfdSAndroid Build Coastguard Worker         if( config.listReporters() )
5440*387f9dfdSAndroid Build Coastguard Worker             listedCount = listedCount.valueOr(0) + listReporters( config );
5441*387f9dfdSAndroid Build Coastguard Worker         return listedCount;
5442*387f9dfdSAndroid Build Coastguard Worker     }
5443*387f9dfdSAndroid Build Coastguard Worker 
5444*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
5445*387f9dfdSAndroid Build Coastguard Worker 
5446*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_run_context.hpp
5447*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED
5448*387f9dfdSAndroid Build Coastguard Worker 
5449*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_test_case_tracker.hpp
5450*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
5451*387f9dfdSAndroid Build Coastguard Worker 
5452*387f9dfdSAndroid Build Coastguard Worker #include <map>
5453*387f9dfdSAndroid Build Coastguard Worker #include <string>
5454*387f9dfdSAndroid Build Coastguard Worker #include <assert.h>
5455*387f9dfdSAndroid Build Coastguard Worker #include <vector>
5456*387f9dfdSAndroid Build Coastguard Worker 
5457*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5458*387f9dfdSAndroid Build Coastguard Worker namespace TestCaseTracking {
5459*387f9dfdSAndroid Build Coastguard Worker 
5460*387f9dfdSAndroid Build Coastguard Worker     struct ITracker : SharedImpl<> {
5461*387f9dfdSAndroid Build Coastguard Worker         virtual ~ITracker();
5462*387f9dfdSAndroid Build Coastguard Worker 
5463*387f9dfdSAndroid Build Coastguard Worker         // static queries
5464*387f9dfdSAndroid Build Coastguard Worker         virtual std::string name() const = 0;
5465*387f9dfdSAndroid Build Coastguard Worker 
5466*387f9dfdSAndroid Build Coastguard Worker         // dynamic queries
5467*387f9dfdSAndroid Build Coastguard Worker         virtual bool isComplete() const = 0; // Successfully completed or failed
5468*387f9dfdSAndroid Build Coastguard Worker         virtual bool isSuccessfullyCompleted() const = 0;
5469*387f9dfdSAndroid Build Coastguard Worker         virtual bool isOpen() const = 0; // Started but not complete
5470*387f9dfdSAndroid Build Coastguard Worker         virtual bool hasChildren() const = 0;
5471*387f9dfdSAndroid Build Coastguard Worker 
5472*387f9dfdSAndroid Build Coastguard Worker         virtual ITracker& parent() = 0;
5473*387f9dfdSAndroid Build Coastguard Worker 
5474*387f9dfdSAndroid Build Coastguard Worker         // actions
5475*387f9dfdSAndroid Build Coastguard Worker         virtual void close() = 0; // Successfully complete
5476*387f9dfdSAndroid Build Coastguard Worker         virtual void fail() = 0;
5477*387f9dfdSAndroid Build Coastguard Worker         virtual void markAsNeedingAnotherRun() = 0;
5478*387f9dfdSAndroid Build Coastguard Worker 
5479*387f9dfdSAndroid Build Coastguard Worker         virtual void addChild( Ptr<ITracker> const& child ) = 0;
5480*387f9dfdSAndroid Build Coastguard Worker         virtual ITracker* findChild( std::string const& name ) = 0;
5481*387f9dfdSAndroid Build Coastguard Worker         virtual void openChild() = 0;
5482*387f9dfdSAndroid Build Coastguard Worker     };
5483*387f9dfdSAndroid Build Coastguard Worker 
5484*387f9dfdSAndroid Build Coastguard Worker     class TrackerContext {
5485*387f9dfdSAndroid Build Coastguard Worker 
5486*387f9dfdSAndroid Build Coastguard Worker         enum RunState {
5487*387f9dfdSAndroid Build Coastguard Worker             NotStarted,
5488*387f9dfdSAndroid Build Coastguard Worker             Executing,
5489*387f9dfdSAndroid Build Coastguard Worker             CompletedCycle
5490*387f9dfdSAndroid Build Coastguard Worker         };
5491*387f9dfdSAndroid Build Coastguard Worker 
5492*387f9dfdSAndroid Build Coastguard Worker         Ptr<ITracker> m_rootTracker;
5493*387f9dfdSAndroid Build Coastguard Worker         ITracker* m_currentTracker;
5494*387f9dfdSAndroid Build Coastguard Worker         RunState m_runState;
5495*387f9dfdSAndroid Build Coastguard Worker 
5496*387f9dfdSAndroid Build Coastguard Worker     public:
5497*387f9dfdSAndroid Build Coastguard Worker 
instance()5498*387f9dfdSAndroid Build Coastguard Worker         static TrackerContext& instance() {
5499*387f9dfdSAndroid Build Coastguard Worker             static TrackerContext s_instance;
5500*387f9dfdSAndroid Build Coastguard Worker             return s_instance;
5501*387f9dfdSAndroid Build Coastguard Worker         }
5502*387f9dfdSAndroid Build Coastguard Worker 
TrackerContext()5503*387f9dfdSAndroid Build Coastguard Worker         TrackerContext()
5504*387f9dfdSAndroid Build Coastguard Worker         :   m_currentTracker( CATCH_NULL ),
5505*387f9dfdSAndroid Build Coastguard Worker             m_runState( NotStarted )
5506*387f9dfdSAndroid Build Coastguard Worker         {}
5507*387f9dfdSAndroid Build Coastguard Worker 
5508*387f9dfdSAndroid Build Coastguard Worker         ITracker& startRun();
5509*387f9dfdSAndroid Build Coastguard Worker 
endRun()5510*387f9dfdSAndroid Build Coastguard Worker         void endRun() {
5511*387f9dfdSAndroid Build Coastguard Worker             m_rootTracker.reset();
5512*387f9dfdSAndroid Build Coastguard Worker             m_currentTracker = CATCH_NULL;
5513*387f9dfdSAndroid Build Coastguard Worker             m_runState = NotStarted;
5514*387f9dfdSAndroid Build Coastguard Worker         }
5515*387f9dfdSAndroid Build Coastguard Worker 
startCycle()5516*387f9dfdSAndroid Build Coastguard Worker         void startCycle() {
5517*387f9dfdSAndroid Build Coastguard Worker             m_currentTracker = m_rootTracker.get();
5518*387f9dfdSAndroid Build Coastguard Worker             m_runState = Executing;
5519*387f9dfdSAndroid Build Coastguard Worker         }
completeCycle()5520*387f9dfdSAndroid Build Coastguard Worker         void completeCycle() {
5521*387f9dfdSAndroid Build Coastguard Worker             m_runState = CompletedCycle;
5522*387f9dfdSAndroid Build Coastguard Worker         }
5523*387f9dfdSAndroid Build Coastguard Worker 
completedCycle() const5524*387f9dfdSAndroid Build Coastguard Worker         bool completedCycle() const {
5525*387f9dfdSAndroid Build Coastguard Worker             return m_runState == CompletedCycle;
5526*387f9dfdSAndroid Build Coastguard Worker         }
currentTracker()5527*387f9dfdSAndroid Build Coastguard Worker         ITracker& currentTracker() {
5528*387f9dfdSAndroid Build Coastguard Worker             return *m_currentTracker;
5529*387f9dfdSAndroid Build Coastguard Worker         }
setCurrentTracker(ITracker * tracker)5530*387f9dfdSAndroid Build Coastguard Worker         void setCurrentTracker( ITracker* tracker ) {
5531*387f9dfdSAndroid Build Coastguard Worker             m_currentTracker = tracker;
5532*387f9dfdSAndroid Build Coastguard Worker         }
5533*387f9dfdSAndroid Build Coastguard Worker     };
5534*387f9dfdSAndroid Build Coastguard Worker 
5535*387f9dfdSAndroid Build Coastguard Worker     class TrackerBase : public ITracker {
5536*387f9dfdSAndroid Build Coastguard Worker     protected:
5537*387f9dfdSAndroid Build Coastguard Worker         enum CycleState {
5538*387f9dfdSAndroid Build Coastguard Worker             NotStarted,
5539*387f9dfdSAndroid Build Coastguard Worker             Executing,
5540*387f9dfdSAndroid Build Coastguard Worker             ExecutingChildren,
5541*387f9dfdSAndroid Build Coastguard Worker             NeedsAnotherRun,
5542*387f9dfdSAndroid Build Coastguard Worker             CompletedSuccessfully,
5543*387f9dfdSAndroid Build Coastguard Worker             Failed
5544*387f9dfdSAndroid Build Coastguard Worker         };
5545*387f9dfdSAndroid Build Coastguard Worker         class TrackerHasName {
5546*387f9dfdSAndroid Build Coastguard Worker             std::string m_name;
5547*387f9dfdSAndroid Build Coastguard Worker         public:
TrackerHasName(std::string const & name)5548*387f9dfdSAndroid Build Coastguard Worker             TrackerHasName( std::string const& name ) : m_name( name ) {}
operator ()(Ptr<ITracker> const & tracker)5549*387f9dfdSAndroid Build Coastguard Worker             bool operator ()( Ptr<ITracker> const& tracker ) {
5550*387f9dfdSAndroid Build Coastguard Worker                 return tracker->name() == m_name;
5551*387f9dfdSAndroid Build Coastguard Worker             }
5552*387f9dfdSAndroid Build Coastguard Worker         };
5553*387f9dfdSAndroid Build Coastguard Worker         typedef std::vector<Ptr<ITracker> > Children;
5554*387f9dfdSAndroid Build Coastguard Worker         std::string m_name;
5555*387f9dfdSAndroid Build Coastguard Worker         TrackerContext& m_ctx;
5556*387f9dfdSAndroid Build Coastguard Worker         ITracker* m_parent;
5557*387f9dfdSAndroid Build Coastguard Worker         Children m_children;
5558*387f9dfdSAndroid Build Coastguard Worker         CycleState m_runState;
5559*387f9dfdSAndroid Build Coastguard Worker     public:
TrackerBase(std::string const & name,TrackerContext & ctx,ITracker * parent)5560*387f9dfdSAndroid Build Coastguard Worker         TrackerBase( std::string const& name, TrackerContext& ctx, ITracker* parent )
5561*387f9dfdSAndroid Build Coastguard Worker         :   m_name( name ),
5562*387f9dfdSAndroid Build Coastguard Worker             m_ctx( ctx ),
5563*387f9dfdSAndroid Build Coastguard Worker             m_parent( parent ),
5564*387f9dfdSAndroid Build Coastguard Worker             m_runState( NotStarted )
5565*387f9dfdSAndroid Build Coastguard Worker         {}
5566*387f9dfdSAndroid Build Coastguard Worker         virtual ~TrackerBase();
5567*387f9dfdSAndroid Build Coastguard Worker 
name() const5568*387f9dfdSAndroid Build Coastguard Worker         virtual std::string name() const CATCH_OVERRIDE {
5569*387f9dfdSAndroid Build Coastguard Worker             return m_name;
5570*387f9dfdSAndroid Build Coastguard Worker         }
isComplete() const5571*387f9dfdSAndroid Build Coastguard Worker         virtual bool isComplete() const CATCH_OVERRIDE {
5572*387f9dfdSAndroid Build Coastguard Worker             return m_runState == CompletedSuccessfully || m_runState == Failed;
5573*387f9dfdSAndroid Build Coastguard Worker         }
isSuccessfullyCompleted() const5574*387f9dfdSAndroid Build Coastguard Worker         virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE {
5575*387f9dfdSAndroid Build Coastguard Worker             return m_runState == CompletedSuccessfully;
5576*387f9dfdSAndroid Build Coastguard Worker         }
isOpen() const5577*387f9dfdSAndroid Build Coastguard Worker         virtual bool isOpen() const CATCH_OVERRIDE {
5578*387f9dfdSAndroid Build Coastguard Worker             return m_runState != NotStarted && !isComplete();
5579*387f9dfdSAndroid Build Coastguard Worker         }
hasChildren() const5580*387f9dfdSAndroid Build Coastguard Worker         virtual bool hasChildren() const CATCH_OVERRIDE {
5581*387f9dfdSAndroid Build Coastguard Worker             return !m_children.empty();
5582*387f9dfdSAndroid Build Coastguard Worker         }
5583*387f9dfdSAndroid Build Coastguard Worker 
addChild(Ptr<ITracker> const & child)5584*387f9dfdSAndroid Build Coastguard Worker         virtual void addChild( Ptr<ITracker> const& child ) CATCH_OVERRIDE {
5585*387f9dfdSAndroid Build Coastguard Worker             m_children.push_back( child );
5586*387f9dfdSAndroid Build Coastguard Worker         }
5587*387f9dfdSAndroid Build Coastguard Worker 
findChild(std::string const & name)5588*387f9dfdSAndroid Build Coastguard Worker         virtual ITracker* findChild( std::string const& name ) CATCH_OVERRIDE {
5589*387f9dfdSAndroid Build Coastguard Worker             Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( name ) );
5590*387f9dfdSAndroid Build Coastguard Worker             return( it != m_children.end() )
5591*387f9dfdSAndroid Build Coastguard Worker                 ? it->get()
5592*387f9dfdSAndroid Build Coastguard Worker                 : CATCH_NULL;
5593*387f9dfdSAndroid Build Coastguard Worker         }
parent()5594*387f9dfdSAndroid Build Coastguard Worker         virtual ITracker& parent() CATCH_OVERRIDE {
5595*387f9dfdSAndroid Build Coastguard Worker             assert( m_parent ); // Should always be non-null except for root
5596*387f9dfdSAndroid Build Coastguard Worker             return *m_parent;
5597*387f9dfdSAndroid Build Coastguard Worker         }
5598*387f9dfdSAndroid Build Coastguard Worker 
openChild()5599*387f9dfdSAndroid Build Coastguard Worker         virtual void openChild() CATCH_OVERRIDE {
5600*387f9dfdSAndroid Build Coastguard Worker             if( m_runState != ExecutingChildren ) {
5601*387f9dfdSAndroid Build Coastguard Worker                 m_runState = ExecutingChildren;
5602*387f9dfdSAndroid Build Coastguard Worker                 if( m_parent )
5603*387f9dfdSAndroid Build Coastguard Worker                     m_parent->openChild();
5604*387f9dfdSAndroid Build Coastguard Worker             }
5605*387f9dfdSAndroid Build Coastguard Worker         }
open()5606*387f9dfdSAndroid Build Coastguard Worker         void open() {
5607*387f9dfdSAndroid Build Coastguard Worker             m_runState = Executing;
5608*387f9dfdSAndroid Build Coastguard Worker             moveToThis();
5609*387f9dfdSAndroid Build Coastguard Worker             if( m_parent )
5610*387f9dfdSAndroid Build Coastguard Worker                 m_parent->openChild();
5611*387f9dfdSAndroid Build Coastguard Worker         }
5612*387f9dfdSAndroid Build Coastguard Worker 
close()5613*387f9dfdSAndroid Build Coastguard Worker         virtual void close() CATCH_OVERRIDE {
5614*387f9dfdSAndroid Build Coastguard Worker 
5615*387f9dfdSAndroid Build Coastguard Worker             // Close any still open children (e.g. generators)
5616*387f9dfdSAndroid Build Coastguard Worker             while( &m_ctx.currentTracker() != this )
5617*387f9dfdSAndroid Build Coastguard Worker                 m_ctx.currentTracker().close();
5618*387f9dfdSAndroid Build Coastguard Worker 
5619*387f9dfdSAndroid Build Coastguard Worker             switch( m_runState ) {
5620*387f9dfdSAndroid Build Coastguard Worker                 case NotStarted:
5621*387f9dfdSAndroid Build Coastguard Worker                 case CompletedSuccessfully:
5622*387f9dfdSAndroid Build Coastguard Worker                 case Failed:
5623*387f9dfdSAndroid Build Coastguard Worker                     throw std::logic_error( "Illogical state" );
5624*387f9dfdSAndroid Build Coastguard Worker 
5625*387f9dfdSAndroid Build Coastguard Worker                 case NeedsAnotherRun:
5626*387f9dfdSAndroid Build Coastguard Worker                     break;;
5627*387f9dfdSAndroid Build Coastguard Worker 
5628*387f9dfdSAndroid Build Coastguard Worker                 case Executing:
5629*387f9dfdSAndroid Build Coastguard Worker                     m_runState = CompletedSuccessfully;
5630*387f9dfdSAndroid Build Coastguard Worker                     break;
5631*387f9dfdSAndroid Build Coastguard Worker                 case ExecutingChildren:
5632*387f9dfdSAndroid Build Coastguard Worker                     if( m_children.empty() || m_children.back()->isComplete() )
5633*387f9dfdSAndroid Build Coastguard Worker                         m_runState = CompletedSuccessfully;
5634*387f9dfdSAndroid Build Coastguard Worker                     break;
5635*387f9dfdSAndroid Build Coastguard Worker 
5636*387f9dfdSAndroid Build Coastguard Worker                 default:
5637*387f9dfdSAndroid Build Coastguard Worker                     throw std::logic_error( "Unexpected state" );
5638*387f9dfdSAndroid Build Coastguard Worker             }
5639*387f9dfdSAndroid Build Coastguard Worker             moveToParent();
5640*387f9dfdSAndroid Build Coastguard Worker             m_ctx.completeCycle();
5641*387f9dfdSAndroid Build Coastguard Worker         }
fail()5642*387f9dfdSAndroid Build Coastguard Worker         virtual void fail() CATCH_OVERRIDE {
5643*387f9dfdSAndroid Build Coastguard Worker             m_runState = Failed;
5644*387f9dfdSAndroid Build Coastguard Worker             if( m_parent )
5645*387f9dfdSAndroid Build Coastguard Worker                 m_parent->markAsNeedingAnotherRun();
5646*387f9dfdSAndroid Build Coastguard Worker             moveToParent();
5647*387f9dfdSAndroid Build Coastguard Worker             m_ctx.completeCycle();
5648*387f9dfdSAndroid Build Coastguard Worker         }
markAsNeedingAnotherRun()5649*387f9dfdSAndroid Build Coastguard Worker         virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE {
5650*387f9dfdSAndroid Build Coastguard Worker             m_runState = NeedsAnotherRun;
5651*387f9dfdSAndroid Build Coastguard Worker         }
5652*387f9dfdSAndroid Build Coastguard Worker     private:
moveToParent()5653*387f9dfdSAndroid Build Coastguard Worker         void moveToParent() {
5654*387f9dfdSAndroid Build Coastguard Worker             assert( m_parent );
5655*387f9dfdSAndroid Build Coastguard Worker             m_ctx.setCurrentTracker( m_parent );
5656*387f9dfdSAndroid Build Coastguard Worker         }
moveToThis()5657*387f9dfdSAndroid Build Coastguard Worker         void moveToThis() {
5658*387f9dfdSAndroid Build Coastguard Worker             m_ctx.setCurrentTracker( this );
5659*387f9dfdSAndroid Build Coastguard Worker         }
5660*387f9dfdSAndroid Build Coastguard Worker     };
5661*387f9dfdSAndroid Build Coastguard Worker 
5662*387f9dfdSAndroid Build Coastguard Worker     class SectionTracker : public TrackerBase {
5663*387f9dfdSAndroid Build Coastguard Worker     public:
SectionTracker(std::string const & name,TrackerContext & ctx,ITracker * parent)5664*387f9dfdSAndroid Build Coastguard Worker         SectionTracker( std::string const& name, TrackerContext& ctx, ITracker* parent )
5665*387f9dfdSAndroid Build Coastguard Worker         :   TrackerBase( name, ctx, parent )
5666*387f9dfdSAndroid Build Coastguard Worker         {}
5667*387f9dfdSAndroid Build Coastguard Worker         virtual ~SectionTracker();
5668*387f9dfdSAndroid Build Coastguard Worker 
acquire(TrackerContext & ctx,std::string const & name)5669*387f9dfdSAndroid Build Coastguard Worker         static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) {
5670*387f9dfdSAndroid Build Coastguard Worker             SectionTracker* section = CATCH_NULL;
5671*387f9dfdSAndroid Build Coastguard Worker 
5672*387f9dfdSAndroid Build Coastguard Worker             ITracker& currentTracker = ctx.currentTracker();
5673*387f9dfdSAndroid Build Coastguard Worker             if( ITracker* childTracker = currentTracker.findChild( name ) ) {
5674*387f9dfdSAndroid Build Coastguard Worker                 section = dynamic_cast<SectionTracker*>( childTracker );
5675*387f9dfdSAndroid Build Coastguard Worker                 assert( section );
5676*387f9dfdSAndroid Build Coastguard Worker             }
5677*387f9dfdSAndroid Build Coastguard Worker             else {
5678*387f9dfdSAndroid Build Coastguard Worker                 section = new SectionTracker( name, ctx, &currentTracker );
5679*387f9dfdSAndroid Build Coastguard Worker                 currentTracker.addChild( section );
5680*387f9dfdSAndroid Build Coastguard Worker             }
5681*387f9dfdSAndroid Build Coastguard Worker             if( !ctx.completedCycle() && !section->isComplete() ) {
5682*387f9dfdSAndroid Build Coastguard Worker 
5683*387f9dfdSAndroid Build Coastguard Worker                 section->open();
5684*387f9dfdSAndroid Build Coastguard Worker             }
5685*387f9dfdSAndroid Build Coastguard Worker             return *section;
5686*387f9dfdSAndroid Build Coastguard Worker         }
5687*387f9dfdSAndroid Build Coastguard Worker     };
5688*387f9dfdSAndroid Build Coastguard Worker 
5689*387f9dfdSAndroid Build Coastguard Worker     class IndexTracker : public TrackerBase {
5690*387f9dfdSAndroid Build Coastguard Worker         int m_size;
5691*387f9dfdSAndroid Build Coastguard Worker         int m_index;
5692*387f9dfdSAndroid Build Coastguard Worker     public:
IndexTracker(std::string const & name,TrackerContext & ctx,ITracker * parent,int size)5693*387f9dfdSAndroid Build Coastguard Worker         IndexTracker( std::string const& name, TrackerContext& ctx, ITracker* parent, int size )
5694*387f9dfdSAndroid Build Coastguard Worker         :   TrackerBase( name, ctx, parent ),
5695*387f9dfdSAndroid Build Coastguard Worker             m_size( size ),
5696*387f9dfdSAndroid Build Coastguard Worker             m_index( -1 )
5697*387f9dfdSAndroid Build Coastguard Worker         {}
5698*387f9dfdSAndroid Build Coastguard Worker         virtual ~IndexTracker();
5699*387f9dfdSAndroid Build Coastguard Worker 
acquire(TrackerContext & ctx,std::string const & name,int size)5700*387f9dfdSAndroid Build Coastguard Worker         static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) {
5701*387f9dfdSAndroid Build Coastguard Worker             IndexTracker* tracker = CATCH_NULL;
5702*387f9dfdSAndroid Build Coastguard Worker 
5703*387f9dfdSAndroid Build Coastguard Worker             ITracker& currentTracker = ctx.currentTracker();
5704*387f9dfdSAndroid Build Coastguard Worker             if( ITracker* childTracker = currentTracker.findChild( name ) ) {
5705*387f9dfdSAndroid Build Coastguard Worker                 tracker = dynamic_cast<IndexTracker*>( childTracker );
5706*387f9dfdSAndroid Build Coastguard Worker                 assert( tracker );
5707*387f9dfdSAndroid Build Coastguard Worker             }
5708*387f9dfdSAndroid Build Coastguard Worker             else {
5709*387f9dfdSAndroid Build Coastguard Worker                 tracker = new IndexTracker( name, ctx, &currentTracker, size );
5710*387f9dfdSAndroid Build Coastguard Worker                 currentTracker.addChild( tracker );
5711*387f9dfdSAndroid Build Coastguard Worker             }
5712*387f9dfdSAndroid Build Coastguard Worker 
5713*387f9dfdSAndroid Build Coastguard Worker             if( !ctx.completedCycle() && !tracker->isComplete() ) {
5714*387f9dfdSAndroid Build Coastguard Worker                 if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun )
5715*387f9dfdSAndroid Build Coastguard Worker                     tracker->moveNext();
5716*387f9dfdSAndroid Build Coastguard Worker                 tracker->open();
5717*387f9dfdSAndroid Build Coastguard Worker             }
5718*387f9dfdSAndroid Build Coastguard Worker 
5719*387f9dfdSAndroid Build Coastguard Worker             return *tracker;
5720*387f9dfdSAndroid Build Coastguard Worker         }
5721*387f9dfdSAndroid Build Coastguard Worker 
index() const5722*387f9dfdSAndroid Build Coastguard Worker         int index() const { return m_index; }
5723*387f9dfdSAndroid Build Coastguard Worker 
moveNext()5724*387f9dfdSAndroid Build Coastguard Worker         void moveNext() {
5725*387f9dfdSAndroid Build Coastguard Worker             m_index++;
5726*387f9dfdSAndroid Build Coastguard Worker             m_children.clear();
5727*387f9dfdSAndroid Build Coastguard Worker         }
5728*387f9dfdSAndroid Build Coastguard Worker 
close()5729*387f9dfdSAndroid Build Coastguard Worker         virtual void close() CATCH_OVERRIDE {
5730*387f9dfdSAndroid Build Coastguard Worker             TrackerBase::close();
5731*387f9dfdSAndroid Build Coastguard Worker             if( m_runState == CompletedSuccessfully && m_index < m_size-1 )
5732*387f9dfdSAndroid Build Coastguard Worker                 m_runState = Executing;
5733*387f9dfdSAndroid Build Coastguard Worker         }
5734*387f9dfdSAndroid Build Coastguard Worker     };
5735*387f9dfdSAndroid Build Coastguard Worker 
startRun()5736*387f9dfdSAndroid Build Coastguard Worker     inline ITracker& TrackerContext::startRun() {
5737*387f9dfdSAndroid Build Coastguard Worker         m_rootTracker = new SectionTracker( "{root}", *this, CATCH_NULL );
5738*387f9dfdSAndroid Build Coastguard Worker         m_currentTracker = CATCH_NULL;
5739*387f9dfdSAndroid Build Coastguard Worker         m_runState = Executing;
5740*387f9dfdSAndroid Build Coastguard Worker         return *m_rootTracker;
5741*387f9dfdSAndroid Build Coastguard Worker     }
5742*387f9dfdSAndroid Build Coastguard Worker 
5743*387f9dfdSAndroid Build Coastguard Worker } // namespace TestCaseTracking
5744*387f9dfdSAndroid Build Coastguard Worker 
5745*387f9dfdSAndroid Build Coastguard Worker using TestCaseTracking::ITracker;
5746*387f9dfdSAndroid Build Coastguard Worker using TestCaseTracking::TrackerContext;
5747*387f9dfdSAndroid Build Coastguard Worker using TestCaseTracking::SectionTracker;
5748*387f9dfdSAndroid Build Coastguard Worker using TestCaseTracking::IndexTracker;
5749*387f9dfdSAndroid Build Coastguard Worker 
5750*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
5751*387f9dfdSAndroid Build Coastguard Worker 
5752*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_fatal_condition.hpp
5753*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
5754*387f9dfdSAndroid Build Coastguard Worker 
5755*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5756*387f9dfdSAndroid Build Coastguard Worker 
5757*387f9dfdSAndroid Build Coastguard Worker     // Report the error condition then exit the process
fatal(std::string const & message,int exitCode)5758*387f9dfdSAndroid Build Coastguard Worker     inline void fatal( std::string const& message, int exitCode ) {
5759*387f9dfdSAndroid Build Coastguard Worker         IContext& context = Catch::getCurrentContext();
5760*387f9dfdSAndroid Build Coastguard Worker         IResultCapture* resultCapture = context.getResultCapture();
5761*387f9dfdSAndroid Build Coastguard Worker         resultCapture->handleFatalErrorCondition( message );
5762*387f9dfdSAndroid Build Coastguard Worker 
5763*387f9dfdSAndroid Build Coastguard Worker 		if( Catch::alwaysTrue() ) // avoids "no return" warnings
5764*387f9dfdSAndroid Build Coastguard Worker             exit( exitCode );
5765*387f9dfdSAndroid Build Coastguard Worker     }
5766*387f9dfdSAndroid Build Coastguard Worker 
5767*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
5768*387f9dfdSAndroid Build Coastguard Worker 
5769*387f9dfdSAndroid Build Coastguard Worker #if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
5770*387f9dfdSAndroid Build Coastguard Worker 
5771*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5772*387f9dfdSAndroid Build Coastguard Worker 
5773*387f9dfdSAndroid Build Coastguard Worker     struct FatalConditionHandler {
resetCatch::FatalConditionHandler5774*387f9dfdSAndroid Build Coastguard Worker 		void reset() {}
5775*387f9dfdSAndroid Build Coastguard Worker 	};
5776*387f9dfdSAndroid Build Coastguard Worker 
5777*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
5778*387f9dfdSAndroid Build Coastguard Worker 
5779*387f9dfdSAndroid Build Coastguard Worker #else // Not Windows - assumed to be POSIX compatible //////////////////////////
5780*387f9dfdSAndroid Build Coastguard Worker 
5781*387f9dfdSAndroid Build Coastguard Worker #include <signal.h>
5782*387f9dfdSAndroid Build Coastguard Worker 
5783*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5784*387f9dfdSAndroid Build Coastguard Worker 
5785*387f9dfdSAndroid Build Coastguard Worker     struct SignalDefs { int id; const char* name; };
5786*387f9dfdSAndroid Build Coastguard Worker     extern SignalDefs signalDefs[];
5787*387f9dfdSAndroid Build Coastguard Worker     SignalDefs signalDefs[] = {
5788*387f9dfdSAndroid Build Coastguard Worker             { SIGINT,  "SIGINT - Terminal interrupt signal" },
5789*387f9dfdSAndroid Build Coastguard Worker             { SIGILL,  "SIGILL - Illegal instruction signal" },
5790*387f9dfdSAndroid Build Coastguard Worker             { SIGFPE,  "SIGFPE - Floating point error signal" },
5791*387f9dfdSAndroid Build Coastguard Worker             { SIGSEGV, "SIGSEGV - Segmentation violation signal" },
5792*387f9dfdSAndroid Build Coastguard Worker             { SIGTERM, "SIGTERM - Termination request signal" },
5793*387f9dfdSAndroid Build Coastguard Worker             { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" }
5794*387f9dfdSAndroid Build Coastguard Worker         };
5795*387f9dfdSAndroid Build Coastguard Worker 
5796*387f9dfdSAndroid Build Coastguard Worker     struct FatalConditionHandler {
5797*387f9dfdSAndroid Build Coastguard Worker 
handleSignalCatch::FatalConditionHandler5798*387f9dfdSAndroid Build Coastguard Worker         static void handleSignal( int sig ) {
5799*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
5800*387f9dfdSAndroid Build Coastguard Worker                 if( sig == signalDefs[i].id )
5801*387f9dfdSAndroid Build Coastguard Worker                     fatal( signalDefs[i].name, -sig );
5802*387f9dfdSAndroid Build Coastguard Worker             fatal( "<unknown signal>", -sig );
5803*387f9dfdSAndroid Build Coastguard Worker         }
5804*387f9dfdSAndroid Build Coastguard Worker 
FatalConditionHandlerCatch::FatalConditionHandler5805*387f9dfdSAndroid Build Coastguard Worker         FatalConditionHandler() : m_isSet( true ) {
5806*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
5807*387f9dfdSAndroid Build Coastguard Worker                 signal( signalDefs[i].id, handleSignal );
5808*387f9dfdSAndroid Build Coastguard Worker         }
~FatalConditionHandlerCatch::FatalConditionHandler5809*387f9dfdSAndroid Build Coastguard Worker         ~FatalConditionHandler() {
5810*387f9dfdSAndroid Build Coastguard Worker             reset();
5811*387f9dfdSAndroid Build Coastguard Worker         }
resetCatch::FatalConditionHandler5812*387f9dfdSAndroid Build Coastguard Worker         void reset() {
5813*387f9dfdSAndroid Build Coastguard Worker             if( m_isSet ) {
5814*387f9dfdSAndroid Build Coastguard Worker                 for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
5815*387f9dfdSAndroid Build Coastguard Worker                     signal( signalDefs[i].id, SIG_DFL );
5816*387f9dfdSAndroid Build Coastguard Worker                 m_isSet = false;
5817*387f9dfdSAndroid Build Coastguard Worker             }
5818*387f9dfdSAndroid Build Coastguard Worker         }
5819*387f9dfdSAndroid Build Coastguard Worker 
5820*387f9dfdSAndroid Build Coastguard Worker         bool m_isSet;
5821*387f9dfdSAndroid Build Coastguard Worker     };
5822*387f9dfdSAndroid Build Coastguard Worker 
5823*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
5824*387f9dfdSAndroid Build Coastguard Worker 
5825*387f9dfdSAndroid Build Coastguard Worker #endif // not Windows
5826*387f9dfdSAndroid Build Coastguard Worker 
5827*387f9dfdSAndroid Build Coastguard Worker #include <set>
5828*387f9dfdSAndroid Build Coastguard Worker #include <string>
5829*387f9dfdSAndroid Build Coastguard Worker 
5830*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
5831*387f9dfdSAndroid Build Coastguard Worker 
5832*387f9dfdSAndroid Build Coastguard Worker     class StreamRedirect {
5833*387f9dfdSAndroid Build Coastguard Worker 
5834*387f9dfdSAndroid Build Coastguard Worker     public:
StreamRedirect(std::ostream & stream,std::string & targetString)5835*387f9dfdSAndroid Build Coastguard Worker         StreamRedirect( std::ostream& stream, std::string& targetString )
5836*387f9dfdSAndroid Build Coastguard Worker         :   m_stream( stream ),
5837*387f9dfdSAndroid Build Coastguard Worker             m_prevBuf( stream.rdbuf() ),
5838*387f9dfdSAndroid Build Coastguard Worker             m_targetString( targetString )
5839*387f9dfdSAndroid Build Coastguard Worker         {
5840*387f9dfdSAndroid Build Coastguard Worker             stream.rdbuf( m_oss.rdbuf() );
5841*387f9dfdSAndroid Build Coastguard Worker         }
5842*387f9dfdSAndroid Build Coastguard Worker 
~StreamRedirect()5843*387f9dfdSAndroid Build Coastguard Worker         ~StreamRedirect() {
5844*387f9dfdSAndroid Build Coastguard Worker             m_targetString += m_oss.str();
5845*387f9dfdSAndroid Build Coastguard Worker             m_stream.rdbuf( m_prevBuf );
5846*387f9dfdSAndroid Build Coastguard Worker         }
5847*387f9dfdSAndroid Build Coastguard Worker 
5848*387f9dfdSAndroid Build Coastguard Worker     private:
5849*387f9dfdSAndroid Build Coastguard Worker         std::ostream& m_stream;
5850*387f9dfdSAndroid Build Coastguard Worker         std::streambuf* m_prevBuf;
5851*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream m_oss;
5852*387f9dfdSAndroid Build Coastguard Worker         std::string& m_targetString;
5853*387f9dfdSAndroid Build Coastguard Worker     };
5854*387f9dfdSAndroid Build Coastguard Worker 
5855*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
5856*387f9dfdSAndroid Build Coastguard Worker 
5857*387f9dfdSAndroid Build Coastguard Worker     class RunContext : public IResultCapture, public IRunner {
5858*387f9dfdSAndroid Build Coastguard Worker 
5859*387f9dfdSAndroid Build Coastguard Worker         RunContext( RunContext const& );
5860*387f9dfdSAndroid Build Coastguard Worker         void operator =( RunContext const& );
5861*387f9dfdSAndroid Build Coastguard Worker 
5862*387f9dfdSAndroid Build Coastguard Worker     public:
5863*387f9dfdSAndroid Build Coastguard Worker 
RunContext(Ptr<IConfig const> const & _config,Ptr<IStreamingReporter> const & reporter)5864*387f9dfdSAndroid Build Coastguard Worker         explicit RunContext( Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter )
5865*387f9dfdSAndroid Build Coastguard Worker         :   m_runInfo( _config->name() ),
5866*387f9dfdSAndroid Build Coastguard Worker             m_context( getCurrentMutableContext() ),
5867*387f9dfdSAndroid Build Coastguard Worker             m_activeTestCase( CATCH_NULL ),
5868*387f9dfdSAndroid Build Coastguard Worker             m_config( _config ),
5869*387f9dfdSAndroid Build Coastguard Worker             m_reporter( reporter )
5870*387f9dfdSAndroid Build Coastguard Worker         {
5871*387f9dfdSAndroid Build Coastguard Worker             m_context.setRunner( this );
5872*387f9dfdSAndroid Build Coastguard Worker             m_context.setConfig( m_config );
5873*387f9dfdSAndroid Build Coastguard Worker             m_context.setResultCapture( this );
5874*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testRunStarting( m_runInfo );
5875*387f9dfdSAndroid Build Coastguard Worker         }
5876*387f9dfdSAndroid Build Coastguard Worker 
~RunContext()5877*387f9dfdSAndroid Build Coastguard Worker         virtual ~RunContext() {
5878*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) );
5879*387f9dfdSAndroid Build Coastguard Worker         }
5880*387f9dfdSAndroid Build Coastguard Worker 
testGroupStarting(std::string const & testSpec,std::size_t groupIndex,std::size_t groupsCount)5881*387f9dfdSAndroid Build Coastguard Worker         void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
5882*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) );
5883*387f9dfdSAndroid Build Coastguard Worker         }
testGroupEnded(std::string const & testSpec,Totals const & totals,std::size_t groupIndex,std::size_t groupsCount)5884*387f9dfdSAndroid Build Coastguard Worker         void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) {
5885*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
5886*387f9dfdSAndroid Build Coastguard Worker         }
5887*387f9dfdSAndroid Build Coastguard Worker 
runTest(TestCase const & testCase)5888*387f9dfdSAndroid Build Coastguard Worker         Totals runTest( TestCase const& testCase ) {
5889*387f9dfdSAndroid Build Coastguard Worker             Totals prevTotals = m_totals;
5890*387f9dfdSAndroid Build Coastguard Worker 
5891*387f9dfdSAndroid Build Coastguard Worker             std::string redirectedCout;
5892*387f9dfdSAndroid Build Coastguard Worker             std::string redirectedCerr;
5893*387f9dfdSAndroid Build Coastguard Worker 
5894*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo testInfo = testCase.getTestCaseInfo();
5895*387f9dfdSAndroid Build Coastguard Worker 
5896*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testCaseStarting( testInfo );
5897*387f9dfdSAndroid Build Coastguard Worker 
5898*387f9dfdSAndroid Build Coastguard Worker             m_activeTestCase = &testCase;
5899*387f9dfdSAndroid Build Coastguard Worker 
5900*387f9dfdSAndroid Build Coastguard Worker             do {
5901*387f9dfdSAndroid Build Coastguard Worker                 m_trackerContext.startRun();
5902*387f9dfdSAndroid Build Coastguard Worker                 do {
5903*387f9dfdSAndroid Build Coastguard Worker                     m_trackerContext.startCycle();
5904*387f9dfdSAndroid Build Coastguard Worker                     m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name );
5905*387f9dfdSAndroid Build Coastguard Worker                     runCurrentTest( redirectedCout, redirectedCerr );
5906*387f9dfdSAndroid Build Coastguard Worker                 }
5907*387f9dfdSAndroid Build Coastguard Worker                 while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() );
5908*387f9dfdSAndroid Build Coastguard Worker             }
5909*387f9dfdSAndroid Build Coastguard Worker             // !TBD: deprecated - this will be replaced by indexed trackers
5910*387f9dfdSAndroid Build Coastguard Worker             while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
5911*387f9dfdSAndroid Build Coastguard Worker 
5912*387f9dfdSAndroid Build Coastguard Worker             Totals deltaTotals = m_totals.delta( prevTotals );
5913*387f9dfdSAndroid Build Coastguard Worker             if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) {
5914*387f9dfdSAndroid Build Coastguard Worker                 deltaTotals.assertions.failed++;
5915*387f9dfdSAndroid Build Coastguard Worker                 deltaTotals.testCases.passed--;
5916*387f9dfdSAndroid Build Coastguard Worker                 deltaTotals.testCases.failed++;
5917*387f9dfdSAndroid Build Coastguard Worker             }
5918*387f9dfdSAndroid Build Coastguard Worker             m_totals.testCases += deltaTotals.testCases;
5919*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testCaseEnded( TestCaseStats(   testInfo,
5920*387f9dfdSAndroid Build Coastguard Worker                                                         deltaTotals,
5921*387f9dfdSAndroid Build Coastguard Worker                                                         redirectedCout,
5922*387f9dfdSAndroid Build Coastguard Worker                                                         redirectedCerr,
5923*387f9dfdSAndroid Build Coastguard Worker                                                         aborting() ) );
5924*387f9dfdSAndroid Build Coastguard Worker 
5925*387f9dfdSAndroid Build Coastguard Worker             m_activeTestCase = CATCH_NULL;
5926*387f9dfdSAndroid Build Coastguard Worker             m_testCaseTracker = CATCH_NULL;
5927*387f9dfdSAndroid Build Coastguard Worker 
5928*387f9dfdSAndroid Build Coastguard Worker             return deltaTotals;
5929*387f9dfdSAndroid Build Coastguard Worker         }
5930*387f9dfdSAndroid Build Coastguard Worker 
config() const5931*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> config() const {
5932*387f9dfdSAndroid Build Coastguard Worker             return m_config;
5933*387f9dfdSAndroid Build Coastguard Worker         }
5934*387f9dfdSAndroid Build Coastguard Worker 
5935*387f9dfdSAndroid Build Coastguard Worker     private: // IResultCapture
5936*387f9dfdSAndroid Build Coastguard Worker 
assertionEnded(AssertionResult const & result)5937*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionEnded( AssertionResult const& result ) {
5938*387f9dfdSAndroid Build Coastguard Worker             if( result.getResultType() == ResultWas::Ok ) {
5939*387f9dfdSAndroid Build Coastguard Worker                 m_totals.assertions.passed++;
5940*387f9dfdSAndroid Build Coastguard Worker             }
5941*387f9dfdSAndroid Build Coastguard Worker             else if( !result.isOk() ) {
5942*387f9dfdSAndroid Build Coastguard Worker                 m_totals.assertions.failed++;
5943*387f9dfdSAndroid Build Coastguard Worker             }
5944*387f9dfdSAndroid Build Coastguard Worker 
5945*387f9dfdSAndroid Build Coastguard Worker             if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) )
5946*387f9dfdSAndroid Build Coastguard Worker                 m_messages.clear();
5947*387f9dfdSAndroid Build Coastguard Worker 
5948*387f9dfdSAndroid Build Coastguard Worker             // Reset working state
5949*387f9dfdSAndroid Build Coastguard Worker             m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
5950*387f9dfdSAndroid Build Coastguard Worker             m_lastResult = result;
5951*387f9dfdSAndroid Build Coastguard Worker         }
5952*387f9dfdSAndroid Build Coastguard Worker 
sectionStarted(SectionInfo const & sectionInfo,Counts & assertions)5953*387f9dfdSAndroid Build Coastguard Worker         virtual bool sectionStarted (
5954*387f9dfdSAndroid Build Coastguard Worker             SectionInfo const& sectionInfo,
5955*387f9dfdSAndroid Build Coastguard Worker             Counts& assertions
5956*387f9dfdSAndroid Build Coastguard Worker         )
5957*387f9dfdSAndroid Build Coastguard Worker         {
5958*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
5959*387f9dfdSAndroid Build Coastguard Worker             oss << sectionInfo.name << "@" << sectionInfo.lineInfo;
5960*387f9dfdSAndroid Build Coastguard Worker 
5961*387f9dfdSAndroid Build Coastguard Worker             ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, oss.str() );
5962*387f9dfdSAndroid Build Coastguard Worker             if( !sectionTracker.isOpen() )
5963*387f9dfdSAndroid Build Coastguard Worker                 return false;
5964*387f9dfdSAndroid Build Coastguard Worker             m_activeSections.push_back( &sectionTracker );
5965*387f9dfdSAndroid Build Coastguard Worker 
5966*387f9dfdSAndroid Build Coastguard Worker             m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
5967*387f9dfdSAndroid Build Coastguard Worker 
5968*387f9dfdSAndroid Build Coastguard Worker             m_reporter->sectionStarting( sectionInfo );
5969*387f9dfdSAndroid Build Coastguard Worker 
5970*387f9dfdSAndroid Build Coastguard Worker             assertions = m_totals.assertions;
5971*387f9dfdSAndroid Build Coastguard Worker 
5972*387f9dfdSAndroid Build Coastguard Worker             return true;
5973*387f9dfdSAndroid Build Coastguard Worker         }
testForMissingAssertions(Counts & assertions)5974*387f9dfdSAndroid Build Coastguard Worker         bool testForMissingAssertions( Counts& assertions ) {
5975*387f9dfdSAndroid Build Coastguard Worker             if( assertions.total() != 0 )
5976*387f9dfdSAndroid Build Coastguard Worker                 return false;
5977*387f9dfdSAndroid Build Coastguard Worker             if( !m_config->warnAboutMissingAssertions() )
5978*387f9dfdSAndroid Build Coastguard Worker                 return false;
5979*387f9dfdSAndroid Build Coastguard Worker             if( m_trackerContext.currentTracker().hasChildren() )
5980*387f9dfdSAndroid Build Coastguard Worker                 return false;
5981*387f9dfdSAndroid Build Coastguard Worker             m_totals.assertions.failed++;
5982*387f9dfdSAndroid Build Coastguard Worker             assertions.failed++;
5983*387f9dfdSAndroid Build Coastguard Worker             return true;
5984*387f9dfdSAndroid Build Coastguard Worker         }
5985*387f9dfdSAndroid Build Coastguard Worker 
sectionEnded(SectionEndInfo const & endInfo)5986*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionEndInfo const& endInfo ) {
5987*387f9dfdSAndroid Build Coastguard Worker             Counts assertions = m_totals.assertions - endInfo.prevAssertions;
5988*387f9dfdSAndroid Build Coastguard Worker             bool missingAssertions = testForMissingAssertions( assertions );
5989*387f9dfdSAndroid Build Coastguard Worker 
5990*387f9dfdSAndroid Build Coastguard Worker             if( !m_activeSections.empty() ) {
5991*387f9dfdSAndroid Build Coastguard Worker                 m_activeSections.back()->close();
5992*387f9dfdSAndroid Build Coastguard Worker                 m_activeSections.pop_back();
5993*387f9dfdSAndroid Build Coastguard Worker             }
5994*387f9dfdSAndroid Build Coastguard Worker 
5995*387f9dfdSAndroid Build Coastguard Worker             m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) );
5996*387f9dfdSAndroid Build Coastguard Worker             m_messages.clear();
5997*387f9dfdSAndroid Build Coastguard Worker         }
5998*387f9dfdSAndroid Build Coastguard Worker 
sectionEndedEarly(SectionEndInfo const & endInfo)5999*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) {
6000*387f9dfdSAndroid Build Coastguard Worker             if( m_unfinishedSections.empty() )
6001*387f9dfdSAndroid Build Coastguard Worker                 m_activeSections.back()->fail();
6002*387f9dfdSAndroid Build Coastguard Worker             else
6003*387f9dfdSAndroid Build Coastguard Worker                 m_activeSections.back()->close();
6004*387f9dfdSAndroid Build Coastguard Worker             m_activeSections.pop_back();
6005*387f9dfdSAndroid Build Coastguard Worker 
6006*387f9dfdSAndroid Build Coastguard Worker             m_unfinishedSections.push_back( endInfo );
6007*387f9dfdSAndroid Build Coastguard Worker         }
6008*387f9dfdSAndroid Build Coastguard Worker 
pushScopedMessage(MessageInfo const & message)6009*387f9dfdSAndroid Build Coastguard Worker         virtual void pushScopedMessage( MessageInfo const& message ) {
6010*387f9dfdSAndroid Build Coastguard Worker             m_messages.push_back( message );
6011*387f9dfdSAndroid Build Coastguard Worker         }
6012*387f9dfdSAndroid Build Coastguard Worker 
popScopedMessage(MessageInfo const & message)6013*387f9dfdSAndroid Build Coastguard Worker         virtual void popScopedMessage( MessageInfo const& message ) {
6014*387f9dfdSAndroid Build Coastguard Worker             m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() );
6015*387f9dfdSAndroid Build Coastguard Worker         }
6016*387f9dfdSAndroid Build Coastguard Worker 
getCurrentTestName() const6017*387f9dfdSAndroid Build Coastguard Worker         virtual std::string getCurrentTestName() const {
6018*387f9dfdSAndroid Build Coastguard Worker             return m_activeTestCase
6019*387f9dfdSAndroid Build Coastguard Worker                 ? m_activeTestCase->getTestCaseInfo().name
6020*387f9dfdSAndroid Build Coastguard Worker                 : "";
6021*387f9dfdSAndroid Build Coastguard Worker         }
6022*387f9dfdSAndroid Build Coastguard Worker 
getLastResult() const6023*387f9dfdSAndroid Build Coastguard Worker         virtual const AssertionResult* getLastResult() const {
6024*387f9dfdSAndroid Build Coastguard Worker             return &m_lastResult;
6025*387f9dfdSAndroid Build Coastguard Worker         }
6026*387f9dfdSAndroid Build Coastguard Worker 
handleFatalErrorCondition(std::string const & message)6027*387f9dfdSAndroid Build Coastguard Worker         virtual void handleFatalErrorCondition( std::string const& message ) {
6028*387f9dfdSAndroid Build Coastguard Worker             ResultBuilder resultBuilder = makeUnexpectedResultBuilder();
6029*387f9dfdSAndroid Build Coastguard Worker             resultBuilder.setResultType( ResultWas::FatalErrorCondition );
6030*387f9dfdSAndroid Build Coastguard Worker             resultBuilder << message;
6031*387f9dfdSAndroid Build Coastguard Worker             resultBuilder.captureExpression();
6032*387f9dfdSAndroid Build Coastguard Worker 
6033*387f9dfdSAndroid Build Coastguard Worker             handleUnfinishedSections();
6034*387f9dfdSAndroid Build Coastguard Worker 
6035*387f9dfdSAndroid Build Coastguard Worker             // Recreate section for test case (as we will lose the one that was in scope)
6036*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
6037*387f9dfdSAndroid Build Coastguard Worker             SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
6038*387f9dfdSAndroid Build Coastguard Worker 
6039*387f9dfdSAndroid Build Coastguard Worker             Counts assertions;
6040*387f9dfdSAndroid Build Coastguard Worker             assertions.failed = 1;
6041*387f9dfdSAndroid Build Coastguard Worker             SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false );
6042*387f9dfdSAndroid Build Coastguard Worker             m_reporter->sectionEnded( testCaseSectionStats );
6043*387f9dfdSAndroid Build Coastguard Worker 
6044*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo();
6045*387f9dfdSAndroid Build Coastguard Worker 
6046*387f9dfdSAndroid Build Coastguard Worker             Totals deltaTotals;
6047*387f9dfdSAndroid Build Coastguard Worker             deltaTotals.testCases.failed = 1;
6048*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testCaseEnded( TestCaseStats(   testInfo,
6049*387f9dfdSAndroid Build Coastguard Worker                                                         deltaTotals,
6050*387f9dfdSAndroid Build Coastguard Worker                                                         "",
6051*387f9dfdSAndroid Build Coastguard Worker                                                         "",
6052*387f9dfdSAndroid Build Coastguard Worker                                                         false ) );
6053*387f9dfdSAndroid Build Coastguard Worker             m_totals.testCases.failed++;
6054*387f9dfdSAndroid Build Coastguard Worker             testGroupEnded( "", m_totals, 1, 1 );
6055*387f9dfdSAndroid Build Coastguard Worker             m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) );
6056*387f9dfdSAndroid Build Coastguard Worker         }
6057*387f9dfdSAndroid Build Coastguard Worker 
6058*387f9dfdSAndroid Build Coastguard Worker     public:
6059*387f9dfdSAndroid Build Coastguard Worker         // !TBD We need to do this another way!
aborting() const6060*387f9dfdSAndroid Build Coastguard Worker         bool aborting() const {
6061*387f9dfdSAndroid Build Coastguard Worker             return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );
6062*387f9dfdSAndroid Build Coastguard Worker         }
6063*387f9dfdSAndroid Build Coastguard Worker 
6064*387f9dfdSAndroid Build Coastguard Worker     private:
6065*387f9dfdSAndroid Build Coastguard Worker 
runCurrentTest(std::string & redirectedCout,std::string & redirectedCerr)6066*387f9dfdSAndroid Build Coastguard Worker         void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
6067*387f9dfdSAndroid Build Coastguard Worker             TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
6068*387f9dfdSAndroid Build Coastguard Worker             SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
6069*387f9dfdSAndroid Build Coastguard Worker             m_reporter->sectionStarting( testCaseSection );
6070*387f9dfdSAndroid Build Coastguard Worker             Counts prevAssertions = m_totals.assertions;
6071*387f9dfdSAndroid Build Coastguard Worker             double duration = 0;
6072*387f9dfdSAndroid Build Coastguard Worker             try {
6073*387f9dfdSAndroid Build Coastguard Worker                 m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
6074*387f9dfdSAndroid Build Coastguard Worker 
6075*387f9dfdSAndroid Build Coastguard Worker                 seedRng( *m_config );
6076*387f9dfdSAndroid Build Coastguard Worker 
6077*387f9dfdSAndroid Build Coastguard Worker                 Timer timer;
6078*387f9dfdSAndroid Build Coastguard Worker                 timer.start();
6079*387f9dfdSAndroid Build Coastguard Worker                 if( m_reporter->getPreferences().shouldRedirectStdOut ) {
6080*387f9dfdSAndroid Build Coastguard Worker                     StreamRedirect coutRedir( Catch::cout(), redirectedCout );
6081*387f9dfdSAndroid Build Coastguard Worker                     StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );
6082*387f9dfdSAndroid Build Coastguard Worker                     invokeActiveTestCase();
6083*387f9dfdSAndroid Build Coastguard Worker                 }
6084*387f9dfdSAndroid Build Coastguard Worker                 else {
6085*387f9dfdSAndroid Build Coastguard Worker                     invokeActiveTestCase();
6086*387f9dfdSAndroid Build Coastguard Worker                 }
6087*387f9dfdSAndroid Build Coastguard Worker                 duration = timer.getElapsedSeconds();
6088*387f9dfdSAndroid Build Coastguard Worker             }
6089*387f9dfdSAndroid Build Coastguard Worker             catch( TestFailureException& ) {
6090*387f9dfdSAndroid Build Coastguard Worker                 // This just means the test was aborted due to failure
6091*387f9dfdSAndroid Build Coastguard Worker             }
6092*387f9dfdSAndroid Build Coastguard Worker             catch(...) {
6093*387f9dfdSAndroid Build Coastguard Worker                 makeUnexpectedResultBuilder().useActiveException();
6094*387f9dfdSAndroid Build Coastguard Worker             }
6095*387f9dfdSAndroid Build Coastguard Worker             m_testCaseTracker->close();
6096*387f9dfdSAndroid Build Coastguard Worker             handleUnfinishedSections();
6097*387f9dfdSAndroid Build Coastguard Worker             m_messages.clear();
6098*387f9dfdSAndroid Build Coastguard Worker 
6099*387f9dfdSAndroid Build Coastguard Worker             Counts assertions = m_totals.assertions - prevAssertions;
6100*387f9dfdSAndroid Build Coastguard Worker             bool missingAssertions = testForMissingAssertions( assertions );
6101*387f9dfdSAndroid Build Coastguard Worker 
6102*387f9dfdSAndroid Build Coastguard Worker             if( testCaseInfo.okToFail() ) {
6103*387f9dfdSAndroid Build Coastguard Worker                 std::swap( assertions.failedButOk, assertions.failed );
6104*387f9dfdSAndroid Build Coastguard Worker                 m_totals.assertions.failed -= assertions.failedButOk;
6105*387f9dfdSAndroid Build Coastguard Worker                 m_totals.assertions.failedButOk += assertions.failedButOk;
6106*387f9dfdSAndroid Build Coastguard Worker             }
6107*387f9dfdSAndroid Build Coastguard Worker 
6108*387f9dfdSAndroid Build Coastguard Worker             SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions );
6109*387f9dfdSAndroid Build Coastguard Worker             m_reporter->sectionEnded( testCaseSectionStats );
6110*387f9dfdSAndroid Build Coastguard Worker         }
6111*387f9dfdSAndroid Build Coastguard Worker 
invokeActiveTestCase()6112*387f9dfdSAndroid Build Coastguard Worker         void invokeActiveTestCase() {
6113*387f9dfdSAndroid Build Coastguard Worker             FatalConditionHandler fatalConditionHandler; // Handle signals
6114*387f9dfdSAndroid Build Coastguard Worker             m_activeTestCase->invoke();
6115*387f9dfdSAndroid Build Coastguard Worker             fatalConditionHandler.reset();
6116*387f9dfdSAndroid Build Coastguard Worker         }
6117*387f9dfdSAndroid Build Coastguard Worker 
6118*387f9dfdSAndroid Build Coastguard Worker     private:
6119*387f9dfdSAndroid Build Coastguard Worker 
makeUnexpectedResultBuilder() const6120*387f9dfdSAndroid Build Coastguard Worker         ResultBuilder makeUnexpectedResultBuilder() const {
6121*387f9dfdSAndroid Build Coastguard Worker             return ResultBuilder(   m_lastAssertionInfo.macroName.c_str(),
6122*387f9dfdSAndroid Build Coastguard Worker                                     m_lastAssertionInfo.lineInfo,
6123*387f9dfdSAndroid Build Coastguard Worker                                     m_lastAssertionInfo.capturedExpression.c_str(),
6124*387f9dfdSAndroid Build Coastguard Worker                                     m_lastAssertionInfo.resultDisposition );
6125*387f9dfdSAndroid Build Coastguard Worker         }
6126*387f9dfdSAndroid Build Coastguard Worker 
handleUnfinishedSections()6127*387f9dfdSAndroid Build Coastguard Worker         void handleUnfinishedSections() {
6128*387f9dfdSAndroid Build Coastguard Worker             // If sections ended prematurely due to an exception we stored their
6129*387f9dfdSAndroid Build Coastguard Worker             // infos here so we can tear them down outside the unwind process.
6130*387f9dfdSAndroid Build Coastguard Worker             for( std::vector<SectionEndInfo>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
6131*387f9dfdSAndroid Build Coastguard Worker                         itEnd = m_unfinishedSections.rend();
6132*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd;
6133*387f9dfdSAndroid Build Coastguard Worker                     ++it )
6134*387f9dfdSAndroid Build Coastguard Worker                 sectionEnded( *it );
6135*387f9dfdSAndroid Build Coastguard Worker             m_unfinishedSections.clear();
6136*387f9dfdSAndroid Build Coastguard Worker         }
6137*387f9dfdSAndroid Build Coastguard Worker 
6138*387f9dfdSAndroid Build Coastguard Worker         TestRunInfo m_runInfo;
6139*387f9dfdSAndroid Build Coastguard Worker         IMutableContext& m_context;
6140*387f9dfdSAndroid Build Coastguard Worker         TestCase const* m_activeTestCase;
6141*387f9dfdSAndroid Build Coastguard Worker         ITracker* m_testCaseTracker;
6142*387f9dfdSAndroid Build Coastguard Worker         ITracker* m_currentSectionTracker;
6143*387f9dfdSAndroid Build Coastguard Worker         AssertionResult m_lastResult;
6144*387f9dfdSAndroid Build Coastguard Worker 
6145*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> m_config;
6146*387f9dfdSAndroid Build Coastguard Worker         Totals m_totals;
6147*387f9dfdSAndroid Build Coastguard Worker         Ptr<IStreamingReporter> m_reporter;
6148*387f9dfdSAndroid Build Coastguard Worker         std::vector<MessageInfo> m_messages;
6149*387f9dfdSAndroid Build Coastguard Worker         AssertionInfo m_lastAssertionInfo;
6150*387f9dfdSAndroid Build Coastguard Worker         std::vector<SectionEndInfo> m_unfinishedSections;
6151*387f9dfdSAndroid Build Coastguard Worker         std::vector<ITracker*> m_activeSections;
6152*387f9dfdSAndroid Build Coastguard Worker         TrackerContext m_trackerContext;
6153*387f9dfdSAndroid Build Coastguard Worker     };
6154*387f9dfdSAndroid Build Coastguard Worker 
getResultCapture()6155*387f9dfdSAndroid Build Coastguard Worker     IResultCapture& getResultCapture() {
6156*387f9dfdSAndroid Build Coastguard Worker         if( IResultCapture* capture = getCurrentContext().getResultCapture() )
6157*387f9dfdSAndroid Build Coastguard Worker             return *capture;
6158*387f9dfdSAndroid Build Coastguard Worker         else
6159*387f9dfdSAndroid Build Coastguard Worker             throw std::logic_error( "No result capture instance" );
6160*387f9dfdSAndroid Build Coastguard Worker     }
6161*387f9dfdSAndroid Build Coastguard Worker 
6162*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
6163*387f9dfdSAndroid Build Coastguard Worker 
6164*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_version.h
6165*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
6166*387f9dfdSAndroid Build Coastguard Worker 
6167*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6168*387f9dfdSAndroid Build Coastguard Worker 
6169*387f9dfdSAndroid Build Coastguard Worker     // Versioning information
6170*387f9dfdSAndroid Build Coastguard Worker     struct Version {
6171*387f9dfdSAndroid Build Coastguard Worker         Version(    unsigned int _majorVersion,
6172*387f9dfdSAndroid Build Coastguard Worker                     unsigned int _minorVersion,
6173*387f9dfdSAndroid Build Coastguard Worker                     unsigned int _patchNumber,
6174*387f9dfdSAndroid Build Coastguard Worker                     std::string const& _branchName,
6175*387f9dfdSAndroid Build Coastguard Worker                     unsigned int _buildNumber );
6176*387f9dfdSAndroid Build Coastguard Worker 
6177*387f9dfdSAndroid Build Coastguard Worker         unsigned int const majorVersion;
6178*387f9dfdSAndroid Build Coastguard Worker         unsigned int const minorVersion;
6179*387f9dfdSAndroid Build Coastguard Worker         unsigned int const patchNumber;
6180*387f9dfdSAndroid Build Coastguard Worker 
6181*387f9dfdSAndroid Build Coastguard Worker         // buildNumber is only used if branchName is not null
6182*387f9dfdSAndroid Build Coastguard Worker         std::string const branchName;
6183*387f9dfdSAndroid Build Coastguard Worker         unsigned int const buildNumber;
6184*387f9dfdSAndroid Build Coastguard Worker 
6185*387f9dfdSAndroid Build Coastguard Worker         friend std::ostream& operator << ( std::ostream& os, Version const& version );
6186*387f9dfdSAndroid Build Coastguard Worker 
6187*387f9dfdSAndroid Build Coastguard Worker     private:
6188*387f9dfdSAndroid Build Coastguard Worker         void operator=( Version const& );
6189*387f9dfdSAndroid Build Coastguard Worker     };
6190*387f9dfdSAndroid Build Coastguard Worker 
6191*387f9dfdSAndroid Build Coastguard Worker     extern Version libraryVersion;
6192*387f9dfdSAndroid Build Coastguard Worker }
6193*387f9dfdSAndroid Build Coastguard Worker 
6194*387f9dfdSAndroid Build Coastguard Worker #include <fstream>
6195*387f9dfdSAndroid Build Coastguard Worker #include <stdlib.h>
6196*387f9dfdSAndroid Build Coastguard Worker #include <limits>
6197*387f9dfdSAndroid Build Coastguard Worker 
6198*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6199*387f9dfdSAndroid Build Coastguard Worker 
createReporter(std::string const & reporterName,Ptr<Config> const & config)6200*387f9dfdSAndroid Build Coastguard Worker     Ptr<IStreamingReporter> createReporter( std::string const& reporterName, Ptr<Config> const& config ) {
6201*387f9dfdSAndroid Build Coastguard Worker         Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() );
6202*387f9dfdSAndroid Build Coastguard Worker         if( !reporter ) {
6203*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
6204*387f9dfdSAndroid Build Coastguard Worker             oss << "No reporter registered with name: '" << reporterName << "'";
6205*387f9dfdSAndroid Build Coastguard Worker             throw std::domain_error( oss.str() );
6206*387f9dfdSAndroid Build Coastguard Worker         }
6207*387f9dfdSAndroid Build Coastguard Worker         return reporter;
6208*387f9dfdSAndroid Build Coastguard Worker     }
6209*387f9dfdSAndroid Build Coastguard Worker 
makeReporter(Ptr<Config> const & config)6210*387f9dfdSAndroid Build Coastguard Worker     Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
6211*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> reporters = config->getReporterNames();
6212*387f9dfdSAndroid Build Coastguard Worker         if( reporters.empty() )
6213*387f9dfdSAndroid Build Coastguard Worker             reporters.push_back( "console" );
6214*387f9dfdSAndroid Build Coastguard Worker 
6215*387f9dfdSAndroid Build Coastguard Worker         Ptr<IStreamingReporter> reporter;
6216*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
6217*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
6218*387f9dfdSAndroid Build Coastguard Worker                 ++it )
6219*387f9dfdSAndroid Build Coastguard Worker             reporter = addReporter( reporter, createReporter( *it, config ) );
6220*387f9dfdSAndroid Build Coastguard Worker         return reporter;
6221*387f9dfdSAndroid Build Coastguard Worker     }
addListeners(Ptr<IConfig const> const & config,Ptr<IStreamingReporter> reporters)6222*387f9dfdSAndroid Build Coastguard Worker     Ptr<IStreamingReporter> addListeners( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> reporters ) {
6223*387f9dfdSAndroid Build Coastguard Worker         IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners();
6224*387f9dfdSAndroid Build Coastguard Worker         for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end();
6225*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
6226*387f9dfdSAndroid Build Coastguard Worker                 ++it )
6227*387f9dfdSAndroid Build Coastguard Worker             reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) );
6228*387f9dfdSAndroid Build Coastguard Worker         return reporters;
6229*387f9dfdSAndroid Build Coastguard Worker     }
6230*387f9dfdSAndroid Build Coastguard Worker 
runTests(Ptr<Config> const & config)6231*387f9dfdSAndroid Build Coastguard Worker     Totals runTests( Ptr<Config> const& config ) {
6232*387f9dfdSAndroid Build Coastguard Worker 
6233*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> iconfig = config.get();
6234*387f9dfdSAndroid Build Coastguard Worker 
6235*387f9dfdSAndroid Build Coastguard Worker         Ptr<IStreamingReporter> reporter = makeReporter( config );
6236*387f9dfdSAndroid Build Coastguard Worker         reporter = addListeners( iconfig, reporter );
6237*387f9dfdSAndroid Build Coastguard Worker 
6238*387f9dfdSAndroid Build Coastguard Worker         RunContext context( iconfig, reporter );
6239*387f9dfdSAndroid Build Coastguard Worker 
6240*387f9dfdSAndroid Build Coastguard Worker         Totals totals;
6241*387f9dfdSAndroid Build Coastguard Worker 
6242*387f9dfdSAndroid Build Coastguard Worker         context.testGroupStarting( config->name(), 1, 1 );
6243*387f9dfdSAndroid Build Coastguard Worker 
6244*387f9dfdSAndroid Build Coastguard Worker         TestSpec testSpec = config->testSpec();
6245*387f9dfdSAndroid Build Coastguard Worker         if( !testSpec.hasFilters() )
6246*387f9dfdSAndroid Build Coastguard Worker             testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests
6247*387f9dfdSAndroid Build Coastguard Worker 
6248*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> const& allTestCases = getAllTestCasesSorted( *iconfig );
6249*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end();
6250*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
6251*387f9dfdSAndroid Build Coastguard Worker                 ++it ) {
6252*387f9dfdSAndroid Build Coastguard Worker             if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) )
6253*387f9dfdSAndroid Build Coastguard Worker                 totals += context.runTest( *it );
6254*387f9dfdSAndroid Build Coastguard Worker             else
6255*387f9dfdSAndroid Build Coastguard Worker                 reporter->skipTest( *it );
6256*387f9dfdSAndroid Build Coastguard Worker         }
6257*387f9dfdSAndroid Build Coastguard Worker 
6258*387f9dfdSAndroid Build Coastguard Worker         context.testGroupEnded( iconfig->name(), totals, 1, 1 );
6259*387f9dfdSAndroid Build Coastguard Worker         return totals;
6260*387f9dfdSAndroid Build Coastguard Worker     }
6261*387f9dfdSAndroid Build Coastguard Worker 
applyFilenamesAsTags(IConfig const & config)6262*387f9dfdSAndroid Build Coastguard Worker     void applyFilenamesAsTags( IConfig const& config ) {
6263*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> const& tests = getAllTestCasesSorted( config );
6264*387f9dfdSAndroid Build Coastguard Worker         for(std::size_t i = 0; i < tests.size(); ++i ) {
6265*387f9dfdSAndroid Build Coastguard Worker             TestCase& test = const_cast<TestCase&>( tests[i] );
6266*387f9dfdSAndroid Build Coastguard Worker             std::set<std::string> tags = test.tags;
6267*387f9dfdSAndroid Build Coastguard Worker 
6268*387f9dfdSAndroid Build Coastguard Worker             std::string filename = test.lineInfo.file;
6269*387f9dfdSAndroid Build Coastguard Worker             std::string::size_type lastSlash = filename.find_last_of( "\\/" );
6270*387f9dfdSAndroid Build Coastguard Worker             if( lastSlash != std::string::npos )
6271*387f9dfdSAndroid Build Coastguard Worker                 filename = filename.substr( lastSlash+1 );
6272*387f9dfdSAndroid Build Coastguard Worker 
6273*387f9dfdSAndroid Build Coastguard Worker             std::string::size_type lastDot = filename.find_last_of( "." );
6274*387f9dfdSAndroid Build Coastguard Worker             if( lastDot != std::string::npos )
6275*387f9dfdSAndroid Build Coastguard Worker                 filename = filename.substr( 0, lastDot );
6276*387f9dfdSAndroid Build Coastguard Worker 
6277*387f9dfdSAndroid Build Coastguard Worker             tags.insert( "#" + filename );
6278*387f9dfdSAndroid Build Coastguard Worker             setTags( test, tags );
6279*387f9dfdSAndroid Build Coastguard Worker         }
6280*387f9dfdSAndroid Build Coastguard Worker     }
6281*387f9dfdSAndroid Build Coastguard Worker 
6282*387f9dfdSAndroid Build Coastguard Worker     class Session : NonCopyable {
6283*387f9dfdSAndroid Build Coastguard Worker         static bool alreadyInstantiated;
6284*387f9dfdSAndroid Build Coastguard Worker 
6285*387f9dfdSAndroid Build Coastguard Worker     public:
6286*387f9dfdSAndroid Build Coastguard Worker 
6287*387f9dfdSAndroid Build Coastguard Worker         struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; };
6288*387f9dfdSAndroid Build Coastguard Worker 
Session()6289*387f9dfdSAndroid Build Coastguard Worker         Session()
6290*387f9dfdSAndroid Build Coastguard Worker         : m_cli( makeCommandLineParser() ) {
6291*387f9dfdSAndroid Build Coastguard Worker             if( alreadyInstantiated ) {
6292*387f9dfdSAndroid Build Coastguard Worker                 std::string msg = "Only one instance of Catch::Session can ever be used";
6293*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr() << msg << std::endl;
6294*387f9dfdSAndroid Build Coastguard Worker                 throw std::logic_error( msg );
6295*387f9dfdSAndroid Build Coastguard Worker             }
6296*387f9dfdSAndroid Build Coastguard Worker             alreadyInstantiated = true;
6297*387f9dfdSAndroid Build Coastguard Worker         }
~Session()6298*387f9dfdSAndroid Build Coastguard Worker         ~Session() {
6299*387f9dfdSAndroid Build Coastguard Worker             Catch::cleanUp();
6300*387f9dfdSAndroid Build Coastguard Worker         }
6301*387f9dfdSAndroid Build Coastguard Worker 
showHelp(std::string const & processName)6302*387f9dfdSAndroid Build Coastguard Worker         void showHelp( std::string const& processName ) {
6303*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "\nCatch v" << libraryVersion << "\n";
6304*387f9dfdSAndroid Build Coastguard Worker 
6305*387f9dfdSAndroid Build Coastguard Worker             m_cli.usage( Catch::cout(), processName );
6306*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
6307*387f9dfdSAndroid Build Coastguard Worker         }
6308*387f9dfdSAndroid Build Coastguard Worker 
applyCommandLine(int argc,char const * argv[],OnUnusedOptions::DoWhat unusedOptionBehaviour=OnUnusedOptions::Fail)6309*387f9dfdSAndroid Build Coastguard Worker         int applyCommandLine( int argc, char const* argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
6310*387f9dfdSAndroid Build Coastguard Worker             try {
6311*387f9dfdSAndroid Build Coastguard Worker                 m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );
6312*387f9dfdSAndroid Build Coastguard Worker                 m_unusedTokens = m_cli.parseInto( argc, argv, m_configData );
6313*387f9dfdSAndroid Build Coastguard Worker                 if( m_configData.showHelp )
6314*387f9dfdSAndroid Build Coastguard Worker                     showHelp( m_configData.processName );
6315*387f9dfdSAndroid Build Coastguard Worker                 m_config.reset();
6316*387f9dfdSAndroid Build Coastguard Worker             }
6317*387f9dfdSAndroid Build Coastguard Worker             catch( std::exception& ex ) {
6318*387f9dfdSAndroid Build Coastguard Worker                 {
6319*387f9dfdSAndroid Build Coastguard Worker                     Colour colourGuard( Colour::Red );
6320*387f9dfdSAndroid Build Coastguard Worker                     Catch::cerr()
6321*387f9dfdSAndroid Build Coastguard Worker                         << "\nError(s) in input:\n"
6322*387f9dfdSAndroid Build Coastguard Worker                         << Text( ex.what(), TextAttributes().setIndent(2) )
6323*387f9dfdSAndroid Build Coastguard Worker                         << "\n\n";
6324*387f9dfdSAndroid Build Coastguard Worker                 }
6325*387f9dfdSAndroid Build Coastguard Worker                 m_cli.usage( Catch::cout(), m_configData.processName );
6326*387f9dfdSAndroid Build Coastguard Worker                 return (std::numeric_limits<int>::max)();
6327*387f9dfdSAndroid Build Coastguard Worker             }
6328*387f9dfdSAndroid Build Coastguard Worker             return 0;
6329*387f9dfdSAndroid Build Coastguard Worker         }
6330*387f9dfdSAndroid Build Coastguard Worker 
useConfigData(ConfigData const & _configData)6331*387f9dfdSAndroid Build Coastguard Worker         void useConfigData( ConfigData const& _configData ) {
6332*387f9dfdSAndroid Build Coastguard Worker             m_configData = _configData;
6333*387f9dfdSAndroid Build Coastguard Worker             m_config.reset();
6334*387f9dfdSAndroid Build Coastguard Worker         }
6335*387f9dfdSAndroid Build Coastguard Worker 
run(int argc,char const * argv[])6336*387f9dfdSAndroid Build Coastguard Worker         int run( int argc, char const* argv[] ) {
6337*387f9dfdSAndroid Build Coastguard Worker 
6338*387f9dfdSAndroid Build Coastguard Worker             int returnCode = applyCommandLine( argc, argv );
6339*387f9dfdSAndroid Build Coastguard Worker             if( returnCode == 0 )
6340*387f9dfdSAndroid Build Coastguard Worker                 returnCode = run();
6341*387f9dfdSAndroid Build Coastguard Worker             return returnCode;
6342*387f9dfdSAndroid Build Coastguard Worker         }
run(int argc,char * argv[])6343*387f9dfdSAndroid Build Coastguard Worker         int run( int argc, char* argv[] ) {
6344*387f9dfdSAndroid Build Coastguard Worker             return run( argc, const_cast<char const**>( argv ) );
6345*387f9dfdSAndroid Build Coastguard Worker         }
6346*387f9dfdSAndroid Build Coastguard Worker 
run()6347*387f9dfdSAndroid Build Coastguard Worker         int run() {
6348*387f9dfdSAndroid Build Coastguard Worker             if( m_configData.showHelp )
6349*387f9dfdSAndroid Build Coastguard Worker                 return 0;
6350*387f9dfdSAndroid Build Coastguard Worker 
6351*387f9dfdSAndroid Build Coastguard Worker             try
6352*387f9dfdSAndroid Build Coastguard Worker             {
6353*387f9dfdSAndroid Build Coastguard Worker                 config(); // Force config to be constructed
6354*387f9dfdSAndroid Build Coastguard Worker 
6355*387f9dfdSAndroid Build Coastguard Worker                 seedRng( *m_config );
6356*387f9dfdSAndroid Build Coastguard Worker 
6357*387f9dfdSAndroid Build Coastguard Worker                 if( m_configData.filenamesAsTags )
6358*387f9dfdSAndroid Build Coastguard Worker                     applyFilenamesAsTags( *m_config );
6359*387f9dfdSAndroid Build Coastguard Worker 
6360*387f9dfdSAndroid Build Coastguard Worker                 // Handle list request
6361*387f9dfdSAndroid Build Coastguard Worker                 if( Option<std::size_t> listed = list( config() ) )
6362*387f9dfdSAndroid Build Coastguard Worker                     return static_cast<int>( *listed );
6363*387f9dfdSAndroid Build Coastguard Worker 
6364*387f9dfdSAndroid Build Coastguard Worker                 return static_cast<int>( runTests( m_config ).assertions.failed );
6365*387f9dfdSAndroid Build Coastguard Worker             }
6366*387f9dfdSAndroid Build Coastguard Worker             catch( std::exception& ex ) {
6367*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr() << ex.what() << std::endl;
6368*387f9dfdSAndroid Build Coastguard Worker                 return (std::numeric_limits<int>::max)();
6369*387f9dfdSAndroid Build Coastguard Worker             }
6370*387f9dfdSAndroid Build Coastguard Worker         }
6371*387f9dfdSAndroid Build Coastguard Worker 
cli() const6372*387f9dfdSAndroid Build Coastguard Worker         Clara::CommandLine<ConfigData> const& cli() const {
6373*387f9dfdSAndroid Build Coastguard Worker             return m_cli;
6374*387f9dfdSAndroid Build Coastguard Worker         }
unusedTokens() const6375*387f9dfdSAndroid Build Coastguard Worker         std::vector<Clara::Parser::Token> const& unusedTokens() const {
6376*387f9dfdSAndroid Build Coastguard Worker             return m_unusedTokens;
6377*387f9dfdSAndroid Build Coastguard Worker         }
configData()6378*387f9dfdSAndroid Build Coastguard Worker         ConfigData& configData() {
6379*387f9dfdSAndroid Build Coastguard Worker             return m_configData;
6380*387f9dfdSAndroid Build Coastguard Worker         }
config()6381*387f9dfdSAndroid Build Coastguard Worker         Config& config() {
6382*387f9dfdSAndroid Build Coastguard Worker             if( !m_config )
6383*387f9dfdSAndroid Build Coastguard Worker                 m_config = new Config( m_configData );
6384*387f9dfdSAndroid Build Coastguard Worker             return *m_config;
6385*387f9dfdSAndroid Build Coastguard Worker         }
6386*387f9dfdSAndroid Build Coastguard Worker     private:
6387*387f9dfdSAndroid Build Coastguard Worker         Clara::CommandLine<ConfigData> m_cli;
6388*387f9dfdSAndroid Build Coastguard Worker         std::vector<Clara::Parser::Token> m_unusedTokens;
6389*387f9dfdSAndroid Build Coastguard Worker         ConfigData m_configData;
6390*387f9dfdSAndroid Build Coastguard Worker         Ptr<Config> m_config;
6391*387f9dfdSAndroid Build Coastguard Worker     };
6392*387f9dfdSAndroid Build Coastguard Worker 
6393*387f9dfdSAndroid Build Coastguard Worker     bool Session::alreadyInstantiated = false;
6394*387f9dfdSAndroid Build Coastguard Worker 
6395*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
6396*387f9dfdSAndroid Build Coastguard Worker 
6397*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_registry_hub.hpp
6398*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED
6399*387f9dfdSAndroid Build Coastguard Worker 
6400*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_test_case_registry_impl.hpp
6401*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
6402*387f9dfdSAndroid Build Coastguard Worker 
6403*387f9dfdSAndroid Build Coastguard Worker #include <vector>
6404*387f9dfdSAndroid Build Coastguard Worker #include <set>
6405*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
6406*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
6407*387f9dfdSAndroid Build Coastguard Worker #include <algorithm>
6408*387f9dfdSAndroid Build Coastguard Worker 
6409*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6410*387f9dfdSAndroid Build Coastguard Worker 
6411*387f9dfdSAndroid Build Coastguard Worker     struct LexSort {
operator ()Catch::LexSort6412*387f9dfdSAndroid Build Coastguard Worker         bool operator() (TestCase i,TestCase j) const { return (i<j);}
6413*387f9dfdSAndroid Build Coastguard Worker     };
6414*387f9dfdSAndroid Build Coastguard Worker     struct RandomNumberGenerator {
operator ()Catch::RandomNumberGenerator6415*387f9dfdSAndroid Build Coastguard Worker         int operator()( int n ) const { return std::rand() % n; }
6416*387f9dfdSAndroid Build Coastguard Worker     };
6417*387f9dfdSAndroid Build Coastguard Worker 
sortTests(IConfig const & config,std::vector<TestCase> const & unsortedTestCases)6418*387f9dfdSAndroid Build Coastguard Worker     inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
6419*387f9dfdSAndroid Build Coastguard Worker 
6420*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> sorted = unsortedTestCases;
6421*387f9dfdSAndroid Build Coastguard Worker 
6422*387f9dfdSAndroid Build Coastguard Worker         switch( config.runOrder() ) {
6423*387f9dfdSAndroid Build Coastguard Worker             case RunTests::InLexicographicalOrder:
6424*387f9dfdSAndroid Build Coastguard Worker                 std::sort( sorted.begin(), sorted.end(), LexSort() );
6425*387f9dfdSAndroid Build Coastguard Worker                 break;
6426*387f9dfdSAndroid Build Coastguard Worker             case RunTests::InRandomOrder:
6427*387f9dfdSAndroid Build Coastguard Worker                 {
6428*387f9dfdSAndroid Build Coastguard Worker                     seedRng( config );
6429*387f9dfdSAndroid Build Coastguard Worker 
6430*387f9dfdSAndroid Build Coastguard Worker                     RandomNumberGenerator rng;
6431*387f9dfdSAndroid Build Coastguard Worker                     std::random_shuffle( sorted.begin(), sorted.end(), rng );
6432*387f9dfdSAndroid Build Coastguard Worker                 }
6433*387f9dfdSAndroid Build Coastguard Worker                 break;
6434*387f9dfdSAndroid Build Coastguard Worker             case RunTests::InDeclarationOrder:
6435*387f9dfdSAndroid Build Coastguard Worker                 // already in declaration order
6436*387f9dfdSAndroid Build Coastguard Worker                 break;
6437*387f9dfdSAndroid Build Coastguard Worker         }
6438*387f9dfdSAndroid Build Coastguard Worker         return sorted;
6439*387f9dfdSAndroid Build Coastguard Worker     }
matchTest(TestCase const & testCase,TestSpec const & testSpec,IConfig const & config)6440*387f9dfdSAndroid Build Coastguard Worker     bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {
6441*387f9dfdSAndroid Build Coastguard Worker         return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() );
6442*387f9dfdSAndroid Build Coastguard Worker     }
6443*387f9dfdSAndroid Build Coastguard Worker 
enforceNoDuplicateTestCases(std::vector<TestCase> const & functions)6444*387f9dfdSAndroid Build Coastguard Worker     void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {
6445*387f9dfdSAndroid Build Coastguard Worker         std::set<TestCase> seenFunctions;
6446*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = functions.begin(), itEnd = functions.end();
6447*387f9dfdSAndroid Build Coastguard Worker             it != itEnd;
6448*387f9dfdSAndroid Build Coastguard Worker             ++it ) {
6449*387f9dfdSAndroid Build Coastguard Worker             std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it );
6450*387f9dfdSAndroid Build Coastguard Worker             if( !prev.second ){
6451*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr()
6452*387f9dfdSAndroid Build Coastguard Worker                 << Colour( Colour::Red )
6453*387f9dfdSAndroid Build Coastguard Worker                 << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n"
6454*387f9dfdSAndroid Build Coastguard Worker                 << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n"
6455*387f9dfdSAndroid Build Coastguard Worker                 << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl;
6456*387f9dfdSAndroid Build Coastguard Worker                 exit(1);
6457*387f9dfdSAndroid Build Coastguard Worker             }
6458*387f9dfdSAndroid Build Coastguard Worker         }
6459*387f9dfdSAndroid Build Coastguard Worker     }
6460*387f9dfdSAndroid Build Coastguard Worker 
filterTests(std::vector<TestCase> const & testCases,TestSpec const & testSpec,IConfig const & config)6461*387f9dfdSAndroid Build Coastguard Worker     std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {
6462*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> filtered;
6463*387f9dfdSAndroid Build Coastguard Worker         filtered.reserve( testCases.size() );
6464*387f9dfdSAndroid Build Coastguard Worker         for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
6465*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
6466*387f9dfdSAndroid Build Coastguard Worker                 ++it )
6467*387f9dfdSAndroid Build Coastguard Worker             if( matchTest( *it, testSpec, config ) )
6468*387f9dfdSAndroid Build Coastguard Worker                 filtered.push_back( *it );
6469*387f9dfdSAndroid Build Coastguard Worker         return filtered;
6470*387f9dfdSAndroid Build Coastguard Worker     }
getAllTestCasesSorted(IConfig const & config)6471*387f9dfdSAndroid Build Coastguard Worker     std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {
6472*387f9dfdSAndroid Build Coastguard Worker         return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );
6473*387f9dfdSAndroid Build Coastguard Worker     }
6474*387f9dfdSAndroid Build Coastguard Worker 
6475*387f9dfdSAndroid Build Coastguard Worker     class TestRegistry : public ITestCaseRegistry {
6476*387f9dfdSAndroid Build Coastguard Worker     public:
TestRegistry()6477*387f9dfdSAndroid Build Coastguard Worker         TestRegistry()
6478*387f9dfdSAndroid Build Coastguard Worker         :   m_currentSortOrder( RunTests::InDeclarationOrder ),
6479*387f9dfdSAndroid Build Coastguard Worker             m_unnamedCount( 0 )
6480*387f9dfdSAndroid Build Coastguard Worker         {}
6481*387f9dfdSAndroid Build Coastguard Worker         virtual ~TestRegistry();
6482*387f9dfdSAndroid Build Coastguard Worker 
registerTest(TestCase const & testCase)6483*387f9dfdSAndroid Build Coastguard Worker         virtual void registerTest( TestCase const& testCase ) {
6484*387f9dfdSAndroid Build Coastguard Worker             std::string name = testCase.getTestCaseInfo().name;
6485*387f9dfdSAndroid Build Coastguard Worker             if( name == "" ) {
6486*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
6487*387f9dfdSAndroid Build Coastguard Worker                 oss << "Anonymous test case " << ++m_unnamedCount;
6488*387f9dfdSAndroid Build Coastguard Worker                 return registerTest( testCase.withName( oss.str() ) );
6489*387f9dfdSAndroid Build Coastguard Worker             }
6490*387f9dfdSAndroid Build Coastguard Worker             m_functions.push_back( testCase );
6491*387f9dfdSAndroid Build Coastguard Worker         }
6492*387f9dfdSAndroid Build Coastguard Worker 
getAllTests() const6493*387f9dfdSAndroid Build Coastguard Worker         virtual std::vector<TestCase> const& getAllTests() const {
6494*387f9dfdSAndroid Build Coastguard Worker             return m_functions;
6495*387f9dfdSAndroid Build Coastguard Worker         }
getAllTestsSorted(IConfig const & config) const6496*387f9dfdSAndroid Build Coastguard Worker         virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const {
6497*387f9dfdSAndroid Build Coastguard Worker             if( m_sortedFunctions.empty() )
6498*387f9dfdSAndroid Build Coastguard Worker                 enforceNoDuplicateTestCases( m_functions );
6499*387f9dfdSAndroid Build Coastguard Worker 
6500*387f9dfdSAndroid Build Coastguard Worker             if(  m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {
6501*387f9dfdSAndroid Build Coastguard Worker                 m_sortedFunctions = sortTests( config, m_functions );
6502*387f9dfdSAndroid Build Coastguard Worker                 m_currentSortOrder = config.runOrder();
6503*387f9dfdSAndroid Build Coastguard Worker             }
6504*387f9dfdSAndroid Build Coastguard Worker             return m_sortedFunctions;
6505*387f9dfdSAndroid Build Coastguard Worker         }
6506*387f9dfdSAndroid Build Coastguard Worker 
6507*387f9dfdSAndroid Build Coastguard Worker     private:
6508*387f9dfdSAndroid Build Coastguard Worker         std::vector<TestCase> m_functions;
6509*387f9dfdSAndroid Build Coastguard Worker         mutable RunTests::InWhatOrder m_currentSortOrder;
6510*387f9dfdSAndroid Build Coastguard Worker         mutable std::vector<TestCase> m_sortedFunctions;
6511*387f9dfdSAndroid Build Coastguard Worker         size_t m_unnamedCount;
6512*387f9dfdSAndroid Build Coastguard Worker         std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
6513*387f9dfdSAndroid Build Coastguard Worker     };
6514*387f9dfdSAndroid Build Coastguard Worker 
6515*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
6516*387f9dfdSAndroid Build Coastguard Worker 
6517*387f9dfdSAndroid Build Coastguard Worker     class FreeFunctionTestCase : public SharedImpl<ITestCase> {
6518*387f9dfdSAndroid Build Coastguard Worker     public:
6519*387f9dfdSAndroid Build Coastguard Worker 
FreeFunctionTestCase(TestFunction fun)6520*387f9dfdSAndroid Build Coastguard Worker         FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}
6521*387f9dfdSAndroid Build Coastguard Worker 
invoke() const6522*387f9dfdSAndroid Build Coastguard Worker         virtual void invoke() const {
6523*387f9dfdSAndroid Build Coastguard Worker             m_fun();
6524*387f9dfdSAndroid Build Coastguard Worker         }
6525*387f9dfdSAndroid Build Coastguard Worker 
6526*387f9dfdSAndroid Build Coastguard Worker     private:
6527*387f9dfdSAndroid Build Coastguard Worker         virtual ~FreeFunctionTestCase();
6528*387f9dfdSAndroid Build Coastguard Worker 
6529*387f9dfdSAndroid Build Coastguard Worker         TestFunction m_fun;
6530*387f9dfdSAndroid Build Coastguard Worker     };
6531*387f9dfdSAndroid Build Coastguard Worker 
extractClassName(std::string const & classOrQualifiedMethodName)6532*387f9dfdSAndroid Build Coastguard Worker     inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) {
6533*387f9dfdSAndroid Build Coastguard Worker         std::string className = classOrQualifiedMethodName;
6534*387f9dfdSAndroid Build Coastguard Worker         if( startsWith( className, "&" ) )
6535*387f9dfdSAndroid Build Coastguard Worker         {
6536*387f9dfdSAndroid Build Coastguard Worker             std::size_t lastColons = className.rfind( "::" );
6537*387f9dfdSAndroid Build Coastguard Worker             std::size_t penultimateColons = className.rfind( "::", lastColons-1 );
6538*387f9dfdSAndroid Build Coastguard Worker             if( penultimateColons == std::string::npos )
6539*387f9dfdSAndroid Build Coastguard Worker                 penultimateColons = 1;
6540*387f9dfdSAndroid Build Coastguard Worker             className = className.substr( penultimateColons, lastColons-penultimateColons );
6541*387f9dfdSAndroid Build Coastguard Worker         }
6542*387f9dfdSAndroid Build Coastguard Worker         return className;
6543*387f9dfdSAndroid Build Coastguard Worker     }
6544*387f9dfdSAndroid Build Coastguard Worker 
registerTestCase(ITestCase * testCase,char const * classOrQualifiedMethodName,NameAndDesc const & nameAndDesc,SourceLineInfo const & lineInfo)6545*387f9dfdSAndroid Build Coastguard Worker     void registerTestCase
6546*387f9dfdSAndroid Build Coastguard Worker         (   ITestCase* testCase,
6547*387f9dfdSAndroid Build Coastguard Worker             char const* classOrQualifiedMethodName,
6548*387f9dfdSAndroid Build Coastguard Worker             NameAndDesc const& nameAndDesc,
6549*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo const& lineInfo ) {
6550*387f9dfdSAndroid Build Coastguard Worker 
6551*387f9dfdSAndroid Build Coastguard Worker         getMutableRegistryHub().registerTest
6552*387f9dfdSAndroid Build Coastguard Worker             ( makeTestCase
6553*387f9dfdSAndroid Build Coastguard Worker                 (   testCase,
6554*387f9dfdSAndroid Build Coastguard Worker                     extractClassName( classOrQualifiedMethodName ),
6555*387f9dfdSAndroid Build Coastguard Worker                     nameAndDesc.name,
6556*387f9dfdSAndroid Build Coastguard Worker                     nameAndDesc.description,
6557*387f9dfdSAndroid Build Coastguard Worker                     lineInfo ) );
6558*387f9dfdSAndroid Build Coastguard Worker     }
registerTestCaseFunction(TestFunction function,SourceLineInfo const & lineInfo,NameAndDesc const & nameAndDesc)6559*387f9dfdSAndroid Build Coastguard Worker     void registerTestCaseFunction
6560*387f9dfdSAndroid Build Coastguard Worker         (   TestFunction function,
6561*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo const& lineInfo,
6562*387f9dfdSAndroid Build Coastguard Worker             NameAndDesc const& nameAndDesc ) {
6563*387f9dfdSAndroid Build Coastguard Worker         registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
6564*387f9dfdSAndroid Build Coastguard Worker     }
6565*387f9dfdSAndroid Build Coastguard Worker 
6566*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
6567*387f9dfdSAndroid Build Coastguard Worker 
AutoReg(TestFunction function,SourceLineInfo const & lineInfo,NameAndDesc const & nameAndDesc)6568*387f9dfdSAndroid Build Coastguard Worker     AutoReg::AutoReg
6569*387f9dfdSAndroid Build Coastguard Worker         (   TestFunction function,
6570*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo const& lineInfo,
6571*387f9dfdSAndroid Build Coastguard Worker             NameAndDesc const& nameAndDesc ) {
6572*387f9dfdSAndroid Build Coastguard Worker         registerTestCaseFunction( function, lineInfo, nameAndDesc );
6573*387f9dfdSAndroid Build Coastguard Worker     }
6574*387f9dfdSAndroid Build Coastguard Worker 
~AutoReg()6575*387f9dfdSAndroid Build Coastguard Worker     AutoReg::~AutoReg() {}
6576*387f9dfdSAndroid Build Coastguard Worker 
6577*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
6578*387f9dfdSAndroid Build Coastguard Worker 
6579*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_reporter_registry.hpp
6580*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED
6581*387f9dfdSAndroid Build Coastguard Worker 
6582*387f9dfdSAndroid Build Coastguard Worker #include <map>
6583*387f9dfdSAndroid Build Coastguard Worker 
6584*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6585*387f9dfdSAndroid Build Coastguard Worker 
6586*387f9dfdSAndroid Build Coastguard Worker     class ReporterRegistry : public IReporterRegistry {
6587*387f9dfdSAndroid Build Coastguard Worker 
6588*387f9dfdSAndroid Build Coastguard Worker     public:
6589*387f9dfdSAndroid Build Coastguard Worker 
~ReporterRegistry()6590*387f9dfdSAndroid Build Coastguard Worker         virtual ~ReporterRegistry() CATCH_OVERRIDE {}
6591*387f9dfdSAndroid Build Coastguard Worker 
create(std::string const & name,Ptr<IConfig const> const & config) const6592*387f9dfdSAndroid Build Coastguard Worker         virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const CATCH_OVERRIDE {
6593*387f9dfdSAndroid Build Coastguard Worker             FactoryMap::const_iterator it =  m_factories.find( name );
6594*387f9dfdSAndroid Build Coastguard Worker             if( it == m_factories.end() )
6595*387f9dfdSAndroid Build Coastguard Worker                 return CATCH_NULL;
6596*387f9dfdSAndroid Build Coastguard Worker             return it->second->create( ReporterConfig( config ) );
6597*387f9dfdSAndroid Build Coastguard Worker         }
6598*387f9dfdSAndroid Build Coastguard Worker 
registerReporter(std::string const & name,Ptr<IReporterFactory> const & factory)6599*387f9dfdSAndroid Build Coastguard Worker         void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) {
6600*387f9dfdSAndroid Build Coastguard Worker             m_factories.insert( std::make_pair( name, factory ) );
6601*387f9dfdSAndroid Build Coastguard Worker         }
registerListener(Ptr<IReporterFactory> const & factory)6602*387f9dfdSAndroid Build Coastguard Worker         void registerListener( Ptr<IReporterFactory> const& factory ) {
6603*387f9dfdSAndroid Build Coastguard Worker             m_listeners.push_back( factory );
6604*387f9dfdSAndroid Build Coastguard Worker         }
6605*387f9dfdSAndroid Build Coastguard Worker 
getFactories() const6606*387f9dfdSAndroid Build Coastguard Worker         virtual FactoryMap const& getFactories() const CATCH_OVERRIDE {
6607*387f9dfdSAndroid Build Coastguard Worker             return m_factories;
6608*387f9dfdSAndroid Build Coastguard Worker         }
getListeners() const6609*387f9dfdSAndroid Build Coastguard Worker         virtual Listeners const& getListeners() const CATCH_OVERRIDE {
6610*387f9dfdSAndroid Build Coastguard Worker             return m_listeners;
6611*387f9dfdSAndroid Build Coastguard Worker         }
6612*387f9dfdSAndroid Build Coastguard Worker 
6613*387f9dfdSAndroid Build Coastguard Worker     private:
6614*387f9dfdSAndroid Build Coastguard Worker         FactoryMap m_factories;
6615*387f9dfdSAndroid Build Coastguard Worker         Listeners m_listeners;
6616*387f9dfdSAndroid Build Coastguard Worker     };
6617*387f9dfdSAndroid Build Coastguard Worker }
6618*387f9dfdSAndroid Build Coastguard Worker 
6619*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_exception_translator_registry.hpp
6620*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED
6621*387f9dfdSAndroid Build Coastguard Worker 
6622*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
6623*387f9dfdSAndroid Build Coastguard Worker #import "Foundation/Foundation.h"
6624*387f9dfdSAndroid Build Coastguard Worker #endif
6625*387f9dfdSAndroid Build Coastguard Worker 
6626*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6627*387f9dfdSAndroid Build Coastguard Worker 
6628*387f9dfdSAndroid Build Coastguard Worker     class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
6629*387f9dfdSAndroid Build Coastguard Worker     public:
~ExceptionTranslatorRegistry()6630*387f9dfdSAndroid Build Coastguard Worker         ~ExceptionTranslatorRegistry() {
6631*387f9dfdSAndroid Build Coastguard Worker             deleteAll( m_translators );
6632*387f9dfdSAndroid Build Coastguard Worker         }
6633*387f9dfdSAndroid Build Coastguard Worker 
registerTranslator(const IExceptionTranslator * translator)6634*387f9dfdSAndroid Build Coastguard Worker         virtual void registerTranslator( const IExceptionTranslator* translator ) {
6635*387f9dfdSAndroid Build Coastguard Worker             m_translators.push_back( translator );
6636*387f9dfdSAndroid Build Coastguard Worker         }
6637*387f9dfdSAndroid Build Coastguard Worker 
translateActiveException() const6638*387f9dfdSAndroid Build Coastguard Worker         virtual std::string translateActiveException() const {
6639*387f9dfdSAndroid Build Coastguard Worker             try {
6640*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
6641*387f9dfdSAndroid Build Coastguard Worker                 // In Objective-C try objective-c exceptions first
6642*387f9dfdSAndroid Build Coastguard Worker                 @try {
6643*387f9dfdSAndroid Build Coastguard Worker                     return tryTranslators();
6644*387f9dfdSAndroid Build Coastguard Worker                 }
6645*387f9dfdSAndroid Build Coastguard Worker                 @catch (NSException *exception) {
6646*387f9dfdSAndroid Build Coastguard Worker                     return Catch::toString( [exception description] );
6647*387f9dfdSAndroid Build Coastguard Worker                 }
6648*387f9dfdSAndroid Build Coastguard Worker #else
6649*387f9dfdSAndroid Build Coastguard Worker                 return tryTranslators();
6650*387f9dfdSAndroid Build Coastguard Worker #endif
6651*387f9dfdSAndroid Build Coastguard Worker             }
6652*387f9dfdSAndroid Build Coastguard Worker             catch( TestFailureException& ) {
6653*387f9dfdSAndroid Build Coastguard Worker                 throw;
6654*387f9dfdSAndroid Build Coastguard Worker             }
6655*387f9dfdSAndroid Build Coastguard Worker             catch( std::exception& ex ) {
6656*387f9dfdSAndroid Build Coastguard Worker                 return ex.what();
6657*387f9dfdSAndroid Build Coastguard Worker             }
6658*387f9dfdSAndroid Build Coastguard Worker             catch( std::string& msg ) {
6659*387f9dfdSAndroid Build Coastguard Worker                 return msg;
6660*387f9dfdSAndroid Build Coastguard Worker             }
6661*387f9dfdSAndroid Build Coastguard Worker             catch( const char* msg ) {
6662*387f9dfdSAndroid Build Coastguard Worker                 return msg;
6663*387f9dfdSAndroid Build Coastguard Worker             }
6664*387f9dfdSAndroid Build Coastguard Worker             catch(...) {
6665*387f9dfdSAndroid Build Coastguard Worker                 return "Unknown exception";
6666*387f9dfdSAndroid Build Coastguard Worker             }
6667*387f9dfdSAndroid Build Coastguard Worker         }
6668*387f9dfdSAndroid Build Coastguard Worker 
tryTranslators() const6669*387f9dfdSAndroid Build Coastguard Worker         std::string tryTranslators() const {
6670*387f9dfdSAndroid Build Coastguard Worker             if( m_translators.empty() )
6671*387f9dfdSAndroid Build Coastguard Worker                 throw;
6672*387f9dfdSAndroid Build Coastguard Worker             else
6673*387f9dfdSAndroid Build Coastguard Worker                 return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() );
6674*387f9dfdSAndroid Build Coastguard Worker         }
6675*387f9dfdSAndroid Build Coastguard Worker 
6676*387f9dfdSAndroid Build Coastguard Worker     private:
6677*387f9dfdSAndroid Build Coastguard Worker         std::vector<const IExceptionTranslator*> m_translators;
6678*387f9dfdSAndroid Build Coastguard Worker     };
6679*387f9dfdSAndroid Build Coastguard Worker }
6680*387f9dfdSAndroid Build Coastguard Worker 
6681*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6682*387f9dfdSAndroid Build Coastguard Worker 
6683*387f9dfdSAndroid Build Coastguard Worker     namespace {
6684*387f9dfdSAndroid Build Coastguard Worker 
6685*387f9dfdSAndroid Build Coastguard Worker         class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
6686*387f9dfdSAndroid Build Coastguard Worker 
6687*387f9dfdSAndroid Build Coastguard Worker             RegistryHub( RegistryHub const& );
6688*387f9dfdSAndroid Build Coastguard Worker             void operator=( RegistryHub const& );
6689*387f9dfdSAndroid Build Coastguard Worker 
6690*387f9dfdSAndroid Build Coastguard Worker         public: // IRegistryHub
RegistryHub()6691*387f9dfdSAndroid Build Coastguard Worker             RegistryHub() {
6692*387f9dfdSAndroid Build Coastguard Worker             }
getReporterRegistry() const6693*387f9dfdSAndroid Build Coastguard Worker             virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE {
6694*387f9dfdSAndroid Build Coastguard Worker                 return m_reporterRegistry;
6695*387f9dfdSAndroid Build Coastguard Worker             }
getTestCaseRegistry() const6696*387f9dfdSAndroid Build Coastguard Worker             virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE {
6697*387f9dfdSAndroid Build Coastguard Worker                 return m_testCaseRegistry;
6698*387f9dfdSAndroid Build Coastguard Worker             }
getExceptionTranslatorRegistry()6699*387f9dfdSAndroid Build Coastguard Worker             virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE {
6700*387f9dfdSAndroid Build Coastguard Worker                 return m_exceptionTranslatorRegistry;
6701*387f9dfdSAndroid Build Coastguard Worker             }
6702*387f9dfdSAndroid Build Coastguard Worker 
6703*387f9dfdSAndroid Build Coastguard Worker         public: // IMutableRegistryHub
registerReporter(std::string const & name,Ptr<IReporterFactory> const & factory)6704*387f9dfdSAndroid Build Coastguard Worker             virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {
6705*387f9dfdSAndroid Build Coastguard Worker                 m_reporterRegistry.registerReporter( name, factory );
6706*387f9dfdSAndroid Build Coastguard Worker             }
registerListener(Ptr<IReporterFactory> const & factory)6707*387f9dfdSAndroid Build Coastguard Worker             virtual void registerListener( Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {
6708*387f9dfdSAndroid Build Coastguard Worker                 m_reporterRegistry.registerListener( factory );
6709*387f9dfdSAndroid Build Coastguard Worker             }
registerTest(TestCase const & testInfo)6710*387f9dfdSAndroid Build Coastguard Worker             virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE {
6711*387f9dfdSAndroid Build Coastguard Worker                 m_testCaseRegistry.registerTest( testInfo );
6712*387f9dfdSAndroid Build Coastguard Worker             }
registerTranslator(const IExceptionTranslator * translator)6713*387f9dfdSAndroid Build Coastguard Worker             virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE {
6714*387f9dfdSAndroid Build Coastguard Worker                 m_exceptionTranslatorRegistry.registerTranslator( translator );
6715*387f9dfdSAndroid Build Coastguard Worker             }
6716*387f9dfdSAndroid Build Coastguard Worker 
6717*387f9dfdSAndroid Build Coastguard Worker         private:
6718*387f9dfdSAndroid Build Coastguard Worker             TestRegistry m_testCaseRegistry;
6719*387f9dfdSAndroid Build Coastguard Worker             ReporterRegistry m_reporterRegistry;
6720*387f9dfdSAndroid Build Coastguard Worker             ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
6721*387f9dfdSAndroid Build Coastguard Worker         };
6722*387f9dfdSAndroid Build Coastguard Worker 
6723*387f9dfdSAndroid Build Coastguard Worker         // Single, global, instance
getTheRegistryHub()6724*387f9dfdSAndroid Build Coastguard Worker         inline RegistryHub*& getTheRegistryHub() {
6725*387f9dfdSAndroid Build Coastguard Worker             static RegistryHub* theRegistryHub = CATCH_NULL;
6726*387f9dfdSAndroid Build Coastguard Worker             if( !theRegistryHub )
6727*387f9dfdSAndroid Build Coastguard Worker                 theRegistryHub = new RegistryHub();
6728*387f9dfdSAndroid Build Coastguard Worker             return theRegistryHub;
6729*387f9dfdSAndroid Build Coastguard Worker         }
6730*387f9dfdSAndroid Build Coastguard Worker     }
6731*387f9dfdSAndroid Build Coastguard Worker 
getRegistryHub()6732*387f9dfdSAndroid Build Coastguard Worker     IRegistryHub& getRegistryHub() {
6733*387f9dfdSAndroid Build Coastguard Worker         return *getTheRegistryHub();
6734*387f9dfdSAndroid Build Coastguard Worker     }
getMutableRegistryHub()6735*387f9dfdSAndroid Build Coastguard Worker     IMutableRegistryHub& getMutableRegistryHub() {
6736*387f9dfdSAndroid Build Coastguard Worker         return *getTheRegistryHub();
6737*387f9dfdSAndroid Build Coastguard Worker     }
cleanUp()6738*387f9dfdSAndroid Build Coastguard Worker     void cleanUp() {
6739*387f9dfdSAndroid Build Coastguard Worker         delete getTheRegistryHub();
6740*387f9dfdSAndroid Build Coastguard Worker         getTheRegistryHub() = CATCH_NULL;
6741*387f9dfdSAndroid Build Coastguard Worker         cleanUpContext();
6742*387f9dfdSAndroid Build Coastguard Worker     }
translateActiveException()6743*387f9dfdSAndroid Build Coastguard Worker     std::string translateActiveException() {
6744*387f9dfdSAndroid Build Coastguard Worker         return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
6745*387f9dfdSAndroid Build Coastguard Worker     }
6746*387f9dfdSAndroid Build Coastguard Worker 
6747*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
6748*387f9dfdSAndroid Build Coastguard Worker 
6749*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_notimplemented_exception.hpp
6750*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED
6751*387f9dfdSAndroid Build Coastguard Worker 
6752*387f9dfdSAndroid Build Coastguard Worker #include <ostream>
6753*387f9dfdSAndroid Build Coastguard Worker 
6754*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6755*387f9dfdSAndroid Build Coastguard Worker 
NotImplementedException(SourceLineInfo const & lineInfo)6756*387f9dfdSAndroid Build Coastguard Worker     NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo )
6757*387f9dfdSAndroid Build Coastguard Worker     :   m_lineInfo( lineInfo ) {
6758*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream oss;
6759*387f9dfdSAndroid Build Coastguard Worker         oss << lineInfo << ": function ";
6760*387f9dfdSAndroid Build Coastguard Worker         oss << "not implemented";
6761*387f9dfdSAndroid Build Coastguard Worker         m_what = oss.str();
6762*387f9dfdSAndroid Build Coastguard Worker     }
6763*387f9dfdSAndroid Build Coastguard Worker 
what() const6764*387f9dfdSAndroid Build Coastguard Worker     const char* NotImplementedException::what() const CATCH_NOEXCEPT {
6765*387f9dfdSAndroid Build Coastguard Worker         return m_what.c_str();
6766*387f9dfdSAndroid Build Coastguard Worker     }
6767*387f9dfdSAndroid Build Coastguard Worker 
6768*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
6769*387f9dfdSAndroid Build Coastguard Worker 
6770*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_context_impl.hpp
6771*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED
6772*387f9dfdSAndroid Build Coastguard Worker 
6773*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_stream.hpp
6774*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
6775*387f9dfdSAndroid Build Coastguard Worker 
6776*387f9dfdSAndroid Build Coastguard Worker #include <stdexcept>
6777*387f9dfdSAndroid Build Coastguard Worker #include <cstdio>
6778*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
6779*387f9dfdSAndroid Build Coastguard Worker 
6780*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6781*387f9dfdSAndroid Build Coastguard Worker 
6782*387f9dfdSAndroid Build Coastguard Worker     template<typename WriterF, size_t bufferSize=256>
6783*387f9dfdSAndroid Build Coastguard Worker     class StreamBufImpl : public StreamBufBase {
6784*387f9dfdSAndroid Build Coastguard Worker         char data[bufferSize];
6785*387f9dfdSAndroid Build Coastguard Worker         WriterF m_writer;
6786*387f9dfdSAndroid Build Coastguard Worker 
6787*387f9dfdSAndroid Build Coastguard Worker     public:
StreamBufImpl()6788*387f9dfdSAndroid Build Coastguard Worker         StreamBufImpl() {
6789*387f9dfdSAndroid Build Coastguard Worker             setp( data, data + sizeof(data) );
6790*387f9dfdSAndroid Build Coastguard Worker         }
6791*387f9dfdSAndroid Build Coastguard Worker 
~StreamBufImpl()6792*387f9dfdSAndroid Build Coastguard Worker         ~StreamBufImpl() CATCH_NOEXCEPT {
6793*387f9dfdSAndroid Build Coastguard Worker             sync();
6794*387f9dfdSAndroid Build Coastguard Worker         }
6795*387f9dfdSAndroid Build Coastguard Worker 
6796*387f9dfdSAndroid Build Coastguard Worker     private:
overflow(int c)6797*387f9dfdSAndroid Build Coastguard Worker         int overflow( int c ) {
6798*387f9dfdSAndroid Build Coastguard Worker             sync();
6799*387f9dfdSAndroid Build Coastguard Worker 
6800*387f9dfdSAndroid Build Coastguard Worker             if( c != EOF ) {
6801*387f9dfdSAndroid Build Coastguard Worker                 if( pbase() == epptr() )
6802*387f9dfdSAndroid Build Coastguard Worker                     m_writer( std::string( 1, static_cast<char>( c ) ) );
6803*387f9dfdSAndroid Build Coastguard Worker                 else
6804*387f9dfdSAndroid Build Coastguard Worker                     sputc( static_cast<char>( c ) );
6805*387f9dfdSAndroid Build Coastguard Worker             }
6806*387f9dfdSAndroid Build Coastguard Worker             return 0;
6807*387f9dfdSAndroid Build Coastguard Worker         }
6808*387f9dfdSAndroid Build Coastguard Worker 
sync()6809*387f9dfdSAndroid Build Coastguard Worker         int sync() {
6810*387f9dfdSAndroid Build Coastguard Worker             if( pbase() != pptr() ) {
6811*387f9dfdSAndroid Build Coastguard Worker                 m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
6812*387f9dfdSAndroid Build Coastguard Worker                 setp( pbase(), epptr() );
6813*387f9dfdSAndroid Build Coastguard Worker             }
6814*387f9dfdSAndroid Build Coastguard Worker             return 0;
6815*387f9dfdSAndroid Build Coastguard Worker         }
6816*387f9dfdSAndroid Build Coastguard Worker     };
6817*387f9dfdSAndroid Build Coastguard Worker 
6818*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
6819*387f9dfdSAndroid Build Coastguard Worker 
FileStream(std::string const & filename)6820*387f9dfdSAndroid Build Coastguard Worker     FileStream::FileStream( std::string const& filename ) {
6821*387f9dfdSAndroid Build Coastguard Worker         m_ofs.open( filename.c_str() );
6822*387f9dfdSAndroid Build Coastguard Worker         if( m_ofs.fail() ) {
6823*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
6824*387f9dfdSAndroid Build Coastguard Worker             oss << "Unable to open file: '" << filename << "'";
6825*387f9dfdSAndroid Build Coastguard Worker             throw std::domain_error( oss.str() );
6826*387f9dfdSAndroid Build Coastguard Worker         }
6827*387f9dfdSAndroid Build Coastguard Worker     }
6828*387f9dfdSAndroid Build Coastguard Worker 
stream() const6829*387f9dfdSAndroid Build Coastguard Worker     std::ostream& FileStream::stream() const {
6830*387f9dfdSAndroid Build Coastguard Worker         return m_ofs;
6831*387f9dfdSAndroid Build Coastguard Worker     }
6832*387f9dfdSAndroid Build Coastguard Worker 
6833*387f9dfdSAndroid Build Coastguard Worker     struct OutputDebugWriter {
6834*387f9dfdSAndroid Build Coastguard Worker 
operator ()Catch::OutputDebugWriter6835*387f9dfdSAndroid Build Coastguard Worker         void operator()( std::string const&str ) {
6836*387f9dfdSAndroid Build Coastguard Worker             writeToDebugConsole( str );
6837*387f9dfdSAndroid Build Coastguard Worker         }
6838*387f9dfdSAndroid Build Coastguard Worker     };
6839*387f9dfdSAndroid Build Coastguard Worker 
DebugOutStream()6840*387f9dfdSAndroid Build Coastguard Worker     DebugOutStream::DebugOutStream()
6841*387f9dfdSAndroid Build Coastguard Worker     :   m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),
6842*387f9dfdSAndroid Build Coastguard Worker         m_os( m_streamBuf.get() )
6843*387f9dfdSAndroid Build Coastguard Worker     {}
6844*387f9dfdSAndroid Build Coastguard Worker 
stream() const6845*387f9dfdSAndroid Build Coastguard Worker     std::ostream& DebugOutStream::stream() const {
6846*387f9dfdSAndroid Build Coastguard Worker         return m_os;
6847*387f9dfdSAndroid Build Coastguard Worker     }
6848*387f9dfdSAndroid Build Coastguard Worker 
6849*387f9dfdSAndroid Build Coastguard Worker     // Store the streambuf from cout up-front because
6850*387f9dfdSAndroid Build Coastguard Worker     // cout may get redirected when running tests
CoutStream()6851*387f9dfdSAndroid Build Coastguard Worker     CoutStream::CoutStream()
6852*387f9dfdSAndroid Build Coastguard Worker     :   m_os( Catch::cout().rdbuf() )
6853*387f9dfdSAndroid Build Coastguard Worker     {}
6854*387f9dfdSAndroid Build Coastguard Worker 
stream() const6855*387f9dfdSAndroid Build Coastguard Worker     std::ostream& CoutStream::stream() const {
6856*387f9dfdSAndroid Build Coastguard Worker         return m_os;
6857*387f9dfdSAndroid Build Coastguard Worker     }
6858*387f9dfdSAndroid Build Coastguard Worker 
6859*387f9dfdSAndroid Build Coastguard Worker #ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
cout()6860*387f9dfdSAndroid Build Coastguard Worker     std::ostream& cout() {
6861*387f9dfdSAndroid Build Coastguard Worker         return std::cout;
6862*387f9dfdSAndroid Build Coastguard Worker     }
cerr()6863*387f9dfdSAndroid Build Coastguard Worker     std::ostream& cerr() {
6864*387f9dfdSAndroid Build Coastguard Worker         return std::cerr;
6865*387f9dfdSAndroid Build Coastguard Worker     }
6866*387f9dfdSAndroid Build Coastguard Worker #endif
6867*387f9dfdSAndroid Build Coastguard Worker }
6868*387f9dfdSAndroid Build Coastguard Worker 
6869*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6870*387f9dfdSAndroid Build Coastguard Worker 
6871*387f9dfdSAndroid Build Coastguard Worker     class Context : public IMutableContext {
6872*387f9dfdSAndroid Build Coastguard Worker 
Context()6873*387f9dfdSAndroid Build Coastguard Worker         Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {}
6874*387f9dfdSAndroid Build Coastguard Worker         Context( Context const& );
6875*387f9dfdSAndroid Build Coastguard Worker         void operator=( Context const& );
6876*387f9dfdSAndroid Build Coastguard Worker 
6877*387f9dfdSAndroid Build Coastguard Worker     public: // IContext
getResultCapture()6878*387f9dfdSAndroid Build Coastguard Worker         virtual IResultCapture* getResultCapture() {
6879*387f9dfdSAndroid Build Coastguard Worker             return m_resultCapture;
6880*387f9dfdSAndroid Build Coastguard Worker         }
getRunner()6881*387f9dfdSAndroid Build Coastguard Worker         virtual IRunner* getRunner() {
6882*387f9dfdSAndroid Build Coastguard Worker             return m_runner;
6883*387f9dfdSAndroid Build Coastguard Worker         }
getGeneratorIndex(std::string const & fileInfo,size_t totalSize)6884*387f9dfdSAndroid Build Coastguard Worker         virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) {
6885*387f9dfdSAndroid Build Coastguard Worker             return getGeneratorsForCurrentTest()
6886*387f9dfdSAndroid Build Coastguard Worker             .getGeneratorInfo( fileInfo, totalSize )
6887*387f9dfdSAndroid Build Coastguard Worker             .getCurrentIndex();
6888*387f9dfdSAndroid Build Coastguard Worker         }
advanceGeneratorsForCurrentTest()6889*387f9dfdSAndroid Build Coastguard Worker         virtual bool advanceGeneratorsForCurrentTest() {
6890*387f9dfdSAndroid Build Coastguard Worker             IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
6891*387f9dfdSAndroid Build Coastguard Worker             return generators && generators->moveNext();
6892*387f9dfdSAndroid Build Coastguard Worker         }
6893*387f9dfdSAndroid Build Coastguard Worker 
getConfig() const6894*387f9dfdSAndroid Build Coastguard Worker         virtual Ptr<IConfig const> getConfig() const {
6895*387f9dfdSAndroid Build Coastguard Worker             return m_config;
6896*387f9dfdSAndroid Build Coastguard Worker         }
6897*387f9dfdSAndroid Build Coastguard Worker 
6898*387f9dfdSAndroid Build Coastguard Worker     public: // IMutableContext
setResultCapture(IResultCapture * resultCapture)6899*387f9dfdSAndroid Build Coastguard Worker         virtual void setResultCapture( IResultCapture* resultCapture ) {
6900*387f9dfdSAndroid Build Coastguard Worker             m_resultCapture = resultCapture;
6901*387f9dfdSAndroid Build Coastguard Worker         }
setRunner(IRunner * runner)6902*387f9dfdSAndroid Build Coastguard Worker         virtual void setRunner( IRunner* runner ) {
6903*387f9dfdSAndroid Build Coastguard Worker             m_runner = runner;
6904*387f9dfdSAndroid Build Coastguard Worker         }
setConfig(Ptr<IConfig const> const & config)6905*387f9dfdSAndroid Build Coastguard Worker         virtual void setConfig( Ptr<IConfig const> const& config ) {
6906*387f9dfdSAndroid Build Coastguard Worker             m_config = config;
6907*387f9dfdSAndroid Build Coastguard Worker         }
6908*387f9dfdSAndroid Build Coastguard Worker 
6909*387f9dfdSAndroid Build Coastguard Worker         friend IMutableContext& getCurrentMutableContext();
6910*387f9dfdSAndroid Build Coastguard Worker 
6911*387f9dfdSAndroid Build Coastguard Worker     private:
findGeneratorsForCurrentTest()6912*387f9dfdSAndroid Build Coastguard Worker         IGeneratorsForTest* findGeneratorsForCurrentTest() {
6913*387f9dfdSAndroid Build Coastguard Worker             std::string testName = getResultCapture()->getCurrentTestName();
6914*387f9dfdSAndroid Build Coastguard Worker 
6915*387f9dfdSAndroid Build Coastguard Worker             std::map<std::string, IGeneratorsForTest*>::const_iterator it =
6916*387f9dfdSAndroid Build Coastguard Worker                 m_generatorsByTestName.find( testName );
6917*387f9dfdSAndroid Build Coastguard Worker             return it != m_generatorsByTestName.end()
6918*387f9dfdSAndroid Build Coastguard Worker                 ? it->second
6919*387f9dfdSAndroid Build Coastguard Worker                 : CATCH_NULL;
6920*387f9dfdSAndroid Build Coastguard Worker         }
6921*387f9dfdSAndroid Build Coastguard Worker 
getGeneratorsForCurrentTest()6922*387f9dfdSAndroid Build Coastguard Worker         IGeneratorsForTest& getGeneratorsForCurrentTest() {
6923*387f9dfdSAndroid Build Coastguard Worker             IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
6924*387f9dfdSAndroid Build Coastguard Worker             if( !generators ) {
6925*387f9dfdSAndroid Build Coastguard Worker                 std::string testName = getResultCapture()->getCurrentTestName();
6926*387f9dfdSAndroid Build Coastguard Worker                 generators = createGeneratorsForTest();
6927*387f9dfdSAndroid Build Coastguard Worker                 m_generatorsByTestName.insert( std::make_pair( testName, generators ) );
6928*387f9dfdSAndroid Build Coastguard Worker             }
6929*387f9dfdSAndroid Build Coastguard Worker             return *generators;
6930*387f9dfdSAndroid Build Coastguard Worker         }
6931*387f9dfdSAndroid Build Coastguard Worker 
6932*387f9dfdSAndroid Build Coastguard Worker     private:
6933*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> m_config;
6934*387f9dfdSAndroid Build Coastguard Worker         IRunner* m_runner;
6935*387f9dfdSAndroid Build Coastguard Worker         IResultCapture* m_resultCapture;
6936*387f9dfdSAndroid Build Coastguard Worker         std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
6937*387f9dfdSAndroid Build Coastguard Worker     };
6938*387f9dfdSAndroid Build Coastguard Worker 
6939*387f9dfdSAndroid Build Coastguard Worker     namespace {
6940*387f9dfdSAndroid Build Coastguard Worker         Context* currentContext = CATCH_NULL;
6941*387f9dfdSAndroid Build Coastguard Worker     }
getCurrentMutableContext()6942*387f9dfdSAndroid Build Coastguard Worker     IMutableContext& getCurrentMutableContext() {
6943*387f9dfdSAndroid Build Coastguard Worker         if( !currentContext )
6944*387f9dfdSAndroid Build Coastguard Worker             currentContext = new Context();
6945*387f9dfdSAndroid Build Coastguard Worker         return *currentContext;
6946*387f9dfdSAndroid Build Coastguard Worker     }
getCurrentContext()6947*387f9dfdSAndroid Build Coastguard Worker     IContext& getCurrentContext() {
6948*387f9dfdSAndroid Build Coastguard Worker         return getCurrentMutableContext();
6949*387f9dfdSAndroid Build Coastguard Worker     }
6950*387f9dfdSAndroid Build Coastguard Worker 
cleanUpContext()6951*387f9dfdSAndroid Build Coastguard Worker     void cleanUpContext() {
6952*387f9dfdSAndroid Build Coastguard Worker         delete currentContext;
6953*387f9dfdSAndroid Build Coastguard Worker         currentContext = CATCH_NULL;
6954*387f9dfdSAndroid Build Coastguard Worker     }
6955*387f9dfdSAndroid Build Coastguard Worker }
6956*387f9dfdSAndroid Build Coastguard Worker 
6957*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_console_colour_impl.hpp
6958*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
6959*387f9dfdSAndroid Build Coastguard Worker 
6960*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
6961*387f9dfdSAndroid Build Coastguard Worker     namespace {
6962*387f9dfdSAndroid Build Coastguard Worker 
6963*387f9dfdSAndroid Build Coastguard Worker         struct IColourImpl {
~IColourImplCatch::__anoncead9d0e0411::IColourImpl6964*387f9dfdSAndroid Build Coastguard Worker             virtual ~IColourImpl() {}
6965*387f9dfdSAndroid Build Coastguard Worker             virtual void use( Colour::Code _colourCode ) = 0;
6966*387f9dfdSAndroid Build Coastguard Worker         };
6967*387f9dfdSAndroid Build Coastguard Worker 
6968*387f9dfdSAndroid Build Coastguard Worker         struct NoColourImpl : IColourImpl {
useCatch::__anoncead9d0e0411::NoColourImpl6969*387f9dfdSAndroid Build Coastguard Worker             void use( Colour::Code ) {}
6970*387f9dfdSAndroid Build Coastguard Worker 
instanceCatch::__anoncead9d0e0411::NoColourImpl6971*387f9dfdSAndroid Build Coastguard Worker             static IColourImpl* instance() {
6972*387f9dfdSAndroid Build Coastguard Worker                 static NoColourImpl s_instance;
6973*387f9dfdSAndroid Build Coastguard Worker                 return &s_instance;
6974*387f9dfdSAndroid Build Coastguard Worker             }
6975*387f9dfdSAndroid Build Coastguard Worker         };
6976*387f9dfdSAndroid Build Coastguard Worker 
6977*387f9dfdSAndroid Build Coastguard Worker     } // anon namespace
6978*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
6979*387f9dfdSAndroid Build Coastguard Worker 
6980*387f9dfdSAndroid Build Coastguard Worker #if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )
6981*387f9dfdSAndroid Build Coastguard Worker #   ifdef CATCH_PLATFORM_WINDOWS
6982*387f9dfdSAndroid Build Coastguard Worker #       define CATCH_CONFIG_COLOUR_WINDOWS
6983*387f9dfdSAndroid Build Coastguard Worker #   else
6984*387f9dfdSAndroid Build Coastguard Worker #       define CATCH_CONFIG_COLOUR_ANSI
6985*387f9dfdSAndroid Build Coastguard Worker #   endif
6986*387f9dfdSAndroid Build Coastguard Worker #endif
6987*387f9dfdSAndroid Build Coastguard Worker 
6988*387f9dfdSAndroid Build Coastguard Worker #if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
6989*387f9dfdSAndroid Build Coastguard Worker 
6990*387f9dfdSAndroid Build Coastguard Worker #ifndef NOMINMAX
6991*387f9dfdSAndroid Build Coastguard Worker #define NOMINMAX
6992*387f9dfdSAndroid Build Coastguard Worker #endif
6993*387f9dfdSAndroid Build Coastguard Worker 
6994*387f9dfdSAndroid Build Coastguard Worker #ifdef __AFXDLL
6995*387f9dfdSAndroid Build Coastguard Worker #include <AfxWin.h>
6996*387f9dfdSAndroid Build Coastguard Worker #else
6997*387f9dfdSAndroid Build Coastguard Worker #include <windows.h>
6998*387f9dfdSAndroid Build Coastguard Worker #endif
6999*387f9dfdSAndroid Build Coastguard Worker 
7000*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7001*387f9dfdSAndroid Build Coastguard Worker namespace {
7002*387f9dfdSAndroid Build Coastguard Worker 
7003*387f9dfdSAndroid Build Coastguard Worker     class Win32ColourImpl : public IColourImpl {
7004*387f9dfdSAndroid Build Coastguard Worker     public:
Win32ColourImpl()7005*387f9dfdSAndroid Build Coastguard Worker         Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )
7006*387f9dfdSAndroid Build Coastguard Worker         {
7007*387f9dfdSAndroid Build Coastguard Worker             CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
7008*387f9dfdSAndroid Build Coastguard Worker             GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );
7009*387f9dfdSAndroid Build Coastguard Worker             originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
7010*387f9dfdSAndroid Build Coastguard Worker             originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
7011*387f9dfdSAndroid Build Coastguard Worker         }
7012*387f9dfdSAndroid Build Coastguard Worker 
use(Colour::Code _colourCode)7013*387f9dfdSAndroid Build Coastguard Worker         virtual void use( Colour::Code _colourCode ) {
7014*387f9dfdSAndroid Build Coastguard Worker             switch( _colourCode ) {
7015*387f9dfdSAndroid Build Coastguard Worker                 case Colour::None:      return setTextAttribute( originalForegroundAttributes );
7016*387f9dfdSAndroid Build Coastguard Worker                 case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
7017*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Red:       return setTextAttribute( FOREGROUND_RED );
7018*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Green:     return setTextAttribute( FOREGROUND_GREEN );
7019*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Blue:      return setTextAttribute( FOREGROUND_BLUE );
7020*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Cyan:      return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );
7021*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Yellow:    return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );
7022*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Grey:      return setTextAttribute( 0 );
7023*387f9dfdSAndroid Build Coastguard Worker 
7024*387f9dfdSAndroid Build Coastguard Worker                 case Colour::LightGrey:     return setTextAttribute( FOREGROUND_INTENSITY );
7025*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightRed:     return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
7026*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightGreen:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
7027*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightWhite:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
7028*387f9dfdSAndroid Build Coastguard Worker 
7029*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Bright: throw std::logic_error( "not a colour" );
7030*387f9dfdSAndroid Build Coastguard Worker             }
7031*387f9dfdSAndroid Build Coastguard Worker         }
7032*387f9dfdSAndroid Build Coastguard Worker 
7033*387f9dfdSAndroid Build Coastguard Worker     private:
setTextAttribute(WORD _textAttribute)7034*387f9dfdSAndroid Build Coastguard Worker         void setTextAttribute( WORD _textAttribute ) {
7035*387f9dfdSAndroid Build Coastguard Worker             SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );
7036*387f9dfdSAndroid Build Coastguard Worker         }
7037*387f9dfdSAndroid Build Coastguard Worker         HANDLE stdoutHandle;
7038*387f9dfdSAndroid Build Coastguard Worker         WORD originalForegroundAttributes;
7039*387f9dfdSAndroid Build Coastguard Worker         WORD originalBackgroundAttributes;
7040*387f9dfdSAndroid Build Coastguard Worker     };
7041*387f9dfdSAndroid Build Coastguard Worker 
platformColourInstance()7042*387f9dfdSAndroid Build Coastguard Worker     IColourImpl* platformColourInstance() {
7043*387f9dfdSAndroid Build Coastguard Worker         static Win32ColourImpl s_instance;
7044*387f9dfdSAndroid Build Coastguard Worker 
7045*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> config = getCurrentContext().getConfig();
7046*387f9dfdSAndroid Build Coastguard Worker         UseColour::YesOrNo colourMode = config
7047*387f9dfdSAndroid Build Coastguard Worker             ? config->useColour()
7048*387f9dfdSAndroid Build Coastguard Worker             : UseColour::Auto;
7049*387f9dfdSAndroid Build Coastguard Worker         if( colourMode == UseColour::Auto )
7050*387f9dfdSAndroid Build Coastguard Worker             colourMode = !isDebuggerActive()
7051*387f9dfdSAndroid Build Coastguard Worker                 ? UseColour::Yes
7052*387f9dfdSAndroid Build Coastguard Worker                 : UseColour::No;
7053*387f9dfdSAndroid Build Coastguard Worker         return colourMode == UseColour::Yes
7054*387f9dfdSAndroid Build Coastguard Worker             ? &s_instance
7055*387f9dfdSAndroid Build Coastguard Worker             : NoColourImpl::instance();
7056*387f9dfdSAndroid Build Coastguard Worker     }
7057*387f9dfdSAndroid Build Coastguard Worker 
7058*387f9dfdSAndroid Build Coastguard Worker } // end anon namespace
7059*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7060*387f9dfdSAndroid Build Coastguard Worker 
7061*387f9dfdSAndroid Build Coastguard Worker #elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////
7062*387f9dfdSAndroid Build Coastguard Worker 
7063*387f9dfdSAndroid Build Coastguard Worker #include <unistd.h>
7064*387f9dfdSAndroid Build Coastguard Worker 
7065*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7066*387f9dfdSAndroid Build Coastguard Worker namespace {
7067*387f9dfdSAndroid Build Coastguard Worker 
7068*387f9dfdSAndroid Build Coastguard Worker     // use POSIX/ ANSI console terminal codes
7069*387f9dfdSAndroid Build Coastguard Worker     // Thanks to Adam Strzelecki for original contribution
7070*387f9dfdSAndroid Build Coastguard Worker     // (http://github.com/nanoant)
7071*387f9dfdSAndroid Build Coastguard Worker     // https://github.com/philsquared/Catch/pull/131
7072*387f9dfdSAndroid Build Coastguard Worker     class PosixColourImpl : public IColourImpl {
7073*387f9dfdSAndroid Build Coastguard Worker     public:
use(Colour::Code _colourCode)7074*387f9dfdSAndroid Build Coastguard Worker         virtual void use( Colour::Code _colourCode ) {
7075*387f9dfdSAndroid Build Coastguard Worker             switch( _colourCode ) {
7076*387f9dfdSAndroid Build Coastguard Worker                 case Colour::None:
7077*387f9dfdSAndroid Build Coastguard Worker                 case Colour::White:     return setColour( "[0m" );
7078*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Red:       return setColour( "[0;31m" );
7079*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Green:     return setColour( "[0;32m" );
7080*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Blue:      return setColour( "[0:34m" );
7081*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Cyan:      return setColour( "[0;36m" );
7082*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Yellow:    return setColour( "[0;33m" );
7083*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Grey:      return setColour( "[1;30m" );
7084*387f9dfdSAndroid Build Coastguard Worker 
7085*387f9dfdSAndroid Build Coastguard Worker                 case Colour::LightGrey:     return setColour( "[0;37m" );
7086*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightRed:     return setColour( "[1;31m" );
7087*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightGreen:   return setColour( "[1;32m" );
7088*387f9dfdSAndroid Build Coastguard Worker                 case Colour::BrightWhite:   return setColour( "[1;37m" );
7089*387f9dfdSAndroid Build Coastguard Worker 
7090*387f9dfdSAndroid Build Coastguard Worker                 case Colour::Bright: throw std::logic_error( "not a colour" );
7091*387f9dfdSAndroid Build Coastguard Worker             }
7092*387f9dfdSAndroid Build Coastguard Worker         }
instance()7093*387f9dfdSAndroid Build Coastguard Worker         static IColourImpl* instance() {
7094*387f9dfdSAndroid Build Coastguard Worker             static PosixColourImpl s_instance;
7095*387f9dfdSAndroid Build Coastguard Worker             return &s_instance;
7096*387f9dfdSAndroid Build Coastguard Worker         }
7097*387f9dfdSAndroid Build Coastguard Worker 
7098*387f9dfdSAndroid Build Coastguard Worker     private:
setColour(const char * _escapeCode)7099*387f9dfdSAndroid Build Coastguard Worker         void setColour( const char* _escapeCode ) {
7100*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << '\033' << _escapeCode;
7101*387f9dfdSAndroid Build Coastguard Worker         }
7102*387f9dfdSAndroid Build Coastguard Worker     };
7103*387f9dfdSAndroid Build Coastguard Worker 
platformColourInstance()7104*387f9dfdSAndroid Build Coastguard Worker     IColourImpl* platformColourInstance() {
7105*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> config = getCurrentContext().getConfig();
7106*387f9dfdSAndroid Build Coastguard Worker         UseColour::YesOrNo colourMode = config
7107*387f9dfdSAndroid Build Coastguard Worker             ? config->useColour()
7108*387f9dfdSAndroid Build Coastguard Worker             : UseColour::Auto;
7109*387f9dfdSAndroid Build Coastguard Worker         if( colourMode == UseColour::Auto )
7110*387f9dfdSAndroid Build Coastguard Worker             colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) )
7111*387f9dfdSAndroid Build Coastguard Worker                 ? UseColour::Yes
7112*387f9dfdSAndroid Build Coastguard Worker                 : UseColour::No;
7113*387f9dfdSAndroid Build Coastguard Worker         return colourMode == UseColour::Yes
7114*387f9dfdSAndroid Build Coastguard Worker             ? PosixColourImpl::instance()
7115*387f9dfdSAndroid Build Coastguard Worker             : NoColourImpl::instance();
7116*387f9dfdSAndroid Build Coastguard Worker     }
7117*387f9dfdSAndroid Build Coastguard Worker 
7118*387f9dfdSAndroid Build Coastguard Worker } // end anon namespace
7119*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7120*387f9dfdSAndroid Build Coastguard Worker 
7121*387f9dfdSAndroid Build Coastguard Worker #else  // not Windows or ANSI ///////////////////////////////////////////////
7122*387f9dfdSAndroid Build Coastguard Worker 
7123*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7124*387f9dfdSAndroid Build Coastguard Worker 
platformColourInstance()7125*387f9dfdSAndroid Build Coastguard Worker     static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }
7126*387f9dfdSAndroid Build Coastguard Worker 
7127*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7128*387f9dfdSAndroid Build Coastguard Worker 
7129*387f9dfdSAndroid Build Coastguard Worker #endif // Windows/ ANSI/ None
7130*387f9dfdSAndroid Build Coastguard Worker 
7131*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7132*387f9dfdSAndroid Build Coastguard Worker 
Colour(Code _colourCode)7133*387f9dfdSAndroid Build Coastguard Worker     Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); }
Colour(Colour const & _other)7134*387f9dfdSAndroid Build Coastguard Worker     Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; }
~Colour()7135*387f9dfdSAndroid Build Coastguard Worker     Colour::~Colour(){ if( !m_moved ) use( None ); }
7136*387f9dfdSAndroid Build Coastguard Worker 
use(Code _colourCode)7137*387f9dfdSAndroid Build Coastguard Worker     void Colour::use( Code _colourCode ) {
7138*387f9dfdSAndroid Build Coastguard Worker         static IColourImpl* impl = platformColourInstance();
7139*387f9dfdSAndroid Build Coastguard Worker         impl->use( _colourCode );
7140*387f9dfdSAndroid Build Coastguard Worker     }
7141*387f9dfdSAndroid Build Coastguard Worker 
7142*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7143*387f9dfdSAndroid Build Coastguard Worker 
7144*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_generators_impl.hpp
7145*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED
7146*387f9dfdSAndroid Build Coastguard Worker 
7147*387f9dfdSAndroid Build Coastguard Worker #include <vector>
7148*387f9dfdSAndroid Build Coastguard Worker #include <string>
7149*387f9dfdSAndroid Build Coastguard Worker #include <map>
7150*387f9dfdSAndroid Build Coastguard Worker 
7151*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7152*387f9dfdSAndroid Build Coastguard Worker 
7153*387f9dfdSAndroid Build Coastguard Worker     struct GeneratorInfo : IGeneratorInfo {
7154*387f9dfdSAndroid Build Coastguard Worker 
GeneratorInfoCatch::GeneratorInfo7155*387f9dfdSAndroid Build Coastguard Worker         GeneratorInfo( std::size_t size )
7156*387f9dfdSAndroid Build Coastguard Worker         :   m_size( size ),
7157*387f9dfdSAndroid Build Coastguard Worker             m_currentIndex( 0 )
7158*387f9dfdSAndroid Build Coastguard Worker         {}
7159*387f9dfdSAndroid Build Coastguard Worker 
moveNextCatch::GeneratorInfo7160*387f9dfdSAndroid Build Coastguard Worker         bool moveNext() {
7161*387f9dfdSAndroid Build Coastguard Worker             if( ++m_currentIndex == m_size ) {
7162*387f9dfdSAndroid Build Coastguard Worker                 m_currentIndex = 0;
7163*387f9dfdSAndroid Build Coastguard Worker                 return false;
7164*387f9dfdSAndroid Build Coastguard Worker             }
7165*387f9dfdSAndroid Build Coastguard Worker             return true;
7166*387f9dfdSAndroid Build Coastguard Worker         }
7167*387f9dfdSAndroid Build Coastguard Worker 
getCurrentIndexCatch::GeneratorInfo7168*387f9dfdSAndroid Build Coastguard Worker         std::size_t getCurrentIndex() const {
7169*387f9dfdSAndroid Build Coastguard Worker             return m_currentIndex;
7170*387f9dfdSAndroid Build Coastguard Worker         }
7171*387f9dfdSAndroid Build Coastguard Worker 
7172*387f9dfdSAndroid Build Coastguard Worker         std::size_t m_size;
7173*387f9dfdSAndroid Build Coastguard Worker         std::size_t m_currentIndex;
7174*387f9dfdSAndroid Build Coastguard Worker     };
7175*387f9dfdSAndroid Build Coastguard Worker 
7176*387f9dfdSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
7177*387f9dfdSAndroid Build Coastguard Worker 
7178*387f9dfdSAndroid Build Coastguard Worker     class GeneratorsForTest : public IGeneratorsForTest {
7179*387f9dfdSAndroid Build Coastguard Worker 
7180*387f9dfdSAndroid Build Coastguard Worker     public:
~GeneratorsForTest()7181*387f9dfdSAndroid Build Coastguard Worker         ~GeneratorsForTest() {
7182*387f9dfdSAndroid Build Coastguard Worker             deleteAll( m_generatorsInOrder );
7183*387f9dfdSAndroid Build Coastguard Worker         }
7184*387f9dfdSAndroid Build Coastguard Worker 
getGeneratorInfo(std::string const & fileInfo,std::size_t size)7185*387f9dfdSAndroid Build Coastguard Worker         IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) {
7186*387f9dfdSAndroid Build Coastguard Worker             std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
7187*387f9dfdSAndroid Build Coastguard Worker             if( it == m_generatorsByName.end() ) {
7188*387f9dfdSAndroid Build Coastguard Worker                 IGeneratorInfo* info = new GeneratorInfo( size );
7189*387f9dfdSAndroid Build Coastguard Worker                 m_generatorsByName.insert( std::make_pair( fileInfo, info ) );
7190*387f9dfdSAndroid Build Coastguard Worker                 m_generatorsInOrder.push_back( info );
7191*387f9dfdSAndroid Build Coastguard Worker                 return *info;
7192*387f9dfdSAndroid Build Coastguard Worker             }
7193*387f9dfdSAndroid Build Coastguard Worker             return *it->second;
7194*387f9dfdSAndroid Build Coastguard Worker         }
7195*387f9dfdSAndroid Build Coastguard Worker 
moveNext()7196*387f9dfdSAndroid Build Coastguard Worker         bool moveNext() {
7197*387f9dfdSAndroid Build Coastguard Worker             std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();
7198*387f9dfdSAndroid Build Coastguard Worker             std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();
7199*387f9dfdSAndroid Build Coastguard Worker             for(; it != itEnd; ++it ) {
7200*387f9dfdSAndroid Build Coastguard Worker                 if( (*it)->moveNext() )
7201*387f9dfdSAndroid Build Coastguard Worker                     return true;
7202*387f9dfdSAndroid Build Coastguard Worker             }
7203*387f9dfdSAndroid Build Coastguard Worker             return false;
7204*387f9dfdSAndroid Build Coastguard Worker         }
7205*387f9dfdSAndroid Build Coastguard Worker 
7206*387f9dfdSAndroid Build Coastguard Worker     private:
7207*387f9dfdSAndroid Build Coastguard Worker         std::map<std::string, IGeneratorInfo*> m_generatorsByName;
7208*387f9dfdSAndroid Build Coastguard Worker         std::vector<IGeneratorInfo*> m_generatorsInOrder;
7209*387f9dfdSAndroid Build Coastguard Worker     };
7210*387f9dfdSAndroid Build Coastguard Worker 
createGeneratorsForTest()7211*387f9dfdSAndroid Build Coastguard Worker     IGeneratorsForTest* createGeneratorsForTest()
7212*387f9dfdSAndroid Build Coastguard Worker     {
7213*387f9dfdSAndroid Build Coastguard Worker         return new GeneratorsForTest();
7214*387f9dfdSAndroid Build Coastguard Worker     }
7215*387f9dfdSAndroid Build Coastguard Worker 
7216*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7217*387f9dfdSAndroid Build Coastguard Worker 
7218*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_assertionresult.hpp
7219*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED
7220*387f9dfdSAndroid Build Coastguard Worker 
7221*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7222*387f9dfdSAndroid Build Coastguard Worker 
AssertionInfo(std::string const & _macroName,SourceLineInfo const & _lineInfo,std::string const & _capturedExpression,ResultDisposition::Flags _resultDisposition)7223*387f9dfdSAndroid Build Coastguard Worker     AssertionInfo::AssertionInfo(   std::string const& _macroName,
7224*387f9dfdSAndroid Build Coastguard Worker                                     SourceLineInfo const& _lineInfo,
7225*387f9dfdSAndroid Build Coastguard Worker                                     std::string const& _capturedExpression,
7226*387f9dfdSAndroid Build Coastguard Worker                                     ResultDisposition::Flags _resultDisposition )
7227*387f9dfdSAndroid Build Coastguard Worker     :   macroName( _macroName ),
7228*387f9dfdSAndroid Build Coastguard Worker         lineInfo( _lineInfo ),
7229*387f9dfdSAndroid Build Coastguard Worker         capturedExpression( _capturedExpression ),
7230*387f9dfdSAndroid Build Coastguard Worker         resultDisposition( _resultDisposition )
7231*387f9dfdSAndroid Build Coastguard Worker     {}
7232*387f9dfdSAndroid Build Coastguard Worker 
AssertionResult()7233*387f9dfdSAndroid Build Coastguard Worker     AssertionResult::AssertionResult() {}
7234*387f9dfdSAndroid Build Coastguard Worker 
AssertionResult(AssertionInfo const & info,AssertionResultData const & data)7235*387f9dfdSAndroid Build Coastguard Worker     AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
7236*387f9dfdSAndroid Build Coastguard Worker     :   m_info( info ),
7237*387f9dfdSAndroid Build Coastguard Worker         m_resultData( data )
7238*387f9dfdSAndroid Build Coastguard Worker     {}
7239*387f9dfdSAndroid Build Coastguard Worker 
~AssertionResult()7240*387f9dfdSAndroid Build Coastguard Worker     AssertionResult::~AssertionResult() {}
7241*387f9dfdSAndroid Build Coastguard Worker 
7242*387f9dfdSAndroid Build Coastguard Worker     // Result was a success
succeeded() const7243*387f9dfdSAndroid Build Coastguard Worker     bool AssertionResult::succeeded() const {
7244*387f9dfdSAndroid Build Coastguard Worker         return Catch::isOk( m_resultData.resultType );
7245*387f9dfdSAndroid Build Coastguard Worker     }
7246*387f9dfdSAndroid Build Coastguard Worker 
7247*387f9dfdSAndroid Build Coastguard Worker     // Result was a success, or failure is suppressed
isOk() const7248*387f9dfdSAndroid Build Coastguard Worker     bool AssertionResult::isOk() const {
7249*387f9dfdSAndroid Build Coastguard Worker         return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
7250*387f9dfdSAndroid Build Coastguard Worker     }
7251*387f9dfdSAndroid Build Coastguard Worker 
getResultType() const7252*387f9dfdSAndroid Build Coastguard Worker     ResultWas::OfType AssertionResult::getResultType() const {
7253*387f9dfdSAndroid Build Coastguard Worker         return m_resultData.resultType;
7254*387f9dfdSAndroid Build Coastguard Worker     }
7255*387f9dfdSAndroid Build Coastguard Worker 
hasExpression() const7256*387f9dfdSAndroid Build Coastguard Worker     bool AssertionResult::hasExpression() const {
7257*387f9dfdSAndroid Build Coastguard Worker         return !m_info.capturedExpression.empty();
7258*387f9dfdSAndroid Build Coastguard Worker     }
7259*387f9dfdSAndroid Build Coastguard Worker 
hasMessage() const7260*387f9dfdSAndroid Build Coastguard Worker     bool AssertionResult::hasMessage() const {
7261*387f9dfdSAndroid Build Coastguard Worker         return !m_resultData.message.empty();
7262*387f9dfdSAndroid Build Coastguard Worker     }
7263*387f9dfdSAndroid Build Coastguard Worker 
getExpression() const7264*387f9dfdSAndroid Build Coastguard Worker     std::string AssertionResult::getExpression() const {
7265*387f9dfdSAndroid Build Coastguard Worker         if( isFalseTest( m_info.resultDisposition ) )
7266*387f9dfdSAndroid Build Coastguard Worker             return "!" + m_info.capturedExpression;
7267*387f9dfdSAndroid Build Coastguard Worker         else
7268*387f9dfdSAndroid Build Coastguard Worker             return m_info.capturedExpression;
7269*387f9dfdSAndroid Build Coastguard Worker     }
getExpressionInMacro() const7270*387f9dfdSAndroid Build Coastguard Worker     std::string AssertionResult::getExpressionInMacro() const {
7271*387f9dfdSAndroid Build Coastguard Worker         if( m_info.macroName.empty() )
7272*387f9dfdSAndroid Build Coastguard Worker             return m_info.capturedExpression;
7273*387f9dfdSAndroid Build Coastguard Worker         else
7274*387f9dfdSAndroid Build Coastguard Worker             return m_info.macroName + "( " + m_info.capturedExpression + " )";
7275*387f9dfdSAndroid Build Coastguard Worker     }
7276*387f9dfdSAndroid Build Coastguard Worker 
hasExpandedExpression() const7277*387f9dfdSAndroid Build Coastguard Worker     bool AssertionResult::hasExpandedExpression() const {
7278*387f9dfdSAndroid Build Coastguard Worker         return hasExpression() && getExpandedExpression() != getExpression();
7279*387f9dfdSAndroid Build Coastguard Worker     }
7280*387f9dfdSAndroid Build Coastguard Worker 
getExpandedExpression() const7281*387f9dfdSAndroid Build Coastguard Worker     std::string AssertionResult::getExpandedExpression() const {
7282*387f9dfdSAndroid Build Coastguard Worker         return m_resultData.reconstructedExpression;
7283*387f9dfdSAndroid Build Coastguard Worker     }
7284*387f9dfdSAndroid Build Coastguard Worker 
getMessage() const7285*387f9dfdSAndroid Build Coastguard Worker     std::string AssertionResult::getMessage() const {
7286*387f9dfdSAndroid Build Coastguard Worker         return m_resultData.message;
7287*387f9dfdSAndroid Build Coastguard Worker     }
getSourceInfo() const7288*387f9dfdSAndroid Build Coastguard Worker     SourceLineInfo AssertionResult::getSourceInfo() const {
7289*387f9dfdSAndroid Build Coastguard Worker         return m_info.lineInfo;
7290*387f9dfdSAndroid Build Coastguard Worker     }
7291*387f9dfdSAndroid Build Coastguard Worker 
getTestMacroName() const7292*387f9dfdSAndroid Build Coastguard Worker     std::string AssertionResult::getTestMacroName() const {
7293*387f9dfdSAndroid Build Coastguard Worker         return m_info.macroName;
7294*387f9dfdSAndroid Build Coastguard Worker     }
7295*387f9dfdSAndroid Build Coastguard Worker 
7296*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7297*387f9dfdSAndroid Build Coastguard Worker 
7298*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_test_case_info.hpp
7299*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
7300*387f9dfdSAndroid Build Coastguard Worker 
7301*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7302*387f9dfdSAndroid Build Coastguard Worker 
parseSpecialTag(std::string const & tag)7303*387f9dfdSAndroid Build Coastguard Worker     inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {
7304*387f9dfdSAndroid Build Coastguard Worker         if( startsWith( tag, "." ) ||
7305*387f9dfdSAndroid Build Coastguard Worker             tag == "hide" ||
7306*387f9dfdSAndroid Build Coastguard Worker             tag == "!hide" )
7307*387f9dfdSAndroid Build Coastguard Worker             return TestCaseInfo::IsHidden;
7308*387f9dfdSAndroid Build Coastguard Worker         else if( tag == "!throws" )
7309*387f9dfdSAndroid Build Coastguard Worker             return TestCaseInfo::Throws;
7310*387f9dfdSAndroid Build Coastguard Worker         else if( tag == "!shouldfail" )
7311*387f9dfdSAndroid Build Coastguard Worker             return TestCaseInfo::ShouldFail;
7312*387f9dfdSAndroid Build Coastguard Worker         else if( tag == "!mayfail" )
7313*387f9dfdSAndroid Build Coastguard Worker             return TestCaseInfo::MayFail;
7314*387f9dfdSAndroid Build Coastguard Worker         else
7315*387f9dfdSAndroid Build Coastguard Worker             return TestCaseInfo::None;
7316*387f9dfdSAndroid Build Coastguard Worker     }
isReservedTag(std::string const & tag)7317*387f9dfdSAndroid Build Coastguard Worker     inline bool isReservedTag( std::string const& tag ) {
7318*387f9dfdSAndroid Build Coastguard Worker         return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] );
7319*387f9dfdSAndroid Build Coastguard Worker     }
enforceNotReservedTag(std::string const & tag,SourceLineInfo const & _lineInfo)7320*387f9dfdSAndroid Build Coastguard Worker     inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
7321*387f9dfdSAndroid Build Coastguard Worker         if( isReservedTag( tag ) ) {
7322*387f9dfdSAndroid Build Coastguard Worker             {
7323*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::Red );
7324*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr()
7325*387f9dfdSAndroid Build Coastguard Worker                     << "Tag name [" << tag << "] not allowed.\n"
7326*387f9dfdSAndroid Build Coastguard Worker                     << "Tag names starting with non alpha-numeric characters are reserved\n";
7327*387f9dfdSAndroid Build Coastguard Worker             }
7328*387f9dfdSAndroid Build Coastguard Worker             {
7329*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::FileName );
7330*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr() << _lineInfo << std::endl;
7331*387f9dfdSAndroid Build Coastguard Worker             }
7332*387f9dfdSAndroid Build Coastguard Worker             exit(1);
7333*387f9dfdSAndroid Build Coastguard Worker         }
7334*387f9dfdSAndroid Build Coastguard Worker     }
7335*387f9dfdSAndroid Build Coastguard Worker 
makeTestCase(ITestCase * _testCase,std::string const & _className,std::string const & _name,std::string const & _descOrTags,SourceLineInfo const & _lineInfo)7336*387f9dfdSAndroid Build Coastguard Worker     TestCase makeTestCase(  ITestCase* _testCase,
7337*387f9dfdSAndroid Build Coastguard Worker                             std::string const& _className,
7338*387f9dfdSAndroid Build Coastguard Worker                             std::string const& _name,
7339*387f9dfdSAndroid Build Coastguard Worker                             std::string const& _descOrTags,
7340*387f9dfdSAndroid Build Coastguard Worker                             SourceLineInfo const& _lineInfo )
7341*387f9dfdSAndroid Build Coastguard Worker     {
7342*387f9dfdSAndroid Build Coastguard Worker         bool isHidden( startsWith( _name, "./" ) ); // Legacy support
7343*387f9dfdSAndroid Build Coastguard Worker 
7344*387f9dfdSAndroid Build Coastguard Worker         // Parse out tags
7345*387f9dfdSAndroid Build Coastguard Worker         std::set<std::string> tags;
7346*387f9dfdSAndroid Build Coastguard Worker         std::string desc, tag;
7347*387f9dfdSAndroid Build Coastguard Worker         bool inTag = false;
7348*387f9dfdSAndroid Build Coastguard Worker         for( std::size_t i = 0; i < _descOrTags.size(); ++i ) {
7349*387f9dfdSAndroid Build Coastguard Worker             char c = _descOrTags[i];
7350*387f9dfdSAndroid Build Coastguard Worker             if( !inTag ) {
7351*387f9dfdSAndroid Build Coastguard Worker                 if( c == '[' )
7352*387f9dfdSAndroid Build Coastguard Worker                     inTag = true;
7353*387f9dfdSAndroid Build Coastguard Worker                 else
7354*387f9dfdSAndroid Build Coastguard Worker                     desc += c;
7355*387f9dfdSAndroid Build Coastguard Worker             }
7356*387f9dfdSAndroid Build Coastguard Worker             else {
7357*387f9dfdSAndroid Build Coastguard Worker                 if( c == ']' ) {
7358*387f9dfdSAndroid Build Coastguard Worker                     TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );
7359*387f9dfdSAndroid Build Coastguard Worker                     if( prop == TestCaseInfo::IsHidden )
7360*387f9dfdSAndroid Build Coastguard Worker                         isHidden = true;
7361*387f9dfdSAndroid Build Coastguard Worker                     else if( prop == TestCaseInfo::None )
7362*387f9dfdSAndroid Build Coastguard Worker                         enforceNotReservedTag( tag, _lineInfo );
7363*387f9dfdSAndroid Build Coastguard Worker 
7364*387f9dfdSAndroid Build Coastguard Worker                     tags.insert( tag );
7365*387f9dfdSAndroid Build Coastguard Worker                     tag.clear();
7366*387f9dfdSAndroid Build Coastguard Worker                     inTag = false;
7367*387f9dfdSAndroid Build Coastguard Worker                 }
7368*387f9dfdSAndroid Build Coastguard Worker                 else
7369*387f9dfdSAndroid Build Coastguard Worker                     tag += c;
7370*387f9dfdSAndroid Build Coastguard Worker             }
7371*387f9dfdSAndroid Build Coastguard Worker         }
7372*387f9dfdSAndroid Build Coastguard Worker         if( isHidden ) {
7373*387f9dfdSAndroid Build Coastguard Worker             tags.insert( "hide" );
7374*387f9dfdSAndroid Build Coastguard Worker             tags.insert( "." );
7375*387f9dfdSAndroid Build Coastguard Worker         }
7376*387f9dfdSAndroid Build Coastguard Worker 
7377*387f9dfdSAndroid Build Coastguard Worker         TestCaseInfo info( _name, _className, desc, tags, _lineInfo );
7378*387f9dfdSAndroid Build Coastguard Worker         return TestCase( _testCase, info );
7379*387f9dfdSAndroid Build Coastguard Worker     }
7380*387f9dfdSAndroid Build Coastguard Worker 
setTags(TestCaseInfo & testCaseInfo,std::set<std::string> const & tags)7381*387f9dfdSAndroid Build Coastguard Worker     void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags )
7382*387f9dfdSAndroid Build Coastguard Worker     {
7383*387f9dfdSAndroid Build Coastguard Worker         testCaseInfo.tags = tags;
7384*387f9dfdSAndroid Build Coastguard Worker         testCaseInfo.lcaseTags.clear();
7385*387f9dfdSAndroid Build Coastguard Worker 
7386*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream oss;
7387*387f9dfdSAndroid Build Coastguard Worker         for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) {
7388*387f9dfdSAndroid Build Coastguard Worker             oss << "[" << *it << "]";
7389*387f9dfdSAndroid Build Coastguard Worker             std::string lcaseTag = toLower( *it );
7390*387f9dfdSAndroid Build Coastguard Worker             testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );
7391*387f9dfdSAndroid Build Coastguard Worker             testCaseInfo.lcaseTags.insert( lcaseTag );
7392*387f9dfdSAndroid Build Coastguard Worker         }
7393*387f9dfdSAndroid Build Coastguard Worker         testCaseInfo.tagsAsString = oss.str();
7394*387f9dfdSAndroid Build Coastguard Worker     }
7395*387f9dfdSAndroid Build Coastguard Worker 
TestCaseInfo(std::string const & _name,std::string const & _className,std::string const & _description,std::set<std::string> const & _tags,SourceLineInfo const & _lineInfo)7396*387f9dfdSAndroid Build Coastguard Worker     TestCaseInfo::TestCaseInfo( std::string const& _name,
7397*387f9dfdSAndroid Build Coastguard Worker                                 std::string const& _className,
7398*387f9dfdSAndroid Build Coastguard Worker                                 std::string const& _description,
7399*387f9dfdSAndroid Build Coastguard Worker                                 std::set<std::string> const& _tags,
7400*387f9dfdSAndroid Build Coastguard Worker                                 SourceLineInfo const& _lineInfo )
7401*387f9dfdSAndroid Build Coastguard Worker     :   name( _name ),
7402*387f9dfdSAndroid Build Coastguard Worker         className( _className ),
7403*387f9dfdSAndroid Build Coastguard Worker         description( _description ),
7404*387f9dfdSAndroid Build Coastguard Worker         lineInfo( _lineInfo ),
7405*387f9dfdSAndroid Build Coastguard Worker         properties( None )
7406*387f9dfdSAndroid Build Coastguard Worker     {
7407*387f9dfdSAndroid Build Coastguard Worker         setTags( *this, _tags );
7408*387f9dfdSAndroid Build Coastguard Worker     }
7409*387f9dfdSAndroid Build Coastguard Worker 
TestCaseInfo(TestCaseInfo const & other)7410*387f9dfdSAndroid Build Coastguard Worker     TestCaseInfo::TestCaseInfo( TestCaseInfo const& other )
7411*387f9dfdSAndroid Build Coastguard Worker     :   name( other.name ),
7412*387f9dfdSAndroid Build Coastguard Worker         className( other.className ),
7413*387f9dfdSAndroid Build Coastguard Worker         description( other.description ),
7414*387f9dfdSAndroid Build Coastguard Worker         tags( other.tags ),
7415*387f9dfdSAndroid Build Coastguard Worker         lcaseTags( other.lcaseTags ),
7416*387f9dfdSAndroid Build Coastguard Worker         tagsAsString( other.tagsAsString ),
7417*387f9dfdSAndroid Build Coastguard Worker         lineInfo( other.lineInfo ),
7418*387f9dfdSAndroid Build Coastguard Worker         properties( other.properties )
7419*387f9dfdSAndroid Build Coastguard Worker     {}
7420*387f9dfdSAndroid Build Coastguard Worker 
isHidden() const7421*387f9dfdSAndroid Build Coastguard Worker     bool TestCaseInfo::isHidden() const {
7422*387f9dfdSAndroid Build Coastguard Worker         return ( properties & IsHidden ) != 0;
7423*387f9dfdSAndroid Build Coastguard Worker     }
throws() const7424*387f9dfdSAndroid Build Coastguard Worker     bool TestCaseInfo::throws() const {
7425*387f9dfdSAndroid Build Coastguard Worker         return ( properties & Throws ) != 0;
7426*387f9dfdSAndroid Build Coastguard Worker     }
okToFail() const7427*387f9dfdSAndroid Build Coastguard Worker     bool TestCaseInfo::okToFail() const {
7428*387f9dfdSAndroid Build Coastguard Worker         return ( properties & (ShouldFail | MayFail ) ) != 0;
7429*387f9dfdSAndroid Build Coastguard Worker     }
expectedToFail() const7430*387f9dfdSAndroid Build Coastguard Worker     bool TestCaseInfo::expectedToFail() const {
7431*387f9dfdSAndroid Build Coastguard Worker         return ( properties & (ShouldFail ) ) != 0;
7432*387f9dfdSAndroid Build Coastguard Worker     }
7433*387f9dfdSAndroid Build Coastguard Worker 
TestCase(ITestCase * testCase,TestCaseInfo const & info)7434*387f9dfdSAndroid Build Coastguard Worker     TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
7435*387f9dfdSAndroid Build Coastguard Worker 
TestCase(TestCase const & other)7436*387f9dfdSAndroid Build Coastguard Worker     TestCase::TestCase( TestCase const& other )
7437*387f9dfdSAndroid Build Coastguard Worker     :   TestCaseInfo( other ),
7438*387f9dfdSAndroid Build Coastguard Worker         test( other.test )
7439*387f9dfdSAndroid Build Coastguard Worker     {}
7440*387f9dfdSAndroid Build Coastguard Worker 
withName(std::string const & _newName) const7441*387f9dfdSAndroid Build Coastguard Worker     TestCase TestCase::withName( std::string const& _newName ) const {
7442*387f9dfdSAndroid Build Coastguard Worker         TestCase other( *this );
7443*387f9dfdSAndroid Build Coastguard Worker         other.name = _newName;
7444*387f9dfdSAndroid Build Coastguard Worker         return other;
7445*387f9dfdSAndroid Build Coastguard Worker     }
7446*387f9dfdSAndroid Build Coastguard Worker 
swap(TestCase & other)7447*387f9dfdSAndroid Build Coastguard Worker     void TestCase::swap( TestCase& other ) {
7448*387f9dfdSAndroid Build Coastguard Worker         test.swap( other.test );
7449*387f9dfdSAndroid Build Coastguard Worker         name.swap( other.name );
7450*387f9dfdSAndroid Build Coastguard Worker         className.swap( other.className );
7451*387f9dfdSAndroid Build Coastguard Worker         description.swap( other.description );
7452*387f9dfdSAndroid Build Coastguard Worker         tags.swap( other.tags );
7453*387f9dfdSAndroid Build Coastguard Worker         lcaseTags.swap( other.lcaseTags );
7454*387f9dfdSAndroid Build Coastguard Worker         tagsAsString.swap( other.tagsAsString );
7455*387f9dfdSAndroid Build Coastguard Worker         std::swap( TestCaseInfo::properties, static_cast<TestCaseInfo&>( other ).properties );
7456*387f9dfdSAndroid Build Coastguard Worker         std::swap( lineInfo, other.lineInfo );
7457*387f9dfdSAndroid Build Coastguard Worker     }
7458*387f9dfdSAndroid Build Coastguard Worker 
invoke() const7459*387f9dfdSAndroid Build Coastguard Worker     void TestCase::invoke() const {
7460*387f9dfdSAndroid Build Coastguard Worker         test->invoke();
7461*387f9dfdSAndroid Build Coastguard Worker     }
7462*387f9dfdSAndroid Build Coastguard Worker 
operator ==(TestCase const & other) const7463*387f9dfdSAndroid Build Coastguard Worker     bool TestCase::operator == ( TestCase const& other ) const {
7464*387f9dfdSAndroid Build Coastguard Worker         return  test.get() == other.test.get() &&
7465*387f9dfdSAndroid Build Coastguard Worker                 name == other.name &&
7466*387f9dfdSAndroid Build Coastguard Worker                 className == other.className;
7467*387f9dfdSAndroid Build Coastguard Worker     }
7468*387f9dfdSAndroid Build Coastguard Worker 
operator <(TestCase const & other) const7469*387f9dfdSAndroid Build Coastguard Worker     bool TestCase::operator < ( TestCase const& other ) const {
7470*387f9dfdSAndroid Build Coastguard Worker         return name < other.name;
7471*387f9dfdSAndroid Build Coastguard Worker     }
operator =(TestCase const & other)7472*387f9dfdSAndroid Build Coastguard Worker     TestCase& TestCase::operator = ( TestCase const& other ) {
7473*387f9dfdSAndroid Build Coastguard Worker         TestCase temp( other );
7474*387f9dfdSAndroid Build Coastguard Worker         swap( temp );
7475*387f9dfdSAndroid Build Coastguard Worker         return *this;
7476*387f9dfdSAndroid Build Coastguard Worker     }
7477*387f9dfdSAndroid Build Coastguard Worker 
getTestCaseInfo() const7478*387f9dfdSAndroid Build Coastguard Worker     TestCaseInfo const& TestCase::getTestCaseInfo() const
7479*387f9dfdSAndroid Build Coastguard Worker     {
7480*387f9dfdSAndroid Build Coastguard Worker         return *this;
7481*387f9dfdSAndroid Build Coastguard Worker     }
7482*387f9dfdSAndroid Build Coastguard Worker 
7483*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7484*387f9dfdSAndroid Build Coastguard Worker 
7485*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_version.hpp
7486*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
7487*387f9dfdSAndroid Build Coastguard Worker 
7488*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7489*387f9dfdSAndroid Build Coastguard Worker 
Version(unsigned int _majorVersion,unsigned int _minorVersion,unsigned int _patchNumber,std::string const & _branchName,unsigned int _buildNumber)7490*387f9dfdSAndroid Build Coastguard Worker     Version::Version
7491*387f9dfdSAndroid Build Coastguard Worker         (   unsigned int _majorVersion,
7492*387f9dfdSAndroid Build Coastguard Worker             unsigned int _minorVersion,
7493*387f9dfdSAndroid Build Coastguard Worker             unsigned int _patchNumber,
7494*387f9dfdSAndroid Build Coastguard Worker             std::string const& _branchName,
7495*387f9dfdSAndroid Build Coastguard Worker             unsigned int _buildNumber )
7496*387f9dfdSAndroid Build Coastguard Worker     :   majorVersion( _majorVersion ),
7497*387f9dfdSAndroid Build Coastguard Worker         minorVersion( _minorVersion ),
7498*387f9dfdSAndroid Build Coastguard Worker         patchNumber( _patchNumber ),
7499*387f9dfdSAndroid Build Coastguard Worker         branchName( _branchName ),
7500*387f9dfdSAndroid Build Coastguard Worker         buildNumber( _buildNumber )
7501*387f9dfdSAndroid Build Coastguard Worker     {}
7502*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,Version const & version)7503*387f9dfdSAndroid Build Coastguard Worker     std::ostream& operator << ( std::ostream& os, Version const& version ) {
7504*387f9dfdSAndroid Build Coastguard Worker         os  << version.majorVersion << "."
7505*387f9dfdSAndroid Build Coastguard Worker             << version.minorVersion << "."
7506*387f9dfdSAndroid Build Coastguard Worker             << version.patchNumber;
7507*387f9dfdSAndroid Build Coastguard Worker 
7508*387f9dfdSAndroid Build Coastguard Worker         if( !version.branchName.empty() ) {
7509*387f9dfdSAndroid Build Coastguard Worker             os  << "-" << version.branchName
7510*387f9dfdSAndroid Build Coastguard Worker                 << "." << version.buildNumber;
7511*387f9dfdSAndroid Build Coastguard Worker         }
7512*387f9dfdSAndroid Build Coastguard Worker         return os;
7513*387f9dfdSAndroid Build Coastguard Worker     }
7514*387f9dfdSAndroid Build Coastguard Worker 
7515*387f9dfdSAndroid Build Coastguard Worker     Version libraryVersion( 1, 4, 0, "", 0 );
7516*387f9dfdSAndroid Build Coastguard Worker 
7517*387f9dfdSAndroid Build Coastguard Worker }
7518*387f9dfdSAndroid Build Coastguard Worker 
7519*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_message.hpp
7520*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
7521*387f9dfdSAndroid Build Coastguard Worker 
7522*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7523*387f9dfdSAndroid Build Coastguard Worker 
MessageInfo(std::string const & _macroName,SourceLineInfo const & _lineInfo,ResultWas::OfType _type)7524*387f9dfdSAndroid Build Coastguard Worker     MessageInfo::MessageInfo(   std::string const& _macroName,
7525*387f9dfdSAndroid Build Coastguard Worker                                 SourceLineInfo const& _lineInfo,
7526*387f9dfdSAndroid Build Coastguard Worker                                 ResultWas::OfType _type )
7527*387f9dfdSAndroid Build Coastguard Worker     :   macroName( _macroName ),
7528*387f9dfdSAndroid Build Coastguard Worker         lineInfo( _lineInfo ),
7529*387f9dfdSAndroid Build Coastguard Worker         type( _type ),
7530*387f9dfdSAndroid Build Coastguard Worker         sequence( ++globalCount )
7531*387f9dfdSAndroid Build Coastguard Worker     {}
7532*387f9dfdSAndroid Build Coastguard Worker 
7533*387f9dfdSAndroid Build Coastguard Worker     // This may need protecting if threading support is added
7534*387f9dfdSAndroid Build Coastguard Worker     unsigned int MessageInfo::globalCount = 0;
7535*387f9dfdSAndroid Build Coastguard Worker 
7536*387f9dfdSAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
7537*387f9dfdSAndroid Build Coastguard Worker 
ScopedMessage(MessageBuilder const & builder)7538*387f9dfdSAndroid Build Coastguard Worker     ScopedMessage::ScopedMessage( MessageBuilder const& builder )
7539*387f9dfdSAndroid Build Coastguard Worker     : m_info( builder.m_info )
7540*387f9dfdSAndroid Build Coastguard Worker     {
7541*387f9dfdSAndroid Build Coastguard Worker         m_info.message = builder.m_stream.str();
7542*387f9dfdSAndroid Build Coastguard Worker         getResultCapture().pushScopedMessage( m_info );
7543*387f9dfdSAndroid Build Coastguard Worker     }
ScopedMessage(ScopedMessage const & other)7544*387f9dfdSAndroid Build Coastguard Worker     ScopedMessage::ScopedMessage( ScopedMessage const& other )
7545*387f9dfdSAndroid Build Coastguard Worker     : m_info( other.m_info )
7546*387f9dfdSAndroid Build Coastguard Worker     {}
7547*387f9dfdSAndroid Build Coastguard Worker 
~ScopedMessage()7548*387f9dfdSAndroid Build Coastguard Worker     ScopedMessage::~ScopedMessage() {
7549*387f9dfdSAndroid Build Coastguard Worker         getResultCapture().popScopedMessage( m_info );
7550*387f9dfdSAndroid Build Coastguard Worker     }
7551*387f9dfdSAndroid Build Coastguard Worker 
7552*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7553*387f9dfdSAndroid Build Coastguard Worker 
7554*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_legacy_reporter_adapter.hpp
7555*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
7556*387f9dfdSAndroid Build Coastguard Worker 
7557*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_legacy_reporter_adapter.h
7558*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
7559*387f9dfdSAndroid Build Coastguard Worker 
7560*387f9dfdSAndroid Build Coastguard Worker namespace Catch
7561*387f9dfdSAndroid Build Coastguard Worker {
7562*387f9dfdSAndroid Build Coastguard Worker     // Deprecated
7563*387f9dfdSAndroid Build Coastguard Worker     struct IReporter : IShared {
7564*387f9dfdSAndroid Build Coastguard Worker         virtual ~IReporter();
7565*387f9dfdSAndroid Build Coastguard Worker 
7566*387f9dfdSAndroid Build Coastguard Worker         virtual bool shouldRedirectStdout() const = 0;
7567*387f9dfdSAndroid Build Coastguard Worker 
7568*387f9dfdSAndroid Build Coastguard Worker         virtual void StartTesting() = 0;
7569*387f9dfdSAndroid Build Coastguard Worker         virtual void EndTesting( Totals const& totals ) = 0;
7570*387f9dfdSAndroid Build Coastguard Worker         virtual void StartGroup( std::string const& groupName ) = 0;
7571*387f9dfdSAndroid Build Coastguard Worker         virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0;
7572*387f9dfdSAndroid Build Coastguard Worker         virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0;
7573*387f9dfdSAndroid Build Coastguard Worker         virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0;
7574*387f9dfdSAndroid Build Coastguard Worker         virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0;
7575*387f9dfdSAndroid Build Coastguard Worker         virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0;
7576*387f9dfdSAndroid Build Coastguard Worker         virtual void NoAssertionsInSection( std::string const& sectionName ) = 0;
7577*387f9dfdSAndroid Build Coastguard Worker         virtual void NoAssertionsInTestCase( std::string const& testName ) = 0;
7578*387f9dfdSAndroid Build Coastguard Worker         virtual void Aborted() = 0;
7579*387f9dfdSAndroid Build Coastguard Worker         virtual void Result( AssertionResult const& result ) = 0;
7580*387f9dfdSAndroid Build Coastguard Worker     };
7581*387f9dfdSAndroid Build Coastguard Worker 
7582*387f9dfdSAndroid Build Coastguard Worker     class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>
7583*387f9dfdSAndroid Build Coastguard Worker     {
7584*387f9dfdSAndroid Build Coastguard Worker     public:
7585*387f9dfdSAndroid Build Coastguard Worker         LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter );
7586*387f9dfdSAndroid Build Coastguard Worker         virtual ~LegacyReporterAdapter();
7587*387f9dfdSAndroid Build Coastguard Worker 
7588*387f9dfdSAndroid Build Coastguard Worker         virtual ReporterPreferences getPreferences() const;
7589*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& );
7590*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& );
7591*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& groupInfo );
7592*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseStarting( TestCaseInfo const& testInfo );
7593*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& sectionInfo );
7594*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& );
7595*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& assertionStats );
7596*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& sectionStats );
7597*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& testCaseStats );
7598*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& testGroupStats );
7599*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& testRunStats );
7600*387f9dfdSAndroid Build Coastguard Worker         virtual void skipTest( TestCaseInfo const& );
7601*387f9dfdSAndroid Build Coastguard Worker 
7602*387f9dfdSAndroid Build Coastguard Worker     private:
7603*387f9dfdSAndroid Build Coastguard Worker         Ptr<IReporter> m_legacyReporter;
7604*387f9dfdSAndroid Build Coastguard Worker     };
7605*387f9dfdSAndroid Build Coastguard Worker }
7606*387f9dfdSAndroid Build Coastguard Worker 
7607*387f9dfdSAndroid Build Coastguard Worker namespace Catch
7608*387f9dfdSAndroid Build Coastguard Worker {
LegacyReporterAdapter(Ptr<IReporter> const & legacyReporter)7609*387f9dfdSAndroid Build Coastguard Worker     LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter )
7610*387f9dfdSAndroid Build Coastguard Worker     :   m_legacyReporter( legacyReporter )
7611*387f9dfdSAndroid Build Coastguard Worker     {}
~LegacyReporterAdapter()7612*387f9dfdSAndroid Build Coastguard Worker     LegacyReporterAdapter::~LegacyReporterAdapter() {}
7613*387f9dfdSAndroid Build Coastguard Worker 
getPreferences() const7614*387f9dfdSAndroid Build Coastguard Worker     ReporterPreferences LegacyReporterAdapter::getPreferences() const {
7615*387f9dfdSAndroid Build Coastguard Worker         ReporterPreferences prefs;
7616*387f9dfdSAndroid Build Coastguard Worker         prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();
7617*387f9dfdSAndroid Build Coastguard Worker         return prefs;
7618*387f9dfdSAndroid Build Coastguard Worker     }
7619*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCases(std::string const &)7620*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {}
testRunStarting(TestRunInfo const &)7621*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) {
7622*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->StartTesting();
7623*387f9dfdSAndroid Build Coastguard Worker     }
testGroupStarting(GroupInfo const & groupInfo)7624*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) {
7625*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->StartGroup( groupInfo.name );
7626*387f9dfdSAndroid Build Coastguard Worker     }
testCaseStarting(TestCaseInfo const & testInfo)7627*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) {
7628*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->StartTestCase( testInfo );
7629*387f9dfdSAndroid Build Coastguard Worker     }
sectionStarting(SectionInfo const & sectionInfo)7630*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) {
7631*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description );
7632*387f9dfdSAndroid Build Coastguard Worker     }
assertionStarting(AssertionInfo const &)7633*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) {
7634*387f9dfdSAndroid Build Coastguard Worker         // Not on legacy interface
7635*387f9dfdSAndroid Build Coastguard Worker     }
7636*387f9dfdSAndroid Build Coastguard Worker 
assertionEnded(AssertionStats const & assertionStats)7637*387f9dfdSAndroid Build Coastguard Worker     bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) {
7638*387f9dfdSAndroid Build Coastguard Worker         if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
7639*387f9dfdSAndroid Build Coastguard Worker             for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
7640*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd;
7641*387f9dfdSAndroid Build Coastguard Worker                     ++it ) {
7642*387f9dfdSAndroid Build Coastguard Worker                 if( it->type == ResultWas::Info ) {
7643*387f9dfdSAndroid Build Coastguard Worker                     ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal );
7644*387f9dfdSAndroid Build Coastguard Worker                     rb << it->message;
7645*387f9dfdSAndroid Build Coastguard Worker                     rb.setResultType( ResultWas::Info );
7646*387f9dfdSAndroid Build Coastguard Worker                     AssertionResult result = rb.build();
7647*387f9dfdSAndroid Build Coastguard Worker                     m_legacyReporter->Result( result );
7648*387f9dfdSAndroid Build Coastguard Worker                 }
7649*387f9dfdSAndroid Build Coastguard Worker             }
7650*387f9dfdSAndroid Build Coastguard Worker         }
7651*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->Result( assertionStats.assertionResult );
7652*387f9dfdSAndroid Build Coastguard Worker         return true;
7653*387f9dfdSAndroid Build Coastguard Worker     }
sectionEnded(SectionStats const & sectionStats)7654*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) {
7655*387f9dfdSAndroid Build Coastguard Worker         if( sectionStats.missingAssertions )
7656*387f9dfdSAndroid Build Coastguard Worker             m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name );
7657*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions );
7658*387f9dfdSAndroid Build Coastguard Worker     }
testCaseEnded(TestCaseStats const & testCaseStats)7659*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) {
7660*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->EndTestCase
7661*387f9dfdSAndroid Build Coastguard Worker             (   testCaseStats.testInfo,
7662*387f9dfdSAndroid Build Coastguard Worker                 testCaseStats.totals,
7663*387f9dfdSAndroid Build Coastguard Worker                 testCaseStats.stdOut,
7664*387f9dfdSAndroid Build Coastguard Worker                 testCaseStats.stdErr );
7665*387f9dfdSAndroid Build Coastguard Worker     }
testGroupEnded(TestGroupStats const & testGroupStats)7666*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) {
7667*387f9dfdSAndroid Build Coastguard Worker         if( testGroupStats.aborting )
7668*387f9dfdSAndroid Build Coastguard Worker             m_legacyReporter->Aborted();
7669*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals );
7670*387f9dfdSAndroid Build Coastguard Worker     }
testRunEnded(TestRunStats const & testRunStats)7671*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) {
7672*387f9dfdSAndroid Build Coastguard Worker         m_legacyReporter->EndTesting( testRunStats.totals );
7673*387f9dfdSAndroid Build Coastguard Worker     }
skipTest(TestCaseInfo const &)7674*387f9dfdSAndroid Build Coastguard Worker     void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) {
7675*387f9dfdSAndroid Build Coastguard Worker     }
7676*387f9dfdSAndroid Build Coastguard Worker }
7677*387f9dfdSAndroid Build Coastguard Worker 
7678*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_timer.hpp
7679*387f9dfdSAndroid Build Coastguard Worker 
7680*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
7681*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic push
7682*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wc++11-long-long"
7683*387f9dfdSAndroid Build Coastguard Worker #endif
7684*387f9dfdSAndroid Build Coastguard Worker 
7685*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_WINDOWS
7686*387f9dfdSAndroid Build Coastguard Worker #include <windows.h>
7687*387f9dfdSAndroid Build Coastguard Worker #else
7688*387f9dfdSAndroid Build Coastguard Worker #include <sys/time.h>
7689*387f9dfdSAndroid Build Coastguard Worker #endif
7690*387f9dfdSAndroid Build Coastguard Worker 
7691*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7692*387f9dfdSAndroid Build Coastguard Worker 
7693*387f9dfdSAndroid Build Coastguard Worker     namespace {
7694*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_WINDOWS
getCurrentTicks()7695*387f9dfdSAndroid Build Coastguard Worker         uint64_t getCurrentTicks() {
7696*387f9dfdSAndroid Build Coastguard Worker             static uint64_t hz=0, hzo=0;
7697*387f9dfdSAndroid Build Coastguard Worker             if (!hz) {
7698*387f9dfdSAndroid Build Coastguard Worker                 QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER*>( &hz ) );
7699*387f9dfdSAndroid Build Coastguard Worker                 QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &hzo ) );
7700*387f9dfdSAndroid Build Coastguard Worker             }
7701*387f9dfdSAndroid Build Coastguard Worker             uint64_t t;
7702*387f9dfdSAndroid Build Coastguard Worker             QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &t ) );
7703*387f9dfdSAndroid Build Coastguard Worker             return ((t-hzo)*1000000)/hz;
7704*387f9dfdSAndroid Build Coastguard Worker         }
7705*387f9dfdSAndroid Build Coastguard Worker #else
7706*387f9dfdSAndroid Build Coastguard Worker         uint64_t getCurrentTicks() {
7707*387f9dfdSAndroid Build Coastguard Worker             timeval t;
7708*387f9dfdSAndroid Build Coastguard Worker             gettimeofday(&t,CATCH_NULL);
7709*387f9dfdSAndroid Build Coastguard Worker             return static_cast<uint64_t>( t.tv_sec ) * 1000000ull + static_cast<uint64_t>( t.tv_usec );
7710*387f9dfdSAndroid Build Coastguard Worker         }
7711*387f9dfdSAndroid Build Coastguard Worker #endif
7712*387f9dfdSAndroid Build Coastguard Worker     }
7713*387f9dfdSAndroid Build Coastguard Worker 
start()7714*387f9dfdSAndroid Build Coastguard Worker     void Timer::start() {
7715*387f9dfdSAndroid Build Coastguard Worker         m_ticks = getCurrentTicks();
7716*387f9dfdSAndroid Build Coastguard Worker     }
getElapsedMicroseconds() const7717*387f9dfdSAndroid Build Coastguard Worker     unsigned int Timer::getElapsedMicroseconds() const {
7718*387f9dfdSAndroid Build Coastguard Worker         return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
7719*387f9dfdSAndroid Build Coastguard Worker     }
getElapsedMilliseconds() const7720*387f9dfdSAndroid Build Coastguard Worker     unsigned int Timer::getElapsedMilliseconds() const {
7721*387f9dfdSAndroid Build Coastguard Worker         return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
7722*387f9dfdSAndroid Build Coastguard Worker     }
getElapsedSeconds() const7723*387f9dfdSAndroid Build Coastguard Worker     double Timer::getElapsedSeconds() const {
7724*387f9dfdSAndroid Build Coastguard Worker         return getElapsedMicroseconds()/1000000.0;
7725*387f9dfdSAndroid Build Coastguard Worker     }
7726*387f9dfdSAndroid Build Coastguard Worker 
7727*387f9dfdSAndroid Build Coastguard Worker } // namespace Catch
7728*387f9dfdSAndroid Build Coastguard Worker 
7729*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
7730*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
7731*387f9dfdSAndroid Build Coastguard Worker #endif
7732*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_common.hpp
7733*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
7734*387f9dfdSAndroid Build Coastguard Worker 
7735*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7736*387f9dfdSAndroid Build Coastguard Worker 
startsWith(std::string const & s,std::string const & prefix)7737*387f9dfdSAndroid Build Coastguard Worker     bool startsWith( std::string const& s, std::string const& prefix ) {
7738*387f9dfdSAndroid Build Coastguard Worker         return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;
7739*387f9dfdSAndroid Build Coastguard Worker     }
endsWith(std::string const & s,std::string const & suffix)7740*387f9dfdSAndroid Build Coastguard Worker     bool endsWith( std::string const& s, std::string const& suffix ) {
7741*387f9dfdSAndroid Build Coastguard Worker         return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;
7742*387f9dfdSAndroid Build Coastguard Worker     }
contains(std::string const & s,std::string const & infix)7743*387f9dfdSAndroid Build Coastguard Worker     bool contains( std::string const& s, std::string const& infix ) {
7744*387f9dfdSAndroid Build Coastguard Worker         return s.find( infix ) != std::string::npos;
7745*387f9dfdSAndroid Build Coastguard Worker     }
toLowerInPlace(std::string & s)7746*387f9dfdSAndroid Build Coastguard Worker     void toLowerInPlace( std::string& s ) {
7747*387f9dfdSAndroid Build Coastguard Worker         std::transform( s.begin(), s.end(), s.begin(), ::tolower );
7748*387f9dfdSAndroid Build Coastguard Worker     }
toLower(std::string const & s)7749*387f9dfdSAndroid Build Coastguard Worker     std::string toLower( std::string const& s ) {
7750*387f9dfdSAndroid Build Coastguard Worker         std::string lc = s;
7751*387f9dfdSAndroid Build Coastguard Worker         toLowerInPlace( lc );
7752*387f9dfdSAndroid Build Coastguard Worker         return lc;
7753*387f9dfdSAndroid Build Coastguard Worker     }
trim(std::string const & str)7754*387f9dfdSAndroid Build Coastguard Worker     std::string trim( std::string const& str ) {
7755*387f9dfdSAndroid Build Coastguard Worker         static char const* whitespaceChars = "\n\r\t ";
7756*387f9dfdSAndroid Build Coastguard Worker         std::string::size_type start = str.find_first_not_of( whitespaceChars );
7757*387f9dfdSAndroid Build Coastguard Worker         std::string::size_type end = str.find_last_not_of( whitespaceChars );
7758*387f9dfdSAndroid Build Coastguard Worker 
7759*387f9dfdSAndroid Build Coastguard Worker         return start != std::string::npos ? str.substr( start, 1+end-start ) : "";
7760*387f9dfdSAndroid Build Coastguard Worker     }
7761*387f9dfdSAndroid Build Coastguard Worker 
replaceInPlace(std::string & str,std::string const & replaceThis,std::string const & withThis)7762*387f9dfdSAndroid Build Coastguard Worker     bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
7763*387f9dfdSAndroid Build Coastguard Worker         bool replaced = false;
7764*387f9dfdSAndroid Build Coastguard Worker         std::size_t i = str.find( replaceThis );
7765*387f9dfdSAndroid Build Coastguard Worker         while( i != std::string::npos ) {
7766*387f9dfdSAndroid Build Coastguard Worker             replaced = true;
7767*387f9dfdSAndroid Build Coastguard Worker             str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );
7768*387f9dfdSAndroid Build Coastguard Worker             if( i < str.size()-withThis.size() )
7769*387f9dfdSAndroid Build Coastguard Worker                 i = str.find( replaceThis, i+withThis.size() );
7770*387f9dfdSAndroid Build Coastguard Worker             else
7771*387f9dfdSAndroid Build Coastguard Worker                 i = std::string::npos;
7772*387f9dfdSAndroid Build Coastguard Worker         }
7773*387f9dfdSAndroid Build Coastguard Worker         return replaced;
7774*387f9dfdSAndroid Build Coastguard Worker     }
7775*387f9dfdSAndroid Build Coastguard Worker 
pluralise(std::size_t count,std::string const & label)7776*387f9dfdSAndroid Build Coastguard Worker     pluralise::pluralise( std::size_t count, std::string const& label )
7777*387f9dfdSAndroid Build Coastguard Worker     :   m_count( count ),
7778*387f9dfdSAndroid Build Coastguard Worker         m_label( label )
7779*387f9dfdSAndroid Build Coastguard Worker     {}
7780*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,pluralise const & pluraliser)7781*387f9dfdSAndroid Build Coastguard Worker     std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
7782*387f9dfdSAndroid Build Coastguard Worker         os << pluraliser.m_count << " " << pluraliser.m_label;
7783*387f9dfdSAndroid Build Coastguard Worker         if( pluraliser.m_count != 1 )
7784*387f9dfdSAndroid Build Coastguard Worker             os << "s";
7785*387f9dfdSAndroid Build Coastguard Worker         return os;
7786*387f9dfdSAndroid Build Coastguard Worker     }
7787*387f9dfdSAndroid Build Coastguard Worker 
SourceLineInfo()7788*387f9dfdSAndroid Build Coastguard Worker     SourceLineInfo::SourceLineInfo() : line( 0 ){}
SourceLineInfo(char const * _file,std::size_t _line)7789*387f9dfdSAndroid Build Coastguard Worker     SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line )
7790*387f9dfdSAndroid Build Coastguard Worker     :   file( _file ),
7791*387f9dfdSAndroid Build Coastguard Worker         line( _line )
7792*387f9dfdSAndroid Build Coastguard Worker     {}
SourceLineInfo(SourceLineInfo const & other)7793*387f9dfdSAndroid Build Coastguard Worker     SourceLineInfo::SourceLineInfo( SourceLineInfo const& other )
7794*387f9dfdSAndroid Build Coastguard Worker     :   file( other.file ),
7795*387f9dfdSAndroid Build Coastguard Worker         line( other.line )
7796*387f9dfdSAndroid Build Coastguard Worker     {}
empty() const7797*387f9dfdSAndroid Build Coastguard Worker     bool SourceLineInfo::empty() const {
7798*387f9dfdSAndroid Build Coastguard Worker         return file.empty();
7799*387f9dfdSAndroid Build Coastguard Worker     }
operator ==(SourceLineInfo const & other) const7800*387f9dfdSAndroid Build Coastguard Worker     bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const {
7801*387f9dfdSAndroid Build Coastguard Worker         return line == other.line && file == other.file;
7802*387f9dfdSAndroid Build Coastguard Worker     }
operator <(SourceLineInfo const & other) const7803*387f9dfdSAndroid Build Coastguard Worker     bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const {
7804*387f9dfdSAndroid Build Coastguard Worker         return line < other.line || ( line == other.line  && file < other.file );
7805*387f9dfdSAndroid Build Coastguard Worker     }
7806*387f9dfdSAndroid Build Coastguard Worker 
seedRng(IConfig const & config)7807*387f9dfdSAndroid Build Coastguard Worker     void seedRng( IConfig const& config ) {
7808*387f9dfdSAndroid Build Coastguard Worker         if( config.rngSeed() != 0 )
7809*387f9dfdSAndroid Build Coastguard Worker             std::srand( config.rngSeed() );
7810*387f9dfdSAndroid Build Coastguard Worker     }
rngSeed()7811*387f9dfdSAndroid Build Coastguard Worker     unsigned int rngSeed() {
7812*387f9dfdSAndroid Build Coastguard Worker         return getCurrentContext().getConfig()->rngSeed();
7813*387f9dfdSAndroid Build Coastguard Worker     }
7814*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,SourceLineInfo const & info)7815*387f9dfdSAndroid Build Coastguard Worker     std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
7816*387f9dfdSAndroid Build Coastguard Worker #ifndef __GNUG__
7817*387f9dfdSAndroid Build Coastguard Worker         os << info.file << "(" << info.line << ")";
7818*387f9dfdSAndroid Build Coastguard Worker #else
7819*387f9dfdSAndroid Build Coastguard Worker         os << info.file << ":" << info.line;
7820*387f9dfdSAndroid Build Coastguard Worker #endif
7821*387f9dfdSAndroid Build Coastguard Worker         return os;
7822*387f9dfdSAndroid Build Coastguard Worker     }
7823*387f9dfdSAndroid Build Coastguard Worker 
throwLogicError(std::string const & message,SourceLineInfo const & locationInfo)7824*387f9dfdSAndroid Build Coastguard Worker     void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {
7825*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream oss;
7826*387f9dfdSAndroid Build Coastguard Worker         oss << locationInfo << ": Internal Catch error: '" << message << "'";
7827*387f9dfdSAndroid Build Coastguard Worker         if( alwaysTrue() )
7828*387f9dfdSAndroid Build Coastguard Worker             throw std::logic_error( oss.str() );
7829*387f9dfdSAndroid Build Coastguard Worker     }
7830*387f9dfdSAndroid Build Coastguard Worker }
7831*387f9dfdSAndroid Build Coastguard Worker 
7832*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_section.hpp
7833*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
7834*387f9dfdSAndroid Build Coastguard Worker 
7835*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7836*387f9dfdSAndroid Build Coastguard Worker 
SectionInfo(SourceLineInfo const & _lineInfo,std::string const & _name,std::string const & _description)7837*387f9dfdSAndroid Build Coastguard Worker     SectionInfo::SectionInfo
7838*387f9dfdSAndroid Build Coastguard Worker         (   SourceLineInfo const& _lineInfo,
7839*387f9dfdSAndroid Build Coastguard Worker             std::string const& _name,
7840*387f9dfdSAndroid Build Coastguard Worker             std::string const& _description )
7841*387f9dfdSAndroid Build Coastguard Worker     :   name( _name ),
7842*387f9dfdSAndroid Build Coastguard Worker         description( _description ),
7843*387f9dfdSAndroid Build Coastguard Worker         lineInfo( _lineInfo )
7844*387f9dfdSAndroid Build Coastguard Worker     {}
7845*387f9dfdSAndroid Build Coastguard Worker 
Section(SectionInfo const & info)7846*387f9dfdSAndroid Build Coastguard Worker     Section::Section( SectionInfo const& info )
7847*387f9dfdSAndroid Build Coastguard Worker     :   m_info( info ),
7848*387f9dfdSAndroid Build Coastguard Worker         m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )
7849*387f9dfdSAndroid Build Coastguard Worker     {
7850*387f9dfdSAndroid Build Coastguard Worker         m_timer.start();
7851*387f9dfdSAndroid Build Coastguard Worker     }
7852*387f9dfdSAndroid Build Coastguard Worker 
~Section()7853*387f9dfdSAndroid Build Coastguard Worker     Section::~Section() {
7854*387f9dfdSAndroid Build Coastguard Worker         if( m_sectionIncluded ) {
7855*387f9dfdSAndroid Build Coastguard Worker             SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() );
7856*387f9dfdSAndroid Build Coastguard Worker             if( std::uncaught_exception() )
7857*387f9dfdSAndroid Build Coastguard Worker                 getResultCapture().sectionEndedEarly( endInfo );
7858*387f9dfdSAndroid Build Coastguard Worker             else
7859*387f9dfdSAndroid Build Coastguard Worker                 getResultCapture().sectionEnded( endInfo );
7860*387f9dfdSAndroid Build Coastguard Worker         }
7861*387f9dfdSAndroid Build Coastguard Worker     }
7862*387f9dfdSAndroid Build Coastguard Worker 
7863*387f9dfdSAndroid Build Coastguard Worker     // This indicates whether the section should be executed or not
operator bool() const7864*387f9dfdSAndroid Build Coastguard Worker     Section::operator bool() const {
7865*387f9dfdSAndroid Build Coastguard Worker         return m_sectionIncluded;
7866*387f9dfdSAndroid Build Coastguard Worker     }
7867*387f9dfdSAndroid Build Coastguard Worker 
7868*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
7869*387f9dfdSAndroid Build Coastguard Worker 
7870*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_debugger.hpp
7871*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED
7872*387f9dfdSAndroid Build Coastguard Worker 
7873*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
7874*387f9dfdSAndroid Build Coastguard Worker 
7875*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_MAC
7876*387f9dfdSAndroid Build Coastguard Worker 
7877*387f9dfdSAndroid Build Coastguard Worker     #include <assert.h>
7878*387f9dfdSAndroid Build Coastguard Worker     #include <stdbool.h>
7879*387f9dfdSAndroid Build Coastguard Worker     #include <sys/types.h>
7880*387f9dfdSAndroid Build Coastguard Worker     #include <unistd.h>
7881*387f9dfdSAndroid Build Coastguard Worker     #include <sys/sysctl.h>
7882*387f9dfdSAndroid Build Coastguard Worker 
7883*387f9dfdSAndroid Build Coastguard Worker     namespace Catch{
7884*387f9dfdSAndroid Build Coastguard Worker 
7885*387f9dfdSAndroid Build Coastguard Worker         // The following function is taken directly from the following technical note:
7886*387f9dfdSAndroid Build Coastguard Worker         // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
7887*387f9dfdSAndroid Build Coastguard Worker 
7888*387f9dfdSAndroid Build Coastguard Worker         // Returns true if the current process is being debugged (either
7889*387f9dfdSAndroid Build Coastguard Worker         // running under the debugger or has a debugger attached post facto).
isDebuggerActive()7890*387f9dfdSAndroid Build Coastguard Worker         bool isDebuggerActive(){
7891*387f9dfdSAndroid Build Coastguard Worker 
7892*387f9dfdSAndroid Build Coastguard Worker             int                 mib[4];
7893*387f9dfdSAndroid Build Coastguard Worker             struct kinfo_proc   info;
7894*387f9dfdSAndroid Build Coastguard Worker             size_t              size;
7895*387f9dfdSAndroid Build Coastguard Worker 
7896*387f9dfdSAndroid Build Coastguard Worker             // Initialize the flags so that, if sysctl fails for some bizarre
7897*387f9dfdSAndroid Build Coastguard Worker             // reason, we get a predictable result.
7898*387f9dfdSAndroid Build Coastguard Worker 
7899*387f9dfdSAndroid Build Coastguard Worker             info.kp_proc.p_flag = 0;
7900*387f9dfdSAndroid Build Coastguard Worker 
7901*387f9dfdSAndroid Build Coastguard Worker             // Initialize mib, which tells sysctl the info we want, in this case
7902*387f9dfdSAndroid Build Coastguard Worker             // we're looking for information about a specific process ID.
7903*387f9dfdSAndroid Build Coastguard Worker 
7904*387f9dfdSAndroid Build Coastguard Worker             mib[0] = CTL_KERN;
7905*387f9dfdSAndroid Build Coastguard Worker             mib[1] = KERN_PROC;
7906*387f9dfdSAndroid Build Coastguard Worker             mib[2] = KERN_PROC_PID;
7907*387f9dfdSAndroid Build Coastguard Worker             mib[3] = getpid();
7908*387f9dfdSAndroid Build Coastguard Worker 
7909*387f9dfdSAndroid Build Coastguard Worker             // Call sysctl.
7910*387f9dfdSAndroid Build Coastguard Worker 
7911*387f9dfdSAndroid Build Coastguard Worker             size = sizeof(info);
7912*387f9dfdSAndroid Build Coastguard Worker             if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) {
7913*387f9dfdSAndroid Build Coastguard Worker                 Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl;
7914*387f9dfdSAndroid Build Coastguard Worker                 return false;
7915*387f9dfdSAndroid Build Coastguard Worker             }
7916*387f9dfdSAndroid Build Coastguard Worker 
7917*387f9dfdSAndroid Build Coastguard Worker             // We're being debugged if the P_TRACED flag is set.
7918*387f9dfdSAndroid Build Coastguard Worker 
7919*387f9dfdSAndroid Build Coastguard Worker             return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
7920*387f9dfdSAndroid Build Coastguard Worker         }
7921*387f9dfdSAndroid Build Coastguard Worker     } // namespace Catch
7922*387f9dfdSAndroid Build Coastguard Worker 
7923*387f9dfdSAndroid Build Coastguard Worker #elif defined(_MSC_VER)
7924*387f9dfdSAndroid Build Coastguard Worker     extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
7925*387f9dfdSAndroid Build Coastguard Worker     namespace Catch {
isDebuggerActive()7926*387f9dfdSAndroid Build Coastguard Worker         bool isDebuggerActive() {
7927*387f9dfdSAndroid Build Coastguard Worker             return IsDebuggerPresent() != 0;
7928*387f9dfdSAndroid Build Coastguard Worker         }
7929*387f9dfdSAndroid Build Coastguard Worker     }
7930*387f9dfdSAndroid Build Coastguard Worker #elif defined(__MINGW32__)
7931*387f9dfdSAndroid Build Coastguard Worker     extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
7932*387f9dfdSAndroid Build Coastguard Worker     namespace Catch {
isDebuggerActive()7933*387f9dfdSAndroid Build Coastguard Worker         bool isDebuggerActive() {
7934*387f9dfdSAndroid Build Coastguard Worker             return IsDebuggerPresent() != 0;
7935*387f9dfdSAndroid Build Coastguard Worker         }
7936*387f9dfdSAndroid Build Coastguard Worker     }
7937*387f9dfdSAndroid Build Coastguard Worker #else
7938*387f9dfdSAndroid Build Coastguard Worker     namespace Catch {
isDebuggerActive()7939*387f9dfdSAndroid Build Coastguard Worker        inline bool isDebuggerActive() { return false; }
7940*387f9dfdSAndroid Build Coastguard Worker     }
7941*387f9dfdSAndroid Build Coastguard Worker #endif // Platform
7942*387f9dfdSAndroid Build Coastguard Worker 
7943*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_WINDOWS
7944*387f9dfdSAndroid Build Coastguard Worker     extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );
7945*387f9dfdSAndroid Build Coastguard Worker     namespace Catch {
writeToDebugConsole(std::string const & text)7946*387f9dfdSAndroid Build Coastguard Worker         void writeToDebugConsole( std::string const& text ) {
7947*387f9dfdSAndroid Build Coastguard Worker             ::OutputDebugStringA( text.c_str() );
7948*387f9dfdSAndroid Build Coastguard Worker         }
7949*387f9dfdSAndroid Build Coastguard Worker     }
7950*387f9dfdSAndroid Build Coastguard Worker #else
7951*387f9dfdSAndroid Build Coastguard Worker     namespace Catch {
writeToDebugConsole(std::string const & text)7952*387f9dfdSAndroid Build Coastguard Worker         void writeToDebugConsole( std::string const& text ) {
7953*387f9dfdSAndroid Build Coastguard Worker             // !TBD: Need a version for Mac/ XCode and other IDEs
7954*387f9dfdSAndroid Build Coastguard Worker             Catch::cout() << text;
7955*387f9dfdSAndroid Build Coastguard Worker         }
7956*387f9dfdSAndroid Build Coastguard Worker     }
7957*387f9dfdSAndroid Build Coastguard Worker #endif // Platform
7958*387f9dfdSAndroid Build Coastguard Worker 
7959*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_tostring.hpp
7960*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
7961*387f9dfdSAndroid Build Coastguard Worker 
7962*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
7963*387f9dfdSAndroid Build Coastguard Worker 
7964*387f9dfdSAndroid Build Coastguard Worker namespace Detail {
7965*387f9dfdSAndroid Build Coastguard Worker 
7966*387f9dfdSAndroid Build Coastguard Worker     const std::string unprintableString = "{?}";
7967*387f9dfdSAndroid Build Coastguard Worker 
7968*387f9dfdSAndroid Build Coastguard Worker     namespace {
7969*387f9dfdSAndroid Build Coastguard Worker         const int hexThreshold = 255;
7970*387f9dfdSAndroid Build Coastguard Worker 
7971*387f9dfdSAndroid Build Coastguard Worker         struct Endianness {
7972*387f9dfdSAndroid Build Coastguard Worker             enum Arch { Big, Little };
7973*387f9dfdSAndroid Build Coastguard Worker 
whichCatch::Detail::__anoncead9d0e0811::Endianness7974*387f9dfdSAndroid Build Coastguard Worker             static Arch which() {
7975*387f9dfdSAndroid Build Coastguard Worker                 union _{
7976*387f9dfdSAndroid Build Coastguard Worker                     int asInt;
7977*387f9dfdSAndroid Build Coastguard Worker                     char asChar[sizeof (int)];
7978*387f9dfdSAndroid Build Coastguard Worker                 } u;
7979*387f9dfdSAndroid Build Coastguard Worker 
7980*387f9dfdSAndroid Build Coastguard Worker                 u.asInt = 1;
7981*387f9dfdSAndroid Build Coastguard Worker                 return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;
7982*387f9dfdSAndroid Build Coastguard Worker             }
7983*387f9dfdSAndroid Build Coastguard Worker         };
7984*387f9dfdSAndroid Build Coastguard Worker     }
7985*387f9dfdSAndroid Build Coastguard Worker 
rawMemoryToString(const void * object,std::size_t size)7986*387f9dfdSAndroid Build Coastguard Worker     std::string rawMemoryToString( const void *object, std::size_t size )
7987*387f9dfdSAndroid Build Coastguard Worker     {
7988*387f9dfdSAndroid Build Coastguard Worker         // Reverse order for little endian architectures
7989*387f9dfdSAndroid Build Coastguard Worker         int i = 0, end = static_cast<int>( size ), inc = 1;
7990*387f9dfdSAndroid Build Coastguard Worker         if( Endianness::which() == Endianness::Little ) {
7991*387f9dfdSAndroid Build Coastguard Worker             i = end-1;
7992*387f9dfdSAndroid Build Coastguard Worker             end = inc = -1;
7993*387f9dfdSAndroid Build Coastguard Worker         }
7994*387f9dfdSAndroid Build Coastguard Worker 
7995*387f9dfdSAndroid Build Coastguard Worker         unsigned char const *bytes = static_cast<unsigned char const *>(object);
7996*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream os;
7997*387f9dfdSAndroid Build Coastguard Worker         os << "0x" << std::setfill('0') << std::hex;
7998*387f9dfdSAndroid Build Coastguard Worker         for( ; i != end; i += inc )
7999*387f9dfdSAndroid Build Coastguard Worker              os << std::setw(2) << static_cast<unsigned>(bytes[i]);
8000*387f9dfdSAndroid Build Coastguard Worker        return os.str();
8001*387f9dfdSAndroid Build Coastguard Worker     }
8002*387f9dfdSAndroid Build Coastguard Worker }
8003*387f9dfdSAndroid Build Coastguard Worker 
toString(std::string const & value)8004*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::string const& value ) {
8005*387f9dfdSAndroid Build Coastguard Worker     std::string s = value;
8006*387f9dfdSAndroid Build Coastguard Worker     if( getCurrentContext().getConfig()->showInvisibles() ) {
8007*387f9dfdSAndroid Build Coastguard Worker         for(size_t i = 0; i < s.size(); ++i ) {
8008*387f9dfdSAndroid Build Coastguard Worker             std::string subs;
8009*387f9dfdSAndroid Build Coastguard Worker             switch( s[i] ) {
8010*387f9dfdSAndroid Build Coastguard Worker             case '\n': subs = "\\n"; break;
8011*387f9dfdSAndroid Build Coastguard Worker             case '\t': subs = "\\t"; break;
8012*387f9dfdSAndroid Build Coastguard Worker             default: break;
8013*387f9dfdSAndroid Build Coastguard Worker             }
8014*387f9dfdSAndroid Build Coastguard Worker             if( !subs.empty() ) {
8015*387f9dfdSAndroid Build Coastguard Worker                 s = s.substr( 0, i ) + subs + s.substr( i+1 );
8016*387f9dfdSAndroid Build Coastguard Worker                 ++i;
8017*387f9dfdSAndroid Build Coastguard Worker             }
8018*387f9dfdSAndroid Build Coastguard Worker         }
8019*387f9dfdSAndroid Build Coastguard Worker     }
8020*387f9dfdSAndroid Build Coastguard Worker     return "\"" + s + "\"";
8021*387f9dfdSAndroid Build Coastguard Worker }
toString(std::wstring const & value)8022*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::wstring const& value ) {
8023*387f9dfdSAndroid Build Coastguard Worker 
8024*387f9dfdSAndroid Build Coastguard Worker     std::string s;
8025*387f9dfdSAndroid Build Coastguard Worker     s.reserve( value.size() );
8026*387f9dfdSAndroid Build Coastguard Worker     for(size_t i = 0; i < value.size(); ++i )
8027*387f9dfdSAndroid Build Coastguard Worker         s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?';
8028*387f9dfdSAndroid Build Coastguard Worker     return Catch::toString( s );
8029*387f9dfdSAndroid Build Coastguard Worker }
8030*387f9dfdSAndroid Build Coastguard Worker 
toString(const char * const value)8031*387f9dfdSAndroid Build Coastguard Worker std::string toString( const char* const value ) {
8032*387f9dfdSAndroid Build Coastguard Worker     return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
8033*387f9dfdSAndroid Build Coastguard Worker }
8034*387f9dfdSAndroid Build Coastguard Worker 
toString(char * const value)8035*387f9dfdSAndroid Build Coastguard Worker std::string toString( char* const value ) {
8036*387f9dfdSAndroid Build Coastguard Worker     return Catch::toString( static_cast<const char*>( value ) );
8037*387f9dfdSAndroid Build Coastguard Worker }
8038*387f9dfdSAndroid Build Coastguard Worker 
toString(const wchar_t * const value)8039*387f9dfdSAndroid Build Coastguard Worker std::string toString( const wchar_t* const value )
8040*387f9dfdSAndroid Build Coastguard Worker {
8041*387f9dfdSAndroid Build Coastguard Worker 	return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" );
8042*387f9dfdSAndroid Build Coastguard Worker }
8043*387f9dfdSAndroid Build Coastguard Worker 
toString(wchar_t * const value)8044*387f9dfdSAndroid Build Coastguard Worker std::string toString( wchar_t* const value )
8045*387f9dfdSAndroid Build Coastguard Worker {
8046*387f9dfdSAndroid Build Coastguard Worker 	return Catch::toString( static_cast<const wchar_t*>( value ) );
8047*387f9dfdSAndroid Build Coastguard Worker }
8048*387f9dfdSAndroid Build Coastguard Worker 
toString(int value)8049*387f9dfdSAndroid Build Coastguard Worker std::string toString( int value ) {
8050*387f9dfdSAndroid Build Coastguard Worker     std::ostringstream oss;
8051*387f9dfdSAndroid Build Coastguard Worker     oss << value;
8052*387f9dfdSAndroid Build Coastguard Worker     if( value > Detail::hexThreshold )
8053*387f9dfdSAndroid Build Coastguard Worker         oss << " (0x" << std::hex << value << ")";
8054*387f9dfdSAndroid Build Coastguard Worker     return oss.str();
8055*387f9dfdSAndroid Build Coastguard Worker }
8056*387f9dfdSAndroid Build Coastguard Worker 
toString(unsigned long value)8057*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned long value ) {
8058*387f9dfdSAndroid Build Coastguard Worker     std::ostringstream oss;
8059*387f9dfdSAndroid Build Coastguard Worker     oss << value;
8060*387f9dfdSAndroid Build Coastguard Worker     if( value > Detail::hexThreshold )
8061*387f9dfdSAndroid Build Coastguard Worker         oss << " (0x" << std::hex << value << ")";
8062*387f9dfdSAndroid Build Coastguard Worker     return oss.str();
8063*387f9dfdSAndroid Build Coastguard Worker }
8064*387f9dfdSAndroid Build Coastguard Worker 
toString(unsigned int value)8065*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned int value ) {
8066*387f9dfdSAndroid Build Coastguard Worker     return Catch::toString( static_cast<unsigned long>( value ) );
8067*387f9dfdSAndroid Build Coastguard Worker }
8068*387f9dfdSAndroid Build Coastguard Worker 
8069*387f9dfdSAndroid Build Coastguard Worker template<typename T>
fpToString(T value,int precision)8070*387f9dfdSAndroid Build Coastguard Worker std::string fpToString( T value, int precision ) {
8071*387f9dfdSAndroid Build Coastguard Worker     std::ostringstream oss;
8072*387f9dfdSAndroid Build Coastguard Worker     oss << std::setprecision( precision )
8073*387f9dfdSAndroid Build Coastguard Worker         << std::fixed
8074*387f9dfdSAndroid Build Coastguard Worker         << value;
8075*387f9dfdSAndroid Build Coastguard Worker     std::string d = oss.str();
8076*387f9dfdSAndroid Build Coastguard Worker     std::size_t i = d.find_last_not_of( '0' );
8077*387f9dfdSAndroid Build Coastguard Worker     if( i != std::string::npos && i != d.size()-1 ) {
8078*387f9dfdSAndroid Build Coastguard Worker         if( d[i] == '.' )
8079*387f9dfdSAndroid Build Coastguard Worker             i++;
8080*387f9dfdSAndroid Build Coastguard Worker         d = d.substr( 0, i+1 );
8081*387f9dfdSAndroid Build Coastguard Worker     }
8082*387f9dfdSAndroid Build Coastguard Worker     return d;
8083*387f9dfdSAndroid Build Coastguard Worker }
8084*387f9dfdSAndroid Build Coastguard Worker 
toString(const double value)8085*387f9dfdSAndroid Build Coastguard Worker std::string toString( const double value ) {
8086*387f9dfdSAndroid Build Coastguard Worker     return fpToString( value, 10 );
8087*387f9dfdSAndroid Build Coastguard Worker }
toString(const float value)8088*387f9dfdSAndroid Build Coastguard Worker std::string toString( const float value ) {
8089*387f9dfdSAndroid Build Coastguard Worker     return fpToString( value, 5 ) + "f";
8090*387f9dfdSAndroid Build Coastguard Worker }
8091*387f9dfdSAndroid Build Coastguard Worker 
toString(bool value)8092*387f9dfdSAndroid Build Coastguard Worker std::string toString( bool value ) {
8093*387f9dfdSAndroid Build Coastguard Worker     return value ? "true" : "false";
8094*387f9dfdSAndroid Build Coastguard Worker }
8095*387f9dfdSAndroid Build Coastguard Worker 
toString(char value)8096*387f9dfdSAndroid Build Coastguard Worker std::string toString( char value ) {
8097*387f9dfdSAndroid Build Coastguard Worker     return value < ' '
8098*387f9dfdSAndroid Build Coastguard Worker         ? toString( static_cast<unsigned int>( value ) )
8099*387f9dfdSAndroid Build Coastguard Worker         : Detail::makeString( value );
8100*387f9dfdSAndroid Build Coastguard Worker }
8101*387f9dfdSAndroid Build Coastguard Worker 
toString(signed char value)8102*387f9dfdSAndroid Build Coastguard Worker std::string toString( signed char value ) {
8103*387f9dfdSAndroid Build Coastguard Worker     return toString( static_cast<char>( value ) );
8104*387f9dfdSAndroid Build Coastguard Worker }
8105*387f9dfdSAndroid Build Coastguard Worker 
toString(unsigned char value)8106*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned char value ) {
8107*387f9dfdSAndroid Build Coastguard Worker     return toString( static_cast<char>( value ) );
8108*387f9dfdSAndroid Build Coastguard Worker }
8109*387f9dfdSAndroid Build Coastguard Worker 
8110*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_LONG_LONG
toString(long long value)8111*387f9dfdSAndroid Build Coastguard Worker std::string toString( long long value ) {
8112*387f9dfdSAndroid Build Coastguard Worker     std::ostringstream oss;
8113*387f9dfdSAndroid Build Coastguard Worker     oss << value;
8114*387f9dfdSAndroid Build Coastguard Worker     if( value > Detail::hexThreshold )
8115*387f9dfdSAndroid Build Coastguard Worker         oss << " (0x" << std::hex << value << ")";
8116*387f9dfdSAndroid Build Coastguard Worker     return oss.str();
8117*387f9dfdSAndroid Build Coastguard Worker }
toString(unsigned long long value)8118*387f9dfdSAndroid Build Coastguard Worker std::string toString( unsigned long long value ) {
8119*387f9dfdSAndroid Build Coastguard Worker     std::ostringstream oss;
8120*387f9dfdSAndroid Build Coastguard Worker     oss << value;
8121*387f9dfdSAndroid Build Coastguard Worker     if( value > Detail::hexThreshold )
8122*387f9dfdSAndroid Build Coastguard Worker         oss << " (0x" << std::hex << value << ")";
8123*387f9dfdSAndroid Build Coastguard Worker     return oss.str();
8124*387f9dfdSAndroid Build Coastguard Worker }
8125*387f9dfdSAndroid Build Coastguard Worker #endif
8126*387f9dfdSAndroid Build Coastguard Worker 
8127*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_CPP11_NULLPTR
toString(std::nullptr_t)8128*387f9dfdSAndroid Build Coastguard Worker std::string toString( std::nullptr_t ) {
8129*387f9dfdSAndroid Build Coastguard Worker     return "nullptr";
8130*387f9dfdSAndroid Build Coastguard Worker }
8131*387f9dfdSAndroid Build Coastguard Worker #endif
8132*387f9dfdSAndroid Build Coastguard Worker 
8133*387f9dfdSAndroid Build Coastguard Worker #ifdef __OBJC__
toString(NSString const * const & nsstring)8134*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSString const * const& nsstring ) {
8135*387f9dfdSAndroid Build Coastguard Worker         if( !nsstring )
8136*387f9dfdSAndroid Build Coastguard Worker             return "nil";
8137*387f9dfdSAndroid Build Coastguard Worker         return "@" + toString([nsstring UTF8String]);
8138*387f9dfdSAndroid Build Coastguard Worker     }
toString(NSString * CATCH_ARC_STRONG const & nsstring)8139*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
8140*387f9dfdSAndroid Build Coastguard Worker         if( !nsstring )
8141*387f9dfdSAndroid Build Coastguard Worker             return "nil";
8142*387f9dfdSAndroid Build Coastguard Worker         return "@" + toString([nsstring UTF8String]);
8143*387f9dfdSAndroid Build Coastguard Worker     }
toString(NSObject * const & nsObject)8144*387f9dfdSAndroid Build Coastguard Worker     std::string toString( NSObject* const& nsObject ) {
8145*387f9dfdSAndroid Build Coastguard Worker         return toString( [nsObject description] );
8146*387f9dfdSAndroid Build Coastguard Worker     }
8147*387f9dfdSAndroid Build Coastguard Worker #endif
8148*387f9dfdSAndroid Build Coastguard Worker 
8149*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8150*387f9dfdSAndroid Build Coastguard Worker 
8151*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_result_builder.hpp
8152*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED
8153*387f9dfdSAndroid Build Coastguard Worker 
8154*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8155*387f9dfdSAndroid Build Coastguard Worker 
capturedExpressionWithSecondArgument(std::string const & capturedExpression,std::string const & secondArg)8156*387f9dfdSAndroid Build Coastguard Worker     std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) {
8157*387f9dfdSAndroid Build Coastguard Worker         return secondArg.empty() || secondArg == "\"\""
8158*387f9dfdSAndroid Build Coastguard Worker             ? capturedExpression
8159*387f9dfdSAndroid Build Coastguard Worker             : capturedExpression + ", " + secondArg;
8160*387f9dfdSAndroid Build Coastguard Worker     }
ResultBuilder(char const * macroName,SourceLineInfo const & lineInfo,char const * capturedExpression,ResultDisposition::Flags resultDisposition,char const * secondArg)8161*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder::ResultBuilder(   char const* macroName,
8162*387f9dfdSAndroid Build Coastguard Worker                                     SourceLineInfo const& lineInfo,
8163*387f9dfdSAndroid Build Coastguard Worker                                     char const* capturedExpression,
8164*387f9dfdSAndroid Build Coastguard Worker                                     ResultDisposition::Flags resultDisposition,
8165*387f9dfdSAndroid Build Coastguard Worker                                     char const* secondArg )
8166*387f9dfdSAndroid Build Coastguard Worker     :   m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ),
8167*387f9dfdSAndroid Build Coastguard Worker         m_shouldDebugBreak( false ),
8168*387f9dfdSAndroid Build Coastguard Worker         m_shouldThrow( false )
8169*387f9dfdSAndroid Build Coastguard Worker     {}
8170*387f9dfdSAndroid Build Coastguard Worker 
setResultType(ResultWas::OfType result)8171*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) {
8172*387f9dfdSAndroid Build Coastguard Worker         m_data.resultType = result;
8173*387f9dfdSAndroid Build Coastguard Worker         return *this;
8174*387f9dfdSAndroid Build Coastguard Worker     }
setResultType(bool result)8175*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& ResultBuilder::setResultType( bool result ) {
8176*387f9dfdSAndroid Build Coastguard Worker         m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;
8177*387f9dfdSAndroid Build Coastguard Worker         return *this;
8178*387f9dfdSAndroid Build Coastguard Worker     }
setLhs(std::string const & lhs)8179*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) {
8180*387f9dfdSAndroid Build Coastguard Worker         m_exprComponents.lhs = lhs;
8181*387f9dfdSAndroid Build Coastguard Worker         return *this;
8182*387f9dfdSAndroid Build Coastguard Worker     }
setRhs(std::string const & rhs)8183*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) {
8184*387f9dfdSAndroid Build Coastguard Worker         m_exprComponents.rhs = rhs;
8185*387f9dfdSAndroid Build Coastguard Worker         return *this;
8186*387f9dfdSAndroid Build Coastguard Worker     }
setOp(std::string const & op)8187*387f9dfdSAndroid Build Coastguard Worker     ResultBuilder& ResultBuilder::setOp( std::string const& op ) {
8188*387f9dfdSAndroid Build Coastguard Worker         m_exprComponents.op = op;
8189*387f9dfdSAndroid Build Coastguard Worker         return *this;
8190*387f9dfdSAndroid Build Coastguard Worker     }
8191*387f9dfdSAndroid Build Coastguard Worker 
endExpression()8192*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::endExpression() {
8193*387f9dfdSAndroid Build Coastguard Worker         m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition );
8194*387f9dfdSAndroid Build Coastguard Worker         captureExpression();
8195*387f9dfdSAndroid Build Coastguard Worker     }
8196*387f9dfdSAndroid Build Coastguard Worker 
useActiveException(ResultDisposition::Flags resultDisposition)8197*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
8198*387f9dfdSAndroid Build Coastguard Worker         m_assertionInfo.resultDisposition = resultDisposition;
8199*387f9dfdSAndroid Build Coastguard Worker         m_stream.oss << Catch::translateActiveException();
8200*387f9dfdSAndroid Build Coastguard Worker         captureResult( ResultWas::ThrewException );
8201*387f9dfdSAndroid Build Coastguard Worker     }
8202*387f9dfdSAndroid Build Coastguard Worker 
captureResult(ResultWas::OfType resultType)8203*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::captureResult( ResultWas::OfType resultType ) {
8204*387f9dfdSAndroid Build Coastguard Worker         setResultType( resultType );
8205*387f9dfdSAndroid Build Coastguard Worker         captureExpression();
8206*387f9dfdSAndroid Build Coastguard Worker     }
captureExpectedException(std::string const & expectedMessage)8207*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) {
8208*387f9dfdSAndroid Build Coastguard Worker         if( expectedMessage.empty() )
8209*387f9dfdSAndroid Build Coastguard Worker             captureExpectedException( Matchers::Impl::Generic::AllOf<std::string>() );
8210*387f9dfdSAndroid Build Coastguard Worker         else
8211*387f9dfdSAndroid Build Coastguard Worker             captureExpectedException( Matchers::Equals( expectedMessage ) );
8212*387f9dfdSAndroid Build Coastguard Worker     }
8213*387f9dfdSAndroid Build Coastguard Worker 
captureExpectedException(Matchers::Impl::Matcher<std::string> const & matcher)8214*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::captureExpectedException( Matchers::Impl::Matcher<std::string> const& matcher ) {
8215*387f9dfdSAndroid Build Coastguard Worker 
8216*387f9dfdSAndroid Build Coastguard Worker         assert( m_exprComponents.testFalse == false );
8217*387f9dfdSAndroid Build Coastguard Worker         AssertionResultData data = m_data;
8218*387f9dfdSAndroid Build Coastguard Worker         data.resultType = ResultWas::Ok;
8219*387f9dfdSAndroid Build Coastguard Worker         data.reconstructedExpression = m_assertionInfo.capturedExpression;
8220*387f9dfdSAndroid Build Coastguard Worker 
8221*387f9dfdSAndroid Build Coastguard Worker         std::string actualMessage = Catch::translateActiveException();
8222*387f9dfdSAndroid Build Coastguard Worker         if( !matcher.match( actualMessage ) ) {
8223*387f9dfdSAndroid Build Coastguard Worker             data.resultType = ResultWas::ExpressionFailed;
8224*387f9dfdSAndroid Build Coastguard Worker             data.reconstructedExpression = actualMessage;
8225*387f9dfdSAndroid Build Coastguard Worker         }
8226*387f9dfdSAndroid Build Coastguard Worker         AssertionResult result( m_assertionInfo, data );
8227*387f9dfdSAndroid Build Coastguard Worker         handleResult( result );
8228*387f9dfdSAndroid Build Coastguard Worker     }
8229*387f9dfdSAndroid Build Coastguard Worker 
captureExpression()8230*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::captureExpression() {
8231*387f9dfdSAndroid Build Coastguard Worker         AssertionResult result = build();
8232*387f9dfdSAndroid Build Coastguard Worker         handleResult( result );
8233*387f9dfdSAndroid Build Coastguard Worker     }
handleResult(AssertionResult const & result)8234*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::handleResult( AssertionResult const& result )
8235*387f9dfdSAndroid Build Coastguard Worker     {
8236*387f9dfdSAndroid Build Coastguard Worker         getResultCapture().assertionEnded( result );
8237*387f9dfdSAndroid Build Coastguard Worker 
8238*387f9dfdSAndroid Build Coastguard Worker         if( !result.isOk() ) {
8239*387f9dfdSAndroid Build Coastguard Worker             if( getCurrentContext().getConfig()->shouldDebugBreak() )
8240*387f9dfdSAndroid Build Coastguard Worker                 m_shouldDebugBreak = true;
8241*387f9dfdSAndroid Build Coastguard Worker             if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) )
8242*387f9dfdSAndroid Build Coastguard Worker                 m_shouldThrow = true;
8243*387f9dfdSAndroid Build Coastguard Worker         }
8244*387f9dfdSAndroid Build Coastguard Worker     }
react()8245*387f9dfdSAndroid Build Coastguard Worker     void ResultBuilder::react() {
8246*387f9dfdSAndroid Build Coastguard Worker         if( m_shouldThrow )
8247*387f9dfdSAndroid Build Coastguard Worker             throw Catch::TestFailureException();
8248*387f9dfdSAndroid Build Coastguard Worker     }
8249*387f9dfdSAndroid Build Coastguard Worker 
shouldDebugBreak() const8250*387f9dfdSAndroid Build Coastguard Worker     bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; }
allowThrows() const8251*387f9dfdSAndroid Build Coastguard Worker     bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); }
8252*387f9dfdSAndroid Build Coastguard Worker 
build() const8253*387f9dfdSAndroid Build Coastguard Worker     AssertionResult ResultBuilder::build() const
8254*387f9dfdSAndroid Build Coastguard Worker     {
8255*387f9dfdSAndroid Build Coastguard Worker         assert( m_data.resultType != ResultWas::Unknown );
8256*387f9dfdSAndroid Build Coastguard Worker 
8257*387f9dfdSAndroid Build Coastguard Worker         AssertionResultData data = m_data;
8258*387f9dfdSAndroid Build Coastguard Worker 
8259*387f9dfdSAndroid Build Coastguard Worker         // Flip bool results if testFalse is set
8260*387f9dfdSAndroid Build Coastguard Worker         if( m_exprComponents.testFalse ) {
8261*387f9dfdSAndroid Build Coastguard Worker             if( data.resultType == ResultWas::Ok )
8262*387f9dfdSAndroid Build Coastguard Worker                 data.resultType = ResultWas::ExpressionFailed;
8263*387f9dfdSAndroid Build Coastguard Worker             else if( data.resultType == ResultWas::ExpressionFailed )
8264*387f9dfdSAndroid Build Coastguard Worker                 data.resultType = ResultWas::Ok;
8265*387f9dfdSAndroid Build Coastguard Worker         }
8266*387f9dfdSAndroid Build Coastguard Worker 
8267*387f9dfdSAndroid Build Coastguard Worker         data.message = m_stream.oss.str();
8268*387f9dfdSAndroid Build Coastguard Worker         data.reconstructedExpression = reconstructExpression();
8269*387f9dfdSAndroid Build Coastguard Worker         if( m_exprComponents.testFalse ) {
8270*387f9dfdSAndroid Build Coastguard Worker             if( m_exprComponents.op == "" )
8271*387f9dfdSAndroid Build Coastguard Worker                 data.reconstructedExpression = "!" + data.reconstructedExpression;
8272*387f9dfdSAndroid Build Coastguard Worker             else
8273*387f9dfdSAndroid Build Coastguard Worker                 data.reconstructedExpression = "!(" + data.reconstructedExpression + ")";
8274*387f9dfdSAndroid Build Coastguard Worker         }
8275*387f9dfdSAndroid Build Coastguard Worker         return AssertionResult( m_assertionInfo, data );
8276*387f9dfdSAndroid Build Coastguard Worker     }
reconstructExpression() const8277*387f9dfdSAndroid Build Coastguard Worker     std::string ResultBuilder::reconstructExpression() const {
8278*387f9dfdSAndroid Build Coastguard Worker         if( m_exprComponents.op == "" )
8279*387f9dfdSAndroid Build Coastguard Worker             return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
8280*387f9dfdSAndroid Build Coastguard Worker         else if( m_exprComponents.op == "matches" )
8281*387f9dfdSAndroid Build Coastguard Worker             return m_exprComponents.lhs + " " + m_exprComponents.rhs;
8282*387f9dfdSAndroid Build Coastguard Worker         else if( m_exprComponents.op != "!" ) {
8283*387f9dfdSAndroid Build Coastguard Worker             if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 &&
8284*387f9dfdSAndroid Build Coastguard Worker                 m_exprComponents.lhs.find("\n") == std::string::npos &&
8285*387f9dfdSAndroid Build Coastguard Worker                 m_exprComponents.rhs.find("\n") == std::string::npos )
8286*387f9dfdSAndroid Build Coastguard Worker                 return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
8287*387f9dfdSAndroid Build Coastguard Worker             else
8288*387f9dfdSAndroid Build Coastguard Worker                 return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs;
8289*387f9dfdSAndroid Build Coastguard Worker         }
8290*387f9dfdSAndroid Build Coastguard Worker         else
8291*387f9dfdSAndroid Build Coastguard Worker             return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}";
8292*387f9dfdSAndroid Build Coastguard Worker     }
8293*387f9dfdSAndroid Build Coastguard Worker 
8294*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8295*387f9dfdSAndroid Build Coastguard Worker 
8296*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_tag_alias_registry.hpp
8297*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED
8298*387f9dfdSAndroid Build Coastguard Worker 
8299*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_tag_alias_registry.h
8300*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED
8301*387f9dfdSAndroid Build Coastguard Worker 
8302*387f9dfdSAndroid Build Coastguard Worker #include <map>
8303*387f9dfdSAndroid Build Coastguard Worker 
8304*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8305*387f9dfdSAndroid Build Coastguard Worker 
8306*387f9dfdSAndroid Build Coastguard Worker     class TagAliasRegistry : public ITagAliasRegistry {
8307*387f9dfdSAndroid Build Coastguard Worker     public:
8308*387f9dfdSAndroid Build Coastguard Worker         virtual ~TagAliasRegistry();
8309*387f9dfdSAndroid Build Coastguard Worker         virtual Option<TagAlias> find( std::string const& alias ) const;
8310*387f9dfdSAndroid Build Coastguard Worker         virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const;
8311*387f9dfdSAndroid Build Coastguard Worker         void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
8312*387f9dfdSAndroid Build Coastguard Worker         static TagAliasRegistry& get();
8313*387f9dfdSAndroid Build Coastguard Worker 
8314*387f9dfdSAndroid Build Coastguard Worker     private:
8315*387f9dfdSAndroid Build Coastguard Worker         std::map<std::string, TagAlias> m_registry;
8316*387f9dfdSAndroid Build Coastguard Worker     };
8317*387f9dfdSAndroid Build Coastguard Worker 
8318*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8319*387f9dfdSAndroid Build Coastguard Worker 
8320*387f9dfdSAndroid Build Coastguard Worker #include <map>
8321*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
8322*387f9dfdSAndroid Build Coastguard Worker 
8323*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8324*387f9dfdSAndroid Build Coastguard Worker 
~TagAliasRegistry()8325*387f9dfdSAndroid Build Coastguard Worker     TagAliasRegistry::~TagAliasRegistry() {}
8326*387f9dfdSAndroid Build Coastguard Worker 
find(std::string const & alias) const8327*387f9dfdSAndroid Build Coastguard Worker     Option<TagAlias> TagAliasRegistry::find( std::string const& alias ) const {
8328*387f9dfdSAndroid Build Coastguard Worker         std::map<std::string, TagAlias>::const_iterator it = m_registry.find( alias );
8329*387f9dfdSAndroid Build Coastguard Worker         if( it != m_registry.end() )
8330*387f9dfdSAndroid Build Coastguard Worker             return it->second;
8331*387f9dfdSAndroid Build Coastguard Worker         else
8332*387f9dfdSAndroid Build Coastguard Worker             return Option<TagAlias>();
8333*387f9dfdSAndroid Build Coastguard Worker     }
8334*387f9dfdSAndroid Build Coastguard Worker 
expandAliases(std::string const & unexpandedTestSpec) const8335*387f9dfdSAndroid Build Coastguard Worker     std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {
8336*387f9dfdSAndroid Build Coastguard Worker         std::string expandedTestSpec = unexpandedTestSpec;
8337*387f9dfdSAndroid Build Coastguard Worker         for( std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end();
8338*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8339*387f9dfdSAndroid Build Coastguard Worker                 ++it ) {
8340*387f9dfdSAndroid Build Coastguard Worker             std::size_t pos = expandedTestSpec.find( it->first );
8341*387f9dfdSAndroid Build Coastguard Worker             if( pos != std::string::npos ) {
8342*387f9dfdSAndroid Build Coastguard Worker                 expandedTestSpec =  expandedTestSpec.substr( 0, pos ) +
8343*387f9dfdSAndroid Build Coastguard Worker                                     it->second.tag +
8344*387f9dfdSAndroid Build Coastguard Worker                                     expandedTestSpec.substr( pos + it->first.size() );
8345*387f9dfdSAndroid Build Coastguard Worker             }
8346*387f9dfdSAndroid Build Coastguard Worker         }
8347*387f9dfdSAndroid Build Coastguard Worker         return expandedTestSpec;
8348*387f9dfdSAndroid Build Coastguard Worker     }
8349*387f9dfdSAndroid Build Coastguard Worker 
add(char const * alias,char const * tag,SourceLineInfo const & lineInfo)8350*387f9dfdSAndroid Build Coastguard Worker     void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {
8351*387f9dfdSAndroid Build Coastguard Worker 
8352*387f9dfdSAndroid Build Coastguard Worker         if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) {
8353*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
8354*387f9dfdSAndroid Build Coastguard Worker             oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo;
8355*387f9dfdSAndroid Build Coastguard Worker             throw std::domain_error( oss.str().c_str() );
8356*387f9dfdSAndroid Build Coastguard Worker         }
8357*387f9dfdSAndroid Build Coastguard Worker         if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) {
8358*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
8359*387f9dfdSAndroid Build Coastguard Worker             oss << "error: tag alias, \"" << alias << "\" already registered.\n"
8360*387f9dfdSAndroid Build Coastguard Worker                 << "\tFirst seen at " << find(alias)->lineInfo << "\n"
8361*387f9dfdSAndroid Build Coastguard Worker                 << "\tRedefined at " << lineInfo;
8362*387f9dfdSAndroid Build Coastguard Worker             throw std::domain_error( oss.str().c_str() );
8363*387f9dfdSAndroid Build Coastguard Worker         }
8364*387f9dfdSAndroid Build Coastguard Worker     }
8365*387f9dfdSAndroid Build Coastguard Worker 
get()8366*387f9dfdSAndroid Build Coastguard Worker     TagAliasRegistry& TagAliasRegistry::get() {
8367*387f9dfdSAndroid Build Coastguard Worker         static TagAliasRegistry instance;
8368*387f9dfdSAndroid Build Coastguard Worker         return instance;
8369*387f9dfdSAndroid Build Coastguard Worker 
8370*387f9dfdSAndroid Build Coastguard Worker     }
8371*387f9dfdSAndroid Build Coastguard Worker 
~ITagAliasRegistry()8372*387f9dfdSAndroid Build Coastguard Worker     ITagAliasRegistry::~ITagAliasRegistry() {}
get()8373*387f9dfdSAndroid Build Coastguard Worker     ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); }
8374*387f9dfdSAndroid Build Coastguard Worker 
RegistrarForTagAliases(char const * alias,char const * tag,SourceLineInfo const & lineInfo)8375*387f9dfdSAndroid Build Coastguard Worker     RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {
8376*387f9dfdSAndroid Build Coastguard Worker         try {
8377*387f9dfdSAndroid Build Coastguard Worker             TagAliasRegistry::get().add( alias, tag, lineInfo );
8378*387f9dfdSAndroid Build Coastguard Worker         }
8379*387f9dfdSAndroid Build Coastguard Worker         catch( std::exception& ex ) {
8380*387f9dfdSAndroid Build Coastguard Worker             Colour colourGuard( Colour::Red );
8381*387f9dfdSAndroid Build Coastguard Worker             Catch::cerr() << ex.what() << std::endl;
8382*387f9dfdSAndroid Build Coastguard Worker             exit(1);
8383*387f9dfdSAndroid Build Coastguard Worker         }
8384*387f9dfdSAndroid Build Coastguard Worker     }
8385*387f9dfdSAndroid Build Coastguard Worker 
8386*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8387*387f9dfdSAndroid Build Coastguard Worker 
8388*387f9dfdSAndroid Build Coastguard Worker // #included from: ../reporters/catch_reporter_multi.hpp
8389*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED
8390*387f9dfdSAndroid Build Coastguard Worker 
8391*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8392*387f9dfdSAndroid Build Coastguard Worker 
8393*387f9dfdSAndroid Build Coastguard Worker class MultipleReporters : public SharedImpl<IStreamingReporter> {
8394*387f9dfdSAndroid Build Coastguard Worker     typedef std::vector<Ptr<IStreamingReporter> > Reporters;
8395*387f9dfdSAndroid Build Coastguard Worker     Reporters m_reporters;
8396*387f9dfdSAndroid Build Coastguard Worker 
8397*387f9dfdSAndroid Build Coastguard Worker public:
add(Ptr<IStreamingReporter> const & reporter)8398*387f9dfdSAndroid Build Coastguard Worker     void add( Ptr<IStreamingReporter> const& reporter ) {
8399*387f9dfdSAndroid Build Coastguard Worker         m_reporters.push_back( reporter );
8400*387f9dfdSAndroid Build Coastguard Worker     }
8401*387f9dfdSAndroid Build Coastguard Worker 
8402*387f9dfdSAndroid Build Coastguard Worker public: // IStreamingReporter
8403*387f9dfdSAndroid Build Coastguard Worker 
getPreferences() const8404*387f9dfdSAndroid Build Coastguard Worker     virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
8405*387f9dfdSAndroid Build Coastguard Worker         return m_reporters[0]->getPreferences();
8406*387f9dfdSAndroid Build Coastguard Worker     }
8407*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCases(std::string const & spec)8408*387f9dfdSAndroid Build Coastguard Worker     virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {
8409*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8410*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8411*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8412*387f9dfdSAndroid Build Coastguard Worker             (*it)->noMatchingTestCases( spec );
8413*387f9dfdSAndroid Build Coastguard Worker     }
8414*387f9dfdSAndroid Build Coastguard Worker 
testRunStarting(TestRunInfo const & testRunInfo)8415*387f9dfdSAndroid Build Coastguard Worker     virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE {
8416*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8417*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8418*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8419*387f9dfdSAndroid Build Coastguard Worker             (*it)->testRunStarting( testRunInfo );
8420*387f9dfdSAndroid Build Coastguard Worker     }
8421*387f9dfdSAndroid Build Coastguard Worker 
testGroupStarting(GroupInfo const & groupInfo)8422*387f9dfdSAndroid Build Coastguard Worker     virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
8423*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8424*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8425*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8426*387f9dfdSAndroid Build Coastguard Worker             (*it)->testGroupStarting( groupInfo );
8427*387f9dfdSAndroid Build Coastguard Worker     }
8428*387f9dfdSAndroid Build Coastguard Worker 
testCaseStarting(TestCaseInfo const & testInfo)8429*387f9dfdSAndroid Build Coastguard Worker     virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
8430*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8431*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8432*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8433*387f9dfdSAndroid Build Coastguard Worker             (*it)->testCaseStarting( testInfo );
8434*387f9dfdSAndroid Build Coastguard Worker     }
8435*387f9dfdSAndroid Build Coastguard Worker 
sectionStarting(SectionInfo const & sectionInfo)8436*387f9dfdSAndroid Build Coastguard Worker     virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
8437*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8438*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8439*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8440*387f9dfdSAndroid Build Coastguard Worker             (*it)->sectionStarting( sectionInfo );
8441*387f9dfdSAndroid Build Coastguard Worker     }
8442*387f9dfdSAndroid Build Coastguard Worker 
assertionStarting(AssertionInfo const & assertionInfo)8443*387f9dfdSAndroid Build Coastguard Worker     virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE {
8444*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8445*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8446*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8447*387f9dfdSAndroid Build Coastguard Worker             (*it)->assertionStarting( assertionInfo );
8448*387f9dfdSAndroid Build Coastguard Worker     }
8449*387f9dfdSAndroid Build Coastguard Worker 
8450*387f9dfdSAndroid Build Coastguard Worker     // The return value indicates if the messages buffer should be cleared:
assertionEnded(AssertionStats const & assertionStats)8451*387f9dfdSAndroid Build Coastguard Worker     virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
8452*387f9dfdSAndroid Build Coastguard Worker         bool clearBuffer = false;
8453*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8454*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8455*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8456*387f9dfdSAndroid Build Coastguard Worker             clearBuffer |= (*it)->assertionEnded( assertionStats );
8457*387f9dfdSAndroid Build Coastguard Worker         return clearBuffer;
8458*387f9dfdSAndroid Build Coastguard Worker     }
8459*387f9dfdSAndroid Build Coastguard Worker 
sectionEnded(SectionStats const & sectionStats)8460*387f9dfdSAndroid Build Coastguard Worker     virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
8461*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8462*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8463*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8464*387f9dfdSAndroid Build Coastguard Worker             (*it)->sectionEnded( sectionStats );
8465*387f9dfdSAndroid Build Coastguard Worker     }
8466*387f9dfdSAndroid Build Coastguard Worker 
testCaseEnded(TestCaseStats const & testCaseStats)8467*387f9dfdSAndroid Build Coastguard Worker     virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
8468*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8469*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8470*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8471*387f9dfdSAndroid Build Coastguard Worker             (*it)->testCaseEnded( testCaseStats );
8472*387f9dfdSAndroid Build Coastguard Worker     }
8473*387f9dfdSAndroid Build Coastguard Worker 
testGroupEnded(TestGroupStats const & testGroupStats)8474*387f9dfdSAndroid Build Coastguard Worker     virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
8475*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8476*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8477*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8478*387f9dfdSAndroid Build Coastguard Worker             (*it)->testGroupEnded( testGroupStats );
8479*387f9dfdSAndroid Build Coastguard Worker     }
8480*387f9dfdSAndroid Build Coastguard Worker 
testRunEnded(TestRunStats const & testRunStats)8481*387f9dfdSAndroid Build Coastguard Worker     virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
8482*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8483*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8484*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8485*387f9dfdSAndroid Build Coastguard Worker             (*it)->testRunEnded( testRunStats );
8486*387f9dfdSAndroid Build Coastguard Worker     }
8487*387f9dfdSAndroid Build Coastguard Worker 
skipTest(TestCaseInfo const & testInfo)8488*387f9dfdSAndroid Build Coastguard Worker     virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
8489*387f9dfdSAndroid Build Coastguard Worker         for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
8490*387f9dfdSAndroid Build Coastguard Worker                 it != itEnd;
8491*387f9dfdSAndroid Build Coastguard Worker                 ++it )
8492*387f9dfdSAndroid Build Coastguard Worker             (*it)->skipTest( testInfo );
8493*387f9dfdSAndroid Build Coastguard Worker     }
8494*387f9dfdSAndroid Build Coastguard Worker };
8495*387f9dfdSAndroid Build Coastguard Worker 
addReporter(Ptr<IStreamingReporter> const & existingReporter,Ptr<IStreamingReporter> const & additionalReporter)8496*387f9dfdSAndroid Build Coastguard Worker Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) {
8497*387f9dfdSAndroid Build Coastguard Worker     Ptr<IStreamingReporter> resultingReporter;
8498*387f9dfdSAndroid Build Coastguard Worker 
8499*387f9dfdSAndroid Build Coastguard Worker     if( existingReporter ) {
8500*387f9dfdSAndroid Build Coastguard Worker         MultipleReporters* multi = dynamic_cast<MultipleReporters*>( existingReporter.get() );
8501*387f9dfdSAndroid Build Coastguard Worker         if( !multi ) {
8502*387f9dfdSAndroid Build Coastguard Worker             multi = new MultipleReporters;
8503*387f9dfdSAndroid Build Coastguard Worker             resultingReporter = Ptr<IStreamingReporter>( multi );
8504*387f9dfdSAndroid Build Coastguard Worker             if( existingReporter )
8505*387f9dfdSAndroid Build Coastguard Worker                 multi->add( existingReporter );
8506*387f9dfdSAndroid Build Coastguard Worker         }
8507*387f9dfdSAndroid Build Coastguard Worker         else
8508*387f9dfdSAndroid Build Coastguard Worker             resultingReporter = existingReporter;
8509*387f9dfdSAndroid Build Coastguard Worker         multi->add( additionalReporter );
8510*387f9dfdSAndroid Build Coastguard Worker     }
8511*387f9dfdSAndroid Build Coastguard Worker     else
8512*387f9dfdSAndroid Build Coastguard Worker         resultingReporter = additionalReporter;
8513*387f9dfdSAndroid Build Coastguard Worker 
8514*387f9dfdSAndroid Build Coastguard Worker     return resultingReporter;
8515*387f9dfdSAndroid Build Coastguard Worker }
8516*387f9dfdSAndroid Build Coastguard Worker 
8517*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8518*387f9dfdSAndroid Build Coastguard Worker 
8519*387f9dfdSAndroid Build Coastguard Worker // #included from: ../reporters/catch_reporter_xml.hpp
8520*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
8521*387f9dfdSAndroid Build Coastguard Worker 
8522*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_reporter_bases.hpp
8523*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
8524*387f9dfdSAndroid Build Coastguard Worker 
8525*387f9dfdSAndroid Build Coastguard Worker #include <cstring>
8526*387f9dfdSAndroid Build Coastguard Worker 
8527*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8528*387f9dfdSAndroid Build Coastguard Worker 
8529*387f9dfdSAndroid Build Coastguard Worker     struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
8530*387f9dfdSAndroid Build Coastguard Worker 
StreamingReporterBaseCatch::StreamingReporterBase8531*387f9dfdSAndroid Build Coastguard Worker         StreamingReporterBase( ReporterConfig const& _config )
8532*387f9dfdSAndroid Build Coastguard Worker         :   m_config( _config.fullConfig() ),
8533*387f9dfdSAndroid Build Coastguard Worker             stream( _config.stream() )
8534*387f9dfdSAndroid Build Coastguard Worker         {
8535*387f9dfdSAndroid Build Coastguard Worker             m_reporterPrefs.shouldRedirectStdOut = false;
8536*387f9dfdSAndroid Build Coastguard Worker         }
8537*387f9dfdSAndroid Build Coastguard Worker 
getPreferencesCatch::StreamingReporterBase8538*387f9dfdSAndroid Build Coastguard Worker         virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
8539*387f9dfdSAndroid Build Coastguard Worker             return m_reporterPrefs;
8540*387f9dfdSAndroid Build Coastguard Worker         }
8541*387f9dfdSAndroid Build Coastguard Worker 
8542*387f9dfdSAndroid Build Coastguard Worker         virtual ~StreamingReporterBase() CATCH_OVERRIDE;
8543*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCasesCatch::StreamingReporterBase8544*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {}
8545*387f9dfdSAndroid Build Coastguard Worker 
testRunStartingCatch::StreamingReporterBase8546*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE {
8547*387f9dfdSAndroid Build Coastguard Worker             currentTestRunInfo = _testRunInfo;
8548*387f9dfdSAndroid Build Coastguard Worker         }
testGroupStartingCatch::StreamingReporterBase8549*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE {
8550*387f9dfdSAndroid Build Coastguard Worker             currentGroupInfo = _groupInfo;
8551*387f9dfdSAndroid Build Coastguard Worker         }
8552*387f9dfdSAndroid Build Coastguard Worker 
testCaseStartingCatch::StreamingReporterBase8553*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE {
8554*387f9dfdSAndroid Build Coastguard Worker             currentTestCaseInfo = _testInfo;
8555*387f9dfdSAndroid Build Coastguard Worker         }
sectionStartingCatch::StreamingReporterBase8556*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {
8557*387f9dfdSAndroid Build Coastguard Worker             m_sectionStack.push_back( _sectionInfo );
8558*387f9dfdSAndroid Build Coastguard Worker         }
8559*387f9dfdSAndroid Build Coastguard Worker 
sectionEndedCatch::StreamingReporterBase8560*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE {
8561*387f9dfdSAndroid Build Coastguard Worker             m_sectionStack.pop_back();
8562*387f9dfdSAndroid Build Coastguard Worker         }
testCaseEndedCatch::StreamingReporterBase8563*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE {
8564*387f9dfdSAndroid Build Coastguard Worker             currentTestCaseInfo.reset();
8565*387f9dfdSAndroid Build Coastguard Worker         }
testGroupEndedCatch::StreamingReporterBase8566*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE {
8567*387f9dfdSAndroid Build Coastguard Worker             currentGroupInfo.reset();
8568*387f9dfdSAndroid Build Coastguard Worker         }
testRunEndedCatch::StreamingReporterBase8569*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE {
8570*387f9dfdSAndroid Build Coastguard Worker             currentTestCaseInfo.reset();
8571*387f9dfdSAndroid Build Coastguard Worker             currentGroupInfo.reset();
8572*387f9dfdSAndroid Build Coastguard Worker             currentTestRunInfo.reset();
8573*387f9dfdSAndroid Build Coastguard Worker         }
8574*387f9dfdSAndroid Build Coastguard Worker 
skipTestCatch::StreamingReporterBase8575*387f9dfdSAndroid Build Coastguard Worker         virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {
8576*387f9dfdSAndroid Build Coastguard Worker             // Don't do anything with this by default.
8577*387f9dfdSAndroid Build Coastguard Worker             // It can optionally be overridden in the derived class.
8578*387f9dfdSAndroid Build Coastguard Worker         }
8579*387f9dfdSAndroid Build Coastguard Worker 
8580*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> m_config;
8581*387f9dfdSAndroid Build Coastguard Worker         std::ostream& stream;
8582*387f9dfdSAndroid Build Coastguard Worker 
8583*387f9dfdSAndroid Build Coastguard Worker         LazyStat<TestRunInfo> currentTestRunInfo;
8584*387f9dfdSAndroid Build Coastguard Worker         LazyStat<GroupInfo> currentGroupInfo;
8585*387f9dfdSAndroid Build Coastguard Worker         LazyStat<TestCaseInfo> currentTestCaseInfo;
8586*387f9dfdSAndroid Build Coastguard Worker 
8587*387f9dfdSAndroid Build Coastguard Worker         std::vector<SectionInfo> m_sectionStack;
8588*387f9dfdSAndroid Build Coastguard Worker         ReporterPreferences m_reporterPrefs;
8589*387f9dfdSAndroid Build Coastguard Worker     };
8590*387f9dfdSAndroid Build Coastguard Worker 
8591*387f9dfdSAndroid Build Coastguard Worker     struct CumulativeReporterBase : SharedImpl<IStreamingReporter> {
8592*387f9dfdSAndroid Build Coastguard Worker         template<typename T, typename ChildNodeT>
8593*387f9dfdSAndroid Build Coastguard Worker         struct Node : SharedImpl<> {
NodeCatch::CumulativeReporterBase::Node8594*387f9dfdSAndroid Build Coastguard Worker             explicit Node( T const& _value ) : value( _value ) {}
~NodeCatch::CumulativeReporterBase::Node8595*387f9dfdSAndroid Build Coastguard Worker             virtual ~Node() {}
8596*387f9dfdSAndroid Build Coastguard Worker 
8597*387f9dfdSAndroid Build Coastguard Worker             typedef std::vector<Ptr<ChildNodeT> > ChildNodes;
8598*387f9dfdSAndroid Build Coastguard Worker             T value;
8599*387f9dfdSAndroid Build Coastguard Worker             ChildNodes children;
8600*387f9dfdSAndroid Build Coastguard Worker         };
8601*387f9dfdSAndroid Build Coastguard Worker         struct SectionNode : SharedImpl<> {
SectionNodeCatch::CumulativeReporterBase::SectionNode8602*387f9dfdSAndroid Build Coastguard Worker             explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {}
8603*387f9dfdSAndroid Build Coastguard Worker             virtual ~SectionNode();
8604*387f9dfdSAndroid Build Coastguard Worker 
operator ==Catch::CumulativeReporterBase::SectionNode8605*387f9dfdSAndroid Build Coastguard Worker             bool operator == ( SectionNode const& other ) const {
8606*387f9dfdSAndroid Build Coastguard Worker                 return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
8607*387f9dfdSAndroid Build Coastguard Worker             }
operator ==Catch::CumulativeReporterBase::SectionNode8608*387f9dfdSAndroid Build Coastguard Worker             bool operator == ( Ptr<SectionNode> const& other ) const {
8609*387f9dfdSAndroid Build Coastguard Worker                 return operator==( *other );
8610*387f9dfdSAndroid Build Coastguard Worker             }
8611*387f9dfdSAndroid Build Coastguard Worker 
8612*387f9dfdSAndroid Build Coastguard Worker             SectionStats stats;
8613*387f9dfdSAndroid Build Coastguard Worker             typedef std::vector<Ptr<SectionNode> > ChildSections;
8614*387f9dfdSAndroid Build Coastguard Worker             typedef std::vector<AssertionStats> Assertions;
8615*387f9dfdSAndroid Build Coastguard Worker             ChildSections childSections;
8616*387f9dfdSAndroid Build Coastguard Worker             Assertions assertions;
8617*387f9dfdSAndroid Build Coastguard Worker             std::string stdOut;
8618*387f9dfdSAndroid Build Coastguard Worker             std::string stdErr;
8619*387f9dfdSAndroid Build Coastguard Worker         };
8620*387f9dfdSAndroid Build Coastguard Worker 
8621*387f9dfdSAndroid Build Coastguard Worker         struct BySectionInfo {
BySectionInfoCatch::CumulativeReporterBase::BySectionInfo8622*387f9dfdSAndroid Build Coastguard Worker             BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
BySectionInfoCatch::CumulativeReporterBase::BySectionInfo8623*387f9dfdSAndroid Build Coastguard Worker 			BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
operator ()Catch::CumulativeReporterBase::BySectionInfo8624*387f9dfdSAndroid Build Coastguard Worker             bool operator() ( Ptr<SectionNode> const& node ) const {
8625*387f9dfdSAndroid Build Coastguard Worker                 return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
8626*387f9dfdSAndroid Build Coastguard Worker             }
8627*387f9dfdSAndroid Build Coastguard Worker         private:
8628*387f9dfdSAndroid Build Coastguard Worker 			void operator=( BySectionInfo const& );
8629*387f9dfdSAndroid Build Coastguard Worker             SectionInfo const& m_other;
8630*387f9dfdSAndroid Build Coastguard Worker         };
8631*387f9dfdSAndroid Build Coastguard Worker 
8632*387f9dfdSAndroid Build Coastguard Worker         typedef Node<TestCaseStats, SectionNode> TestCaseNode;
8633*387f9dfdSAndroid Build Coastguard Worker         typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;
8634*387f9dfdSAndroid Build Coastguard Worker         typedef Node<TestRunStats, TestGroupNode> TestRunNode;
8635*387f9dfdSAndroid Build Coastguard Worker 
CumulativeReporterBaseCatch::CumulativeReporterBase8636*387f9dfdSAndroid Build Coastguard Worker         CumulativeReporterBase( ReporterConfig const& _config )
8637*387f9dfdSAndroid Build Coastguard Worker         :   m_config( _config.fullConfig() ),
8638*387f9dfdSAndroid Build Coastguard Worker             stream( _config.stream() )
8639*387f9dfdSAndroid Build Coastguard Worker         {
8640*387f9dfdSAndroid Build Coastguard Worker             m_reporterPrefs.shouldRedirectStdOut = false;
8641*387f9dfdSAndroid Build Coastguard Worker         }
8642*387f9dfdSAndroid Build Coastguard Worker         ~CumulativeReporterBase();
8643*387f9dfdSAndroid Build Coastguard Worker 
getPreferencesCatch::CumulativeReporterBase8644*387f9dfdSAndroid Build Coastguard Worker         virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
8645*387f9dfdSAndroid Build Coastguard Worker             return m_reporterPrefs;
8646*387f9dfdSAndroid Build Coastguard Worker         }
8647*387f9dfdSAndroid Build Coastguard Worker 
testRunStartingCatch::CumulativeReporterBase8648*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {}
testGroupStartingCatch::CumulativeReporterBase8649*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {}
8650*387f9dfdSAndroid Build Coastguard Worker 
testCaseStartingCatch::CumulativeReporterBase8651*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {}
8652*387f9dfdSAndroid Build Coastguard Worker 
sectionStartingCatch::CumulativeReporterBase8653*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
8654*387f9dfdSAndroid Build Coastguard Worker             SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
8655*387f9dfdSAndroid Build Coastguard Worker             Ptr<SectionNode> node;
8656*387f9dfdSAndroid Build Coastguard Worker             if( m_sectionStack.empty() ) {
8657*387f9dfdSAndroid Build Coastguard Worker                 if( !m_rootSection )
8658*387f9dfdSAndroid Build Coastguard Worker                     m_rootSection = new SectionNode( incompleteStats );
8659*387f9dfdSAndroid Build Coastguard Worker                 node = m_rootSection;
8660*387f9dfdSAndroid Build Coastguard Worker             }
8661*387f9dfdSAndroid Build Coastguard Worker             else {
8662*387f9dfdSAndroid Build Coastguard Worker                 SectionNode& parentNode = *m_sectionStack.back();
8663*387f9dfdSAndroid Build Coastguard Worker                 SectionNode::ChildSections::const_iterator it =
8664*387f9dfdSAndroid Build Coastguard Worker                     std::find_if(   parentNode.childSections.begin(),
8665*387f9dfdSAndroid Build Coastguard Worker                                     parentNode.childSections.end(),
8666*387f9dfdSAndroid Build Coastguard Worker                                     BySectionInfo( sectionInfo ) );
8667*387f9dfdSAndroid Build Coastguard Worker                 if( it == parentNode.childSections.end() ) {
8668*387f9dfdSAndroid Build Coastguard Worker                     node = new SectionNode( incompleteStats );
8669*387f9dfdSAndroid Build Coastguard Worker                     parentNode.childSections.push_back( node );
8670*387f9dfdSAndroid Build Coastguard Worker                 }
8671*387f9dfdSAndroid Build Coastguard Worker                 else
8672*387f9dfdSAndroid Build Coastguard Worker                     node = *it;
8673*387f9dfdSAndroid Build Coastguard Worker             }
8674*387f9dfdSAndroid Build Coastguard Worker             m_sectionStack.push_back( node );
8675*387f9dfdSAndroid Build Coastguard Worker             m_deepestSection = node;
8676*387f9dfdSAndroid Build Coastguard Worker         }
8677*387f9dfdSAndroid Build Coastguard Worker 
assertionStartingCatch::CumulativeReporterBase8678*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
8679*387f9dfdSAndroid Build Coastguard Worker 
assertionEndedCatch::CumulativeReporterBase8680*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& assertionStats ) {
8681*387f9dfdSAndroid Build Coastguard Worker             assert( !m_sectionStack.empty() );
8682*387f9dfdSAndroid Build Coastguard Worker             SectionNode& sectionNode = *m_sectionStack.back();
8683*387f9dfdSAndroid Build Coastguard Worker             sectionNode.assertions.push_back( assertionStats );
8684*387f9dfdSAndroid Build Coastguard Worker             return true;
8685*387f9dfdSAndroid Build Coastguard Worker         }
sectionEndedCatch::CumulativeReporterBase8686*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
8687*387f9dfdSAndroid Build Coastguard Worker             assert( !m_sectionStack.empty() );
8688*387f9dfdSAndroid Build Coastguard Worker             SectionNode& node = *m_sectionStack.back();
8689*387f9dfdSAndroid Build Coastguard Worker             node.stats = sectionStats;
8690*387f9dfdSAndroid Build Coastguard Worker             m_sectionStack.pop_back();
8691*387f9dfdSAndroid Build Coastguard Worker         }
testCaseEndedCatch::CumulativeReporterBase8692*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
8693*387f9dfdSAndroid Build Coastguard Worker             Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats );
8694*387f9dfdSAndroid Build Coastguard Worker             assert( m_sectionStack.size() == 0 );
8695*387f9dfdSAndroid Build Coastguard Worker             node->children.push_back( m_rootSection );
8696*387f9dfdSAndroid Build Coastguard Worker             m_testCases.push_back( node );
8697*387f9dfdSAndroid Build Coastguard Worker             m_rootSection.reset();
8698*387f9dfdSAndroid Build Coastguard Worker 
8699*387f9dfdSAndroid Build Coastguard Worker             assert( m_deepestSection );
8700*387f9dfdSAndroid Build Coastguard Worker             m_deepestSection->stdOut = testCaseStats.stdOut;
8701*387f9dfdSAndroid Build Coastguard Worker             m_deepestSection->stdErr = testCaseStats.stdErr;
8702*387f9dfdSAndroid Build Coastguard Worker         }
testGroupEndedCatch::CumulativeReporterBase8703*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
8704*387f9dfdSAndroid Build Coastguard Worker             Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats );
8705*387f9dfdSAndroid Build Coastguard Worker             node->children.swap( m_testCases );
8706*387f9dfdSAndroid Build Coastguard Worker             m_testGroups.push_back( node );
8707*387f9dfdSAndroid Build Coastguard Worker         }
testRunEndedCatch::CumulativeReporterBase8708*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
8709*387f9dfdSAndroid Build Coastguard Worker             Ptr<TestRunNode> node = new TestRunNode( testRunStats );
8710*387f9dfdSAndroid Build Coastguard Worker             node->children.swap( m_testGroups );
8711*387f9dfdSAndroid Build Coastguard Worker             m_testRuns.push_back( node );
8712*387f9dfdSAndroid Build Coastguard Worker             testRunEndedCumulative();
8713*387f9dfdSAndroid Build Coastguard Worker         }
8714*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEndedCumulative() = 0;
8715*387f9dfdSAndroid Build Coastguard Worker 
skipTestCatch::CumulativeReporterBase8716*387f9dfdSAndroid Build Coastguard Worker         virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {}
8717*387f9dfdSAndroid Build Coastguard Worker 
8718*387f9dfdSAndroid Build Coastguard Worker         Ptr<IConfig const> m_config;
8719*387f9dfdSAndroid Build Coastguard Worker         std::ostream& stream;
8720*387f9dfdSAndroid Build Coastguard Worker         std::vector<AssertionStats> m_assertions;
8721*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::vector<Ptr<SectionNode> > > m_sections;
8722*387f9dfdSAndroid Build Coastguard Worker         std::vector<Ptr<TestCaseNode> > m_testCases;
8723*387f9dfdSAndroid Build Coastguard Worker         std::vector<Ptr<TestGroupNode> > m_testGroups;
8724*387f9dfdSAndroid Build Coastguard Worker 
8725*387f9dfdSAndroid Build Coastguard Worker         std::vector<Ptr<TestRunNode> > m_testRuns;
8726*387f9dfdSAndroid Build Coastguard Worker 
8727*387f9dfdSAndroid Build Coastguard Worker         Ptr<SectionNode> m_rootSection;
8728*387f9dfdSAndroid Build Coastguard Worker         Ptr<SectionNode> m_deepestSection;
8729*387f9dfdSAndroid Build Coastguard Worker         std::vector<Ptr<SectionNode> > m_sectionStack;
8730*387f9dfdSAndroid Build Coastguard Worker         ReporterPreferences m_reporterPrefs;
8731*387f9dfdSAndroid Build Coastguard Worker 
8732*387f9dfdSAndroid Build Coastguard Worker     };
8733*387f9dfdSAndroid Build Coastguard Worker 
8734*387f9dfdSAndroid Build Coastguard Worker     template<char C>
getLineOfChars()8735*387f9dfdSAndroid Build Coastguard Worker     char const* getLineOfChars() {
8736*387f9dfdSAndroid Build Coastguard Worker         static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
8737*387f9dfdSAndroid Build Coastguard Worker         if( !*line ) {
8738*387f9dfdSAndroid Build Coastguard Worker             memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );
8739*387f9dfdSAndroid Build Coastguard Worker             line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;
8740*387f9dfdSAndroid Build Coastguard Worker         }
8741*387f9dfdSAndroid Build Coastguard Worker         return line;
8742*387f9dfdSAndroid Build Coastguard Worker     }
8743*387f9dfdSAndroid Build Coastguard Worker 
8744*387f9dfdSAndroid Build Coastguard Worker     struct TestEventListenerBase : StreamingReporterBase {
TestEventListenerBaseCatch::TestEventListenerBase8745*387f9dfdSAndroid Build Coastguard Worker         TestEventListenerBase( ReporterConfig const& _config )
8746*387f9dfdSAndroid Build Coastguard Worker         :   StreamingReporterBase( _config )
8747*387f9dfdSAndroid Build Coastguard Worker         {}
8748*387f9dfdSAndroid Build Coastguard Worker 
assertionStartingCatch::TestEventListenerBase8749*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
assertionEndedCatch::TestEventListenerBase8750*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE {
8751*387f9dfdSAndroid Build Coastguard Worker             return false;
8752*387f9dfdSAndroid Build Coastguard Worker         }
8753*387f9dfdSAndroid Build Coastguard Worker     };
8754*387f9dfdSAndroid Build Coastguard Worker 
8755*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
8756*387f9dfdSAndroid Build Coastguard Worker 
8757*387f9dfdSAndroid Build Coastguard Worker // #included from: ../internal/catch_reporter_registrars.hpp
8758*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
8759*387f9dfdSAndroid Build Coastguard Worker 
8760*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8761*387f9dfdSAndroid Build Coastguard Worker 
8762*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
8763*387f9dfdSAndroid Build Coastguard Worker     class LegacyReporterRegistrar {
8764*387f9dfdSAndroid Build Coastguard Worker 
8765*387f9dfdSAndroid Build Coastguard Worker         class ReporterFactory : public IReporterFactory {
create(ReporterConfig const & config) const8766*387f9dfdSAndroid Build Coastguard Worker             virtual IStreamingReporter* create( ReporterConfig const& config ) const {
8767*387f9dfdSAndroid Build Coastguard Worker                 return new LegacyReporterAdapter( new T( config ) );
8768*387f9dfdSAndroid Build Coastguard Worker             }
8769*387f9dfdSAndroid Build Coastguard Worker 
getDescription() const8770*387f9dfdSAndroid Build Coastguard Worker             virtual std::string getDescription() const {
8771*387f9dfdSAndroid Build Coastguard Worker                 return T::getDescription();
8772*387f9dfdSAndroid Build Coastguard Worker             }
8773*387f9dfdSAndroid Build Coastguard Worker         };
8774*387f9dfdSAndroid Build Coastguard Worker 
8775*387f9dfdSAndroid Build Coastguard Worker     public:
8776*387f9dfdSAndroid Build Coastguard Worker 
LegacyReporterRegistrar(std::string const & name)8777*387f9dfdSAndroid Build Coastguard Worker         LegacyReporterRegistrar( std::string const& name ) {
8778*387f9dfdSAndroid Build Coastguard Worker             getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
8779*387f9dfdSAndroid Build Coastguard Worker         }
8780*387f9dfdSAndroid Build Coastguard Worker     };
8781*387f9dfdSAndroid Build Coastguard Worker 
8782*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
8783*387f9dfdSAndroid Build Coastguard Worker     class ReporterRegistrar {
8784*387f9dfdSAndroid Build Coastguard Worker 
8785*387f9dfdSAndroid Build Coastguard Worker         class ReporterFactory : public SharedImpl<IReporterFactory> {
8786*387f9dfdSAndroid Build Coastguard Worker 
8787*387f9dfdSAndroid Build Coastguard Worker             // *** Please Note ***:
8788*387f9dfdSAndroid Build Coastguard Worker             // - If you end up here looking at a compiler error because it's trying to register
8789*387f9dfdSAndroid Build Coastguard Worker             // your custom reporter class be aware that the native reporter interface has changed
8790*387f9dfdSAndroid Build Coastguard Worker             // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via
8791*387f9dfdSAndroid Build Coastguard Worker             // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.
8792*387f9dfdSAndroid Build Coastguard Worker             // However please consider updating to the new interface as the old one is now
8793*387f9dfdSAndroid Build Coastguard Worker             // deprecated and will probably be removed quite soon!
8794*387f9dfdSAndroid Build Coastguard Worker             // Please contact me via github if you have any questions at all about this.
8795*387f9dfdSAndroid Build Coastguard Worker             // In fact, ideally, please contact me anyway to let me know you've hit this - as I have
8796*387f9dfdSAndroid Build Coastguard Worker             // no idea who is actually using custom reporters at all (possibly no-one!).
8797*387f9dfdSAndroid Build Coastguard Worker             // The new interface is designed to minimise exposure to interface changes in the future.
create(ReporterConfig const & config) const8798*387f9dfdSAndroid Build Coastguard Worker             virtual IStreamingReporter* create( ReporterConfig const& config ) const {
8799*387f9dfdSAndroid Build Coastguard Worker                 return new T( config );
8800*387f9dfdSAndroid Build Coastguard Worker             }
8801*387f9dfdSAndroid Build Coastguard Worker 
getDescription() const8802*387f9dfdSAndroid Build Coastguard Worker             virtual std::string getDescription() const {
8803*387f9dfdSAndroid Build Coastguard Worker                 return T::getDescription();
8804*387f9dfdSAndroid Build Coastguard Worker             }
8805*387f9dfdSAndroid Build Coastguard Worker         };
8806*387f9dfdSAndroid Build Coastguard Worker 
8807*387f9dfdSAndroid Build Coastguard Worker     public:
8808*387f9dfdSAndroid Build Coastguard Worker 
ReporterRegistrar(std::string const & name)8809*387f9dfdSAndroid Build Coastguard Worker         ReporterRegistrar( std::string const& name ) {
8810*387f9dfdSAndroid Build Coastguard Worker             getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
8811*387f9dfdSAndroid Build Coastguard Worker         }
8812*387f9dfdSAndroid Build Coastguard Worker     };
8813*387f9dfdSAndroid Build Coastguard Worker 
8814*387f9dfdSAndroid Build Coastguard Worker     template<typename T>
8815*387f9dfdSAndroid Build Coastguard Worker     class ListenerRegistrar {
8816*387f9dfdSAndroid Build Coastguard Worker 
8817*387f9dfdSAndroid Build Coastguard Worker         class ListenerFactory : public SharedImpl<IReporterFactory> {
8818*387f9dfdSAndroid Build Coastguard Worker 
create(ReporterConfig const & config) const8819*387f9dfdSAndroid Build Coastguard Worker             virtual IStreamingReporter* create( ReporterConfig const& config ) const {
8820*387f9dfdSAndroid Build Coastguard Worker                 return new T( config );
8821*387f9dfdSAndroid Build Coastguard Worker             }
getDescription() const8822*387f9dfdSAndroid Build Coastguard Worker             virtual std::string getDescription() const {
8823*387f9dfdSAndroid Build Coastguard Worker                 return "";
8824*387f9dfdSAndroid Build Coastguard Worker             }
8825*387f9dfdSAndroid Build Coastguard Worker         };
8826*387f9dfdSAndroid Build Coastguard Worker 
8827*387f9dfdSAndroid Build Coastguard Worker     public:
8828*387f9dfdSAndroid Build Coastguard Worker 
ListenerRegistrar()8829*387f9dfdSAndroid Build Coastguard Worker         ListenerRegistrar() {
8830*387f9dfdSAndroid Build Coastguard Worker             getMutableRegistryHub().registerListener( new ListenerFactory() );
8831*387f9dfdSAndroid Build Coastguard Worker         }
8832*387f9dfdSAndroid Build Coastguard Worker     };
8833*387f9dfdSAndroid Build Coastguard Worker }
8834*387f9dfdSAndroid Build Coastguard Worker 
8835*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \
8836*387f9dfdSAndroid Build Coastguard Worker     namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
8837*387f9dfdSAndroid Build Coastguard Worker 
8838*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
8839*387f9dfdSAndroid Build Coastguard Worker     namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
8840*387f9dfdSAndroid Build Coastguard Worker 
8841*387f9dfdSAndroid Build Coastguard Worker #define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \
8842*387f9dfdSAndroid Build Coastguard Worker     namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; }
8843*387f9dfdSAndroid Build Coastguard Worker 
8844*387f9dfdSAndroid Build Coastguard Worker // #included from: ../internal/catch_xmlwriter.hpp
8845*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED
8846*387f9dfdSAndroid Build Coastguard Worker 
8847*387f9dfdSAndroid Build Coastguard Worker #include <sstream>
8848*387f9dfdSAndroid Build Coastguard Worker #include <string>
8849*387f9dfdSAndroid Build Coastguard Worker #include <vector>
8850*387f9dfdSAndroid Build Coastguard Worker #include <iomanip>
8851*387f9dfdSAndroid Build Coastguard Worker 
8852*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
8853*387f9dfdSAndroid Build Coastguard Worker 
8854*387f9dfdSAndroid Build Coastguard Worker     class XmlEncode {
8855*387f9dfdSAndroid Build Coastguard Worker     public:
8856*387f9dfdSAndroid Build Coastguard Worker         enum ForWhat { ForTextNodes, ForAttributes };
8857*387f9dfdSAndroid Build Coastguard Worker 
XmlEncode(std::string const & str,ForWhat forWhat=ForTextNodes)8858*387f9dfdSAndroid Build Coastguard Worker         XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes )
8859*387f9dfdSAndroid Build Coastguard Worker         :   m_str( str ),
8860*387f9dfdSAndroid Build Coastguard Worker             m_forWhat( forWhat )
8861*387f9dfdSAndroid Build Coastguard Worker         {}
8862*387f9dfdSAndroid Build Coastguard Worker 
encodeTo(std::ostream & os) const8863*387f9dfdSAndroid Build Coastguard Worker         void encodeTo( std::ostream& os ) const {
8864*387f9dfdSAndroid Build Coastguard Worker 
8865*387f9dfdSAndroid Build Coastguard Worker             // Apostrophe escaping not necessary if we always use " to write attributes
8866*387f9dfdSAndroid Build Coastguard Worker             // (see: http://www.w3.org/TR/xml/#syntax)
8867*387f9dfdSAndroid Build Coastguard Worker 
8868*387f9dfdSAndroid Build Coastguard Worker             for( std::size_t i = 0; i < m_str.size(); ++ i ) {
8869*387f9dfdSAndroid Build Coastguard Worker                 char c = m_str[i];
8870*387f9dfdSAndroid Build Coastguard Worker                 switch( c ) {
8871*387f9dfdSAndroid Build Coastguard Worker                     case '<':   os << "&lt;"; break;
8872*387f9dfdSAndroid Build Coastguard Worker                     case '&':   os << "&amp;"; break;
8873*387f9dfdSAndroid Build Coastguard Worker 
8874*387f9dfdSAndroid Build Coastguard Worker                     case '>':
8875*387f9dfdSAndroid Build Coastguard Worker                         // See: http://www.w3.org/TR/xml/#syntax
8876*387f9dfdSAndroid Build Coastguard Worker                         if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' )
8877*387f9dfdSAndroid Build Coastguard Worker                             os << "&gt;";
8878*387f9dfdSAndroid Build Coastguard Worker                         else
8879*387f9dfdSAndroid Build Coastguard Worker                             os << c;
8880*387f9dfdSAndroid Build Coastguard Worker                         break;
8881*387f9dfdSAndroid Build Coastguard Worker 
8882*387f9dfdSAndroid Build Coastguard Worker                     case '\"':
8883*387f9dfdSAndroid Build Coastguard Worker                         if( m_forWhat == ForAttributes )
8884*387f9dfdSAndroid Build Coastguard Worker                             os << "&quot;";
8885*387f9dfdSAndroid Build Coastguard Worker                         else
8886*387f9dfdSAndroid Build Coastguard Worker                             os << c;
8887*387f9dfdSAndroid Build Coastguard Worker                         break;
8888*387f9dfdSAndroid Build Coastguard Worker 
8889*387f9dfdSAndroid Build Coastguard Worker                     default:
8890*387f9dfdSAndroid Build Coastguard Worker                         // Escape control chars - based on contribution by @espenalb in PR #465
8891*387f9dfdSAndroid Build Coastguard Worker                         if ( ( c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' )
8892*387f9dfdSAndroid Build Coastguard Worker                             os << "&#x" << std::uppercase << std::hex << static_cast<int>( c );
8893*387f9dfdSAndroid Build Coastguard Worker                         else
8894*387f9dfdSAndroid Build Coastguard Worker                             os << c;
8895*387f9dfdSAndroid Build Coastguard Worker                 }
8896*387f9dfdSAndroid Build Coastguard Worker             }
8897*387f9dfdSAndroid Build Coastguard Worker         }
8898*387f9dfdSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,XmlEncode const & xmlEncode)8899*387f9dfdSAndroid Build Coastguard Worker         friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {
8900*387f9dfdSAndroid Build Coastguard Worker             xmlEncode.encodeTo( os );
8901*387f9dfdSAndroid Build Coastguard Worker             return os;
8902*387f9dfdSAndroid Build Coastguard Worker         }
8903*387f9dfdSAndroid Build Coastguard Worker 
8904*387f9dfdSAndroid Build Coastguard Worker     private:
8905*387f9dfdSAndroid Build Coastguard Worker         std::string m_str;
8906*387f9dfdSAndroid Build Coastguard Worker         ForWhat m_forWhat;
8907*387f9dfdSAndroid Build Coastguard Worker     };
8908*387f9dfdSAndroid Build Coastguard Worker 
8909*387f9dfdSAndroid Build Coastguard Worker     class XmlWriter {
8910*387f9dfdSAndroid Build Coastguard Worker     public:
8911*387f9dfdSAndroid Build Coastguard Worker 
8912*387f9dfdSAndroid Build Coastguard Worker         class ScopedElement {
8913*387f9dfdSAndroid Build Coastguard Worker         public:
ScopedElement(XmlWriter * writer)8914*387f9dfdSAndroid Build Coastguard Worker             ScopedElement( XmlWriter* writer )
8915*387f9dfdSAndroid Build Coastguard Worker             :   m_writer( writer )
8916*387f9dfdSAndroid Build Coastguard Worker             {}
8917*387f9dfdSAndroid Build Coastguard Worker 
ScopedElement(ScopedElement const & other)8918*387f9dfdSAndroid Build Coastguard Worker             ScopedElement( ScopedElement const& other )
8919*387f9dfdSAndroid Build Coastguard Worker             :   m_writer( other.m_writer ){
8920*387f9dfdSAndroid Build Coastguard Worker                 other.m_writer = CATCH_NULL;
8921*387f9dfdSAndroid Build Coastguard Worker             }
8922*387f9dfdSAndroid Build Coastguard Worker 
~ScopedElement()8923*387f9dfdSAndroid Build Coastguard Worker             ~ScopedElement() {
8924*387f9dfdSAndroid Build Coastguard Worker                 if( m_writer )
8925*387f9dfdSAndroid Build Coastguard Worker                     m_writer->endElement();
8926*387f9dfdSAndroid Build Coastguard Worker             }
8927*387f9dfdSAndroid Build Coastguard Worker 
writeText(std::string const & text,bool indent=true)8928*387f9dfdSAndroid Build Coastguard Worker             ScopedElement& writeText( std::string const& text, bool indent = true ) {
8929*387f9dfdSAndroid Build Coastguard Worker                 m_writer->writeText( text, indent );
8930*387f9dfdSAndroid Build Coastguard Worker                 return *this;
8931*387f9dfdSAndroid Build Coastguard Worker             }
8932*387f9dfdSAndroid Build Coastguard Worker 
8933*387f9dfdSAndroid Build Coastguard Worker             template<typename T>
writeAttribute(std::string const & name,T const & attribute)8934*387f9dfdSAndroid Build Coastguard Worker             ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
8935*387f9dfdSAndroid Build Coastguard Worker                 m_writer->writeAttribute( name, attribute );
8936*387f9dfdSAndroid Build Coastguard Worker                 return *this;
8937*387f9dfdSAndroid Build Coastguard Worker             }
8938*387f9dfdSAndroid Build Coastguard Worker 
8939*387f9dfdSAndroid Build Coastguard Worker         private:
8940*387f9dfdSAndroid Build Coastguard Worker             mutable XmlWriter* m_writer;
8941*387f9dfdSAndroid Build Coastguard Worker         };
8942*387f9dfdSAndroid Build Coastguard Worker 
XmlWriter()8943*387f9dfdSAndroid Build Coastguard Worker         XmlWriter()
8944*387f9dfdSAndroid Build Coastguard Worker         :   m_tagIsOpen( false ),
8945*387f9dfdSAndroid Build Coastguard Worker             m_needsNewline( false ),
8946*387f9dfdSAndroid Build Coastguard Worker             m_os( &Catch::cout() )
8947*387f9dfdSAndroid Build Coastguard Worker         {}
8948*387f9dfdSAndroid Build Coastguard Worker 
XmlWriter(std::ostream & os)8949*387f9dfdSAndroid Build Coastguard Worker         XmlWriter( std::ostream& os )
8950*387f9dfdSAndroid Build Coastguard Worker         :   m_tagIsOpen( false ),
8951*387f9dfdSAndroid Build Coastguard Worker             m_needsNewline( false ),
8952*387f9dfdSAndroid Build Coastguard Worker             m_os( &os )
8953*387f9dfdSAndroid Build Coastguard Worker         {}
8954*387f9dfdSAndroid Build Coastguard Worker 
~XmlWriter()8955*387f9dfdSAndroid Build Coastguard Worker         ~XmlWriter() {
8956*387f9dfdSAndroid Build Coastguard Worker             while( !m_tags.empty() )
8957*387f9dfdSAndroid Build Coastguard Worker                 endElement();
8958*387f9dfdSAndroid Build Coastguard Worker         }
8959*387f9dfdSAndroid Build Coastguard Worker 
startElement(std::string const & name)8960*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& startElement( std::string const& name ) {
8961*387f9dfdSAndroid Build Coastguard Worker             ensureTagClosed();
8962*387f9dfdSAndroid Build Coastguard Worker             newlineIfNecessary();
8963*387f9dfdSAndroid Build Coastguard Worker             stream() << m_indent << "<" << name;
8964*387f9dfdSAndroid Build Coastguard Worker             m_tags.push_back( name );
8965*387f9dfdSAndroid Build Coastguard Worker             m_indent += "  ";
8966*387f9dfdSAndroid Build Coastguard Worker             m_tagIsOpen = true;
8967*387f9dfdSAndroid Build Coastguard Worker             return *this;
8968*387f9dfdSAndroid Build Coastguard Worker         }
8969*387f9dfdSAndroid Build Coastguard Worker 
scopedElement(std::string const & name)8970*387f9dfdSAndroid Build Coastguard Worker         ScopedElement scopedElement( std::string const& name ) {
8971*387f9dfdSAndroid Build Coastguard Worker             ScopedElement scoped( this );
8972*387f9dfdSAndroid Build Coastguard Worker             startElement( name );
8973*387f9dfdSAndroid Build Coastguard Worker             return scoped;
8974*387f9dfdSAndroid Build Coastguard Worker         }
8975*387f9dfdSAndroid Build Coastguard Worker 
endElement()8976*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& endElement() {
8977*387f9dfdSAndroid Build Coastguard Worker             newlineIfNecessary();
8978*387f9dfdSAndroid Build Coastguard Worker             m_indent = m_indent.substr( 0, m_indent.size()-2 );
8979*387f9dfdSAndroid Build Coastguard Worker             if( m_tagIsOpen ) {
8980*387f9dfdSAndroid Build Coastguard Worker                 stream() << "/>\n";
8981*387f9dfdSAndroid Build Coastguard Worker                 m_tagIsOpen = false;
8982*387f9dfdSAndroid Build Coastguard Worker             }
8983*387f9dfdSAndroid Build Coastguard Worker             else {
8984*387f9dfdSAndroid Build Coastguard Worker                 stream() << m_indent << "</" << m_tags.back() << ">\n";
8985*387f9dfdSAndroid Build Coastguard Worker             }
8986*387f9dfdSAndroid Build Coastguard Worker             m_tags.pop_back();
8987*387f9dfdSAndroid Build Coastguard Worker             return *this;
8988*387f9dfdSAndroid Build Coastguard Worker         }
8989*387f9dfdSAndroid Build Coastguard Worker 
writeAttribute(std::string const & name,std::string const & attribute)8990*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {
8991*387f9dfdSAndroid Build Coastguard Worker             if( !name.empty() && !attribute.empty() )
8992*387f9dfdSAndroid Build Coastguard Worker                 stream() << " " << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << "\"";
8993*387f9dfdSAndroid Build Coastguard Worker             return *this;
8994*387f9dfdSAndroid Build Coastguard Worker         }
8995*387f9dfdSAndroid Build Coastguard Worker 
writeAttribute(std::string const & name,bool attribute)8996*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeAttribute( std::string const& name, bool attribute ) {
8997*387f9dfdSAndroid Build Coastguard Worker             stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\"";
8998*387f9dfdSAndroid Build Coastguard Worker             return *this;
8999*387f9dfdSAndroid Build Coastguard Worker         }
9000*387f9dfdSAndroid Build Coastguard Worker 
9001*387f9dfdSAndroid Build Coastguard Worker         template<typename T>
writeAttribute(std::string const & name,T const & attribute)9002*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
9003*387f9dfdSAndroid Build Coastguard Worker             std::ostringstream oss;
9004*387f9dfdSAndroid Build Coastguard Worker             oss << attribute;
9005*387f9dfdSAndroid Build Coastguard Worker             return writeAttribute( name, oss.str() );
9006*387f9dfdSAndroid Build Coastguard Worker         }
9007*387f9dfdSAndroid Build Coastguard Worker 
writeText(std::string const & text,bool indent=true)9008*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeText( std::string const& text, bool indent = true ) {
9009*387f9dfdSAndroid Build Coastguard Worker             if( !text.empty() ){
9010*387f9dfdSAndroid Build Coastguard Worker                 bool tagWasOpen = m_tagIsOpen;
9011*387f9dfdSAndroid Build Coastguard Worker                 ensureTagClosed();
9012*387f9dfdSAndroid Build Coastguard Worker                 if( tagWasOpen && indent )
9013*387f9dfdSAndroid Build Coastguard Worker                     stream() << m_indent;
9014*387f9dfdSAndroid Build Coastguard Worker                 stream() << XmlEncode( text );
9015*387f9dfdSAndroid Build Coastguard Worker                 m_needsNewline = true;
9016*387f9dfdSAndroid Build Coastguard Worker             }
9017*387f9dfdSAndroid Build Coastguard Worker             return *this;
9018*387f9dfdSAndroid Build Coastguard Worker         }
9019*387f9dfdSAndroid Build Coastguard Worker 
writeComment(std::string const & text)9020*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeComment( std::string const& text ) {
9021*387f9dfdSAndroid Build Coastguard Worker             ensureTagClosed();
9022*387f9dfdSAndroid Build Coastguard Worker             stream() << m_indent << "<!--" << text << "-->";
9023*387f9dfdSAndroid Build Coastguard Worker             m_needsNewline = true;
9024*387f9dfdSAndroid Build Coastguard Worker             return *this;
9025*387f9dfdSAndroid Build Coastguard Worker         }
9026*387f9dfdSAndroid Build Coastguard Worker 
writeBlankLine()9027*387f9dfdSAndroid Build Coastguard Worker         XmlWriter& writeBlankLine() {
9028*387f9dfdSAndroid Build Coastguard Worker             ensureTagClosed();
9029*387f9dfdSAndroid Build Coastguard Worker             stream() << "\n";
9030*387f9dfdSAndroid Build Coastguard Worker             return *this;
9031*387f9dfdSAndroid Build Coastguard Worker         }
9032*387f9dfdSAndroid Build Coastguard Worker 
setStream(std::ostream & os)9033*387f9dfdSAndroid Build Coastguard Worker         void setStream( std::ostream& os ) {
9034*387f9dfdSAndroid Build Coastguard Worker             m_os = &os;
9035*387f9dfdSAndroid Build Coastguard Worker         }
9036*387f9dfdSAndroid Build Coastguard Worker 
9037*387f9dfdSAndroid Build Coastguard Worker     private:
9038*387f9dfdSAndroid Build Coastguard Worker         XmlWriter( XmlWriter const& );
9039*387f9dfdSAndroid Build Coastguard Worker         void operator=( XmlWriter const& );
9040*387f9dfdSAndroid Build Coastguard Worker 
stream()9041*387f9dfdSAndroid Build Coastguard Worker         std::ostream& stream() {
9042*387f9dfdSAndroid Build Coastguard Worker             return *m_os;
9043*387f9dfdSAndroid Build Coastguard Worker         }
9044*387f9dfdSAndroid Build Coastguard Worker 
ensureTagClosed()9045*387f9dfdSAndroid Build Coastguard Worker         void ensureTagClosed() {
9046*387f9dfdSAndroid Build Coastguard Worker             if( m_tagIsOpen ) {
9047*387f9dfdSAndroid Build Coastguard Worker                 stream() << ">\n";
9048*387f9dfdSAndroid Build Coastguard Worker                 m_tagIsOpen = false;
9049*387f9dfdSAndroid Build Coastguard Worker             }
9050*387f9dfdSAndroid Build Coastguard Worker         }
9051*387f9dfdSAndroid Build Coastguard Worker 
newlineIfNecessary()9052*387f9dfdSAndroid Build Coastguard Worker         void newlineIfNecessary() {
9053*387f9dfdSAndroid Build Coastguard Worker             if( m_needsNewline ) {
9054*387f9dfdSAndroid Build Coastguard Worker                 stream() << "\n";
9055*387f9dfdSAndroid Build Coastguard Worker                 m_needsNewline = false;
9056*387f9dfdSAndroid Build Coastguard Worker             }
9057*387f9dfdSAndroid Build Coastguard Worker         }
9058*387f9dfdSAndroid Build Coastguard Worker 
9059*387f9dfdSAndroid Build Coastguard Worker         bool m_tagIsOpen;
9060*387f9dfdSAndroid Build Coastguard Worker         bool m_needsNewline;
9061*387f9dfdSAndroid Build Coastguard Worker         std::vector<std::string> m_tags;
9062*387f9dfdSAndroid Build Coastguard Worker         std::string m_indent;
9063*387f9dfdSAndroid Build Coastguard Worker         std::ostream* m_os;
9064*387f9dfdSAndroid Build Coastguard Worker     };
9065*387f9dfdSAndroid Build Coastguard Worker 
9066*387f9dfdSAndroid Build Coastguard Worker }
9067*387f9dfdSAndroid Build Coastguard Worker // #included from: catch_reenable_warnings.h
9068*387f9dfdSAndroid Build Coastguard Worker 
9069*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED
9070*387f9dfdSAndroid Build Coastguard Worker 
9071*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
9072*387f9dfdSAndroid Build Coastguard Worker #    ifdef __ICC // icpc defines the __clang__ macro
9073*387f9dfdSAndroid Build Coastguard Worker #        pragma warning(pop)
9074*387f9dfdSAndroid Build Coastguard Worker #    else
9075*387f9dfdSAndroid Build Coastguard Worker #        pragma clang diagnostic pop
9076*387f9dfdSAndroid Build Coastguard Worker #    endif
9077*387f9dfdSAndroid Build Coastguard Worker #elif defined __GNUC__
9078*387f9dfdSAndroid Build Coastguard Worker #    pragma GCC diagnostic pop
9079*387f9dfdSAndroid Build Coastguard Worker #endif
9080*387f9dfdSAndroid Build Coastguard Worker 
9081*387f9dfdSAndroid Build Coastguard Worker 
9082*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
9083*387f9dfdSAndroid Build Coastguard Worker     class XmlReporter : public StreamingReporterBase {
9084*387f9dfdSAndroid Build Coastguard Worker     public:
XmlReporter(ReporterConfig const & _config)9085*387f9dfdSAndroid Build Coastguard Worker         XmlReporter( ReporterConfig const& _config )
9086*387f9dfdSAndroid Build Coastguard Worker         :   StreamingReporterBase( _config ),
9087*387f9dfdSAndroid Build Coastguard Worker             m_sectionDepth( 0 )
9088*387f9dfdSAndroid Build Coastguard Worker         {
9089*387f9dfdSAndroid Build Coastguard Worker             m_reporterPrefs.shouldRedirectStdOut = true;
9090*387f9dfdSAndroid Build Coastguard Worker         }
9091*387f9dfdSAndroid Build Coastguard Worker 
9092*387f9dfdSAndroid Build Coastguard Worker         virtual ~XmlReporter() CATCH_OVERRIDE;
9093*387f9dfdSAndroid Build Coastguard Worker 
getDescription()9094*387f9dfdSAndroid Build Coastguard Worker         static std::string getDescription() {
9095*387f9dfdSAndroid Build Coastguard Worker             return "Reports test results as an XML document";
9096*387f9dfdSAndroid Build Coastguard Worker         }
9097*387f9dfdSAndroid Build Coastguard Worker 
9098*387f9dfdSAndroid Build Coastguard Worker     public: // StreamingReporterBase
9099*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCases(std::string const & s)9100*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE {
9101*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::noMatchingTestCases( s );
9102*387f9dfdSAndroid Build Coastguard Worker         }
9103*387f9dfdSAndroid Build Coastguard Worker 
testRunStarting(TestRunInfo const & testInfo)9104*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE {
9105*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testRunStarting( testInfo );
9106*387f9dfdSAndroid Build Coastguard Worker             m_xml.setStream( stream );
9107*387f9dfdSAndroid Build Coastguard Worker             m_xml.startElement( "Catch" );
9108*387f9dfdSAndroid Build Coastguard Worker             if( !m_config->name().empty() )
9109*387f9dfdSAndroid Build Coastguard Worker                 m_xml.writeAttribute( "name", m_config->name() );
9110*387f9dfdSAndroid Build Coastguard Worker         }
9111*387f9dfdSAndroid Build Coastguard Worker 
testGroupStarting(GroupInfo const & groupInfo)9112*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
9113*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testGroupStarting( groupInfo );
9114*387f9dfdSAndroid Build Coastguard Worker             m_xml.startElement( "Group" )
9115*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "name", groupInfo.name );
9116*387f9dfdSAndroid Build Coastguard Worker         }
9117*387f9dfdSAndroid Build Coastguard Worker 
testCaseStarting(TestCaseInfo const & testInfo)9118*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
9119*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testCaseStarting(testInfo);
9120*387f9dfdSAndroid Build Coastguard Worker             m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) );
9121*387f9dfdSAndroid Build Coastguard Worker 
9122*387f9dfdSAndroid Build Coastguard Worker             if ( m_config->showDurations() == ShowDurations::Always )
9123*387f9dfdSAndroid Build Coastguard Worker                 m_testCaseTimer.start();
9124*387f9dfdSAndroid Build Coastguard Worker         }
9125*387f9dfdSAndroid Build Coastguard Worker 
sectionStarting(SectionInfo const & sectionInfo)9126*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
9127*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::sectionStarting( sectionInfo );
9128*387f9dfdSAndroid Build Coastguard Worker             if( m_sectionDepth++ > 0 ) {
9129*387f9dfdSAndroid Build Coastguard Worker                 m_xml.startElement( "Section" )
9130*387f9dfdSAndroid Build Coastguard Worker                     .writeAttribute( "name", trim( sectionInfo.name ) )
9131*387f9dfdSAndroid Build Coastguard Worker                     .writeAttribute( "description", sectionInfo.description );
9132*387f9dfdSAndroid Build Coastguard Worker             }
9133*387f9dfdSAndroid Build Coastguard Worker         }
9134*387f9dfdSAndroid Build Coastguard Worker 
assertionStarting(AssertionInfo const &)9135*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { }
9136*387f9dfdSAndroid Build Coastguard Worker 
assertionEnded(AssertionStats const & assertionStats)9137*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
9138*387f9dfdSAndroid Build Coastguard Worker             const AssertionResult& assertionResult = assertionStats.assertionResult;
9139*387f9dfdSAndroid Build Coastguard Worker 
9140*387f9dfdSAndroid Build Coastguard Worker             // Print any info messages in <Info> tags.
9141*387f9dfdSAndroid Build Coastguard Worker             if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
9142*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
9143*387f9dfdSAndroid Build Coastguard Worker                         it != itEnd;
9144*387f9dfdSAndroid Build Coastguard Worker                         ++it ) {
9145*387f9dfdSAndroid Build Coastguard Worker                     if( it->type == ResultWas::Info ) {
9146*387f9dfdSAndroid Build Coastguard Worker                         m_xml.scopedElement( "Info" )
9147*387f9dfdSAndroid Build Coastguard Worker                             .writeText( it->message );
9148*387f9dfdSAndroid Build Coastguard Worker                     } else if ( it->type == ResultWas::Warning ) {
9149*387f9dfdSAndroid Build Coastguard Worker                         m_xml.scopedElement( "Warning" )
9150*387f9dfdSAndroid Build Coastguard Worker                             .writeText( it->message );
9151*387f9dfdSAndroid Build Coastguard Worker                     }
9152*387f9dfdSAndroid Build Coastguard Worker                 }
9153*387f9dfdSAndroid Build Coastguard Worker             }
9154*387f9dfdSAndroid Build Coastguard Worker 
9155*387f9dfdSAndroid Build Coastguard Worker             // Drop out if result was successful but we're not printing them.
9156*387f9dfdSAndroid Build Coastguard Worker             if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) )
9157*387f9dfdSAndroid Build Coastguard Worker                 return true;
9158*387f9dfdSAndroid Build Coastguard Worker 
9159*387f9dfdSAndroid Build Coastguard Worker             // Print the expression if there is one.
9160*387f9dfdSAndroid Build Coastguard Worker             if( assertionResult.hasExpression() ) {
9161*387f9dfdSAndroid Build Coastguard Worker                 m_xml.startElement( "Expression" )
9162*387f9dfdSAndroid Build Coastguard Worker                     .writeAttribute( "success", assertionResult.succeeded() )
9163*387f9dfdSAndroid Build Coastguard Worker 					.writeAttribute( "type", assertionResult.getTestMacroName() )
9164*387f9dfdSAndroid Build Coastguard Worker                     .writeAttribute( "filename", assertionResult.getSourceInfo().file )
9165*387f9dfdSAndroid Build Coastguard Worker                     .writeAttribute( "line", assertionResult.getSourceInfo().line );
9166*387f9dfdSAndroid Build Coastguard Worker 
9167*387f9dfdSAndroid Build Coastguard Worker                 m_xml.scopedElement( "Original" )
9168*387f9dfdSAndroid Build Coastguard Worker                     .writeText( assertionResult.getExpression() );
9169*387f9dfdSAndroid Build Coastguard Worker                 m_xml.scopedElement( "Expanded" )
9170*387f9dfdSAndroid Build Coastguard Worker                     .writeText( assertionResult.getExpandedExpression() );
9171*387f9dfdSAndroid Build Coastguard Worker             }
9172*387f9dfdSAndroid Build Coastguard Worker 
9173*387f9dfdSAndroid Build Coastguard Worker             // And... Print a result applicable to each result type.
9174*387f9dfdSAndroid Build Coastguard Worker             switch( assertionResult.getResultType() ) {
9175*387f9dfdSAndroid Build Coastguard Worker                 case ResultWas::ThrewException:
9176*387f9dfdSAndroid Build Coastguard Worker                     m_xml.scopedElement( "Exception" )
9177*387f9dfdSAndroid Build Coastguard Worker                         .writeAttribute( "filename", assertionResult.getSourceInfo().file )
9178*387f9dfdSAndroid Build Coastguard Worker                         .writeAttribute( "line", assertionResult.getSourceInfo().line )
9179*387f9dfdSAndroid Build Coastguard Worker                         .writeText( assertionResult.getMessage() );
9180*387f9dfdSAndroid Build Coastguard Worker                     break;
9181*387f9dfdSAndroid Build Coastguard Worker                 case ResultWas::FatalErrorCondition:
9182*387f9dfdSAndroid Build Coastguard Worker                     m_xml.scopedElement( "Fatal Error Condition" )
9183*387f9dfdSAndroid Build Coastguard Worker                         .writeAttribute( "filename", assertionResult.getSourceInfo().file )
9184*387f9dfdSAndroid Build Coastguard Worker                         .writeAttribute( "line", assertionResult.getSourceInfo().line )
9185*387f9dfdSAndroid Build Coastguard Worker                         .writeText( assertionResult.getMessage() );
9186*387f9dfdSAndroid Build Coastguard Worker                     break;
9187*387f9dfdSAndroid Build Coastguard Worker                 case ResultWas::Info:
9188*387f9dfdSAndroid Build Coastguard Worker                     m_xml.scopedElement( "Info" )
9189*387f9dfdSAndroid Build Coastguard Worker                         .writeText( assertionResult.getMessage() );
9190*387f9dfdSAndroid Build Coastguard Worker                     break;
9191*387f9dfdSAndroid Build Coastguard Worker                 case ResultWas::Warning:
9192*387f9dfdSAndroid Build Coastguard Worker                     // Warning will already have been written
9193*387f9dfdSAndroid Build Coastguard Worker                     break;
9194*387f9dfdSAndroid Build Coastguard Worker                 case ResultWas::ExplicitFailure:
9195*387f9dfdSAndroid Build Coastguard Worker                     m_xml.scopedElement( "Failure" )
9196*387f9dfdSAndroid Build Coastguard Worker                         .writeText( assertionResult.getMessage() );
9197*387f9dfdSAndroid Build Coastguard Worker                     break;
9198*387f9dfdSAndroid Build Coastguard Worker                 default:
9199*387f9dfdSAndroid Build Coastguard Worker                     break;
9200*387f9dfdSAndroid Build Coastguard Worker             }
9201*387f9dfdSAndroid Build Coastguard Worker 
9202*387f9dfdSAndroid Build Coastguard Worker             if( assertionResult.hasExpression() )
9203*387f9dfdSAndroid Build Coastguard Worker                 m_xml.endElement();
9204*387f9dfdSAndroid Build Coastguard Worker 
9205*387f9dfdSAndroid Build Coastguard Worker             return true;
9206*387f9dfdSAndroid Build Coastguard Worker         }
9207*387f9dfdSAndroid Build Coastguard Worker 
sectionEnded(SectionStats const & sectionStats)9208*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
9209*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::sectionEnded( sectionStats );
9210*387f9dfdSAndroid Build Coastguard Worker             if( --m_sectionDepth > 0 ) {
9211*387f9dfdSAndroid Build Coastguard Worker                 XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" );
9212*387f9dfdSAndroid Build Coastguard Worker                 e.writeAttribute( "successes", sectionStats.assertions.passed );
9213*387f9dfdSAndroid Build Coastguard Worker                 e.writeAttribute( "failures", sectionStats.assertions.failed );
9214*387f9dfdSAndroid Build Coastguard Worker                 e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk );
9215*387f9dfdSAndroid Build Coastguard Worker 
9216*387f9dfdSAndroid Build Coastguard Worker                 if ( m_config->showDurations() == ShowDurations::Always )
9217*387f9dfdSAndroid Build Coastguard Worker                     e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds );
9218*387f9dfdSAndroid Build Coastguard Worker 
9219*387f9dfdSAndroid Build Coastguard Worker                 m_xml.endElement();
9220*387f9dfdSAndroid Build Coastguard Worker             }
9221*387f9dfdSAndroid Build Coastguard Worker         }
9222*387f9dfdSAndroid Build Coastguard Worker 
testCaseEnded(TestCaseStats const & testCaseStats)9223*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
9224*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testCaseEnded( testCaseStats );
9225*387f9dfdSAndroid Build Coastguard Worker             XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" );
9226*387f9dfdSAndroid Build Coastguard Worker             e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() );
9227*387f9dfdSAndroid Build Coastguard Worker 
9228*387f9dfdSAndroid Build Coastguard Worker             if ( m_config->showDurations() == ShowDurations::Always )
9229*387f9dfdSAndroid Build Coastguard Worker                 e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() );
9230*387f9dfdSAndroid Build Coastguard Worker 
9231*387f9dfdSAndroid Build Coastguard Worker             m_xml.endElement();
9232*387f9dfdSAndroid Build Coastguard Worker         }
9233*387f9dfdSAndroid Build Coastguard Worker 
testGroupEnded(TestGroupStats const & testGroupStats)9234*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
9235*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testGroupEnded( testGroupStats );
9236*387f9dfdSAndroid Build Coastguard Worker             // TODO: Check testGroupStats.aborting and act accordingly.
9237*387f9dfdSAndroid Build Coastguard Worker             m_xml.scopedElement( "OverallResults" )
9238*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "successes", testGroupStats.totals.assertions.passed )
9239*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "failures", testGroupStats.totals.assertions.failed )
9240*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk );
9241*387f9dfdSAndroid Build Coastguard Worker             m_xml.endElement();
9242*387f9dfdSAndroid Build Coastguard Worker         }
9243*387f9dfdSAndroid Build Coastguard Worker 
testRunEnded(TestRunStats const & testRunStats)9244*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
9245*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testRunEnded( testRunStats );
9246*387f9dfdSAndroid Build Coastguard Worker             m_xml.scopedElement( "OverallResults" )
9247*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "successes", testRunStats.totals.assertions.passed )
9248*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "failures", testRunStats.totals.assertions.failed )
9249*387f9dfdSAndroid Build Coastguard Worker                 .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk );
9250*387f9dfdSAndroid Build Coastguard Worker             m_xml.endElement();
9251*387f9dfdSAndroid Build Coastguard Worker         }
9252*387f9dfdSAndroid Build Coastguard Worker 
9253*387f9dfdSAndroid Build Coastguard Worker     private:
9254*387f9dfdSAndroid Build Coastguard Worker         Timer m_testCaseTimer;
9255*387f9dfdSAndroid Build Coastguard Worker         XmlWriter m_xml;
9256*387f9dfdSAndroid Build Coastguard Worker         int m_sectionDepth;
9257*387f9dfdSAndroid Build Coastguard Worker     };
9258*387f9dfdSAndroid Build Coastguard Worker 
9259*387f9dfdSAndroid Build Coastguard Worker      INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter )
9260*387f9dfdSAndroid Build Coastguard Worker 
9261*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
9262*387f9dfdSAndroid Build Coastguard Worker 
9263*387f9dfdSAndroid Build Coastguard Worker // #included from: ../reporters/catch_reporter_junit.hpp
9264*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED
9265*387f9dfdSAndroid Build Coastguard Worker 
9266*387f9dfdSAndroid Build Coastguard Worker #include <assert.h>
9267*387f9dfdSAndroid Build Coastguard Worker 
9268*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
9269*387f9dfdSAndroid Build Coastguard Worker 
9270*387f9dfdSAndroid Build Coastguard Worker     class JunitReporter : public CumulativeReporterBase {
9271*387f9dfdSAndroid Build Coastguard Worker     public:
JunitReporter(ReporterConfig const & _config)9272*387f9dfdSAndroid Build Coastguard Worker         JunitReporter( ReporterConfig const& _config )
9273*387f9dfdSAndroid Build Coastguard Worker         :   CumulativeReporterBase( _config ),
9274*387f9dfdSAndroid Build Coastguard Worker             xml( _config.stream() )
9275*387f9dfdSAndroid Build Coastguard Worker         {
9276*387f9dfdSAndroid Build Coastguard Worker             m_reporterPrefs.shouldRedirectStdOut = true;
9277*387f9dfdSAndroid Build Coastguard Worker         }
9278*387f9dfdSAndroid Build Coastguard Worker 
9279*387f9dfdSAndroid Build Coastguard Worker         virtual ~JunitReporter() CATCH_OVERRIDE;
9280*387f9dfdSAndroid Build Coastguard Worker 
getDescription()9281*387f9dfdSAndroid Build Coastguard Worker         static std::string getDescription() {
9282*387f9dfdSAndroid Build Coastguard Worker             return "Reports test results in an XML format that looks like Ant's junitreport target";
9283*387f9dfdSAndroid Build Coastguard Worker         }
9284*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCases(std::string const &)9285*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {}
9286*387f9dfdSAndroid Build Coastguard Worker 
testRunStarting(TestRunInfo const & runInfo)9287*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE {
9288*387f9dfdSAndroid Build Coastguard Worker             CumulativeReporterBase::testRunStarting( runInfo );
9289*387f9dfdSAndroid Build Coastguard Worker             xml.startElement( "testsuites" );
9290*387f9dfdSAndroid Build Coastguard Worker         }
9291*387f9dfdSAndroid Build Coastguard Worker 
testGroupStarting(GroupInfo const & groupInfo)9292*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
9293*387f9dfdSAndroid Build Coastguard Worker             suiteTimer.start();
9294*387f9dfdSAndroid Build Coastguard Worker             stdOutForSuite.str("");
9295*387f9dfdSAndroid Build Coastguard Worker             stdErrForSuite.str("");
9296*387f9dfdSAndroid Build Coastguard Worker             unexpectedExceptions = 0;
9297*387f9dfdSAndroid Build Coastguard Worker             CumulativeReporterBase::testGroupStarting( groupInfo );
9298*387f9dfdSAndroid Build Coastguard Worker         }
9299*387f9dfdSAndroid Build Coastguard Worker 
assertionEnded(AssertionStats const & assertionStats)9300*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
9301*387f9dfdSAndroid Build Coastguard Worker             if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException )
9302*387f9dfdSAndroid Build Coastguard Worker                 unexpectedExceptions++;
9303*387f9dfdSAndroid Build Coastguard Worker             return CumulativeReporterBase::assertionEnded( assertionStats );
9304*387f9dfdSAndroid Build Coastguard Worker         }
9305*387f9dfdSAndroid Build Coastguard Worker 
testCaseEnded(TestCaseStats const & testCaseStats)9306*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
9307*387f9dfdSAndroid Build Coastguard Worker             stdOutForSuite << testCaseStats.stdOut;
9308*387f9dfdSAndroid Build Coastguard Worker             stdErrForSuite << testCaseStats.stdErr;
9309*387f9dfdSAndroid Build Coastguard Worker             CumulativeReporterBase::testCaseEnded( testCaseStats );
9310*387f9dfdSAndroid Build Coastguard Worker         }
9311*387f9dfdSAndroid Build Coastguard Worker 
testGroupEnded(TestGroupStats const & testGroupStats)9312*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
9313*387f9dfdSAndroid Build Coastguard Worker             double suiteTime = suiteTimer.getElapsedSeconds();
9314*387f9dfdSAndroid Build Coastguard Worker             CumulativeReporterBase::testGroupEnded( testGroupStats );
9315*387f9dfdSAndroid Build Coastguard Worker             writeGroup( *m_testGroups.back(), suiteTime );
9316*387f9dfdSAndroid Build Coastguard Worker         }
9317*387f9dfdSAndroid Build Coastguard Worker 
testRunEndedCumulative()9318*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEndedCumulative() CATCH_OVERRIDE {
9319*387f9dfdSAndroid Build Coastguard Worker             xml.endElement();
9320*387f9dfdSAndroid Build Coastguard Worker         }
9321*387f9dfdSAndroid Build Coastguard Worker 
writeGroup(TestGroupNode const & groupNode,double suiteTime)9322*387f9dfdSAndroid Build Coastguard Worker         void writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
9323*387f9dfdSAndroid Build Coastguard Worker             XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
9324*387f9dfdSAndroid Build Coastguard Worker             TestGroupStats const& stats = groupNode.value;
9325*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "name", stats.groupInfo.name );
9326*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "errors", unexpectedExceptions );
9327*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions );
9328*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "tests", stats.totals.assertions.total() );
9329*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "hostname", "tbd" ); // !TBD
9330*387f9dfdSAndroid Build Coastguard Worker             if( m_config->showDurations() == ShowDurations::Never )
9331*387f9dfdSAndroid Build Coastguard Worker                 xml.writeAttribute( "time", "" );
9332*387f9dfdSAndroid Build Coastguard Worker             else
9333*387f9dfdSAndroid Build Coastguard Worker                 xml.writeAttribute( "time", suiteTime );
9334*387f9dfdSAndroid Build Coastguard Worker             xml.writeAttribute( "timestamp", "tbd" ); // !TBD
9335*387f9dfdSAndroid Build Coastguard Worker 
9336*387f9dfdSAndroid Build Coastguard Worker             // Write test cases
9337*387f9dfdSAndroid Build Coastguard Worker             for( TestGroupNode::ChildNodes::const_iterator
9338*387f9dfdSAndroid Build Coastguard Worker                     it = groupNode.children.begin(), itEnd = groupNode.children.end();
9339*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd;
9340*387f9dfdSAndroid Build Coastguard Worker                     ++it )
9341*387f9dfdSAndroid Build Coastguard Worker                 writeTestCase( **it );
9342*387f9dfdSAndroid Build Coastguard Worker 
9343*387f9dfdSAndroid Build Coastguard Worker             xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false );
9344*387f9dfdSAndroid Build Coastguard Worker             xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false );
9345*387f9dfdSAndroid Build Coastguard Worker         }
9346*387f9dfdSAndroid Build Coastguard Worker 
writeTestCase(TestCaseNode const & testCaseNode)9347*387f9dfdSAndroid Build Coastguard Worker         void writeTestCase( TestCaseNode const& testCaseNode ) {
9348*387f9dfdSAndroid Build Coastguard Worker             TestCaseStats const& stats = testCaseNode.value;
9349*387f9dfdSAndroid Build Coastguard Worker 
9350*387f9dfdSAndroid Build Coastguard Worker             // All test cases have exactly one section - which represents the
9351*387f9dfdSAndroid Build Coastguard Worker             // test case itself. That section may have 0-n nested sections
9352*387f9dfdSAndroid Build Coastguard Worker             assert( testCaseNode.children.size() == 1 );
9353*387f9dfdSAndroid Build Coastguard Worker             SectionNode const& rootSection = *testCaseNode.children.front();
9354*387f9dfdSAndroid Build Coastguard Worker 
9355*387f9dfdSAndroid Build Coastguard Worker             std::string className = stats.testInfo.className;
9356*387f9dfdSAndroid Build Coastguard Worker 
9357*387f9dfdSAndroid Build Coastguard Worker             if( className.empty() ) {
9358*387f9dfdSAndroid Build Coastguard Worker                 if( rootSection.childSections.empty() )
9359*387f9dfdSAndroid Build Coastguard Worker                     className = "global";
9360*387f9dfdSAndroid Build Coastguard Worker             }
9361*387f9dfdSAndroid Build Coastguard Worker             writeSection( className, "", rootSection );
9362*387f9dfdSAndroid Build Coastguard Worker         }
9363*387f9dfdSAndroid Build Coastguard Worker 
writeSection(std::string const & className,std::string const & rootName,SectionNode const & sectionNode)9364*387f9dfdSAndroid Build Coastguard Worker         void writeSection(  std::string const& className,
9365*387f9dfdSAndroid Build Coastguard Worker                             std::string const& rootName,
9366*387f9dfdSAndroid Build Coastguard Worker                             SectionNode const& sectionNode ) {
9367*387f9dfdSAndroid Build Coastguard Worker             std::string name = trim( sectionNode.stats.sectionInfo.name );
9368*387f9dfdSAndroid Build Coastguard Worker             if( !rootName.empty() )
9369*387f9dfdSAndroid Build Coastguard Worker                 name = rootName + "/" + name;
9370*387f9dfdSAndroid Build Coastguard Worker 
9371*387f9dfdSAndroid Build Coastguard Worker             if( !sectionNode.assertions.empty() ||
9372*387f9dfdSAndroid Build Coastguard Worker                 !sectionNode.stdOut.empty() ||
9373*387f9dfdSAndroid Build Coastguard Worker                 !sectionNode.stdErr.empty() ) {
9374*387f9dfdSAndroid Build Coastguard Worker                 XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
9375*387f9dfdSAndroid Build Coastguard Worker                 if( className.empty() ) {
9376*387f9dfdSAndroid Build Coastguard Worker                     xml.writeAttribute( "classname", name );
9377*387f9dfdSAndroid Build Coastguard Worker                     xml.writeAttribute( "name", "root" );
9378*387f9dfdSAndroid Build Coastguard Worker                 }
9379*387f9dfdSAndroid Build Coastguard Worker                 else {
9380*387f9dfdSAndroid Build Coastguard Worker                     xml.writeAttribute( "classname", className );
9381*387f9dfdSAndroid Build Coastguard Worker                     xml.writeAttribute( "name", name );
9382*387f9dfdSAndroid Build Coastguard Worker                 }
9383*387f9dfdSAndroid Build Coastguard Worker                 xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) );
9384*387f9dfdSAndroid Build Coastguard Worker 
9385*387f9dfdSAndroid Build Coastguard Worker                 writeAssertions( sectionNode );
9386*387f9dfdSAndroid Build Coastguard Worker 
9387*387f9dfdSAndroid Build Coastguard Worker                 if( !sectionNode.stdOut.empty() )
9388*387f9dfdSAndroid Build Coastguard Worker                     xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false );
9389*387f9dfdSAndroid Build Coastguard Worker                 if( !sectionNode.stdErr.empty() )
9390*387f9dfdSAndroid Build Coastguard Worker                     xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false );
9391*387f9dfdSAndroid Build Coastguard Worker             }
9392*387f9dfdSAndroid Build Coastguard Worker             for( SectionNode::ChildSections::const_iterator
9393*387f9dfdSAndroid Build Coastguard Worker                     it = sectionNode.childSections.begin(),
9394*387f9dfdSAndroid Build Coastguard Worker                     itEnd = sectionNode.childSections.end();
9395*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd;
9396*387f9dfdSAndroid Build Coastguard Worker                     ++it )
9397*387f9dfdSAndroid Build Coastguard Worker                 if( className.empty() )
9398*387f9dfdSAndroid Build Coastguard Worker                     writeSection( name, "", **it );
9399*387f9dfdSAndroid Build Coastguard Worker                 else
9400*387f9dfdSAndroid Build Coastguard Worker                     writeSection( className, name, **it );
9401*387f9dfdSAndroid Build Coastguard Worker         }
9402*387f9dfdSAndroid Build Coastguard Worker 
writeAssertions(SectionNode const & sectionNode)9403*387f9dfdSAndroid Build Coastguard Worker         void writeAssertions( SectionNode const& sectionNode ) {
9404*387f9dfdSAndroid Build Coastguard Worker             for( SectionNode::Assertions::const_iterator
9405*387f9dfdSAndroid Build Coastguard Worker                     it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end();
9406*387f9dfdSAndroid Build Coastguard Worker                     it != itEnd;
9407*387f9dfdSAndroid Build Coastguard Worker                     ++it )
9408*387f9dfdSAndroid Build Coastguard Worker                 writeAssertion( *it );
9409*387f9dfdSAndroid Build Coastguard Worker         }
writeAssertion(AssertionStats const & stats)9410*387f9dfdSAndroid Build Coastguard Worker         void writeAssertion( AssertionStats const& stats ) {
9411*387f9dfdSAndroid Build Coastguard Worker             AssertionResult const& result = stats.assertionResult;
9412*387f9dfdSAndroid Build Coastguard Worker             if( !result.isOk() ) {
9413*387f9dfdSAndroid Build Coastguard Worker                 std::string elementName;
9414*387f9dfdSAndroid Build Coastguard Worker                 switch( result.getResultType() ) {
9415*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ThrewException:
9416*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FatalErrorCondition:
9417*387f9dfdSAndroid Build Coastguard Worker                         elementName = "error";
9418*387f9dfdSAndroid Build Coastguard Worker                         break;
9419*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExplicitFailure:
9420*387f9dfdSAndroid Build Coastguard Worker                         elementName = "failure";
9421*387f9dfdSAndroid Build Coastguard Worker                         break;
9422*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExpressionFailed:
9423*387f9dfdSAndroid Build Coastguard Worker                         elementName = "failure";
9424*387f9dfdSAndroid Build Coastguard Worker                         break;
9425*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::DidntThrowException:
9426*387f9dfdSAndroid Build Coastguard Worker                         elementName = "failure";
9427*387f9dfdSAndroid Build Coastguard Worker                         break;
9428*387f9dfdSAndroid Build Coastguard Worker 
9429*387f9dfdSAndroid Build Coastguard Worker                     // We should never see these here:
9430*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Info:
9431*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Warning:
9432*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Ok:
9433*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Unknown:
9434*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FailureBit:
9435*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Exception:
9436*387f9dfdSAndroid Build Coastguard Worker                         elementName = "internalError";
9437*387f9dfdSAndroid Build Coastguard Worker                         break;
9438*387f9dfdSAndroid Build Coastguard Worker                 }
9439*387f9dfdSAndroid Build Coastguard Worker 
9440*387f9dfdSAndroid Build Coastguard Worker                 XmlWriter::ScopedElement e = xml.scopedElement( elementName );
9441*387f9dfdSAndroid Build Coastguard Worker 
9442*387f9dfdSAndroid Build Coastguard Worker                 xml.writeAttribute( "message", result.getExpandedExpression() );
9443*387f9dfdSAndroid Build Coastguard Worker                 xml.writeAttribute( "type", result.getTestMacroName() );
9444*387f9dfdSAndroid Build Coastguard Worker 
9445*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
9446*387f9dfdSAndroid Build Coastguard Worker                 if( !result.getMessage().empty() )
9447*387f9dfdSAndroid Build Coastguard Worker                     oss << result.getMessage() << "\n";
9448*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<MessageInfo>::const_iterator
9449*387f9dfdSAndroid Build Coastguard Worker                         it = stats.infoMessages.begin(),
9450*387f9dfdSAndroid Build Coastguard Worker                         itEnd = stats.infoMessages.end();
9451*387f9dfdSAndroid Build Coastguard Worker                             it != itEnd;
9452*387f9dfdSAndroid Build Coastguard Worker                             ++it )
9453*387f9dfdSAndroid Build Coastguard Worker                     if( it->type == ResultWas::Info )
9454*387f9dfdSAndroid Build Coastguard Worker                         oss << it->message << "\n";
9455*387f9dfdSAndroid Build Coastguard Worker 
9456*387f9dfdSAndroid Build Coastguard Worker                 oss << "at " << result.getSourceInfo();
9457*387f9dfdSAndroid Build Coastguard Worker                 xml.writeText( oss.str(), false );
9458*387f9dfdSAndroid Build Coastguard Worker             }
9459*387f9dfdSAndroid Build Coastguard Worker         }
9460*387f9dfdSAndroid Build Coastguard Worker 
9461*387f9dfdSAndroid Build Coastguard Worker         XmlWriter xml;
9462*387f9dfdSAndroid Build Coastguard Worker         Timer suiteTimer;
9463*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream stdOutForSuite;
9464*387f9dfdSAndroid Build Coastguard Worker         std::ostringstream stdErrForSuite;
9465*387f9dfdSAndroid Build Coastguard Worker         unsigned int unexpectedExceptions;
9466*387f9dfdSAndroid Build Coastguard Worker     };
9467*387f9dfdSAndroid Build Coastguard Worker 
9468*387f9dfdSAndroid Build Coastguard Worker     INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
9469*387f9dfdSAndroid Build Coastguard Worker 
9470*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
9471*387f9dfdSAndroid Build Coastguard Worker 
9472*387f9dfdSAndroid Build Coastguard Worker // #included from: ../reporters/catch_reporter_console.hpp
9473*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
9474*387f9dfdSAndroid Build Coastguard Worker 
9475*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
9476*387f9dfdSAndroid Build Coastguard Worker 
9477*387f9dfdSAndroid Build Coastguard Worker     struct ConsoleReporter : StreamingReporterBase {
ConsoleReporterCatch::ConsoleReporter9478*387f9dfdSAndroid Build Coastguard Worker         ConsoleReporter( ReporterConfig const& _config )
9479*387f9dfdSAndroid Build Coastguard Worker         :   StreamingReporterBase( _config ),
9480*387f9dfdSAndroid Build Coastguard Worker             m_headerPrinted( false )
9481*387f9dfdSAndroid Build Coastguard Worker         {}
9482*387f9dfdSAndroid Build Coastguard Worker 
9483*387f9dfdSAndroid Build Coastguard Worker         virtual ~ConsoleReporter() CATCH_OVERRIDE;
getDescriptionCatch::ConsoleReporter9484*387f9dfdSAndroid Build Coastguard Worker         static std::string getDescription() {
9485*387f9dfdSAndroid Build Coastguard Worker             return "Reports test results as plain lines of text";
9486*387f9dfdSAndroid Build Coastguard Worker         }
9487*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCasesCatch::ConsoleReporter9488*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {
9489*387f9dfdSAndroid Build Coastguard Worker             stream << "No test cases matched '" << spec << "'" << std::endl;
9490*387f9dfdSAndroid Build Coastguard Worker         }
9491*387f9dfdSAndroid Build Coastguard Worker 
assertionStartingCatch::ConsoleReporter9492*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {
9493*387f9dfdSAndroid Build Coastguard Worker         }
9494*387f9dfdSAndroid Build Coastguard Worker 
assertionEndedCatch::ConsoleReporter9495*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE {
9496*387f9dfdSAndroid Build Coastguard Worker             AssertionResult const& result = _assertionStats.assertionResult;
9497*387f9dfdSAndroid Build Coastguard Worker 
9498*387f9dfdSAndroid Build Coastguard Worker             bool printInfoMessages = true;
9499*387f9dfdSAndroid Build Coastguard Worker 
9500*387f9dfdSAndroid Build Coastguard Worker             // Drop out if result was successful and we're not printing those
9501*387f9dfdSAndroid Build Coastguard Worker             if( !m_config->includeSuccessfulResults() && result.isOk() ) {
9502*387f9dfdSAndroid Build Coastguard Worker                 if( result.getResultType() != ResultWas::Warning )
9503*387f9dfdSAndroid Build Coastguard Worker                     return false;
9504*387f9dfdSAndroid Build Coastguard Worker                 printInfoMessages = false;
9505*387f9dfdSAndroid Build Coastguard Worker             }
9506*387f9dfdSAndroid Build Coastguard Worker 
9507*387f9dfdSAndroid Build Coastguard Worker             lazyPrint();
9508*387f9dfdSAndroid Build Coastguard Worker 
9509*387f9dfdSAndroid Build Coastguard Worker             AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
9510*387f9dfdSAndroid Build Coastguard Worker             printer.print();
9511*387f9dfdSAndroid Build Coastguard Worker             stream << std::endl;
9512*387f9dfdSAndroid Build Coastguard Worker             return true;
9513*387f9dfdSAndroid Build Coastguard Worker         }
9514*387f9dfdSAndroid Build Coastguard Worker 
sectionStartingCatch::ConsoleReporter9515*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {
9516*387f9dfdSAndroid Build Coastguard Worker             m_headerPrinted = false;
9517*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::sectionStarting( _sectionInfo );
9518*387f9dfdSAndroid Build Coastguard Worker         }
sectionEndedCatch::ConsoleReporter9519*387f9dfdSAndroid Build Coastguard Worker         virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE {
9520*387f9dfdSAndroid Build Coastguard Worker             if( _sectionStats.missingAssertions ) {
9521*387f9dfdSAndroid Build Coastguard Worker                 lazyPrint();
9522*387f9dfdSAndroid Build Coastguard Worker                 Colour colour( Colour::ResultError );
9523*387f9dfdSAndroid Build Coastguard Worker                 if( m_sectionStack.size() > 1 )
9524*387f9dfdSAndroid Build Coastguard Worker                     stream << "\nNo assertions in section";
9525*387f9dfdSAndroid Build Coastguard Worker                 else
9526*387f9dfdSAndroid Build Coastguard Worker                     stream << "\nNo assertions in test case";
9527*387f9dfdSAndroid Build Coastguard Worker                 stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
9528*387f9dfdSAndroid Build Coastguard Worker             }
9529*387f9dfdSAndroid Build Coastguard Worker             if( m_headerPrinted ) {
9530*387f9dfdSAndroid Build Coastguard Worker                 if( m_config->showDurations() == ShowDurations::Always )
9531*387f9dfdSAndroid Build Coastguard Worker                     stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
9532*387f9dfdSAndroid Build Coastguard Worker                 m_headerPrinted = false;
9533*387f9dfdSAndroid Build Coastguard Worker             }
9534*387f9dfdSAndroid Build Coastguard Worker             else {
9535*387f9dfdSAndroid Build Coastguard Worker                 if( m_config->showDurations() == ShowDurations::Always )
9536*387f9dfdSAndroid Build Coastguard Worker                     stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
9537*387f9dfdSAndroid Build Coastguard Worker             }
9538*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::sectionEnded( _sectionStats );
9539*387f9dfdSAndroid Build Coastguard Worker         }
9540*387f9dfdSAndroid Build Coastguard Worker 
testCaseEndedCatch::ConsoleReporter9541*387f9dfdSAndroid Build Coastguard Worker         virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE {
9542*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testCaseEnded( _testCaseStats );
9543*387f9dfdSAndroid Build Coastguard Worker             m_headerPrinted = false;
9544*387f9dfdSAndroid Build Coastguard Worker         }
testGroupEndedCatch::ConsoleReporter9545*387f9dfdSAndroid Build Coastguard Worker         virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE {
9546*387f9dfdSAndroid Build Coastguard Worker             if( currentGroupInfo.used ) {
9547*387f9dfdSAndroid Build Coastguard Worker                 printSummaryDivider();
9548*387f9dfdSAndroid Build Coastguard Worker                 stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
9549*387f9dfdSAndroid Build Coastguard Worker                 printTotals( _testGroupStats.totals );
9550*387f9dfdSAndroid Build Coastguard Worker                 stream << "\n" << std::endl;
9551*387f9dfdSAndroid Build Coastguard Worker             }
9552*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testGroupEnded( _testGroupStats );
9553*387f9dfdSAndroid Build Coastguard Worker         }
testRunEndedCatch::ConsoleReporter9554*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE {
9555*387f9dfdSAndroid Build Coastguard Worker             printTotalsDivider( _testRunStats.totals );
9556*387f9dfdSAndroid Build Coastguard Worker             printTotals( _testRunStats.totals );
9557*387f9dfdSAndroid Build Coastguard Worker             stream << std::endl;
9558*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testRunEnded( _testRunStats );
9559*387f9dfdSAndroid Build Coastguard Worker         }
9560*387f9dfdSAndroid Build Coastguard Worker 
9561*387f9dfdSAndroid Build Coastguard Worker     private:
9562*387f9dfdSAndroid Build Coastguard Worker 
9563*387f9dfdSAndroid Build Coastguard Worker         class AssertionPrinter {
9564*387f9dfdSAndroid Build Coastguard Worker             void operator= ( AssertionPrinter const& );
9565*387f9dfdSAndroid Build Coastguard Worker         public:
AssertionPrinter(std::ostream & _stream,AssertionStats const & _stats,bool _printInfoMessages)9566*387f9dfdSAndroid Build Coastguard Worker             AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
9567*387f9dfdSAndroid Build Coastguard Worker             :   stream( _stream ),
9568*387f9dfdSAndroid Build Coastguard Worker                 stats( _stats ),
9569*387f9dfdSAndroid Build Coastguard Worker                 result( _stats.assertionResult ),
9570*387f9dfdSAndroid Build Coastguard Worker                 colour( Colour::None ),
9571*387f9dfdSAndroid Build Coastguard Worker                 message( result.getMessage() ),
9572*387f9dfdSAndroid Build Coastguard Worker                 messages( _stats.infoMessages ),
9573*387f9dfdSAndroid Build Coastguard Worker                 printInfoMessages( _printInfoMessages )
9574*387f9dfdSAndroid Build Coastguard Worker             {
9575*387f9dfdSAndroid Build Coastguard Worker                 switch( result.getResultType() ) {
9576*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Ok:
9577*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Success;
9578*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "PASSED";
9579*387f9dfdSAndroid Build Coastguard Worker                         //if( result.hasMessage() )
9580*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() == 1 )
9581*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "with message";
9582*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() > 1 )
9583*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "with messages";
9584*387f9dfdSAndroid Build Coastguard Worker                         break;
9585*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExpressionFailed:
9586*387f9dfdSAndroid Build Coastguard Worker                         if( result.isOk() ) {
9587*387f9dfdSAndroid Build Coastguard Worker                             colour = Colour::Success;
9588*387f9dfdSAndroid Build Coastguard Worker                             passOrFail = "FAILED - but was ok";
9589*387f9dfdSAndroid Build Coastguard Worker                         }
9590*387f9dfdSAndroid Build Coastguard Worker                         else {
9591*387f9dfdSAndroid Build Coastguard Worker                             colour = Colour::Error;
9592*387f9dfdSAndroid Build Coastguard Worker                             passOrFail = "FAILED";
9593*387f9dfdSAndroid Build Coastguard Worker                         }
9594*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() == 1 )
9595*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "with message";
9596*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() > 1 )
9597*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "with messages";
9598*387f9dfdSAndroid Build Coastguard Worker                         break;
9599*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ThrewException:
9600*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Error;
9601*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "FAILED";
9602*387f9dfdSAndroid Build Coastguard Worker                         messageLabel = "due to unexpected exception with message";
9603*387f9dfdSAndroid Build Coastguard Worker                         break;
9604*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FatalErrorCondition:
9605*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Error;
9606*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "FAILED";
9607*387f9dfdSAndroid Build Coastguard Worker                         messageLabel = "due to a fatal error condition";
9608*387f9dfdSAndroid Build Coastguard Worker                         break;
9609*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::DidntThrowException:
9610*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Error;
9611*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "FAILED";
9612*387f9dfdSAndroid Build Coastguard Worker                         messageLabel = "because no exception was thrown where one was expected";
9613*387f9dfdSAndroid Build Coastguard Worker                         break;
9614*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Info:
9615*387f9dfdSAndroid Build Coastguard Worker                         messageLabel = "info";
9616*387f9dfdSAndroid Build Coastguard Worker                         break;
9617*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Warning:
9618*387f9dfdSAndroid Build Coastguard Worker                         messageLabel = "warning";
9619*387f9dfdSAndroid Build Coastguard Worker                         break;
9620*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExplicitFailure:
9621*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "FAILED";
9622*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Error;
9623*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() == 1 )
9624*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "explicitly with message";
9625*387f9dfdSAndroid Build Coastguard Worker                         if( _stats.infoMessages.size() > 1 )
9626*387f9dfdSAndroid Build Coastguard Worker                             messageLabel = "explicitly with messages";
9627*387f9dfdSAndroid Build Coastguard Worker                         break;
9628*387f9dfdSAndroid Build Coastguard Worker                     // These cases are here to prevent compiler warnings
9629*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Unknown:
9630*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FailureBit:
9631*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Exception:
9632*387f9dfdSAndroid Build Coastguard Worker                         passOrFail = "** internal error **";
9633*387f9dfdSAndroid Build Coastguard Worker                         colour = Colour::Error;
9634*387f9dfdSAndroid Build Coastguard Worker                         break;
9635*387f9dfdSAndroid Build Coastguard Worker                 }
9636*387f9dfdSAndroid Build Coastguard Worker             }
9637*387f9dfdSAndroid Build Coastguard Worker 
print() const9638*387f9dfdSAndroid Build Coastguard Worker             void print() const {
9639*387f9dfdSAndroid Build Coastguard Worker                 printSourceInfo();
9640*387f9dfdSAndroid Build Coastguard Worker                 if( stats.totals.assertions.total() > 0 ) {
9641*387f9dfdSAndroid Build Coastguard Worker                     if( result.isOk() )
9642*387f9dfdSAndroid Build Coastguard Worker                         stream << "\n";
9643*387f9dfdSAndroid Build Coastguard Worker                     printResultType();
9644*387f9dfdSAndroid Build Coastguard Worker                     printOriginalExpression();
9645*387f9dfdSAndroid Build Coastguard Worker                     printReconstructedExpression();
9646*387f9dfdSAndroid Build Coastguard Worker                 }
9647*387f9dfdSAndroid Build Coastguard Worker                 else {
9648*387f9dfdSAndroid Build Coastguard Worker                     stream << "\n";
9649*387f9dfdSAndroid Build Coastguard Worker                 }
9650*387f9dfdSAndroid Build Coastguard Worker                 printMessage();
9651*387f9dfdSAndroid Build Coastguard Worker             }
9652*387f9dfdSAndroid Build Coastguard Worker 
9653*387f9dfdSAndroid Build Coastguard Worker         private:
printResultType() const9654*387f9dfdSAndroid Build Coastguard Worker             void printResultType() const {
9655*387f9dfdSAndroid Build Coastguard Worker                 if( !passOrFail.empty() ) {
9656*387f9dfdSAndroid Build Coastguard Worker                     Colour colourGuard( colour );
9657*387f9dfdSAndroid Build Coastguard Worker                     stream << passOrFail << ":\n";
9658*387f9dfdSAndroid Build Coastguard Worker                 }
9659*387f9dfdSAndroid Build Coastguard Worker             }
printOriginalExpression() const9660*387f9dfdSAndroid Build Coastguard Worker             void printOriginalExpression() const {
9661*387f9dfdSAndroid Build Coastguard Worker                 if( result.hasExpression() ) {
9662*387f9dfdSAndroid Build Coastguard Worker                     Colour colourGuard( Colour::OriginalExpression );
9663*387f9dfdSAndroid Build Coastguard Worker                     stream  << "  ";
9664*387f9dfdSAndroid Build Coastguard Worker                     stream << result.getExpressionInMacro();
9665*387f9dfdSAndroid Build Coastguard Worker                     stream << "\n";
9666*387f9dfdSAndroid Build Coastguard Worker                 }
9667*387f9dfdSAndroid Build Coastguard Worker             }
printReconstructedExpression() const9668*387f9dfdSAndroid Build Coastguard Worker             void printReconstructedExpression() const {
9669*387f9dfdSAndroid Build Coastguard Worker                 if( result.hasExpandedExpression() ) {
9670*387f9dfdSAndroid Build Coastguard Worker                     stream << "with expansion:\n";
9671*387f9dfdSAndroid Build Coastguard Worker                     Colour colourGuard( Colour::ReconstructedExpression );
9672*387f9dfdSAndroid Build Coastguard Worker                     stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n";
9673*387f9dfdSAndroid Build Coastguard Worker                 }
9674*387f9dfdSAndroid Build Coastguard Worker             }
printMessage() const9675*387f9dfdSAndroid Build Coastguard Worker             void printMessage() const {
9676*387f9dfdSAndroid Build Coastguard Worker                 if( !messageLabel.empty() )
9677*387f9dfdSAndroid Build Coastguard Worker                     stream << messageLabel << ":" << "\n";
9678*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();
9679*387f9dfdSAndroid Build Coastguard Worker                         it != itEnd;
9680*387f9dfdSAndroid Build Coastguard Worker                         ++it ) {
9681*387f9dfdSAndroid Build Coastguard Worker                     // If this assertion is a warning ignore any INFO messages
9682*387f9dfdSAndroid Build Coastguard Worker                     if( printInfoMessages || it->type != ResultWas::Info )
9683*387f9dfdSAndroid Build Coastguard Worker                         stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n";
9684*387f9dfdSAndroid Build Coastguard Worker                 }
9685*387f9dfdSAndroid Build Coastguard Worker             }
printSourceInfo() const9686*387f9dfdSAndroid Build Coastguard Worker             void printSourceInfo() const {
9687*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::FileName );
9688*387f9dfdSAndroid Build Coastguard Worker                 stream << result.getSourceInfo() << ": ";
9689*387f9dfdSAndroid Build Coastguard Worker             }
9690*387f9dfdSAndroid Build Coastguard Worker 
9691*387f9dfdSAndroid Build Coastguard Worker             std::ostream& stream;
9692*387f9dfdSAndroid Build Coastguard Worker             AssertionStats const& stats;
9693*387f9dfdSAndroid Build Coastguard Worker             AssertionResult const& result;
9694*387f9dfdSAndroid Build Coastguard Worker             Colour::Code colour;
9695*387f9dfdSAndroid Build Coastguard Worker             std::string passOrFail;
9696*387f9dfdSAndroid Build Coastguard Worker             std::string messageLabel;
9697*387f9dfdSAndroid Build Coastguard Worker             std::string message;
9698*387f9dfdSAndroid Build Coastguard Worker             std::vector<MessageInfo> messages;
9699*387f9dfdSAndroid Build Coastguard Worker             bool printInfoMessages;
9700*387f9dfdSAndroid Build Coastguard Worker         };
9701*387f9dfdSAndroid Build Coastguard Worker 
lazyPrintCatch::ConsoleReporter9702*387f9dfdSAndroid Build Coastguard Worker         void lazyPrint() {
9703*387f9dfdSAndroid Build Coastguard Worker 
9704*387f9dfdSAndroid Build Coastguard Worker             if( !currentTestRunInfo.used )
9705*387f9dfdSAndroid Build Coastguard Worker                 lazyPrintRunInfo();
9706*387f9dfdSAndroid Build Coastguard Worker             if( !currentGroupInfo.used )
9707*387f9dfdSAndroid Build Coastguard Worker                 lazyPrintGroupInfo();
9708*387f9dfdSAndroid Build Coastguard Worker 
9709*387f9dfdSAndroid Build Coastguard Worker             if( !m_headerPrinted ) {
9710*387f9dfdSAndroid Build Coastguard Worker                 printTestCaseAndSectionHeader();
9711*387f9dfdSAndroid Build Coastguard Worker                 m_headerPrinted = true;
9712*387f9dfdSAndroid Build Coastguard Worker             }
9713*387f9dfdSAndroid Build Coastguard Worker         }
lazyPrintRunInfoCatch::ConsoleReporter9714*387f9dfdSAndroid Build Coastguard Worker         void lazyPrintRunInfo() {
9715*387f9dfdSAndroid Build Coastguard Worker             stream  << "\n" << getLineOfChars<'~'>() << "\n";
9716*387f9dfdSAndroid Build Coastguard Worker             Colour colour( Colour::SecondaryText );
9717*387f9dfdSAndroid Build Coastguard Worker             stream  << currentTestRunInfo->name
9718*387f9dfdSAndroid Build Coastguard Worker                     << " is a Catch v"  << libraryVersion << " host application.\n"
9719*387f9dfdSAndroid Build Coastguard Worker                     << "Run with -? for options\n\n";
9720*387f9dfdSAndroid Build Coastguard Worker 
9721*387f9dfdSAndroid Build Coastguard Worker             if( m_config->rngSeed() != 0 )
9722*387f9dfdSAndroid Build Coastguard Worker                 stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";
9723*387f9dfdSAndroid Build Coastguard Worker 
9724*387f9dfdSAndroid Build Coastguard Worker             currentTestRunInfo.used = true;
9725*387f9dfdSAndroid Build Coastguard Worker         }
lazyPrintGroupInfoCatch::ConsoleReporter9726*387f9dfdSAndroid Build Coastguard Worker         void lazyPrintGroupInfo() {
9727*387f9dfdSAndroid Build Coastguard Worker             if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) {
9728*387f9dfdSAndroid Build Coastguard Worker                 printClosedHeader( "Group: " + currentGroupInfo->name );
9729*387f9dfdSAndroid Build Coastguard Worker                 currentGroupInfo.used = true;
9730*387f9dfdSAndroid Build Coastguard Worker             }
9731*387f9dfdSAndroid Build Coastguard Worker         }
printTestCaseAndSectionHeaderCatch::ConsoleReporter9732*387f9dfdSAndroid Build Coastguard Worker         void printTestCaseAndSectionHeader() {
9733*387f9dfdSAndroid Build Coastguard Worker             assert( !m_sectionStack.empty() );
9734*387f9dfdSAndroid Build Coastguard Worker             printOpenHeader( currentTestCaseInfo->name );
9735*387f9dfdSAndroid Build Coastguard Worker 
9736*387f9dfdSAndroid Build Coastguard Worker             if( m_sectionStack.size() > 1 ) {
9737*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::Headers );
9738*387f9dfdSAndroid Build Coastguard Worker 
9739*387f9dfdSAndroid Build Coastguard Worker                 std::vector<SectionInfo>::const_iterator
9740*387f9dfdSAndroid Build Coastguard Worker                     it = m_sectionStack.begin()+1, // Skip first section (test case)
9741*387f9dfdSAndroid Build Coastguard Worker                     itEnd = m_sectionStack.end();
9742*387f9dfdSAndroid Build Coastguard Worker                 for( ; it != itEnd; ++it )
9743*387f9dfdSAndroid Build Coastguard Worker                     printHeaderString( it->name, 2 );
9744*387f9dfdSAndroid Build Coastguard Worker             }
9745*387f9dfdSAndroid Build Coastguard Worker 
9746*387f9dfdSAndroid Build Coastguard Worker             SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
9747*387f9dfdSAndroid Build Coastguard Worker 
9748*387f9dfdSAndroid Build Coastguard Worker             if( !lineInfo.empty() ){
9749*387f9dfdSAndroid Build Coastguard Worker                 stream << getLineOfChars<'-'>() << "\n";
9750*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::FileName );
9751*387f9dfdSAndroid Build Coastguard Worker                 stream << lineInfo << "\n";
9752*387f9dfdSAndroid Build Coastguard Worker             }
9753*387f9dfdSAndroid Build Coastguard Worker             stream << getLineOfChars<'.'>() << "\n" << std::endl;
9754*387f9dfdSAndroid Build Coastguard Worker         }
9755*387f9dfdSAndroid Build Coastguard Worker 
printClosedHeaderCatch::ConsoleReporter9756*387f9dfdSAndroid Build Coastguard Worker         void printClosedHeader( std::string const& _name ) {
9757*387f9dfdSAndroid Build Coastguard Worker             printOpenHeader( _name );
9758*387f9dfdSAndroid Build Coastguard Worker             stream << getLineOfChars<'.'>() << "\n";
9759*387f9dfdSAndroid Build Coastguard Worker         }
printOpenHeaderCatch::ConsoleReporter9760*387f9dfdSAndroid Build Coastguard Worker         void printOpenHeader( std::string const& _name ) {
9761*387f9dfdSAndroid Build Coastguard Worker             stream  << getLineOfChars<'-'>() << "\n";
9762*387f9dfdSAndroid Build Coastguard Worker             {
9763*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::Headers );
9764*387f9dfdSAndroid Build Coastguard Worker                 printHeaderString( _name );
9765*387f9dfdSAndroid Build Coastguard Worker             }
9766*387f9dfdSAndroid Build Coastguard Worker         }
9767*387f9dfdSAndroid Build Coastguard Worker 
9768*387f9dfdSAndroid Build Coastguard Worker         // if string has a : in first line will set indent to follow it on
9769*387f9dfdSAndroid Build Coastguard Worker         // subsequent lines
printHeaderStringCatch::ConsoleReporter9770*387f9dfdSAndroid Build Coastguard Worker         void printHeaderString( std::string const& _string, std::size_t indent = 0 ) {
9771*387f9dfdSAndroid Build Coastguard Worker             std::size_t i = _string.find( ": " );
9772*387f9dfdSAndroid Build Coastguard Worker             if( i != std::string::npos )
9773*387f9dfdSAndroid Build Coastguard Worker                 i+=2;
9774*387f9dfdSAndroid Build Coastguard Worker             else
9775*387f9dfdSAndroid Build Coastguard Worker                 i = 0;
9776*387f9dfdSAndroid Build Coastguard Worker             stream << Text( _string, TextAttributes()
9777*387f9dfdSAndroid Build Coastguard Worker                                         .setIndent( indent+i)
9778*387f9dfdSAndroid Build Coastguard Worker                                         .setInitialIndent( indent ) ) << "\n";
9779*387f9dfdSAndroid Build Coastguard Worker         }
9780*387f9dfdSAndroid Build Coastguard Worker 
9781*387f9dfdSAndroid Build Coastguard Worker         struct SummaryColumn {
9782*387f9dfdSAndroid Build Coastguard Worker 
SummaryColumnCatch::ConsoleReporter::SummaryColumn9783*387f9dfdSAndroid Build Coastguard Worker             SummaryColumn( std::string const& _label, Colour::Code _colour )
9784*387f9dfdSAndroid Build Coastguard Worker             :   label( _label ),
9785*387f9dfdSAndroid Build Coastguard Worker                 colour( _colour )
9786*387f9dfdSAndroid Build Coastguard Worker             {}
addRowCatch::ConsoleReporter::SummaryColumn9787*387f9dfdSAndroid Build Coastguard Worker             SummaryColumn addRow( std::size_t count ) {
9788*387f9dfdSAndroid Build Coastguard Worker                 std::ostringstream oss;
9789*387f9dfdSAndroid Build Coastguard Worker                 oss << count;
9790*387f9dfdSAndroid Build Coastguard Worker                 std::string row = oss.str();
9791*387f9dfdSAndroid Build Coastguard Worker                 for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) {
9792*387f9dfdSAndroid Build Coastguard Worker                     while( it->size() < row.size() )
9793*387f9dfdSAndroid Build Coastguard Worker                         *it = " " + *it;
9794*387f9dfdSAndroid Build Coastguard Worker                     while( it->size() > row.size() )
9795*387f9dfdSAndroid Build Coastguard Worker                         row = " " + row;
9796*387f9dfdSAndroid Build Coastguard Worker                 }
9797*387f9dfdSAndroid Build Coastguard Worker                 rows.push_back( row );
9798*387f9dfdSAndroid Build Coastguard Worker                 return *this;
9799*387f9dfdSAndroid Build Coastguard Worker             }
9800*387f9dfdSAndroid Build Coastguard Worker 
9801*387f9dfdSAndroid Build Coastguard Worker             std::string label;
9802*387f9dfdSAndroid Build Coastguard Worker             Colour::Code colour;
9803*387f9dfdSAndroid Build Coastguard Worker             std::vector<std::string> rows;
9804*387f9dfdSAndroid Build Coastguard Worker 
9805*387f9dfdSAndroid Build Coastguard Worker         };
9806*387f9dfdSAndroid Build Coastguard Worker 
printTotalsCatch::ConsoleReporter9807*387f9dfdSAndroid Build Coastguard Worker         void printTotals( Totals const& totals ) {
9808*387f9dfdSAndroid Build Coastguard Worker             if( totals.testCases.total() == 0 ) {
9809*387f9dfdSAndroid Build Coastguard Worker                 stream << Colour( Colour::Warning ) << "No tests ran\n";
9810*387f9dfdSAndroid Build Coastguard Worker             }
9811*387f9dfdSAndroid Build Coastguard Worker             else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) {
9812*387f9dfdSAndroid Build Coastguard Worker                 stream << Colour( Colour::ResultSuccess ) << "All tests passed";
9813*387f9dfdSAndroid Build Coastguard Worker                 stream << " ("
9814*387f9dfdSAndroid Build Coastguard Worker                         << pluralise( totals.assertions.passed, "assertion" ) << " in "
9815*387f9dfdSAndroid Build Coastguard Worker                         << pluralise( totals.testCases.passed, "test case" ) << ")"
9816*387f9dfdSAndroid Build Coastguard Worker                         << "\n";
9817*387f9dfdSAndroid Build Coastguard Worker             }
9818*387f9dfdSAndroid Build Coastguard Worker             else {
9819*387f9dfdSAndroid Build Coastguard Worker 
9820*387f9dfdSAndroid Build Coastguard Worker                 std::vector<SummaryColumn> columns;
9821*387f9dfdSAndroid Build Coastguard Worker                 columns.push_back( SummaryColumn( "", Colour::None )
9822*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.testCases.total() )
9823*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.assertions.total() ) );
9824*387f9dfdSAndroid Build Coastguard Worker                 columns.push_back( SummaryColumn( "passed", Colour::Success )
9825*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.testCases.passed )
9826*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.assertions.passed ) );
9827*387f9dfdSAndroid Build Coastguard Worker                 columns.push_back( SummaryColumn( "failed", Colour::ResultError )
9828*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.testCases.failed )
9829*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.assertions.failed ) );
9830*387f9dfdSAndroid Build Coastguard Worker                 columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure )
9831*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.testCases.failedButOk )
9832*387f9dfdSAndroid Build Coastguard Worker                                         .addRow( totals.assertions.failedButOk ) );
9833*387f9dfdSAndroid Build Coastguard Worker 
9834*387f9dfdSAndroid Build Coastguard Worker                 printSummaryRow( "test cases", columns, 0 );
9835*387f9dfdSAndroid Build Coastguard Worker                 printSummaryRow( "assertions", columns, 1 );
9836*387f9dfdSAndroid Build Coastguard Worker             }
9837*387f9dfdSAndroid Build Coastguard Worker         }
printSummaryRowCatch::ConsoleReporter9838*387f9dfdSAndroid Build Coastguard Worker         void printSummaryRow( std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row ) {
9839*387f9dfdSAndroid Build Coastguard Worker             for( std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it ) {
9840*387f9dfdSAndroid Build Coastguard Worker                 std::string value = it->rows[row];
9841*387f9dfdSAndroid Build Coastguard Worker                 if( it->label.empty() ) {
9842*387f9dfdSAndroid Build Coastguard Worker                     stream << label << ": ";
9843*387f9dfdSAndroid Build Coastguard Worker                     if( value != "0" )
9844*387f9dfdSAndroid Build Coastguard Worker                         stream << value;
9845*387f9dfdSAndroid Build Coastguard Worker                     else
9846*387f9dfdSAndroid Build Coastguard Worker                         stream << Colour( Colour::Warning ) << "- none -";
9847*387f9dfdSAndroid Build Coastguard Worker                 }
9848*387f9dfdSAndroid Build Coastguard Worker                 else if( value != "0" ) {
9849*387f9dfdSAndroid Build Coastguard Worker                     stream  << Colour( Colour::LightGrey ) << " | ";
9850*387f9dfdSAndroid Build Coastguard Worker                     stream  << Colour( it->colour )
9851*387f9dfdSAndroid Build Coastguard Worker                             << value << " " << it->label;
9852*387f9dfdSAndroid Build Coastguard Worker                 }
9853*387f9dfdSAndroid Build Coastguard Worker             }
9854*387f9dfdSAndroid Build Coastguard Worker             stream << "\n";
9855*387f9dfdSAndroid Build Coastguard Worker         }
9856*387f9dfdSAndroid Build Coastguard Worker 
makeRatioCatch::ConsoleReporter9857*387f9dfdSAndroid Build Coastguard Worker         static std::size_t makeRatio( std::size_t number, std::size_t total ) {
9858*387f9dfdSAndroid Build Coastguard Worker             std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0;
9859*387f9dfdSAndroid Build Coastguard Worker             return ( ratio == 0 && number > 0 ) ? 1 : ratio;
9860*387f9dfdSAndroid Build Coastguard Worker         }
findMaxCatch::ConsoleReporter9861*387f9dfdSAndroid Build Coastguard Worker         static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) {
9862*387f9dfdSAndroid Build Coastguard Worker             if( i > j && i > k )
9863*387f9dfdSAndroid Build Coastguard Worker                 return i;
9864*387f9dfdSAndroid Build Coastguard Worker             else if( j > k )
9865*387f9dfdSAndroid Build Coastguard Worker                 return j;
9866*387f9dfdSAndroid Build Coastguard Worker             else
9867*387f9dfdSAndroid Build Coastguard Worker                 return k;
9868*387f9dfdSAndroid Build Coastguard Worker         }
9869*387f9dfdSAndroid Build Coastguard Worker 
printTotalsDividerCatch::ConsoleReporter9870*387f9dfdSAndroid Build Coastguard Worker         void printTotalsDivider( Totals const& totals ) {
9871*387f9dfdSAndroid Build Coastguard Worker             if( totals.testCases.total() > 0 ) {
9872*387f9dfdSAndroid Build Coastguard Worker                 std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() );
9873*387f9dfdSAndroid Build Coastguard Worker                 std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() );
9874*387f9dfdSAndroid Build Coastguard Worker                 std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() );
9875*387f9dfdSAndroid Build Coastguard Worker                 while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 )
9876*387f9dfdSAndroid Build Coastguard Worker                     findMax( failedRatio, failedButOkRatio, passedRatio )++;
9877*387f9dfdSAndroid Build Coastguard Worker                 while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 )
9878*387f9dfdSAndroid Build Coastguard Worker                     findMax( failedRatio, failedButOkRatio, passedRatio )--;
9879*387f9dfdSAndroid Build Coastguard Worker 
9880*387f9dfdSAndroid Build Coastguard Worker                 stream << Colour( Colour::Error ) << std::string( failedRatio, '=' );
9881*387f9dfdSAndroid Build Coastguard Worker                 stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' );
9882*387f9dfdSAndroid Build Coastguard Worker                 if( totals.testCases.allPassed() )
9883*387f9dfdSAndroid Build Coastguard Worker                     stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' );
9884*387f9dfdSAndroid Build Coastguard Worker                 else
9885*387f9dfdSAndroid Build Coastguard Worker                     stream << Colour( Colour::Success ) << std::string( passedRatio, '=' );
9886*387f9dfdSAndroid Build Coastguard Worker             }
9887*387f9dfdSAndroid Build Coastguard Worker             else {
9888*387f9dfdSAndroid Build Coastguard Worker                 stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );
9889*387f9dfdSAndroid Build Coastguard Worker             }
9890*387f9dfdSAndroid Build Coastguard Worker             stream << "\n";
9891*387f9dfdSAndroid Build Coastguard Worker         }
printSummaryDividerCatch::ConsoleReporter9892*387f9dfdSAndroid Build Coastguard Worker         void printSummaryDivider() {
9893*387f9dfdSAndroid Build Coastguard Worker             stream << getLineOfChars<'-'>() << "\n";
9894*387f9dfdSAndroid Build Coastguard Worker         }
9895*387f9dfdSAndroid Build Coastguard Worker 
9896*387f9dfdSAndroid Build Coastguard Worker     private:
9897*387f9dfdSAndroid Build Coastguard Worker         bool m_headerPrinted;
9898*387f9dfdSAndroid Build Coastguard Worker     };
9899*387f9dfdSAndroid Build Coastguard Worker 
9900*387f9dfdSAndroid Build Coastguard Worker     INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter )
9901*387f9dfdSAndroid Build Coastguard Worker 
9902*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
9903*387f9dfdSAndroid Build Coastguard Worker 
9904*387f9dfdSAndroid Build Coastguard Worker // #included from: ../reporters/catch_reporter_compact.hpp
9905*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED
9906*387f9dfdSAndroid Build Coastguard Worker 
9907*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
9908*387f9dfdSAndroid Build Coastguard Worker 
9909*387f9dfdSAndroid Build Coastguard Worker     struct CompactReporter : StreamingReporterBase {
9910*387f9dfdSAndroid Build Coastguard Worker 
CompactReporterCatch::CompactReporter9911*387f9dfdSAndroid Build Coastguard Worker         CompactReporter( ReporterConfig const& _config )
9912*387f9dfdSAndroid Build Coastguard Worker         : StreamingReporterBase( _config )
9913*387f9dfdSAndroid Build Coastguard Worker         {}
9914*387f9dfdSAndroid Build Coastguard Worker 
9915*387f9dfdSAndroid Build Coastguard Worker         virtual ~CompactReporter();
9916*387f9dfdSAndroid Build Coastguard Worker 
getDescriptionCatch::CompactReporter9917*387f9dfdSAndroid Build Coastguard Worker         static std::string getDescription() {
9918*387f9dfdSAndroid Build Coastguard Worker             return "Reports test results on a single line, suitable for IDEs";
9919*387f9dfdSAndroid Build Coastguard Worker         }
9920*387f9dfdSAndroid Build Coastguard Worker 
getPreferencesCatch::CompactReporter9921*387f9dfdSAndroid Build Coastguard Worker         virtual ReporterPreferences getPreferences() const {
9922*387f9dfdSAndroid Build Coastguard Worker             ReporterPreferences prefs;
9923*387f9dfdSAndroid Build Coastguard Worker             prefs.shouldRedirectStdOut = false;
9924*387f9dfdSAndroid Build Coastguard Worker             return prefs;
9925*387f9dfdSAndroid Build Coastguard Worker         }
9926*387f9dfdSAndroid Build Coastguard Worker 
noMatchingTestCasesCatch::CompactReporter9927*387f9dfdSAndroid Build Coastguard Worker         virtual void noMatchingTestCases( std::string const& spec ) {
9928*387f9dfdSAndroid Build Coastguard Worker             stream << "No test cases matched '" << spec << "'" << std::endl;
9929*387f9dfdSAndroid Build Coastguard Worker         }
9930*387f9dfdSAndroid Build Coastguard Worker 
assertionStartingCatch::CompactReporter9931*387f9dfdSAndroid Build Coastguard Worker         virtual void assertionStarting( AssertionInfo const& ) {
9932*387f9dfdSAndroid Build Coastguard Worker         }
9933*387f9dfdSAndroid Build Coastguard Worker 
assertionEndedCatch::CompactReporter9934*387f9dfdSAndroid Build Coastguard Worker         virtual bool assertionEnded( AssertionStats const& _assertionStats ) {
9935*387f9dfdSAndroid Build Coastguard Worker             AssertionResult const& result = _assertionStats.assertionResult;
9936*387f9dfdSAndroid Build Coastguard Worker 
9937*387f9dfdSAndroid Build Coastguard Worker             bool printInfoMessages = true;
9938*387f9dfdSAndroid Build Coastguard Worker 
9939*387f9dfdSAndroid Build Coastguard Worker             // Drop out if result was successful and we're not printing those
9940*387f9dfdSAndroid Build Coastguard Worker             if( !m_config->includeSuccessfulResults() && result.isOk() ) {
9941*387f9dfdSAndroid Build Coastguard Worker                 if( result.getResultType() != ResultWas::Warning )
9942*387f9dfdSAndroid Build Coastguard Worker                     return false;
9943*387f9dfdSAndroid Build Coastguard Worker                 printInfoMessages = false;
9944*387f9dfdSAndroid Build Coastguard Worker             }
9945*387f9dfdSAndroid Build Coastguard Worker 
9946*387f9dfdSAndroid Build Coastguard Worker             AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
9947*387f9dfdSAndroid Build Coastguard Worker             printer.print();
9948*387f9dfdSAndroid Build Coastguard Worker 
9949*387f9dfdSAndroid Build Coastguard Worker             stream << std::endl;
9950*387f9dfdSAndroid Build Coastguard Worker             return true;
9951*387f9dfdSAndroid Build Coastguard Worker         }
9952*387f9dfdSAndroid Build Coastguard Worker 
testRunEndedCatch::CompactReporter9953*387f9dfdSAndroid Build Coastguard Worker         virtual void testRunEnded( TestRunStats const& _testRunStats ) {
9954*387f9dfdSAndroid Build Coastguard Worker             printTotals( _testRunStats.totals );
9955*387f9dfdSAndroid Build Coastguard Worker             stream << "\n" << std::endl;
9956*387f9dfdSAndroid Build Coastguard Worker             StreamingReporterBase::testRunEnded( _testRunStats );
9957*387f9dfdSAndroid Build Coastguard Worker         }
9958*387f9dfdSAndroid Build Coastguard Worker 
9959*387f9dfdSAndroid Build Coastguard Worker     private:
9960*387f9dfdSAndroid Build Coastguard Worker         class AssertionPrinter {
9961*387f9dfdSAndroid Build Coastguard Worker             void operator= ( AssertionPrinter const& );
9962*387f9dfdSAndroid Build Coastguard Worker         public:
AssertionPrinter(std::ostream & _stream,AssertionStats const & _stats,bool _printInfoMessages)9963*387f9dfdSAndroid Build Coastguard Worker             AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
9964*387f9dfdSAndroid Build Coastguard Worker             : stream( _stream )
9965*387f9dfdSAndroid Build Coastguard Worker             , stats( _stats )
9966*387f9dfdSAndroid Build Coastguard Worker             , result( _stats.assertionResult )
9967*387f9dfdSAndroid Build Coastguard Worker             , messages( _stats.infoMessages )
9968*387f9dfdSAndroid Build Coastguard Worker             , itMessage( _stats.infoMessages.begin() )
9969*387f9dfdSAndroid Build Coastguard Worker             , printInfoMessages( _printInfoMessages )
9970*387f9dfdSAndroid Build Coastguard Worker             {}
9971*387f9dfdSAndroid Build Coastguard Worker 
print()9972*387f9dfdSAndroid Build Coastguard Worker             void print() {
9973*387f9dfdSAndroid Build Coastguard Worker                 printSourceInfo();
9974*387f9dfdSAndroid Build Coastguard Worker 
9975*387f9dfdSAndroid Build Coastguard Worker                 itMessage = messages.begin();
9976*387f9dfdSAndroid Build Coastguard Worker 
9977*387f9dfdSAndroid Build Coastguard Worker                 switch( result.getResultType() ) {
9978*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Ok:
9979*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::ResultSuccess, passedString() );
9980*387f9dfdSAndroid Build Coastguard Worker                         printOriginalExpression();
9981*387f9dfdSAndroid Build Coastguard Worker                         printReconstructedExpression();
9982*387f9dfdSAndroid Build Coastguard Worker                         if ( ! result.hasExpression() )
9983*387f9dfdSAndroid Build Coastguard Worker                             printRemainingMessages( Colour::None );
9984*387f9dfdSAndroid Build Coastguard Worker                         else
9985*387f9dfdSAndroid Build Coastguard Worker                             printRemainingMessages();
9986*387f9dfdSAndroid Build Coastguard Worker                         break;
9987*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExpressionFailed:
9988*387f9dfdSAndroid Build Coastguard Worker                         if( result.isOk() )
9989*387f9dfdSAndroid Build Coastguard Worker                             printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) );
9990*387f9dfdSAndroid Build Coastguard Worker                         else
9991*387f9dfdSAndroid Build Coastguard Worker                             printResultType( Colour::Error, failedString() );
9992*387f9dfdSAndroid Build Coastguard Worker                         printOriginalExpression();
9993*387f9dfdSAndroid Build Coastguard Worker                         printReconstructedExpression();
9994*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
9995*387f9dfdSAndroid Build Coastguard Worker                         break;
9996*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ThrewException:
9997*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::Error, failedString() );
9998*387f9dfdSAndroid Build Coastguard Worker                         printIssue( "unexpected exception with message:" );
9999*387f9dfdSAndroid Build Coastguard Worker                         printMessage();
10000*387f9dfdSAndroid Build Coastguard Worker                         printExpressionWas();
10001*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
10002*387f9dfdSAndroid Build Coastguard Worker                         break;
10003*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FatalErrorCondition:
10004*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::Error, failedString() );
10005*387f9dfdSAndroid Build Coastguard Worker                         printIssue( "fatal error condition with message:" );
10006*387f9dfdSAndroid Build Coastguard Worker                         printMessage();
10007*387f9dfdSAndroid Build Coastguard Worker                         printExpressionWas();
10008*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
10009*387f9dfdSAndroid Build Coastguard Worker                         break;
10010*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::DidntThrowException:
10011*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::Error, failedString() );
10012*387f9dfdSAndroid Build Coastguard Worker                         printIssue( "expected exception, got none" );
10013*387f9dfdSAndroid Build Coastguard Worker                         printExpressionWas();
10014*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
10015*387f9dfdSAndroid Build Coastguard Worker                         break;
10016*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Info:
10017*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::None, "info" );
10018*387f9dfdSAndroid Build Coastguard Worker                         printMessage();
10019*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
10020*387f9dfdSAndroid Build Coastguard Worker                         break;
10021*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Warning:
10022*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::None, "warning" );
10023*387f9dfdSAndroid Build Coastguard Worker                         printMessage();
10024*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages();
10025*387f9dfdSAndroid Build Coastguard Worker                         break;
10026*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::ExplicitFailure:
10027*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::Error, failedString() );
10028*387f9dfdSAndroid Build Coastguard Worker                         printIssue( "explicitly" );
10029*387f9dfdSAndroid Build Coastguard Worker                         printRemainingMessages( Colour::None );
10030*387f9dfdSAndroid Build Coastguard Worker                         break;
10031*387f9dfdSAndroid Build Coastguard Worker                     // These cases are here to prevent compiler warnings
10032*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Unknown:
10033*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::FailureBit:
10034*387f9dfdSAndroid Build Coastguard Worker                     case ResultWas::Exception:
10035*387f9dfdSAndroid Build Coastguard Worker                         printResultType( Colour::Error, "** internal error **" );
10036*387f9dfdSAndroid Build Coastguard Worker                         break;
10037*387f9dfdSAndroid Build Coastguard Worker                 }
10038*387f9dfdSAndroid Build Coastguard Worker             }
10039*387f9dfdSAndroid Build Coastguard Worker 
10040*387f9dfdSAndroid Build Coastguard Worker         private:
10041*387f9dfdSAndroid Build Coastguard Worker             // Colour::LightGrey
10042*387f9dfdSAndroid Build Coastguard Worker 
dimColour()10043*387f9dfdSAndroid Build Coastguard Worker             static Colour::Code dimColour() { return Colour::FileName; }
10044*387f9dfdSAndroid Build Coastguard Worker 
10045*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_PLATFORM_MAC
failedString()10046*387f9dfdSAndroid Build Coastguard Worker             static const char* failedString() { return "FAILED"; }
passedString()10047*387f9dfdSAndroid Build Coastguard Worker             static const char* passedString() { return "PASSED"; }
10048*387f9dfdSAndroid Build Coastguard Worker #else
failedString()10049*387f9dfdSAndroid Build Coastguard Worker             static const char* failedString() { return "failed"; }
passedString()10050*387f9dfdSAndroid Build Coastguard Worker             static const char* passedString() { return "passed"; }
10051*387f9dfdSAndroid Build Coastguard Worker #endif
10052*387f9dfdSAndroid Build Coastguard Worker 
printSourceInfo() const10053*387f9dfdSAndroid Build Coastguard Worker             void printSourceInfo() const {
10054*387f9dfdSAndroid Build Coastguard Worker                 Colour colourGuard( Colour::FileName );
10055*387f9dfdSAndroid Build Coastguard Worker                 stream << result.getSourceInfo() << ":";
10056*387f9dfdSAndroid Build Coastguard Worker             }
10057*387f9dfdSAndroid Build Coastguard Worker 
printResultType(Colour::Code colour,std::string passOrFail) const10058*387f9dfdSAndroid Build Coastguard Worker             void printResultType( Colour::Code colour, std::string passOrFail ) const {
10059*387f9dfdSAndroid Build Coastguard Worker                 if( !passOrFail.empty() ) {
10060*387f9dfdSAndroid Build Coastguard Worker                     {
10061*387f9dfdSAndroid Build Coastguard Worker                         Colour colourGuard( colour );
10062*387f9dfdSAndroid Build Coastguard Worker                         stream << " " << passOrFail;
10063*387f9dfdSAndroid Build Coastguard Worker                     }
10064*387f9dfdSAndroid Build Coastguard Worker                     stream << ":";
10065*387f9dfdSAndroid Build Coastguard Worker                 }
10066*387f9dfdSAndroid Build Coastguard Worker             }
10067*387f9dfdSAndroid Build Coastguard Worker 
printIssue(std::string issue) const10068*387f9dfdSAndroid Build Coastguard Worker             void printIssue( std::string issue ) const {
10069*387f9dfdSAndroid Build Coastguard Worker                 stream << " " << issue;
10070*387f9dfdSAndroid Build Coastguard Worker             }
10071*387f9dfdSAndroid Build Coastguard Worker 
printExpressionWas()10072*387f9dfdSAndroid Build Coastguard Worker             void printExpressionWas() {
10073*387f9dfdSAndroid Build Coastguard Worker                 if( result.hasExpression() ) {
10074*387f9dfdSAndroid Build Coastguard Worker                     stream << ";";
10075*387f9dfdSAndroid Build Coastguard Worker                     {
10076*387f9dfdSAndroid Build Coastguard Worker                         Colour colour( dimColour() );
10077*387f9dfdSAndroid Build Coastguard Worker                         stream << " expression was:";
10078*387f9dfdSAndroid Build Coastguard Worker                     }
10079*387f9dfdSAndroid Build Coastguard Worker                     printOriginalExpression();
10080*387f9dfdSAndroid Build Coastguard Worker                 }
10081*387f9dfdSAndroid Build Coastguard Worker             }
10082*387f9dfdSAndroid Build Coastguard Worker 
printOriginalExpression() const10083*387f9dfdSAndroid Build Coastguard Worker             void printOriginalExpression() const {
10084*387f9dfdSAndroid Build Coastguard Worker                 if( result.hasExpression() ) {
10085*387f9dfdSAndroid Build Coastguard Worker                     stream << " " << result.getExpression();
10086*387f9dfdSAndroid Build Coastguard Worker                 }
10087*387f9dfdSAndroid Build Coastguard Worker             }
10088*387f9dfdSAndroid Build Coastguard Worker 
printReconstructedExpression() const10089*387f9dfdSAndroid Build Coastguard Worker             void printReconstructedExpression() const {
10090*387f9dfdSAndroid Build Coastguard Worker                 if( result.hasExpandedExpression() ) {
10091*387f9dfdSAndroid Build Coastguard Worker                     {
10092*387f9dfdSAndroid Build Coastguard Worker                         Colour colour( dimColour() );
10093*387f9dfdSAndroid Build Coastguard Worker                         stream << " for: ";
10094*387f9dfdSAndroid Build Coastguard Worker                     }
10095*387f9dfdSAndroid Build Coastguard Worker                     stream << result.getExpandedExpression();
10096*387f9dfdSAndroid Build Coastguard Worker                 }
10097*387f9dfdSAndroid Build Coastguard Worker             }
10098*387f9dfdSAndroid Build Coastguard Worker 
printMessage()10099*387f9dfdSAndroid Build Coastguard Worker             void printMessage() {
10100*387f9dfdSAndroid Build Coastguard Worker                 if ( itMessage != messages.end() ) {
10101*387f9dfdSAndroid Build Coastguard Worker                     stream << " '" << itMessage->message << "'";
10102*387f9dfdSAndroid Build Coastguard Worker                     ++itMessage;
10103*387f9dfdSAndroid Build Coastguard Worker                 }
10104*387f9dfdSAndroid Build Coastguard Worker             }
10105*387f9dfdSAndroid Build Coastguard Worker 
printRemainingMessages(Colour::Code colour=dimColour ())10106*387f9dfdSAndroid Build Coastguard Worker             void printRemainingMessages( Colour::Code colour = dimColour() ) {
10107*387f9dfdSAndroid Build Coastguard Worker                 if ( itMessage == messages.end() )
10108*387f9dfdSAndroid Build Coastguard Worker                     return;
10109*387f9dfdSAndroid Build Coastguard Worker 
10110*387f9dfdSAndroid Build Coastguard Worker                 // using messages.end() directly yields compilation error:
10111*387f9dfdSAndroid Build Coastguard Worker                 std::vector<MessageInfo>::const_iterator itEnd = messages.end();
10112*387f9dfdSAndroid Build Coastguard Worker                 const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) );
10113*387f9dfdSAndroid Build Coastguard Worker 
10114*387f9dfdSAndroid Build Coastguard Worker                 {
10115*387f9dfdSAndroid Build Coastguard Worker                     Colour colourGuard( colour );
10116*387f9dfdSAndroid Build Coastguard Worker                     stream << " with " << pluralise( N, "message" ) << ":";
10117*387f9dfdSAndroid Build Coastguard Worker                 }
10118*387f9dfdSAndroid Build Coastguard Worker 
10119*387f9dfdSAndroid Build Coastguard Worker                 for(; itMessage != itEnd; ) {
10120*387f9dfdSAndroid Build Coastguard Worker                     // If this assertion is a warning ignore any INFO messages
10121*387f9dfdSAndroid Build Coastguard Worker                     if( printInfoMessages || itMessage->type != ResultWas::Info ) {
10122*387f9dfdSAndroid Build Coastguard Worker                         stream << " '" << itMessage->message << "'";
10123*387f9dfdSAndroid Build Coastguard Worker                         if ( ++itMessage != itEnd ) {
10124*387f9dfdSAndroid Build Coastguard Worker                             Colour colourGuard( dimColour() );
10125*387f9dfdSAndroid Build Coastguard Worker                             stream << " and";
10126*387f9dfdSAndroid Build Coastguard Worker                         }
10127*387f9dfdSAndroid Build Coastguard Worker                     }
10128*387f9dfdSAndroid Build Coastguard Worker                 }
10129*387f9dfdSAndroid Build Coastguard Worker             }
10130*387f9dfdSAndroid Build Coastguard Worker 
10131*387f9dfdSAndroid Build Coastguard Worker         private:
10132*387f9dfdSAndroid Build Coastguard Worker             std::ostream& stream;
10133*387f9dfdSAndroid Build Coastguard Worker             AssertionStats const& stats;
10134*387f9dfdSAndroid Build Coastguard Worker             AssertionResult const& result;
10135*387f9dfdSAndroid Build Coastguard Worker             std::vector<MessageInfo> messages;
10136*387f9dfdSAndroid Build Coastguard Worker             std::vector<MessageInfo>::const_iterator itMessage;
10137*387f9dfdSAndroid Build Coastguard Worker             bool printInfoMessages;
10138*387f9dfdSAndroid Build Coastguard Worker         };
10139*387f9dfdSAndroid Build Coastguard Worker 
10140*387f9dfdSAndroid Build Coastguard Worker         // Colour, message variants:
10141*387f9dfdSAndroid Build Coastguard Worker         // - white: No tests ran.
10142*387f9dfdSAndroid Build Coastguard Worker         // -   red: Failed [both/all] N test cases, failed [both/all] M assertions.
10143*387f9dfdSAndroid Build Coastguard Worker         // - white: Passed [both/all] N test cases (no assertions).
10144*387f9dfdSAndroid Build Coastguard Worker         // -   red: Failed N tests cases, failed M assertions.
10145*387f9dfdSAndroid Build Coastguard Worker         // - green: Passed [both/all] N tests cases with M assertions.
10146*387f9dfdSAndroid Build Coastguard Worker 
bothOrAllCatch::CompactReporter10147*387f9dfdSAndroid Build Coastguard Worker         std::string bothOrAll( std::size_t count ) const {
10148*387f9dfdSAndroid Build Coastguard Worker             return count == 1 ? "" : count == 2 ? "both " : "all " ;
10149*387f9dfdSAndroid Build Coastguard Worker         }
10150*387f9dfdSAndroid Build Coastguard Worker 
printTotalsCatch::CompactReporter10151*387f9dfdSAndroid Build Coastguard Worker         void printTotals( const Totals& totals ) const {
10152*387f9dfdSAndroid Build Coastguard Worker             if( totals.testCases.total() == 0 ) {
10153*387f9dfdSAndroid Build Coastguard Worker                 stream << "No tests ran.";
10154*387f9dfdSAndroid Build Coastguard Worker             }
10155*387f9dfdSAndroid Build Coastguard Worker             else if( totals.testCases.failed == totals.testCases.total() ) {
10156*387f9dfdSAndroid Build Coastguard Worker                 Colour colour( Colour::ResultError );
10157*387f9dfdSAndroid Build Coastguard Worker                 const std::string qualify_assertions_failed =
10158*387f9dfdSAndroid Build Coastguard Worker                     totals.assertions.failed == totals.assertions.total() ?
10159*387f9dfdSAndroid Build Coastguard Worker                         bothOrAll( totals.assertions.failed ) : "";
10160*387f9dfdSAndroid Build Coastguard Worker                 stream <<
10161*387f9dfdSAndroid Build Coastguard Worker                     "Failed " << bothOrAll( totals.testCases.failed )
10162*387f9dfdSAndroid Build Coastguard Worker                               << pluralise( totals.testCases.failed, "test case"  ) << ", "
10163*387f9dfdSAndroid Build Coastguard Worker                     "failed " << qualify_assertions_failed <<
10164*387f9dfdSAndroid Build Coastguard Worker                                  pluralise( totals.assertions.failed, "assertion" ) << ".";
10165*387f9dfdSAndroid Build Coastguard Worker             }
10166*387f9dfdSAndroid Build Coastguard Worker             else if( totals.assertions.total() == 0 ) {
10167*387f9dfdSAndroid Build Coastguard Worker                 stream <<
10168*387f9dfdSAndroid Build Coastguard Worker                     "Passed " << bothOrAll( totals.testCases.total() )
10169*387f9dfdSAndroid Build Coastguard Worker                               << pluralise( totals.testCases.total(), "test case" )
10170*387f9dfdSAndroid Build Coastguard Worker                               << " (no assertions).";
10171*387f9dfdSAndroid Build Coastguard Worker             }
10172*387f9dfdSAndroid Build Coastguard Worker             else if( totals.assertions.failed ) {
10173*387f9dfdSAndroid Build Coastguard Worker                 Colour colour( Colour::ResultError );
10174*387f9dfdSAndroid Build Coastguard Worker                 stream <<
10175*387f9dfdSAndroid Build Coastguard Worker                     "Failed " << pluralise( totals.testCases.failed, "test case"  ) << ", "
10176*387f9dfdSAndroid Build Coastguard Worker                     "failed " << pluralise( totals.assertions.failed, "assertion" ) << ".";
10177*387f9dfdSAndroid Build Coastguard Worker             }
10178*387f9dfdSAndroid Build Coastguard Worker             else {
10179*387f9dfdSAndroid Build Coastguard Worker                 Colour colour( Colour::ResultSuccess );
10180*387f9dfdSAndroid Build Coastguard Worker                 stream <<
10181*387f9dfdSAndroid Build Coastguard Worker                     "Passed " << bothOrAll( totals.testCases.passed )
10182*387f9dfdSAndroid Build Coastguard Worker                               << pluralise( totals.testCases.passed, "test case"  ) <<
10183*387f9dfdSAndroid Build Coastguard Worker                     " with "  << pluralise( totals.assertions.passed, "assertion" ) << ".";
10184*387f9dfdSAndroid Build Coastguard Worker             }
10185*387f9dfdSAndroid Build Coastguard Worker         }
10186*387f9dfdSAndroid Build Coastguard Worker     };
10187*387f9dfdSAndroid Build Coastguard Worker 
10188*387f9dfdSAndroid Build Coastguard Worker     INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter )
10189*387f9dfdSAndroid Build Coastguard Worker 
10190*387f9dfdSAndroid Build Coastguard Worker } // end namespace Catch
10191*387f9dfdSAndroid Build Coastguard Worker 
10192*387f9dfdSAndroid Build Coastguard Worker namespace Catch {
10193*387f9dfdSAndroid Build Coastguard Worker     // These are all here to avoid warnings about not having any out of line
10194*387f9dfdSAndroid Build Coastguard Worker     // virtual methods
~NonCopyable()10195*387f9dfdSAndroid Build Coastguard Worker     NonCopyable::~NonCopyable() {}
~IShared()10196*387f9dfdSAndroid Build Coastguard Worker     IShared::~IShared() {}
~IStream()10197*387f9dfdSAndroid Build Coastguard Worker     IStream::~IStream() CATCH_NOEXCEPT {}
~FileStream()10198*387f9dfdSAndroid Build Coastguard Worker     FileStream::~FileStream() CATCH_NOEXCEPT {}
~CoutStream()10199*387f9dfdSAndroid Build Coastguard Worker     CoutStream::~CoutStream() CATCH_NOEXCEPT {}
~DebugOutStream()10200*387f9dfdSAndroid Build Coastguard Worker     DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {}
~StreamBufBase()10201*387f9dfdSAndroid Build Coastguard Worker     StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
~IContext()10202*387f9dfdSAndroid Build Coastguard Worker     IContext::~IContext() {}
~IResultCapture()10203*387f9dfdSAndroid Build Coastguard Worker     IResultCapture::~IResultCapture() {}
~ITestCase()10204*387f9dfdSAndroid Build Coastguard Worker     ITestCase::~ITestCase() {}
~ITestCaseRegistry()10205*387f9dfdSAndroid Build Coastguard Worker     ITestCaseRegistry::~ITestCaseRegistry() {}
~IRegistryHub()10206*387f9dfdSAndroid Build Coastguard Worker     IRegistryHub::~IRegistryHub() {}
~IMutableRegistryHub()10207*387f9dfdSAndroid Build Coastguard Worker     IMutableRegistryHub::~IMutableRegistryHub() {}
~IExceptionTranslator()10208*387f9dfdSAndroid Build Coastguard Worker     IExceptionTranslator::~IExceptionTranslator() {}
~IExceptionTranslatorRegistry()10209*387f9dfdSAndroid Build Coastguard Worker     IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
~IReporter()10210*387f9dfdSAndroid Build Coastguard Worker     IReporter::~IReporter() {}
~IReporterFactory()10211*387f9dfdSAndroid Build Coastguard Worker     IReporterFactory::~IReporterFactory() {}
~IReporterRegistry()10212*387f9dfdSAndroid Build Coastguard Worker     IReporterRegistry::~IReporterRegistry() {}
~IStreamingReporter()10213*387f9dfdSAndroid Build Coastguard Worker     IStreamingReporter::~IStreamingReporter() {}
~AssertionStats()10214*387f9dfdSAndroid Build Coastguard Worker     AssertionStats::~AssertionStats() {}
~SectionStats()10215*387f9dfdSAndroid Build Coastguard Worker     SectionStats::~SectionStats() {}
~TestCaseStats()10216*387f9dfdSAndroid Build Coastguard Worker     TestCaseStats::~TestCaseStats() {}
~TestGroupStats()10217*387f9dfdSAndroid Build Coastguard Worker     TestGroupStats::~TestGroupStats() {}
~TestRunStats()10218*387f9dfdSAndroid Build Coastguard Worker     TestRunStats::~TestRunStats() {}
~SectionNode()10219*387f9dfdSAndroid Build Coastguard Worker     CumulativeReporterBase::SectionNode::~SectionNode() {}
~CumulativeReporterBase()10220*387f9dfdSAndroid Build Coastguard Worker     CumulativeReporterBase::~CumulativeReporterBase() {}
10221*387f9dfdSAndroid Build Coastguard Worker 
~StreamingReporterBase()10222*387f9dfdSAndroid Build Coastguard Worker     StreamingReporterBase::~StreamingReporterBase() {}
~ConsoleReporter()10223*387f9dfdSAndroid Build Coastguard Worker     ConsoleReporter::~ConsoleReporter() {}
~CompactReporter()10224*387f9dfdSAndroid Build Coastguard Worker     CompactReporter::~CompactReporter() {}
~IRunner()10225*387f9dfdSAndroid Build Coastguard Worker     IRunner::~IRunner() {}
~IMutableContext()10226*387f9dfdSAndroid Build Coastguard Worker     IMutableContext::~IMutableContext() {}
~IConfig()10227*387f9dfdSAndroid Build Coastguard Worker     IConfig::~IConfig() {}
~XmlReporter()10228*387f9dfdSAndroid Build Coastguard Worker     XmlReporter::~XmlReporter() {}
~JunitReporter()10229*387f9dfdSAndroid Build Coastguard Worker     JunitReporter::~JunitReporter() {}
~TestRegistry()10230*387f9dfdSAndroid Build Coastguard Worker     TestRegistry::~TestRegistry() {}
~FreeFunctionTestCase()10231*387f9dfdSAndroid Build Coastguard Worker     FreeFunctionTestCase::~FreeFunctionTestCase() {}
~IGeneratorInfo()10232*387f9dfdSAndroid Build Coastguard Worker     IGeneratorInfo::~IGeneratorInfo() {}
~IGeneratorsForTest()10233*387f9dfdSAndroid Build Coastguard Worker     IGeneratorsForTest::~IGeneratorsForTest() {}
~WildcardPattern()10234*387f9dfdSAndroid Build Coastguard Worker     WildcardPattern::~WildcardPattern() {}
~Pattern()10235*387f9dfdSAndroid Build Coastguard Worker     TestSpec::Pattern::~Pattern() {}
~NamePattern()10236*387f9dfdSAndroid Build Coastguard Worker     TestSpec::NamePattern::~NamePattern() {}
~TagPattern()10237*387f9dfdSAndroid Build Coastguard Worker     TestSpec::TagPattern::~TagPattern() {}
~ExcludedPattern()10238*387f9dfdSAndroid Build Coastguard Worker     TestSpec::ExcludedPattern::~ExcludedPattern() {}
10239*387f9dfdSAndroid Build Coastguard Worker 
~Equals()10240*387f9dfdSAndroid Build Coastguard Worker     Matchers::Impl::StdString::Equals::~Equals() {}
~Contains()10241*387f9dfdSAndroid Build Coastguard Worker     Matchers::Impl::StdString::Contains::~Contains() {}
~StartsWith()10242*387f9dfdSAndroid Build Coastguard Worker     Matchers::Impl::StdString::StartsWith::~StartsWith() {}
~EndsWith()10243*387f9dfdSAndroid Build Coastguard Worker     Matchers::Impl::StdString::EndsWith::~EndsWith() {}
10244*387f9dfdSAndroid Build Coastguard Worker 
dummy()10245*387f9dfdSAndroid Build Coastguard Worker     void Config::dummy() {}
10246*387f9dfdSAndroid Build Coastguard Worker 
10247*387f9dfdSAndroid Build Coastguard Worker     namespace TestCaseTracking {
~ITracker()10248*387f9dfdSAndroid Build Coastguard Worker         ITracker::~ITracker() {}
~TrackerBase()10249*387f9dfdSAndroid Build Coastguard Worker         TrackerBase::~TrackerBase() {}
~SectionTracker()10250*387f9dfdSAndroid Build Coastguard Worker         SectionTracker::~SectionTracker() {}
~IndexTracker()10251*387f9dfdSAndroid Build Coastguard Worker         IndexTracker::~IndexTracker() {}
10252*387f9dfdSAndroid Build Coastguard Worker     }
10253*387f9dfdSAndroid Build Coastguard Worker }
10254*387f9dfdSAndroid Build Coastguard Worker 
10255*387f9dfdSAndroid Build Coastguard Worker #ifdef __clang__
10256*387f9dfdSAndroid Build Coastguard Worker #pragma clang diagnostic pop
10257*387f9dfdSAndroid Build Coastguard Worker #endif
10258*387f9dfdSAndroid Build Coastguard Worker 
10259*387f9dfdSAndroid Build Coastguard Worker #endif
10260*387f9dfdSAndroid Build Coastguard Worker 
10261*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_MAIN
10262*387f9dfdSAndroid Build Coastguard Worker // #included from: internal/catch_default_main.hpp
10263*387f9dfdSAndroid Build Coastguard Worker #define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED
10264*387f9dfdSAndroid Build Coastguard Worker 
10265*387f9dfdSAndroid Build Coastguard Worker #ifndef __OBJC__
10266*387f9dfdSAndroid Build Coastguard Worker 
10267*387f9dfdSAndroid Build Coastguard Worker // Standard C/C++ main entry point
main(int argc,char * argv[])10268*387f9dfdSAndroid Build Coastguard Worker int main (int argc, char * argv[]) {
10269*387f9dfdSAndroid Build Coastguard Worker     return Catch::Session().run( argc, argv );
10270*387f9dfdSAndroid Build Coastguard Worker }
10271*387f9dfdSAndroid Build Coastguard Worker 
10272*387f9dfdSAndroid Build Coastguard Worker #else // __OBJC__
10273*387f9dfdSAndroid Build Coastguard Worker 
10274*387f9dfdSAndroid Build Coastguard Worker // Objective-C entry point
main(int argc,char * const argv[])10275*387f9dfdSAndroid Build Coastguard Worker int main (int argc, char * const argv[]) {
10276*387f9dfdSAndroid Build Coastguard Worker #if !CATCH_ARC_ENABLED
10277*387f9dfdSAndroid Build Coastguard Worker     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
10278*387f9dfdSAndroid Build Coastguard Worker #endif
10279*387f9dfdSAndroid Build Coastguard Worker 
10280*387f9dfdSAndroid Build Coastguard Worker     Catch::registerTestMethods();
10281*387f9dfdSAndroid Build Coastguard Worker     int result = Catch::Session().run( argc, (char* const*)argv );
10282*387f9dfdSAndroid Build Coastguard Worker 
10283*387f9dfdSAndroid Build Coastguard Worker #if !CATCH_ARC_ENABLED
10284*387f9dfdSAndroid Build Coastguard Worker     [pool drain];
10285*387f9dfdSAndroid Build Coastguard Worker #endif
10286*387f9dfdSAndroid Build Coastguard Worker 
10287*387f9dfdSAndroid Build Coastguard Worker     return result;
10288*387f9dfdSAndroid Build Coastguard Worker }
10289*387f9dfdSAndroid Build Coastguard Worker 
10290*387f9dfdSAndroid Build Coastguard Worker #endif // __OBJC__
10291*387f9dfdSAndroid Build Coastguard Worker 
10292*387f9dfdSAndroid Build Coastguard Worker #endif
10293*387f9dfdSAndroid Build Coastguard Worker 
10294*387f9dfdSAndroid Build Coastguard Worker #ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
10295*387f9dfdSAndroid Build Coastguard Worker #  undef CLARA_CONFIG_MAIN
10296*387f9dfdSAndroid Build Coastguard Worker #endif
10297*387f9dfdSAndroid Build Coastguard Worker 
10298*387f9dfdSAndroid Build Coastguard Worker //////
10299*387f9dfdSAndroid Build Coastguard Worker 
10300*387f9dfdSAndroid Build Coastguard Worker // If this config identifier is defined then all CATCH macros are prefixed with CATCH_
10301*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_PREFIX_ALL
10302*387f9dfdSAndroid Build Coastguard Worker 
10303*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" )
10304*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" )
10305*387f9dfdSAndroid Build Coastguard Worker 
10306*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "CATCH_REQUIRE_THROWS" )
10307*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" )
10308*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "CATCH_REQUIRE_THROWS_WITH" )
10309*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" )
10310*387f9dfdSAndroid Build Coastguard Worker 
10311*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" )
10312*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" )
10313*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" )
10314*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" )
10315*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" )
10316*387f9dfdSAndroid Build Coastguard Worker 
10317*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_THROWS( expr )  INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" )
10318*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" )
10319*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" )
10320*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
10321*387f9dfdSAndroid Build Coastguard Worker 
10322*387f9dfdSAndroid Build Coastguard Worker #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
10323*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
10324*387f9dfdSAndroid Build Coastguard Worker 
10325*387f9dfdSAndroid Build Coastguard Worker #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
10326*387f9dfdSAndroid Build Coastguard Worker #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg )
10327*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
10328*387f9dfdSAndroid Build Coastguard Worker #define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
10329*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
10330*387f9dfdSAndroid Build Coastguard Worker 
10331*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
10332*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
10333*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
10334*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
10335*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
10336*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
10337*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ )
10338*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ )
10339*387f9dfdSAndroid Build Coastguard Worker #else
10340*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
10341*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
10342*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
10343*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description )
10344*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
10345*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg )
10346*387f9dfdSAndroid Build Coastguard Worker     #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg )
10347*387f9dfdSAndroid Build Coastguard Worker #endif
10348*387f9dfdSAndroid Build Coastguard Worker #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
10349*387f9dfdSAndroid Build Coastguard Worker 
10350*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
10351*387f9dfdSAndroid Build Coastguard Worker #define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
10352*387f9dfdSAndroid Build Coastguard Worker 
10353*387f9dfdSAndroid Build Coastguard Worker #define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
10354*387f9dfdSAndroid Build Coastguard Worker 
10355*387f9dfdSAndroid Build Coastguard Worker // "BDD-style" convenience wrappers
10356*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
10357*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
10358*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
10359*387f9dfdSAndroid Build Coastguard Worker #else
10360*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags )
10361*387f9dfdSAndroid Build Coastguard Worker #define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
10362*387f9dfdSAndroid Build Coastguard Worker #endif
10363*387f9dfdSAndroid Build Coastguard Worker #define CATCH_GIVEN( desc )    CATCH_SECTION( std::string( "Given: ") + desc, "" )
10364*387f9dfdSAndroid Build Coastguard Worker #define CATCH_WHEN( desc )     CATCH_SECTION( std::string( " When: ") + desc, "" )
10365*387f9dfdSAndroid Build Coastguard Worker #define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( "  And: ") + desc, "" )
10366*387f9dfdSAndroid Build Coastguard Worker #define CATCH_THEN( desc )     CATCH_SECTION( std::string( " Then: ") + desc, "" )
10367*387f9dfdSAndroid Build Coastguard Worker #define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( "  And: ") + desc, "" )
10368*387f9dfdSAndroid Build Coastguard Worker 
10369*387f9dfdSAndroid Build Coastguard Worker // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
10370*387f9dfdSAndroid Build Coastguard Worker #else
10371*387f9dfdSAndroid Build Coastguard Worker 
10372*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" )
10373*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" )
10374*387f9dfdSAndroid Build Coastguard Worker 
10375*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "REQUIRE_THROWS" )
10376*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" )
10377*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "REQUIRE_THROWS_WITH" )
10378*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" )
10379*387f9dfdSAndroid Build Coastguard Worker 
10380*387f9dfdSAndroid Build Coastguard Worker #define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" )
10381*387f9dfdSAndroid Build Coastguard Worker #define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" )
10382*387f9dfdSAndroid Build Coastguard Worker #define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" )
10383*387f9dfdSAndroid Build Coastguard Worker #define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" )
10384*387f9dfdSAndroid Build Coastguard Worker #define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" )
10385*387f9dfdSAndroid Build Coastguard Worker 
10386*387f9dfdSAndroid Build Coastguard Worker #define CHECK_THROWS( expr )  INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "", "CHECK_THROWS" )
10387*387f9dfdSAndroid Build Coastguard Worker #define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" )
10388*387f9dfdSAndroid Build Coastguard Worker #define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CHECK_THROWS_WITH" )
10389*387f9dfdSAndroid Build Coastguard Worker #define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" )
10390*387f9dfdSAndroid Build Coastguard Worker 
10391*387f9dfdSAndroid Build Coastguard Worker #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
10392*387f9dfdSAndroid Build Coastguard Worker #define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
10393*387f9dfdSAndroid Build Coastguard Worker 
10394*387f9dfdSAndroid Build Coastguard Worker #define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
10395*387f9dfdSAndroid Build Coastguard Worker #define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg )
10396*387f9dfdSAndroid Build Coastguard Worker #define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
10397*387f9dfdSAndroid Build Coastguard Worker #define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
10398*387f9dfdSAndroid Build Coastguard Worker #define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
10399*387f9dfdSAndroid Build Coastguard Worker 
10400*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
10401*387f9dfdSAndroid Build Coastguard Worker     #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
10402*387f9dfdSAndroid Build Coastguard Worker     #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
10403*387f9dfdSAndroid Build Coastguard Worker     #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
10404*387f9dfdSAndroid Build Coastguard Worker     #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
10405*387f9dfdSAndroid Build Coastguard Worker     #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
10406*387f9dfdSAndroid Build Coastguard Worker     #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ )
10407*387f9dfdSAndroid Build Coastguard Worker     #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ )
10408*387f9dfdSAndroid Build Coastguard Worker #else
10409*387f9dfdSAndroid Build Coastguard Worker     #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
10410*387f9dfdSAndroid Build Coastguard Worker     #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
10411*387f9dfdSAndroid Build Coastguard Worker     #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
10412*387f9dfdSAndroid Build Coastguard Worker     #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description )
10413*387f9dfdSAndroid Build Coastguard Worker     #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
10414*387f9dfdSAndroid Build Coastguard Worker     #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg )
10415*387f9dfdSAndroid Build Coastguard Worker     #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg )
10416*387f9dfdSAndroid Build Coastguard Worker #endif
10417*387f9dfdSAndroid Build Coastguard Worker #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
10418*387f9dfdSAndroid Build Coastguard Worker 
10419*387f9dfdSAndroid Build Coastguard Worker #define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
10420*387f9dfdSAndroid Build Coastguard Worker #define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
10421*387f9dfdSAndroid Build Coastguard Worker 
10422*387f9dfdSAndroid Build Coastguard Worker #define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
10423*387f9dfdSAndroid Build Coastguard Worker 
10424*387f9dfdSAndroid Build Coastguard Worker #endif
10425*387f9dfdSAndroid Build Coastguard Worker 
10426*387f9dfdSAndroid Build Coastguard Worker #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
10427*387f9dfdSAndroid Build Coastguard Worker 
10428*387f9dfdSAndroid Build Coastguard Worker // "BDD-style" convenience wrappers
10429*387f9dfdSAndroid Build Coastguard Worker #ifdef CATCH_CONFIG_VARIADIC_MACROS
10430*387f9dfdSAndroid Build Coastguard Worker #define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
10431*387f9dfdSAndroid Build Coastguard Worker #define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
10432*387f9dfdSAndroid Build Coastguard Worker #else
10433*387f9dfdSAndroid Build Coastguard Worker #define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags )
10434*387f9dfdSAndroid Build Coastguard Worker #define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
10435*387f9dfdSAndroid Build Coastguard Worker #endif
10436*387f9dfdSAndroid Build Coastguard Worker #define GIVEN( desc )    SECTION( std::string("   Given: ") + desc, "" )
10437*387f9dfdSAndroid Build Coastguard Worker #define WHEN( desc )     SECTION( std::string("    When: ") + desc, "" )
10438*387f9dfdSAndroid Build Coastguard Worker #define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" )
10439*387f9dfdSAndroid Build Coastguard Worker #define THEN( desc )     SECTION( std::string("    Then: ") + desc, "" )
10440*387f9dfdSAndroid Build Coastguard Worker #define AND_THEN( desc ) SECTION( std::string("     And: ") + desc, "" )
10441*387f9dfdSAndroid Build Coastguard Worker 
10442*387f9dfdSAndroid Build Coastguard Worker using Catch::Detail::Approx;
10443*387f9dfdSAndroid Build Coastguard Worker 
10444*387f9dfdSAndroid Build Coastguard Worker #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
10445