Merge branch 'develop'
This commit is contained in:
		
						commit
						491972b6c2
					
				
					 42 changed files with 32078 additions and 41 deletions
				
			
		
							
								
								
									
										128
									
								
								SConstruct
									
										
									
									
									
								
							
							
						
						
									
										128
									
								
								SConstruct
									
										
									
									
									
								
							|  | @ -16,11 +16,9 @@ | |||
| CC = None | ||||
| CXX = None | ||||
| AS = None | ||||
| LINK = None | ||||
| LINK = 'clang++' | ||||
| 
 | ||||
| # Same as above but for default CFLAGS. These are appended to both CFLAGS and | ||||
| # CXXFLAGS. | ||||
| CFLAGS = '-Wall -Wextra -pedantic' | ||||
| CCFLAGS = ['-Wall', '-Wextra', '-pedantic'] | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
|  | @ -29,6 +27,7 @@ CFLAGS = '-Wall -Wextra -pedantic' | |||
| 
 | ||||
| import os | ||||
| import os.path | ||||
| import sys | ||||
| import SCons.Errors | ||||
| 
 | ||||
| 
 | ||||
|  | @ -75,17 +74,9 @@ set_toolchain_binary(common_env, 'CC', CC, ('clang', 'gcc')) | |||
| set_toolchain_binary(common_env, 'CXX', CXX, ('clang++', 'g++')) | ||||
| set_toolchain_binary(common_env, 'AS', AS) | ||||
| set_toolchain_binary(common_env, 'LINK', LINK) | ||||
| common_env.Append(CFLAGS='{} -std=c99'.format(CFLAGS)) | ||||
| common_env.Append(CXXFLAGS='{} -std=c++11'.format(CFLAGS)) | ||||
| 
 | ||||
| # Add color error messages for clang | ||||
| if 'clang' in common_env['CC']: | ||||
|     common_env.Append(CFLAGS=' -fcolor-diagnostics') | ||||
| if 'clang' in common_env['CXX']: | ||||
|     common_env.Append(CXXFLAGS=' -fcolor-diagnostics') | ||||
| 
 | ||||
| BUILD_CMDS = get_bool_argument(ARGUMENTS.get('BUILD_CMDS', False)) | ||||
| if not BUILD_CMDS: | ||||
| def verbose_build_cmds(): | ||||
|     def generate_comstr(action): | ||||
|         return '{:>25}: $TARGET'.format(action) | ||||
|     common_env['ARCOMSTR'] = generate_comstr('Archiving') | ||||
|  | @ -99,25 +90,52 @@ if not BUILD_CMDS: | |||
|     common_env['SHCXXCOMSTR'] = generate_comstr('Building (C++, Shared)') | ||||
|     common_env['SHLINKCOMSTR'] = generate_comstr('Linking (Shared)') | ||||
| 
 | ||||
| build_dir = Dir('#build') | ||||
| lib_dir = Dir('#lib') | ||||
| src_dir = Dir('#src') | ||||
| test_dir = Dir('#test') | ||||
| 
 | ||||
| def succinct_build_cmds(): | ||||
|     def generate_comstr(action): | ||||
|         return '  [{:^6}] $TARGET'.format(action) | ||||
|     common_env['ARCOMSTR'] = generate_comstr('AR') | ||||
|     common_env['ASCOMSTR'] = generate_comstr('AS') | ||||
|     common_env['ASPPCOMSTR'] = generate_comstr('AS') | ||||
|     common_env['CCCOMSTR'] = generate_comstr('CC') | ||||
|     common_env['CXXCOMSTR'] = generate_comstr('CXX') | ||||
|     common_env['LINKCOMSTR'] = generate_comstr('LINK') | ||||
|     common_env['RANLIBCOMSTR'] = generate_comstr('RANLIB') | ||||
|     common_env['SHCCCOMSTR'] = generate_comstr('SHCC') | ||||
|     common_env['SHCXXCOMSTR'] = generate_comstr('SHCXX') | ||||
|     common_env['SHLINKCOMSTR'] = generate_comstr('SHLINK') | ||||
| 
 | ||||
| 
 | ||||
| def create_env(name, src_dirs, appends=None): | ||||
|     output_dir = build_dir.Dir(name) | ||||
| BUILD_CMDS = get_bool_argument(ARGUMENTS.get('BUILD_CMDS', False)) | ||||
| if not BUILD_CMDS: | ||||
|     verbose_build_cmds() | ||||
| 
 | ||||
| # Separate environment for building libraries because they often don't use the | ||||
| # same CCFLAGS I do. | ||||
| lib_env = common_env.Clone() | ||||
| 
 | ||||
| common_env.Append(CCFLAGS=CCFLAGS) | ||||
| common_env.Append(CFLAGS=['-std=c99']) | ||||
| common_env.Append(CXXFLAGS=['-std=c++11']) | ||||
| 
 | ||||
| # Add color error messages for clang | ||||
| if sys.stdout.isatty(): | ||||
|     if 'clang' in common_env['CC'] or 'clang' in common_env['CXX']: | ||||
|         common_env.Append(CCFLAGS=['-fcolor-diagnostics']) | ||||
| 
 | ||||
| BUILD_DIR = Dir('#build') | ||||
| LIB_DIR = Dir('#lib') | ||||
| SRC_DIR = Dir('#src') | ||||
| TEST_DIR = Dir('#test') | ||||
| 
 | ||||
| 
 | ||||
| def create_env(name, appends=None): | ||||
|     output_dir = BUILD_DIR.Dir(name) | ||||
|     env = common_env.Clone() | ||||
|     # Standard env extensions. | ||||
|     env.Append(CPPPATH=[SRC_DIR]) | ||||
|     # Custom env stuff. | ||||
|     env['__name'] = name | ||||
|     env['__build_dir'] = output_dir | ||||
|     env['__src_dirs'] = [] | ||||
|     env['__output_dirs'] = [] | ||||
|     for d in src_dirs: | ||||
|         out_dir = output_dir.Dir(d.path) | ||||
|         env['__src_dirs'].append(d) | ||||
|         env['__output_dirs'].append(out_dir) | ||||
|         env.VariantDir(out_dir, d.path, duplicate=0) | ||||
|         env.Clean('.', out_dir) | ||||
|     if appends: | ||||
|         for k, v in appends.iteritems(): | ||||
|             if k.startswith('='): | ||||
|  | @ -127,22 +145,33 @@ def create_env(name, src_dirs, appends=None): | |||
|     return env | ||||
| 
 | ||||
| 
 | ||||
| debug_cflags = ' -O0 -g' | ||||
| debug_env = create_env('debug', [src_dir], { | ||||
|     'CPPDEFINES': ['DEBUG'], | ||||
|     'CFLAGS': debug_cflags, | ||||
|     'CXXFLAGS': debug_cflags, | ||||
| def do_sconscript(env, build_env, src_dir, out_dir): | ||||
|     sconscript = src_dir.File('SConscript') | ||||
|     print 'Reading {}'.format(sconscript) | ||||
|     env.SConscript(sconscript, | ||||
|                    {'env': build_env}, | ||||
|                    variant_dir=out_dir) | ||||
| 
 | ||||
| 
 | ||||
| debug_env = create_env('debug', { | ||||
|     'CPPDEFINES': ['NDEBUG'], | ||||
|     'CCFLAGS': ['-O0', '-g'], | ||||
| }) | ||||
| 
 | ||||
| release_cflags = ' -O2' | ||||
| release_env = create_env('release', [src_dir], { | ||||
|     'CPPDEFINES': ['RELEASE'], | ||||
|     'CFLAGS': release_cflags, | ||||
|     'CXXFLAGS': release_cflags, | ||||
| beta_env = create_env('beta', { | ||||
|     'CPPDEFINES': ['NDEBUG'], | ||||
|     'CCFLAGS': ['-O3', '-g'], | ||||
| }) | ||||
| 
 | ||||
| release_env = create_env('release', { | ||||
|     'CPPDEFINES': ['NRELEASE'], | ||||
|     'CCFLAGS': ['-O2'] | ||||
| }) | ||||
| 
 | ||||
| 
 | ||||
| modes = { | ||||
|     'debug': debug_env, | ||||
|     'beta': beta_env, | ||||
|     'release': release_env, | ||||
| } | ||||
| 
 | ||||
|  | @ -152,12 +181,29 @@ if mode: | |||
|     # If MODE=foo is specified, build only that mode. | ||||
|     build_modes.append(mode) | ||||
| else: | ||||
|     build_modes = modes.keys() | ||||
|     build_modes = ['debug'] | ||||
| 
 | ||||
| for mode in build_modes: | ||||
|     try: | ||||
|         env = modes[mode] | ||||
|     except KeyError: | ||||
|         print 'Skipping invalid mode: {}'.format(mode) | ||||
|     for d in env['__output_dirs']: | ||||
|         env.SConscript(d.File('SConscript'), {'env': env}) | ||||
|         break | ||||
| 
 | ||||
|     out_dir = BUILD_DIR.Dir(env['__name']) | ||||
| 
 | ||||
|     # Process all lib dirs. | ||||
|     for lib in os.listdir(LIB_DIR.abspath): | ||||
|         lib_out_dir = out_dir.Dir('lib').Dir(lib) | ||||
|         if not os.path.isdir(lib_out_dir.abspath): | ||||
|             continue | ||||
|         do_sconscript(env, lib_env, LIB_DIR.Dir(lib), lib_out_dir) | ||||
|         env.Append(LIBPATH=[lib_out_dir]) | ||||
| 
 | ||||
|     # Get source files. | ||||
|     src_out_dir = out_dir.Dir('src') | ||||
|     do_sconscript(env, env, SRC_DIR, src_out_dir) | ||||
|     env.Append(LIBPATH=[src_out_dir]) | ||||
| 
 | ||||
|     # Get test binaries. | ||||
|     do_sconscript(env, env, TEST_DIR, out_dir.Dir('test')) | ||||
|  |  | |||
							
								
								
									
										157
									
								
								lib/gtest/CHANGES
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								lib/gtest/CHANGES
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,157 @@ | |||
| Changes for 1.7.0: | ||||
| 
 | ||||
| * New feature: death tests are supported on OpenBSD and in iOS | ||||
|   simulator now. | ||||
| * New feature: Google Test now implements a protocol to allow | ||||
|   a test runner to detect that a test program has exited | ||||
|   prematurely and report it as a failure (before it would be | ||||
|   falsely reported as a success if the exit code is 0). | ||||
| * New feature: Test::RecordProperty() can now be used outside of the | ||||
|   lifespan of a test method, in which case it will be attributed to | ||||
|   the current test case or the test program in the XML report. | ||||
| * New feature (potentially breaking): --gtest_list_tests now prints | ||||
|   the type parameters and value parameters for each test. | ||||
| * Improvement: char pointers and char arrays are now escaped properly | ||||
|   in failure messages. | ||||
| * Improvement: failure summary in XML reports now includes file and | ||||
|   line information. | ||||
| * Improvement: the <testsuites> XML element now has a timestamp attribute. | ||||
| * Improvement: When --gtest_filter is specified, XML report now doesn't | ||||
|   contain information about tests that are filtered out. | ||||
| * Fixed the bug where long --gtest_filter flag values are truncated in | ||||
|   death tests. | ||||
| * Potentially breaking change: RUN_ALL_TESTS() is now implemented as a | ||||
|   function instead of a macro in order to work better with Clang. | ||||
| * Compatibility fixes with C++ 11 and various platforms. | ||||
| * Bug/warning fixes. | ||||
| 
 | ||||
| Changes for 1.6.0: | ||||
| 
 | ||||
| * New feature: ADD_FAILURE_AT() for reporting a test failure at the | ||||
|   given source location -- useful for writing testing utilities. | ||||
| * New feature: the universal value printer is moved from Google Mock | ||||
|   to Google Test. | ||||
| * New feature: type parameters and value parameters are reported in | ||||
|   the XML report now. | ||||
| * A gtest_disable_pthreads CMake option. | ||||
| * Colored output works in GNU Screen sessions now. | ||||
| * Parameters of value-parameterized tests are now printed in the | ||||
|   textual output. | ||||
| * Failures from ad hoc test assertions run before RUN_ALL_TESTS() are | ||||
|   now correctly reported. | ||||
| * Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to | ||||
|   ostream. | ||||
| * More complete handling of exceptions. | ||||
| * GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter | ||||
|   name is already used by another library. | ||||
| * --gtest_catch_exceptions is now true by default, allowing a test | ||||
|   program to continue after an exception is thrown. | ||||
| * Value-parameterized test fixtures can now derive from Test and | ||||
|   WithParamInterface<T> separately, easing conversion of legacy tests. | ||||
| * Death test messages are clearly marked to make them more | ||||
|   distinguishable from other messages. | ||||
| * Compatibility fixes for Android, Google Native Client, MinGW, HP UX, | ||||
|   PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear), | ||||
|   IBM XL C++ (Visual Age C++), and C++0x. | ||||
| * Bug fixes and implementation clean-ups. | ||||
| * Potentially incompatible changes: disables the harmful 'make install' | ||||
|   command in autotools. | ||||
| 
 | ||||
| Changes for 1.5.0: | ||||
| 
 | ||||
|  * New feature: assertions can be safely called in multiple threads | ||||
|    where the pthreads library is available. | ||||
|  * New feature: predicates used inside EXPECT_TRUE() and friends | ||||
|    can now generate custom failure messages. | ||||
|  * New feature: Google Test can now be compiled as a DLL. | ||||
|  * New feature: fused source files are included. | ||||
|  * New feature: prints help when encountering unrecognized Google Test flags. | ||||
|  * Experimental feature: CMake build script (requires CMake 2.6.4+). | ||||
|  * Experimental feature: the Pump script for meta programming. | ||||
|  * double values streamed to an assertion are printed with enough precision | ||||
|    to differentiate any two different values. | ||||
|  * Google Test now works on Solaris and AIX. | ||||
|  * Build and test script improvements. | ||||
|  * Bug fixes and implementation clean-ups. | ||||
| 
 | ||||
|  Potentially breaking changes: | ||||
| 
 | ||||
|  * Stopped supporting VC++ 7.1 with exceptions disabled. | ||||
|  * Dropped support for 'make install'. | ||||
| 
 | ||||
| Changes for 1.4.0: | ||||
| 
 | ||||
|  * New feature: the event listener API | ||||
|  * New feature: test shuffling | ||||
|  * New feature: the XML report format is closer to junitreport and can | ||||
|    be parsed by Hudson now. | ||||
|  * New feature: when a test runs under Visual Studio, its failures are | ||||
|    integrated in the IDE. | ||||
|  * New feature: /MD(d) versions of VC++ projects. | ||||
|  * New feature: elapsed time for the tests is printed by default. | ||||
|  * New feature: comes with a TR1 tuple implementation such that Boost | ||||
|    is no longer needed for Combine(). | ||||
|  * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends. | ||||
|  * New feature: the Xcode project can now produce static gtest | ||||
|    libraries in addition to a framework. | ||||
|  * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile, | ||||
|    Symbian, gcc, and C++Builder. | ||||
|  * Bug fixes and implementation clean-ups. | ||||
| 
 | ||||
| Changes for 1.3.0: | ||||
| 
 | ||||
|  * New feature: death tests on Windows, Cygwin, and Mac. | ||||
|  * New feature: ability to use Google Test assertions in other testing | ||||
|    frameworks. | ||||
|  * New feature: ability to run disabled test via | ||||
|    --gtest_also_run_disabled_tests. | ||||
|  * New feature: the --help flag for printing the usage. | ||||
|  * New feature: access to Google Test flag values in user code. | ||||
|  * New feature: a script that packs Google Test into one .h and one | ||||
|    .cc file for easy deployment. | ||||
|  * New feature: support for distributing test functions to multiple | ||||
|    machines (requires support from the test runner). | ||||
|  * Bug fixes and implementation clean-ups. | ||||
| 
 | ||||
| Changes for 1.2.1: | ||||
| 
 | ||||
|  * Compatibility fixes for Linux IA-64 and IBM z/OS. | ||||
|  * Added support for using Boost and other TR1 implementations. | ||||
|  * Changes to the build scripts to support upcoming release of Google C++ | ||||
|    Mocking Framework. | ||||
|  * Added Makefile to the distribution package. | ||||
|  * Improved build instructions in README. | ||||
| 
 | ||||
| Changes for 1.2.0: | ||||
| 
 | ||||
|  * New feature: value-parameterized tests. | ||||
|  * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS) | ||||
|    macros. | ||||
|  * Changed the XML report format to match JUnit/Ant's. | ||||
|  * Added tests to the Xcode project. | ||||
|  * Added scons/SConscript for building with SCons. | ||||
|  * Added src/gtest-all.cc for building Google Test from a single file. | ||||
|  * Fixed compatibility with Solaris and z/OS. | ||||
|  * Enabled running Python tests on systems with python 2.3 installed, | ||||
|    e.g. Mac OS X 10.4. | ||||
|  * Bug fixes. | ||||
| 
 | ||||
| Changes for 1.1.0: | ||||
| 
 | ||||
|  * New feature: type-parameterized tests. | ||||
|  * New feature: exception assertions. | ||||
|  * New feature: printing elapsed time of tests. | ||||
|  * Improved the robustness of death tests. | ||||
|  * Added an Xcode project and samples. | ||||
|  * Adjusted the output format on Windows to be understandable by Visual Studio. | ||||
|  * Minor bug fixes. | ||||
| 
 | ||||
| Changes for 1.0.1: | ||||
| 
 | ||||
|  * Added project files for Visual Studio 7.1. | ||||
|  * Fixed issues with compiling on Mac OS X. | ||||
|  * Fixed issues with compiling on Cygwin. | ||||
| 
 | ||||
| Changes for 1.0.0: | ||||
| 
 | ||||
|  * Initial Open Source release of Google Test | ||||
							
								
								
									
										37
									
								
								lib/gtest/CONTRIBUTORS
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/gtest/CONTRIBUTORS
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| # This file contains a list of people who've made non-trivial | ||||
| # contribution to the Google C++ Testing Framework project.  People | ||||
| # who commit code to the project are encouraged to add their names | ||||
| # here.  Please keep the list sorted by first names. | ||||
| 
 | ||||
| Ajay Joshi <jaj@google.com> | ||||
| Balázs Dán <balazs.dan@gmail.com> | ||||
| Bharat Mediratta <bharat@menalto.com> | ||||
| Chandler Carruth <chandlerc@google.com> | ||||
| Chris Prince <cprince@google.com> | ||||
| Chris Taylor <taylorc@google.com> | ||||
| Dan Egnor <egnor@google.com> | ||||
| Eric Roman <eroman@chromium.org> | ||||
| Hady Zalek <hady.zalek@gmail.com> | ||||
| Jeffrey Yasskin <jyasskin@google.com> | ||||
| Jói Sigurðsson <joi@google.com> | ||||
| Keir Mierle <mierle@gmail.com> | ||||
| Keith Ray <keith.ray@gmail.com> | ||||
| Kenton Varda <kenton@google.com> | ||||
| Manuel Klimek <klimek@google.com> | ||||
| Markus Heule <markus.heule@gmail.com> | ||||
| Mika Raento <mikie@iki.fi> | ||||
| Miklós Fazekas <mfazekas@szemafor.com> | ||||
| Pasi Valminen <pasi.valminen@gmail.com> | ||||
| Patrick Hanna <phanna@google.com> | ||||
| Patrick Riley <pfr@google.com> | ||||
| Peter Kaminski <piotrk@google.com> | ||||
| Preston Jackson <preston.a.jackson@gmail.com> | ||||
| Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com> | ||||
| Russ Cox <rsc@google.com> | ||||
| Russ Rufer <russ@pentad.com> | ||||
| Sean Mcafee <eefacm@gmail.com> | ||||
| Sigurður Ásgeirsson <siggi@google.com> | ||||
| Tracy Bialik <tracy@pentad.com> | ||||
| Vadim Berman <vadimb@google.com> | ||||
| Vlad Losev <vladl@google.com> | ||||
| Zhanyong Wan <wan@google.com> | ||||
							
								
								
									
										28
									
								
								lib/gtest/LICENSE
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								lib/gtest/LICENSE
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| Copyright 2008, Google Inc. | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| met: | ||||
| 
 | ||||
|     * Redistributions of source code must retain the above copyright | ||||
| notice, this list of conditions and the following disclaimer. | ||||
|     * Redistributions in binary form must reproduce the above | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|     * Neither the name of Google Inc. nor the names of its | ||||
| contributors may be used to endorse or promote products derived from | ||||
| this software without specific prior written permission. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
							
								
								
									
										435
									
								
								lib/gtest/README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										435
									
								
								lib/gtest/README
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,435 @@ | |||
| Google C++ Testing Framework | ||||
| ============================ | ||||
| 
 | ||||
| http://code.google.com/p/googletest/ | ||||
| 
 | ||||
| Overview | ||||
| -------- | ||||
| 
 | ||||
| Google's framework for writing C++ tests on a variety of platforms | ||||
| (Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the | ||||
| xUnit architecture.  Supports automatic test discovery, a rich set of | ||||
| assertions, user-defined assertions, death tests, fatal and non-fatal | ||||
| failures, various options for running the tests, and XML test report | ||||
| generation. | ||||
| 
 | ||||
| Please see the project page above for more information as well as the | ||||
| mailing list for questions, discussions, and development.  There is | ||||
| also an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please | ||||
| join us! | ||||
| 
 | ||||
| Requirements for End Users | ||||
| -------------------------- | ||||
| 
 | ||||
| Google Test is designed to have fairly minimal requirements to build | ||||
| and use with your projects, but there are some.  Currently, we support | ||||
| Linux, Windows, Mac OS X, and Cygwin.  We will also make our best | ||||
| effort to support other platforms (e.g. Solaris, AIX, and z/OS). | ||||
| However, since core members of the Google Test project have no access | ||||
| to these platforms, Google Test may have outstanding issues there.  If | ||||
| you notice any problems on your platform, please notify | ||||
| googletestframework@googlegroups.com.  Patches for fixing them are | ||||
| even more welcome! | ||||
| 
 | ||||
| ### Linux Requirements ### | ||||
| 
 | ||||
| These are the base requirements to build and use Google Test from a source | ||||
| package (as described below): | ||||
|   * GNU-compatible Make or gmake | ||||
|   * POSIX-standard shell | ||||
|   * POSIX(-2) Regular Expressions (regex.h) | ||||
|   * A C++98-standard-compliant compiler | ||||
| 
 | ||||
| ### Windows Requirements ### | ||||
| 
 | ||||
|   * Microsoft Visual C++ 7.1 or newer | ||||
| 
 | ||||
| ### Cygwin Requirements ### | ||||
| 
 | ||||
|   * Cygwin 1.5.25-14 or newer | ||||
| 
 | ||||
| ### Mac OS X Requirements ### | ||||
| 
 | ||||
|   * Mac OS X 10.4 Tiger or newer | ||||
|   * Developer Tools Installed | ||||
| 
 | ||||
| Also, you'll need CMake 2.6.4 or higher if you want to build the | ||||
| samples using the provided CMake script, regardless of the platform. | ||||
| 
 | ||||
| Requirements for Contributors | ||||
| ----------------------------- | ||||
| 
 | ||||
| We welcome patches.  If you plan to contribute a patch, you need to | ||||
| build Google Test and its own tests from an SVN checkout (described | ||||
| below), which has further requirements: | ||||
| 
 | ||||
|   * Python version 2.3 or newer (for running some of the tests and | ||||
|     re-generating certain source files from templates) | ||||
|   * CMake 2.6.4 or newer | ||||
| 
 | ||||
| Getting the Source | ||||
| ------------------ | ||||
| 
 | ||||
| There are two primary ways of getting Google Test's source code: you | ||||
| can download a stable source release in your preferred archive format, | ||||
| or directly check out the source from our Subversion (SVN) repositary. | ||||
| The SVN checkout requires a few extra steps and some extra software | ||||
| packages on your system, but lets you track the latest development and | ||||
| make patches much more easily, so we highly encourage it. | ||||
| 
 | ||||
| ### Source Package ### | ||||
| 
 | ||||
| Google Test is released in versioned source packages which can be | ||||
| downloaded from the download page [1].  Several different archive | ||||
| formats are provided, but the only difference is the tools used to | ||||
| manipulate them, and the size of the resulting file.  Download | ||||
| whichever you are most comfortable with. | ||||
| 
 | ||||
|   [1] http://code.google.com/p/googletest/downloads/list | ||||
| 
 | ||||
| Once the package is downloaded, expand it using whichever tools you | ||||
| prefer for that type.  This will result in a new directory with the | ||||
| name "gtest-X.Y.Z" which contains all of the source code.  Here are | ||||
| some examples on Linux: | ||||
| 
 | ||||
|   tar -xvzf gtest-X.Y.Z.tar.gz | ||||
|   tar -xvjf gtest-X.Y.Z.tar.bz2 | ||||
|   unzip gtest-X.Y.Z.zip | ||||
| 
 | ||||
| ### SVN Checkout ### | ||||
| 
 | ||||
| To check out the main branch (also known as the "trunk") of Google | ||||
| Test, run the following Subversion command: | ||||
| 
 | ||||
|   svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn | ||||
| 
 | ||||
| Setting up the Build | ||||
| -------------------- | ||||
| 
 | ||||
| To build Google Test and your tests that use it, you need to tell your | ||||
| build system where to find its headers and source files.  The exact | ||||
| way to do it depends on which build system you use, and is usually | ||||
| straightforward. | ||||
| 
 | ||||
| ### Generic Build Instructions ### | ||||
| 
 | ||||
| Suppose you put Google Test in directory ${GTEST_DIR}.  To build it, | ||||
| create a library build target (or a project as called by Visual Studio | ||||
| and Xcode) to compile | ||||
| 
 | ||||
|   ${GTEST_DIR}/src/gtest-all.cc | ||||
| 
 | ||||
| with ${GTEST_DIR}/include in the system header search path and ${GTEST_DIR} | ||||
| in the normal header search path.  Assuming a Linux-like system and gcc, | ||||
| something like the following will do: | ||||
| 
 | ||||
|   g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \ | ||||
|       -pthread -c ${GTEST_DIR}/src/gtest-all.cc | ||||
|   ar -rv libgtest.a gtest-all.o | ||||
| 
 | ||||
| (We need -pthread as Google Test uses threads.) | ||||
| 
 | ||||
| Next, you should compile your test source file with | ||||
| ${GTEST_DIR}/include in the system header search path, and link it | ||||
| with gtest and any other necessary libraries: | ||||
| 
 | ||||
|   g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \ | ||||
|       -o your_test | ||||
| 
 | ||||
| As an example, the make/ directory contains a Makefile that you can | ||||
| use to build Google Test on systems where GNU make is available | ||||
| (e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google | ||||
| Test's own tests.  Instead, it just builds the Google Test library and | ||||
| a sample test.  You can use it as a starting point for your own build | ||||
| script. | ||||
| 
 | ||||
| If the default settings are correct for your environment, the | ||||
| following commands should succeed: | ||||
| 
 | ||||
|   cd ${GTEST_DIR}/make | ||||
|   make | ||||
|   ./sample1_unittest | ||||
| 
 | ||||
| If you see errors, try to tweak the contents of make/Makefile to make | ||||
| them go away.  There are instructions in make/Makefile on how to do | ||||
| it. | ||||
| 
 | ||||
| ### Using CMake ### | ||||
| 
 | ||||
| Google Test comes with a CMake build script (CMakeLists.txt) that can | ||||
| be used on a wide range of platforms ("C" stands for cross-platofrm.). | ||||
| If you don't have CMake installed already, you can download it for | ||||
| free from http://www.cmake.org/. | ||||
| 
 | ||||
| CMake works by generating native makefiles or build projects that can | ||||
| be used in the compiler environment of your choice.  The typical | ||||
| workflow starts with: | ||||
| 
 | ||||
|   mkdir mybuild       # Create a directory to hold the build output. | ||||
|   cd mybuild | ||||
|   cmake ${GTEST_DIR}  # Generate native build scripts. | ||||
| 
 | ||||
| If you want to build Google Test's samples, you should replace the | ||||
| last command with | ||||
| 
 | ||||
|   cmake -Dgtest_build_samples=ON ${GTEST_DIR} | ||||
| 
 | ||||
| If you are on a *nix system, you should now see a Makefile in the | ||||
| current directory.  Just type 'make' to build gtest. | ||||
| 
 | ||||
| If you use Windows and have Vistual Studio installed, a gtest.sln file | ||||
| and several .vcproj files will be created.  You can then build them | ||||
| using Visual Studio. | ||||
| 
 | ||||
| On Mac OS X with Xcode installed, a .xcodeproj file will be generated. | ||||
| 
 | ||||
| ### Legacy Build Scripts ### | ||||
| 
 | ||||
| Before settling on CMake, we have been providing hand-maintained build | ||||
| projects/scripts for Visual Studio, Xcode, and Autotools.  While we | ||||
| continue to provide them for convenience, they are not actively | ||||
| maintained any more.  We highly recommend that you follow the | ||||
| instructions in the previous two sections to integrate Google Test | ||||
| with your existing build system. | ||||
| 
 | ||||
| If you still need to use the legacy build scripts, here's how: | ||||
| 
 | ||||
| The msvc\ folder contains two solutions with Visual C++ projects. | ||||
| Open the gtest.sln or gtest-md.sln file using Visual Studio, and you | ||||
| are ready to build Google Test the same way you build any Visual | ||||
| Studio project.  Files that have names ending with -md use DLL | ||||
| versions of Microsoft runtime libraries (the /MD or the /MDd compiler | ||||
| option).  Files without that suffix use static versions of the runtime | ||||
| libraries (the /MT or the /MTd option).  Please note that one must use | ||||
| the same option to compile both gtest and the test code.  If you use | ||||
| Visual Studio 2005 or above, we recommend the -md version as /MD is | ||||
| the default for new projects in these versions of Visual Studio. | ||||
| 
 | ||||
| On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using | ||||
| Xcode.  Build the "gtest" target.  The universal binary framework will | ||||
| end up in your selected build directory (selected in the Xcode | ||||
| "Preferences..." -> "Building" pane and defaults to xcode/build). | ||||
| Alternatively, at the command line, enter: | ||||
| 
 | ||||
|   xcodebuild | ||||
| 
 | ||||
| This will build the "Release" configuration of gtest.framework in your | ||||
| default build location.  See the "xcodebuild" man page for more | ||||
| information about building different configurations and building in | ||||
| different locations. | ||||
| 
 | ||||
| If you wish to use the Google Test Xcode project with Xcode 4.x and | ||||
| above, you need to either: | ||||
|  * update the SDK configuration options in xcode/Config/General.xconfig. | ||||
|    Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If | ||||
|    you choose this route you lose the ability to target earlier versions | ||||
|    of MacOS X. | ||||
|  * Install an SDK for an earlier version. This doesn't appear to be | ||||
|    supported by Apple, but has been reported to work | ||||
|    (http://stackoverflow.com/questions/5378518). | ||||
| 
 | ||||
| Tweaking Google Test | ||||
| -------------------- | ||||
| 
 | ||||
| Google Test can be used in diverse environments.  The default | ||||
| configuration may not work (or may not work well) out of the box in | ||||
| some environments.  However, you can easily tweak Google Test by | ||||
| defining control macros on the compiler command line.  Generally, | ||||
| these macros are named like GTEST_XYZ and you define them to either 1 | ||||
| or 0 to enable or disable a certain feature. | ||||
| 
 | ||||
| We list the most frequently used macros below.  For a complete list, | ||||
| see file include/gtest/internal/gtest-port.h. | ||||
| 
 | ||||
| ### Choosing a TR1 Tuple Library ### | ||||
| 
 | ||||
| Some Google Test features require the C++ Technical Report 1 (TR1) | ||||
| tuple library, which is not yet available with all compilers.  The | ||||
| good news is that Google Test implements a subset of TR1 tuple that's | ||||
| enough for its own need, and will automatically use this when the | ||||
| compiler doesn't provide TR1 tuple. | ||||
| 
 | ||||
| Usually you don't need to care about which tuple library Google Test | ||||
| uses.  However, if your project already uses TR1 tuple, you need to | ||||
| tell Google Test to use the same TR1 tuple library the rest of your | ||||
| project uses, or the two tuple implementations will clash.  To do | ||||
| that, add | ||||
| 
 | ||||
|   -DGTEST_USE_OWN_TR1_TUPLE=0 | ||||
| 
 | ||||
| to the compiler flags while compiling Google Test and your tests.  If | ||||
| you want to force Google Test to use its own tuple library, just add | ||||
| 
 | ||||
|   -DGTEST_USE_OWN_TR1_TUPLE=1 | ||||
| 
 | ||||
| to the compiler flags instead. | ||||
| 
 | ||||
| If you don't want Google Test to use tuple at all, add | ||||
| 
 | ||||
|   -DGTEST_HAS_TR1_TUPLE=0 | ||||
| 
 | ||||
| and all features using tuple will be disabled. | ||||
| 
 | ||||
| ### Multi-threaded Tests ### | ||||
| 
 | ||||
| Google Test is thread-safe where the pthread library is available. | ||||
| After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE | ||||
| macro to see whether this is the case (yes if the macro is #defined to | ||||
| 1, no if it's undefined.). | ||||
| 
 | ||||
| If Google Test doesn't correctly detect whether pthread is available | ||||
| in your environment, you can force it with | ||||
| 
 | ||||
|   -DGTEST_HAS_PTHREAD=1 | ||||
| 
 | ||||
| or | ||||
| 
 | ||||
|   -DGTEST_HAS_PTHREAD=0 | ||||
| 
 | ||||
| When Google Test uses pthread, you may need to add flags to your | ||||
| compiler and/or linker to select the pthread library, or you'll get | ||||
| link errors.  If you use the CMake script or the deprecated Autotools | ||||
| script, this is taken care of for you.  If you use your own build | ||||
| script, you'll need to read your compiler and linker's manual to | ||||
| figure out what flags to add. | ||||
| 
 | ||||
| ### As a Shared Library (DLL) ### | ||||
| 
 | ||||
| Google Test is compact, so most users can build and link it as a | ||||
| static library for the simplicity.  You can choose to use Google Test | ||||
| as a shared library (known as a DLL on Windows) if you prefer. | ||||
| 
 | ||||
| To compile *gtest* as a shared library, add | ||||
| 
 | ||||
|   -DGTEST_CREATE_SHARED_LIBRARY=1 | ||||
| 
 | ||||
| to the compiler flags.  You'll also need to tell the linker to produce | ||||
| a shared library instead - consult your linker's manual for how to do | ||||
| it. | ||||
| 
 | ||||
| To compile your *tests* that use the gtest shared library, add | ||||
| 
 | ||||
|   -DGTEST_LINKED_AS_SHARED_LIBRARY=1 | ||||
| 
 | ||||
| to the compiler flags. | ||||
| 
 | ||||
| Note: while the above steps aren't technically necessary today when | ||||
| using some compilers (e.g. GCC), they may become necessary in the | ||||
| future, if we decide to improve the speed of loading the library (see | ||||
| http://gcc.gnu.org/wiki/Visibility for details).  Therefore you are | ||||
| recommended to always add the above flags when using Google Test as a | ||||
| shared library.  Otherwise a future release of Google Test may break | ||||
| your build script. | ||||
| 
 | ||||
| ### Avoiding Macro Name Clashes ### | ||||
| 
 | ||||
| In C++, macros don't obey namespaces.  Therefore two libraries that | ||||
| both define a macro of the same name will clash if you #include both | ||||
| definitions.  In case a Google Test macro clashes with another | ||||
| library, you can force Google Test to rename its macro to avoid the | ||||
| conflict. | ||||
| 
 | ||||
| Specifically, if both Google Test and some other code define macro | ||||
| FOO, you can add | ||||
| 
 | ||||
|   -DGTEST_DONT_DEFINE_FOO=1 | ||||
| 
 | ||||
| to the compiler flags to tell Google Test to change the macro's name | ||||
| from FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST. | ||||
| For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write | ||||
| 
 | ||||
|   GTEST_TEST(SomeTest, DoesThis) { ... } | ||||
| 
 | ||||
| instead of | ||||
| 
 | ||||
|   TEST(SomeTest, DoesThis) { ... } | ||||
| 
 | ||||
| in order to define a test. | ||||
| 
 | ||||
| Upgrating from an Earlier Version | ||||
| --------------------------------- | ||||
| 
 | ||||
| We strive to keep Google Test releases backward compatible. | ||||
| Sometimes, though, we have to make some breaking changes for the | ||||
| users' long-term benefits.  This section describes what you'll need to | ||||
| do if you are upgrading from an earlier version of Google Test. | ||||
| 
 | ||||
| ### Upgrading from 1.3.0 or Earlier ### | ||||
| 
 | ||||
| You may need to explicitly enable or disable Google Test's own TR1 | ||||
| tuple library.  See the instructions in section "Choosing a TR1 Tuple | ||||
| Library". | ||||
| 
 | ||||
| ### Upgrading from 1.4.0 or Earlier ### | ||||
| 
 | ||||
| The Autotools build script (configure + make) is no longer officially | ||||
| supportted.  You are encouraged to migrate to your own build system or | ||||
| use CMake.  If you still need to use Autotools, you can find | ||||
| instructions in the README file from Google Test 1.4.0. | ||||
| 
 | ||||
| On platforms where the pthread library is available, Google Test uses | ||||
| it in order to be thread-safe.  See the "Multi-threaded Tests" section | ||||
| for what this means to your build script. | ||||
| 
 | ||||
| If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google | ||||
| Test will no longer compile.  This should affect very few people, as a | ||||
| large portion of STL (including <string>) doesn't compile in this mode | ||||
| anyway.  We decided to stop supporting it in order to greatly simplify | ||||
| Google Test's implementation. | ||||
| 
 | ||||
| Developing Google Test | ||||
| ---------------------- | ||||
| 
 | ||||
| This section discusses how to make your own changes to Google Test. | ||||
| 
 | ||||
| ### Testing Google Test Itself ### | ||||
| 
 | ||||
| To make sure your changes work as intended and don't break existing | ||||
| functionality, you'll want to compile and run Google Test's own tests. | ||||
| For that you can use CMake: | ||||
| 
 | ||||
|   mkdir mybuild | ||||
|   cd mybuild | ||||
|   cmake -Dgtest_build_tests=ON ${GTEST_DIR} | ||||
| 
 | ||||
| Make sure you have Python installed, as some of Google Test's tests | ||||
| are written in Python.  If the cmake command complains about not being | ||||
| able to find Python ("Could NOT find PythonInterp (missing: | ||||
| PYTHON_EXECUTABLE)"), try telling it explicitly where your Python | ||||
| executable can be found: | ||||
| 
 | ||||
|   cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR} | ||||
| 
 | ||||
| Next, you can build Google Test and all of its own tests.  On *nix, | ||||
| this is usually done by 'make'.  To run the tests, do | ||||
| 
 | ||||
|   make test | ||||
| 
 | ||||
| All tests should pass. | ||||
| 
 | ||||
| ### Regenerating Source Files ### | ||||
| 
 | ||||
| Some of Google Test's source files are generated from templates (not | ||||
| in the C++ sense) using a script.  A template file is named FOO.pump, | ||||
| where FOO is the name of the file it will generate.  For example, the | ||||
| file include/gtest/internal/gtest-type-util.h.pump is used to generate | ||||
| gtest-type-util.h in the same directory. | ||||
| 
 | ||||
| Normally you don't need to worry about regenerating the source files, | ||||
| unless you need to modify them.  In that case, you should modify the | ||||
| corresponding .pump files instead and run the pump.py Python script to | ||||
| regenerate them.  You can find pump.py in the scripts/ directory. | ||||
| Read the Pump manual [2] for how to use it. | ||||
| 
 | ||||
|   [2] http://code.google.com/p/googletest/wiki/PumpManual | ||||
| 
 | ||||
| ### Contributing a Patch ### | ||||
| 
 | ||||
| We welcome patches.  Please read the Google Test developer's guide [3] | ||||
| for how you can contribute.  In particular, make sure you have signed | ||||
| the Contributor License Agreement, or we won't be able to accept the | ||||
| patch. | ||||
| 
 | ||||
|   [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide | ||||
| 
 | ||||
| Happy testing! | ||||
							
								
								
									
										28
									
								
								lib/gtest/SConscript
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								lib/gtest/SConscript
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| # SConscript | ||||
| # vim: set ft=python: | ||||
| # | ||||
| # Eryn Wells <eryn@erynwells.me> | ||||
| 
 | ||||
| import os.path | ||||
| 
 | ||||
| Import('env') | ||||
| 
 | ||||
| 
 | ||||
| files = [ | ||||
|     'gtest-all.cc', | ||||
|     'gtest-death-test.cc', | ||||
|     'gtest-filepath.cc', | ||||
|     'gtest-port.cc', | ||||
|     'gtest-printers.cc', | ||||
|     'gtest-test-part.cc', | ||||
|     'gtest-typed-test.cc', | ||||
|     'gtest.cc', | ||||
| ] | ||||
| 
 | ||||
| objs = [] | ||||
| for f in files: | ||||
|     objs.append(env.Object(f)) | ||||
| 
 | ||||
| env.Append(CPPPATH=[Dir('include').srcnode()]) | ||||
| 
 | ||||
| gtest = env.Library('gtest', objs) | ||||
							
								
								
									
										48
									
								
								lib/gtest/gtest-all.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								lib/gtest/gtest-all.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: mheule@google.com (Markus Heule)
 | ||||
| //
 | ||||
| // Google C++ Testing Framework (Google Test)
 | ||||
| //
 | ||||
| // Sometimes it's desirable to build Google Test by compiling a single file.
 | ||||
| // This file serves this purpose.
 | ||||
| 
 | ||||
| // This line ensures that gtest.h can be compiled on its own, even
 | ||||
| // when it's fused.
 | ||||
| #include "gtest/gtest.h" | ||||
| 
 | ||||
| // The following lines pull in the real gtest *.cc files.
 | ||||
| #include "gtest.cc" | ||||
| #include "gtest-death-test.cc" | ||||
| #include "gtest-filepath.cc" | ||||
| #include "gtest-port.cc" | ||||
| #include "gtest-printers.cc" | ||||
| #include "gtest-test-part.cc" | ||||
| #include "gtest-typed-test.cc" | ||||
							
								
								
									
										1344
									
								
								lib/gtest/gtest-death-test.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1344
									
								
								lib/gtest/gtest-death-test.cc
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										382
									
								
								lib/gtest/gtest-filepath.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								lib/gtest/gtest-filepath.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,382 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Authors: keith.ray@gmail.com (Keith Ray)
 | ||||
| 
 | ||||
| #include "gtest/gtest-message.h" | ||||
| #include "gtest/internal/gtest-filepath.h" | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
| # include <windows.h> | ||||
| #elif GTEST_OS_WINDOWS | ||||
| # include <direct.h> | ||||
| # include <io.h> | ||||
| #elif GTEST_OS_SYMBIAN | ||||
| // Symbian OpenC has PATH_MAX in sys/syslimits.h
 | ||||
| # include <sys/syslimits.h> | ||||
| #else | ||||
| # include <limits.h> | ||||
| # include <climits>  // Some Linux distributions define PATH_MAX here.
 | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS | ||||
| # define GTEST_PATH_MAX_ _MAX_PATH | ||||
| #elif defined(PATH_MAX) | ||||
| # define GTEST_PATH_MAX_ PATH_MAX | ||||
| #elif defined(_XOPEN_PATH_MAX) | ||||
| # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX | ||||
| #else | ||||
| # define GTEST_PATH_MAX_ _POSIX_PATH_MAX | ||||
| #endif  // GTEST_OS_WINDOWS
 | ||||
| 
 | ||||
| #include "gtest/internal/gtest-string.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS | ||||
| // On Windows, '\\' is the standard path separator, but many tools and the
 | ||||
| // Windows API also accept '/' as an alternate path separator. Unless otherwise
 | ||||
| // noted, a file path can contain either kind of path separators, or a mixture
 | ||||
| // of them.
 | ||||
| const char kPathSeparator = '\\'; | ||||
| const char kAlternatePathSeparator = '/'; | ||||
| const char kPathSeparatorString[] = "\\"; | ||||
| const char kAlternatePathSeparatorString[] = "/"; | ||||
| # if GTEST_OS_WINDOWS_MOBILE | ||||
| // Windows CE doesn't have a current directory. You should not use
 | ||||
| // the current directory in tests on Windows CE, but this at least
 | ||||
| // provides a reasonable fallback.
 | ||||
| const char kCurrentDirectoryString[] = "\\"; | ||||
| // Windows CE doesn't define INVALID_FILE_ATTRIBUTES
 | ||||
| const DWORD kInvalidFileAttributes = 0xffffffff; | ||||
| # else | ||||
| const char kCurrentDirectoryString[] = ".\\"; | ||||
| # endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| #else | ||||
| const char kPathSeparator = '/'; | ||||
| const char kPathSeparatorString[] = "/"; | ||||
| const char kCurrentDirectoryString[] = "./"; | ||||
| #endif  // GTEST_OS_WINDOWS
 | ||||
| 
 | ||||
| // Returns whether the given character is a valid path separator.
 | ||||
| static bool IsPathSeparator(char c) { | ||||
| #if GTEST_HAS_ALT_PATH_SEP_ | ||||
|   return (c == kPathSeparator) || (c == kAlternatePathSeparator); | ||||
| #else | ||||
|   return c == kPathSeparator; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| // Returns the current working directory, or "" if unsuccessful.
 | ||||
| FilePath FilePath::GetCurrentDir() { | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
|   // Windows CE doesn't have a current directory, so we just return
 | ||||
|   // something reasonable.
 | ||||
|   return FilePath(kCurrentDirectoryString); | ||||
| #elif GTEST_OS_WINDOWS | ||||
|   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; | ||||
|   return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); | ||||
| #else | ||||
|   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; | ||||
|   return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| } | ||||
| 
 | ||||
| // Returns a copy of the FilePath with the case-insensitive extension removed.
 | ||||
| // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
 | ||||
| // FilePath("dir/file"). If a case-insensitive extension is not
 | ||||
| // found, returns a copy of the original FilePath.
 | ||||
| FilePath FilePath::RemoveExtension(const char* extension) const { | ||||
|   const std::string dot_extension = std::string(".") + extension; | ||||
|   if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) { | ||||
|     return FilePath(pathname_.substr( | ||||
|         0, pathname_.length() - dot_extension.length())); | ||||
|   } | ||||
|   return *this; | ||||
| } | ||||
| 
 | ||||
| // Returns a pointer to the last occurence of a valid path separator in
 | ||||
| // the FilePath. On Windows, for example, both '/' and '\' are valid path
 | ||||
| // separators. Returns NULL if no path separator was found.
 | ||||
| const char* FilePath::FindLastPathSeparator() const { | ||||
|   const char* const last_sep = strrchr(c_str(), kPathSeparator); | ||||
| #if GTEST_HAS_ALT_PATH_SEP_ | ||||
|   const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); | ||||
|   // Comparing two pointers of which only one is NULL is undefined.
 | ||||
|   if (last_alt_sep != NULL && | ||||
|       (last_sep == NULL || last_alt_sep > last_sep)) { | ||||
|     return last_alt_sep; | ||||
|   } | ||||
| #endif | ||||
|   return last_sep; | ||||
| } | ||||
| 
 | ||||
| // Returns a copy of the FilePath with the directory part removed.
 | ||||
| // Example: FilePath("path/to/file").RemoveDirectoryName() returns
 | ||||
| // FilePath("file"). If there is no directory part ("just_a_file"), it returns
 | ||||
| // the FilePath unmodified. If there is no file part ("just_a_dir/") it
 | ||||
| // returns an empty FilePath ("").
 | ||||
| // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | ||||
| FilePath FilePath::RemoveDirectoryName() const { | ||||
|   const char* const last_sep = FindLastPathSeparator(); | ||||
|   return last_sep ? FilePath(last_sep + 1) : *this; | ||||
| } | ||||
| 
 | ||||
| // RemoveFileName returns the directory path with the filename removed.
 | ||||
| // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
 | ||||
| // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
 | ||||
| // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
 | ||||
| // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
 | ||||
| // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | ||||
| FilePath FilePath::RemoveFileName() const { | ||||
|   const char* const last_sep = FindLastPathSeparator(); | ||||
|   std::string dir; | ||||
|   if (last_sep) { | ||||
|     dir = std::string(c_str(), last_sep + 1 - c_str()); | ||||
|   } else { | ||||
|     dir = kCurrentDirectoryString; | ||||
|   } | ||||
|   return FilePath(dir); | ||||
| } | ||||
| 
 | ||||
| // Helper functions for naming files in a directory for xml output.
 | ||||
| 
 | ||||
| // Given directory = "dir", base_name = "test", number = 0,
 | ||||
| // extension = "xml", returns "dir/test.xml". If number is greater
 | ||||
| // than zero (e.g., 12), returns "dir/test_12.xml".
 | ||||
| // On Windows platform, uses \ as the separator rather than /.
 | ||||
| FilePath FilePath::MakeFileName(const FilePath& directory, | ||||
|                                 const FilePath& base_name, | ||||
|                                 int number, | ||||
|                                 const char* extension) { | ||||
|   std::string file; | ||||
|   if (number == 0) { | ||||
|     file = base_name.string() + "." + extension; | ||||
|   } else { | ||||
|     file = base_name.string() + "_" + StreamableToString(number) | ||||
|         + "." + extension; | ||||
|   } | ||||
|   return ConcatPaths(directory, FilePath(file)); | ||||
| } | ||||
| 
 | ||||
| // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
 | ||||
| // On Windows, uses \ as the separator rather than /.
 | ||||
| FilePath FilePath::ConcatPaths(const FilePath& directory, | ||||
|                                const FilePath& relative_path) { | ||||
|   if (directory.IsEmpty()) | ||||
|     return relative_path; | ||||
|   const FilePath dir(directory.RemoveTrailingPathSeparator()); | ||||
|   return FilePath(dir.string() + kPathSeparator + relative_path.string()); | ||||
| } | ||||
| 
 | ||||
| // Returns true if pathname describes something findable in the file-system,
 | ||||
| // either a file, directory, or whatever.
 | ||||
| bool FilePath::FileOrDirectoryExists() const { | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
|   LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); | ||||
|   const DWORD attributes = GetFileAttributes(unicode); | ||||
|   delete [] unicode; | ||||
|   return attributes != kInvalidFileAttributes; | ||||
| #else | ||||
|   posix::StatStruct file_stat; | ||||
|   return posix::Stat(pathname_.c_str(), &file_stat) == 0; | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| } | ||||
| 
 | ||||
| // Returns true if pathname describes a directory in the file-system
 | ||||
| // that exists.
 | ||||
| bool FilePath::DirectoryExists() const { | ||||
|   bool result = false; | ||||
| #if GTEST_OS_WINDOWS | ||||
|   // Don't strip off trailing separator if path is a root directory on
 | ||||
|   // Windows (like "C:\\").
 | ||||
|   const FilePath& path(IsRootDirectory() ? *this : | ||||
|                                            RemoveTrailingPathSeparator()); | ||||
| #else | ||||
|   const FilePath& path(*this); | ||||
| #endif | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
|   LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); | ||||
|   const DWORD attributes = GetFileAttributes(unicode); | ||||
|   delete [] unicode; | ||||
|   if ((attributes != kInvalidFileAttributes) && | ||||
|       (attributes & FILE_ATTRIBUTE_DIRECTORY)) { | ||||
|     result = true; | ||||
|   } | ||||
| #else | ||||
|   posix::StatStruct file_stat; | ||||
|   result = posix::Stat(path.c_str(), &file_stat) == 0 && | ||||
|       posix::IsDir(file_stat); | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| 
 | ||||
|   return result; | ||||
| } | ||||
| 
 | ||||
| // Returns true if pathname describes a root directory. (Windows has one
 | ||||
| // root directory per disk drive.)
 | ||||
| bool FilePath::IsRootDirectory() const { | ||||
| #if GTEST_OS_WINDOWS | ||||
|   // TODO(wan@google.com): on Windows a network share like
 | ||||
|   // \\server\share can be a root directory, although it cannot be the
 | ||||
|   // current directory.  Handle this properly.
 | ||||
|   return pathname_.length() == 3 && IsAbsolutePath(); | ||||
| #else | ||||
|   return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| // Returns true if pathname describes an absolute path.
 | ||||
| bool FilePath::IsAbsolutePath() const { | ||||
|   const char* const name = pathname_.c_str(); | ||||
| #if GTEST_OS_WINDOWS | ||||
|   return pathname_.length() >= 3 && | ||||
|      ((name[0] >= 'a' && name[0] <= 'z') || | ||||
|       (name[0] >= 'A' && name[0] <= 'Z')) && | ||||
|      name[1] == ':' && | ||||
|      IsPathSeparator(name[2]); | ||||
| #else | ||||
|   return IsPathSeparator(name[0]); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| // Returns a pathname for a file that does not currently exist. The pathname
 | ||||
| // will be directory/base_name.extension or
 | ||||
| // directory/base_name_<number>.extension if directory/base_name.extension
 | ||||
| // already exists. The number will be incremented until a pathname is found
 | ||||
| // that does not already exist.
 | ||||
| // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
 | ||||
| // There could be a race condition if two or more processes are calling this
 | ||||
| // function at the same time -- they could both pick the same filename.
 | ||||
| FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, | ||||
|                                           const FilePath& base_name, | ||||
|                                           const char* extension) { | ||||
|   FilePath full_pathname; | ||||
|   int number = 0; | ||||
|   do { | ||||
|     full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); | ||||
|   } while (full_pathname.FileOrDirectoryExists()); | ||||
|   return full_pathname; | ||||
| } | ||||
| 
 | ||||
| // Returns true if FilePath ends with a path separator, which indicates that
 | ||||
| // it is intended to represent a directory. Returns false otherwise.
 | ||||
| // This does NOT check that a directory (or file) actually exists.
 | ||||
| bool FilePath::IsDirectory() const { | ||||
|   return !pathname_.empty() && | ||||
|          IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); | ||||
| } | ||||
| 
 | ||||
| // Create directories so that path exists. Returns true if successful or if
 | ||||
| // the directories already exist; returns false if unable to create directories
 | ||||
| // for any reason.
 | ||||
| bool FilePath::CreateDirectoriesRecursively() const { | ||||
|   if (!this->IsDirectory()) { | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   if (pathname_.length() == 0 || this->DirectoryExists()) { | ||||
|     return true; | ||||
|   } | ||||
| 
 | ||||
|   const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); | ||||
|   return parent.CreateDirectoriesRecursively() && this->CreateFolder(); | ||||
| } | ||||
| 
 | ||||
| // Create the directory so that path exists. Returns true if successful or
 | ||||
| // if the directory already exists; returns false if unable to create the
 | ||||
| // directory for any reason, including if the parent directory does not
 | ||||
| // exist. Not named "CreateDirectory" because that's a macro on Windows.
 | ||||
| bool FilePath::CreateFolder() const { | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
|   FilePath removed_sep(this->RemoveTrailingPathSeparator()); | ||||
|   LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); | ||||
|   int result = CreateDirectory(unicode, NULL) ? 0 : -1; | ||||
|   delete [] unicode; | ||||
| #elif GTEST_OS_WINDOWS | ||||
|   int result = _mkdir(pathname_.c_str()); | ||||
| #else | ||||
|   int result = mkdir(pathname_.c_str(), 0777); | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| 
 | ||||
|   if (result == -1) { | ||||
|     return this->DirectoryExists();  // An error is OK if the directory exists.
 | ||||
|   } | ||||
|   return true;  // No error.
 | ||||
| } | ||||
| 
 | ||||
| // If input name has a trailing separator character, remove it and return the
 | ||||
| // name, otherwise return the name string unmodified.
 | ||||
| // On Windows platform, uses \ as the separator, other platforms use /.
 | ||||
| FilePath FilePath::RemoveTrailingPathSeparator() const { | ||||
|   return IsDirectory() | ||||
|       ? FilePath(pathname_.substr(0, pathname_.length() - 1)) | ||||
|       : *this; | ||||
| } | ||||
| 
 | ||||
| // Removes any redundant separators that might be in the pathname.
 | ||||
| // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
 | ||||
| // redundancies that might be in a pathname involving "." or "..".
 | ||||
| // TODO(wan@google.com): handle Windows network shares (e.g. \\server\share).
 | ||||
| void FilePath::Normalize() { | ||||
|   if (pathname_.c_str() == NULL) { | ||||
|     pathname_ = ""; | ||||
|     return; | ||||
|   } | ||||
|   const char* src = pathname_.c_str(); | ||||
|   char* const dest = new char[pathname_.length() + 1]; | ||||
|   char* dest_ptr = dest; | ||||
|   memset(dest_ptr, 0, pathname_.length() + 1); | ||||
| 
 | ||||
|   while (*src != '\0') { | ||||
|     *dest_ptr = *src; | ||||
|     if (!IsPathSeparator(*src)) { | ||||
|       src++; | ||||
|     } else { | ||||
| #if GTEST_HAS_ALT_PATH_SEP_ | ||||
|       if (*dest_ptr == kAlternatePathSeparator) { | ||||
|         *dest_ptr = kPathSeparator; | ||||
|       } | ||||
| #endif | ||||
|       while (IsPathSeparator(*src)) | ||||
|         src++; | ||||
|     } | ||||
|     dest_ptr++; | ||||
|   } | ||||
|   *dest_ptr = '\0'; | ||||
|   pathname_ = dest; | ||||
|   delete[] dest; | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
							
								
								
									
										1218
									
								
								lib/gtest/gtest-internal-inl.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1218
									
								
								lib/gtest/gtest-internal-inl.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										805
									
								
								lib/gtest/gtest-port.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										805
									
								
								lib/gtest/gtest-port.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,805 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| #include <limits.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
| # include <windows.h>  // For TerminateProcess()
 | ||||
| #elif GTEST_OS_WINDOWS | ||||
| # include <io.h> | ||||
| # include <sys/stat.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| 
 | ||||
| #if GTEST_OS_MAC | ||||
| # include <mach/mach_init.h> | ||||
| # include <mach/task.h> | ||||
| # include <mach/vm_map.h> | ||||
| #endif  // GTEST_OS_MAC
 | ||||
| 
 | ||||
| #if GTEST_OS_QNX | ||||
| # include <devctl.h> | ||||
| # include <sys/procfs.h> | ||||
| #endif  // GTEST_OS_QNX
 | ||||
| 
 | ||||
| #include "gtest/gtest-spi.h" | ||||
| #include "gtest/gtest-message.h" | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| #include "gtest/internal/gtest-string.h" | ||||
| 
 | ||||
| // Indicates that this translation unit is part of Google Test's
 | ||||
| // implementation.  It must come before gtest-internal-inl.h is
 | ||||
| // included, or there will be a compiler error.  This trick is to
 | ||||
| // prevent a user from accidentally including gtest-internal-inl.h in
 | ||||
| // his code.
 | ||||
| #define GTEST_IMPLEMENTATION_ 1 | ||||
| #include "gtest-internal-inl.h" | ||||
| #undef GTEST_IMPLEMENTATION_ | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| #if defined(_MSC_VER) || defined(__BORLANDC__) | ||||
| // MSVC and C++Builder do not provide a definition of STDERR_FILENO.
 | ||||
| const int kStdOutFileno = 1; | ||||
| const int kStdErrFileno = 2; | ||||
| #else | ||||
| const int kStdOutFileno = STDOUT_FILENO; | ||||
| const int kStdErrFileno = STDERR_FILENO; | ||||
| #endif  // _MSC_VER
 | ||||
| 
 | ||||
| #if GTEST_OS_MAC | ||||
| 
 | ||||
| // Returns the number of threads running in the process, or 0 to indicate that
 | ||||
| // we cannot detect it.
 | ||||
| size_t GetThreadCount() { | ||||
|   const task_t task = mach_task_self(); | ||||
|   mach_msg_type_number_t thread_count; | ||||
|   thread_act_array_t thread_list; | ||||
|   const kern_return_t status = task_threads(task, &thread_list, &thread_count); | ||||
|   if (status == KERN_SUCCESS) { | ||||
|     // task_threads allocates resources in thread_list and we need to free them
 | ||||
|     // to avoid leaks.
 | ||||
|     vm_deallocate(task, | ||||
|                   reinterpret_cast<vm_address_t>(thread_list), | ||||
|                   sizeof(thread_t) * thread_count); | ||||
|     return static_cast<size_t>(thread_count); | ||||
|   } else { | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #elif GTEST_OS_QNX | ||||
| 
 | ||||
| // Returns the number of threads running in the process, or 0 to indicate that
 | ||||
| // we cannot detect it.
 | ||||
| size_t GetThreadCount() { | ||||
|   const int fd = open("/proc/self/as", O_RDONLY); | ||||
|   if (fd < 0) { | ||||
|     return 0; | ||||
|   } | ||||
|   procfs_info process_info; | ||||
|   const int status = | ||||
|       devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL); | ||||
|   close(fd); | ||||
|   if (status == EOK) { | ||||
|     return static_cast<size_t>(process_info.num_threads); | ||||
|   } else { | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| size_t GetThreadCount() { | ||||
|   // There's no portable way to detect the number of threads, so we just
 | ||||
|   // return 0 to indicate that we cannot detect it.
 | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| #endif  // GTEST_OS_MAC
 | ||||
| 
 | ||||
| #if GTEST_USES_POSIX_RE | ||||
| 
 | ||||
| // Implements RE.  Currently only needed for death tests.
 | ||||
| 
 | ||||
| RE::~RE() { | ||||
|   if (is_valid_) { | ||||
|     // regfree'ing an invalid regex might crash because the content
 | ||||
|     // of the regex is undefined. Since the regex's are essentially
 | ||||
|     // the same, one cannot be valid (or invalid) without the other
 | ||||
|     // being so too.
 | ||||
|     regfree(&partial_regex_); | ||||
|     regfree(&full_regex_); | ||||
|   } | ||||
|   free(const_cast<char*>(pattern_)); | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regular expression re matches the entire str.
 | ||||
| bool RE::FullMatch(const char* str, const RE& re) { | ||||
|   if (!re.is_valid_) return false; | ||||
| 
 | ||||
|   regmatch_t match; | ||||
|   return regexec(&re.full_regex_, str, 1, &match, 0) == 0; | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regular expression re matches a substring of str
 | ||||
| // (including str itself).
 | ||||
| bool RE::PartialMatch(const char* str, const RE& re) { | ||||
|   if (!re.is_valid_) return false; | ||||
| 
 | ||||
|   regmatch_t match; | ||||
|   return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; | ||||
| } | ||||
| 
 | ||||
| // Initializes an RE from its string representation.
 | ||||
| void RE::Init(const char* regex) { | ||||
|   pattern_ = posix::StrDup(regex); | ||||
| 
 | ||||
|   // Reserves enough bytes to hold the regular expression used for a
 | ||||
|   // full match.
 | ||||
|   const size_t full_regex_len = strlen(regex) + 10; | ||||
|   char* const full_pattern = new char[full_regex_len]; | ||||
| 
 | ||||
|   snprintf(full_pattern, full_regex_len, "^(%s)$", regex); | ||||
|   is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; | ||||
|   // We want to call regcomp(&partial_regex_, ...) even if the
 | ||||
|   // previous expression returns false.  Otherwise partial_regex_ may
 | ||||
|   // not be properly initialized can may cause trouble when it's
 | ||||
|   // freed.
 | ||||
|   //
 | ||||
|   // Some implementation of POSIX regex (e.g. on at least some
 | ||||
|   // versions of Cygwin) doesn't accept the empty string as a valid
 | ||||
|   // regex.  We change it to an equivalent form "()" to be safe.
 | ||||
|   if (is_valid_) { | ||||
|     const char* const partial_regex = (*regex == '\0') ? "()" : regex; | ||||
|     is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; | ||||
|   } | ||||
|   EXPECT_TRUE(is_valid_) | ||||
|       << "Regular expression \"" << regex | ||||
|       << "\" is not a valid POSIX Extended regular expression."; | ||||
| 
 | ||||
|   delete[] full_pattern; | ||||
| } | ||||
| 
 | ||||
| #elif GTEST_USES_SIMPLE_RE | ||||
| 
 | ||||
| // Returns true iff ch appears anywhere in str (excluding the
 | ||||
| // terminating '\0' character).
 | ||||
| bool IsInSet(char ch, const char* str) { | ||||
|   return ch != '\0' && strchr(str, ch) != NULL; | ||||
| } | ||||
| 
 | ||||
| // Returns true iff ch belongs to the given classification.  Unlike
 | ||||
| // similar functions in <ctype.h>, these aren't affected by the
 | ||||
| // current locale.
 | ||||
| bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } | ||||
| bool IsAsciiPunct(char ch) { | ||||
|   return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); | ||||
| } | ||||
| bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } | ||||
| bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } | ||||
| bool IsAsciiWordChar(char ch) { | ||||
|   return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || | ||||
|       ('0' <= ch && ch <= '9') || ch == '_'; | ||||
| } | ||||
| 
 | ||||
| // Returns true iff "\\c" is a supported escape sequence.
 | ||||
| bool IsValidEscape(char c) { | ||||
|   return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); | ||||
| } | ||||
| 
 | ||||
| // Returns true iff the given atom (specified by escaped and pattern)
 | ||||
| // matches ch.  The result is undefined if the atom is invalid.
 | ||||
| bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { | ||||
|   if (escaped) {  // "\\p" where p is pattern_char.
 | ||||
|     switch (pattern_char) { | ||||
|       case 'd': return IsAsciiDigit(ch); | ||||
|       case 'D': return !IsAsciiDigit(ch); | ||||
|       case 'f': return ch == '\f'; | ||||
|       case 'n': return ch == '\n'; | ||||
|       case 'r': return ch == '\r'; | ||||
|       case 's': return IsAsciiWhiteSpace(ch); | ||||
|       case 'S': return !IsAsciiWhiteSpace(ch); | ||||
|       case 't': return ch == '\t'; | ||||
|       case 'v': return ch == '\v'; | ||||
|       case 'w': return IsAsciiWordChar(ch); | ||||
|       case 'W': return !IsAsciiWordChar(ch); | ||||
|     } | ||||
|     return IsAsciiPunct(pattern_char) && pattern_char == ch; | ||||
|   } | ||||
| 
 | ||||
|   return (pattern_char == '.' && ch != '\n') || pattern_char == ch; | ||||
| } | ||||
| 
 | ||||
| // Helper function used by ValidateRegex() to format error messages.
 | ||||
| std::string FormatRegexSyntaxError(const char* regex, int index) { | ||||
|   return (Message() << "Syntax error at index " << index | ||||
|           << " in simple regular expression \"" << regex << "\": ").GetString(); | ||||
| } | ||||
| 
 | ||||
| // Generates non-fatal failures and returns false if regex is invalid;
 | ||||
| // otherwise returns true.
 | ||||
| bool ValidateRegex(const char* regex) { | ||||
|   if (regex == NULL) { | ||||
|     // TODO(wan@google.com): fix the source file location in the
 | ||||
|     // assertion failures to match where the regex is used in user
 | ||||
|     // code.
 | ||||
|     ADD_FAILURE() << "NULL is not a valid simple regular expression."; | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   bool is_valid = true; | ||||
| 
 | ||||
|   // True iff ?, *, or + can follow the previous atom.
 | ||||
|   bool prev_repeatable = false; | ||||
|   for (int i = 0; regex[i]; i++) { | ||||
|     if (regex[i] == '\\') {  // An escape sequence
 | ||||
|       i++; | ||||
|       if (regex[i] == '\0') { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) | ||||
|                       << "'\\' cannot appear at the end."; | ||||
|         return false; | ||||
|       } | ||||
| 
 | ||||
|       if (!IsValidEscape(regex[i])) { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) | ||||
|                       << "invalid escape sequence \"\\" << regex[i] << "\"."; | ||||
|         is_valid = false; | ||||
|       } | ||||
|       prev_repeatable = true; | ||||
|     } else {  // Not an escape sequence.
 | ||||
|       const char ch = regex[i]; | ||||
| 
 | ||||
|       if (ch == '^' && i > 0) { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i) | ||||
|                       << "'^' can only appear at the beginning."; | ||||
|         is_valid = false; | ||||
|       } else if (ch == '$' && regex[i + 1] != '\0') { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i) | ||||
|                       << "'$' can only appear at the end."; | ||||
|         is_valid = false; | ||||
|       } else if (IsInSet(ch, "()[]{}|")) { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i) | ||||
|                       << "'" << ch << "' is unsupported."; | ||||
|         is_valid = false; | ||||
|       } else if (IsRepeat(ch) && !prev_repeatable) { | ||||
|         ADD_FAILURE() << FormatRegexSyntaxError(regex, i) | ||||
|                       << "'" << ch << "' can only follow a repeatable token."; | ||||
|         is_valid = false; | ||||
|       } | ||||
| 
 | ||||
|       prev_repeatable = !IsInSet(ch, "^$?*+"); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return is_valid; | ||||
| } | ||||
| 
 | ||||
| // Matches a repeated regex atom followed by a valid simple regular
 | ||||
| // expression.  The regex atom is defined as c if escaped is false,
 | ||||
| // or \c otherwise.  repeat is the repetition meta character (?, *,
 | ||||
| // or +).  The behavior is undefined if str contains too many
 | ||||
| // characters to be indexable by size_t, in which case the test will
 | ||||
| // probably time out anyway.  We are fine with this limitation as
 | ||||
| // std::string has it too.
 | ||||
| bool MatchRepetitionAndRegexAtHead( | ||||
|     bool escaped, char c, char repeat, const char* regex, | ||||
|     const char* str) { | ||||
|   const size_t min_count = (repeat == '+') ? 1 : 0; | ||||
|   const size_t max_count = (repeat == '?') ? 1 : | ||||
|       static_cast<size_t>(-1) - 1; | ||||
|   // We cannot call numeric_limits::max() as it conflicts with the
 | ||||
|   // max() macro on Windows.
 | ||||
| 
 | ||||
|   for (size_t i = 0; i <= max_count; ++i) { | ||||
|     // We know that the atom matches each of the first i characters in str.
 | ||||
|     if (i >= min_count && MatchRegexAtHead(regex, str + i)) { | ||||
|       // We have enough matches at the head, and the tail matches too.
 | ||||
|       // Since we only care about *whether* the pattern matches str
 | ||||
|       // (as opposed to *how* it matches), there is no need to find a
 | ||||
|       // greedy match.
 | ||||
|       return true; | ||||
|     } | ||||
|     if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) | ||||
|       return false; | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regex matches a prefix of str.  regex must be a
 | ||||
| // valid simple regular expression and not start with "^", or the
 | ||||
| // result is undefined.
 | ||||
| bool MatchRegexAtHead(const char* regex, const char* str) { | ||||
|   if (*regex == '\0')  // An empty regex matches a prefix of anything.
 | ||||
|     return true; | ||||
| 
 | ||||
|   // "$" only matches the end of a string.  Note that regex being
 | ||||
|   // valid guarantees that there's nothing after "$" in it.
 | ||||
|   if (*regex == '$') | ||||
|     return *str == '\0'; | ||||
| 
 | ||||
|   // Is the first thing in regex an escape sequence?
 | ||||
|   const bool escaped = *regex == '\\'; | ||||
|   if (escaped) | ||||
|     ++regex; | ||||
|   if (IsRepeat(regex[1])) { | ||||
|     // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
 | ||||
|     // here's an indirect recursion.  It terminates as the regex gets
 | ||||
|     // shorter in each recursion.
 | ||||
|     return MatchRepetitionAndRegexAtHead( | ||||
|         escaped, regex[0], regex[1], regex + 2, str); | ||||
|   } else { | ||||
|     // regex isn't empty, isn't "$", and doesn't start with a
 | ||||
|     // repetition.  We match the first atom of regex with the first
 | ||||
|     // character of str and recurse.
 | ||||
|     return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && | ||||
|         MatchRegexAtHead(regex + 1, str + 1); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regex matches any substring of str.  regex must be
 | ||||
| // a valid simple regular expression, or the result is undefined.
 | ||||
| //
 | ||||
| // The algorithm is recursive, but the recursion depth doesn't exceed
 | ||||
| // the regex length, so we won't need to worry about running out of
 | ||||
| // stack space normally.  In rare cases the time complexity can be
 | ||||
| // exponential with respect to the regex length + the string length,
 | ||||
| // but usually it's must faster (often close to linear).
 | ||||
| bool MatchRegexAnywhere(const char* regex, const char* str) { | ||||
|   if (regex == NULL || str == NULL) | ||||
|     return false; | ||||
| 
 | ||||
|   if (*regex == '^') | ||||
|     return MatchRegexAtHead(regex + 1, str); | ||||
| 
 | ||||
|   // A successful match can be anywhere in str.
 | ||||
|   do { | ||||
|     if (MatchRegexAtHead(regex, str)) | ||||
|       return true; | ||||
|   } while (*str++ != '\0'); | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| // Implements the RE class.
 | ||||
| 
 | ||||
| RE::~RE() { | ||||
|   free(const_cast<char*>(pattern_)); | ||||
|   free(const_cast<char*>(full_pattern_)); | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regular expression re matches the entire str.
 | ||||
| bool RE::FullMatch(const char* str, const RE& re) { | ||||
|   return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); | ||||
| } | ||||
| 
 | ||||
| // Returns true iff regular expression re matches a substring of str
 | ||||
| // (including str itself).
 | ||||
| bool RE::PartialMatch(const char* str, const RE& re) { | ||||
|   return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); | ||||
| } | ||||
| 
 | ||||
| // Initializes an RE from its string representation.
 | ||||
| void RE::Init(const char* regex) { | ||||
|   pattern_ = full_pattern_ = NULL; | ||||
|   if (regex != NULL) { | ||||
|     pattern_ = posix::StrDup(regex); | ||||
|   } | ||||
| 
 | ||||
|   is_valid_ = ValidateRegex(regex); | ||||
|   if (!is_valid_) { | ||||
|     // No need to calculate the full pattern when the regex is invalid.
 | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   const size_t len = strlen(regex); | ||||
|   // Reserves enough bytes to hold the regular expression used for a
 | ||||
|   // full match: we need space to prepend a '^', append a '$', and
 | ||||
|   // terminate the string with '\0'.
 | ||||
|   char* buffer = static_cast<char*>(malloc(len + 3)); | ||||
|   full_pattern_ = buffer; | ||||
| 
 | ||||
|   if (*regex != '^') | ||||
|     *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
 | ||||
| 
 | ||||
|   // We don't use snprintf or strncpy, as they trigger a warning when
 | ||||
|   // compiled with VC++ 8.0.
 | ||||
|   memcpy(buffer, regex, len); | ||||
|   buffer += len; | ||||
| 
 | ||||
|   if (len == 0 || regex[len - 1] != '$') | ||||
|     *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
 | ||||
| 
 | ||||
|   *buffer = '\0'; | ||||
| } | ||||
| 
 | ||||
| #endif  // GTEST_USES_POSIX_RE
 | ||||
| 
 | ||||
| const char kUnknownFile[] = "unknown file"; | ||||
| 
 | ||||
| // Formats a source file path and a line number as they would appear
 | ||||
| // in an error message from the compiler used to compile this code.
 | ||||
| GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { | ||||
|   const std::string file_name(file == NULL ? kUnknownFile : file); | ||||
| 
 | ||||
|   if (line < 0) { | ||||
|     return file_name + ":"; | ||||
|   } | ||||
| #ifdef _MSC_VER | ||||
|   return file_name + "(" + StreamableToString(line) + "):"; | ||||
| #else | ||||
|   return file_name + ":" + StreamableToString(line) + ":"; | ||||
| #endif  // _MSC_VER
 | ||||
| } | ||||
| 
 | ||||
| // Formats a file location for compiler-independent XML output.
 | ||||
| // Although this function is not platform dependent, we put it next to
 | ||||
| // FormatFileLocation in order to contrast the two functions.
 | ||||
| // Note that FormatCompilerIndependentFileLocation() does NOT append colon
 | ||||
| // to the file location it produces, unlike FormatFileLocation().
 | ||||
| GTEST_API_ ::std::string FormatCompilerIndependentFileLocation( | ||||
|     const char* file, int line) { | ||||
|   const std::string file_name(file == NULL ? kUnknownFile : file); | ||||
| 
 | ||||
|   if (line < 0) | ||||
|     return file_name; | ||||
|   else | ||||
|     return file_name + ":" + StreamableToString(line); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) | ||||
|     : severity_(severity) { | ||||
|   const char* const marker = | ||||
|       severity == GTEST_INFO ?    "[  INFO ]" : | ||||
|       severity == GTEST_WARNING ? "[WARNING]" : | ||||
|       severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]"; | ||||
|   GetStream() << ::std::endl << marker << " " | ||||
|               << FormatFileLocation(file, line).c_str() << ": "; | ||||
| } | ||||
| 
 | ||||
| // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
 | ||||
| GTestLog::~GTestLog() { | ||||
|   GetStream() << ::std::endl; | ||||
|   if (severity_ == GTEST_FATAL) { | ||||
|     fflush(stderr); | ||||
|     posix::Abort(); | ||||
|   } | ||||
| } | ||||
| // Disable Microsoft deprecation warnings for POSIX functions called from
 | ||||
| // this class (creat, dup, dup2, and close)
 | ||||
| #ifdef _MSC_VER | ||||
| # pragma warning(push) | ||||
| # pragma warning(disable: 4996) | ||||
| #endif  // _MSC_VER
 | ||||
| 
 | ||||
| #if GTEST_HAS_STREAM_REDIRECTION | ||||
| 
 | ||||
| // Object that captures an output stream (stdout/stderr).
 | ||||
| class CapturedStream { | ||||
|  public: | ||||
|   // The ctor redirects the stream to a temporary file.
 | ||||
|   explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { | ||||
| # if GTEST_OS_WINDOWS | ||||
|     char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
 | ||||
|     char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
 | ||||
| 
 | ||||
|     ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); | ||||
|     const UINT success = ::GetTempFileNameA(temp_dir_path, | ||||
|                                             "gtest_redir", | ||||
|                                             0,  // Generate unique file name.
 | ||||
|                                             temp_file_path); | ||||
|     GTEST_CHECK_(success != 0) | ||||
|         << "Unable to create a temporary file in " << temp_dir_path; | ||||
|     const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); | ||||
|     GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " | ||||
|                                     << temp_file_path; | ||||
|     filename_ = temp_file_path; | ||||
| # else | ||||
|     // There's no guarantee that a test has write access to the current
 | ||||
|     // directory, so we create the temporary file in the /tmp directory
 | ||||
|     // instead. We use /tmp on most systems, and /sdcard on Android.
 | ||||
|     // That's because Android doesn't have /tmp.
 | ||||
| #  if GTEST_OS_LINUX_ANDROID | ||||
|     // Note: Android applications are expected to call the framework's
 | ||||
|     // Context.getExternalStorageDirectory() method through JNI to get
 | ||||
|     // the location of the world-writable SD Card directory. However,
 | ||||
|     // this requires a Context handle, which cannot be retrieved
 | ||||
|     // globally from native code. Doing so also precludes running the
 | ||||
|     // code as part of a regular standalone executable, which doesn't
 | ||||
|     // run in a Dalvik process (e.g. when running it through 'adb shell').
 | ||||
|     //
 | ||||
|     // The location /sdcard is directly accessible from native code
 | ||||
|     // and is the only location (unofficially) supported by the Android
 | ||||
|     // team. It's generally a symlink to the real SD Card mount point
 | ||||
|     // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
 | ||||
|     // other OEM-customized locations. Never rely on these, and always
 | ||||
|     // use /sdcard.
 | ||||
|     char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX"; | ||||
| #  else | ||||
|     char name_template[] = "/tmp/captured_stream.XXXXXX"; | ||||
| #  endif  // GTEST_OS_LINUX_ANDROID
 | ||||
|     const int captured_fd = mkstemp(name_template); | ||||
|     filename_ = name_template; | ||||
| # endif  // GTEST_OS_WINDOWS
 | ||||
|     fflush(NULL); | ||||
|     dup2(captured_fd, fd_); | ||||
|     close(captured_fd); | ||||
|   } | ||||
| 
 | ||||
|   ~CapturedStream() { | ||||
|     remove(filename_.c_str()); | ||||
|   } | ||||
| 
 | ||||
|   std::string GetCapturedString() { | ||||
|     if (uncaptured_fd_ != -1) { | ||||
|       // Restores the original stream.
 | ||||
|       fflush(NULL); | ||||
|       dup2(uncaptured_fd_, fd_); | ||||
|       close(uncaptured_fd_); | ||||
|       uncaptured_fd_ = -1; | ||||
|     } | ||||
| 
 | ||||
|     FILE* const file = posix::FOpen(filename_.c_str(), "r"); | ||||
|     const std::string content = ReadEntireFile(file); | ||||
|     posix::FClose(file); | ||||
|     return content; | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   // Reads the entire content of a file as an std::string.
 | ||||
|   static std::string ReadEntireFile(FILE* file); | ||||
| 
 | ||||
|   // Returns the size (in bytes) of a file.
 | ||||
|   static size_t GetFileSize(FILE* file); | ||||
| 
 | ||||
|   const int fd_;  // A stream to capture.
 | ||||
|   int uncaptured_fd_; | ||||
|   // Name of the temporary file holding the stderr output.
 | ||||
|   ::std::string filename_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); | ||||
| }; | ||||
| 
 | ||||
| // Returns the size (in bytes) of a file.
 | ||||
| size_t CapturedStream::GetFileSize(FILE* file) { | ||||
|   fseek(file, 0, SEEK_END); | ||||
|   return static_cast<size_t>(ftell(file)); | ||||
| } | ||||
| 
 | ||||
| // Reads the entire content of a file as a string.
 | ||||
| std::string CapturedStream::ReadEntireFile(FILE* file) { | ||||
|   const size_t file_size = GetFileSize(file); | ||||
|   char* const buffer = new char[file_size]; | ||||
| 
 | ||||
|   size_t bytes_last_read = 0;  // # of bytes read in the last fread()
 | ||||
|   size_t bytes_read = 0;       // # of bytes read so far
 | ||||
| 
 | ||||
|   fseek(file, 0, SEEK_SET); | ||||
| 
 | ||||
|   // Keeps reading the file until we cannot read further or the
 | ||||
|   // pre-determined file size is reached.
 | ||||
|   do { | ||||
|     bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); | ||||
|     bytes_read += bytes_last_read; | ||||
|   } while (bytes_last_read > 0 && bytes_read < file_size); | ||||
| 
 | ||||
|   const std::string content(buffer, bytes_read); | ||||
|   delete[] buffer; | ||||
| 
 | ||||
|   return content; | ||||
| } | ||||
| 
 | ||||
| # ifdef _MSC_VER | ||||
| #  pragma warning(pop) | ||||
| # endif  // _MSC_VER
 | ||||
| 
 | ||||
| static CapturedStream* g_captured_stderr = NULL; | ||||
| static CapturedStream* g_captured_stdout = NULL; | ||||
| 
 | ||||
| // Starts capturing an output stream (stdout/stderr).
 | ||||
| void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { | ||||
|   if (*stream != NULL) { | ||||
|     GTEST_LOG_(FATAL) << "Only one " << stream_name | ||||
|                       << " capturer can exist at a time."; | ||||
|   } | ||||
|   *stream = new CapturedStream(fd); | ||||
| } | ||||
| 
 | ||||
| // Stops capturing the output stream and returns the captured string.
 | ||||
| std::string GetCapturedStream(CapturedStream** captured_stream) { | ||||
|   const std::string content = (*captured_stream)->GetCapturedString(); | ||||
| 
 | ||||
|   delete *captured_stream; | ||||
|   *captured_stream = NULL; | ||||
| 
 | ||||
|   return content; | ||||
| } | ||||
| 
 | ||||
| // Starts capturing stdout.
 | ||||
| void CaptureStdout() { | ||||
|   CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); | ||||
| } | ||||
| 
 | ||||
| // Starts capturing stderr.
 | ||||
| void CaptureStderr() { | ||||
|   CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); | ||||
| } | ||||
| 
 | ||||
| // Stops capturing stdout and returns the captured string.
 | ||||
| std::string GetCapturedStdout() { | ||||
|   return GetCapturedStream(&g_captured_stdout); | ||||
| } | ||||
| 
 | ||||
| // Stops capturing stderr and returns the captured string.
 | ||||
| std::string GetCapturedStderr() { | ||||
|   return GetCapturedStream(&g_captured_stderr); | ||||
| } | ||||
| 
 | ||||
| #endif  // GTEST_HAS_STREAM_REDIRECTION
 | ||||
| 
 | ||||
| #if GTEST_HAS_DEATH_TEST | ||||
| 
 | ||||
| // A copy of all command line arguments.  Set by InitGoogleTest().
 | ||||
| ::std::vector<testing::internal::string> g_argvs; | ||||
| 
 | ||||
| static const ::std::vector<testing::internal::string>* g_injected_test_argvs = | ||||
|                                         NULL;  // Owned.
 | ||||
| 
 | ||||
| void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) { | ||||
|   if (g_injected_test_argvs != argvs) | ||||
|     delete g_injected_test_argvs; | ||||
|   g_injected_test_argvs = argvs; | ||||
| } | ||||
| 
 | ||||
| const ::std::vector<testing::internal::string>& GetInjectableArgvs() { | ||||
|   if (g_injected_test_argvs != NULL) { | ||||
|     return *g_injected_test_argvs; | ||||
|   } | ||||
|   return g_argvs; | ||||
| } | ||||
| #endif  // GTEST_HAS_DEATH_TEST
 | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
| namespace posix { | ||||
| void Abort() { | ||||
|   DebugBreak(); | ||||
|   TerminateProcess(GetCurrentProcess(), 1); | ||||
| } | ||||
| }  // namespace posix
 | ||||
| #endif  // GTEST_OS_WINDOWS_MOBILE
 | ||||
| 
 | ||||
| // Returns the name of the environment variable corresponding to the
 | ||||
| // given flag.  For example, FlagToEnvVar("foo") will return
 | ||||
| // "GTEST_FOO" in the open-source version.
 | ||||
| static std::string FlagToEnvVar(const char* flag) { | ||||
|   const std::string full_flag = | ||||
|       (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); | ||||
| 
 | ||||
|   Message env_var; | ||||
|   for (size_t i = 0; i != full_flag.length(); i++) { | ||||
|     env_var << ToUpper(full_flag.c_str()[i]); | ||||
|   } | ||||
| 
 | ||||
|   return env_var.GetString(); | ||||
| } | ||||
| 
 | ||||
| // Parses 'str' for a 32-bit signed integer.  If successful, writes
 | ||||
| // the result to *value and returns true; otherwise leaves *value
 | ||||
| // unchanged and returns false.
 | ||||
| bool ParseInt32(const Message& src_text, const char* str, Int32* value) { | ||||
|   // Parses the environment variable as a decimal integer.
 | ||||
|   char* end = NULL; | ||||
|   const long long_value = strtol(str, &end, 10);  // NOLINT
 | ||||
| 
 | ||||
|   // Has strtol() consumed all characters in the string?
 | ||||
|   if (*end != '\0') { | ||||
|     // No - an invalid character was encountered.
 | ||||
|     Message msg; | ||||
|     msg << "WARNING: " << src_text | ||||
|         << " is expected to be a 32-bit integer, but actually" | ||||
|         << " has value \"" << str << "\".\n"; | ||||
|     printf("%s", msg.GetString().c_str()); | ||||
|     fflush(stdout); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   // Is the parsed value in the range of an Int32?
 | ||||
|   const Int32 result = static_cast<Int32>(long_value); | ||||
|   if (long_value == LONG_MAX || long_value == LONG_MIN || | ||||
|       // The parsed value overflows as a long.  (strtol() returns
 | ||||
|       // LONG_MAX or LONG_MIN when the input overflows.)
 | ||||
|       result != long_value | ||||
|       // The parsed value overflows as an Int32.
 | ||||
|       ) { | ||||
|     Message msg; | ||||
|     msg << "WARNING: " << src_text | ||||
|         << " is expected to be a 32-bit integer, but actually" | ||||
|         << " has value " << str << ", which overflows.\n"; | ||||
|     printf("%s", msg.GetString().c_str()); | ||||
|     fflush(stdout); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   *value = result; | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| // Reads and returns the Boolean environment variable corresponding to
 | ||||
| // the given flag; if it's not set, returns default_value.
 | ||||
| //
 | ||||
| // The value is considered true iff it's not "0".
 | ||||
| bool BoolFromGTestEnv(const char* flag, bool default_value) { | ||||
|   const std::string env_var = FlagToEnvVar(flag); | ||||
|   const char* const string_value = posix::GetEnv(env_var.c_str()); | ||||
|   return string_value == NULL ? | ||||
|       default_value : strcmp(string_value, "0") != 0; | ||||
| } | ||||
| 
 | ||||
| // Reads and returns a 32-bit integer stored in the environment
 | ||||
| // variable corresponding to the given flag; if it isn't set or
 | ||||
| // doesn't represent a valid 32-bit integer, returns default_value.
 | ||||
| Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { | ||||
|   const std::string env_var = FlagToEnvVar(flag); | ||||
|   const char* const string_value = posix::GetEnv(env_var.c_str()); | ||||
|   if (string_value == NULL) { | ||||
|     // The environment variable is not set.
 | ||||
|     return default_value; | ||||
|   } | ||||
| 
 | ||||
|   Int32 result = default_value; | ||||
|   if (!ParseInt32(Message() << "Environment variable " << env_var, | ||||
|                   string_value, &result)) { | ||||
|     printf("The default value %s is used.\n", | ||||
|            (Message() << default_value).GetString().c_str()); | ||||
|     fflush(stdout); | ||||
|     return default_value; | ||||
|   } | ||||
| 
 | ||||
|   return result; | ||||
| } | ||||
| 
 | ||||
| // Reads and returns the string environment variable corresponding to
 | ||||
| // the given flag; if it's not set, returns default_value.
 | ||||
| const char* StringFromGTestEnv(const char* flag, const char* default_value) { | ||||
|   const std::string env_var = FlagToEnvVar(flag); | ||||
|   const char* const value = posix::GetEnv(env_var.c_str()); | ||||
|   return value == NULL ? default_value : value; | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
							
								
								
									
										363
									
								
								lib/gtest/gtest-printers.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								lib/gtest/gtest-printers.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,363 @@ | |||
| // Copyright 2007, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| 
 | ||||
| // Google Test - The Google C++ Testing Framework
 | ||||
| //
 | ||||
| // This file implements a universal value printer that can print a
 | ||||
| // value of any type T:
 | ||||
| //
 | ||||
| //   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
 | ||||
| //
 | ||||
| // It uses the << operator when possible, and prints the bytes in the
 | ||||
| // object otherwise.  A user can override its behavior for a class
 | ||||
| // type Foo by defining either operator<<(::std::ostream&, const Foo&)
 | ||||
| // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
 | ||||
| // defines Foo.
 | ||||
| 
 | ||||
| #include "gtest/gtest-printers.h" | ||||
| #include <ctype.h> | ||||
| #include <stdio.h> | ||||
| #include <ostream>  // NOLINT
 | ||||
| #include <string> | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| namespace { | ||||
| 
 | ||||
| using ::std::ostream; | ||||
| 
 | ||||
| // Prints a segment of bytes in the given object.
 | ||||
| void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, | ||||
|                                 size_t count, ostream* os) { | ||||
|   char text[5] = ""; | ||||
|   for (size_t i = 0; i != count; i++) { | ||||
|     const size_t j = start + i; | ||||
|     if (i != 0) { | ||||
|       // Organizes the bytes into groups of 2 for easy parsing by
 | ||||
|       // human.
 | ||||
|       if ((j % 2) == 0) | ||||
|         *os << ' '; | ||||
|       else | ||||
|         *os << '-'; | ||||
|     } | ||||
|     GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]); | ||||
|     *os << text; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Prints the bytes in the given value to the given ostream.
 | ||||
| void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, | ||||
|                               ostream* os) { | ||||
|   // Tells the user how big the object is.
 | ||||
|   *os << count << "-byte object <"; | ||||
| 
 | ||||
|   const size_t kThreshold = 132; | ||||
|   const size_t kChunkSize = 64; | ||||
|   // If the object size is bigger than kThreshold, we'll have to omit
 | ||||
|   // some details by printing only the first and the last kChunkSize
 | ||||
|   // bytes.
 | ||||
|   // TODO(wan): let the user control the threshold using a flag.
 | ||||
|   if (count < kThreshold) { | ||||
|     PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); | ||||
|   } else { | ||||
|     PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); | ||||
|     *os << " ... "; | ||||
|     // Rounds up to 2-byte boundary.
 | ||||
|     const size_t resume_pos = (count - kChunkSize + 1)/2*2; | ||||
|     PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); | ||||
|   } | ||||
|   *os << ">"; | ||||
| } | ||||
| 
 | ||||
| }  // namespace
 | ||||
| 
 | ||||
| namespace internal2 { | ||||
| 
 | ||||
| // Delegates to PrintBytesInObjectToImpl() to print the bytes in the
 | ||||
| // given object.  The delegation simplifies the implementation, which
 | ||||
| // uses the << operator and thus is easier done outside of the
 | ||||
| // ::testing::internal namespace, which contains a << operator that
 | ||||
| // sometimes conflicts with the one in STL.
 | ||||
| void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, | ||||
|                           ostream* os) { | ||||
|   PrintBytesInObjectToImpl(obj_bytes, count, os); | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal2
 | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // Depending on the value of a char (or wchar_t), we print it in one
 | ||||
| // of three formats:
 | ||||
| //   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
 | ||||
| //   - as a hexidecimal escape sequence (e.g. '\x7F'), or
 | ||||
| //   - as a special escape sequence (e.g. '\r', '\n').
 | ||||
| enum CharFormat { | ||||
|   kAsIs, | ||||
|   kHexEscape, | ||||
|   kSpecialEscape | ||||
| }; | ||||
| 
 | ||||
| // Returns true if c is a printable ASCII character.  We test the
 | ||||
| // value of c directly instead of calling isprint(), which is buggy on
 | ||||
| // Windows Mobile.
 | ||||
| inline bool IsPrintableAscii(wchar_t c) { | ||||
|   return 0x20 <= c && c <= 0x7E; | ||||
| } | ||||
| 
 | ||||
| // Prints a wide or narrow char c as a character literal without the
 | ||||
| // quotes, escaping it when necessary; returns how c was formatted.
 | ||||
| // The template argument UnsignedChar is the unsigned version of Char,
 | ||||
| // which is the type of c.
 | ||||
| template <typename UnsignedChar, typename Char> | ||||
| static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { | ||||
|   switch (static_cast<wchar_t>(c)) { | ||||
|     case L'\0': | ||||
|       *os << "\\0"; | ||||
|       break; | ||||
|     case L'\'': | ||||
|       *os << "\\'"; | ||||
|       break; | ||||
|     case L'\\': | ||||
|       *os << "\\\\"; | ||||
|       break; | ||||
|     case L'\a': | ||||
|       *os << "\\a"; | ||||
|       break; | ||||
|     case L'\b': | ||||
|       *os << "\\b"; | ||||
|       break; | ||||
|     case L'\f': | ||||
|       *os << "\\f"; | ||||
|       break; | ||||
|     case L'\n': | ||||
|       *os << "\\n"; | ||||
|       break; | ||||
|     case L'\r': | ||||
|       *os << "\\r"; | ||||
|       break; | ||||
|     case L'\t': | ||||
|       *os << "\\t"; | ||||
|       break; | ||||
|     case L'\v': | ||||
|       *os << "\\v"; | ||||
|       break; | ||||
|     default: | ||||
|       if (IsPrintableAscii(c)) { | ||||
|         *os << static_cast<char>(c); | ||||
|         return kAsIs; | ||||
|       } else { | ||||
|         *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c)); | ||||
|         return kHexEscape; | ||||
|       } | ||||
|   } | ||||
|   return kSpecialEscape; | ||||
| } | ||||
| 
 | ||||
| // Prints a wchar_t c as if it's part of a string literal, escaping it when
 | ||||
| // necessary; returns how c was formatted.
 | ||||
| static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { | ||||
|   switch (c) { | ||||
|     case L'\'': | ||||
|       *os << "'"; | ||||
|       return kAsIs; | ||||
|     case L'"': | ||||
|       *os << "\\\""; | ||||
|       return kSpecialEscape; | ||||
|     default: | ||||
|       return PrintAsCharLiteralTo<wchar_t>(c, os); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Prints a char c as if it's part of a string literal, escaping it when
 | ||||
| // necessary; returns how c was formatted.
 | ||||
| static CharFormat PrintAsStringLiteralTo(char c, ostream* os) { | ||||
|   return PrintAsStringLiteralTo( | ||||
|       static_cast<wchar_t>(static_cast<unsigned char>(c)), os); | ||||
| } | ||||
| 
 | ||||
| // Prints a wide or narrow character c and its code.  '\0' is printed
 | ||||
| // as "'\\0'", other unprintable characters are also properly escaped
 | ||||
| // using the standard C++ escape sequence.  The template argument
 | ||||
| // UnsignedChar is the unsigned version of Char, which is the type of c.
 | ||||
| template <typename UnsignedChar, typename Char> | ||||
| void PrintCharAndCodeTo(Char c, ostream* os) { | ||||
|   // First, print c as a literal in the most readable form we can find.
 | ||||
|   *os << ((sizeof(c) > 1) ? "L'" : "'"); | ||||
|   const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os); | ||||
|   *os << "'"; | ||||
| 
 | ||||
|   // To aid user debugging, we also print c's code in decimal, unless
 | ||||
|   // it's 0 (in which case c was printed as '\\0', making the code
 | ||||
|   // obvious).
 | ||||
|   if (c == 0) | ||||
|     return; | ||||
|   *os << " (" << static_cast<int>(c); | ||||
| 
 | ||||
|   // For more convenience, we print c's code again in hexidecimal,
 | ||||
|   // unless c was already printed in the form '\x##' or the code is in
 | ||||
|   // [1, 9].
 | ||||
|   if (format == kHexEscape || (1 <= c && c <= 9)) { | ||||
|     // Do nothing.
 | ||||
|   } else { | ||||
|     *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c)); | ||||
|   } | ||||
|   *os << ")"; | ||||
| } | ||||
| 
 | ||||
| void PrintTo(unsigned char c, ::std::ostream* os) { | ||||
|   PrintCharAndCodeTo<unsigned char>(c, os); | ||||
| } | ||||
| void PrintTo(signed char c, ::std::ostream* os) { | ||||
|   PrintCharAndCodeTo<unsigned char>(c, os); | ||||
| } | ||||
| 
 | ||||
| // Prints a wchar_t as a symbol if it is printable or as its internal
 | ||||
| // code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
 | ||||
| void PrintTo(wchar_t wc, ostream* os) { | ||||
|   PrintCharAndCodeTo<wchar_t>(wc, os); | ||||
| } | ||||
| 
 | ||||
| // Prints the given array of characters to the ostream.  CharType must be either
 | ||||
| // char or wchar_t.
 | ||||
| // The array starts at begin, the length is len, it may include '\0' characters
 | ||||
| // and may not be NUL-terminated.
 | ||||
| template <typename CharType> | ||||
| static void PrintCharsAsStringTo( | ||||
|     const CharType* begin, size_t len, ostream* os) { | ||||
|   const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; | ||||
|   *os << kQuoteBegin; | ||||
|   bool is_previous_hex = false; | ||||
|   for (size_t index = 0; index < len; ++index) { | ||||
|     const CharType cur = begin[index]; | ||||
|     if (is_previous_hex && IsXDigit(cur)) { | ||||
|       // Previous character is of '\x..' form and this character can be
 | ||||
|       // interpreted as another hexadecimal digit in its number. Break string to
 | ||||
|       // disambiguate.
 | ||||
|       *os << "\" " << kQuoteBegin; | ||||
|     } | ||||
|     is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape; | ||||
|   } | ||||
|   *os << "\""; | ||||
| } | ||||
| 
 | ||||
| // Prints a (const) char/wchar_t array of 'len' elements, starting at address
 | ||||
| // 'begin'.  CharType must be either char or wchar_t.
 | ||||
| template <typename CharType> | ||||
| static void UniversalPrintCharArray( | ||||
|     const CharType* begin, size_t len, ostream* os) { | ||||
|   // The code
 | ||||
|   //   const char kFoo[] = "foo";
 | ||||
|   // generates an array of 4, not 3, elements, with the last one being '\0'.
 | ||||
|   //
 | ||||
|   // Therefore when printing a char array, we don't print the last element if
 | ||||
|   // it's '\0', such that the output matches the string literal as it's
 | ||||
|   // written in the source code.
 | ||||
|   if (len > 0 && begin[len - 1] == '\0') { | ||||
|     PrintCharsAsStringTo(begin, len - 1, os); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   // If, however, the last element in the array is not '\0', e.g.
 | ||||
|   //    const char kFoo[] = { 'f', 'o', 'o' };
 | ||||
|   // we must print the entire array.  We also print a message to indicate
 | ||||
|   // that the array is not NUL-terminated.
 | ||||
|   PrintCharsAsStringTo(begin, len, os); | ||||
|   *os << " (no terminating NUL)"; | ||||
| } | ||||
| 
 | ||||
| // Prints a (const) char array of 'len' elements, starting at address 'begin'.
 | ||||
| void UniversalPrintArray(const char* begin, size_t len, ostream* os) { | ||||
|   UniversalPrintCharArray(begin, len, os); | ||||
| } | ||||
| 
 | ||||
| // Prints a (const) wchar_t array of 'len' elements, starting at address
 | ||||
| // 'begin'.
 | ||||
| void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) { | ||||
|   UniversalPrintCharArray(begin, len, os); | ||||
| } | ||||
| 
 | ||||
| // Prints the given C string to the ostream.
 | ||||
| void PrintTo(const char* s, ostream* os) { | ||||
|   if (s == NULL) { | ||||
|     *os << "NULL"; | ||||
|   } else { | ||||
|     *os << ImplicitCast_<const void*>(s) << " pointing to "; | ||||
|     PrintCharsAsStringTo(s, strlen(s), os); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // MSVC compiler can be configured to define whar_t as a typedef
 | ||||
| // of unsigned short. Defining an overload for const wchar_t* in that case
 | ||||
| // would cause pointers to unsigned shorts be printed as wide strings,
 | ||||
| // possibly accessing more memory than intended and causing invalid
 | ||||
| // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
 | ||||
| // wchar_t is implemented as a native type.
 | ||||
| #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) | ||||
| // Prints the given wide C string to the ostream.
 | ||||
| void PrintTo(const wchar_t* s, ostream* os) { | ||||
|   if (s == NULL) { | ||||
|     *os << "NULL"; | ||||
|   } else { | ||||
|     *os << ImplicitCast_<const void*>(s) << " pointing to "; | ||||
|     PrintCharsAsStringTo(s, wcslen(s), os); | ||||
|   } | ||||
| } | ||||
| #endif  // wchar_t is native
 | ||||
| 
 | ||||
| // Prints a ::string object.
 | ||||
| #if GTEST_HAS_GLOBAL_STRING | ||||
| void PrintStringTo(const ::string& s, ostream* os) { | ||||
|   PrintCharsAsStringTo(s.data(), s.size(), os); | ||||
| } | ||||
| #endif  // GTEST_HAS_GLOBAL_STRING
 | ||||
| 
 | ||||
| void PrintStringTo(const ::std::string& s, ostream* os) { | ||||
|   PrintCharsAsStringTo(s.data(), s.size(), os); | ||||
| } | ||||
| 
 | ||||
| // Prints a ::wstring object.
 | ||||
| #if GTEST_HAS_GLOBAL_WSTRING | ||||
| void PrintWideStringTo(const ::wstring& s, ostream* os) { | ||||
|   PrintCharsAsStringTo(s.data(), s.size(), os); | ||||
| } | ||||
| #endif  // GTEST_HAS_GLOBAL_WSTRING
 | ||||
| 
 | ||||
| #if GTEST_HAS_STD_WSTRING | ||||
| void PrintWideStringTo(const ::std::wstring& s, ostream* os) { | ||||
|   PrintCharsAsStringTo(s.data(), s.size(), os); | ||||
| } | ||||
| #endif  // GTEST_HAS_STD_WSTRING
 | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
							
								
								
									
										110
									
								
								lib/gtest/gtest-test-part.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								lib/gtest/gtest-test-part.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,110 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: mheule@google.com (Markus Heule)
 | ||||
| //
 | ||||
| // The Google C++ Testing Framework (Google Test)
 | ||||
| 
 | ||||
| #include "gtest/gtest-test-part.h" | ||||
| 
 | ||||
| // Indicates that this translation unit is part of Google Test's
 | ||||
| // implementation.  It must come before gtest-internal-inl.h is
 | ||||
| // included, or there will be a compiler error.  This trick is to
 | ||||
| // prevent a user from accidentally including gtest-internal-inl.h in
 | ||||
| // his code.
 | ||||
| #define GTEST_IMPLEMENTATION_ 1 | ||||
| #include "gtest-internal-inl.h" | ||||
| #undef GTEST_IMPLEMENTATION_ | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| using internal::GetUnitTestImpl; | ||||
| 
 | ||||
| // Gets the summary of the failure message by omitting the stack trace
 | ||||
| // in it.
 | ||||
| std::string TestPartResult::ExtractSummary(const char* message) { | ||||
|   const char* const stack_trace = strstr(message, internal::kStackTraceMarker); | ||||
|   return stack_trace == NULL ? message : | ||||
|       std::string(message, stack_trace); | ||||
| } | ||||
| 
 | ||||
| // Prints a TestPartResult object.
 | ||||
| std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { | ||||
|   return os | ||||
|       << result.file_name() << ":" << result.line_number() << ": " | ||||
|       << (result.type() == TestPartResult::kSuccess ? "Success" : | ||||
|           result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : | ||||
|           "Non-fatal failure") << ":\n" | ||||
|       << result.message() << std::endl; | ||||
| } | ||||
| 
 | ||||
| // Appends a TestPartResult to the array.
 | ||||
| void TestPartResultArray::Append(const TestPartResult& result) { | ||||
|   array_.push_back(result); | ||||
| } | ||||
| 
 | ||||
| // Returns the TestPartResult at the given index (0-based).
 | ||||
| const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { | ||||
|   if (index < 0 || index >= size()) { | ||||
|     printf("\nInvalid index (%d) into TestPartResultArray.\n", index); | ||||
|     internal::posix::Abort(); | ||||
|   } | ||||
| 
 | ||||
|   return array_[index]; | ||||
| } | ||||
| 
 | ||||
| // Returns the number of TestPartResult objects in the array.
 | ||||
| int TestPartResultArray::size() const { | ||||
|   return static_cast<int>(array_.size()); | ||||
| } | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| HasNewFatalFailureHelper::HasNewFatalFailureHelper() | ||||
|     : has_new_fatal_failure_(false), | ||||
|       original_reporter_(GetUnitTestImpl()-> | ||||
|                          GetTestPartResultReporterForCurrentThread()) { | ||||
|   GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); | ||||
| } | ||||
| 
 | ||||
| HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { | ||||
|   GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( | ||||
|       original_reporter_); | ||||
| } | ||||
| 
 | ||||
| void HasNewFatalFailureHelper::ReportTestPartResult( | ||||
|     const TestPartResult& result) { | ||||
|   if (result.fatally_failed()) | ||||
|     has_new_fatal_failure_ = true; | ||||
|   original_reporter_->ReportTestPartResult(result); | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
							
								
								
									
										110
									
								
								lib/gtest/gtest-typed-test.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								lib/gtest/gtest-typed-test.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,110 @@ | |||
| // Copyright 2008 Google Inc.
 | ||||
| // All Rights Reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| 
 | ||||
| #include "gtest/gtest-typed-test.h" | ||||
| #include "gtest/gtest.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| #if GTEST_HAS_TYPED_TEST_P | ||||
| 
 | ||||
| // Skips to the first non-space char in str. Returns an empty string if str
 | ||||
| // contains only whitespace characters.
 | ||||
| static const char* SkipSpaces(const char* str) { | ||||
|   while (IsSpace(*str)) | ||||
|     str++; | ||||
|   return str; | ||||
| } | ||||
| 
 | ||||
| // Verifies that registered_tests match the test names in
 | ||||
| // defined_test_names_; returns registered_tests if successful, or
 | ||||
| // aborts the program otherwise.
 | ||||
| const char* TypedTestCasePState::VerifyRegisteredTestNames( | ||||
|     const char* file, int line, const char* registered_tests) { | ||||
|   typedef ::std::set<const char*>::const_iterator DefinedTestIter; | ||||
|   registered_ = true; | ||||
| 
 | ||||
|   // Skip initial whitespace in registered_tests since some
 | ||||
|   // preprocessors prefix stringizied literals with whitespace.
 | ||||
|   registered_tests = SkipSpaces(registered_tests); | ||||
| 
 | ||||
|   Message errors; | ||||
|   ::std::set<std::string> tests; | ||||
|   for (const char* names = registered_tests; names != NULL; | ||||
|        names = SkipComma(names)) { | ||||
|     const std::string name = GetPrefixUntilComma(names); | ||||
|     if (tests.count(name) != 0) { | ||||
|       errors << "Test " << name << " is listed more than once.\n"; | ||||
|       continue; | ||||
|     } | ||||
| 
 | ||||
|     bool found = false; | ||||
|     for (DefinedTestIter it = defined_test_names_.begin(); | ||||
|          it != defined_test_names_.end(); | ||||
|          ++it) { | ||||
|       if (name == *it) { | ||||
|         found = true; | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (found) { | ||||
|       tests.insert(name); | ||||
|     } else { | ||||
|       errors << "No test named " << name | ||||
|              << " can be found in this test case.\n"; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   for (DefinedTestIter it = defined_test_names_.begin(); | ||||
|        it != defined_test_names_.end(); | ||||
|        ++it) { | ||||
|     if (tests.count(*it) == 0) { | ||||
|       errors << "You forgot to list test " << *it << ".\n"; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   const std::string& errors_str = errors.GetString(); | ||||
|   if (errors_str != "") { | ||||
|     fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), | ||||
|             errors_str.c_str()); | ||||
|     fflush(stderr); | ||||
|     posix::Abort(); | ||||
|   } | ||||
| 
 | ||||
|   return registered_tests; | ||||
| } | ||||
| 
 | ||||
| #endif  // GTEST_HAS_TYPED_TEST_P
 | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
							
								
								
									
										5020
									
								
								lib/gtest/gtest.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5020
									
								
								lib/gtest/gtest.cc
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										38
									
								
								lib/gtest/gtest_main.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								lib/gtest/gtest_main.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | |||
| // Copyright 2006, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #include "gtest/gtest.h" | ||||
| 
 | ||||
| GTEST_API_ int main(int argc, char **argv) { | ||||
|   printf("Running main() from gtest_main.cc\n"); | ||||
|   testing::InitGoogleTest(&argc, argv); | ||||
|   return RUN_ALL_TESTS(); | ||||
| } | ||||
							
								
								
									
										294
									
								
								lib/gtest/include/gtest/gtest-death-test.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								lib/gtest/include/gtest/gtest-death-test.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,294 @@ | |||
| // Copyright 2005, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| //
 | ||||
| // The Google C++ Testing Framework (Google Test)
 | ||||
| //
 | ||||
| // This header file defines the public API for death tests.  It is
 | ||||
| // #included by gtest.h so a user doesn't need to include this
 | ||||
| // directly.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ | ||||
| 
 | ||||
| #include "gtest/internal/gtest-death-test-internal.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // This flag controls the style of death tests.  Valid values are "threadsafe",
 | ||||
| // meaning that the death test child process will re-execute the test binary
 | ||||
| // from the start, running only a single death test, or "fast",
 | ||||
| // meaning that the child process will execute the test logic immediately
 | ||||
| // after forking.
 | ||||
| GTEST_DECLARE_string_(death_test_style); | ||||
| 
 | ||||
| #if GTEST_HAS_DEATH_TEST | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // Returns a Boolean value indicating whether the caller is currently
 | ||||
| // executing in the context of the death test child process.  Tools such as
 | ||||
| // Valgrind heap checkers may need this to modify their behavior in death
 | ||||
| // tests.  IMPORTANT: This is an internal utility.  Using it may break the
 | ||||
| // implementation of death tests.  User code MUST NOT use it.
 | ||||
| GTEST_API_ bool InDeathTestChild(); | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| // The following macros are useful for writing death tests.
 | ||||
| 
 | ||||
| // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
 | ||||
| // executed:
 | ||||
| //
 | ||||
| //   1. It generates a warning if there is more than one active
 | ||||
| //   thread.  This is because it's safe to fork() or clone() only
 | ||||
| //   when there is a single thread.
 | ||||
| //
 | ||||
| //   2. The parent process clone()s a sub-process and runs the death
 | ||||
| //   test in it; the sub-process exits with code 0 at the end of the
 | ||||
| //   death test, if it hasn't exited already.
 | ||||
| //
 | ||||
| //   3. The parent process waits for the sub-process to terminate.
 | ||||
| //
 | ||||
| //   4. The parent process checks the exit code and error message of
 | ||||
| //   the sub-process.
 | ||||
| //
 | ||||
| // Examples:
 | ||||
| //
 | ||||
| //   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
 | ||||
| //   for (int i = 0; i < 5; i++) {
 | ||||
| //     EXPECT_DEATH(server.ProcessRequest(i),
 | ||||
| //                  "Invalid request .* in ProcessRequest()")
 | ||||
| //                  << "Failed to die on request " << i;
 | ||||
| //   }
 | ||||
| //
 | ||||
| //   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
 | ||||
| //
 | ||||
| //   bool KilledBySIGHUP(int exit_code) {
 | ||||
| //     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
 | ||||
| //   }
 | ||||
| //
 | ||||
| //   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
 | ||||
| //
 | ||||
| // On the regular expressions used in death tests:
 | ||||
| //
 | ||||
| //   On POSIX-compliant systems (*nix), we use the <regex.h> library,
 | ||||
| //   which uses the POSIX extended regex syntax.
 | ||||
| //
 | ||||
| //   On other platforms (e.g. Windows), we only support a simple regex
 | ||||
| //   syntax implemented as part of Google Test.  This limited
 | ||||
| //   implementation should be enough most of the time when writing
 | ||||
| //   death tests; though it lacks many features you can find in PCRE
 | ||||
| //   or POSIX extended regex syntax.  For example, we don't support
 | ||||
| //   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
 | ||||
| //   repetition count ("x{5,7}"), among others.
 | ||||
| //
 | ||||
| //   Below is the syntax that we do support.  We chose it to be a
 | ||||
| //   subset of both PCRE and POSIX extended regex, so it's easy to
 | ||||
| //   learn wherever you come from.  In the following: 'A' denotes a
 | ||||
| //   literal character, period (.), or a single \\ escape sequence;
 | ||||
| //   'x' and 'y' denote regular expressions; 'm' and 'n' are for
 | ||||
| //   natural numbers.
 | ||||
| //
 | ||||
| //     c     matches any literal character c
 | ||||
| //     \\d   matches any decimal digit
 | ||||
| //     \\D   matches any character that's not a decimal digit
 | ||||
| //     \\f   matches \f
 | ||||
| //     \\n   matches \n
 | ||||
| //     \\r   matches \r
 | ||||
| //     \\s   matches any ASCII whitespace, including \n
 | ||||
| //     \\S   matches any character that's not a whitespace
 | ||||
| //     \\t   matches \t
 | ||||
| //     \\v   matches \v
 | ||||
| //     \\w   matches any letter, _, or decimal digit
 | ||||
| //     \\W   matches any character that \\w doesn't match
 | ||||
| //     \\c   matches any literal character c, which must be a punctuation
 | ||||
| //     .     matches any single character except \n
 | ||||
| //     A?    matches 0 or 1 occurrences of A
 | ||||
| //     A*    matches 0 or many occurrences of A
 | ||||
| //     A+    matches 1 or many occurrences of A
 | ||||
| //     ^     matches the beginning of a string (not that of each line)
 | ||||
| //     $     matches the end of a string (not that of each line)
 | ||||
| //     xy    matches x followed by y
 | ||||
| //
 | ||||
| //   If you accidentally use PCRE or POSIX extended regex features
 | ||||
| //   not implemented by us, you will get a run-time failure.  In that
 | ||||
| //   case, please try to rewrite your regular expression within the
 | ||||
| //   above syntax.
 | ||||
| //
 | ||||
| //   This implementation is *not* meant to be as highly tuned or robust
 | ||||
| //   as a compiled regex library, but should perform well enough for a
 | ||||
| //   death test, which already incurs significant overhead by launching
 | ||||
| //   a child process.
 | ||||
| //
 | ||||
| // Known caveats:
 | ||||
| //
 | ||||
| //   A "threadsafe" style death test obtains the path to the test
 | ||||
| //   program from argv[0] and re-executes it in the sub-process.  For
 | ||||
| //   simplicity, the current implementation doesn't search the PATH
 | ||||
| //   when launching the sub-process.  This means that the user must
 | ||||
| //   invoke the test program via a path that contains at least one
 | ||||
| //   path separator (e.g. path/to/foo_test and
 | ||||
| //   /absolute/path/to/bar_test are fine, but foo_test is not).  This
 | ||||
| //   is rarely a problem as people usually don't put the test binary
 | ||||
| //   directory in PATH.
 | ||||
| //
 | ||||
| // TODO(wan@google.com): make thread-safe death tests search the PATH.
 | ||||
| 
 | ||||
| // Asserts that a given statement causes the program to exit, with an
 | ||||
| // integer exit status that satisfies predicate, and emitting error output
 | ||||
| // that matches regex.
 | ||||
| # define ASSERT_EXIT(statement, predicate, regex) \ | ||||
|     GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| // Like ASSERT_EXIT, but continues on to successive tests in the
 | ||||
| // test case, if any:
 | ||||
| # define EXPECT_EXIT(statement, predicate, regex) \ | ||||
|     GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) | ||||
| 
 | ||||
| // Asserts that a given statement causes the program to exit, either by
 | ||||
| // explicitly exiting with a nonzero exit code or being killed by a
 | ||||
| // signal, and emitting error output that matches regex.
 | ||||
| # define ASSERT_DEATH(statement, regex) \ | ||||
|     ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) | ||||
| 
 | ||||
| // Like ASSERT_DEATH, but continues on to successive tests in the
 | ||||
| // test case, if any:
 | ||||
| # define EXPECT_DEATH(statement, regex) \ | ||||
|     EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) | ||||
| 
 | ||||
| // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
 | ||||
| 
 | ||||
| // Tests that an exit code describes a normal exit with a given exit code.
 | ||||
| class GTEST_API_ ExitedWithCode { | ||||
|  public: | ||||
|   explicit ExitedWithCode(int exit_code); | ||||
|   bool operator()(int exit_status) const; | ||||
|  private: | ||||
|   // No implementation - assignment is unsupported.
 | ||||
|   void operator=(const ExitedWithCode& other); | ||||
| 
 | ||||
|   const int exit_code_; | ||||
| }; | ||||
| 
 | ||||
| # if !GTEST_OS_WINDOWS | ||||
| // Tests that an exit code describes an exit due to termination by a
 | ||||
| // given signal.
 | ||||
| class GTEST_API_ KilledBySignal { | ||||
|  public: | ||||
|   explicit KilledBySignal(int signum); | ||||
|   bool operator()(int exit_status) const; | ||||
|  private: | ||||
|   const int signum_; | ||||
| }; | ||||
| # endif  // !GTEST_OS_WINDOWS
 | ||||
| 
 | ||||
| // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
 | ||||
| // The death testing framework causes this to have interesting semantics,
 | ||||
| // since the sideeffects of the call are only visible in opt mode, and not
 | ||||
| // in debug mode.
 | ||||
| //
 | ||||
| // In practice, this can be used to test functions that utilize the
 | ||||
| // LOG(DFATAL) macro using the following style:
 | ||||
| //
 | ||||
| // int DieInDebugOr12(int* sideeffect) {
 | ||||
| //   if (sideeffect) {
 | ||||
| //     *sideeffect = 12;
 | ||||
| //   }
 | ||||
| //   LOG(DFATAL) << "death";
 | ||||
| //   return 12;
 | ||||
| // }
 | ||||
| //
 | ||||
| // TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
 | ||||
| //   int sideeffect = 0;
 | ||||
| //   // Only asserts in dbg.
 | ||||
| //   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
 | ||||
| //
 | ||||
| // #ifdef NDEBUG
 | ||||
| //   // opt-mode has sideeffect visible.
 | ||||
| //   EXPECT_EQ(12, sideeffect);
 | ||||
| // #else
 | ||||
| //   // dbg-mode no visible sideeffect.
 | ||||
| //   EXPECT_EQ(0, sideeffect);
 | ||||
| // #endif
 | ||||
| // }
 | ||||
| //
 | ||||
| // This will assert that DieInDebugReturn12InOpt() crashes in debug
 | ||||
| // mode, usually due to a DCHECK or LOG(DFATAL), but returns the
 | ||||
| // appropriate fallback value (12 in this case) in opt mode. If you
 | ||||
| // need to test that a function has appropriate side-effects in opt
 | ||||
| // mode, include assertions against the side-effects.  A general
 | ||||
| // pattern for this is:
 | ||||
| //
 | ||||
| // EXPECT_DEBUG_DEATH({
 | ||||
| //   // Side-effects here will have an effect after this statement in
 | ||||
| //   // opt mode, but none in debug mode.
 | ||||
| //   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
 | ||||
| // }, "death");
 | ||||
| //
 | ||||
| # ifdef NDEBUG | ||||
| 
 | ||||
| #  define EXPECT_DEBUG_DEATH(statement, regex) \ | ||||
|   GTEST_EXECUTE_STATEMENT_(statement, regex) | ||||
| 
 | ||||
| #  define ASSERT_DEBUG_DEATH(statement, regex) \ | ||||
|   GTEST_EXECUTE_STATEMENT_(statement, regex) | ||||
| 
 | ||||
| # else | ||||
| 
 | ||||
| #  define EXPECT_DEBUG_DEATH(statement, regex) \ | ||||
|   EXPECT_DEATH(statement, regex) | ||||
| 
 | ||||
| #  define ASSERT_DEBUG_DEATH(statement, regex) \ | ||||
|   ASSERT_DEATH(statement, regex) | ||||
| 
 | ||||
| # endif  // NDEBUG for EXPECT_DEBUG_DEATH
 | ||||
| #endif  // GTEST_HAS_DEATH_TEST
 | ||||
| 
 | ||||
| // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
 | ||||
| // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
 | ||||
| // death tests are supported; otherwise they just issue a warning.  This is
 | ||||
| // useful when you are combining death test assertions with normal test
 | ||||
| // assertions in one test.
 | ||||
| #if GTEST_HAS_DEATH_TEST | ||||
| # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ | ||||
|     EXPECT_DEATH(statement, regex) | ||||
| # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ | ||||
|     ASSERT_DEATH(statement, regex) | ||||
| #else | ||||
| # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ | ||||
|     GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) | ||||
| # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ | ||||
|     GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) | ||||
| #endif | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
 | ||||
							
								
								
									
										250
									
								
								lib/gtest/include/gtest/gtest-message.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								lib/gtest/include/gtest/gtest-message.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,250 @@ | |||
| // Copyright 2005, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| //
 | ||||
| // The Google C++ Testing Framework (Google Test)
 | ||||
| //
 | ||||
| // This header file defines the Message class.
 | ||||
| //
 | ||||
| // IMPORTANT NOTE: Due to limitation of the C++ language, we have to
 | ||||
| // leave some internal implementation details in this header file.
 | ||||
| // They are clearly marked by comments like this:
 | ||||
| //
 | ||||
| //   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | ||||
| //
 | ||||
| // Such code is NOT meant to be used by a user directly, and is subject
 | ||||
| // to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
 | ||||
| // program!
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ | ||||
| 
 | ||||
| #include <limits> | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| // Ensures that there is at least one operator<< in the global namespace.
 | ||||
| // See Message& operator<<(...) below for why.
 | ||||
| void operator<<(const testing::internal::Secret&, int); | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // The Message class works like an ostream repeater.
 | ||||
| //
 | ||||
| // Typical usage:
 | ||||
| //
 | ||||
| //   1. You stream a bunch of values to a Message object.
 | ||||
| //      It will remember the text in a stringstream.
 | ||||
| //   2. Then you stream the Message object to an ostream.
 | ||||
| //      This causes the text in the Message to be streamed
 | ||||
| //      to the ostream.
 | ||||
| //
 | ||||
| // For example;
 | ||||
| //
 | ||||
| //   testing::Message foo;
 | ||||
| //   foo << 1 << " != " << 2;
 | ||||
| //   std::cout << foo;
 | ||||
| //
 | ||||
| // will print "1 != 2".
 | ||||
| //
 | ||||
| // Message is not intended to be inherited from.  In particular, its
 | ||||
| // destructor is not virtual.
 | ||||
| //
 | ||||
| // Note that stringstream behaves differently in gcc and in MSVC.  You
 | ||||
| // can stream a NULL char pointer to it in the former, but not in the
 | ||||
| // latter (it causes an access violation if you do).  The Message
 | ||||
| // class hides this difference by treating a NULL char pointer as
 | ||||
| // "(null)".
 | ||||
| class GTEST_API_ Message { | ||||
|  private: | ||||
|   // The type of basic IO manipulators (endl, ends, and flush) for
 | ||||
|   // narrow streams.
 | ||||
|   typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); | ||||
| 
 | ||||
|  public: | ||||
|   // Constructs an empty Message.
 | ||||
|   Message(); | ||||
| 
 | ||||
|   // Copy constructor.
 | ||||
|   Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
 | ||||
|     *ss_ << msg.GetString(); | ||||
|   } | ||||
| 
 | ||||
|   // Constructs a Message from a C-string.
 | ||||
|   explicit Message(const char* str) : ss_(new ::std::stringstream) { | ||||
|     *ss_ << str; | ||||
|   } | ||||
| 
 | ||||
| #if GTEST_OS_SYMBIAN | ||||
|   // Streams a value (either a pointer or not) to this object.
 | ||||
|   template <typename T> | ||||
|   inline Message& operator <<(const T& value) { | ||||
|     StreamHelper(typename internal::is_pointer<T>::type(), value); | ||||
|     return *this; | ||||
|   } | ||||
| #else | ||||
|   // Streams a non-pointer value to this object.
 | ||||
|   template <typename T> | ||||
|   inline Message& operator <<(const T& val) { | ||||
|     // Some libraries overload << for STL containers.  These
 | ||||
|     // overloads are defined in the global namespace instead of ::std.
 | ||||
|     //
 | ||||
|     // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
 | ||||
|     // overloads are visible in either the std namespace or the global
 | ||||
|     // namespace, but not other namespaces, including the testing
 | ||||
|     // namespace which Google Test's Message class is in.
 | ||||
|     //
 | ||||
|     // To allow STL containers (and other types that has a << operator
 | ||||
|     // defined in the global namespace) to be used in Google Test
 | ||||
|     // assertions, testing::Message must access the custom << operator
 | ||||
|     // from the global namespace.  With this using declaration,
 | ||||
|     // overloads of << defined in the global namespace and those
 | ||||
|     // visible via Koenig lookup are both exposed in this function.
 | ||||
|     using ::operator <<; | ||||
|     *ss_ << val; | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   // Streams a pointer value to this object.
 | ||||
|   //
 | ||||
|   // This function is an overload of the previous one.  When you
 | ||||
|   // stream a pointer to a Message, this definition will be used as it
 | ||||
|   // is more specialized.  (The C++ Standard, section
 | ||||
|   // [temp.func.order].)  If you stream a non-pointer, then the
 | ||||
|   // previous definition will be used.
 | ||||
|   //
 | ||||
|   // The reason for this overload is that streaming a NULL pointer to
 | ||||
|   // ostream is undefined behavior.  Depending on the compiler, you
 | ||||
|   // may get "0", "(nil)", "(null)", or an access violation.  To
 | ||||
|   // ensure consistent result across compilers, we always treat NULL
 | ||||
|   // as "(null)".
 | ||||
|   template <typename T> | ||||
|   inline Message& operator <<(T* const& pointer) {  // NOLINT
 | ||||
|     if (pointer == NULL) { | ||||
|       *ss_ << "(null)"; | ||||
|     } else { | ||||
|       *ss_ << pointer; | ||||
|     } | ||||
|     return *this; | ||||
|   } | ||||
| #endif  // GTEST_OS_SYMBIAN
 | ||||
| 
 | ||||
|   // Since the basic IO manipulators are overloaded for both narrow
 | ||||
|   // and wide streams, we have to provide this specialized definition
 | ||||
|   // of operator <<, even though its body is the same as the
 | ||||
|   // templatized version above.  Without this definition, streaming
 | ||||
|   // endl or other basic IO manipulators to Message will confuse the
 | ||||
|   // compiler.
 | ||||
|   Message& operator <<(BasicNarrowIoManip val) { | ||||
|     *ss_ << val; | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   // Instead of 1/0, we want to see true/false for bool values.
 | ||||
|   Message& operator <<(bool b) { | ||||
|     return *this << (b ? "true" : "false"); | ||||
|   } | ||||
| 
 | ||||
|   // These two overloads allow streaming a wide C string to a Message
 | ||||
|   // using the UTF-8 encoding.
 | ||||
|   Message& operator <<(const wchar_t* wide_c_str); | ||||
|   Message& operator <<(wchar_t* wide_c_str); | ||||
| 
 | ||||
| #if GTEST_HAS_STD_WSTRING | ||||
|   // Converts the given wide string to a narrow string using the UTF-8
 | ||||
|   // encoding, and streams the result to this Message object.
 | ||||
|   Message& operator <<(const ::std::wstring& wstr); | ||||
| #endif  // GTEST_HAS_STD_WSTRING
 | ||||
| 
 | ||||
| #if GTEST_HAS_GLOBAL_WSTRING | ||||
|   // Converts the given wide string to a narrow string using the UTF-8
 | ||||
|   // encoding, and streams the result to this Message object.
 | ||||
|   Message& operator <<(const ::wstring& wstr); | ||||
| #endif  // GTEST_HAS_GLOBAL_WSTRING
 | ||||
| 
 | ||||
|   // Gets the text streamed to this object so far as an std::string.
 | ||||
|   // Each '\0' character in the buffer is replaced with "\\0".
 | ||||
|   //
 | ||||
|   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | ||||
|   std::string GetString() const; | ||||
| 
 | ||||
|  private: | ||||
| 
 | ||||
| #if GTEST_OS_SYMBIAN | ||||
|   // These are needed as the Nokia Symbian Compiler cannot decide between
 | ||||
|   // const T& and const T* in a function template. The Nokia compiler _can_
 | ||||
|   // decide between class template specializations for T and T*, so a
 | ||||
|   // tr1::type_traits-like is_pointer works, and we can overload on that.
 | ||||
|   template <typename T> | ||||
|   inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) { | ||||
|     if (pointer == NULL) { | ||||
|       *ss_ << "(null)"; | ||||
|     } else { | ||||
|       *ss_ << pointer; | ||||
|     } | ||||
|   } | ||||
|   template <typename T> | ||||
|   inline void StreamHelper(internal::false_type /*is_pointer*/, | ||||
|                            const T& value) { | ||||
|     // See the comments in Message& operator <<(const T&) above for why
 | ||||
|     // we need this using statement.
 | ||||
|     using ::operator <<; | ||||
|     *ss_ << value; | ||||
|   } | ||||
| #endif  // GTEST_OS_SYMBIAN
 | ||||
| 
 | ||||
|   // We'll hold the text streamed to this object here.
 | ||||
|   const internal::scoped_ptr< ::std::stringstream> ss_; | ||||
| 
 | ||||
|   // We declare (but don't implement) this to prevent the compiler
 | ||||
|   // from implementing the assignment operator.
 | ||||
|   void operator=(const Message&); | ||||
| }; | ||||
| 
 | ||||
| // Streams a Message to an ostream.
 | ||||
| inline std::ostream& operator <<(std::ostream& os, const Message& sb) { | ||||
|   return os << sb.GetString(); | ||||
| } | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // Converts a streamable value to an std::string.  A NULL pointer is
 | ||||
| // converted to "(null)".  When the input value is a ::string,
 | ||||
| // ::std::string, ::wstring, or ::std::wstring object, each NUL
 | ||||
| // character in it is replaced with "\\0".
 | ||||
| template <typename T> | ||||
| std::string StreamableToString(const T& streamable) { | ||||
|   return (Message() << streamable).GetString(); | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
 | ||||
							
								
								
									
										1421
									
								
								lib/gtest/include/gtest/gtest-param-test.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1421
									
								
								lib/gtest/include/gtest/gtest-param-test.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										487
									
								
								lib/gtest/include/gtest/gtest-param-test.h.pump
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										487
									
								
								lib/gtest/include/gtest/gtest-param-test.h.pump
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,487 @@ | |||
| $$ -*- mode: c++; -*- | ||||
| $var n = 50  $$ Maximum length of Values arguments we want to support. | ||||
| $var maxtuple = 10  $$ Maximum number of Combine arguments we want to support. | ||||
| // Copyright 2008, Google Inc. | ||||
| // All rights reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are | ||||
| // met: | ||||
| // | ||||
| //     * Redistributions of source code must retain the above copyright | ||||
| // notice, this list of conditions and the following disclaimer. | ||||
| //     * Redistributions in binary form must reproduce the above | ||||
| // copyright notice, this list of conditions and the following disclaimer | ||||
| // in the documentation and/or other materials provided with the | ||||
| // distribution. | ||||
| //     * Neither the name of Google Inc. nor the names of its | ||||
| // contributors may be used to endorse or promote products derived from | ||||
| // this software without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Authors: vladl@google.com (Vlad Losev) | ||||
| // | ||||
| // Macros and functions for implementing parameterized tests | ||||
| // in Google C++ Testing Framework (Google Test) | ||||
| // | ||||
| // This file is generated by a SCRIPT.  DO NOT EDIT BY HAND! | ||||
| // | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ | ||||
| 
 | ||||
| 
 | ||||
| // Value-parameterized tests allow you to test your code with different | ||||
| // parameters without writing multiple copies of the same test. | ||||
| // | ||||
| // Here is how you use value-parameterized tests: | ||||
| 
 | ||||
| #if 0 | ||||
| 
 | ||||
| // To write value-parameterized tests, first you should define a fixture | ||||
| // class. It is usually derived from testing::TestWithParam<T> (see below for | ||||
| // another inheritance scheme that's sometimes useful in more complicated | ||||
| // class hierarchies), where the type of your parameter values. | ||||
| // TestWithParam<T> is itself derived from testing::Test. T can be any | ||||
| // copyable type. If it's a raw pointer, you are responsible for managing the | ||||
| // lifespan of the pointed values. | ||||
| 
 | ||||
| class FooTest : public ::testing::TestWithParam<const char*> { | ||||
|   // You can implement all the usual class fixture members here. | ||||
| }; | ||||
| 
 | ||||
| // Then, use the TEST_P macro to define as many parameterized tests | ||||
| // for this fixture as you want. The _P suffix is for "parameterized" | ||||
| // or "pattern", whichever you prefer to think. | ||||
| 
 | ||||
| TEST_P(FooTest, DoesBlah) { | ||||
|   // Inside a test, access the test parameter with the GetParam() method | ||||
|   // of the TestWithParam<T> class: | ||||
|   EXPECT_TRUE(foo.Blah(GetParam())); | ||||
|   ... | ||||
| } | ||||
| 
 | ||||
| TEST_P(FooTest, HasBlahBlah) { | ||||
|   ... | ||||
| } | ||||
| 
 | ||||
| // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test | ||||
| // case with any set of parameters you want. Google Test defines a number | ||||
| // of functions for generating test parameters. They return what we call | ||||
| // (surprise!) parameter generators. Here is a  summary of them, which | ||||
| // are all in the testing namespace: | ||||
| // | ||||
| // | ||||
| //  Range(begin, end [, step]) - Yields values {begin, begin+step, | ||||
| //                               begin+step+step, ...}. The values do not | ||||
| //                               include end. step defaults to 1. | ||||
| //  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}. | ||||
| //  ValuesIn(container)        - Yields values from a C-style array, an STL | ||||
| //  ValuesIn(begin,end)          container, or an iterator range [begin, end). | ||||
| //  Bool()                     - Yields sequence {false, true}. | ||||
| //  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product | ||||
| //                               for the math savvy) of the values generated | ||||
| //                               by the N generators. | ||||
| // | ||||
| // For more details, see comments at the definitions of these functions below | ||||
| // in this file. | ||||
| // | ||||
| // The following statement will instantiate tests from the FooTest test case | ||||
| // each with parameter values "meeny", "miny", and "moe". | ||||
| 
 | ||||
| INSTANTIATE_TEST_CASE_P(InstantiationName, | ||||
|                         FooTest, | ||||
|                         Values("meeny", "miny", "moe")); | ||||
| 
 | ||||
| // To distinguish different instances of the pattern, (yes, you | ||||
| // can instantiate it more then once) the first argument to the | ||||
| // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the | ||||
| // actual test case name. Remember to pick unique prefixes for different | ||||
| // instantiations. The tests from the instantiation above will have | ||||
| // these names: | ||||
| // | ||||
| //    * InstantiationName/FooTest.DoesBlah/0 for "meeny" | ||||
| //    * InstantiationName/FooTest.DoesBlah/1 for "miny" | ||||
| //    * InstantiationName/FooTest.DoesBlah/2 for "moe" | ||||
| //    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" | ||||
| //    * InstantiationName/FooTest.HasBlahBlah/1 for "miny" | ||||
| //    * InstantiationName/FooTest.HasBlahBlah/2 for "moe" | ||||
| // | ||||
| // You can use these names in --gtest_filter. | ||||
| // | ||||
| // This statement will instantiate all tests from FooTest again, each | ||||
| // with parameter values "cat" and "dog": | ||||
| 
 | ||||
| const char* pets[] = {"cat", "dog"}; | ||||
| INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); | ||||
| 
 | ||||
| // The tests from the instantiation above will have these names: | ||||
| // | ||||
| //    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" | ||||
| //    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" | ||||
| //    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" | ||||
| //    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" | ||||
| // | ||||
| // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests | ||||
| // in the given test case, whether their definitions come before or | ||||
| // AFTER the INSTANTIATE_TEST_CASE_P statement. | ||||
| // | ||||
| // Please also note that generator expressions (including parameters to the | ||||
| // generators) are evaluated in InitGoogleTest(), after main() has started. | ||||
| // This allows the user on one hand, to adjust generator parameters in order | ||||
| // to dynamically determine a set of tests to run and on the other hand, | ||||
| // give the user a chance to inspect the generated tests with Google Test | ||||
| // reflection API before RUN_ALL_TESTS() is executed. | ||||
| // | ||||
| // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc | ||||
| // for more examples. | ||||
| // | ||||
| // In the future, we plan to publish the API for defining new parameter | ||||
| // generators. But for now this interface remains part of the internal | ||||
| // implementation and is subject to change. | ||||
| // | ||||
| // | ||||
| // A parameterized test fixture must be derived from testing::Test and from | ||||
| // testing::WithParamInterface<T>, where T is the type of the parameter | ||||
| // values. Inheriting from TestWithParam<T> satisfies that requirement because | ||||
| // TestWithParam<T> inherits from both Test and WithParamInterface. In more | ||||
| // complicated hierarchies, however, it is occasionally useful to inherit | ||||
| // separately from Test and WithParamInterface. For example: | ||||
| 
 | ||||
| class BaseTest : public ::testing::Test { | ||||
|   // You can inherit all the usual members for a non-parameterized test | ||||
|   // fixture here. | ||||
| }; | ||||
| 
 | ||||
| class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> { | ||||
|   // The usual test fixture members go here too. | ||||
| }; | ||||
| 
 | ||||
| TEST_F(BaseTest, HasFoo) { | ||||
|   // This is an ordinary non-parameterized test. | ||||
| } | ||||
| 
 | ||||
| TEST_P(DerivedTest, DoesBlah) { | ||||
|   // GetParam works just the same here as if you inherit from TestWithParam. | ||||
|   EXPECT_TRUE(foo.Blah(GetParam())); | ||||
| } | ||||
| 
 | ||||
| #endif  // 0 | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| #if !GTEST_OS_SYMBIAN | ||||
| # include <utility> | ||||
| #endif | ||||
| 
 | ||||
| // scripts/fuse_gtest.py depends on gtest's own header being #included | ||||
| // *unconditionally*.  Therefore these #includes cannot be moved | ||||
| // inside #if GTEST_HAS_PARAM_TEST. | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| #include "gtest/internal/gtest-param-util.h" | ||||
| #include "gtest/internal/gtest-param-util-generated.h" | ||||
| 
 | ||||
| #if GTEST_HAS_PARAM_TEST | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // Functions producing parameter generators. | ||||
| // | ||||
| // Google Test uses these generators to produce parameters for value- | ||||
| // parameterized tests. When a parameterized test case is instantiated | ||||
| // with a particular generator, Google Test creates and runs tests | ||||
| // for each element in the sequence produced by the generator. | ||||
| // | ||||
| // In the following sample, tests from test case FooTest are instantiated | ||||
| // each three times with parameter values 3, 5, and 8: | ||||
| // | ||||
| // class FooTest : public TestWithParam<int> { ... }; | ||||
| // | ||||
| // TEST_P(FooTest, TestThis) { | ||||
| // } | ||||
| // TEST_P(FooTest, TestThat) { | ||||
| // } | ||||
| // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); | ||||
| // | ||||
| 
 | ||||
| // Range() returns generators providing sequences of values in a range. | ||||
| // | ||||
| // Synopsis: | ||||
| // Range(start, end) | ||||
| //   - returns a generator producing a sequence of values {start, start+1, | ||||
| //     start+2, ..., }. | ||||
| // Range(start, end, step) | ||||
| //   - returns a generator producing a sequence of values {start, start+step, | ||||
| //     start+step+step, ..., }. | ||||
| // Notes: | ||||
| //   * The generated sequences never include end. For example, Range(1, 5) | ||||
| //     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) | ||||
| //     returns a generator producing {1, 3, 5, 7}. | ||||
| //   * start and end must have the same type. That type may be any integral or | ||||
| //     floating-point type or a user defined type satisfying these conditions: | ||||
| //     * It must be assignable (have operator=() defined). | ||||
| //     * It must have operator+() (operator+(int-compatible type) for | ||||
| //       two-operand version). | ||||
| //     * It must have operator<() defined. | ||||
| //     Elements in the resulting sequences will also have that type. | ||||
| //   * Condition start < end must be satisfied in order for resulting sequences | ||||
| //     to contain any elements. | ||||
| // | ||||
| template <typename T, typename IncrementT> | ||||
| internal::ParamGenerator<T> Range(T start, T end, IncrementT step) { | ||||
|   return internal::ParamGenerator<T>( | ||||
|       new internal::RangeGenerator<T, IncrementT>(start, end, step)); | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| internal::ParamGenerator<T> Range(T start, T end) { | ||||
|   return Range(start, end, 1); | ||||
| } | ||||
| 
 | ||||
| // ValuesIn() function allows generation of tests with parameters coming from | ||||
| // a container. | ||||
| // | ||||
| // Synopsis: | ||||
| // ValuesIn(const T (&array)[N]) | ||||
| //   - returns a generator producing sequences with elements from | ||||
| //     a C-style array. | ||||
| // ValuesIn(const Container& container) | ||||
| //   - returns a generator producing sequences with elements from | ||||
| //     an STL-style container. | ||||
| // ValuesIn(Iterator begin, Iterator end) | ||||
| //   - returns a generator producing sequences with elements from | ||||
| //     a range [begin, end) defined by a pair of STL-style iterators. These | ||||
| //     iterators can also be plain C pointers. | ||||
| // | ||||
| // Please note that ValuesIn copies the values from the containers | ||||
| // passed in and keeps them to generate tests in RUN_ALL_TESTS(). | ||||
| // | ||||
| // Examples: | ||||
| // | ||||
| // This instantiates tests from test case StringTest | ||||
| // each with C-string values of "foo", "bar", and "baz": | ||||
| // | ||||
| // const char* strings[] = {"foo", "bar", "baz"}; | ||||
| // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); | ||||
| // | ||||
| // This instantiates tests from test case StlStringTest | ||||
| // each with STL strings with values "a" and "b": | ||||
| // | ||||
| // ::std::vector< ::std::string> GetParameterStrings() { | ||||
| //   ::std::vector< ::std::string> v; | ||||
| //   v.push_back("a"); | ||||
| //   v.push_back("b"); | ||||
| //   return v; | ||||
| // } | ||||
| // | ||||
| // INSTANTIATE_TEST_CASE_P(CharSequence, | ||||
| //                         StlStringTest, | ||||
| //                         ValuesIn(GetParameterStrings())); | ||||
| // | ||||
| // | ||||
| // This will also instantiate tests from CharTest | ||||
| // each with parameter values 'a' and 'b': | ||||
| // | ||||
| // ::std::list<char> GetParameterChars() { | ||||
| //   ::std::list<char> list; | ||||
| //   list.push_back('a'); | ||||
| //   list.push_back('b'); | ||||
| //   return list; | ||||
| // } | ||||
| // ::std::list<char> l = GetParameterChars(); | ||||
| // INSTANTIATE_TEST_CASE_P(CharSequence2, | ||||
| //                         CharTest, | ||||
| //                         ValuesIn(l.begin(), l.end())); | ||||
| // | ||||
| template <typename ForwardIterator> | ||||
| internal::ParamGenerator< | ||||
|   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> | ||||
| ValuesIn(ForwardIterator begin, ForwardIterator end) { | ||||
|   typedef typename ::testing::internal::IteratorTraits<ForwardIterator> | ||||
|       ::value_type ParamType; | ||||
|   return internal::ParamGenerator<ParamType>( | ||||
|       new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end)); | ||||
| } | ||||
| 
 | ||||
| template <typename T, size_t N> | ||||
| internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) { | ||||
|   return ValuesIn(array, array + N); | ||||
| } | ||||
| 
 | ||||
| template <class Container> | ||||
| internal::ParamGenerator<typename Container::value_type> ValuesIn( | ||||
|     const Container& container) { | ||||
|   return ValuesIn(container.begin(), container.end()); | ||||
| } | ||||
| 
 | ||||
| // Values() allows generating tests from explicitly specified list of | ||||
| // parameters. | ||||
| // | ||||
| // Synopsis: | ||||
| // Values(T v1, T v2, ..., T vN) | ||||
| //   - returns a generator producing sequences with elements v1, v2, ..., vN. | ||||
| // | ||||
| // For example, this instantiates tests from test case BarTest each | ||||
| // with values "one", "two", and "three": | ||||
| // | ||||
| // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); | ||||
| // | ||||
| // This instantiates tests from test case BazTest each with values 1, 2, 3.5. | ||||
| // The exact type of values will depend on the type of parameter in BazTest. | ||||
| // | ||||
| // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); | ||||
| // | ||||
| // Currently, Values() supports from 1 to $n parameters. | ||||
| // | ||||
| $range i 1..n | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| 
 | ||||
| template <$for j, [[typename T$j]]> | ||||
| internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) { | ||||
|   return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]); | ||||
| } | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // Bool() allows generating tests with parameters in a set of (false, true). | ||||
| // | ||||
| // Synopsis: | ||||
| // Bool() | ||||
| //   - returns a generator producing sequences with elements {false, true}. | ||||
| // | ||||
| // It is useful when testing code that depends on Boolean flags. Combinations | ||||
| // of multiple flags can be tested when several Bool()'s are combined using | ||||
| // Combine() function. | ||||
| // | ||||
| // In the following example all tests in the test case FlagDependentTest | ||||
| // will be instantiated twice with parameters false and true. | ||||
| // | ||||
| // class FlagDependentTest : public testing::TestWithParam<bool> { | ||||
| //   virtual void SetUp() { | ||||
| //     external_flag = GetParam(); | ||||
| //   } | ||||
| // } | ||||
| // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); | ||||
| // | ||||
| inline internal::ParamGenerator<bool> Bool() { | ||||
|   return Values(false, true); | ||||
| } | ||||
| 
 | ||||
| # if GTEST_HAS_COMBINE | ||||
| // Combine() allows the user to combine two or more sequences to produce | ||||
| // values of a Cartesian product of those sequences' elements. | ||||
| // | ||||
| // Synopsis: | ||||
| // Combine(gen1, gen2, ..., genN) | ||||
| //   - returns a generator producing sequences with elements coming from | ||||
| //     the Cartesian product of elements from the sequences generated by | ||||
| //     gen1, gen2, ..., genN. The sequence elements will have a type of | ||||
| //     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types | ||||
| //     of elements from sequences produces by gen1, gen2, ..., genN. | ||||
| // | ||||
| // Combine can have up to $maxtuple arguments. This number is currently limited | ||||
| // by the maximum number of elements in the tuple implementation used by Google | ||||
| // Test. | ||||
| // | ||||
| // Example: | ||||
| // | ||||
| // This will instantiate tests in test case AnimalTest each one with | ||||
| // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), | ||||
| // tuple("dog", BLACK), and tuple("dog", WHITE): | ||||
| // | ||||
| // enum Color { BLACK, GRAY, WHITE }; | ||||
| // class AnimalTest | ||||
| //     : public testing::TestWithParam<tuple<const char*, Color> > {...}; | ||||
| // | ||||
| // TEST_P(AnimalTest, AnimalLooksNice) {...} | ||||
| // | ||||
| // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, | ||||
| //                         Combine(Values("cat", "dog"), | ||||
| //                                 Values(BLACK, WHITE))); | ||||
| // | ||||
| // This will instantiate tests in FlagDependentTest with all variations of two | ||||
| // Boolean flags: | ||||
| // | ||||
| // class FlagDependentTest | ||||
| //     : public testing::TestWithParam<tuple<bool, bool> > { | ||||
| //   virtual void SetUp() { | ||||
| //     // Assigns external_flag_1 and external_flag_2 values from the tuple. | ||||
| //     tie(external_flag_1, external_flag_2) = GetParam(); | ||||
| //   } | ||||
| // }; | ||||
| // | ||||
| // TEST_P(FlagDependentTest, TestFeature1) { | ||||
| //   // Test your code using external_flag_1 and external_flag_2 here. | ||||
| // } | ||||
| // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, | ||||
| //                         Combine(Bool(), Bool())); | ||||
| // | ||||
| $range i 2..maxtuple | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| 
 | ||||
| template <$for j, [[typename Generator$j]]> | ||||
| internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine( | ||||
|     $for j, [[const Generator$j& g$j]]) { | ||||
|   return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>( | ||||
|       $for j, [[g$j]]); | ||||
| } | ||||
| 
 | ||||
| ]] | ||||
| # endif  // GTEST_HAS_COMBINE | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # define TEST_P(test_case_name, test_name) \ | ||||
|   class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ | ||||
|       : public test_case_name { \ | ||||
|    public: \ | ||||
|     GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ | ||||
|     virtual void TestBody(); \ | ||||
|    private: \ | ||||
|     static int AddToRegistry() { \ | ||||
|       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ | ||||
|           GetTestCasePatternHolder<test_case_name>(\ | ||||
|               #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ | ||||
|                   #test_case_name, \ | ||||
|                   #test_name, \ | ||||
|                   new ::testing::internal::TestMetaFactory< \ | ||||
|                       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ | ||||
|       return 0; \ | ||||
|     } \ | ||||
|     static int gtest_registering_dummy_; \ | ||||
|     GTEST_DISALLOW_COPY_AND_ASSIGN_(\ | ||||
|         GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ | ||||
|   }; \ | ||||
|   int GTEST_TEST_CLASS_NAME_(test_case_name, \ | ||||
|                              test_name)::gtest_registering_dummy_ = \ | ||||
|       GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ | ||||
|   void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() | ||||
| 
 | ||||
| # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ | ||||
|   ::testing::internal::ParamGenerator<test_case_name::ParamType> \ | ||||
|       gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ | ||||
|   int gtest_##prefix##test_case_name##_dummy_ = \ | ||||
|       ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ | ||||
|           GetTestCasePatternHolder<test_case_name>(\ | ||||
|               #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ | ||||
|                   #prefix, \ | ||||
|                   >est_##prefix##test_case_name##_EvalGenerator_, \ | ||||
|                   __FILE__, __LINE__) | ||||
| 
 | ||||
| }  // namespace testing | ||||
| 
 | ||||
| #endif  // GTEST_HAS_PARAM_TEST | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ | ||||
							
								
								
									
										855
									
								
								lib/gtest/include/gtest/gtest-printers.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										855
									
								
								lib/gtest/include/gtest/gtest-printers.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,855 @@ | |||
| // Copyright 2007, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| 
 | ||||
| // Google Test - The Google C++ Testing Framework
 | ||||
| //
 | ||||
| // This file implements a universal value printer that can print a
 | ||||
| // value of any type T:
 | ||||
| //
 | ||||
| //   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
 | ||||
| //
 | ||||
| // A user can teach this function how to print a class type T by
 | ||||
| // defining either operator<<() or PrintTo() in the namespace that
 | ||||
| // defines T.  More specifically, the FIRST defined function in the
 | ||||
| // following list will be used (assuming T is defined in namespace
 | ||||
| // foo):
 | ||||
| //
 | ||||
| //   1. foo::PrintTo(const T&, ostream*)
 | ||||
| //   2. operator<<(ostream&, const T&) defined in either foo or the
 | ||||
| //      global namespace.
 | ||||
| //
 | ||||
| // If none of the above is defined, it will print the debug string of
 | ||||
| // the value if it is a protocol buffer, or print the raw bytes in the
 | ||||
| // value otherwise.
 | ||||
| //
 | ||||
| // To aid debugging: when T is a reference type, the address of the
 | ||||
| // value is also printed; when T is a (const) char pointer, both the
 | ||||
| // pointer value and the NUL-terminated string it points to are
 | ||||
| // printed.
 | ||||
| //
 | ||||
| // We also provide some convenient wrappers:
 | ||||
| //
 | ||||
| //   // Prints a value to a string.  For a (const or not) char
 | ||||
| //   // pointer, the NUL-terminated string (but not the pointer) is
 | ||||
| //   // printed.
 | ||||
| //   std::string ::testing::PrintToString(const T& value);
 | ||||
| //
 | ||||
| //   // Prints a value tersely: for a reference type, the referenced
 | ||||
| //   // value (but not the address) is printed; for a (const or not) char
 | ||||
| //   // pointer, the NUL-terminated string (but not the pointer) is
 | ||||
| //   // printed.
 | ||||
| //   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
 | ||||
| //
 | ||||
| //   // Prints value using the type inferred by the compiler.  The difference
 | ||||
| //   // from UniversalTersePrint() is that this function prints both the
 | ||||
| //   // pointer and the NUL-terminated string for a (const or not) char pointer.
 | ||||
| //   void ::testing::internal::UniversalPrint(const T& value, ostream*);
 | ||||
| //
 | ||||
| //   // Prints the fields of a tuple tersely to a string vector, one
 | ||||
| //   // element for each field. Tuple support must be enabled in
 | ||||
| //   // gtest-port.h.
 | ||||
| //   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
 | ||||
| //       const Tuple& value);
 | ||||
| //
 | ||||
| // Known limitation:
 | ||||
| //
 | ||||
| // The print primitives print the elements of an STL-style container
 | ||||
| // using the compiler-inferred type of *iter where iter is a
 | ||||
| // const_iterator of the container.  When const_iterator is an input
 | ||||
| // iterator but not a forward iterator, this inferred type may not
 | ||||
| // match value_type, and the print output may be incorrect.  In
 | ||||
| // practice, this is rarely a problem as for most containers
 | ||||
| // const_iterator is a forward iterator.  We'll fix this if there's an
 | ||||
| // actual need for it.  Note that this fix cannot rely on value_type
 | ||||
| // being defined as many user-defined container types don't have
 | ||||
| // value_type.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ | ||||
| 
 | ||||
| #include <ostream>  // NOLINT | ||||
| #include <sstream> | ||||
| #include <string> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // Definitions in the 'internal' and 'internal2' name spaces are
 | ||||
| // subject to change without notice.  DO NOT USE THEM IN USER CODE!
 | ||||
| namespace internal2 { | ||||
| 
 | ||||
| // Prints the given number of bytes in the given object to the given
 | ||||
| // ostream.
 | ||||
| GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, | ||||
|                                      size_t count, | ||||
|                                      ::std::ostream* os); | ||||
| 
 | ||||
| // For selecting which printer to use when a given type has neither <<
 | ||||
| // nor PrintTo().
 | ||||
| enum TypeKind { | ||||
|   kProtobuf,              // a protobuf type
 | ||||
|   kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
 | ||||
|                           // (e.g. a named or unnamed enum type)
 | ||||
|   kOtherType              // anything else
 | ||||
| }; | ||||
| 
 | ||||
| // TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
 | ||||
| // by the universal printer to print a value of type T when neither
 | ||||
| // operator<< nor PrintTo() is defined for T, where kTypeKind is the
 | ||||
| // "kind" of T as defined by enum TypeKind.
 | ||||
| template <typename T, TypeKind kTypeKind> | ||||
| class TypeWithoutFormatter { | ||||
|  public: | ||||
|   // This default version is called when kTypeKind is kOtherType.
 | ||||
|   static void PrintValue(const T& value, ::std::ostream* os) { | ||||
|     PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value), | ||||
|                          sizeof(value), os); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // We print a protobuf using its ShortDebugString() when the string
 | ||||
| // doesn't exceed this many characters; otherwise we print it using
 | ||||
| // DebugString() for better readability.
 | ||||
| const size_t kProtobufOneLinerMaxLength = 50; | ||||
| 
 | ||||
| template <typename T> | ||||
| class TypeWithoutFormatter<T, kProtobuf> { | ||||
|  public: | ||||
|   static void PrintValue(const T& value, ::std::ostream* os) { | ||||
|     const ::testing::internal::string short_str = value.ShortDebugString(); | ||||
|     const ::testing::internal::string pretty_str = | ||||
|         short_str.length() <= kProtobufOneLinerMaxLength ? | ||||
|         short_str : ("\n" + value.DebugString()); | ||||
|     *os << ("<" + pretty_str + ">"); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| template <typename T> | ||||
| class TypeWithoutFormatter<T, kConvertibleToInteger> { | ||||
|  public: | ||||
|   // Since T has no << operator or PrintTo() but can be implicitly
 | ||||
|   // converted to BiggestInt, we print it as a BiggestInt.
 | ||||
|   //
 | ||||
|   // Most likely T is an enum type (either named or unnamed), in which
 | ||||
|   // case printing it as an integer is the desired behavior.  In case
 | ||||
|   // T is not an enum, printing it as an integer is the best we can do
 | ||||
|   // given that it has no user-defined printer.
 | ||||
|   static void PrintValue(const T& value, ::std::ostream* os) { | ||||
|     const internal::BiggestInt kBigInt = value; | ||||
|     *os << kBigInt; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // Prints the given value to the given ostream.  If the value is a
 | ||||
| // protocol message, its debug string is printed; if it's an enum or
 | ||||
| // of a type implicitly convertible to BiggestInt, it's printed as an
 | ||||
| // integer; otherwise the bytes in the value are printed.  This is
 | ||||
| // what UniversalPrinter<T>::Print() does when it knows nothing about
 | ||||
| // type T and T has neither << operator nor PrintTo().
 | ||||
| //
 | ||||
| // A user can override this behavior for a class type Foo by defining
 | ||||
| // a << operator in the namespace where Foo is defined.
 | ||||
| //
 | ||||
| // We put this operator in namespace 'internal2' instead of 'internal'
 | ||||
| // to simplify the implementation, as much code in 'internal' needs to
 | ||||
| // use << in STL, which would conflict with our own << were it defined
 | ||||
| // in 'internal'.
 | ||||
| //
 | ||||
| // Note that this operator<< takes a generic std::basic_ostream<Char,
 | ||||
| // CharTraits> type instead of the more restricted std::ostream.  If
 | ||||
| // we define it to take an std::ostream instead, we'll get an
 | ||||
| // "ambiguous overloads" compiler error when trying to print a type
 | ||||
| // Foo that supports streaming to std::basic_ostream<Char,
 | ||||
| // CharTraits>, as the compiler cannot tell whether
 | ||||
| // operator<<(std::ostream&, const T&) or
 | ||||
| // operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
 | ||||
| // specific.
 | ||||
| template <typename Char, typename CharTraits, typename T> | ||||
| ::std::basic_ostream<Char, CharTraits>& operator<<( | ||||
|     ::std::basic_ostream<Char, CharTraits>& os, const T& x) { | ||||
|   TypeWithoutFormatter<T, | ||||
|       (internal::IsAProtocolMessage<T>::value ? kProtobuf : | ||||
|        internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ? | ||||
|        kConvertibleToInteger : kOtherType)>::PrintValue(x, &os); | ||||
|   return os; | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal2
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
 | ||||
| // magic needed for implementing UniversalPrinter won't work.
 | ||||
| namespace testing_internal { | ||||
| 
 | ||||
| // Used to print a value that is not an STL-style container when the
 | ||||
| // user doesn't define PrintTo() for it.
 | ||||
| template <typename T> | ||||
| void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { | ||||
|   // With the following statement, during unqualified name lookup,
 | ||||
|   // testing::internal2::operator<< appears as if it was declared in
 | ||||
|   // the nearest enclosing namespace that contains both
 | ||||
|   // ::testing_internal and ::testing::internal2, i.e. the global
 | ||||
|   // namespace.  For more details, refer to the C++ Standard section
 | ||||
|   // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
 | ||||
|   // testing::internal2::operator<< in case T doesn't come with a <<
 | ||||
|   // operator.
 | ||||
|   //
 | ||||
|   // We cannot write 'using ::testing::internal2::operator<<;', which
 | ||||
|   // gcc 3.3 fails to compile due to a compiler bug.
 | ||||
|   using namespace ::testing::internal2;  // NOLINT
 | ||||
| 
 | ||||
|   // Assuming T is defined in namespace foo, in the next statement,
 | ||||
|   // the compiler will consider all of:
 | ||||
|   //
 | ||||
|   //   1. foo::operator<< (thanks to Koenig look-up),
 | ||||
|   //   2. ::operator<< (as the current namespace is enclosed in ::),
 | ||||
|   //   3. testing::internal2::operator<< (thanks to the using statement above).
 | ||||
|   //
 | ||||
|   // The operator<< whose type matches T best will be picked.
 | ||||
|   //
 | ||||
|   // We deliberately allow #2 to be a candidate, as sometimes it's
 | ||||
|   // impossible to define #1 (e.g. when foo is ::std, defining
 | ||||
|   // anything in it is undefined behavior unless you are a compiler
 | ||||
|   // vendor.).
 | ||||
|   *os << value; | ||||
| } | ||||
| 
 | ||||
| }  // namespace testing_internal
 | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
 | ||||
| // value to the given ostream.  The caller must ensure that
 | ||||
| // 'ostream_ptr' is not NULL, or the behavior is undefined.
 | ||||
| //
 | ||||
| // We define UniversalPrinter as a class template (as opposed to a
 | ||||
| // function template), as we need to partially specialize it for
 | ||||
| // reference types, which cannot be done with function templates.
 | ||||
| template <typename T> | ||||
| class UniversalPrinter; | ||||
| 
 | ||||
| template <typename T> | ||||
| void UniversalPrint(const T& value, ::std::ostream* os); | ||||
| 
 | ||||
| // Used to print an STL-style container when the user doesn't define
 | ||||
| // a PrintTo() for it.
 | ||||
| template <typename C> | ||||
| void DefaultPrintTo(IsContainer /* dummy */, | ||||
|                     false_type /* is not a pointer */, | ||||
|                     const C& container, ::std::ostream* os) { | ||||
|   const size_t kMaxCount = 32;  // The maximum number of elements to print.
 | ||||
|   *os << '{'; | ||||
|   size_t count = 0; | ||||
|   for (typename C::const_iterator it = container.begin(); | ||||
|        it != container.end(); ++it, ++count) { | ||||
|     if (count > 0) { | ||||
|       *os << ','; | ||||
|       if (count == kMaxCount) {  // Enough has been printed.
 | ||||
|         *os << " ..."; | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|     *os << ' '; | ||||
|     // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
 | ||||
|     // handle *it being a native array.
 | ||||
|     internal::UniversalPrint(*it, os); | ||||
|   } | ||||
| 
 | ||||
|   if (count > 0) { | ||||
|     *os << ' '; | ||||
|   } | ||||
|   *os << '}'; | ||||
| } | ||||
| 
 | ||||
| // Used to print a pointer that is neither a char pointer nor a member
 | ||||
| // pointer, when the user doesn't define PrintTo() for it.  (A member
 | ||||
| // variable pointer or member function pointer doesn't really point to
 | ||||
| // a location in the address space.  Their representation is
 | ||||
| // implementation-defined.  Therefore they will be printed as raw
 | ||||
| // bytes.)
 | ||||
| template <typename T> | ||||
| void DefaultPrintTo(IsNotContainer /* dummy */, | ||||
|                     true_type /* is a pointer */, | ||||
|                     T* p, ::std::ostream* os) { | ||||
|   if (p == NULL) { | ||||
|     *os << "NULL"; | ||||
|   } else { | ||||
|     // C++ doesn't allow casting from a function pointer to any object
 | ||||
|     // pointer.
 | ||||
|     //
 | ||||
|     // IsTrue() silences warnings: "Condition is always true",
 | ||||
|     // "unreachable code".
 | ||||
|     if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) { | ||||
|       // T is not a function type.  We just call << to print p,
 | ||||
|       // relying on ADL to pick up user-defined << for their pointer
 | ||||
|       // types, if any.
 | ||||
|       *os << p; | ||||
|     } else { | ||||
|       // T is a function type, so '*os << p' doesn't do what we want
 | ||||
|       // (it just prints p as bool).  We want to print p as a const
 | ||||
|       // void*.  However, we cannot cast it to const void* directly,
 | ||||
|       // even using reinterpret_cast, as earlier versions of gcc
 | ||||
|       // (e.g. 3.4.5) cannot compile the cast when p is a function
 | ||||
|       // pointer.  Casting to UInt64 first solves the problem.
 | ||||
|       *os << reinterpret_cast<const void*>( | ||||
|           reinterpret_cast<internal::UInt64>(p)); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Used to print a non-container, non-pointer value when the user
 | ||||
| // doesn't define PrintTo() for it.
 | ||||
| template <typename T> | ||||
| void DefaultPrintTo(IsNotContainer /* dummy */, | ||||
|                     false_type /* is not a pointer */, | ||||
|                     const T& value, ::std::ostream* os) { | ||||
|   ::testing_internal::DefaultPrintNonContainerTo(value, os); | ||||
| } | ||||
| 
 | ||||
| // Prints the given value using the << operator if it has one;
 | ||||
| // otherwise prints the bytes in it.  This is what
 | ||||
| // UniversalPrinter<T>::Print() does when PrintTo() is not specialized
 | ||||
| // or overloaded for type T.
 | ||||
| //
 | ||||
| // A user can override this behavior for a class type Foo by defining
 | ||||
| // an overload of PrintTo() in the namespace where Foo is defined.  We
 | ||||
| // give the user this option as sometimes defining a << operator for
 | ||||
| // Foo is not desirable (e.g. the coding style may prevent doing it,
 | ||||
| // or there is already a << operator but it doesn't do what the user
 | ||||
| // wants).
 | ||||
| template <typename T> | ||||
| void PrintTo(const T& value, ::std::ostream* os) { | ||||
|   // DefaultPrintTo() is overloaded.  The type of its first two
 | ||||
|   // arguments determine which version will be picked.  If T is an
 | ||||
|   // STL-style container, the version for container will be called; if
 | ||||
|   // T is a pointer, the pointer version will be called; otherwise the
 | ||||
|   // generic version will be called.
 | ||||
|   //
 | ||||
|   // Note that we check for container types here, prior to we check
 | ||||
|   // for protocol message types in our operator<<.  The rationale is:
 | ||||
|   //
 | ||||
|   // For protocol messages, we want to give people a chance to
 | ||||
|   // override Google Mock's format by defining a PrintTo() or
 | ||||
|   // operator<<.  For STL containers, other formats can be
 | ||||
|   // incompatible with Google Mock's format for the container
 | ||||
|   // elements; therefore we check for container types here to ensure
 | ||||
|   // that our format is used.
 | ||||
|   //
 | ||||
|   // The second argument of DefaultPrintTo() is needed to bypass a bug
 | ||||
|   // in Symbian's C++ compiler that prevents it from picking the right
 | ||||
|   // overload between:
 | ||||
|   //
 | ||||
|   //   PrintTo(const T& x, ...);
 | ||||
|   //   PrintTo(T* x, ...);
 | ||||
|   DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os); | ||||
| } | ||||
| 
 | ||||
| // The following list of PrintTo() overloads tells
 | ||||
| // UniversalPrinter<T>::Print() how to print standard types (built-in
 | ||||
| // types, strings, plain arrays, and pointers).
 | ||||
| 
 | ||||
| // Overloads for various char types.
 | ||||
| GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); | ||||
| GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); | ||||
| inline void PrintTo(char c, ::std::ostream* os) { | ||||
|   // When printing a plain char, we always treat it as unsigned.  This
 | ||||
|   // way, the output won't be affected by whether the compiler thinks
 | ||||
|   // char is signed or not.
 | ||||
|   PrintTo(static_cast<unsigned char>(c), os); | ||||
| } | ||||
| 
 | ||||
| // Overloads for other simple built-in types.
 | ||||
| inline void PrintTo(bool x, ::std::ostream* os) { | ||||
|   *os << (x ? "true" : "false"); | ||||
| } | ||||
| 
 | ||||
| // Overload for wchar_t type.
 | ||||
| // Prints a wchar_t as a symbol if it is printable or as its internal
 | ||||
| // code otherwise and also as its decimal code (except for L'\0').
 | ||||
| // The L'\0' char is printed as "L'\\0'". The decimal code is printed
 | ||||
| // as signed integer when wchar_t is implemented by the compiler
 | ||||
| // as a signed type and is printed as an unsigned integer when wchar_t
 | ||||
| // is implemented as an unsigned type.
 | ||||
| GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); | ||||
| 
 | ||||
| // Overloads for C strings.
 | ||||
| GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); | ||||
| inline void PrintTo(char* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const char*>(s), os); | ||||
| } | ||||
| 
 | ||||
| // signed/unsigned char is often used for representing binary data, so
 | ||||
| // we print pointers to it as void* to be safe.
 | ||||
| inline void PrintTo(const signed char* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const void*>(s), os); | ||||
| } | ||||
| inline void PrintTo(signed char* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const void*>(s), os); | ||||
| } | ||||
| inline void PrintTo(const unsigned char* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const void*>(s), os); | ||||
| } | ||||
| inline void PrintTo(unsigned char* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const void*>(s), os); | ||||
| } | ||||
| 
 | ||||
| // MSVC can be configured to define wchar_t as a typedef of unsigned
 | ||||
| // short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
 | ||||
| // type.  When wchar_t is a typedef, defining an overload for const
 | ||||
| // wchar_t* would cause unsigned short* be printed as a wide string,
 | ||||
| // possibly causing invalid memory accesses.
 | ||||
| #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) | ||||
| // Overloads for wide C strings
 | ||||
| GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); | ||||
| inline void PrintTo(wchar_t* s, ::std::ostream* os) { | ||||
|   PrintTo(ImplicitCast_<const wchar_t*>(s), os); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| // Overload for C arrays.  Multi-dimensional arrays are printed
 | ||||
| // properly.
 | ||||
| 
 | ||||
| // Prints the given number of elements in an array, without printing
 | ||||
| // the curly braces.
 | ||||
| template <typename T> | ||||
| void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { | ||||
|   UniversalPrint(a[0], os); | ||||
|   for (size_t i = 1; i != count; i++) { | ||||
|     *os << ", "; | ||||
|     UniversalPrint(a[i], os); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Overloads for ::string and ::std::string.
 | ||||
| #if GTEST_HAS_GLOBAL_STRING | ||||
| GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os); | ||||
| inline void PrintTo(const ::string& s, ::std::ostream* os) { | ||||
|   PrintStringTo(s, os); | ||||
| } | ||||
| #endif  // GTEST_HAS_GLOBAL_STRING
 | ||||
| 
 | ||||
| GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); | ||||
| inline void PrintTo(const ::std::string& s, ::std::ostream* os) { | ||||
|   PrintStringTo(s, os); | ||||
| } | ||||
| 
 | ||||
| // Overloads for ::wstring and ::std::wstring.
 | ||||
| #if GTEST_HAS_GLOBAL_WSTRING | ||||
| GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); | ||||
| inline void PrintTo(const ::wstring& s, ::std::ostream* os) { | ||||
|   PrintWideStringTo(s, os); | ||||
| } | ||||
| #endif  // GTEST_HAS_GLOBAL_WSTRING
 | ||||
| 
 | ||||
| #if GTEST_HAS_STD_WSTRING | ||||
| GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); | ||||
| inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { | ||||
|   PrintWideStringTo(s, os); | ||||
| } | ||||
| #endif  // GTEST_HAS_STD_WSTRING
 | ||||
| 
 | ||||
| #if GTEST_HAS_TR1_TUPLE | ||||
| // Overload for ::std::tr1::tuple.  Needed for printing function arguments,
 | ||||
| // which are packed as tuples.
 | ||||
| 
 | ||||
| // Helper function for printing a tuple.  T must be instantiated with
 | ||||
| // a tuple type.
 | ||||
| template <typename T> | ||||
| void PrintTupleTo(const T& t, ::std::ostream* os); | ||||
| 
 | ||||
| // Overloaded PrintTo() for tuples of various arities.  We support
 | ||||
| // tuples of up-to 10 fields.  The following implementation works
 | ||||
| // regardless of whether tr1::tuple is implemented using the
 | ||||
| // non-standard variadic template feature or not.
 | ||||
| 
 | ||||
| inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1> | ||||
| void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t, | ||||
|              ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5, | ||||
|           typename T6> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t, | ||||
|              ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5, | ||||
|           typename T6, typename T7> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t, | ||||
|              ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5, | ||||
|           typename T6, typename T7, typename T8> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t, | ||||
|              ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5, | ||||
|           typename T6, typename T7, typename T8, typename T9> | ||||
| void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t, | ||||
|              ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| 
 | ||||
| template <typename T1, typename T2, typename T3, typename T4, typename T5, | ||||
|           typename T6, typename T7, typename T8, typename T9, typename T10> | ||||
| void PrintTo( | ||||
|     const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t, | ||||
|     ::std::ostream* os) { | ||||
|   PrintTupleTo(t, os); | ||||
| } | ||||
| #endif  // GTEST_HAS_TR1_TUPLE
 | ||||
| 
 | ||||
| // Overload for std::pair.
 | ||||
| template <typename T1, typename T2> | ||||
| void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) { | ||||
|   *os << '('; | ||||
|   // We cannot use UniversalPrint(value.first, os) here, as T1 may be
 | ||||
|   // a reference type.  The same for printing value.second.
 | ||||
|   UniversalPrinter<T1>::Print(value.first, os); | ||||
|   *os << ", "; | ||||
|   UniversalPrinter<T2>::Print(value.second, os); | ||||
|   *os << ')'; | ||||
| } | ||||
| 
 | ||||
| // Implements printing a non-reference type T by letting the compiler
 | ||||
| // pick the right overload of PrintTo() for T.
 | ||||
| template <typename T> | ||||
| class UniversalPrinter { | ||||
|  public: | ||||
|   // MSVC warns about adding const to a function type, so we want to
 | ||||
|   // disable the warning.
 | ||||
| #ifdef _MSC_VER | ||||
| # pragma warning(push)          // Saves the current warning state.
 | ||||
| # pragma warning(disable:4180)  // Temporarily disables warning 4180.
 | ||||
| #endif  // _MSC_VER
 | ||||
| 
 | ||||
|   // Note: we deliberately don't call this PrintTo(), as that name
 | ||||
|   // conflicts with ::testing::internal::PrintTo in the body of the
 | ||||
|   // function.
 | ||||
|   static void Print(const T& value, ::std::ostream* os) { | ||||
|     // By default, ::testing::internal::PrintTo() is used for printing
 | ||||
|     // the value.
 | ||||
|     //
 | ||||
|     // Thanks to Koenig look-up, if T is a class and has its own
 | ||||
|     // PrintTo() function defined in its namespace, that function will
 | ||||
|     // be visible here.  Since it is more specific than the generic ones
 | ||||
|     // in ::testing::internal, it will be picked by the compiler in the
 | ||||
|     // following statement - exactly what we want.
 | ||||
|     PrintTo(value, os); | ||||
|   } | ||||
| 
 | ||||
| #ifdef _MSC_VER | ||||
| # pragma warning(pop)           // Restores the warning state.
 | ||||
| #endif  // _MSC_VER
 | ||||
| }; | ||||
| 
 | ||||
| // UniversalPrintArray(begin, len, os) prints an array of 'len'
 | ||||
| // elements, starting at address 'begin'.
 | ||||
| template <typename T> | ||||
| void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { | ||||
|   if (len == 0) { | ||||
|     *os << "{}"; | ||||
|   } else { | ||||
|     *os << "{ "; | ||||
|     const size_t kThreshold = 18; | ||||
|     const size_t kChunkSize = 8; | ||||
|     // If the array has more than kThreshold elements, we'll have to
 | ||||
|     // omit some details by printing only the first and the last
 | ||||
|     // kChunkSize elements.
 | ||||
|     // TODO(wan@google.com): let the user control the threshold using a flag.
 | ||||
|     if (len <= kThreshold) { | ||||
|       PrintRawArrayTo(begin, len, os); | ||||
|     } else { | ||||
|       PrintRawArrayTo(begin, kChunkSize, os); | ||||
|       *os << ", ..., "; | ||||
|       PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); | ||||
|     } | ||||
|     *os << " }"; | ||||
|   } | ||||
| } | ||||
| // This overload prints a (const) char array compactly.
 | ||||
| GTEST_API_ void UniversalPrintArray( | ||||
|     const char* begin, size_t len, ::std::ostream* os); | ||||
| 
 | ||||
| // This overload prints a (const) wchar_t array compactly.
 | ||||
| GTEST_API_ void UniversalPrintArray( | ||||
|     const wchar_t* begin, size_t len, ::std::ostream* os); | ||||
| 
 | ||||
| // Implements printing an array type T[N].
 | ||||
| template <typename T, size_t N> | ||||
| class UniversalPrinter<T[N]> { | ||||
|  public: | ||||
|   // Prints the given array, omitting some elements when there are too
 | ||||
|   // many.
 | ||||
|   static void Print(const T (&a)[N], ::std::ostream* os) { | ||||
|     UniversalPrintArray(a, N, os); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // Implements printing a reference type T&.
 | ||||
| template <typename T> | ||||
| class UniversalPrinter<T&> { | ||||
|  public: | ||||
|   // MSVC warns about adding const to a function type, so we want to
 | ||||
|   // disable the warning.
 | ||||
| #ifdef _MSC_VER | ||||
| # pragma warning(push)          // Saves the current warning state.
 | ||||
| # pragma warning(disable:4180)  // Temporarily disables warning 4180.
 | ||||
| #endif  // _MSC_VER
 | ||||
| 
 | ||||
|   static void Print(const T& value, ::std::ostream* os) { | ||||
|     // Prints the address of the value.  We use reinterpret_cast here
 | ||||
|     // as static_cast doesn't compile when T is a function type.
 | ||||
|     *os << "@" << reinterpret_cast<const void*>(&value) << " "; | ||||
| 
 | ||||
|     // Then prints the value itself.
 | ||||
|     UniversalPrint(value, os); | ||||
|   } | ||||
| 
 | ||||
| #ifdef _MSC_VER | ||||
| # pragma warning(pop)           // Restores the warning state.
 | ||||
| #endif  // _MSC_VER
 | ||||
| }; | ||||
| 
 | ||||
| // Prints a value tersely: for a reference type, the referenced value
 | ||||
| // (but not the address) is printed; for a (const) char pointer, the
 | ||||
| // NUL-terminated string (but not the pointer) is printed.
 | ||||
| 
 | ||||
| template <typename T> | ||||
| class UniversalTersePrinter { | ||||
|  public: | ||||
|   static void Print(const T& value, ::std::ostream* os) { | ||||
|     UniversalPrint(value, os); | ||||
|   } | ||||
| }; | ||||
| template <typename T> | ||||
| class UniversalTersePrinter<T&> { | ||||
|  public: | ||||
|   static void Print(const T& value, ::std::ostream* os) { | ||||
|     UniversalPrint(value, os); | ||||
|   } | ||||
| }; | ||||
| template <typename T, size_t N> | ||||
| class UniversalTersePrinter<T[N]> { | ||||
|  public: | ||||
|   static void Print(const T (&value)[N], ::std::ostream* os) { | ||||
|     UniversalPrinter<T[N]>::Print(value, os); | ||||
|   } | ||||
| }; | ||||
| template <> | ||||
| class UniversalTersePrinter<const char*> { | ||||
|  public: | ||||
|   static void Print(const char* str, ::std::ostream* os) { | ||||
|     if (str == NULL) { | ||||
|       *os << "NULL"; | ||||
|     } else { | ||||
|       UniversalPrint(string(str), os); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| template <> | ||||
| class UniversalTersePrinter<char*> { | ||||
|  public: | ||||
|   static void Print(char* str, ::std::ostream* os) { | ||||
|     UniversalTersePrinter<const char*>::Print(str, os); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| #if GTEST_HAS_STD_WSTRING | ||||
| template <> | ||||
| class UniversalTersePrinter<const wchar_t*> { | ||||
|  public: | ||||
|   static void Print(const wchar_t* str, ::std::ostream* os) { | ||||
|     if (str == NULL) { | ||||
|       *os << "NULL"; | ||||
|     } else { | ||||
|       UniversalPrint(::std::wstring(str), os); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| template <> | ||||
| class UniversalTersePrinter<wchar_t*> { | ||||
|  public: | ||||
|   static void Print(wchar_t* str, ::std::ostream* os) { | ||||
|     UniversalTersePrinter<const wchar_t*>::Print(str, os); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| template <typename T> | ||||
| void UniversalTersePrint(const T& value, ::std::ostream* os) { | ||||
|   UniversalTersePrinter<T>::Print(value, os); | ||||
| } | ||||
| 
 | ||||
| // Prints a value using the type inferred by the compiler.  The
 | ||||
| // difference between this and UniversalTersePrint() is that for a
 | ||||
| // (const) char pointer, this prints both the pointer and the
 | ||||
| // NUL-terminated string.
 | ||||
| template <typename T> | ||||
| void UniversalPrint(const T& value, ::std::ostream* os) { | ||||
|   // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
 | ||||
|   // UniversalPrinter with T directly.
 | ||||
|   typedef T T1; | ||||
|   UniversalPrinter<T1>::Print(value, os); | ||||
| } | ||||
| 
 | ||||
| #if GTEST_HAS_TR1_TUPLE | ||||
| typedef ::std::vector<string> Strings; | ||||
| 
 | ||||
| // This helper template allows PrintTo() for tuples and
 | ||||
| // UniversalTersePrintTupleFieldsToStrings() to be defined by
 | ||||
| // induction on the number of tuple fields.  The idea is that
 | ||||
| // TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
 | ||||
| // fields in tuple t, and can be defined in terms of
 | ||||
| // TuplePrefixPrinter<N - 1>.
 | ||||
| 
 | ||||
| // The inductive case.
 | ||||
| template <size_t N> | ||||
| struct TuplePrefixPrinter { | ||||
|   // Prints the first N fields of a tuple.
 | ||||
|   template <typename Tuple> | ||||
|   static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { | ||||
|     TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os); | ||||
|     *os << ", "; | ||||
|     UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type> | ||||
|         ::Print(::std::tr1::get<N - 1>(t), os); | ||||
|   } | ||||
| 
 | ||||
|   // Tersely prints the first N fields of a tuple to a string vector,
 | ||||
|   // one element for each field.
 | ||||
|   template <typename Tuple> | ||||
|   static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { | ||||
|     TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings); | ||||
|     ::std::stringstream ss; | ||||
|     UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss); | ||||
|     strings->push_back(ss.str()); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // Base cases.
 | ||||
| template <> | ||||
| struct TuplePrefixPrinter<0> { | ||||
|   template <typename Tuple> | ||||
|   static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} | ||||
| 
 | ||||
|   template <typename Tuple> | ||||
|   static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} | ||||
| }; | ||||
| // We have to specialize the entire TuplePrefixPrinter<> class
 | ||||
| // template here, even though the definition of
 | ||||
| // TersePrintPrefixToStrings() is the same as the generic version, as
 | ||||
| // Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
 | ||||
| // support specializing a method template of a class template.
 | ||||
| template <> | ||||
| struct TuplePrefixPrinter<1> { | ||||
|   template <typename Tuple> | ||||
|   static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { | ||||
|     UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>:: | ||||
|         Print(::std::tr1::get<0>(t), os); | ||||
|   } | ||||
| 
 | ||||
|   template <typename Tuple> | ||||
|   static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { | ||||
|     ::std::stringstream ss; | ||||
|     UniversalTersePrint(::std::tr1::get<0>(t), &ss); | ||||
|     strings->push_back(ss.str()); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // Helper function for printing a tuple.  T must be instantiated with
 | ||||
| // a tuple type.
 | ||||
| template <typename T> | ||||
| void PrintTupleTo(const T& t, ::std::ostream* os) { | ||||
|   *os << "("; | ||||
|   TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>:: | ||||
|       PrintPrefixTo(t, os); | ||||
|   *os << ")"; | ||||
| } | ||||
| 
 | ||||
| // Prints the fields of a tuple tersely to a string vector, one
 | ||||
| // element for each field.  See the comment before
 | ||||
| // UniversalTersePrint() for how we define "tersely".
 | ||||
| template <typename Tuple> | ||||
| Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { | ||||
|   Strings result; | ||||
|   TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>:: | ||||
|       TersePrintPrefixToStrings(value, &result); | ||||
|   return result; | ||||
| } | ||||
| #endif  // GTEST_HAS_TR1_TUPLE
 | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| template <typename T> | ||||
| ::std::string PrintToString(const T& value) { | ||||
|   ::std::stringstream ss; | ||||
|   internal::UniversalTersePrinter<T>::Print(value, &ss); | ||||
|   return ss.str(); | ||||
| } | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
 | ||||
							
								
								
									
										232
									
								
								lib/gtest/include/gtest/gtest-spi.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								lib/gtest/include/gtest/gtest-spi.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,232 @@ | |||
| // Copyright 2007, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| //
 | ||||
| // Utilities for testing Google Test itself and code that uses Google Test
 | ||||
| // (e.g. frameworks built on top of Google Test).
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ | ||||
| 
 | ||||
| #include "gtest/gtest.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // This helper class can be used to mock out Google Test failure reporting
 | ||||
| // so that we can test Google Test or code that builds on Google Test.
 | ||||
| //
 | ||||
| // An object of this class appends a TestPartResult object to the
 | ||||
| // TestPartResultArray object given in the constructor whenever a Google Test
 | ||||
| // failure is reported. It can either intercept only failures that are
 | ||||
| // generated in the same thread that created this object or it can intercept
 | ||||
| // all generated failures. The scope of this mock object can be controlled with
 | ||||
| // the second argument to the two arguments constructor.
 | ||||
| class GTEST_API_ ScopedFakeTestPartResultReporter | ||||
|     : public TestPartResultReporterInterface { | ||||
|  public: | ||||
|   // The two possible mocking modes of this object.
 | ||||
|   enum InterceptMode { | ||||
|     INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
 | ||||
|     INTERCEPT_ALL_THREADS           // Intercepts all failures.
 | ||||
|   }; | ||||
| 
 | ||||
|   // The c'tor sets this object as the test part result reporter used
 | ||||
|   // by Google Test.  The 'result' parameter specifies where to report the
 | ||||
|   // results. This reporter will only catch failures generated in the current
 | ||||
|   // thread. DEPRECATED
 | ||||
|   explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); | ||||
| 
 | ||||
|   // Same as above, but you can choose the interception scope of this object.
 | ||||
|   ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, | ||||
|                                    TestPartResultArray* result); | ||||
| 
 | ||||
|   // The d'tor restores the previous test part result reporter.
 | ||||
|   virtual ~ScopedFakeTestPartResultReporter(); | ||||
| 
 | ||||
|   // Appends the TestPartResult object to the TestPartResultArray
 | ||||
|   // received in the constructor.
 | ||||
|   //
 | ||||
|   // This method is from the TestPartResultReporterInterface
 | ||||
|   // interface.
 | ||||
|   virtual void ReportTestPartResult(const TestPartResult& result); | ||||
|  private: | ||||
|   void Init(); | ||||
| 
 | ||||
|   const InterceptMode intercept_mode_; | ||||
|   TestPartResultReporterInterface* old_reporter_; | ||||
|   TestPartResultArray* const result_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); | ||||
| }; | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // A helper class for implementing EXPECT_FATAL_FAILURE() and
 | ||||
| // EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
 | ||||
| // TestPartResultArray contains exactly one failure that has the given
 | ||||
| // type and contains the given substring.  If that's not the case, a
 | ||||
| // non-fatal failure will be generated.
 | ||||
| class GTEST_API_ SingleFailureChecker { | ||||
|  public: | ||||
|   // The constructor remembers the arguments.
 | ||||
|   SingleFailureChecker(const TestPartResultArray* results, | ||||
|                        TestPartResult::Type type, | ||||
|                        const string& substr); | ||||
|   ~SingleFailureChecker(); | ||||
|  private: | ||||
|   const TestPartResultArray* const results_; | ||||
|   const TestPartResult::Type type_; | ||||
|   const string substr_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| // A set of macros for testing Google Test assertions or code that's expected
 | ||||
| // to generate Google Test fatal failures.  It verifies that the given
 | ||||
| // statement will cause exactly one fatal Google Test failure with 'substr'
 | ||||
| // being part of the failure message.
 | ||||
| //
 | ||||
| // There are two different versions of this macro. EXPECT_FATAL_FAILURE only
 | ||||
| // affects and considers failures generated in the current thread and
 | ||||
| // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
 | ||||
| //
 | ||||
| // The verification of the assertion is done correctly even when the statement
 | ||||
| // throws an exception or aborts the current function.
 | ||||
| //
 | ||||
| // Known restrictions:
 | ||||
| //   - 'statement' cannot reference local non-static variables or
 | ||||
| //     non-static members of the current object.
 | ||||
| //   - 'statement' cannot return a value.
 | ||||
| //   - You cannot stream a failure message to this macro.
 | ||||
| //
 | ||||
| // Note that even though the implementations of the following two
 | ||||
| // macros are much alike, we cannot refactor them to use a common
 | ||||
| // helper macro, due to some peculiarity in how the preprocessor
 | ||||
| // works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
 | ||||
| // gtest_unittest.cc will fail to compile if we do that.
 | ||||
| #define EXPECT_FATAL_FAILURE(statement, substr) \ | ||||
|   do { \ | ||||
|     class GTestExpectFatalFailureHelper {\ | ||||
|      public:\ | ||||
|       static void Execute() { statement; }\ | ||||
|     };\ | ||||
|     ::testing::TestPartResultArray gtest_failures;\ | ||||
|     ::testing::internal::SingleFailureChecker gtest_checker(\ | ||||
|         >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ | ||||
|     {\ | ||||
|       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||||
|           ::testing::ScopedFakeTestPartResultReporter:: \ | ||||
|           INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ | ||||
|       GTestExpectFatalFailureHelper::Execute();\ | ||||
|     }\ | ||||
|   } while (::testing::internal::AlwaysFalse()) | ||||
| 
 | ||||
| #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ | ||||
|   do { \ | ||||
|     class GTestExpectFatalFailureHelper {\ | ||||
|      public:\ | ||||
|       static void Execute() { statement; }\ | ||||
|     };\ | ||||
|     ::testing::TestPartResultArray gtest_failures;\ | ||||
|     ::testing::internal::SingleFailureChecker gtest_checker(\ | ||||
|         >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ | ||||
|     {\ | ||||
|       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||||
|           ::testing::ScopedFakeTestPartResultReporter:: \ | ||||
|           INTERCEPT_ALL_THREADS, >est_failures);\ | ||||
|       GTestExpectFatalFailureHelper::Execute();\ | ||||
|     }\ | ||||
|   } while (::testing::internal::AlwaysFalse()) | ||||
| 
 | ||||
| // A macro for testing Google Test assertions or code that's expected to
 | ||||
| // generate Google Test non-fatal failures.  It asserts that the given
 | ||||
| // statement will cause exactly one non-fatal Google Test failure with 'substr'
 | ||||
| // being part of the failure message.
 | ||||
| //
 | ||||
| // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
 | ||||
| // affects and considers failures generated in the current thread and
 | ||||
| // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
 | ||||
| //
 | ||||
| // 'statement' is allowed to reference local variables and members of
 | ||||
| // the current object.
 | ||||
| //
 | ||||
| // The verification of the assertion is done correctly even when the statement
 | ||||
| // throws an exception or aborts the current function.
 | ||||
| //
 | ||||
| // Known restrictions:
 | ||||
| //   - You cannot stream a failure message to this macro.
 | ||||
| //
 | ||||
| // Note that even though the implementations of the following two
 | ||||
| // macros are much alike, we cannot refactor them to use a common
 | ||||
| // helper macro, due to some peculiarity in how the preprocessor
 | ||||
| // works.  If we do that, the code won't compile when the user gives
 | ||||
| // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
 | ||||
| // expands to code containing an unprotected comma.  The
 | ||||
| // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
 | ||||
| // catches that.
 | ||||
| //
 | ||||
| // For the same reason, we have to write
 | ||||
| //   if (::testing::internal::AlwaysTrue()) { statement; }
 | ||||
| // instead of
 | ||||
| //   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
 | ||||
| // to avoid an MSVC warning on unreachable code.
 | ||||
| #define EXPECT_NONFATAL_FAILURE(statement, substr) \ | ||||
|   do {\ | ||||
|     ::testing::TestPartResultArray gtest_failures;\ | ||||
|     ::testing::internal::SingleFailureChecker gtest_checker(\ | ||||
|         >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ | ||||
|         (substr));\ | ||||
|     {\ | ||||
|       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||||
|           ::testing::ScopedFakeTestPartResultReporter:: \ | ||||
|           INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ | ||||
|       if (::testing::internal::AlwaysTrue()) { statement; }\ | ||||
|     }\ | ||||
|   } while (::testing::internal::AlwaysFalse()) | ||||
| 
 | ||||
| #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ | ||||
|   do {\ | ||||
|     ::testing::TestPartResultArray gtest_failures;\ | ||||
|     ::testing::internal::SingleFailureChecker gtest_checker(\ | ||||
|         >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ | ||||
|         (substr));\ | ||||
|     {\ | ||||
|       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||||
|           ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ | ||||
|           >est_failures);\ | ||||
|       if (::testing::internal::AlwaysTrue()) { statement; }\ | ||||
|     }\ | ||||
|   } while (::testing::internal::AlwaysFalse()) | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
 | ||||
							
								
								
									
										179
									
								
								lib/gtest/include/gtest/gtest-test-part.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								lib/gtest/include/gtest/gtest-test-part.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,179 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: mheule@google.com (Markus Heule)
 | ||||
| //
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ | ||||
| 
 | ||||
| #include <iosfwd> | ||||
| #include <vector> | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| #include "gtest/internal/gtest-string.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // A copyable object representing the result of a test part (i.e. an
 | ||||
| // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
 | ||||
| //
 | ||||
| // Don't inherit from TestPartResult as its destructor is not virtual.
 | ||||
| class GTEST_API_ TestPartResult { | ||||
|  public: | ||||
|   // The possible outcomes of a test part (i.e. an assertion or an
 | ||||
|   // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
 | ||||
|   enum Type { | ||||
|     kSuccess,          // Succeeded.
 | ||||
|     kNonFatalFailure,  // Failed but the test can continue.
 | ||||
|     kFatalFailure      // Failed and the test should be terminated.
 | ||||
|   }; | ||||
| 
 | ||||
|   // C'tor.  TestPartResult does NOT have a default constructor.
 | ||||
|   // Always use this constructor (with parameters) to create a
 | ||||
|   // TestPartResult object.
 | ||||
|   TestPartResult(Type a_type, | ||||
|                  const char* a_file_name, | ||||
|                  int a_line_number, | ||||
|                  const char* a_message) | ||||
|       : type_(a_type), | ||||
|         file_name_(a_file_name == NULL ? "" : a_file_name), | ||||
|         line_number_(a_line_number), | ||||
|         summary_(ExtractSummary(a_message)), | ||||
|         message_(a_message) { | ||||
|   } | ||||
| 
 | ||||
|   // Gets the outcome of the test part.
 | ||||
|   Type type() const { return type_; } | ||||
| 
 | ||||
|   // Gets the name of the source file where the test part took place, or
 | ||||
|   // NULL if it's unknown.
 | ||||
|   const char* file_name() const { | ||||
|     return file_name_.empty() ? NULL : file_name_.c_str(); | ||||
|   } | ||||
| 
 | ||||
|   // Gets the line in the source file where the test part took place,
 | ||||
|   // or -1 if it's unknown.
 | ||||
|   int line_number() const { return line_number_; } | ||||
| 
 | ||||
|   // Gets the summary of the failure message.
 | ||||
|   const char* summary() const { return summary_.c_str(); } | ||||
| 
 | ||||
|   // Gets the message associated with the test part.
 | ||||
|   const char* message() const { return message_.c_str(); } | ||||
| 
 | ||||
|   // Returns true iff the test part passed.
 | ||||
|   bool passed() const { return type_ == kSuccess; } | ||||
| 
 | ||||
|   // Returns true iff the test part failed.
 | ||||
|   bool failed() const { return type_ != kSuccess; } | ||||
| 
 | ||||
|   // Returns true iff the test part non-fatally failed.
 | ||||
|   bool nonfatally_failed() const { return type_ == kNonFatalFailure; } | ||||
| 
 | ||||
|   // Returns true iff the test part fatally failed.
 | ||||
|   bool fatally_failed() const { return type_ == kFatalFailure; } | ||||
| 
 | ||||
|  private: | ||||
|   Type type_; | ||||
| 
 | ||||
|   // Gets the summary of the failure message by omitting the stack
 | ||||
|   // trace in it.
 | ||||
|   static std::string ExtractSummary(const char* message); | ||||
| 
 | ||||
|   // The name of the source file where the test part took place, or
 | ||||
|   // "" if the source file is unknown.
 | ||||
|   std::string file_name_; | ||||
|   // The line in the source file where the test part took place, or -1
 | ||||
|   // if the line number is unknown.
 | ||||
|   int line_number_; | ||||
|   std::string summary_;  // The test failure summary.
 | ||||
|   std::string message_;  // The test failure message.
 | ||||
| }; | ||||
| 
 | ||||
| // Prints a TestPartResult object.
 | ||||
| std::ostream& operator<<(std::ostream& os, const TestPartResult& result); | ||||
| 
 | ||||
| // An array of TestPartResult objects.
 | ||||
| //
 | ||||
| // Don't inherit from TestPartResultArray as its destructor is not
 | ||||
| // virtual.
 | ||||
| class GTEST_API_ TestPartResultArray { | ||||
|  public: | ||||
|   TestPartResultArray() {} | ||||
| 
 | ||||
|   // Appends the given TestPartResult to the array.
 | ||||
|   void Append(const TestPartResult& result); | ||||
| 
 | ||||
|   // Returns the TestPartResult at the given index (0-based).
 | ||||
|   const TestPartResult& GetTestPartResult(int index) const; | ||||
| 
 | ||||
|   // Returns the number of TestPartResult objects in the array.
 | ||||
|   int size() const; | ||||
| 
 | ||||
|  private: | ||||
|   std::vector<TestPartResult> array_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); | ||||
| }; | ||||
| 
 | ||||
| // This interface knows how to report a test part result.
 | ||||
| class TestPartResultReporterInterface { | ||||
|  public: | ||||
|   virtual ~TestPartResultReporterInterface() {} | ||||
| 
 | ||||
|   virtual void ReportTestPartResult(const TestPartResult& result) = 0; | ||||
| }; | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
 | ||||
| // statement generates new fatal failures. To do so it registers itself as the
 | ||||
| // current test part result reporter. Besides checking if fatal failures were
 | ||||
| // reported, it only delegates the reporting to the former result reporter.
 | ||||
| // The original result reporter is restored in the destructor.
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | ||||
| class GTEST_API_ HasNewFatalFailureHelper | ||||
|     : public TestPartResultReporterInterface { | ||||
|  public: | ||||
|   HasNewFatalFailureHelper(); | ||||
|   virtual ~HasNewFatalFailureHelper(); | ||||
|   virtual void ReportTestPartResult(const TestPartResult& result); | ||||
|   bool has_new_fatal_failure() const { return has_new_fatal_failure_; } | ||||
|  private: | ||||
|   bool has_new_fatal_failure_; | ||||
|   TestPartResultReporterInterface* original_reporter_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| 
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
 | ||||
							
								
								
									
										259
									
								
								lib/gtest/include/gtest/gtest-typed-test.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								lib/gtest/include/gtest/gtest-typed-test.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,259 @@ | |||
| // Copyright 2008 Google Inc.
 | ||||
| // All Rights Reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ | ||||
| 
 | ||||
| // This header implements typed tests and type-parameterized tests.
 | ||||
| 
 | ||||
| // Typed (aka type-driven) tests repeat the same test for types in a
 | ||||
| // list.  You must know which types you want to test with when writing
 | ||||
| // typed tests. Here's how you do it:
 | ||||
| 
 | ||||
| #if 0 | ||||
| 
 | ||||
| // First, define a fixture class template.  It should be parameterized
 | ||||
| // by a type.  Remember to derive it from testing::Test.
 | ||||
| template <typename T> | ||||
| class FooTest : public testing::Test { | ||||
|  public: | ||||
|   ... | ||||
|   typedef std::list<T> List; | ||||
|   static T shared_; | ||||
|   T value_; | ||||
| }; | ||||
| 
 | ||||
| // Next, associate a list of types with the test case, which will be
 | ||||
| // repeated for each type in the list.  The typedef is necessary for
 | ||||
| // the macro to parse correctly.
 | ||||
| typedef testing::Types<char, int, unsigned int> MyTypes; | ||||
| TYPED_TEST_CASE(FooTest, MyTypes); | ||||
| 
 | ||||
| // If the type list contains only one type, you can write that type
 | ||||
| // directly without Types<...>:
 | ||||
| //   TYPED_TEST_CASE(FooTest, int);
 | ||||
| 
 | ||||
| // Then, use TYPED_TEST() instead of TEST_F() to define as many typed
 | ||||
| // tests for this test case as you want.
 | ||||
| TYPED_TEST(FooTest, DoesBlah) { | ||||
|   // Inside a test, refer to TypeParam to get the type parameter.
 | ||||
|   // Since we are inside a derived class template, C++ requires use to
 | ||||
|   // visit the members of FooTest via 'this'.
 | ||||
|   TypeParam n = this->value_; | ||||
| 
 | ||||
|   // To visit static members of the fixture, add the TestFixture::
 | ||||
|   // prefix.
 | ||||
|   n += TestFixture::shared_; | ||||
| 
 | ||||
|   // To refer to typedefs in the fixture, add the "typename
 | ||||
|   // TestFixture::" prefix.
 | ||||
|   typename TestFixture::List values; | ||||
|   values.push_back(n); | ||||
|   ... | ||||
| } | ||||
| 
 | ||||
| TYPED_TEST(FooTest, HasPropertyA) { ... } | ||||
| 
 | ||||
| #endif  // 0
 | ||||
| 
 | ||||
| // Type-parameterized tests are abstract test patterns parameterized
 | ||||
| // by a type.  Compared with typed tests, type-parameterized tests
 | ||||
| // allow you to define the test pattern without knowing what the type
 | ||||
| // parameters are.  The defined pattern can be instantiated with
 | ||||
| // different types any number of times, in any number of translation
 | ||||
| // units.
 | ||||
| //
 | ||||
| // If you are designing an interface or concept, you can define a
 | ||||
| // suite of type-parameterized tests to verify properties that any
 | ||||
| // valid implementation of the interface/concept should have.  Then,
 | ||||
| // each implementation can easily instantiate the test suite to verify
 | ||||
| // that it conforms to the requirements, without having to write
 | ||||
| // similar tests repeatedly.  Here's an example:
 | ||||
| 
 | ||||
| #if 0 | ||||
| 
 | ||||
| // First, define a fixture class template.  It should be parameterized
 | ||||
| // by a type.  Remember to derive it from testing::Test.
 | ||||
| template <typename T> | ||||
| class FooTest : public testing::Test { | ||||
|   ... | ||||
| }; | ||||
| 
 | ||||
| // Next, declare that you will define a type-parameterized test case
 | ||||
| // (the _P suffix is for "parameterized" or "pattern", whichever you
 | ||||
| // prefer):
 | ||||
| TYPED_TEST_CASE_P(FooTest); | ||||
| 
 | ||||
| // Then, use TYPED_TEST_P() to define as many type-parameterized tests
 | ||||
| // for this type-parameterized test case as you want.
 | ||||
| TYPED_TEST_P(FooTest, DoesBlah) { | ||||
|   // Inside a test, refer to TypeParam to get the type parameter.
 | ||||
|   TypeParam n = 0; | ||||
|   ... | ||||
| } | ||||
| 
 | ||||
| TYPED_TEST_P(FooTest, HasPropertyA) { ... } | ||||
| 
 | ||||
| // Now the tricky part: you need to register all test patterns before
 | ||||
| // you can instantiate them.  The first argument of the macro is the
 | ||||
| // test case name; the rest are the names of the tests in this test
 | ||||
| // case.
 | ||||
| REGISTER_TYPED_TEST_CASE_P(FooTest, | ||||
|                            DoesBlah, HasPropertyA); | ||||
| 
 | ||||
| // Finally, you are free to instantiate the pattern with the types you
 | ||||
| // want.  If you put the above code in a header file, you can #include
 | ||||
| // it in multiple C++ source files and instantiate it multiple times.
 | ||||
| //
 | ||||
| // To distinguish different instances of the pattern, the first
 | ||||
| // argument to the INSTANTIATE_* macro is a prefix that will be added
 | ||||
| // to the actual test case name.  Remember to pick unique prefixes for
 | ||||
| // different instances.
 | ||||
| typedef testing::Types<char, int, unsigned int> MyTypes; | ||||
| INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); | ||||
| 
 | ||||
| // If the type list contains only one type, you can write that type
 | ||||
| // directly without Types<...>:
 | ||||
| //   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
 | ||||
| 
 | ||||
| #endif  // 0
 | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| #include "gtest/internal/gtest-type-util.h" | ||||
| 
 | ||||
| // Implements typed tests.
 | ||||
| 
 | ||||
| #if GTEST_HAS_TYPED_TEST | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // Expands to the name of the typedef for the type parameters of the
 | ||||
| // given test case.
 | ||||
| # define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ | ||||
| 
 | ||||
| // The 'Types' template argument below must have spaces around it
 | ||||
| // since some compilers may choke on '>>' when passing a template
 | ||||
| // instance (e.g. Types<int>)
 | ||||
| # define TYPED_TEST_CASE(CaseName, Types) \ | ||||
|   typedef ::testing::internal::TypeList< Types >::type \ | ||||
|       GTEST_TYPE_PARAMS_(CaseName) | ||||
| 
 | ||||
| # define TYPED_TEST(CaseName, TestName) \ | ||||
|   template <typename gtest_TypeParam_> \ | ||||
|   class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ | ||||
|       : public CaseName<gtest_TypeParam_> { \ | ||||
|    private: \ | ||||
|     typedef CaseName<gtest_TypeParam_> TestFixture; \ | ||||
|     typedef gtest_TypeParam_ TypeParam; \ | ||||
|     virtual void TestBody(); \ | ||||
|   }; \ | ||||
|   bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \ | ||||
|       ::testing::internal::TypeParameterizedTest< \ | ||||
|           CaseName, \ | ||||
|           ::testing::internal::TemplateSel< \ | ||||
|               GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \ | ||||
|           GTEST_TYPE_PARAMS_(CaseName)>::Register(\ | ||||
|               "", #CaseName, #TestName, 0); \ | ||||
|   template <typename gtest_TypeParam_> \ | ||||
|   void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody() | ||||
| 
 | ||||
| #endif  // GTEST_HAS_TYPED_TEST
 | ||||
| 
 | ||||
| // Implements type-parameterized tests.
 | ||||
| 
 | ||||
| #if GTEST_HAS_TYPED_TEST_P | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // Expands to the namespace name that the type-parameterized tests for
 | ||||
| // the given type-parameterized test case are defined in.  The exact
 | ||||
| // name of the namespace is subject to change without notice.
 | ||||
| # define GTEST_CASE_NAMESPACE_(TestCaseName) \ | ||||
|   gtest_case_##TestCaseName##_ | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // Expands to the name of the variable used to remember the names of
 | ||||
| // the defined tests in the given test case.
 | ||||
| # define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ | ||||
|   gtest_typed_test_case_p_state_##TestCaseName##_ | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
 | ||||
| //
 | ||||
| // Expands to the name of the variable used to remember the names of
 | ||||
| // the registered tests in the given test case.
 | ||||
| # define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ | ||||
|   gtest_registered_test_names_##TestCaseName##_ | ||||
| 
 | ||||
| // The variables defined in the type-parameterized test macros are
 | ||||
| // static as typically these macros are used in a .h file that can be
 | ||||
| // #included in multiple translation units linked together.
 | ||||
| # define TYPED_TEST_CASE_P(CaseName) \ | ||||
|   static ::testing::internal::TypedTestCasePState \ | ||||
|       GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) | ||||
| 
 | ||||
| # define TYPED_TEST_P(CaseName, TestName) \ | ||||
|   namespace GTEST_CASE_NAMESPACE_(CaseName) { \ | ||||
|   template <typename gtest_TypeParam_> \ | ||||
|   class TestName : public CaseName<gtest_TypeParam_> { \ | ||||
|    private: \ | ||||
|     typedef CaseName<gtest_TypeParam_> TestFixture; \ | ||||
|     typedef gtest_TypeParam_ TypeParam; \ | ||||
|     virtual void TestBody(); \ | ||||
|   }; \ | ||||
|   static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ | ||||
|       GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ | ||||
|           __FILE__, __LINE__, #CaseName, #TestName); \ | ||||
|   } \ | ||||
|   template <typename gtest_TypeParam_> \ | ||||
|   void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody() | ||||
| 
 | ||||
| # define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ | ||||
|   namespace GTEST_CASE_NAMESPACE_(CaseName) { \ | ||||
|   typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ | ||||
|   } \ | ||||
|   static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \ | ||||
|       GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\ | ||||
|           __FILE__, __LINE__, #__VA_ARGS__) | ||||
| 
 | ||||
| // The 'Types' template argument below must have spaces around it
 | ||||
| // since some compilers may choke on '>>' when passing a template
 | ||||
| // instance (e.g. Types<int>)
 | ||||
| # define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \ | ||||
|   bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \ | ||||
|       ::testing::internal::TypeParameterizedTestCase<CaseName, \ | ||||
|           GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \ | ||||
|           ::testing::internal::TypeList< Types >::type>::Register(\ | ||||
|               #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName)) | ||||
| 
 | ||||
| #endif  // GTEST_HAS_TYPED_TEST_P
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
 | ||||
							
								
								
									
										2291
									
								
								lib/gtest/include/gtest/gtest.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2291
									
								
								lib/gtest/include/gtest/gtest.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										358
									
								
								lib/gtest/include/gtest/gtest_pred_impl.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								lib/gtest/include/gtest/gtest_pred_impl.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,358 @@ | |||
| // Copyright 2006, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| 
 | ||||
| // This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
 | ||||
| // 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
 | ||||
| //
 | ||||
| // Implements a family of generic predicate assertion macros.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ | ||||
| 
 | ||||
| // Makes sure this header is not included before gtest.h.
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ | ||||
| # error Do not include gtest_pred_impl.h directly.  Include gtest.h instead. | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_H_
 | ||||
| 
 | ||||
| // This header implements a family of generic predicate assertion
 | ||||
| // macros:
 | ||||
| //
 | ||||
| //   ASSERT_PRED_FORMAT1(pred_format, v1)
 | ||||
| //   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
 | ||||
| //   ...
 | ||||
| //
 | ||||
| // where pred_format is a function or functor that takes n (in the
 | ||||
| // case of ASSERT_PRED_FORMATn) values and their source expression
 | ||||
| // text, and returns a testing::AssertionResult.  See the definition
 | ||||
| // of ASSERT_EQ in gtest.h for an example.
 | ||||
| //
 | ||||
| // If you don't care about formatting, you can use the more
 | ||||
| // restrictive version:
 | ||||
| //
 | ||||
| //   ASSERT_PRED1(pred, v1)
 | ||||
| //   ASSERT_PRED2(pred, v1, v2)
 | ||||
| //   ...
 | ||||
| //
 | ||||
| // where pred is an n-ary function or functor that returns bool,
 | ||||
| // and the values v1, v2, ..., must support the << operator for
 | ||||
| // streaming to std::ostream.
 | ||||
| //
 | ||||
| // We also define the EXPECT_* variations.
 | ||||
| //
 | ||||
| // For now we only support predicates whose arity is at most 5.
 | ||||
| // Please email googletestframework@googlegroups.com if you need
 | ||||
| // support for higher arities.
 | ||||
| 
 | ||||
| // GTEST_ASSERT_ is the basic statement to which all of the assertions
 | ||||
| // in this file reduce.  Don't use this in your code.
 | ||||
| 
 | ||||
| #define GTEST_ASSERT_(expression, on_failure) \ | ||||
|   GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||||
|   if (const ::testing::AssertionResult gtest_ar = (expression)) \ | ||||
|     ; \ | ||||
|   else \ | ||||
|     on_failure(gtest_ar.failure_message()) | ||||
| 
 | ||||
| 
 | ||||
| // Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
 | ||||
| // this in your code.
 | ||||
| template <typename Pred, | ||||
|           typename T1> | ||||
| AssertionResult AssertPred1Helper(const char* pred_text, | ||||
|                                   const char* e1, | ||||
|                                   Pred pred, | ||||
|                                   const T1& v1) { | ||||
|   if (pred(v1)) return AssertionSuccess(); | ||||
| 
 | ||||
|   return AssertionFailure() << pred_text << "(" | ||||
|                             << e1 << ") evaluates to false, where" | ||||
|                             << "\n" << e1 << " evaluates to " << v1; | ||||
| } | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
 | ||||
| // Don't use this in your code.
 | ||||
| #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ | ||||
|   GTEST_ASSERT_(pred_format(#v1, v1), \ | ||||
|                 on_failure) | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
 | ||||
| // this in your code.
 | ||||
| #define GTEST_PRED1_(pred, v1, on_failure)\ | ||||
|   GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ | ||||
|                                              #v1, \ | ||||
|                                              pred, \ | ||||
|                                              v1), on_failure) | ||||
| 
 | ||||
| // Unary predicate assertion macros.
 | ||||
| #define EXPECT_PRED_FORMAT1(pred_format, v1) \ | ||||
|   GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) | ||||
| #define EXPECT_PRED1(pred, v1) \ | ||||
|   GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) | ||||
| #define ASSERT_PRED_FORMAT1(pred_format, v1) \ | ||||
|   GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) | ||||
| #define ASSERT_PRED1(pred, v1) \ | ||||
|   GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
 | ||||
| // this in your code.
 | ||||
| template <typename Pred, | ||||
|           typename T1, | ||||
|           typename T2> | ||||
| AssertionResult AssertPred2Helper(const char* pred_text, | ||||
|                                   const char* e1, | ||||
|                                   const char* e2, | ||||
|                                   Pred pred, | ||||
|                                   const T1& v1, | ||||
|                                   const T2& v2) { | ||||
|   if (pred(v1, v2)) return AssertionSuccess(); | ||||
| 
 | ||||
|   return AssertionFailure() << pred_text << "(" | ||||
|                             << e1 << ", " | ||||
|                             << e2 << ") evaluates to false, where" | ||||
|                             << "\n" << e1 << " evaluates to " << v1 | ||||
|                             << "\n" << e2 << " evaluates to " << v2; | ||||
| } | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
 | ||||
| // Don't use this in your code.
 | ||||
| #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ | ||||
|   GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ | ||||
|                 on_failure) | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
 | ||||
| // this in your code.
 | ||||
| #define GTEST_PRED2_(pred, v1, v2, on_failure)\ | ||||
|   GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ | ||||
|                                              #v1, \ | ||||
|                                              #v2, \ | ||||
|                                              pred, \ | ||||
|                                              v1, \ | ||||
|                                              v2), on_failure) | ||||
| 
 | ||||
| // Binary predicate assertion macros.
 | ||||
| #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ | ||||
|   GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) | ||||
| #define EXPECT_PRED2(pred, v1, v2) \ | ||||
|   GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) | ||||
| #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ | ||||
|   GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) | ||||
| #define ASSERT_PRED2(pred, v1, v2) \ | ||||
|   GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
 | ||||
| // this in your code.
 | ||||
| template <typename Pred, | ||||
|           typename T1, | ||||
|           typename T2, | ||||
|           typename T3> | ||||
| AssertionResult AssertPred3Helper(const char* pred_text, | ||||
|                                   const char* e1, | ||||
|                                   const char* e2, | ||||
|                                   const char* e3, | ||||
|                                   Pred pred, | ||||
|                                   const T1& v1, | ||||
|                                   const T2& v2, | ||||
|                                   const T3& v3) { | ||||
|   if (pred(v1, v2, v3)) return AssertionSuccess(); | ||||
| 
 | ||||
|   return AssertionFailure() << pred_text << "(" | ||||
|                             << e1 << ", " | ||||
|                             << e2 << ", " | ||||
|                             << e3 << ") evaluates to false, where" | ||||
|                             << "\n" << e1 << " evaluates to " << v1 | ||||
|                             << "\n" << e2 << " evaluates to " << v2 | ||||
|                             << "\n" << e3 << " evaluates to " << v3; | ||||
| } | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
 | ||||
| // Don't use this in your code.
 | ||||
| #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ | ||||
|   GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ | ||||
|                 on_failure) | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
 | ||||
| // this in your code.
 | ||||
| #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ | ||||
|   GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ | ||||
|                                              #v1, \ | ||||
|                                              #v2, \ | ||||
|                                              #v3, \ | ||||
|                                              pred, \ | ||||
|                                              v1, \ | ||||
|                                              v2, \ | ||||
|                                              v3), on_failure) | ||||
| 
 | ||||
| // Ternary predicate assertion macros.
 | ||||
| #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ | ||||
|   GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) | ||||
| #define EXPECT_PRED3(pred, v1, v2, v3) \ | ||||
|   GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) | ||||
| #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ | ||||
|   GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) | ||||
| #define ASSERT_PRED3(pred, v1, v2, v3) \ | ||||
|   GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
 | ||||
| // this in your code.
 | ||||
| template <typename Pred, | ||||
|           typename T1, | ||||
|           typename T2, | ||||
|           typename T3, | ||||
|           typename T4> | ||||
| AssertionResult AssertPred4Helper(const char* pred_text, | ||||
|                                   const char* e1, | ||||
|                                   const char* e2, | ||||
|                                   const char* e3, | ||||
|                                   const char* e4, | ||||
|                                   Pred pred, | ||||
|                                   const T1& v1, | ||||
|                                   const T2& v2, | ||||
|                                   const T3& v3, | ||||
|                                   const T4& v4) { | ||||
|   if (pred(v1, v2, v3, v4)) return AssertionSuccess(); | ||||
| 
 | ||||
|   return AssertionFailure() << pred_text << "(" | ||||
|                             << e1 << ", " | ||||
|                             << e2 << ", " | ||||
|                             << e3 << ", " | ||||
|                             << e4 << ") evaluates to false, where" | ||||
|                             << "\n" << e1 << " evaluates to " << v1 | ||||
|                             << "\n" << e2 << " evaluates to " << v2 | ||||
|                             << "\n" << e3 << " evaluates to " << v3 | ||||
|                             << "\n" << e4 << " evaluates to " << v4; | ||||
| } | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
 | ||||
| // Don't use this in your code.
 | ||||
| #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ | ||||
|   GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ | ||||
|                 on_failure) | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
 | ||||
| // this in your code.
 | ||||
| #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ | ||||
|   GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ | ||||
|                                              #v1, \ | ||||
|                                              #v2, \ | ||||
|                                              #v3, \ | ||||
|                                              #v4, \ | ||||
|                                              pred, \ | ||||
|                                              v1, \ | ||||
|                                              v2, \ | ||||
|                                              v3, \ | ||||
|                                              v4), on_failure) | ||||
| 
 | ||||
| // 4-ary predicate assertion macros.
 | ||||
| #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ | ||||
|   GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) | ||||
| #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ | ||||
|   GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) | ||||
| #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ | ||||
|   GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) | ||||
| #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ | ||||
|   GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
 | ||||
| // this in your code.
 | ||||
| template <typename Pred, | ||||
|           typename T1, | ||||
|           typename T2, | ||||
|           typename T3, | ||||
|           typename T4, | ||||
|           typename T5> | ||||
| AssertionResult AssertPred5Helper(const char* pred_text, | ||||
|                                   const char* e1, | ||||
|                                   const char* e2, | ||||
|                                   const char* e3, | ||||
|                                   const char* e4, | ||||
|                                   const char* e5, | ||||
|                                   Pred pred, | ||||
|                                   const T1& v1, | ||||
|                                   const T2& v2, | ||||
|                                   const T3& v3, | ||||
|                                   const T4& v4, | ||||
|                                   const T5& v5) { | ||||
|   if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); | ||||
| 
 | ||||
|   return AssertionFailure() << pred_text << "(" | ||||
|                             << e1 << ", " | ||||
|                             << e2 << ", " | ||||
|                             << e3 << ", " | ||||
|                             << e4 << ", " | ||||
|                             << e5 << ") evaluates to false, where" | ||||
|                             << "\n" << e1 << " evaluates to " << v1 | ||||
|                             << "\n" << e2 << " evaluates to " << v2 | ||||
|                             << "\n" << e3 << " evaluates to " << v3 | ||||
|                             << "\n" << e4 << " evaluates to " << v4 | ||||
|                             << "\n" << e5 << " evaluates to " << v5; | ||||
| } | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
 | ||||
| // Don't use this in your code.
 | ||||
| #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ | ||||
|   GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ | ||||
|                 on_failure) | ||||
| 
 | ||||
| // Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
 | ||||
| // this in your code.
 | ||||
| #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ | ||||
|   GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ | ||||
|                                              #v1, \ | ||||
|                                              #v2, \ | ||||
|                                              #v3, \ | ||||
|                                              #v4, \ | ||||
|                                              #v5, \ | ||||
|                                              pred, \ | ||||
|                                              v1, \ | ||||
|                                              v2, \ | ||||
|                                              v3, \ | ||||
|                                              v4, \ | ||||
|                                              v5), on_failure) | ||||
| 
 | ||||
| // 5-ary predicate assertion macros.
 | ||||
| #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ | ||||
|   GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) | ||||
| #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ | ||||
|   GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) | ||||
| #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ | ||||
|   GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) | ||||
| #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ | ||||
|   GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | ||||
							
								
								
									
										58
									
								
								lib/gtest/include/gtest/gtest_prod.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								lib/gtest/include/gtest/gtest_prod.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| // Copyright 2006, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: wan@google.com (Zhanyong Wan)
 | ||||
| //
 | ||||
| // Google C++ Testing Framework definitions useful in production code.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ | ||||
| #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ | ||||
| 
 | ||||
| // When you need to test the private or protected members of a class,
 | ||||
| // use the FRIEND_TEST macro to declare your tests as friends of the
 | ||||
| // class.  For example:
 | ||||
| //
 | ||||
| // class MyClass {
 | ||||
| //  private:
 | ||||
| //   void MyMethod();
 | ||||
| //   FRIEND_TEST(MyClassTest, MyMethod);
 | ||||
| // };
 | ||||
| //
 | ||||
| // class MyClassTest : public testing::Test {
 | ||||
| //   // ...
 | ||||
| // };
 | ||||
| //
 | ||||
| // TEST_F(MyClassTest, MyMethod) {
 | ||||
| //   // Can call MyClass::MyMethod() here.
 | ||||
| // }
 | ||||
| 
 | ||||
| #define FRIEND_TEST(test_case_name, test_name)\ | ||||
| friend class test_case_name##_##test_name##_Test | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
 | ||||
							
								
								
									
										319
									
								
								lib/gtest/include/gtest/internal/gtest-death-test-internal.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								lib/gtest/include/gtest/internal/gtest-death-test-internal.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,319 @@ | |||
| // Copyright 2005, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
 | ||||
| //
 | ||||
| // The Google C++ Testing Framework (Google Test)
 | ||||
| //
 | ||||
| // This header file defines internal utilities needed for implementing
 | ||||
| // death tests.  They are subject to change without notice.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ | ||||
| 
 | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| GTEST_DECLARE_string_(internal_run_death_test); | ||||
| 
 | ||||
| // Names of the flags (needed for parsing Google Test flags).
 | ||||
| const char kDeathTestStyleFlag[] = "death_test_style"; | ||||
| const char kDeathTestUseFork[] = "death_test_use_fork"; | ||||
| const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; | ||||
| 
 | ||||
| #if GTEST_HAS_DEATH_TEST | ||||
| 
 | ||||
| // DeathTest is a class that hides much of the complexity of the
 | ||||
| // GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
 | ||||
| // returns a concrete class that depends on the prevailing death test
 | ||||
| // style, as defined by the --gtest_death_test_style and/or
 | ||||
| // --gtest_internal_run_death_test flags.
 | ||||
| 
 | ||||
| // In describing the results of death tests, these terms are used with
 | ||||
| // the corresponding definitions:
 | ||||
| //
 | ||||
| // exit status:  The integer exit information in the format specified
 | ||||
| //               by wait(2)
 | ||||
| // exit code:    The integer code passed to exit(3), _exit(2), or
 | ||||
| //               returned from main()
 | ||||
| class GTEST_API_ DeathTest { | ||||
|  public: | ||||
|   // Create returns false if there was an error determining the
 | ||||
|   // appropriate action to take for the current death test; for example,
 | ||||
|   // if the gtest_death_test_style flag is set to an invalid value.
 | ||||
|   // The LastMessage method will return a more detailed message in that
 | ||||
|   // case.  Otherwise, the DeathTest pointer pointed to by the "test"
 | ||||
|   // argument is set.  If the death test should be skipped, the pointer
 | ||||
|   // is set to NULL; otherwise, it is set to the address of a new concrete
 | ||||
|   // DeathTest object that controls the execution of the current test.
 | ||||
|   static bool Create(const char* statement, const RE* regex, | ||||
|                      const char* file, int line, DeathTest** test); | ||||
|   DeathTest(); | ||||
|   virtual ~DeathTest() { } | ||||
| 
 | ||||
|   // A helper class that aborts a death test when it's deleted.
 | ||||
|   class ReturnSentinel { | ||||
|    public: | ||||
|     explicit ReturnSentinel(DeathTest* test) : test_(test) { } | ||||
|     ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } | ||||
|    private: | ||||
|     DeathTest* const test_; | ||||
|     GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); | ||||
|   } GTEST_ATTRIBUTE_UNUSED_; | ||||
| 
 | ||||
|   // An enumeration of possible roles that may be taken when a death
 | ||||
|   // test is encountered.  EXECUTE means that the death test logic should
 | ||||
|   // be executed immediately.  OVERSEE means that the program should prepare
 | ||||
|   // the appropriate environment for a child process to execute the death
 | ||||
|   // test, then wait for it to complete.
 | ||||
|   enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; | ||||
| 
 | ||||
|   // An enumeration of the three reasons that a test might be aborted.
 | ||||
|   enum AbortReason { | ||||
|     TEST_ENCOUNTERED_RETURN_STATEMENT, | ||||
|     TEST_THREW_EXCEPTION, | ||||
|     TEST_DID_NOT_DIE | ||||
|   }; | ||||
| 
 | ||||
|   // Assumes one of the above roles.
 | ||||
|   virtual TestRole AssumeRole() = 0; | ||||
| 
 | ||||
|   // Waits for the death test to finish and returns its status.
 | ||||
|   virtual int Wait() = 0; | ||||
| 
 | ||||
|   // Returns true if the death test passed; that is, the test process
 | ||||
|   // exited during the test, its exit status matches a user-supplied
 | ||||
|   // predicate, and its stderr output matches a user-supplied regular
 | ||||
|   // expression.
 | ||||
|   // The user-supplied predicate may be a macro expression rather
 | ||||
|   // than a function pointer or functor, or else Wait and Passed could
 | ||||
|   // be combined.
 | ||||
|   virtual bool Passed(bool exit_status_ok) = 0; | ||||
| 
 | ||||
|   // Signals that the death test did not die as expected.
 | ||||
|   virtual void Abort(AbortReason reason) = 0; | ||||
| 
 | ||||
|   // Returns a human-readable outcome message regarding the outcome of
 | ||||
|   // the last death test.
 | ||||
|   static const char* LastMessage(); | ||||
| 
 | ||||
|   static void set_last_death_test_message(const std::string& message); | ||||
| 
 | ||||
|  private: | ||||
|   // A string containing a description of the outcome of the last death test.
 | ||||
|   static std::string last_death_test_message_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); | ||||
| }; | ||||
| 
 | ||||
| // Factory interface for death tests.  May be mocked out for testing.
 | ||||
| class DeathTestFactory { | ||||
|  public: | ||||
|   virtual ~DeathTestFactory() { } | ||||
|   virtual bool Create(const char* statement, const RE* regex, | ||||
|                       const char* file, int line, DeathTest** test) = 0; | ||||
| }; | ||||
| 
 | ||||
| // A concrete DeathTestFactory implementation for normal use.
 | ||||
| class DefaultDeathTestFactory : public DeathTestFactory { | ||||
|  public: | ||||
|   virtual bool Create(const char* statement, const RE* regex, | ||||
|                       const char* file, int line, DeathTest** test); | ||||
| }; | ||||
| 
 | ||||
| // Returns true if exit_status describes a process that was terminated
 | ||||
| // by a signal, or exited normally with a nonzero exit code.
 | ||||
| GTEST_API_ bool ExitedUnsuccessfully(int exit_status); | ||||
| 
 | ||||
| // Traps C++ exceptions escaping statement and reports them as test
 | ||||
| // failures. Note that trapping SEH exceptions is not implemented here.
 | ||||
| # if GTEST_HAS_EXCEPTIONS | ||||
| #  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ | ||||
|   try { \ | ||||
|     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||||
|   } catch (const ::std::exception& gtest_exception) { \ | ||||
|     fprintf(\ | ||||
|         stderr, \ | ||||
|         "\n%s: Caught std::exception-derived exception escaping the " \ | ||||
|         "death test statement. Exception message: %s\n", \ | ||||
|         ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ | ||||
|         gtest_exception.what()); \ | ||||
|     fflush(stderr); \ | ||||
|     death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ | ||||
|   } catch (...) { \ | ||||
|     death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ | ||||
|   } | ||||
| 
 | ||||
| # else | ||||
| #  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ | ||||
|   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) | ||||
| 
 | ||||
| # endif | ||||
| 
 | ||||
| // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
 | ||||
| // ASSERT_EXIT*, and EXPECT_EXIT*.
 | ||||
| # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ | ||||
|   GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||||
|   if (::testing::internal::AlwaysTrue()) { \ | ||||
|     const ::testing::internal::RE& gtest_regex = (regex); \ | ||||
|     ::testing::internal::DeathTest* gtest_dt; \ | ||||
|     if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ | ||||
|         __FILE__, __LINE__, >est_dt)) { \ | ||||
|       goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ | ||||
|     } \ | ||||
|     if (gtest_dt != NULL) { \ | ||||
|       ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ | ||||
|           gtest_dt_ptr(gtest_dt); \ | ||||
|       switch (gtest_dt->AssumeRole()) { \ | ||||
|         case ::testing::internal::DeathTest::OVERSEE_TEST: \ | ||||
|           if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ | ||||
|             goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ | ||||
|           } \ | ||||
|           break; \ | ||||
|         case ::testing::internal::DeathTest::EXECUTE_TEST: { \ | ||||
|           ::testing::internal::DeathTest::ReturnSentinel \ | ||||
|               gtest_sentinel(gtest_dt); \ | ||||
|           GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ | ||||
|           gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ | ||||
|           break; \ | ||||
|         } \ | ||||
|         default: \ | ||||
|           break; \ | ||||
|       } \ | ||||
|     } \ | ||||
|   } else \ | ||||
|     GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ | ||||
|       fail(::testing::internal::DeathTest::LastMessage()) | ||||
| // The symbol "fail" here expands to something into which a message
 | ||||
| // can be streamed.
 | ||||
| 
 | ||||
| // This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
 | ||||
| // NDEBUG mode. In this case we need the statements to be executed, the regex is
 | ||||
| // ignored, and the macro must accept a streamed message even though the message
 | ||||
| // is never printed.
 | ||||
| # define GTEST_EXECUTE_STATEMENT_(statement, regex) \ | ||||
|   GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||||
|   if (::testing::internal::AlwaysTrue()) { \ | ||||
|      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||||
|   } else \ | ||||
|     ::testing::Message() | ||||
| 
 | ||||
| // A class representing the parsed contents of the
 | ||||
| // --gtest_internal_run_death_test flag, as it existed when
 | ||||
| // RUN_ALL_TESTS was called.
 | ||||
| class InternalRunDeathTestFlag { | ||||
|  public: | ||||
|   InternalRunDeathTestFlag(const std::string& a_file, | ||||
|                            int a_line, | ||||
|                            int an_index, | ||||
|                            int a_write_fd) | ||||
|       : file_(a_file), line_(a_line), index_(an_index), | ||||
|         write_fd_(a_write_fd) {} | ||||
| 
 | ||||
|   ~InternalRunDeathTestFlag() { | ||||
|     if (write_fd_ >= 0) | ||||
|       posix::Close(write_fd_); | ||||
|   } | ||||
| 
 | ||||
|   const std::string& file() const { return file_; } | ||||
|   int line() const { return line_; } | ||||
|   int index() const { return index_; } | ||||
|   int write_fd() const { return write_fd_; } | ||||
| 
 | ||||
|  private: | ||||
|   std::string file_; | ||||
|   int line_; | ||||
|   int index_; | ||||
|   int write_fd_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); | ||||
| }; | ||||
| 
 | ||||
| // Returns a newly created InternalRunDeathTestFlag object with fields
 | ||||
| // initialized from the GTEST_FLAG(internal_run_death_test) flag if
 | ||||
| // the flag is specified; otherwise returns NULL.
 | ||||
| InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); | ||||
| 
 | ||||
| #else  // GTEST_HAS_DEATH_TEST
 | ||||
| 
 | ||||
| // This macro is used for implementing macros such as
 | ||||
| // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
 | ||||
| // death tests are not supported. Those macros must compile on such systems
 | ||||
| // iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
 | ||||
| // systems that support death tests. This allows one to write such a macro
 | ||||
| // on a system that does not support death tests and be sure that it will
 | ||||
| // compile on a death-test supporting system.
 | ||||
| //
 | ||||
| // Parameters:
 | ||||
| //   statement -  A statement that a macro such as EXPECT_DEATH would test
 | ||||
| //                for program termination. This macro has to make sure this
 | ||||
| //                statement is compiled but not executed, to ensure that
 | ||||
| //                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
 | ||||
| //                parameter iff EXPECT_DEATH compiles with it.
 | ||||
| //   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
 | ||||
| //                the output of statement.  This parameter has to be
 | ||||
| //                compiled but not evaluated by this macro, to ensure that
 | ||||
| //                this macro only accepts expressions that a macro such as
 | ||||
| //                EXPECT_DEATH would accept.
 | ||||
| //   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
 | ||||
| //                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
 | ||||
| //                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
 | ||||
| //                compile inside functions where ASSERT_DEATH doesn't
 | ||||
| //                compile.
 | ||||
| //
 | ||||
| //  The branch that has an always false condition is used to ensure that
 | ||||
| //  statement and regex are compiled (and thus syntactically correct) but
 | ||||
| //  never executed. The unreachable code macro protects the terminator
 | ||||
| //  statement from generating an 'unreachable code' warning in case
 | ||||
| //  statement unconditionally returns or throws. The Message constructor at
 | ||||
| //  the end allows the syntax of streaming additional messages into the
 | ||||
| //  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
 | ||||
| # define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ | ||||
|     GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||||
|     if (::testing::internal::AlwaysTrue()) { \ | ||||
|       GTEST_LOG_(WARNING) \ | ||||
|           << "Death tests are not supported on this platform.\n" \ | ||||
|           << "Statement '" #statement "' cannot be verified."; \ | ||||
|     } else if (::testing::internal::AlwaysFalse()) { \ | ||||
|       ::testing::internal::RE::PartialMatch(".*", (regex)); \ | ||||
|       GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||||
|       terminator; \ | ||||
|     } else \ | ||||
|       ::testing::Message() | ||||
| 
 | ||||
| #endif  // GTEST_HAS_DEATH_TEST
 | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
 | ||||
							
								
								
									
										206
									
								
								lib/gtest/include/gtest/internal/gtest-filepath.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								lib/gtest/include/gtest/internal/gtest-filepath.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,206 @@ | |||
| // Copyright 2008, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: keith.ray@gmail.com (Keith Ray)
 | ||||
| //
 | ||||
| // Google Test filepath utilities
 | ||||
| //
 | ||||
| // This header file declares classes and functions used internally by
 | ||||
| // Google Test.  They are subject to change without notice.
 | ||||
| //
 | ||||
| // This file is #included in <gtest/internal/gtest-internal.h>.
 | ||||
| // Do not include this header file separately!
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ | ||||
| 
 | ||||
| #include "gtest/internal/gtest-string.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // FilePath - a class for file and directory pathname manipulation which
 | ||||
| // handles platform-specific conventions (like the pathname separator).
 | ||||
| // Used for helper functions for naming files in a directory for xml output.
 | ||||
| // Except for Set methods, all methods are const or static, which provides an
 | ||||
| // "immutable value object" -- useful for peace of mind.
 | ||||
| // A FilePath with a value ending in a path separator ("like/this/") represents
 | ||||
| // a directory, otherwise it is assumed to represent a file. In either case,
 | ||||
| // it may or may not represent an actual file or directory in the file system.
 | ||||
| // Names are NOT checked for syntax correctness -- no checking for illegal
 | ||||
| // characters, malformed paths, etc.
 | ||||
| 
 | ||||
| class GTEST_API_ FilePath { | ||||
|  public: | ||||
|   FilePath() : pathname_("") { } | ||||
|   FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } | ||||
| 
 | ||||
|   explicit FilePath(const std::string& pathname) : pathname_(pathname) { | ||||
|     Normalize(); | ||||
|   } | ||||
| 
 | ||||
|   FilePath& operator=(const FilePath& rhs) { | ||||
|     Set(rhs); | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   void Set(const FilePath& rhs) { | ||||
|     pathname_ = rhs.pathname_; | ||||
|   } | ||||
| 
 | ||||
|   const std::string& string() const { return pathname_; } | ||||
|   const char* c_str() const { return pathname_.c_str(); } | ||||
| 
 | ||||
|   // Returns the current working directory, or "" if unsuccessful.
 | ||||
|   static FilePath GetCurrentDir(); | ||||
| 
 | ||||
|   // Given directory = "dir", base_name = "test", number = 0,
 | ||||
|   // extension = "xml", returns "dir/test.xml". If number is greater
 | ||||
|   // than zero (e.g., 12), returns "dir/test_12.xml".
 | ||||
|   // On Windows platform, uses \ as the separator rather than /.
 | ||||
|   static FilePath MakeFileName(const FilePath& directory, | ||||
|                                const FilePath& base_name, | ||||
|                                int number, | ||||
|                                const char* extension); | ||||
| 
 | ||||
|   // Given directory = "dir", relative_path = "test.xml",
 | ||||
|   // returns "dir/test.xml".
 | ||||
|   // On Windows, uses \ as the separator rather than /.
 | ||||
|   static FilePath ConcatPaths(const FilePath& directory, | ||||
|                               const FilePath& relative_path); | ||||
| 
 | ||||
|   // Returns a pathname for a file that does not currently exist. The pathname
 | ||||
|   // will be directory/base_name.extension or
 | ||||
|   // directory/base_name_<number>.extension if directory/base_name.extension
 | ||||
|   // already exists. The number will be incremented until a pathname is found
 | ||||
|   // that does not already exist.
 | ||||
|   // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
 | ||||
|   // There could be a race condition if two or more processes are calling this
 | ||||
|   // function at the same time -- they could both pick the same filename.
 | ||||
|   static FilePath GenerateUniqueFileName(const FilePath& directory, | ||||
|                                          const FilePath& base_name, | ||||
|                                          const char* extension); | ||||
| 
 | ||||
|   // Returns true iff the path is "".
 | ||||
|   bool IsEmpty() const { return pathname_.empty(); } | ||||
| 
 | ||||
|   // If input name has a trailing separator character, removes it and returns
 | ||||
|   // the name, otherwise return the name string unmodified.
 | ||||
|   // On Windows platform, uses \ as the separator, other platforms use /.
 | ||||
|   FilePath RemoveTrailingPathSeparator() const; | ||||
| 
 | ||||
|   // Returns a copy of the FilePath with the directory part removed.
 | ||||
|   // Example: FilePath("path/to/file").RemoveDirectoryName() returns
 | ||||
|   // FilePath("file"). If there is no directory part ("just_a_file"), it returns
 | ||||
|   // the FilePath unmodified. If there is no file part ("just_a_dir/") it
 | ||||
|   // returns an empty FilePath ("").
 | ||||
|   // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | ||||
|   FilePath RemoveDirectoryName() const; | ||||
| 
 | ||||
|   // RemoveFileName returns the directory path with the filename removed.
 | ||||
|   // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
 | ||||
|   // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
 | ||||
|   // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
 | ||||
|   // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
 | ||||
|   // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | ||||
|   FilePath RemoveFileName() const; | ||||
| 
 | ||||
|   // Returns a copy of the FilePath with the case-insensitive extension removed.
 | ||||
|   // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
 | ||||
|   // FilePath("dir/file"). If a case-insensitive extension is not
 | ||||
|   // found, returns a copy of the original FilePath.
 | ||||
|   FilePath RemoveExtension(const char* extension) const; | ||||
| 
 | ||||
|   // Creates directories so that path exists. Returns true if successful or if
 | ||||
|   // the directories already exist; returns false if unable to create
 | ||||
|   // directories for any reason. Will also return false if the FilePath does
 | ||||
|   // not represent a directory (that is, it doesn't end with a path separator).
 | ||||
|   bool CreateDirectoriesRecursively() const; | ||||
| 
 | ||||
|   // Create the directory so that path exists. Returns true if successful or
 | ||||
|   // if the directory already exists; returns false if unable to create the
 | ||||
|   // directory for any reason, including if the parent directory does not
 | ||||
|   // exist. Not named "CreateDirectory" because that's a macro on Windows.
 | ||||
|   bool CreateFolder() const; | ||||
| 
 | ||||
|   // Returns true if FilePath describes something in the file-system,
 | ||||
|   // either a file, directory, or whatever, and that something exists.
 | ||||
|   bool FileOrDirectoryExists() const; | ||||
| 
 | ||||
|   // Returns true if pathname describes a directory in the file-system
 | ||||
|   // that exists.
 | ||||
|   bool DirectoryExists() const; | ||||
| 
 | ||||
|   // Returns true if FilePath ends with a path separator, which indicates that
 | ||||
|   // it is intended to represent a directory. Returns false otherwise.
 | ||||
|   // This does NOT check that a directory (or file) actually exists.
 | ||||
|   bool IsDirectory() const; | ||||
| 
 | ||||
|   // Returns true if pathname describes a root directory. (Windows has one
 | ||||
|   // root directory per disk drive.)
 | ||||
|   bool IsRootDirectory() const; | ||||
| 
 | ||||
|   // Returns true if pathname describes an absolute path.
 | ||||
|   bool IsAbsolutePath() const; | ||||
| 
 | ||||
|  private: | ||||
|   // Replaces multiple consecutive separators with a single separator.
 | ||||
|   // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
 | ||||
|   // redundancies that might be in a pathname involving "." or "..".
 | ||||
|   //
 | ||||
|   // A pathname with multiple consecutive separators may occur either through
 | ||||
|   // user error or as a result of some scripts or APIs that generate a pathname
 | ||||
|   // with a trailing separator. On other platforms the same API or script
 | ||||
|   // may NOT generate a pathname with a trailing "/". Then elsewhere that
 | ||||
|   // pathname may have another "/" and pathname components added to it,
 | ||||
|   // without checking for the separator already being there.
 | ||||
|   // The script language and operating system may allow paths like "foo//bar"
 | ||||
|   // but some of the functions in FilePath will not handle that correctly. In
 | ||||
|   // particular, RemoveTrailingPathSeparator() only removes one separator, and
 | ||||
|   // it is called in CreateDirectoriesRecursively() assuming that it will change
 | ||||
|   // a pathname from directory syntax (trailing separator) to filename syntax.
 | ||||
|   //
 | ||||
|   // On Windows this method also replaces the alternate path separator '/' with
 | ||||
|   // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
 | ||||
|   // "bar\\foo".
 | ||||
| 
 | ||||
|   void Normalize(); | ||||
| 
 | ||||
|   // Returns a pointer to the last occurence of a valid path separator in
 | ||||
|   // the FilePath. On Windows, for example, both '/' and '\' are valid path
 | ||||
|   // separators. Returns NULL if no path separator was found.
 | ||||
|   const char* FindLastPathSeparator() const; | ||||
| 
 | ||||
|   std::string pathname_; | ||||
| };  // class FilePath
 | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
 | ||||
							
								
								
									
										1158
									
								
								lib/gtest/include/gtest/internal/gtest-internal.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1158
									
								
								lib/gtest/include/gtest/internal/gtest-internal.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										233
									
								
								lib/gtest/include/gtest/internal/gtest-linked_ptr.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								lib/gtest/include/gtest/internal/gtest-linked_ptr.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,233 @@ | |||
| // Copyright 2003 Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Authors: Dan Egnor (egnor@google.com)
 | ||||
| //
 | ||||
| // A "smart" pointer type with reference tracking.  Every pointer to a
 | ||||
| // particular object is kept on a circular linked list.  When the last pointer
 | ||||
| // to an object is destroyed or reassigned, the object is deleted.
 | ||||
| //
 | ||||
| // Used properly, this deletes the object when the last reference goes away.
 | ||||
| // There are several caveats:
 | ||||
| // - Like all reference counting schemes, cycles lead to leaks.
 | ||||
| // - Each smart pointer is actually two pointers (8 bytes instead of 4).
 | ||||
| // - Every time a pointer is assigned, the entire list of pointers to that
 | ||||
| //   object is traversed.  This class is therefore NOT SUITABLE when there
 | ||||
| //   will often be more than two or three pointers to a particular object.
 | ||||
| // - References are only tracked as long as linked_ptr<> objects are copied.
 | ||||
| //   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
 | ||||
| //   will happen (double deletion).
 | ||||
| //
 | ||||
| // A good use of this class is storing object references in STL containers.
 | ||||
| // You can safely put linked_ptr<> in a vector<>.
 | ||||
| // Other uses may not be as good.
 | ||||
| //
 | ||||
| // Note: If you use an incomplete type with linked_ptr<>, the class
 | ||||
| // *containing* linked_ptr<> must have a constructor and destructor (even
 | ||||
| // if they do nothing!).
 | ||||
| //
 | ||||
| // Bill Gibbons suggested we use something like this.
 | ||||
| //
 | ||||
| // Thread Safety:
 | ||||
| //   Unlike other linked_ptr implementations, in this implementation
 | ||||
| //   a linked_ptr object is thread-safe in the sense that:
 | ||||
| //     - it's safe to copy linked_ptr objects concurrently,
 | ||||
| //     - it's safe to copy *from* a linked_ptr and read its underlying
 | ||||
| //       raw pointer (e.g. via get()) concurrently, and
 | ||||
| //     - it's safe to write to two linked_ptrs that point to the same
 | ||||
| //       shared object concurrently.
 | ||||
| // TODO(wan@google.com): rename this to safe_linked_ptr to avoid
 | ||||
| // confusion with normal linked_ptr.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include <assert.h> | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // Protects copying of all linked_ptr objects.
 | ||||
| GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); | ||||
| 
 | ||||
| // This is used internally by all instances of linked_ptr<>.  It needs to be
 | ||||
| // a non-template class because different types of linked_ptr<> can refer to
 | ||||
| // the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
 | ||||
| // So, it needs to be possible for different types of linked_ptr to participate
 | ||||
| // in the same circular linked list, so we need a single class type here.
 | ||||
| //
 | ||||
| // DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
 | ||||
| class linked_ptr_internal { | ||||
|  public: | ||||
|   // Create a new circle that includes only this instance.
 | ||||
|   void join_new() { | ||||
|     next_ = this; | ||||
|   } | ||||
| 
 | ||||
|   // Many linked_ptr operations may change p.link_ for some linked_ptr
 | ||||
|   // variable p in the same circle as this object.  Therefore we need
 | ||||
|   // to prevent two such operations from occurring concurrently.
 | ||||
|   //
 | ||||
|   // Note that different types of linked_ptr objects can coexist in a
 | ||||
|   // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
 | ||||
|   // linked_ptr<Derived2>).  Therefore we must use a single mutex to
 | ||||
|   // protect all linked_ptr objects.  This can create serious
 | ||||
|   // contention in production code, but is acceptable in a testing
 | ||||
|   // framework.
 | ||||
| 
 | ||||
|   // Join an existing circle.
 | ||||
|   void join(linked_ptr_internal const* ptr) | ||||
|       GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { | ||||
|     MutexLock lock(&g_linked_ptr_mutex); | ||||
| 
 | ||||
|     linked_ptr_internal const* p = ptr; | ||||
|     while (p->next_ != ptr) p = p->next_; | ||||
|     p->next_ = this; | ||||
|     next_ = ptr; | ||||
|   } | ||||
| 
 | ||||
|   // Leave whatever circle we're part of.  Returns true if we were the
 | ||||
|   // last member of the circle.  Once this is done, you can join() another.
 | ||||
|   bool depart() | ||||
|       GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { | ||||
|     MutexLock lock(&g_linked_ptr_mutex); | ||||
| 
 | ||||
|     if (next_ == this) return true; | ||||
|     linked_ptr_internal const* p = next_; | ||||
|     while (p->next_ != this) p = p->next_; | ||||
|     p->next_ = next_; | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   mutable linked_ptr_internal const* next_; | ||||
| }; | ||||
| 
 | ||||
| template <typename T> | ||||
| class linked_ptr { | ||||
|  public: | ||||
|   typedef T element_type; | ||||
| 
 | ||||
|   // Take over ownership of a raw pointer.  This should happen as soon as
 | ||||
|   // possible after the object is created.
 | ||||
|   explicit linked_ptr(T* ptr = NULL) { capture(ptr); } | ||||
|   ~linked_ptr() { depart(); } | ||||
| 
 | ||||
|   // Copy an existing linked_ptr<>, adding ourselves to the list of references.
 | ||||
|   template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); } | ||||
|   linked_ptr(linked_ptr const& ptr) {  // NOLINT
 | ||||
|     assert(&ptr != this); | ||||
|     copy(&ptr); | ||||
|   } | ||||
| 
 | ||||
|   // Assignment releases the old value and acquires the new.
 | ||||
|   template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) { | ||||
|     depart(); | ||||
|     copy(&ptr); | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   linked_ptr& operator=(linked_ptr const& ptr) { | ||||
|     if (&ptr != this) { | ||||
|       depart(); | ||||
|       copy(&ptr); | ||||
|     } | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   // Smart pointer members.
 | ||||
|   void reset(T* ptr = NULL) { | ||||
|     depart(); | ||||
|     capture(ptr); | ||||
|   } | ||||
|   T* get() const { return value_; } | ||||
|   T* operator->() const { return value_; } | ||||
|   T& operator*() const { return *value_; } | ||||
| 
 | ||||
|   bool operator==(T* p) const { return value_ == p; } | ||||
|   bool operator!=(T* p) const { return value_ != p; } | ||||
|   template <typename U> | ||||
|   bool operator==(linked_ptr<U> const& ptr) const { | ||||
|     return value_ == ptr.get(); | ||||
|   } | ||||
|   template <typename U> | ||||
|   bool operator!=(linked_ptr<U> const& ptr) const { | ||||
|     return value_ != ptr.get(); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   template <typename U> | ||||
|   friend class linked_ptr; | ||||
| 
 | ||||
|   T* value_; | ||||
|   linked_ptr_internal link_; | ||||
| 
 | ||||
|   void depart() { | ||||
|     if (link_.depart()) delete value_; | ||||
|   } | ||||
| 
 | ||||
|   void capture(T* ptr) { | ||||
|     value_ = ptr; | ||||
|     link_.join_new(); | ||||
|   } | ||||
| 
 | ||||
|   template <typename U> void copy(linked_ptr<U> const* ptr) { | ||||
|     value_ = ptr->get(); | ||||
|     if (value_) | ||||
|       link_.join(&ptr->link_); | ||||
|     else | ||||
|       link_.join_new(); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| template<typename T> inline | ||||
| bool operator==(T* ptr, const linked_ptr<T>& x) { | ||||
|   return ptr == x.get(); | ||||
| } | ||||
| 
 | ||||
| template<typename T> inline | ||||
| bool operator!=(T* ptr, const linked_ptr<T>& x) { | ||||
|   return ptr != x.get(); | ||||
| } | ||||
| 
 | ||||
| // A function to convert T* into linked_ptr<T>
 | ||||
| // Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
 | ||||
| // for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
 | ||||
| template <typename T> | ||||
| linked_ptr<T> make_linked_ptr(T* ptr) { | ||||
|   return linked_ptr<T>(ptr); | ||||
| } | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
 | ||||
							
								
								
									
										5143
									
								
								lib/gtest/include/gtest/internal/gtest-param-util-generated.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5143
									
								
								lib/gtest/include/gtest/internal/gtest-param-util-generated.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -0,0 +1,301 @@ | |||
| $$ -*- mode: c++; -*- | ||||
| $var n = 50  $$ Maximum length of Values arguments we want to support. | ||||
| $var maxtuple = 10  $$ Maximum number of Combine arguments we want to support. | ||||
| // Copyright 2008 Google Inc. | ||||
| // All Rights Reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are | ||||
| // met: | ||||
| // | ||||
| //     * Redistributions of source code must retain the above copyright | ||||
| // notice, this list of conditions and the following disclaimer. | ||||
| //     * Redistributions in binary form must reproduce the above | ||||
| // copyright notice, this list of conditions and the following disclaimer | ||||
| // in the documentation and/or other materials provided with the | ||||
| // distribution. | ||||
| //     * Neither the name of Google Inc. nor the names of its | ||||
| // contributors may be used to endorse or promote products derived from | ||||
| // this software without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Author: vladl@google.com (Vlad Losev) | ||||
| 
 | ||||
| // Type and function utilities for implementing parameterized tests. | ||||
| // This file is generated by a SCRIPT.  DO NOT EDIT BY HAND! | ||||
| // | ||||
| // Currently Google Test supports at most $n arguments in Values, | ||||
| // and at most $maxtuple arguments in Combine. Please contact | ||||
| // googletestframework@googlegroups.com if you need more. | ||||
| // Please note that the number of arguments to Combine is limited | ||||
| // by the maximum arity of the implementation of tr1::tuple which is | ||||
| // currently set at $maxtuple. | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ | ||||
| 
 | ||||
| // scripts/fuse_gtest.py depends on gtest's own header being #included | ||||
| // *unconditionally*.  Therefore these #includes cannot be moved | ||||
| // inside #if GTEST_HAS_PARAM_TEST. | ||||
| #include "gtest/internal/gtest-param-util.h" | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| #if GTEST_HAS_PARAM_TEST | ||||
| 
 | ||||
| namespace testing { | ||||
| 
 | ||||
| // Forward declarations of ValuesIn(), which is implemented in | ||||
| // include/gtest/gtest-param-test.h. | ||||
| template <typename ForwardIterator> | ||||
| internal::ParamGenerator< | ||||
|   typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type> | ||||
| ValuesIn(ForwardIterator begin, ForwardIterator end); | ||||
| 
 | ||||
| template <typename T, size_t N> | ||||
| internal::ParamGenerator<T> ValuesIn(const T (&array)[N]); | ||||
| 
 | ||||
| template <class Container> | ||||
| internal::ParamGenerator<typename Container::value_type> ValuesIn( | ||||
|     const Container& container); | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| // Used in the Values() function to provide polymorphic capabilities. | ||||
| template <typename T1> | ||||
| class ValueArray1 { | ||||
|  public: | ||||
|   explicit ValueArray1(T1 v1) : v1_(v1) {} | ||||
| 
 | ||||
|   template <typename T> | ||||
|   operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); } | ||||
| 
 | ||||
|  private: | ||||
|   // No implementation - assignment is unsupported. | ||||
|   void operator=(const ValueArray1& other); | ||||
| 
 | ||||
|   const T1 v1_; | ||||
| }; | ||||
| 
 | ||||
| $range i 2..n | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| 
 | ||||
| template <$for j, [[typename T$j]]> | ||||
| class ValueArray$i { | ||||
|  public: | ||||
|   ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {} | ||||
| 
 | ||||
|   template <typename T> | ||||
|   operator ParamGenerator<T>() const { | ||||
|     const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]}; | ||||
|     return ValuesIn(array); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   // No implementation - assignment is unsupported. | ||||
|   void operator=(const ValueArray$i& other); | ||||
| 
 | ||||
| $for j [[ | ||||
| 
 | ||||
|   const T$j v$(j)_; | ||||
| ]] | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| # if GTEST_HAS_COMBINE | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. | ||||
| // | ||||
| // Generates values from the Cartesian product of values produced | ||||
| // by the argument generators. | ||||
| // | ||||
| $range i 2..maxtuple | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| $range k 2..i | ||||
| 
 | ||||
| template <$for j, [[typename T$j]]> | ||||
| class CartesianProductGenerator$i | ||||
|     : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > { | ||||
|  public: | ||||
|   typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType; | ||||
| 
 | ||||
|   CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]]) | ||||
|       : $for j, [[g$(j)_(g$j)]] {} | ||||
|   virtual ~CartesianProductGenerator$i() {} | ||||
| 
 | ||||
|   virtual ParamIteratorInterface<ParamType>* Begin() const { | ||||
|     return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]); | ||||
|   } | ||||
|   virtual ParamIteratorInterface<ParamType>* End() const { | ||||
|     return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   class Iterator : public ParamIteratorInterface<ParamType> { | ||||
|    public: | ||||
|     Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[ | ||||
| 
 | ||||
|       const ParamGenerator<T$j>& g$j, | ||||
|       const typename ParamGenerator<T$j>::iterator& current$(j)]]) | ||||
|         : base_(base), | ||||
| $for j, [[ | ||||
| 
 | ||||
|           begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j) | ||||
| ]]    { | ||||
|       ComputeCurrentValue(); | ||||
|     } | ||||
|     virtual ~Iterator() {} | ||||
| 
 | ||||
|     virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { | ||||
|       return base_; | ||||
|     } | ||||
|     // Advance should not be called on beyond-of-range iterators | ||||
|     // so no component iterators must be beyond end of range, either. | ||||
|     virtual void Advance() { | ||||
|       assert(!AtEnd()); | ||||
|       ++current$(i)_; | ||||
| 
 | ||||
| $for k [[ | ||||
|       if (current$(i+2-k)_ == end$(i+2-k)_) { | ||||
|         current$(i+2-k)_ = begin$(i+2-k)_; | ||||
|         ++current$(i+2-k-1)_; | ||||
|       } | ||||
| 
 | ||||
| ]] | ||||
|       ComputeCurrentValue(); | ||||
|     } | ||||
|     virtual ParamIteratorInterface<ParamType>* Clone() const { | ||||
|       return new Iterator(*this); | ||||
|     } | ||||
|     virtual const ParamType* Current() const { return ¤t_value_; } | ||||
|     virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { | ||||
|       // Having the same base generator guarantees that the other | ||||
|       // iterator is of the same type and we can downcast. | ||||
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) | ||||
|           << "The program attempted to compare iterators " | ||||
|           << "from different generators." << std::endl; | ||||
|       const Iterator* typed_other = | ||||
|           CheckedDowncastToActualType<const Iterator>(&other); | ||||
|       // We must report iterators equal if they both point beyond their | ||||
|       // respective ranges. That can happen in a variety of fashions, | ||||
|       // so we have to consult AtEnd(). | ||||
|       return (AtEnd() && typed_other->AtEnd()) || | ||||
|          ($for j  && [[ | ||||
| 
 | ||||
|           current$(j)_ == typed_other->current$(j)_ | ||||
| ]]); | ||||
|     } | ||||
| 
 | ||||
|    private: | ||||
|     Iterator(const Iterator& other) | ||||
|         : base_(other.base_), $for j, [[ | ||||
| 
 | ||||
|         begin$(j)_(other.begin$(j)_), | ||||
|         end$(j)_(other.end$(j)_), | ||||
|         current$(j)_(other.current$(j)_) | ||||
| ]] { | ||||
|       ComputeCurrentValue(); | ||||
|     } | ||||
| 
 | ||||
|     void ComputeCurrentValue() { | ||||
|       if (!AtEnd()) | ||||
|         current_value_ = ParamType($for j, [[*current$(j)_]]); | ||||
|     } | ||||
|     bool AtEnd() const { | ||||
|       // We must report iterator past the end of the range when either of the | ||||
|       // component iterators has reached the end of its range. | ||||
|       return | ||||
| $for j  || [[ | ||||
| 
 | ||||
|           current$(j)_ == end$(j)_ | ||||
| ]]; | ||||
|     } | ||||
| 
 | ||||
|     // No implementation - assignment is unsupported. | ||||
|     void operator=(const Iterator& other); | ||||
| 
 | ||||
|     const ParamGeneratorInterface<ParamType>* const base_; | ||||
|     // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. | ||||
|     // current[i]_ is the actual traversing iterator. | ||||
| $for j [[ | ||||
| 
 | ||||
|     const typename ParamGenerator<T$j>::iterator begin$(j)_; | ||||
|     const typename ParamGenerator<T$j>::iterator end$(j)_; | ||||
|     typename ParamGenerator<T$j>::iterator current$(j)_; | ||||
| ]] | ||||
| 
 | ||||
|     ParamType current_value_; | ||||
|   };  // class CartesianProductGenerator$i::Iterator | ||||
| 
 | ||||
|   // No implementation - assignment is unsupported. | ||||
|   void operator=(const CartesianProductGenerator$i& other); | ||||
| 
 | ||||
| 
 | ||||
| $for j [[ | ||||
|   const ParamGenerator<T$j> g$(j)_; | ||||
| 
 | ||||
| ]] | ||||
| };  // class CartesianProductGenerator$i | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. | ||||
| // | ||||
| // Helper classes providing Combine() with polymorphic features. They allow | ||||
| // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is | ||||
| // convertible to U. | ||||
| // | ||||
| $range i 2..maxtuple | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| 
 | ||||
| template <$for j, [[class Generator$j]]> | ||||
| class CartesianProductHolder$i { | ||||
|  public: | ||||
| CartesianProductHolder$i($for j, [[const Generator$j& g$j]]) | ||||
|       : $for j, [[g$(j)_(g$j)]] {} | ||||
|   template <$for j, [[typename T$j]]> | ||||
|   operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const { | ||||
|     return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >( | ||||
|         new CartesianProductGenerator$i<$for j, [[T$j]]>( | ||||
| $for j,[[ | ||||
| 
 | ||||
|         static_cast<ParamGenerator<T$j> >(g$(j)_) | ||||
| ]])); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   // No implementation - assignment is unsupported. | ||||
|   void operator=(const CartesianProductHolder$i& other); | ||||
| 
 | ||||
| 
 | ||||
| $for j [[ | ||||
|   const Generator$j g$(j)_; | ||||
| 
 | ||||
| ]] | ||||
| };  // class CartesianProductHolder$i | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| # endif  // GTEST_HAS_COMBINE | ||||
| 
 | ||||
| }  // namespace internal | ||||
| }  // namespace testing | ||||
| 
 | ||||
| #endif  //  GTEST_HAS_PARAM_TEST | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ | ||||
							
								
								
									
										619
									
								
								lib/gtest/include/gtest/internal/gtest-param-util.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										619
									
								
								lib/gtest/include/gtest/internal/gtest-param-util.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,619 @@ | |||
| // Copyright 2008 Google Inc.
 | ||||
| // All Rights Reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Author: vladl@google.com (Vlad Losev)
 | ||||
| 
 | ||||
| // Type and function utilities for implementing parameterized tests.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ | ||||
| 
 | ||||
| #include <iterator> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| 
 | ||||
| // scripts/fuse_gtest.py depends on gtest's own header being #included
 | ||||
| // *unconditionally*.  Therefore these #includes cannot be moved
 | ||||
| // inside #if GTEST_HAS_PARAM_TEST.
 | ||||
| #include "gtest/internal/gtest-internal.h" | ||||
| #include "gtest/internal/gtest-linked_ptr.h" | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| #include "gtest/gtest-printers.h" | ||||
| 
 | ||||
| #if GTEST_HAS_PARAM_TEST | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // Outputs a message explaining invalid registration of different
 | ||||
| // fixture class for the same test case. This may happen when
 | ||||
| // TEST_P macro is used to define two tests with the same name
 | ||||
| // but in different namespaces.
 | ||||
| GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, | ||||
|                                           const char* file, int line); | ||||
| 
 | ||||
| template <typename> class ParamGeneratorInterface; | ||||
| template <typename> class ParamGenerator; | ||||
| 
 | ||||
| // Interface for iterating over elements provided by an implementation
 | ||||
| // of ParamGeneratorInterface<T>.
 | ||||
| template <typename T> | ||||
| class ParamIteratorInterface { | ||||
|  public: | ||||
|   virtual ~ParamIteratorInterface() {} | ||||
|   // A pointer to the base generator instance.
 | ||||
|   // Used only for the purposes of iterator comparison
 | ||||
|   // to make sure that two iterators belong to the same generator.
 | ||||
|   virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0; | ||||
|   // Advances iterator to point to the next element
 | ||||
|   // provided by the generator. The caller is responsible
 | ||||
|   // for not calling Advance() on an iterator equal to
 | ||||
|   // BaseGenerator()->End().
 | ||||
|   virtual void Advance() = 0; | ||||
|   // Clones the iterator object. Used for implementing copy semantics
 | ||||
|   // of ParamIterator<T>.
 | ||||
|   virtual ParamIteratorInterface* Clone() const = 0; | ||||
|   // Dereferences the current iterator and provides (read-only) access
 | ||||
|   // to the pointed value. It is the caller's responsibility not to call
 | ||||
|   // Current() on an iterator equal to BaseGenerator()->End().
 | ||||
|   // Used for implementing ParamGenerator<T>::operator*().
 | ||||
|   virtual const T* Current() const = 0; | ||||
|   // Determines whether the given iterator and other point to the same
 | ||||
|   // element in the sequence generated by the generator.
 | ||||
|   // Used for implementing ParamGenerator<T>::operator==().
 | ||||
|   virtual bool Equals(const ParamIteratorInterface& other) const = 0; | ||||
| }; | ||||
| 
 | ||||
| // Class iterating over elements provided by an implementation of
 | ||||
| // ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
 | ||||
| // and implements the const forward iterator concept.
 | ||||
| template <typename T> | ||||
| class ParamIterator { | ||||
|  public: | ||||
|   typedef T value_type; | ||||
|   typedef const T& reference; | ||||
|   typedef ptrdiff_t difference_type; | ||||
| 
 | ||||
|   // ParamIterator assumes ownership of the impl_ pointer.
 | ||||
|   ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} | ||||
|   ParamIterator& operator=(const ParamIterator& other) { | ||||
|     if (this != &other) | ||||
|       impl_.reset(other.impl_->Clone()); | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   const T& operator*() const { return *impl_->Current(); } | ||||
|   const T* operator->() const { return impl_->Current(); } | ||||
|   // Prefix version of operator++.
 | ||||
|   ParamIterator& operator++() { | ||||
|     impl_->Advance(); | ||||
|     return *this; | ||||
|   } | ||||
|   // Postfix version of operator++.
 | ||||
|   ParamIterator operator++(int /*unused*/) { | ||||
|     ParamIteratorInterface<T>* clone = impl_->Clone(); | ||||
|     impl_->Advance(); | ||||
|     return ParamIterator(clone); | ||||
|   } | ||||
|   bool operator==(const ParamIterator& other) const { | ||||
|     return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); | ||||
|   } | ||||
|   bool operator!=(const ParamIterator& other) const { | ||||
|     return !(*this == other); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   friend class ParamGenerator<T>; | ||||
|   explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {} | ||||
|   scoped_ptr<ParamIteratorInterface<T> > impl_; | ||||
| }; | ||||
| 
 | ||||
| // ParamGeneratorInterface<T> is the binary interface to access generators
 | ||||
| // defined in other translation units.
 | ||||
| template <typename T> | ||||
| class ParamGeneratorInterface { | ||||
|  public: | ||||
|   typedef T ParamType; | ||||
| 
 | ||||
|   virtual ~ParamGeneratorInterface() {} | ||||
| 
 | ||||
|   // Generator interface definition
 | ||||
|   virtual ParamIteratorInterface<T>* Begin() const = 0; | ||||
|   virtual ParamIteratorInterface<T>* End() const = 0; | ||||
| }; | ||||
| 
 | ||||
| // Wraps ParamGeneratorInterface<T> and provides general generator syntax
 | ||||
| // compatible with the STL Container concept.
 | ||||
| // This class implements copy initialization semantics and the contained
 | ||||
| // ParamGeneratorInterface<T> instance is shared among all copies
 | ||||
| // of the original object. This is possible because that instance is immutable.
 | ||||
| template<typename T> | ||||
| class ParamGenerator { | ||||
|  public: | ||||
|   typedef ParamIterator<T> iterator; | ||||
| 
 | ||||
|   explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {} | ||||
|   ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} | ||||
| 
 | ||||
|   ParamGenerator& operator=(const ParamGenerator& other) { | ||||
|     impl_ = other.impl_; | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
|   iterator begin() const { return iterator(impl_->Begin()); } | ||||
|   iterator end() const { return iterator(impl_->End()); } | ||||
| 
 | ||||
|  private: | ||||
|   linked_ptr<const ParamGeneratorInterface<T> > impl_; | ||||
| }; | ||||
| 
 | ||||
| // Generates values from a range of two comparable values. Can be used to
 | ||||
| // generate sequences of user-defined types that implement operator+() and
 | ||||
| // operator<().
 | ||||
| // This class is used in the Range() function.
 | ||||
| template <typename T, typename IncrementT> | ||||
| class RangeGenerator : public ParamGeneratorInterface<T> { | ||||
|  public: | ||||
|   RangeGenerator(T begin, T end, IncrementT step) | ||||
|       : begin_(begin), end_(end), | ||||
|         step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} | ||||
|   virtual ~RangeGenerator() {} | ||||
| 
 | ||||
|   virtual ParamIteratorInterface<T>* Begin() const { | ||||
|     return new Iterator(this, begin_, 0, step_); | ||||
|   } | ||||
|   virtual ParamIteratorInterface<T>* End() const { | ||||
|     return new Iterator(this, end_, end_index_, step_); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   class Iterator : public ParamIteratorInterface<T> { | ||||
|    public: | ||||
|     Iterator(const ParamGeneratorInterface<T>* base, T value, int index, | ||||
|              IncrementT step) | ||||
|         : base_(base), value_(value), index_(index), step_(step) {} | ||||
|     virtual ~Iterator() {} | ||||
| 
 | ||||
|     virtual const ParamGeneratorInterface<T>* BaseGenerator() const { | ||||
|       return base_; | ||||
|     } | ||||
|     virtual void Advance() { | ||||
|       value_ = value_ + step_; | ||||
|       index_++; | ||||
|     } | ||||
|     virtual ParamIteratorInterface<T>* Clone() const { | ||||
|       return new Iterator(*this); | ||||
|     } | ||||
|     virtual const T* Current() const { return &value_; } | ||||
|     virtual bool Equals(const ParamIteratorInterface<T>& other) const { | ||||
|       // Having the same base generator guarantees that the other
 | ||||
|       // iterator is of the same type and we can downcast.
 | ||||
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) | ||||
|           << "The program attempted to compare iterators " | ||||
|           << "from different generators." << std::endl; | ||||
|       const int other_index = | ||||
|           CheckedDowncastToActualType<const Iterator>(&other)->index_; | ||||
|       return index_ == other_index; | ||||
|     } | ||||
| 
 | ||||
|    private: | ||||
|     Iterator(const Iterator& other) | ||||
|         : ParamIteratorInterface<T>(), | ||||
|           base_(other.base_), value_(other.value_), index_(other.index_), | ||||
|           step_(other.step_) {} | ||||
| 
 | ||||
|     // No implementation - assignment is unsupported.
 | ||||
|     void operator=(const Iterator& other); | ||||
| 
 | ||||
|     const ParamGeneratorInterface<T>* const base_; | ||||
|     T value_; | ||||
|     int index_; | ||||
|     const IncrementT step_; | ||||
|   };  // class RangeGenerator::Iterator
 | ||||
| 
 | ||||
|   static int CalculateEndIndex(const T& begin, | ||||
|                                const T& end, | ||||
|                                const IncrementT& step) { | ||||
|     int end_index = 0; | ||||
|     for (T i = begin; i < end; i = i + step) | ||||
|       end_index++; | ||||
|     return end_index; | ||||
|   } | ||||
| 
 | ||||
|   // No implementation - assignment is unsupported.
 | ||||
|   void operator=(const RangeGenerator& other); | ||||
| 
 | ||||
|   const T begin_; | ||||
|   const T end_; | ||||
|   const IncrementT step_; | ||||
|   // The index for the end() iterator. All the elements in the generated
 | ||||
|   // sequence are indexed (0-based) to aid iterator comparison.
 | ||||
|   const int end_index_; | ||||
| };  // class RangeGenerator
 | ||||
| 
 | ||||
| 
 | ||||
| // Generates values from a pair of STL-style iterators. Used in the
 | ||||
| // ValuesIn() function. The elements are copied from the source range
 | ||||
| // since the source can be located on the stack, and the generator
 | ||||
| // is likely to persist beyond that stack frame.
 | ||||
| template <typename T> | ||||
| class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { | ||||
|  public: | ||||
|   template <typename ForwardIterator> | ||||
|   ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) | ||||
|       : container_(begin, end) {} | ||||
|   virtual ~ValuesInIteratorRangeGenerator() {} | ||||
| 
 | ||||
|   virtual ParamIteratorInterface<T>* Begin() const { | ||||
|     return new Iterator(this, container_.begin()); | ||||
|   } | ||||
|   virtual ParamIteratorInterface<T>* End() const { | ||||
|     return new Iterator(this, container_.end()); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   typedef typename ::std::vector<T> ContainerType; | ||||
| 
 | ||||
|   class Iterator : public ParamIteratorInterface<T> { | ||||
|    public: | ||||
|     Iterator(const ParamGeneratorInterface<T>* base, | ||||
|              typename ContainerType::const_iterator iterator) | ||||
|         : base_(base), iterator_(iterator) {} | ||||
|     virtual ~Iterator() {} | ||||
| 
 | ||||
|     virtual const ParamGeneratorInterface<T>* BaseGenerator() const { | ||||
|       return base_; | ||||
|     } | ||||
|     virtual void Advance() { | ||||
|       ++iterator_; | ||||
|       value_.reset(); | ||||
|     } | ||||
|     virtual ParamIteratorInterface<T>* Clone() const { | ||||
|       return new Iterator(*this); | ||||
|     } | ||||
|     // We need to use cached value referenced by iterator_ because *iterator_
 | ||||
|     // can return a temporary object (and of type other then T), so just
 | ||||
|     // having "return &*iterator_;" doesn't work.
 | ||||
|     // value_ is updated here and not in Advance() because Advance()
 | ||||
|     // can advance iterator_ beyond the end of the range, and we cannot
 | ||||
|     // detect that fact. The client code, on the other hand, is
 | ||||
|     // responsible for not calling Current() on an out-of-range iterator.
 | ||||
|     virtual const T* Current() const { | ||||
|       if (value_.get() == NULL) | ||||
|         value_.reset(new T(*iterator_)); | ||||
|       return value_.get(); | ||||
|     } | ||||
|     virtual bool Equals(const ParamIteratorInterface<T>& other) const { | ||||
|       // Having the same base generator guarantees that the other
 | ||||
|       // iterator is of the same type and we can downcast.
 | ||||
|       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) | ||||
|           << "The program attempted to compare iterators " | ||||
|           << "from different generators." << std::endl; | ||||
|       return iterator_ == | ||||
|           CheckedDowncastToActualType<const Iterator>(&other)->iterator_; | ||||
|     } | ||||
| 
 | ||||
|    private: | ||||
|     Iterator(const Iterator& other) | ||||
|           // The explicit constructor call suppresses a false warning
 | ||||
|           // emitted by gcc when supplied with the -Wextra option.
 | ||||
|         : ParamIteratorInterface<T>(), | ||||
|           base_(other.base_), | ||||
|           iterator_(other.iterator_) {} | ||||
| 
 | ||||
|     const ParamGeneratorInterface<T>* const base_; | ||||
|     typename ContainerType::const_iterator iterator_; | ||||
|     // A cached value of *iterator_. We keep it here to allow access by
 | ||||
|     // pointer in the wrapping iterator's operator->().
 | ||||
|     // value_ needs to be mutable to be accessed in Current().
 | ||||
|     // Use of scoped_ptr helps manage cached value's lifetime,
 | ||||
|     // which is bound by the lifespan of the iterator itself.
 | ||||
|     mutable scoped_ptr<const T> value_; | ||||
|   };  // class ValuesInIteratorRangeGenerator::Iterator
 | ||||
| 
 | ||||
|   // No implementation - assignment is unsupported.
 | ||||
|   void operator=(const ValuesInIteratorRangeGenerator& other); | ||||
| 
 | ||||
|   const ContainerType container_; | ||||
| };  // class ValuesInIteratorRangeGenerator
 | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // Stores a parameter value and later creates tests parameterized with that
 | ||||
| // value.
 | ||||
| template <class TestClass> | ||||
| class ParameterizedTestFactory : public TestFactoryBase { | ||||
|  public: | ||||
|   typedef typename TestClass::ParamType ParamType; | ||||
|   explicit ParameterizedTestFactory(ParamType parameter) : | ||||
|       parameter_(parameter) {} | ||||
|   virtual Test* CreateTest() { | ||||
|     TestClass::SetParam(¶meter_); | ||||
|     return new TestClass(); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   const ParamType parameter_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); | ||||
| }; | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // TestMetaFactoryBase is a base class for meta-factories that create
 | ||||
| // test factories for passing into MakeAndRegisterTestInfo function.
 | ||||
| template <class ParamType> | ||||
| class TestMetaFactoryBase { | ||||
|  public: | ||||
|   virtual ~TestMetaFactoryBase() {} | ||||
| 
 | ||||
|   virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; | ||||
| }; | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // TestMetaFactory creates test factories for passing into
 | ||||
| // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
 | ||||
| // ownership of test factory pointer, same factory object cannot be passed
 | ||||
| // into that method twice. But ParameterizedTestCaseInfo is going to call
 | ||||
| // it for each Test/Parameter value combination. Thus it needs meta factory
 | ||||
| // creator class.
 | ||||
| template <class TestCase> | ||||
| class TestMetaFactory | ||||
|     : public TestMetaFactoryBase<typename TestCase::ParamType> { | ||||
|  public: | ||||
|   typedef typename TestCase::ParamType ParamType; | ||||
| 
 | ||||
|   TestMetaFactory() {} | ||||
| 
 | ||||
|   virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { | ||||
|     return new ParameterizedTestFactory<TestCase>(parameter); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); | ||||
| }; | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // ParameterizedTestCaseInfoBase is a generic interface
 | ||||
| // to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
 | ||||
| // accumulates test information provided by TEST_P macro invocations
 | ||||
| // and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
 | ||||
| // and uses that information to register all resulting test instances
 | ||||
| // in RegisterTests method. The ParameterizeTestCaseRegistry class holds
 | ||||
| // a collection of pointers to the ParameterizedTestCaseInfo objects
 | ||||
| // and calls RegisterTests() on each of them when asked.
 | ||||
| class ParameterizedTestCaseInfoBase { | ||||
|  public: | ||||
|   virtual ~ParameterizedTestCaseInfoBase() {} | ||||
| 
 | ||||
|   // Base part of test case name for display purposes.
 | ||||
|   virtual const string& GetTestCaseName() const = 0; | ||||
|   // Test case id to verify identity.
 | ||||
|   virtual TypeId GetTestCaseTypeId() const = 0; | ||||
|   // UnitTest class invokes this method to register tests in this
 | ||||
|   // test case right before running them in RUN_ALL_TESTS macro.
 | ||||
|   // This method should not be called more then once on any single
 | ||||
|   // instance of a ParameterizedTestCaseInfoBase derived class.
 | ||||
|   virtual void RegisterTests() = 0; | ||||
| 
 | ||||
|  protected: | ||||
|   ParameterizedTestCaseInfoBase() {} | ||||
| 
 | ||||
|  private: | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); | ||||
| }; | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
 | ||||
| // macro invocations for a particular test case and generators
 | ||||
| // obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
 | ||||
| // test case. It registers tests with all values generated by all
 | ||||
| // generators when asked.
 | ||||
| template <class TestCase> | ||||
| class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { | ||||
|  public: | ||||
|   // ParamType and GeneratorCreationFunc are private types but are required
 | ||||
|   // for declarations of public methods AddTestPattern() and
 | ||||
|   // AddTestCaseInstantiation().
 | ||||
|   typedef typename TestCase::ParamType ParamType; | ||||
|   // A function that returns an instance of appropriate generator type.
 | ||||
|   typedef ParamGenerator<ParamType>(GeneratorCreationFunc)(); | ||||
| 
 | ||||
|   explicit ParameterizedTestCaseInfo(const char* name) | ||||
|       : test_case_name_(name) {} | ||||
| 
 | ||||
|   // Test case base name for display purposes.
 | ||||
|   virtual const string& GetTestCaseName() const { return test_case_name_; } | ||||
|   // Test case id to verify identity.
 | ||||
|   virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); } | ||||
|   // TEST_P macro uses AddTestPattern() to record information
 | ||||
|   // about a single test in a LocalTestInfo structure.
 | ||||
|   // test_case_name is the base name of the test case (without invocation
 | ||||
|   // prefix). test_base_name is the name of an individual test without
 | ||||
|   // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
 | ||||
|   // test case base name and DoBar is test base name.
 | ||||
|   void AddTestPattern(const char* test_case_name, | ||||
|                       const char* test_base_name, | ||||
|                       TestMetaFactoryBase<ParamType>* meta_factory) { | ||||
|     tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name, | ||||
|                                                        test_base_name, | ||||
|                                                        meta_factory))); | ||||
|   } | ||||
|   // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
 | ||||
|   // about a generator.
 | ||||
|   int AddTestCaseInstantiation(const string& instantiation_name, | ||||
|                                GeneratorCreationFunc* func, | ||||
|                                const char* /* file */, | ||||
|                                int /* line */) { | ||||
|     instantiations_.push_back(::std::make_pair(instantiation_name, func)); | ||||
|     return 0;  // Return value used only to run this method in namespace scope.
 | ||||
|   } | ||||
|   // UnitTest class invokes this method to register tests in this test case
 | ||||
|   // test cases right before running tests in RUN_ALL_TESTS macro.
 | ||||
|   // This method should not be called more then once on any single
 | ||||
|   // instance of a ParameterizedTestCaseInfoBase derived class.
 | ||||
|   // UnitTest has a guard to prevent from calling this method more then once.
 | ||||
|   virtual void RegisterTests() { | ||||
|     for (typename TestInfoContainer::iterator test_it = tests_.begin(); | ||||
|          test_it != tests_.end(); ++test_it) { | ||||
|       linked_ptr<TestInfo> test_info = *test_it; | ||||
|       for (typename InstantiationContainer::iterator gen_it = | ||||
|                instantiations_.begin(); gen_it != instantiations_.end(); | ||||
|                ++gen_it) { | ||||
|         const string& instantiation_name = gen_it->first; | ||||
|         ParamGenerator<ParamType> generator((*gen_it->second)()); | ||||
| 
 | ||||
|         string test_case_name; | ||||
|         if ( !instantiation_name.empty() ) | ||||
|           test_case_name = instantiation_name + "/"; | ||||
|         test_case_name += test_info->test_case_base_name; | ||||
| 
 | ||||
|         int i = 0; | ||||
|         for (typename ParamGenerator<ParamType>::iterator param_it = | ||||
|                  generator.begin(); | ||||
|              param_it != generator.end(); ++param_it, ++i) { | ||||
|           Message test_name_stream; | ||||
|           test_name_stream << test_info->test_base_name << "/" << i; | ||||
|           MakeAndRegisterTestInfo( | ||||
|               test_case_name.c_str(), | ||||
|               test_name_stream.GetString().c_str(), | ||||
|               NULL,  // No type parameter.
 | ||||
|               PrintToString(*param_it).c_str(), | ||||
|               GetTestCaseTypeId(), | ||||
|               TestCase::SetUpTestCase, | ||||
|               TestCase::TearDownTestCase, | ||||
|               test_info->test_meta_factory->CreateTestFactory(*param_it)); | ||||
|         }  // for param_it
 | ||||
|       }  // for gen_it
 | ||||
|     }  // for test_it
 | ||||
|   }  // RegisterTests
 | ||||
| 
 | ||||
|  private: | ||||
|   // LocalTestInfo structure keeps information about a single test registered
 | ||||
|   // with TEST_P macro.
 | ||||
|   struct TestInfo { | ||||
|     TestInfo(const char* a_test_case_base_name, | ||||
|              const char* a_test_base_name, | ||||
|              TestMetaFactoryBase<ParamType>* a_test_meta_factory) : | ||||
|         test_case_base_name(a_test_case_base_name), | ||||
|         test_base_name(a_test_base_name), | ||||
|         test_meta_factory(a_test_meta_factory) {} | ||||
| 
 | ||||
|     const string test_case_base_name; | ||||
|     const string test_base_name; | ||||
|     const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory; | ||||
|   }; | ||||
|   typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer; | ||||
|   // Keeps pairs of <Instantiation name, Sequence generator creation function>
 | ||||
|   // received from INSTANTIATE_TEST_CASE_P macros.
 | ||||
|   typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> > | ||||
|       InstantiationContainer; | ||||
| 
 | ||||
|   const string test_case_name_; | ||||
|   TestInfoContainer tests_; | ||||
|   InstantiationContainer instantiations_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); | ||||
| };  // class ParameterizedTestCaseInfo
 | ||||
| 
 | ||||
| // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | ||||
| //
 | ||||
| // ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
 | ||||
| // classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
 | ||||
| // macros use it to locate their corresponding ParameterizedTestCaseInfo
 | ||||
| // descriptors.
 | ||||
| class ParameterizedTestCaseRegistry { | ||||
|  public: | ||||
|   ParameterizedTestCaseRegistry() {} | ||||
|   ~ParameterizedTestCaseRegistry() { | ||||
|     for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); | ||||
|          it != test_case_infos_.end(); ++it) { | ||||
|       delete *it; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // Looks up or creates and returns a structure containing information about
 | ||||
|   // tests and instantiations of a particular test case.
 | ||||
|   template <class TestCase> | ||||
|   ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder( | ||||
|       const char* test_case_name, | ||||
|       const char* file, | ||||
|       int line) { | ||||
|     ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL; | ||||
|     for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); | ||||
|          it != test_case_infos_.end(); ++it) { | ||||
|       if ((*it)->GetTestCaseName() == test_case_name) { | ||||
|         if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) { | ||||
|           // Complain about incorrect usage of Google Test facilities
 | ||||
|           // and terminate the program since we cannot guaranty correct
 | ||||
|           // test case setup and tear-down in this case.
 | ||||
|           ReportInvalidTestCaseType(test_case_name,  file, line); | ||||
|           posix::Abort(); | ||||
|         } else { | ||||
|           // At this point we are sure that the object we found is of the same
 | ||||
|           // type we are looking for, so we downcast it to that type
 | ||||
|           // without further checks.
 | ||||
|           typed_test_info = CheckedDowncastToActualType< | ||||
|               ParameterizedTestCaseInfo<TestCase> >(*it); | ||||
|         } | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|     if (typed_test_info == NULL) { | ||||
|       typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name); | ||||
|       test_case_infos_.push_back(typed_test_info); | ||||
|     } | ||||
|     return typed_test_info; | ||||
|   } | ||||
|   void RegisterTests() { | ||||
|     for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); | ||||
|          it != test_case_infos_.end(); ++it) { | ||||
|       (*it)->RegisterTests(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer; | ||||
| 
 | ||||
|   TestCaseInfoContainer test_case_infos_; | ||||
| 
 | ||||
|   GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); | ||||
| }; | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  //  GTEST_HAS_PARAM_TEST
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
 | ||||
							
								
								
									
										1952
									
								
								lib/gtest/include/gtest/internal/gtest-port.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1952
									
								
								lib/gtest/include/gtest/internal/gtest-port.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										167
									
								
								lib/gtest/include/gtest/internal/gtest-string.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								lib/gtest/include/gtest/internal/gtest-string.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,167 @@ | |||
| // Copyright 2005, Google Inc.
 | ||||
| // All rights reserved.
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //     * Neither the name of Google Inc. nor the names of its
 | ||||
| // contributors may be used to endorse or promote products derived from
 | ||||
| // this software without specific prior written permission.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| //
 | ||||
| // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
 | ||||
| //
 | ||||
| // The Google C++ Testing Framework (Google Test)
 | ||||
| //
 | ||||
| // This header file declares the String class and functions used internally by
 | ||||
| // Google Test.  They are subject to change without notice. They should not used
 | ||||
| // by code external to Google Test.
 | ||||
| //
 | ||||
| // This header file is #included by <gtest/internal/gtest-internal.h>.
 | ||||
| // It should not be #included by other files.
 | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ | ||||
| 
 | ||||
| #ifdef __BORLANDC__ | ||||
| // string.h is not guaranteed to provide strcpy on C++ Builder.
 | ||||
| # include <mem.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <string.h> | ||||
| #include <string> | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // String - an abstract class holding static string utilities.
 | ||||
| class GTEST_API_ String { | ||||
|  public: | ||||
|   // Static utility methods
 | ||||
| 
 | ||||
|   // Clones a 0-terminated C string, allocating memory using new.  The
 | ||||
|   // caller is responsible for deleting the return value using
 | ||||
|   // delete[].  Returns the cloned string, or NULL if the input is
 | ||||
|   // NULL.
 | ||||
|   //
 | ||||
|   // This is different from strdup() in string.h, which allocates
 | ||||
|   // memory using malloc().
 | ||||
|   static const char* CloneCString(const char* c_str); | ||||
| 
 | ||||
| #if GTEST_OS_WINDOWS_MOBILE | ||||
|   // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
 | ||||
|   // able to pass strings to Win32 APIs on CE we need to convert them
 | ||||
|   // to 'Unicode', UTF-16.
 | ||||
| 
 | ||||
|   // Creates a UTF-16 wide string from the given ANSI string, allocating
 | ||||
|   // memory using new. The caller is responsible for deleting the return
 | ||||
|   // value using delete[]. Returns the wide string, or NULL if the
 | ||||
|   // input is NULL.
 | ||||
|   //
 | ||||
|   // The wide string is created using the ANSI codepage (CP_ACP) to
 | ||||
|   // match the behaviour of the ANSI versions of Win32 calls and the
 | ||||
|   // C runtime.
 | ||||
|   static LPCWSTR AnsiToUtf16(const char* c_str); | ||||
| 
 | ||||
|   // Creates an ANSI string from the given wide string, allocating
 | ||||
|   // memory using new. The caller is responsible for deleting the return
 | ||||
|   // value using delete[]. Returns the ANSI string, or NULL if the
 | ||||
|   // input is NULL.
 | ||||
|   //
 | ||||
|   // The returned string is created using the ANSI codepage (CP_ACP) to
 | ||||
|   // match the behaviour of the ANSI versions of Win32 calls and the
 | ||||
|   // C runtime.
 | ||||
|   static const char* Utf16ToAnsi(LPCWSTR utf16_str); | ||||
| #endif | ||||
| 
 | ||||
|   // Compares two C strings.  Returns true iff they have the same content.
 | ||||
|   //
 | ||||
|   // Unlike strcmp(), this function can handle NULL argument(s).  A
 | ||||
|   // NULL C string is considered different to any non-NULL C string,
 | ||||
|   // including the empty string.
 | ||||
|   static bool CStringEquals(const char* lhs, const char* rhs); | ||||
| 
 | ||||
|   // Converts a wide C string to a String using the UTF-8 encoding.
 | ||||
|   // NULL will be converted to "(null)".  If an error occurred during
 | ||||
|   // the conversion, "(failed to convert from wide string)" is
 | ||||
|   // returned.
 | ||||
|   static std::string ShowWideCString(const wchar_t* wide_c_str); | ||||
| 
 | ||||
|   // Compares two wide C strings.  Returns true iff they have the same
 | ||||
|   // content.
 | ||||
|   //
 | ||||
|   // Unlike wcscmp(), this function can handle NULL argument(s).  A
 | ||||
|   // NULL C string is considered different to any non-NULL C string,
 | ||||
|   // including the empty string.
 | ||||
|   static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); | ||||
| 
 | ||||
|   // Compares two C strings, ignoring case.  Returns true iff they
 | ||||
|   // have the same content.
 | ||||
|   //
 | ||||
|   // Unlike strcasecmp(), this function can handle NULL argument(s).
 | ||||
|   // A NULL C string is considered different to any non-NULL C string,
 | ||||
|   // including the empty string.
 | ||||
|   static bool CaseInsensitiveCStringEquals(const char* lhs, | ||||
|                                            const char* rhs); | ||||
| 
 | ||||
|   // Compares two wide C strings, ignoring case.  Returns true iff they
 | ||||
|   // have the same content.
 | ||||
|   //
 | ||||
|   // Unlike wcscasecmp(), this function can handle NULL argument(s).
 | ||||
|   // A NULL C string is considered different to any non-NULL wide C string,
 | ||||
|   // including the empty string.
 | ||||
|   // NB: The implementations on different platforms slightly differ.
 | ||||
|   // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
 | ||||
|   // environment variable. On GNU platform this method uses wcscasecmp
 | ||||
|   // which compares according to LC_CTYPE category of the current locale.
 | ||||
|   // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
 | ||||
|   // current locale.
 | ||||
|   static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, | ||||
|                                                const wchar_t* rhs); | ||||
| 
 | ||||
|   // Returns true iff the given string ends with the given suffix, ignoring
 | ||||
|   // case. Any string is considered to end with an empty suffix.
 | ||||
|   static bool EndsWithCaseInsensitive( | ||||
|       const std::string& str, const std::string& suffix); | ||||
| 
 | ||||
|   // Formats an int value as "%02d".
 | ||||
|   static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
 | ||||
| 
 | ||||
|   // Formats an int value as "%X".
 | ||||
|   static std::string FormatHexInt(int value); | ||||
| 
 | ||||
|   // Formats a byte as "%02X".
 | ||||
|   static std::string FormatByte(unsigned char value); | ||||
| 
 | ||||
|  private: | ||||
|   String();  // Not meant to be instantiated.
 | ||||
| };  // class String
 | ||||
| 
 | ||||
| // Gets the content of the stringstream's buffer as an std::string.  Each '\0'
 | ||||
| // character in the buffer is replaced with "\\0".
 | ||||
| GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); | ||||
| 
 | ||||
| }  // namespace internal
 | ||||
| }  // namespace testing
 | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
 | ||||
							
								
								
									
										1012
									
								
								lib/gtest/include/gtest/internal/gtest-tuple.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1012
									
								
								lib/gtest/include/gtest/internal/gtest-tuple.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										339
									
								
								lib/gtest/include/gtest/internal/gtest-tuple.h.pump
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								lib/gtest/include/gtest/internal/gtest-tuple.h.pump
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,339 @@ | |||
| $$ -*- mode: c++; -*- | ||||
| $var n = 10  $$ Maximum number of tuple fields we want to support. | ||||
| $$ This meta comment fixes auto-indentation in Emacs. }} | ||||
| // Copyright 2009 Google Inc. | ||||
| // All Rights Reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are | ||||
| // met: | ||||
| // | ||||
| //     * Redistributions of source code must retain the above copyright | ||||
| // notice, this list of conditions and the following disclaimer. | ||||
| //     * Redistributions in binary form must reproduce the above | ||||
| // copyright notice, this list of conditions and the following disclaimer | ||||
| // in the documentation and/or other materials provided with the | ||||
| // distribution. | ||||
| //     * Neither the name of Google Inc. nor the names of its | ||||
| // contributors may be used to endorse or promote products derived from | ||||
| // this software without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Author: wan@google.com (Zhanyong Wan) | ||||
| 
 | ||||
| // Implements a subset of TR1 tuple needed by Google Test and Google Mock. | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ | ||||
| 
 | ||||
| #include <utility>  // For ::std::pair. | ||||
| 
 | ||||
| // The compiler used in Symbian has a bug that prevents us from declaring the | ||||
| // tuple template as a friend (it complains that tuple is redefined).  This | ||||
| // hack bypasses the bug by declaring the members that should otherwise be | ||||
| // private as public. | ||||
| // Sun Studio versions < 12 also have the above bug. | ||||
| #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) | ||||
| # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: | ||||
| #else | ||||
| # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ | ||||
|     template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \ | ||||
|    private: | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| $range i 0..n-1 | ||||
| $range j 0..n | ||||
| $range k 1..n | ||||
| // GTEST_n_TUPLE_(T) is the type of an n-tuple. | ||||
| #define GTEST_0_TUPLE_(T) tuple<> | ||||
| 
 | ||||
| $for k [[ | ||||
| $range m 0..k-1 | ||||
| $range m2 k..n-1 | ||||
| #define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // GTEST_n_TYPENAMES_(T) declares a list of n typenames. | ||||
| 
 | ||||
| $for j [[ | ||||
| $range m 0..j-1 | ||||
| #define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // In theory, defining stuff in the ::std namespace is undefined | ||||
| // behavior.  We can do this as we are playing the role of a standard | ||||
| // library vendor. | ||||
| namespace std { | ||||
| namespace tr1 { | ||||
| 
 | ||||
| template <$for i, [[typename T$i = void]]> | ||||
| class tuple; | ||||
| 
 | ||||
| // Anything in namespace gtest_internal is Google Test's INTERNAL | ||||
| // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. | ||||
| namespace gtest_internal { | ||||
| 
 | ||||
| // ByRef<T>::type is T if T is a reference; otherwise it's const T&. | ||||
| template <typename T> | ||||
| struct ByRef { typedef const T& type; };  // NOLINT | ||||
| template <typename T> | ||||
| struct ByRef<T&> { typedef T& type; };  // NOLINT | ||||
| 
 | ||||
| // A handy wrapper for ByRef. | ||||
| #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type | ||||
| 
 | ||||
| // AddRef<T>::type is T if T is a reference; otherwise it's T&.  This | ||||
| // is the same as tr1::add_reference<T>::type. | ||||
| template <typename T> | ||||
| struct AddRef { typedef T& type; };  // NOLINT | ||||
| template <typename T> | ||||
| struct AddRef<T&> { typedef T& type; };  // NOLINT | ||||
| 
 | ||||
| // A handy wrapper for AddRef. | ||||
| #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type | ||||
| 
 | ||||
| // A helper for implementing get<k>(). | ||||
| template <int k> class Get; | ||||
| 
 | ||||
| // A helper for implementing tuple_element<k, T>.  kIndexValid is true | ||||
| // iff k < the number of fields in tuple type T. | ||||
| template <bool kIndexValid, int kIndex, class Tuple> | ||||
| struct TupleElement; | ||||
| 
 | ||||
| 
 | ||||
| $for i [[ | ||||
| template <GTEST_$(n)_TYPENAMES_(T)> | ||||
| struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > { | ||||
|   typedef T$i type; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| }  // namespace gtest_internal | ||||
| 
 | ||||
| template <> | ||||
| class tuple<> { | ||||
|  public: | ||||
|   tuple() {} | ||||
|   tuple(const tuple& /* t */)  {} | ||||
|   tuple& operator=(const tuple& /* t */) { return *this; } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| $for k [[ | ||||
| $range m 0..k-1 | ||||
| template <GTEST_$(k)_TYPENAMES_(T)> | ||||
| class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { | ||||
|  public: | ||||
|   template <int k> friend class gtest_internal::Get; | ||||
| 
 | ||||
|   tuple() : $for m, [[f$(m)_()]] {} | ||||
| 
 | ||||
|   explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] | ||||
| $for m, [[f$(m)_(f$m)]] {} | ||||
| 
 | ||||
|   tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} | ||||
| 
 | ||||
|   template <GTEST_$(k)_TYPENAMES_(U)> | ||||
|   tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} | ||||
| 
 | ||||
| $if k == 2 [[ | ||||
|   template <typename U0, typename U1> | ||||
|   tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {} | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
|   tuple& operator=(const tuple& t) { return CopyFrom(t); } | ||||
| 
 | ||||
|   template <GTEST_$(k)_TYPENAMES_(U)> | ||||
|   tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { | ||||
|     return CopyFrom(t); | ||||
|   } | ||||
| 
 | ||||
| $if k == 2 [[ | ||||
|   template <typename U0, typename U1> | ||||
|   tuple& operator=(const ::std::pair<U0, U1>& p) { | ||||
|     f0_ = p.first; | ||||
|     f1_ = p.second; | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
|   GTEST_DECLARE_TUPLE_AS_FRIEND_ | ||||
| 
 | ||||
|   template <GTEST_$(k)_TYPENAMES_(U)> | ||||
|   tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { | ||||
| 
 | ||||
| $for m [[ | ||||
|     f$(m)_ = t.f$(m)_; | ||||
| 
 | ||||
| ]] | ||||
|     return *this; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| $for m [[ | ||||
|   T$m f$(m)_; | ||||
| 
 | ||||
| ]] | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| // 6.1.3.2 Tuple creation functions. | ||||
| 
 | ||||
| // Known limitations: we don't support passing an | ||||
| // std::tr1::reference_wrapper<T> to make_tuple().  And we don't | ||||
| // implement tie(). | ||||
| 
 | ||||
| inline tuple<> make_tuple() { return tuple<>(); } | ||||
| 
 | ||||
| $for k [[ | ||||
| $range m 0..k-1 | ||||
| 
 | ||||
| template <GTEST_$(k)_TYPENAMES_(T)> | ||||
| inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { | ||||
|   return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); | ||||
| } | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // 6.1.3.3 Tuple helper classes. | ||||
| 
 | ||||
| template <typename Tuple> struct tuple_size; | ||||
| 
 | ||||
| 
 | ||||
| $for j [[ | ||||
| template <GTEST_$(j)_TYPENAMES_(T)> | ||||
| struct tuple_size<GTEST_$(j)_TUPLE_(T) > { | ||||
|   static const int value = $j; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| template <int k, class Tuple> | ||||
| struct tuple_element { | ||||
|   typedef typename gtest_internal::TupleElement< | ||||
|       k < (tuple_size<Tuple>::value), k, Tuple>::type type; | ||||
| }; | ||||
| 
 | ||||
| #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type | ||||
| 
 | ||||
| // 6.1.3.4 Element access. | ||||
| 
 | ||||
| namespace gtest_internal { | ||||
| 
 | ||||
| 
 | ||||
| $for i [[ | ||||
| template <> | ||||
| class Get<$i> { | ||||
|  public: | ||||
|   template <class Tuple> | ||||
|   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) | ||||
|   Field(Tuple& t) { return t.f$(i)_; }  // NOLINT | ||||
| 
 | ||||
|   template <class Tuple> | ||||
|   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) | ||||
|   ConstField(const Tuple& t) { return t.f$(i)_; } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| }  // namespace gtest_internal | ||||
| 
 | ||||
| template <int k, GTEST_$(n)_TYPENAMES_(T)> | ||||
| GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) | ||||
| get(GTEST_$(n)_TUPLE_(T)& t) { | ||||
|   return gtest_internal::Get<k>::Field(t); | ||||
| } | ||||
| 
 | ||||
| template <int k, GTEST_$(n)_TYPENAMES_(T)> | ||||
| GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T))) | ||||
| get(const GTEST_$(n)_TUPLE_(T)& t) { | ||||
|   return gtest_internal::Get<k>::ConstField(t); | ||||
| } | ||||
| 
 | ||||
| // 6.1.3.5 Relational operators | ||||
| 
 | ||||
| // We only implement == and !=, as we don't have a need for the rest yet. | ||||
| 
 | ||||
| namespace gtest_internal { | ||||
| 
 | ||||
| // SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the | ||||
| // first k fields of t1 equals the first k fields of t2. | ||||
| // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if | ||||
| // k1 != k2. | ||||
| template <int kSize1, int kSize2> | ||||
| struct SameSizeTuplePrefixComparator; | ||||
| 
 | ||||
| template <> | ||||
| struct SameSizeTuplePrefixComparator<0, 0> { | ||||
|   template <class Tuple1, class Tuple2> | ||||
|   static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { | ||||
|     return true; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| template <int k> | ||||
| struct SameSizeTuplePrefixComparator<k, k> { | ||||
|   template <class Tuple1, class Tuple2> | ||||
|   static bool Eq(const Tuple1& t1, const Tuple2& t2) { | ||||
|     return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) && | ||||
|         ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| }  // namespace gtest_internal | ||||
| 
 | ||||
| template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> | ||||
| inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, | ||||
|                        const GTEST_$(n)_TUPLE_(U)& u) { | ||||
|   return gtest_internal::SameSizeTuplePrefixComparator< | ||||
|       tuple_size<GTEST_$(n)_TUPLE_(T) >::value, | ||||
|       tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u); | ||||
| } | ||||
| 
 | ||||
| template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> | ||||
| inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, | ||||
|                        const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } | ||||
| 
 | ||||
| // 6.1.4 Pairs. | ||||
| // Unimplemented. | ||||
| 
 | ||||
| }  // namespace tr1 | ||||
| }  // namespace std | ||||
| 
 | ||||
| 
 | ||||
| $for j [[ | ||||
| #undef GTEST_$(j)_TUPLE_ | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| 
 | ||||
| $for j [[ | ||||
| #undef GTEST_$(j)_TYPENAMES_ | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ | ||||
| #undef GTEST_BY_REF_ | ||||
| #undef GTEST_ADD_REF_ | ||||
| #undef GTEST_TUPLE_ELEMENT_ | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ | ||||
							
								
								
									
										3331
									
								
								lib/gtest/include/gtest/internal/gtest-type-util.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3331
									
								
								lib/gtest/include/gtest/internal/gtest-type-util.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										297
									
								
								lib/gtest/include/gtest/internal/gtest-type-util.h.pump
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								lib/gtest/include/gtest/internal/gtest-type-util.h.pump
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,297 @@ | |||
| $$ -*- mode: c++; -*- | ||||
| $var n = 50  $$ Maximum length of type lists we want to support. | ||||
| // Copyright 2008 Google Inc. | ||||
| // All Rights Reserved. | ||||
| // | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are | ||||
| // met: | ||||
| // | ||||
| //     * Redistributions of source code must retain the above copyright | ||||
| // notice, this list of conditions and the following disclaimer. | ||||
| //     * Redistributions in binary form must reproduce the above | ||||
| // copyright notice, this list of conditions and the following disclaimer | ||||
| // in the documentation and/or other materials provided with the | ||||
| // distribution. | ||||
| //     * Neither the name of Google Inc. nor the names of its | ||||
| // contributors may be used to endorse or promote products derived from | ||||
| // this software without specific prior written permission. | ||||
| // | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Author: wan@google.com (Zhanyong Wan) | ||||
| 
 | ||||
| // Type utilities needed for implementing typed and type-parameterized | ||||
| // tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND! | ||||
| // | ||||
| // Currently we support at most $n types in a list, and at most $n | ||||
| // type-parameterized tests in one type-parameterized test case. | ||||
| // Please contact googletestframework@googlegroups.com if you need | ||||
| // more. | ||||
| 
 | ||||
| #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ | ||||
| #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ | ||||
| 
 | ||||
| #include "gtest/internal/gtest-port.h" | ||||
| 
 | ||||
| // #ifdef __GNUC__ is too general here.  It is possible to use gcc without using | ||||
| // libstdc++ (which is where cxxabi.h comes from). | ||||
| # if GTEST_HAS_CXXABI_H_ | ||||
| #  include <cxxabi.h> | ||||
| # elif defined(__HP_aCC) | ||||
| #  include <acxx_demangle.h> | ||||
| # endif  // GTEST_HASH_CXXABI_H_ | ||||
| 
 | ||||
| namespace testing { | ||||
| namespace internal { | ||||
| 
 | ||||
| // GetTypeName<T>() returns a human-readable name of type T. | ||||
| // NB: This function is also used in Google Mock, so don't move it inside of | ||||
| // the typed-test-only section below. | ||||
| template <typename T> | ||||
| std::string GetTypeName() { | ||||
| # if GTEST_HAS_RTTI | ||||
| 
 | ||||
|   const char* const name = typeid(T).name(); | ||||
| #  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) | ||||
|   int status = 0; | ||||
|   // gcc's implementation of typeid(T).name() mangles the type name, | ||||
|   // so we have to demangle it. | ||||
| #   if GTEST_HAS_CXXABI_H_ | ||||
|   using abi::__cxa_demangle; | ||||
| #   endif  // GTEST_HAS_CXXABI_H_ | ||||
|   char* const readable_name = __cxa_demangle(name, 0, 0, &status); | ||||
|   const std::string name_str(status == 0 ? readable_name : name); | ||||
|   free(readable_name); | ||||
|   return name_str; | ||||
| #  else | ||||
|   return name; | ||||
| #  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC | ||||
| 
 | ||||
| # else | ||||
| 
 | ||||
|   return "<type>"; | ||||
| 
 | ||||
| # endif  // GTEST_HAS_RTTI | ||||
| } | ||||
| 
 | ||||
| #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P | ||||
| 
 | ||||
| // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same | ||||
| // type.  This can be used as a compile-time assertion to ensure that | ||||
| // two types are equal. | ||||
| 
 | ||||
| template <typename T1, typename T2> | ||||
| struct AssertTypeEq; | ||||
| 
 | ||||
| template <typename T> | ||||
| struct AssertTypeEq<T, T> { | ||||
|   typedef bool type; | ||||
| }; | ||||
| 
 | ||||
| // A unique type used as the default value for the arguments of class | ||||
| // template Types.  This allows us to simulate variadic templates | ||||
| // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't | ||||
| // support directly. | ||||
| struct None {}; | ||||
| 
 | ||||
| // The following family of struct and struct templates are used to | ||||
| // represent type lists.  In particular, TypesN<T1, T2, ..., TN> | ||||
| // represents a type list with N types (T1, T2, ..., and TN) in it. | ||||
| // Except for Types0, every struct in the family has two member types: | ||||
| // Head for the first type in the list, and Tail for the rest of the | ||||
| // list. | ||||
| 
 | ||||
| // The empty type list. | ||||
| struct Types0 {}; | ||||
| 
 | ||||
| // Type lists of length 1, 2, 3, and so on. | ||||
| 
 | ||||
| template <typename T1> | ||||
| struct Types1 { | ||||
|   typedef T1 Head; | ||||
|   typedef Types0 Tail; | ||||
| }; | ||||
| 
 | ||||
| $range i 2..n | ||||
| 
 | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| $range k 2..i | ||||
| template <$for j, [[typename T$j]]> | ||||
| struct Types$i { | ||||
|   typedef T1 Head; | ||||
|   typedef Types$(i-1)<$for k, [[T$k]]> Tail; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| }  // namespace internal | ||||
| 
 | ||||
| // We don't want to require the users to write TypesN<...> directly, | ||||
| // as that would require them to count the length.  Types<...> is much | ||||
| // easier to write, but generates horrible messages when there is a | ||||
| // compiler error, as gcc insists on printing out each template | ||||
| // argument, even if it has the default value (this means Types<int> | ||||
| // will appear as Types<int, None, None, ..., None> in the compiler | ||||
| // errors). | ||||
| // | ||||
| // Our solution is to combine the best part of the two approaches: a | ||||
| // user would write Types<T1, ..., TN>, and Google Test will translate | ||||
| // that to TypesN<T1, ..., TN> internally to make error messages | ||||
| // readable.  The translation is done by the 'type' member of the | ||||
| // Types template. | ||||
| 
 | ||||
| $range i 1..n | ||||
| template <$for i, [[typename T$i = internal::None]]> | ||||
| struct Types { | ||||
|   typedef internal::Types$n<$for i, [[T$i]]> type; | ||||
| }; | ||||
| 
 | ||||
| template <> | ||||
| struct Types<$for i, [[internal::None]]> { | ||||
|   typedef internal::Types0 type; | ||||
| }; | ||||
| 
 | ||||
| $range i 1..n-1 | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| $range k i+1..n | ||||
| template <$for j, [[typename T$j]]> | ||||
| struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { | ||||
|   typedef internal::Types$i<$for j, [[T$j]]> type; | ||||
| }; | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| namespace internal { | ||||
| 
 | ||||
| # define GTEST_TEMPLATE_ template <typename T> class | ||||
| 
 | ||||
| // The template "selector" struct TemplateSel<Tmpl> is used to | ||||
| // represent Tmpl, which must be a class template with one type | ||||
| // parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined | ||||
| // as the type Tmpl<T>.  This allows us to actually instantiate the | ||||
| // template "selected" by TemplateSel<Tmpl>. | ||||
| // | ||||
| // This trick is necessary for simulating typedef for class templates, | ||||
| // which C++ doesn't support directly. | ||||
| template <GTEST_TEMPLATE_ Tmpl> | ||||
| struct TemplateSel { | ||||
|   template <typename T> | ||||
|   struct Bind { | ||||
|     typedef Tmpl<T> type; | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| # define GTEST_BIND_(TmplSel, T) \ | ||||
|   TmplSel::template Bind<T>::type | ||||
| 
 | ||||
| // A unique struct template used as the default value for the | ||||
| // arguments of class template Templates.  This allows us to simulate | ||||
| // variadic templates (e.g. Templates<int>, Templates<int, double>, | ||||
| // and etc), which C++ doesn't support directly. | ||||
| template <typename T> | ||||
| struct NoneT {}; | ||||
| 
 | ||||
| // The following family of struct and struct templates are used to | ||||
| // represent template lists.  In particular, TemplatesN<T1, T2, ..., | ||||
| // TN> represents a list of N templates (T1, T2, ..., and TN).  Except | ||||
| // for Templates0, every struct in the family has two member types: | ||||
| // Head for the selector of the first template in the list, and Tail | ||||
| // for the rest of the list. | ||||
| 
 | ||||
| // The empty template list. | ||||
| struct Templates0 {}; | ||||
| 
 | ||||
| // Template lists of length 1, 2, 3, and so on. | ||||
| 
 | ||||
| template <GTEST_TEMPLATE_ T1> | ||||
| struct Templates1 { | ||||
|   typedef TemplateSel<T1> Head; | ||||
|   typedef Templates0 Tail; | ||||
| }; | ||||
| 
 | ||||
| $range i 2..n | ||||
| 
 | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| $range k 2..i | ||||
| template <$for j, [[GTEST_TEMPLATE_ T$j]]> | ||||
| struct Templates$i { | ||||
|   typedef TemplateSel<T1> Head; | ||||
|   typedef Templates$(i-1)<$for k, [[T$k]]> Tail; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // We don't want to require the users to write TemplatesN<...> directly, | ||||
| // as that would require them to count the length.  Templates<...> is much | ||||
| // easier to write, but generates horrible messages when there is a | ||||
| // compiler error, as gcc insists on printing out each template | ||||
| // argument, even if it has the default value (this means Templates<list> | ||||
| // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler | ||||
| // errors). | ||||
| // | ||||
| // Our solution is to combine the best part of the two approaches: a | ||||
| // user would write Templates<T1, ..., TN>, and Google Test will translate | ||||
| // that to TemplatesN<T1, ..., TN> internally to make error messages | ||||
| // readable.  The translation is done by the 'type' member of the | ||||
| // Templates template. | ||||
| 
 | ||||
| $range i 1..n | ||||
| template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> | ||||
| struct Templates { | ||||
|   typedef Templates$n<$for i, [[T$i]]> type; | ||||
| }; | ||||
| 
 | ||||
| template <> | ||||
| struct Templates<$for i, [[NoneT]]> { | ||||
|   typedef Templates0 type; | ||||
| }; | ||||
| 
 | ||||
| $range i 1..n-1 | ||||
| $for i [[ | ||||
| $range j 1..i | ||||
| $range k i+1..n | ||||
| template <$for j, [[GTEST_TEMPLATE_ T$j]]> | ||||
| struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { | ||||
|   typedef Templates$i<$for j, [[T$j]]> type; | ||||
| }; | ||||
| 
 | ||||
| ]] | ||||
| 
 | ||||
| // The TypeList template makes it possible to use either a single type | ||||
| // or a Types<...> list in TYPED_TEST_CASE() and | ||||
| // INSTANTIATE_TYPED_TEST_CASE_P(). | ||||
| 
 | ||||
| template <typename T> | ||||
| struct TypeList { | ||||
|   typedef Types1<T> type; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| $range i 1..n | ||||
| template <$for i, [[typename T$i]]> | ||||
| struct TypeList<Types<$for i, [[T$i]]> > { | ||||
|   typedef typename Types<$for i, [[T$i]]>::type type; | ||||
| }; | ||||
| 
 | ||||
| #endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P | ||||
| 
 | ||||
| }  // namespace internal | ||||
| }  // namespace testing | ||||
| 
 | ||||
| #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ | ||||
							
								
								
									
										82
									
								
								lib/gtest/make/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								lib/gtest/make/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,82 @@ | |||
| # A sample Makefile for building Google Test and using it in user
 | ||||
| # tests.  Please tweak it to suit your environment and project.  You
 | ||||
| # may want to move it to your project's root directory.
 | ||||
| #
 | ||||
| # SYNOPSIS:
 | ||||
| #
 | ||||
| #   make [all]  - makes everything.
 | ||||
| #   make TARGET - makes the given target.
 | ||||
| #   make clean  - removes all files generated by make.
 | ||||
| 
 | ||||
| # Please tweak the following variable definitions as needed by your
 | ||||
| # project, except GTEST_HEADERS, which you can use in your own targets
 | ||||
| # but shouldn't modify.
 | ||||
| 
 | ||||
| # Points to the root of Google Test, relative to where this file is.
 | ||||
| # Remember to tweak this if you move this file.
 | ||||
| GTEST_DIR = .. | ||||
| 
 | ||||
| # Where to find user code.
 | ||||
| USER_DIR = ../samples | ||||
| 
 | ||||
| # Flags passed to the preprocessor.
 | ||||
| # Set Google Test's header directory as a system directory, such that
 | ||||
| # the compiler doesn't generate warnings in Google Test headers.
 | ||||
| CPPFLAGS += -isystem $(GTEST_DIR)/include | ||||
| 
 | ||||
| # Flags passed to the C++ compiler.
 | ||||
| CXXFLAGS += -g -Wall -Wextra -pthread | ||||
| 
 | ||||
| # All tests produced by this Makefile.  Remember to add new tests you
 | ||||
| # created to the list.
 | ||||
| TESTS = sample1_unittest | ||||
| 
 | ||||
| # All Google Test headers.  Usually you shouldn't change this
 | ||||
| # definition.
 | ||||
| GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
 | ||||
|                 $(GTEST_DIR)/include/gtest/internal/*.h | ||||
| 
 | ||||
| # House-keeping build targets.
 | ||||
| 
 | ||||
| all : $(TESTS) | ||||
| 
 | ||||
| clean : | ||||
| 	rm -f $(TESTS) gtest.a gtest_main.a *.o | ||||
| 
 | ||||
| # Builds gtest.a and gtest_main.a.
 | ||||
| 
 | ||||
| # Usually you shouldn't tweak such internal variables, indicated by a
 | ||||
| # trailing _.
 | ||||
| GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) | ||||
| 
 | ||||
| # For simplicity and to avoid depending on Google Test's
 | ||||
| # implementation details, the dependencies specified below are
 | ||||
| # conservative and not optimized.  This is fine as Google Test
 | ||||
| # compiles fast and for ordinary users its source rarely changes.
 | ||||
| gtest-all.o : $(GTEST_SRCS_) | ||||
| 	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
 | ||||
|             $(GTEST_DIR)/src/gtest-all.cc | ||||
| 
 | ||||
| gtest_main.o : $(GTEST_SRCS_) | ||||
| 	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
 | ||||
|             $(GTEST_DIR)/src/gtest_main.cc | ||||
| 
 | ||||
| gtest.a : gtest-all.o | ||||
| 	$(AR) $(ARFLAGS) $@ $^ | ||||
| 
 | ||||
| gtest_main.a : gtest-all.o gtest_main.o | ||||
| 	$(AR) $(ARFLAGS) $@ $^ | ||||
| 
 | ||||
| # Builds a sample test.  A test should link with either gtest.a or
 | ||||
| # gtest_main.a, depending on whether it defines its own main()
 | ||||
| # function.
 | ||||
| 
 | ||||
| sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS) | ||||
| 	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc | ||||
| 
 | ||||
| sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \ | ||||
|                      $(USER_DIR)/sample1.h $(GTEST_HEADERS) | ||||
| 	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc | ||||
| 
 | ||||
| sample1_unittest : sample1.o sample1_unittest.o gtest_main.a | ||||
| 	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@ | ||||
							
								
								
									
										25
									
								
								test/SConscript
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/SConscript
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| # SConscript | ||||
| # vim: set ft=python: | ||||
| # | ||||
| # Eryn Wells <eryn@erynwells.me> | ||||
| 
 | ||||
| import os.path | ||||
| 
 | ||||
| Import('env') | ||||
| 
 | ||||
| 
 | ||||
| subdirs = [ | ||||
|     # TODO: Put subdirectories here. | ||||
| ] | ||||
| 
 | ||||
| for d in subdirs: | ||||
|     env.SConscript(os.path.join(d, 'SConscript'), {'env': env}) | ||||
| 
 | ||||
| 
 | ||||
| files = [ | ||||
|     # TODO: Put files here. | ||||
| ] | ||||
| 
 | ||||
| objs = [] | ||||
| for f in files: | ||||
|     objs.append(env.Object(f)) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue