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, ¤tTracker );
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, ¤tTracker, 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( §ionTracker );
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