Externalized googletest as a git submodule
This commit is contained in:
parent
818d82607e
commit
e1aceaaf14
170 changed files with 15 additions and 68897 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "src/tests/googletest/sources"]
|
||||||
|
path = src/tests/googletest/sources
|
||||||
|
url = https://github.com/thunderk/googletest.git
|
|
@ -9,6 +9,10 @@ SUBDIRS = \
|
||||||
render/preview \
|
render/preview \
|
||||||
render/opengl \
|
render/opengl \
|
||||||
interface/commandline \
|
interface/commandline \
|
||||||
interface/desktop \
|
interface/desktop
|
||||||
|
|
||||||
|
exists( tests/googletest/sources/src/gtest-all.cc ) {
|
||||||
|
SUBDIRS += \
|
||||||
tests/googletest \
|
tests/googletest \
|
||||||
tests
|
tests
|
||||||
|
}
|
||||||
|
|
|
@ -1,157 +0,0 @@
|
||||||
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
|
|
|
@ -1,252 +0,0 @@
|
||||||
########################################################################
|
|
||||||
# CMake build script for Google Test.
|
|
||||||
#
|
|
||||||
# To run the tests for Google Test itself on Linux, use 'make test' or
|
|
||||||
# ctest. You can select which tests to run using 'ctest -R regex'.
|
|
||||||
# For more options, run 'ctest --help'.
|
|
||||||
|
|
||||||
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
|
|
||||||
# make it prominent in the GUI.
|
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
|
||||||
|
|
||||||
# When other libraries are using a shared version of runtime libraries,
|
|
||||||
# Google Test also has to use one.
|
|
||||||
option(
|
|
||||||
gtest_force_shared_crt
|
|
||||||
"Use shared (DLL) run-time lib even when Google Test is built as static lib."
|
|
||||||
OFF)
|
|
||||||
|
|
||||||
option(gtest_build_tests "Build all of gtest's own tests." OFF)
|
|
||||||
|
|
||||||
option(gtest_build_samples "Build gtest's sample programs." OFF)
|
|
||||||
|
|
||||||
option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
|
|
||||||
|
|
||||||
# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
|
|
||||||
include(cmake/hermetic_build.cmake OPTIONAL)
|
|
||||||
|
|
||||||
if (COMMAND pre_project_set_up_hermetic_build)
|
|
||||||
pre_project_set_up_hermetic_build()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Project-wide settings
|
|
||||||
|
|
||||||
# Name of the project.
|
|
||||||
#
|
|
||||||
# CMake files in this project can refer to the root source directory
|
|
||||||
# as ${gtest_SOURCE_DIR} and to the root binary directory as
|
|
||||||
# ${gtest_BINARY_DIR}.
|
|
||||||
# Language "C" is required for find_package(Threads).
|
|
||||||
project(gtest CXX C)
|
|
||||||
cmake_minimum_required(VERSION 2.6.2)
|
|
||||||
|
|
||||||
if (COMMAND set_up_hermetic_build)
|
|
||||||
set_up_hermetic_build()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Define helper functions and macros used by Google Test.
|
|
||||||
include(cmake/internal_utils.cmake)
|
|
||||||
|
|
||||||
config_compiler_and_linker() # Defined in internal_utils.cmake.
|
|
||||||
|
|
||||||
# Where Google Test's .h files can be found.
|
|
||||||
include_directories(
|
|
||||||
${gtest_SOURCE_DIR}/include
|
|
||||||
${gtest_SOURCE_DIR})
|
|
||||||
|
|
||||||
# Where Google Test's libraries can be found.
|
|
||||||
link_directories(${gtest_BINARY_DIR}/src)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Defines the gtest & gtest_main libraries. User tests should link
|
|
||||||
# with one of them.
|
|
||||||
|
|
||||||
# Google Test libraries. We build them using more strict warnings than what
|
|
||||||
# are used for other targets, to ensure that gtest can be compiled by a user
|
|
||||||
# aggressive about warnings.
|
|
||||||
cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
|
|
||||||
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
|
|
||||||
target_link_libraries(gtest_main gtest)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Samples on how to link user tests with gtest or gtest_main.
|
|
||||||
#
|
|
||||||
# They are not built by default. To build them, set the
|
|
||||||
# gtest_build_samples option to ON. You can do it by running ccmake
|
|
||||||
# or specifying the -Dgtest_build_samples=ON flag when running cmake.
|
|
||||||
|
|
||||||
if (gtest_build_samples)
|
|
||||||
cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
|
|
||||||
cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
|
|
||||||
cxx_executable(sample3_unittest samples gtest_main)
|
|
||||||
cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
|
|
||||||
cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
|
|
||||||
cxx_executable(sample6_unittest samples gtest_main)
|
|
||||||
cxx_executable(sample7_unittest samples gtest_main)
|
|
||||||
cxx_executable(sample8_unittest samples gtest_main)
|
|
||||||
cxx_executable(sample9_unittest samples gtest)
|
|
||||||
cxx_executable(sample10_unittest samples gtest)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Google Test's own tests.
|
|
||||||
#
|
|
||||||
# You can skip this section if you aren't interested in testing
|
|
||||||
# Google Test itself.
|
|
||||||
#
|
|
||||||
# The tests are not built by default. To build them, set the
|
|
||||||
# gtest_build_tests option to ON. You can do it by running ccmake
|
|
||||||
# or specifying the -Dgtest_build_tests=ON flag when running cmake.
|
|
||||||
|
|
||||||
if (gtest_build_tests)
|
|
||||||
# This must be set in the root directory for the tests to be run by
|
|
||||||
# 'make test' or ctest.
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
############################################################
|
|
||||||
# C++ tests built with standard compiler flags.
|
|
||||||
|
|
||||||
cxx_test(gtest-death-test_test gtest_main)
|
|
||||||
cxx_test(gtest_environment_test gtest)
|
|
||||||
cxx_test(gtest-filepath_test gtest_main)
|
|
||||||
cxx_test(gtest-linked_ptr_test gtest_main)
|
|
||||||
cxx_test(gtest-listener_test gtest_main)
|
|
||||||
cxx_test(gtest_main_unittest gtest_main)
|
|
||||||
cxx_test(gtest-message_test gtest_main)
|
|
||||||
cxx_test(gtest_no_test_unittest gtest)
|
|
||||||
cxx_test(gtest-options_test gtest_main)
|
|
||||||
cxx_test(gtest-param-test_test gtest
|
|
||||||
test/gtest-param-test2_test.cc)
|
|
||||||
cxx_test(gtest-port_test gtest_main)
|
|
||||||
cxx_test(gtest_pred_impl_unittest gtest_main)
|
|
||||||
cxx_test(gtest_premature_exit_test gtest
|
|
||||||
test/gtest_premature_exit_test.cc)
|
|
||||||
cxx_test(gtest-printers_test gtest_main)
|
|
||||||
cxx_test(gtest_prod_test gtest_main
|
|
||||||
test/production.cc)
|
|
||||||
cxx_test(gtest_repeat_test gtest)
|
|
||||||
cxx_test(gtest_sole_header_test gtest_main)
|
|
||||||
cxx_test(gtest_stress_test gtest)
|
|
||||||
cxx_test(gtest-test-part_test gtest_main)
|
|
||||||
cxx_test(gtest_throw_on_failure_ex_test gtest)
|
|
||||||
cxx_test(gtest-typed-test_test gtest_main
|
|
||||||
test/gtest-typed-test2_test.cc)
|
|
||||||
cxx_test(gtest_unittest gtest_main)
|
|
||||||
cxx_test(gtest-unittest-api_test gtest)
|
|
||||||
|
|
||||||
############################################################
|
|
||||||
# C++ tests built with non-standard compiler flags.
|
|
||||||
|
|
||||||
# MSVC 7.1 does not support STL with exceptions disabled.
|
|
||||||
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
|
||||||
cxx_library(gtest_no_exception "${cxx_no_exception}"
|
|
||||||
src/gtest-all.cc)
|
|
||||||
cxx_library(gtest_main_no_exception "${cxx_no_exception}"
|
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
|
||||||
endif()
|
|
||||||
cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
|
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
|
||||||
|
|
||||||
cxx_test_with_flags(gtest-death-test_ex_nocatch_test
|
|
||||||
"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
|
|
||||||
gtest test/gtest-death-test_ex_test.cc)
|
|
||||||
cxx_test_with_flags(gtest-death-test_ex_catch_test
|
|
||||||
"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
|
|
||||||
gtest test/gtest-death-test_ex_test.cc)
|
|
||||||
|
|
||||||
cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
|
|
||||||
gtest_main_no_rtti test/gtest_unittest.cc)
|
|
||||||
|
|
||||||
cxx_shared_library(gtest_dll "${cxx_default}"
|
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
|
||||||
|
|
||||||
cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
|
|
||||||
gtest_dll test/gtest_all_test.cc)
|
|
||||||
set_target_properties(gtest_dll_test_
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
|
|
||||||
|
|
||||||
if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
|
|
||||||
# The C++ Standard specifies tuple_element<int, class>.
|
|
||||||
# Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
|
|
||||||
# That declaration conflicts with our own standard-conforming
|
|
||||||
# tuple implementation. Therefore using our own tuple with
|
|
||||||
# MSVC 10 doesn't compile.
|
|
||||||
cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
|
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
|
||||||
|
|
||||||
cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
|
|
||||||
gtest_main_use_own_tuple test/gtest-tuple_test.cc)
|
|
||||||
|
|
||||||
cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
|
|
||||||
gtest_main_use_own_tuple
|
|
||||||
test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
############################################################
|
|
||||||
# Python tests.
|
|
||||||
|
|
||||||
cxx_executable(gtest_break_on_failure_unittest_ test gtest)
|
|
||||||
py_test(gtest_break_on_failure_unittest)
|
|
||||||
|
|
||||||
# MSVC 7.1 does not support STL with exceptions disabled.
|
|
||||||
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
|
||||||
cxx_executable_with_flags(
|
|
||||||
gtest_catch_exceptions_no_ex_test_
|
|
||||||
"${cxx_no_exception}"
|
|
||||||
gtest_main_no_exception
|
|
||||||
test/gtest_catch_exceptions_test_.cc)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
cxx_executable_with_flags(
|
|
||||||
gtest_catch_exceptions_ex_test_
|
|
||||||
"${cxx_exception}"
|
|
||||||
gtest_main
|
|
||||||
test/gtest_catch_exceptions_test_.cc)
|
|
||||||
py_test(gtest_catch_exceptions_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_color_test_ test gtest)
|
|
||||||
py_test(gtest_color_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_env_var_test_ test gtest)
|
|
||||||
py_test(gtest_env_var_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_filter_unittest_ test gtest)
|
|
||||||
py_test(gtest_filter_unittest)
|
|
||||||
|
|
||||||
cxx_executable(gtest_help_test_ test gtest_main)
|
|
||||||
py_test(gtest_help_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_list_tests_unittest_ test gtest)
|
|
||||||
py_test(gtest_list_tests_unittest)
|
|
||||||
|
|
||||||
cxx_executable(gtest_output_test_ test gtest)
|
|
||||||
py_test(gtest_output_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_shuffle_test_ test gtest)
|
|
||||||
py_test(gtest_shuffle_test)
|
|
||||||
|
|
||||||
# MSVC 7.1 does not support STL with exceptions disabled.
|
|
||||||
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
|
||||||
cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
|
|
||||||
set_target_properties(gtest_throw_on_failure_test_
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_FLAGS "${cxx_no_exception}")
|
|
||||||
py_test(gtest_throw_on_failure_test)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
cxx_executable(gtest_uninitialized_test_ test gtest)
|
|
||||||
py_test(gtest_uninitialized_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
|
|
||||||
cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
|
|
||||||
py_test(gtest_xml_outfiles_test)
|
|
||||||
|
|
||||||
cxx_executable(gtest_xml_output_unittest_ test gtest)
|
|
||||||
py_test(gtest_xml_output_unittest)
|
|
||||||
endif()
|
|
|
@ -1,37 +0,0 @@
|
||||||
# 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>
|
|
|
@ -1,28 +0,0 @@
|
||||||
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.
|
|
|
@ -1,306 +0,0 @@
|
||||||
# Automake file
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
|
|
||||||
# Nonstandard package files for distribution
|
|
||||||
EXTRA_DIST = \
|
|
||||||
CHANGES \
|
|
||||||
CONTRIBUTORS \
|
|
||||||
LICENSE \
|
|
||||||
include/gtest/gtest-param-test.h.pump \
|
|
||||||
include/gtest/internal/gtest-param-util-generated.h.pump \
|
|
||||||
include/gtest/internal/gtest-tuple.h.pump \
|
|
||||||
include/gtest/internal/gtest-type-util.h.pump \
|
|
||||||
make/Makefile \
|
|
||||||
scripts/fuse_gtest_files.py \
|
|
||||||
scripts/gen_gtest_pred_impl.py \
|
|
||||||
scripts/pump.py \
|
|
||||||
scripts/test/Makefile
|
|
||||||
|
|
||||||
# gtest source files that we don't compile directly. They are
|
|
||||||
# #included by gtest-all.cc.
|
|
||||||
GTEST_SRC = \
|
|
||||||
src/gtest-death-test.cc \
|
|
||||||
src/gtest-filepath.cc \
|
|
||||||
src/gtest-internal-inl.h \
|
|
||||||
src/gtest-port.cc \
|
|
||||||
src/gtest-printers.cc \
|
|
||||||
src/gtest-test-part.cc \
|
|
||||||
src/gtest-typed-test.cc \
|
|
||||||
src/gtest.cc
|
|
||||||
|
|
||||||
EXTRA_DIST += $(GTEST_SRC)
|
|
||||||
|
|
||||||
# Sample files that we don't compile.
|
|
||||||
EXTRA_DIST += \
|
|
||||||
samples/prime_tables.h \
|
|
||||||
samples/sample2_unittest.cc \
|
|
||||||
samples/sample3_unittest.cc \
|
|
||||||
samples/sample4_unittest.cc \
|
|
||||||
samples/sample5_unittest.cc \
|
|
||||||
samples/sample6_unittest.cc \
|
|
||||||
samples/sample7_unittest.cc \
|
|
||||||
samples/sample8_unittest.cc \
|
|
||||||
samples/sample9_unittest.cc
|
|
||||||
|
|
||||||
# C++ test files that we don't compile directly.
|
|
||||||
EXTRA_DIST += \
|
|
||||||
test/gtest-death-test_ex_test.cc \
|
|
||||||
test/gtest-death-test_test.cc \
|
|
||||||
test/gtest-filepath_test.cc \
|
|
||||||
test/gtest-linked_ptr_test.cc \
|
|
||||||
test/gtest-listener_test.cc \
|
|
||||||
test/gtest-message_test.cc \
|
|
||||||
test/gtest-options_test.cc \
|
|
||||||
test/gtest-param-test2_test.cc \
|
|
||||||
test/gtest-param-test2_test.cc \
|
|
||||||
test/gtest-param-test_test.cc \
|
|
||||||
test/gtest-param-test_test.cc \
|
|
||||||
test/gtest-param-test_test.h \
|
|
||||||
test/gtest-port_test.cc \
|
|
||||||
test/gtest_premature_exit_test.cc \
|
|
||||||
test/gtest-printers_test.cc \
|
|
||||||
test/gtest-test-part_test.cc \
|
|
||||||
test/gtest-tuple_test.cc \
|
|
||||||
test/gtest-typed-test2_test.cc \
|
|
||||||
test/gtest-typed-test_test.cc \
|
|
||||||
test/gtest-typed-test_test.h \
|
|
||||||
test/gtest-unittest-api_test.cc \
|
|
||||||
test/gtest_break_on_failure_unittest_.cc \
|
|
||||||
test/gtest_catch_exceptions_test_.cc \
|
|
||||||
test/gtest_color_test_.cc \
|
|
||||||
test/gtest_env_var_test_.cc \
|
|
||||||
test/gtest_environment_test.cc \
|
|
||||||
test/gtest_filter_unittest_.cc \
|
|
||||||
test/gtest_help_test_.cc \
|
|
||||||
test/gtest_list_tests_unittest_.cc \
|
|
||||||
test/gtest_main_unittest.cc \
|
|
||||||
test/gtest_no_test_unittest.cc \
|
|
||||||
test/gtest_output_test_.cc \
|
|
||||||
test/gtest_pred_impl_unittest.cc \
|
|
||||||
test/gtest_prod_test.cc \
|
|
||||||
test/gtest_repeat_test.cc \
|
|
||||||
test/gtest_shuffle_test_.cc \
|
|
||||||
test/gtest_sole_header_test.cc \
|
|
||||||
test/gtest_stress_test.cc \
|
|
||||||
test/gtest_throw_on_failure_ex_test.cc \
|
|
||||||
test/gtest_throw_on_failure_test_.cc \
|
|
||||||
test/gtest_uninitialized_test_.cc \
|
|
||||||
test/gtest_unittest.cc \
|
|
||||||
test/gtest_unittest.cc \
|
|
||||||
test/gtest_xml_outfile1_test_.cc \
|
|
||||||
test/gtest_xml_outfile2_test_.cc \
|
|
||||||
test/gtest_xml_output_unittest_.cc \
|
|
||||||
test/production.cc \
|
|
||||||
test/production.h
|
|
||||||
|
|
||||||
# Python tests that we don't run.
|
|
||||||
EXTRA_DIST += \
|
|
||||||
test/gtest_break_on_failure_unittest.py \
|
|
||||||
test/gtest_catch_exceptions_test.py \
|
|
||||||
test/gtest_color_test.py \
|
|
||||||
test/gtest_env_var_test.py \
|
|
||||||
test/gtest_filter_unittest.py \
|
|
||||||
test/gtest_help_test.py \
|
|
||||||
test/gtest_list_tests_unittest.py \
|
|
||||||
test/gtest_output_test.py \
|
|
||||||
test/gtest_output_test_golden_lin.txt \
|
|
||||||
test/gtest_shuffle_test.py \
|
|
||||||
test/gtest_test_utils.py \
|
|
||||||
test/gtest_throw_on_failure_test.py \
|
|
||||||
test/gtest_uninitialized_test.py \
|
|
||||||
test/gtest_xml_outfiles_test.py \
|
|
||||||
test/gtest_xml_output_unittest.py \
|
|
||||||
test/gtest_xml_test_utils.py
|
|
||||||
|
|
||||||
# CMake script
|
|
||||||
EXTRA_DIST += \
|
|
||||||
CMakeLists.txt \
|
|
||||||
cmake/internal_utils.cmake
|
|
||||||
|
|
||||||
# MSVC project files
|
|
||||||
EXTRA_DIST += \
|
|
||||||
msvc/gtest-md.sln \
|
|
||||||
msvc/gtest-md.vcproj \
|
|
||||||
msvc/gtest.sln \
|
|
||||||
msvc/gtest.vcproj \
|
|
||||||
msvc/gtest_main-md.vcproj \
|
|
||||||
msvc/gtest_main.vcproj \
|
|
||||||
msvc/gtest_prod_test-md.vcproj \
|
|
||||||
msvc/gtest_prod_test.vcproj \
|
|
||||||
msvc/gtest_unittest-md.vcproj \
|
|
||||||
msvc/gtest_unittest.vcproj
|
|
||||||
|
|
||||||
# xcode project files
|
|
||||||
EXTRA_DIST += \
|
|
||||||
xcode/Config/DebugProject.xcconfig \
|
|
||||||
xcode/Config/FrameworkTarget.xcconfig \
|
|
||||||
xcode/Config/General.xcconfig \
|
|
||||||
xcode/Config/ReleaseProject.xcconfig \
|
|
||||||
xcode/Config/StaticLibraryTarget.xcconfig \
|
|
||||||
xcode/Config/TestTarget.xcconfig \
|
|
||||||
xcode/Resources/Info.plist \
|
|
||||||
xcode/Scripts/runtests.sh \
|
|
||||||
xcode/Scripts/versiongenerate.py \
|
|
||||||
xcode/gtest.xcodeproj/project.pbxproj
|
|
||||||
|
|
||||||
# xcode sample files
|
|
||||||
EXTRA_DIST += \
|
|
||||||
xcode/Samples/FrameworkSample/Info.plist \
|
|
||||||
xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
|
|
||||||
xcode/Samples/FrameworkSample/runtests.sh \
|
|
||||||
xcode/Samples/FrameworkSample/widget.cc \
|
|
||||||
xcode/Samples/FrameworkSample/widget.h \
|
|
||||||
xcode/Samples/FrameworkSample/widget_test.cc
|
|
||||||
|
|
||||||
# C++Builder project files
|
|
||||||
EXTRA_DIST += \
|
|
||||||
codegear/gtest.cbproj \
|
|
||||||
codegear/gtest.groupproj \
|
|
||||||
codegear/gtest_all.cc \
|
|
||||||
codegear/gtest_link.cc \
|
|
||||||
codegear/gtest_main.cbproj \
|
|
||||||
codegear/gtest_unittest.cbproj
|
|
||||||
|
|
||||||
# Distribute and install M4 macro
|
|
||||||
m4datadir = $(datadir)/aclocal
|
|
||||||
m4data_DATA = m4/gtest.m4
|
|
||||||
EXTRA_DIST += $(m4data_DATA)
|
|
||||||
|
|
||||||
# We define the global AM_CPPFLAGS as everything we compile includes from these
|
|
||||||
# directories.
|
|
||||||
AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
|
|
||||||
|
|
||||||
# Modifies compiler and linker flags for pthreads compatibility.
|
|
||||||
if HAVE_PTHREADS
|
|
||||||
AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
|
|
||||||
AM_LIBS = @PTHREAD_LIBS@
|
|
||||||
else
|
|
||||||
AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Build rules for libraries.
|
|
||||||
lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
|
|
||||||
|
|
||||||
lib_libgtest_la_SOURCES = src/gtest-all.cc
|
|
||||||
|
|
||||||
pkginclude_HEADERS = \
|
|
||||||
include/gtest/gtest-death-test.h \
|
|
||||||
include/gtest/gtest-message.h \
|
|
||||||
include/gtest/gtest-param-test.h \
|
|
||||||
include/gtest/gtest-printers.h \
|
|
||||||
include/gtest/gtest-spi.h \
|
|
||||||
include/gtest/gtest-test-part.h \
|
|
||||||
include/gtest/gtest-typed-test.h \
|
|
||||||
include/gtest/gtest.h \
|
|
||||||
include/gtest/gtest_pred_impl.h \
|
|
||||||
include/gtest/gtest_prod.h
|
|
||||||
|
|
||||||
pkginclude_internaldir = $(pkgincludedir)/internal
|
|
||||||
pkginclude_internal_HEADERS = \
|
|
||||||
include/gtest/internal/gtest-death-test-internal.h \
|
|
||||||
include/gtest/internal/gtest-filepath.h \
|
|
||||||
include/gtest/internal/gtest-internal.h \
|
|
||||||
include/gtest/internal/gtest-linked_ptr.h \
|
|
||||||
include/gtest/internal/gtest-param-util-generated.h \
|
|
||||||
include/gtest/internal/gtest-param-util.h \
|
|
||||||
include/gtest/internal/gtest-port.h \
|
|
||||||
include/gtest/internal/gtest-string.h \
|
|
||||||
include/gtest/internal/gtest-tuple.h \
|
|
||||||
include/gtest/internal/gtest-type-util.h
|
|
||||||
|
|
||||||
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
|
|
||||||
lib_libgtest_main_la_LIBADD = lib/libgtest.la
|
|
||||||
|
|
||||||
# Bulid rules for samples and tests. Automake's naming for some of
|
|
||||||
# these variables isn't terribly obvious, so this is a brief
|
|
||||||
# reference:
|
|
||||||
#
|
|
||||||
# TESTS -- Programs run automatically by "make check"
|
|
||||||
# check_PROGRAMS -- Programs built by "make check" but not necessarily run
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = samples/libsamples.la
|
|
||||||
|
|
||||||
samples_libsamples_la_SOURCES = \
|
|
||||||
samples/sample1.cc \
|
|
||||||
samples/sample1.h \
|
|
||||||
samples/sample2.cc \
|
|
||||||
samples/sample2.h \
|
|
||||||
samples/sample3-inl.h \
|
|
||||||
samples/sample4.cc \
|
|
||||||
samples/sample4.h
|
|
||||||
|
|
||||||
TESTS=
|
|
||||||
TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
|
|
||||||
GTEST_BUILD_DIR="$(top_builddir)/test"
|
|
||||||
check_PROGRAMS=
|
|
||||||
|
|
||||||
# A simple sample on using gtest.
|
|
||||||
TESTS += samples/sample1_unittest
|
|
||||||
check_PROGRAMS += samples/sample1_unittest
|
|
||||||
samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
|
|
||||||
samples_sample1_unittest_LDADD = lib/libgtest_main.la \
|
|
||||||
lib/libgtest.la \
|
|
||||||
samples/libsamples.la
|
|
||||||
|
|
||||||
# Another sample. It also verifies that libgtest works.
|
|
||||||
TESTS += samples/sample10_unittest
|
|
||||||
check_PROGRAMS += samples/sample10_unittest
|
|
||||||
samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
|
|
||||||
samples_sample10_unittest_LDADD = lib/libgtest.la
|
|
||||||
|
|
||||||
# This tests most constructs of gtest and verifies that libgtest_main
|
|
||||||
# and libgtest work.
|
|
||||||
TESTS += test/gtest_all_test
|
|
||||||
check_PROGRAMS += test/gtest_all_test
|
|
||||||
test_gtest_all_test_SOURCES = test/gtest_all_test.cc
|
|
||||||
test_gtest_all_test_LDADD = lib/libgtest_main.la \
|
|
||||||
lib/libgtest.la
|
|
||||||
|
|
||||||
# Tests that fused gtest files compile and work.
|
|
||||||
FUSED_GTEST_SRC = \
|
|
||||||
fused-src/gtest/gtest-all.cc \
|
|
||||||
fused-src/gtest/gtest.h \
|
|
||||||
fused-src/gtest/gtest_main.cc
|
|
||||||
|
|
||||||
if HAVE_PYTHON
|
|
||||||
TESTS += test/fused_gtest_test
|
|
||||||
check_PROGRAMS += test/fused_gtest_test
|
|
||||||
test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
|
|
||||||
samples/sample1.cc samples/sample1_unittest.cc
|
|
||||||
test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
|
|
||||||
|
|
||||||
# Build rules for putting fused Google Test files into the distribution
|
|
||||||
# package. The user can also create those files by manually running
|
|
||||||
# scripts/fuse_gtest_files.py.
|
|
||||||
$(test_fused_gtest_test_SOURCES): fused-gtest
|
|
||||||
|
|
||||||
fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
|
|
||||||
$(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
|
|
||||||
scripts/fuse_gtest_files.py
|
|
||||||
mkdir -p "$(srcdir)/fused-src"
|
|
||||||
chmod -R u+w "$(srcdir)/fused-src"
|
|
||||||
rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
|
|
||||||
rm -f "$(srcdir)/fused-src/gtest/gtest.h"
|
|
||||||
"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
|
|
||||||
cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
|
|
||||||
|
|
||||||
maintainer-clean-local:
|
|
||||||
rm -rf "$(srcdir)/fused-src"
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Death tests may produce core dumps in the build directory. In case
|
|
||||||
# this happens, clean them to keep distcleancheck happy.
|
|
||||||
CLEANFILES = core
|
|
||||||
|
|
||||||
# Disables 'make install' as installing a compiled version of Google
|
|
||||||
# Test can lead to undefined behavior due to violation of the
|
|
||||||
# One-Definition Rule.
|
|
||||||
|
|
||||||
install-exec-local:
|
|
||||||
echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
|
|
||||||
false
|
|
||||||
|
|
||||||
install-data-local:
|
|
||||||
echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
|
|
||||||
false
|
|
|
@ -1,435 +0,0 @@
|
||||||
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!
|
|
|
@ -1,227 +0,0 @@
|
||||||
# Defines functions and macros useful for building Google Test and
|
|
||||||
# Google Mock.
|
|
||||||
#
|
|
||||||
# Note:
|
|
||||||
#
|
|
||||||
# - This file will be run twice when building Google Mock (once via
|
|
||||||
# Google Test's CMakeLists.txt, and once via Google Mock's).
|
|
||||||
# Therefore it shouldn't have any side effects other than defining
|
|
||||||
# the functions and macros.
|
|
||||||
#
|
|
||||||
# - The functions/macros defined in this file may depend on Google
|
|
||||||
# Test and Google Mock's option() definitions, and thus must be
|
|
||||||
# called *after* the options have been defined.
|
|
||||||
|
|
||||||
# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
|
|
||||||
#
|
|
||||||
# This must be a macro(), as inside a function string() can only
|
|
||||||
# update variables in the function scope.
|
|
||||||
macro(fix_default_compiler_settings_)
|
|
||||||
if (MSVC)
|
|
||||||
# For MSVC, CMake sets certain flags to defaults we want to override.
|
|
||||||
# This replacement code is taken from sample in the CMake Wiki at
|
|
||||||
# http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
|
|
||||||
foreach (flag_var
|
|
||||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
||||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
||||||
if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
|
|
||||||
# When Google Test is built as a shared library, it should also use
|
|
||||||
# shared runtime libraries. Otherwise, it may end up with multiple
|
|
||||||
# copies of runtime library data in different modules, resulting in
|
|
||||||
# hard-to-find crashes. When it is built as a static library, it is
|
|
||||||
# preferable to use CRT as static libraries, as we don't have to rely
|
|
||||||
# on CRT DLLs being available. CMake always defaults to using shared
|
|
||||||
# CRT libraries, so we override that default here.
|
|
||||||
string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# We prefer more strict warning checking for building Google Test.
|
|
||||||
# Replaces /W3 with /W4 in defaults.
|
|
||||||
string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
# Defines the compiler/linker flags used to build Google Test and
|
|
||||||
# Google Mock. You can tweak these definitions to suit your need. A
|
|
||||||
# variable's value is empty before it's explicitly assigned to.
|
|
||||||
macro(config_compiler_and_linker)
|
|
||||||
if (NOT gtest_disable_pthreads)
|
|
||||||
# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
|
|
||||||
find_package(Threads)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
fix_default_compiler_settings_()
|
|
||||||
if (MSVC)
|
|
||||||
# Newlines inside flags variables break CMake's NMake generator.
|
|
||||||
# TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.
|
|
||||||
set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
|
|
||||||
if (MSVC_VERSION LESS 1400)
|
|
||||||
# Suppress spurious warnings MSVC 7.1 sometimes issues.
|
|
||||||
# Forcing value to bool.
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -wd4800")
|
|
||||||
# Copy constructor and assignment operator could not be generated.
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
|
|
||||||
# Compatibility warnings not applicable to Google Test.
|
|
||||||
# Resolved overload was found by argument-dependent lookup.
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -wd4675")
|
|
||||||
endif()
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
|
|
||||||
set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
|
|
||||||
set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
|
|
||||||
set(cxx_no_rtti_flags "-GR-")
|
|
||||||
elseif (CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
set(cxx_base_flags "-Wall -Wshadow")
|
|
||||||
set(cxx_exception_flags "-fexceptions")
|
|
||||||
set(cxx_no_exception_flags "-fno-exceptions")
|
|
||||||
# Until version 4.3.2, GCC doesn't define a macro to indicate
|
|
||||||
# whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI
|
|
||||||
# explicitly.
|
|
||||||
set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
|
|
||||||
set(cxx_strict_flags
|
|
||||||
"-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
|
|
||||||
set(cxx_exception_flags "-features=except")
|
|
||||||
# Sun Pro doesn't provide macros to indicate whether exceptions and
|
|
||||||
# RTTI are enabled, so we define GTEST_HAS_* explicitly.
|
|
||||||
set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
|
|
||||||
set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
|
|
||||||
CMAKE_CXX_COMPILER_ID STREQUAL "XL")
|
|
||||||
# CMake 2.8 changes Visual Age's compiler ID to "XL".
|
|
||||||
set(cxx_exception_flags "-qeh")
|
|
||||||
set(cxx_no_exception_flags "-qnoeh")
|
|
||||||
# Until version 9.0, Visual Age doesn't define a macro to indicate
|
|
||||||
# whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI
|
|
||||||
# explicitly.
|
|
||||||
set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
|
|
||||||
set(cxx_base_flags "-AA -mt")
|
|
||||||
set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
|
|
||||||
set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
|
|
||||||
# RTTI can not be disabled in HP aCC compiler.
|
|
||||||
set(cxx_no_rtti_flags "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_USE_PTHREADS_INIT) # The pthreads library is available and allowed.
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
|
|
||||||
else()
|
|
||||||
set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# For building gtest's own tests and samples.
|
|
||||||
set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
|
|
||||||
set(cxx_no_exception
|
|
||||||
"${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
|
|
||||||
set(cxx_default "${cxx_exception}")
|
|
||||||
set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
|
|
||||||
set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
|
|
||||||
|
|
||||||
# For building the gtest libraries.
|
|
||||||
set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
# Defines the gtest & gtest_main libraries. User tests should link
|
|
||||||
# with one of them.
|
|
||||||
function(cxx_library_with_type name type cxx_flags)
|
|
||||||
# type can be either STATIC or SHARED to denote a static or shared library.
|
|
||||||
# ARGN refers to additional arguments after 'cxx_flags'.
|
|
||||||
add_library(${name} ${type} ${ARGN})
|
|
||||||
set_target_properties(${name}
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_FLAGS "${cxx_flags}")
|
|
||||||
if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
|
|
||||||
set_target_properties(${name}
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
|
|
||||||
endif()
|
|
||||||
if (CMAKE_USE_PTHREADS_INIT)
|
|
||||||
target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
#
|
|
||||||
# Helper functions for creating build targets.
|
|
||||||
|
|
||||||
function(cxx_shared_library name cxx_flags)
|
|
||||||
cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(cxx_library name cxx_flags)
|
|
||||||
cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# cxx_executable_with_flags(name cxx_flags libs srcs...)
|
|
||||||
#
|
|
||||||
# creates a named C++ executable that depends on the given libraries and
|
|
||||||
# is built from the given source files with the given compiler flags.
|
|
||||||
function(cxx_executable_with_flags name cxx_flags libs)
|
|
||||||
add_executable(${name} ${ARGN})
|
|
||||||
if (cxx_flags)
|
|
||||||
set_target_properties(${name}
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_FLAGS "${cxx_flags}")
|
|
||||||
endif()
|
|
||||||
if (BUILD_SHARED_LIBS)
|
|
||||||
set_target_properties(${name}
|
|
||||||
PROPERTIES
|
|
||||||
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
|
|
||||||
endif()
|
|
||||||
# To support mixing linking in static and dynamic libraries, link each
|
|
||||||
# library in with an extra call to target_link_libraries.
|
|
||||||
foreach (lib "${libs}")
|
|
||||||
target_link_libraries(${name} ${lib})
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# cxx_executable(name dir lib srcs...)
|
|
||||||
#
|
|
||||||
# creates a named target that depends on the given libs and is built
|
|
||||||
# from the given source files. dir/name.cc is implicitly included in
|
|
||||||
# the source file list.
|
|
||||||
function(cxx_executable name dir libs)
|
|
||||||
cxx_executable_with_flags(
|
|
||||||
${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
|
|
||||||
find_package(PythonInterp)
|
|
||||||
|
|
||||||
# cxx_test_with_flags(name cxx_flags libs srcs...)
|
|
||||||
#
|
|
||||||
# creates a named C++ test that depends on the given libs and is built
|
|
||||||
# from the given source files with the given compiler flags.
|
|
||||||
function(cxx_test_with_flags name cxx_flags libs)
|
|
||||||
cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
|
|
||||||
add_test(${name} ${name})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# cxx_test(name libs srcs...)
|
|
||||||
#
|
|
||||||
# creates a named test target that depends on the given libs and is
|
|
||||||
# built from the given source files. Unlike cxx_test_with_flags,
|
|
||||||
# test/name.cc is already implicitly included in the source file list.
|
|
||||||
function(cxx_test name libs)
|
|
||||||
cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
|
|
||||||
"test/${name}.cc" ${ARGN})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# py_test(name)
|
|
||||||
#
|
|
||||||
# creates a Python test with the given name whose main module is in
|
|
||||||
# test/name.py. It does nothing if Python is not installed.
|
|
||||||
function(py_test name)
|
|
||||||
# We are not supporting Python tests on Linux yet as they consider
|
|
||||||
# all Linux environments to be google3 and try to use google3 features.
|
|
||||||
if (PYTHONINTERP_FOUND)
|
|
||||||
# ${CMAKE_BINARY_DIR} is known at configuration time, so we can
|
|
||||||
# directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
|
|
||||||
# only at ctest runtime (by calling ctest -c <Configuration>), so
|
|
||||||
# we have to escape $ to delay variable substitution here.
|
|
||||||
add_test(${name}
|
|
||||||
${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
|
||||||
--build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
|
@ -1,138 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
|
|
||||||
<Config Condition="'$(Config)'==''">Release</Config>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_1>true</Cfg_1>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_2>true</Cfg_2>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Base)'!=''">
|
|
||||||
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
|
||||||
<OutputExt>lib</OutputExt>
|
|
||||||
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
|
||||||
<Defines>NO_STRICT</Defines>
|
|
||||||
<DynamicRTL>true</DynamicRTL>
|
|
||||||
<UsePackages>true</UsePackages>
|
|
||||||
<ProjectType>CppStaticLibrary</ProjectType>
|
|
||||||
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
|
||||||
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
|
|
||||||
<BCC_wpar>false</BCC_wpar>
|
|
||||||
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
|
|
||||||
<AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
|
|
||||||
<TLIB_PageSize>32</TLIB_PageSize>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
|
||||||
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
|
||||||
<DCC_Optimize>false</DCC_Optimize>
|
|
||||||
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
|
||||||
<Defines>_DEBUG;$(Defines)</Defines>
|
|
||||||
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
|
||||||
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
|
||||||
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
|
||||||
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
|
||||||
<DCC_Define>DEBUG</DCC_Define>
|
|
||||||
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
|
||||||
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
|
||||||
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
|
||||||
<BCC_StackFrames>true</BCC_StackFrames>
|
|
||||||
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>Full</TASM_Debugging>
|
|
||||||
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
|
||||||
<Defines>NDEBUG;$(Defines)</Defines>
|
|
||||||
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>None</TASM_Debugging>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ProjectExtensions>
|
|
||||||
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
|
||||||
<Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
|
|
||||||
<BorlandProject>
|
|
||||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
|
||||||
|
|
||||||
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
|
||||||
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
|
||||||
</ProjectExtensions>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="..\include\gtest\gtest-death-test.h">
|
|
||||||
<BuildOrder>3</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest-message.h">
|
|
||||||
<BuildOrder>4</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest-param-test.h">
|
|
||||||
<BuildOrder>5</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest-spi.h">
|
|
||||||
<BuildOrder>6</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest-test-part.h">
|
|
||||||
<BuildOrder>7</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest-typed-test.h">
|
|
||||||
<BuildOrder>8</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest.h">
|
|
||||||
<BuildOrder>0</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest_pred_impl.h">
|
|
||||||
<BuildOrder>1</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\gtest_prod.h">
|
|
||||||
<BuildOrder>2</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-death-test-internal.h">
|
|
||||||
<BuildOrder>9</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-filepath.h">
|
|
||||||
<BuildOrder>10</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-internal.h">
|
|
||||||
<BuildOrder>11</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-linked_ptr.h">
|
|
||||||
<BuildOrder>12</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-param-util-generated.h">
|
|
||||||
<BuildOrder>14</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-param-util.h">
|
|
||||||
<BuildOrder>13</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-port.h">
|
|
||||||
<BuildOrder>15</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-string.h">
|
|
||||||
<BuildOrder>16</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<None Include="..\include\gtest\internal\gtest-type-util.h">
|
|
||||||
<BuildOrder>17</BuildOrder>
|
|
||||||
</None>
|
|
||||||
<CppCompile Include="gtest_all.cc">
|
|
||||||
<BuildOrder>18</BuildOrder>
|
|
||||||
</CppCompile>
|
|
||||||
<BuildConfiguration Include="Debug">
|
|
||||||
<Key>Cfg_1</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
<BuildConfiguration Include="Release">
|
|
||||||
<Key>Cfg_2</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,54 +0,0 @@
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<ItemGroup>
|
|
||||||
<Projects Include="gtest.cbproj" />
|
|
||||||
<Projects Include="gtest_main.cbproj" />
|
|
||||||
<Projects Include="gtest_unittest.cbproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ProjectExtensions>
|
|
||||||
<Borland.Personality>Default.Personality</Borland.Personality>
|
|
||||||
<Borland.ProjectType />
|
|
||||||
<BorlandProject>
|
|
||||||
<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
|
|
||||||
</ProjectExtensions>
|
|
||||||
<Target Name="gtest">
|
|
||||||
<MSBuild Projects="gtest.cbproj" Targets="" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest:Clean">
|
|
||||||
<MSBuild Projects="gtest.cbproj" Targets="Clean" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest:Make">
|
|
||||||
<MSBuild Projects="gtest.cbproj" Targets="Make" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_main">
|
|
||||||
<MSBuild Projects="gtest_main.cbproj" Targets="" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_main:Clean">
|
|
||||||
<MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_main:Make">
|
|
||||||
<MSBuild Projects="gtest_main.cbproj" Targets="Make" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_unittest">
|
|
||||||
<MSBuild Projects="gtest_unittest.cbproj" Targets="" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_unittest:Clean">
|
|
||||||
<MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="gtest_unittest:Make">
|
|
||||||
<MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="Build">
|
|
||||||
<CallTarget Targets="gtest;gtest_main;gtest_unittest" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="Clean">
|
|
||||||
<CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="Make">
|
|
||||||
<CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
|
|
||||||
</Target>
|
|
||||||
<Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
|
|
||||||
</Project>
|
|
|
@ -1,38 +0,0 @@
|
||||||
// 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: Josh Kelley (joshkel@gmail.com)
|
|
||||||
//
|
|
||||||
// Google C++ Testing Framework (Google Test)
|
|
||||||
//
|
|
||||||
// C++Builder's IDE cannot build a static library from files with hyphens
|
|
||||||
// in their name. See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
|
|
||||||
// This file serves as a workaround.
|
|
||||||
|
|
||||||
#include "src/gtest-all.cc"
|
|
|
@ -1,40 +0,0 @@
|
||||||
// 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: Josh Kelley (joshkel@gmail.com)
|
|
||||||
//
|
|
||||||
// Google C++ Testing Framework (Google Test)
|
|
||||||
//
|
|
||||||
// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
|
|
||||||
// This means that these libraries can't be renamed, but it's the only way to
|
|
||||||
// ensure that Debug versus Release test builds are linked against the
|
|
||||||
// appropriate Debug or Release build of the libraries.
|
|
||||||
|
|
||||||
#pragma link "gtest.lib"
|
|
||||||
#pragma link "gtest_main.lib"
|
|
|
@ -1,82 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
|
|
||||||
<Config Condition="'$(Config)'==''">Release</Config>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_1>true</Cfg_1>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_2>true</Cfg_2>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Base)'!=''">
|
|
||||||
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
|
||||||
<OutputExt>lib</OutputExt>
|
|
||||||
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
|
||||||
<Defines>NO_STRICT</Defines>
|
|
||||||
<DynamicRTL>true</DynamicRTL>
|
|
||||||
<UsePackages>true</UsePackages>
|
|
||||||
<ProjectType>CppStaticLibrary</ProjectType>
|
|
||||||
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
|
||||||
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
|
|
||||||
<BCC_wpar>false</BCC_wpar>
|
|
||||||
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
|
|
||||||
<AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
|
|
||||||
<TLIB_PageSize>32</TLIB_PageSize>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
|
||||||
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
|
||||||
<DCC_Optimize>false</DCC_Optimize>
|
|
||||||
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
|
||||||
<Defines>_DEBUG;$(Defines)</Defines>
|
|
||||||
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
|
||||||
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
|
||||||
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
|
||||||
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
|
||||||
<DCC_Define>DEBUG</DCC_Define>
|
|
||||||
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
|
||||||
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
|
||||||
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
|
||||||
<BCC_StackFrames>true</BCC_StackFrames>
|
|
||||||
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>Full</TASM_Debugging>
|
|
||||||
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
|
||||||
<Defines>NDEBUG;$(Defines)</Defines>
|
|
||||||
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>None</TASM_Debugging>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ProjectExtensions>
|
|
||||||
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
|
||||||
<Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
|
|
||||||
<BorlandProject>
|
|
||||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
|
||||||
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
|
||||||
</ProjectExtensions>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
|
||||||
<ItemGroup>
|
|
||||||
<CppCompile Include="..\src\gtest_main.cc">
|
|
||||||
<BuildOrder>0</BuildOrder>
|
|
||||||
</CppCompile>
|
|
||||||
<BuildConfiguration Include="Debug">
|
|
||||||
<Key>Cfg_1</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
<BuildConfiguration Include="Release">
|
|
||||||
<Key>Cfg_2</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,88 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
|
|
||||||
<Config Condition="'$(Config)'==''">Release</Config>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_1>true</Cfg_1>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
|
||||||
<Base>true</Base>
|
|
||||||
<Cfg_2>true</Cfg_2>
|
|
||||||
<CfgParent>Base</CfgParent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Base)'!=''">
|
|
||||||
<OutputExt>exe</OutputExt>
|
|
||||||
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
|
||||||
<Defines>NO_STRICT</Defines>
|
|
||||||
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
|
||||||
<DynamicRTL>true</DynamicRTL>
|
|
||||||
<ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
|
|
||||||
<UsePackages>true</UsePackages>
|
|
||||||
<ProjectType>CppConsoleApplication</ProjectType>
|
|
||||||
<NoVCL>true</NoVCL>
|
|
||||||
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
|
||||||
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi</PackageImports>
|
|
||||||
<BCC_wpar>false</BCC_wpar>
|
|
||||||
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
|
|
||||||
<Multithreaded>true</Multithreaded>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
|
||||||
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
|
||||||
<DCC_Optimize>false</DCC_Optimize>
|
|
||||||
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
|
||||||
<Defines>_DEBUG;$(Defines)</Defines>
|
|
||||||
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
|
||||||
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
|
||||||
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
|
||||||
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
|
||||||
<DCC_Define>DEBUG</DCC_Define>
|
|
||||||
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
|
||||||
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
|
||||||
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
|
||||||
<BCC_StackFrames>true</BCC_StackFrames>
|
|
||||||
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>Full</TASM_Debugging>
|
|
||||||
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
|
||||||
<Defines>NDEBUG;$(Defines)</Defines>
|
|
||||||
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
|
||||||
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
|
||||||
<TASM_Debugging>None</TASM_Debugging>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ProjectExtensions>
|
|
||||||
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
|
||||||
<Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
|
|
||||||
<BorlandProject>
|
|
||||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
|
||||||
|
|
||||||
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
|
||||||
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
|
||||||
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item1">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item2">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;$(OUTPUTDIR);..\test</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">2</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item1">STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
|
||||||
</ProjectExtensions>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
|
||||||
<ItemGroup>
|
|
||||||
<CppCompile Include="..\test\gtest_unittest.cc">
|
|
||||||
<BuildOrder>0</BuildOrder>
|
|
||||||
</CppCompile>
|
|
||||||
<CppCompile Include="gtest_link.cc">
|
|
||||||
<BuildOrder>1</BuildOrder>
|
|
||||||
</CppCompile>
|
|
||||||
<BuildConfiguration Include="Debug">
|
|
||||||
<Key>Cfg_1</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
<BuildConfiguration Include="Release">
|
|
||||||
<Key>Cfg_2</Key>
|
|
||||||
</BuildConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,68 +0,0 @@
|
||||||
m4_include(m4/acx_pthread.m4)
|
|
||||||
|
|
||||||
# At this point, the Xcode project assumes the version string will be three
|
|
||||||
# integers separated by periods and surrounded by square brackets (e.g.
|
|
||||||
# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
|
|
||||||
# between "AC_INIT(" and the closing ")" including comments and strings.
|
|
||||||
AC_INIT([Google C++ Testing Framework],
|
|
||||||
[1.7.0],
|
|
||||||
[googletestframework@googlegroups.com],
|
|
||||||
[gtest])
|
|
||||||
|
|
||||||
# Provide various options to initialize the Autoconf and configure processes.
|
|
||||||
AC_PREREQ([2.59])
|
|
||||||
AC_CONFIG_SRCDIR([./LICENSE])
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
|
||||||
AC_CONFIG_HEADERS([build-aux/config.h])
|
|
||||||
AC_CONFIG_FILES([Makefile])
|
|
||||||
AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
|
|
||||||
|
|
||||||
# Initialize Automake with various options. We require at least v1.9, prevent
|
|
||||||
# pedantic complaints about package files, and enable various distribution
|
|
||||||
# targets.
|
|
||||||
AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
|
|
||||||
|
|
||||||
# Check for programs used in building Google Test.
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CXX
|
|
||||||
AC_LANG([C++])
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
|
|
||||||
# TODO(chandlerc@google.com): Currently we aren't running the Python tests
|
|
||||||
# against the interpreter detected by AM_PATH_PYTHON, and so we condition
|
|
||||||
# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
|
|
||||||
# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
|
|
||||||
# hashbang.
|
|
||||||
PYTHON= # We *do not* allow the user to specify a python interpreter
|
|
||||||
AC_PATH_PROG([PYTHON],[python],[:])
|
|
||||||
AS_IF([test "$PYTHON" != ":"],
|
|
||||||
[AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
|
|
||||||
AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
|
|
||||||
|
|
||||||
# Configure pthreads.
|
|
||||||
AC_ARG_WITH([pthreads],
|
|
||||||
[AS_HELP_STRING([--with-pthreads],
|
|
||||||
[use pthreads (default is yes)])],
|
|
||||||
[with_pthreads=$withval],
|
|
||||||
[with_pthreads=check])
|
|
||||||
|
|
||||||
have_pthreads=no
|
|
||||||
AS_IF([test "x$with_pthreads" != "xno"],
|
|
||||||
[ACX_PTHREAD(
|
|
||||||
[],
|
|
||||||
[AS_IF([test "x$with_pthreads" != "xcheck"],
|
|
||||||
[AC_MSG_FAILURE(
|
|
||||||
[--with-pthreads was specified, but unable to be used])])])
|
|
||||||
have_pthreads="$acx_pthread_ok"])
|
|
||||||
AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" = "xyes"])
|
|
||||||
AC_SUBST(PTHREAD_CFLAGS)
|
|
||||||
AC_SUBST(PTHREAD_LIBS)
|
|
||||||
|
|
||||||
# TODO(chandlerc@google.com) Check for the necessary system headers.
|
|
||||||
|
|
||||||
# TODO(chandlerc@google.com) Check the types, structures, and other compiler
|
|
||||||
# and architecture characteristics.
|
|
||||||
|
|
||||||
# Output the generated files. No further autoconf macros may be used.
|
|
||||||
AC_OUTPUT
|
|
|
@ -13,10 +13,10 @@ DEFINES += GOOGLETEST_LIBRARY
|
||||||
|
|
||||||
QMAKE_CXXFLAGS += -pthread -Wno-missing-field-initializers
|
QMAKE_CXXFLAGS += -pthread -Wno-missing-field-initializers
|
||||||
|
|
||||||
INCLUDEPATH += . ./include
|
INCLUDEPATH += ./sources ./sources/include
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/gtest-all.cc
|
sources/src/gtest-all.cc
|
||||||
|
|
||||||
HEADERS +=
|
HEADERS +=
|
||||||
|
|
||||||
|
|
|
@ -1,294 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,250 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,487 +0,0 @@
|
||||||
$$ -*- 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_
|
|
|
@ -1,855 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,232 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,179 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,259 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,358 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,58 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,319 +0,0 @@
|
||||||
// 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_
|
|
|
@ -1,206 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,233 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,301 +0,0 @@
|
||||||
$$ -*- 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_
|
|
|
@ -1,619 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,167 +0,0 @@
|
||||||
// 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,339 +0,0 @@
|
||||||
$$ -*- 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_
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,297 +0,0 @@
|
||||||
$$ -*- 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_
|
|
|
@ -1,363 +0,0 @@
|
||||||
# This was retrieved from
|
|
||||||
# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
|
|
||||||
# See also (perhaps for new versions?)
|
|
||||||
# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
|
|
||||||
#
|
|
||||||
# We've rewritten the inconsistency check code (from avahi), to work
|
|
||||||
# more broadly. In particular, it no longer assumes ld accepts -zdefs.
|
|
||||||
# This caused a restructing of the code, but the functionality has only
|
|
||||||
# changed a little.
|
|
||||||
|
|
||||||
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
|
||||||
dnl
|
|
||||||
dnl @summary figure out how to build C programs using POSIX threads
|
|
||||||
dnl
|
|
||||||
dnl This macro figures out how to build C programs using POSIX threads.
|
|
||||||
dnl It sets the PTHREAD_LIBS output variable to the threads library and
|
|
||||||
dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
|
|
||||||
dnl C compiler flags that are needed. (The user can also force certain
|
|
||||||
dnl compiler flags/libs to be tested by setting these environment
|
|
||||||
dnl variables.)
|
|
||||||
dnl
|
|
||||||
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
|
|
||||||
dnl multi-threaded programs (defaults to the value of CC otherwise).
|
|
||||||
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
|
|
||||||
dnl
|
|
||||||
dnl NOTE: You are assumed to not only compile your program with these
|
|
||||||
dnl flags, but also link it with them as well. e.g. you should link
|
|
||||||
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
|
||||||
dnl $LIBS
|
|
||||||
dnl
|
|
||||||
dnl If you are only building threads programs, you may wish to use
|
|
||||||
dnl these variables in your default LIBS, CFLAGS, and CC:
|
|
||||||
dnl
|
|
||||||
dnl LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
dnl CC="$PTHREAD_CC"
|
|
||||||
dnl
|
|
||||||
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
|
||||||
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
|
||||||
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
|
||||||
dnl
|
|
||||||
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
|
|
||||||
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
|
||||||
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
|
||||||
dnl default action will define HAVE_PTHREAD.
|
|
||||||
dnl
|
|
||||||
dnl Please let the authors know if this macro fails on any platform, or
|
|
||||||
dnl if you have any other suggestions or comments. This macro was based
|
|
||||||
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
|
|
||||||
dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
|
|
||||||
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
|
|
||||||
dnl We are also grateful for the helpful feedback of numerous users.
|
|
||||||
dnl
|
|
||||||
dnl @category InstalledPackages
|
|
||||||
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
|
|
||||||
dnl @version 2006-05-29
|
|
||||||
dnl @license GPLWithACException
|
|
||||||
dnl
|
|
||||||
dnl Checks for GCC shared/pthread inconsistency based on work by
|
|
||||||
dnl Marcin Owsiany <marcin@owsiany.pl>
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([ACX_PTHREAD], [
|
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
|
||||||
AC_LANG_SAVE
|
|
||||||
AC_LANG_C
|
|
||||||
acx_pthread_ok=no
|
|
||||||
|
|
||||||
# We used to check for pthread.h first, but this fails if pthread.h
|
|
||||||
# requires special compiler flags (e.g. on True64 or Sequent).
|
|
||||||
# It gets checked for in the link test anyway.
|
|
||||||
|
|
||||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
|
||||||
# etcetera environment variables, and if threads linking works using
|
|
||||||
# them:
|
|
||||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
|
||||||
AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
|
|
||||||
AC_MSG_RESULT($acx_pthread_ok)
|
|
||||||
if test x"$acx_pthread_ok" = xno; then
|
|
||||||
PTHREAD_LIBS=""
|
|
||||||
PTHREAD_CFLAGS=""
|
|
||||||
fi
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We must check for the threads library under a number of different
|
|
||||||
# names; the ordering is very important because some systems
|
|
||||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
|
||||||
# libraries is broken (non-POSIX).
|
|
||||||
|
|
||||||
# Create a list of thread flags to try. Items starting with a "-" are
|
|
||||||
# C compiler flags, and other items are library names, except for "none"
|
|
||||||
# which indicates that we try without any flags at all, and "pthread-config"
|
|
||||||
# which is a program returning the flags for the Pth emulation library.
|
|
||||||
|
|
||||||
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
|
||||||
|
|
||||||
# The ordering *is* (sometimes) important. Some notes on the
|
|
||||||
# individual items follow:
|
|
||||||
|
|
||||||
# pthreads: AIX (must check this before -lpthread)
|
|
||||||
# none: in case threads are in libc; should be tried before -Kthread and
|
|
||||||
# other compiler flags to prevent continual compiler warnings
|
|
||||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
|
||||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
|
||||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
|
||||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
|
||||||
# -pthreads: Solaris/gcc
|
|
||||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
|
||||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
|
||||||
# doesn't hurt to check since this sometimes defines pthreads too;
|
|
||||||
# also defines -D_REENTRANT)
|
|
||||||
# ... -mt is also the pthreads flag for HP/aCC
|
|
||||||
# pthread: Linux, etcetera
|
|
||||||
# --thread-safe: KAI C++
|
|
||||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
|
||||||
|
|
||||||
case "${host_cpu}-${host_os}" in
|
|
||||||
*solaris*)
|
|
||||||
|
|
||||||
# On Solaris (at least, for some versions), libc contains stubbed
|
|
||||||
# (non-functional) versions of the pthreads routines, so link-based
|
|
||||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
|
||||||
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
|
||||||
# a function called by this macro, so we could check for that, but
|
|
||||||
# who knows whether they'll stub that too in a future libc.) So,
|
|
||||||
# we'll just look for -pthreads and -lpthread first:
|
|
||||||
|
|
||||||
acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test x"$acx_pthread_ok" = xno; then
|
|
||||||
for flag in $acx_pthread_flags; do
|
|
||||||
|
|
||||||
case $flag in
|
|
||||||
none)
|
|
||||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
AC_MSG_CHECKING([whether pthreads work with $flag])
|
|
||||||
PTHREAD_CFLAGS="$flag"
|
|
||||||
;;
|
|
||||||
|
|
||||||
pthread-config)
|
|
||||||
AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
|
|
||||||
if test x"$acx_pthread_config" = xno; then continue; fi
|
|
||||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
|
||||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
|
||||||
PTHREAD_LIBS="-l$flag"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
|
|
||||||
# Check for various functions. We must include pthread.h,
|
|
||||||
# since some functions may be macros. (On the Sequent, we
|
|
||||||
# need a special flag -Kthread to make this header compile.)
|
|
||||||
# We check for pthread_join because it is in -lpthread on IRIX
|
|
||||||
# while pthread_create is in libc. We check for pthread_attr_init
|
|
||||||
# due to DEC craziness with -lpthreads. We check for
|
|
||||||
# pthread_cleanup_push because it is one of the few pthread
|
|
||||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
|
||||||
# We try pthread_create on general principles.
|
|
||||||
AC_TRY_LINK([#include <pthread.h>],
|
|
||||||
[pthread_t th; pthread_join(th, 0);
|
|
||||||
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
|
||||||
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
|
||||||
[acx_pthread_ok=yes])
|
|
||||||
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
|
|
||||||
AC_MSG_RESULT($acx_pthread_ok)
|
|
||||||
if test "x$acx_pthread_ok" = xyes; then
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
|
|
||||||
PTHREAD_LIBS=""
|
|
||||||
PTHREAD_CFLAGS=""
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Various other checks:
|
|
||||||
if test "x$acx_pthread_ok" = xyes; then
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
|
|
||||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
|
||||||
AC_MSG_CHECKING([for joinable pthread attribute])
|
|
||||||
attr_name=unknown
|
|
||||||
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
|
||||||
AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
|
|
||||||
[attr_name=$attr; break])
|
|
||||||
done
|
|
||||||
AC_MSG_RESULT($attr_name)
|
|
||||||
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
|
||||||
AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
|
|
||||||
[Define to necessary symbol if this constant
|
|
||||||
uses a non-standard name on your system.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
|
||||||
flag=no
|
|
||||||
case "${host_cpu}-${host_os}" in
|
|
||||||
*-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
|
|
||||||
*solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
|
|
||||||
esac
|
|
||||||
AC_MSG_RESULT(${flag})
|
|
||||||
if test "x$flag" != xno; then
|
|
||||||
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
# More AIX lossage: must compile with xlc_r or cc_r
|
|
||||||
if test x"$GCC" != xyes; then
|
|
||||||
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
|
|
||||||
else
|
|
||||||
PTHREAD_CC=$CC
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The next part tries to detect GCC inconsistency with -shared on some
|
|
||||||
# architectures and systems. The problem is that in certain
|
|
||||||
# configurations, when -shared is specified, GCC "forgets" to
|
|
||||||
# internally use various flags which are still necessary.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Prepare the flags
|
|
||||||
#
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
save_CC="$CC"
|
|
||||||
|
|
||||||
# Try with the flags determined by the earlier checks.
|
|
||||||
#
|
|
||||||
# -Wl,-z,defs forces link-time symbol resolution, so that the
|
|
||||||
# linking checks with -shared actually have any value
|
|
||||||
#
|
|
||||||
# FIXME: -fPIC is required for -shared on many architectures,
|
|
||||||
# so we specify it here, but the right way would probably be to
|
|
||||||
# properly detect whether it is actually required.
|
|
||||||
CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
CC="$PTHREAD_CC"
|
|
||||||
|
|
||||||
# In order not to create several levels of indentation, we test
|
|
||||||
# the value of "$done" until we find the cure or run out of ideas.
|
|
||||||
done="no"
|
|
||||||
|
|
||||||
# First, make sure the CFLAGS we added are actually accepted by our
|
|
||||||
# compiler. If not (and OS X's ld, for instance, does not accept -z),
|
|
||||||
# then we can't do this test.
|
|
||||||
if test x"$done" = xno; then
|
|
||||||
AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
|
|
||||||
AC_TRY_LINK(,, , [done=yes])
|
|
||||||
|
|
||||||
if test "x$done" = xyes ; then
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x"$done" = xno; then
|
|
||||||
AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
|
|
||||||
AC_TRY_LINK([#include <pthread.h>],
|
|
||||||
[pthread_t th; pthread_join(th, 0);
|
|
||||||
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
|
||||||
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
|
||||||
[done=yes])
|
|
||||||
|
|
||||||
if test "x$done" = xyes; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Linux gcc on some architectures such as mips/mipsel forgets
|
|
||||||
# about -lpthread
|
|
||||||
#
|
|
||||||
if test x"$done" = xno; then
|
|
||||||
AC_MSG_CHECKING([whether -lpthread fixes that])
|
|
||||||
LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
|
|
||||||
AC_TRY_LINK([#include <pthread.h>],
|
|
||||||
[pthread_t th; pthread_join(th, 0);
|
|
||||||
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
|
||||||
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
|
||||||
[done=yes])
|
|
||||||
|
|
||||||
if test "x$done" = xyes; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
#
|
|
||||||
# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
|
|
||||||
#
|
|
||||||
if test x"$done" = xno; then
|
|
||||||
AC_MSG_CHECKING([whether -lc_r fixes that])
|
|
||||||
LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
|
|
||||||
AC_TRY_LINK([#include <pthread.h>],
|
|
||||||
[pthread_t th; pthread_join(th, 0);
|
|
||||||
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
|
||||||
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
|
||||||
[done=yes])
|
|
||||||
|
|
||||||
if test "x$done" = xyes; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test x"$done" = xno; then
|
|
||||||
# OK, we have run out of ideas
|
|
||||||
AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
|
|
||||||
|
|
||||||
# so it's not safe to assume that we may use pthreads
|
|
||||||
acx_pthread_ok=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
CC="$save_CC"
|
|
||||||
else
|
|
||||||
PTHREAD_CC="$CC"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(PTHREAD_LIBS)
|
|
||||||
AC_SUBST(PTHREAD_CFLAGS)
|
|
||||||
AC_SUBST(PTHREAD_CC)
|
|
||||||
|
|
||||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
|
||||||
if test x"$acx_pthread_ok" = xyes; then
|
|
||||||
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
|
|
||||||
:
|
|
||||||
else
|
|
||||||
acx_pthread_ok=no
|
|
||||||
$2
|
|
||||||
fi
|
|
||||||
AC_LANG_RESTORE
|
|
||||||
])dnl ACX_PTHREAD
|
|
|
@ -1,74 +0,0 @@
|
||||||
dnl GTEST_LIB_CHECK([minimum version [,
|
|
||||||
dnl action if found [,action if not found]]])
|
|
||||||
dnl
|
|
||||||
dnl Check for the presence of the Google Test library, optionally at a minimum
|
|
||||||
dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
|
|
||||||
dnl standard variables for substitution including GTEST_CPPFLAGS,
|
|
||||||
dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
|
|
||||||
dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
|
|
||||||
dnl optional custom action slots in the event GTEST is found or not.
|
|
||||||
AC_DEFUN([GTEST_LIB_CHECK],
|
|
||||||
[
|
|
||||||
dnl Provide a flag to enable or disable Google Test usage.
|
|
||||||
AC_ARG_ENABLE([gtest],
|
|
||||||
[AS_HELP_STRING([--enable-gtest],
|
|
||||||
[Enable tests using the Google C++ Testing Framework.
|
|
||||||
(Default is enabled.)])],
|
|
||||||
[],
|
|
||||||
[enable_gtest=])
|
|
||||||
AC_ARG_VAR([GTEST_CONFIG],
|
|
||||||
[The exact path of Google Test's 'gtest-config' script.])
|
|
||||||
AC_ARG_VAR([GTEST_CPPFLAGS],
|
|
||||||
[C-like preprocessor flags for Google Test.])
|
|
||||||
AC_ARG_VAR([GTEST_CXXFLAGS],
|
|
||||||
[C++ compile flags for Google Test.])
|
|
||||||
AC_ARG_VAR([GTEST_LDFLAGS],
|
|
||||||
[Linker path and option flags for Google Test.])
|
|
||||||
AC_ARG_VAR([GTEST_LIBS],
|
|
||||||
[Library linking flags for Google Test.])
|
|
||||||
AC_ARG_VAR([GTEST_VERSION],
|
|
||||||
[The version of Google Test available.])
|
|
||||||
HAVE_GTEST="no"
|
|
||||||
AS_IF([test "x${enable_gtest}" != "xno"],
|
|
||||||
[AC_MSG_CHECKING([for 'gtest-config'])
|
|
||||||
AS_IF([test "x${enable_gtest}" != "xyes"],
|
|
||||||
[AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
|
|
||||||
[GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
|
|
||||||
[GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
|
|
||||||
AS_IF([test -x "${GTEST_CONFIG}"], [],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_ERROR([dnl
|
|
||||||
Unable to locate either a built or installed Google Test.
|
|
||||||
The specific location '${enable_gtest}' was provided for a built or installed
|
|
||||||
Google Test, but no 'gtest-config' script could be found at this location.])
|
|
||||||
])],
|
|
||||||
[AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
|
|
||||||
AS_IF([test -x "${GTEST_CONFIG}"],
|
|
||||||
[AC_MSG_RESULT([${GTEST_CONFIG}])
|
|
||||||
m4_ifval([$1],
|
|
||||||
[_gtest_min_version="--min-version=$1"
|
|
||||||
AC_MSG_CHECKING([for Google Test at least version >= $1])],
|
|
||||||
[_gtest_min_version="--min-version=0"
|
|
||||||
AC_MSG_CHECKING([for Google Test])])
|
|
||||||
AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
HAVE_GTEST='yes'],
|
|
||||||
[AC_MSG_RESULT([no])])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
AS_IF([test "x${HAVE_GTEST}" = "xyes"],
|
|
||||||
[GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
|
|
||||||
GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
|
|
||||||
GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
|
|
||||||
GTEST_LIBS=`${GTEST_CONFIG} --libs`
|
|
||||||
GTEST_VERSION=`${GTEST_CONFIG} --version`
|
|
||||||
AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
|
|
||||||
[AS_IF([test "x${enable_gtest}" = "xyes"],
|
|
||||||
[AC_MSG_ERROR([dnl
|
|
||||||
Google Test was enabled, but no viable version could be found.])
|
|
||||||
])])])
|
|
||||||
AC_SUBST([HAVE_GTEST])
|
|
||||||
AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
|
|
||||||
AS_IF([test "x$HAVE_GTEST" = "xyes"],
|
|
||||||
[m4_ifval([$2], [$2])],
|
|
||||||
[m4_ifval([$3], [$3])])
|
|
||||||
])
|
|
|
@ -1,82 +0,0 @@
|
||||||
# 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 $@
|
|
|
@ -1,45 +0,0 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "gtest-md.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main-md", "gtest_main-md.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862033}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test-md", "gtest_prod_test-md.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest-md", "gtest_unittest-md.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
|
||||||
Debug = Debug
|
|
||||||
Release = Release
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,126 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest-md"
|
|
||||||
ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath="">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/gtestd.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath=""..\include";".."">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/gtest.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\gtest-all.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,45 +0,0 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
|
||||||
Debug = Debug
|
|
||||||
Release = Release
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32
|
|
||||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32
|
|
||||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32
|
|
||||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32
|
|
||||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,126 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest"
|
|
||||||
ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath="">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/gtestd.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath=""..\include";".."">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/gtest.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\gtest-all.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,129 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_main-md"
|
|
||||||
ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath="">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath=""..\include";".."">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/$(ProjectName).lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
|
|
||||||
Name="gtest-md"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\gtest_main.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,129 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_main"
|
|
||||||
ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath="">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
ReferencesPath=""..\include";".."">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/$(ProjectName).lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
|
||||||
Name="gtest"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\gtest_main.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,164 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_prod_test-md"
|
|
||||||
ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
|
|
||||||
Name="gtest_main-md"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\gtest_prod_test.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\production.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\production.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,164 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_prod_test"
|
|
||||||
ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
|
||||||
Name="gtest_main"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\gtest_prod_test.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\production.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\production.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,147 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_unittest-md"
|
|
||||||
ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
|
|
||||||
Name="gtest_main-md"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\gtest_unittest.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="1"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
BasicRuntimeChecks="0"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,147 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="gtest_unittest"
|
|
||||||
ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionName)/$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(OutDir)/$(ProjectName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="FALSE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
|
||||||
Name="gtest_main"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath="..\test\gtest_unittest.cc">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="1"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
BasicRuntimeChecks="0"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..";"..\include""
|
|
||||||
UsePrecompiledHeader="0"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,123 +0,0 @@
|
||||||
// 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)
|
|
||||||
// Author: vladl@google.com (Vlad Losev)
|
|
||||||
|
|
||||||
// This provides interface PrimeTable that determines whether a number is a
|
|
||||||
// prime and determines a next prime number. This interface is used
|
|
||||||
// in Google Test samples demonstrating use of parameterized tests.
|
|
||||||
|
|
||||||
#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
|
|
||||||
#define GTEST_SAMPLES_PRIME_TABLES_H_
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
// The prime table interface.
|
|
||||||
class PrimeTable {
|
|
||||||
public:
|
|
||||||
virtual ~PrimeTable() {}
|
|
||||||
|
|
||||||
// Returns true iff n is a prime number.
|
|
||||||
virtual bool IsPrime(int n) const = 0;
|
|
||||||
|
|
||||||
// Returns the smallest prime number greater than p; or returns -1
|
|
||||||
// if the next prime is beyond the capacity of the table.
|
|
||||||
virtual int GetNextPrime(int p) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Implementation #1 calculates the primes on-the-fly.
|
|
||||||
class OnTheFlyPrimeTable : public PrimeTable {
|
|
||||||
public:
|
|
||||||
virtual bool IsPrime(int n) const {
|
|
||||||
if (n <= 1) return false;
|
|
||||||
|
|
||||||
for (int i = 2; i*i <= n; i++) {
|
|
||||||
// n is divisible by an integer other than 1 and itself.
|
|
||||||
if ((n % i) == 0) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int GetNextPrime(int p) const {
|
|
||||||
for (int n = p + 1; n > 0; n++) {
|
|
||||||
if (IsPrime(n)) return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Implementation #2 pre-calculates the primes and stores the result
|
|
||||||
// in an array.
|
|
||||||
class PreCalculatedPrimeTable : public PrimeTable {
|
|
||||||
public:
|
|
||||||
// 'max' specifies the maximum number the prime table holds.
|
|
||||||
explicit PreCalculatedPrimeTable(int max)
|
|
||||||
: is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
|
|
||||||
CalculatePrimesUpTo(max);
|
|
||||||
}
|
|
||||||
virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
|
|
||||||
|
|
||||||
virtual bool IsPrime(int n) const {
|
|
||||||
return 0 <= n && n < is_prime_size_ && is_prime_[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int GetNextPrime(int p) const {
|
|
||||||
for (int n = p + 1; n < is_prime_size_; n++) {
|
|
||||||
if (is_prime_[n]) return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void CalculatePrimesUpTo(int max) {
|
|
||||||
::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
|
|
||||||
is_prime_[0] = is_prime_[1] = false;
|
|
||||||
|
|
||||||
for (int i = 2; i <= max; i++) {
|
|
||||||
if (!is_prime_[i]) continue;
|
|
||||||
|
|
||||||
// Marks all multiples of i (except i itself) as non-prime.
|
|
||||||
for (int j = 2*i; j <= max; j += i) {
|
|
||||||
is_prime_[j] = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const int is_prime_size_;
|
|
||||||
bool* const is_prime_;
|
|
||||||
|
|
||||||
// Disables compiler warning "assignment operator could not be generated."
|
|
||||||
void operator=(const PreCalculatedPrimeTable& rhs);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GTEST_SAMPLES_PRIME_TABLES_H_
|
|
|
@ -1,68 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#include "sample1.h"
|
|
||||||
|
|
||||||
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
|
|
||||||
int Factorial(int n) {
|
|
||||||
int result = 1;
|
|
||||||
for (int i = 1; i <= n; i++) {
|
|
||||||
result *= i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true iff n is a prime number.
|
|
||||||
bool IsPrime(int n) {
|
|
||||||
// Trivial case 1: small numbers
|
|
||||||
if (n <= 1) return false;
|
|
||||||
|
|
||||||
// Trivial case 2: even numbers
|
|
||||||
if (n % 2 == 0) return n == 2;
|
|
||||||
|
|
||||||
// Now, we have that n is odd and n >= 3.
|
|
||||||
|
|
||||||
// Try to divide n by every odd number i, starting from 3
|
|
||||||
for (int i = 3; ; i += 2) {
|
|
||||||
// We only have to try i up to the squre root of n
|
|
||||||
if (i > n/i) break;
|
|
||||||
|
|
||||||
// Now, we have i <= n/i < n.
|
|
||||||
// If n is divisible by i, n is not prime.
|
|
||||||
if (n % i == 0) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// n has no integer factor in the range (1, n), and thus is prime.
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#ifndef GTEST_SAMPLES_SAMPLE1_H_
|
|
||||||
#define GTEST_SAMPLES_SAMPLE1_H_
|
|
||||||
|
|
||||||
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
|
|
||||||
int Factorial(int n);
|
|
||||||
|
|
||||||
// Returns true iff n is a prime number.
|
|
||||||
bool IsPrime(int n);
|
|
||||||
|
|
||||||
#endif // GTEST_SAMPLES_SAMPLE1_H_
|
|
|
@ -1,144 +0,0 @@
|
||||||
// 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: vladl@google.com (Vlad Losev)
|
|
||||||
|
|
||||||
// This sample shows how to use Google Test listener API to implement
|
|
||||||
// a primitive leak checker.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
using ::testing::EmptyTestEventListener;
|
|
||||||
using ::testing::InitGoogleTest;
|
|
||||||
using ::testing::Test;
|
|
||||||
using ::testing::TestCase;
|
|
||||||
using ::testing::TestEventListeners;
|
|
||||||
using ::testing::TestInfo;
|
|
||||||
using ::testing::TestPartResult;
|
|
||||||
using ::testing::UnitTest;
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// We will track memory used by this class.
|
|
||||||
class Water {
|
|
||||||
public:
|
|
||||||
// Normal Water declarations go here.
|
|
||||||
|
|
||||||
// operator new and operator delete help us control water allocation.
|
|
||||||
void* operator new(size_t allocation_size) {
|
|
||||||
allocated_++;
|
|
||||||
return malloc(allocation_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator delete(void* block, size_t /* allocation_size */) {
|
|
||||||
allocated_--;
|
|
||||||
free(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int allocated() { return allocated_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static int allocated_;
|
|
||||||
};
|
|
||||||
|
|
||||||
int Water::allocated_ = 0;
|
|
||||||
|
|
||||||
// This event listener monitors how many Water objects are created and
|
|
||||||
// destroyed by each test, and reports a failure if a test leaks some Water
|
|
||||||
// objects. It does this by comparing the number of live Water objects at
|
|
||||||
// the beginning of a test and at the end of a test.
|
|
||||||
class LeakChecker : public EmptyTestEventListener {
|
|
||||||
private:
|
|
||||||
// Called before a test starts.
|
|
||||||
virtual void OnTestStart(const TestInfo& /* test_info */) {
|
|
||||||
initially_allocated_ = Water::allocated();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called after a test ends.
|
|
||||||
virtual void OnTestEnd(const TestInfo& /* test_info */) {
|
|
||||||
int difference = Water::allocated() - initially_allocated_;
|
|
||||||
|
|
||||||
// You can generate a failure in any event handler except
|
|
||||||
// OnTestPartResult. Just use an appropriate Google Test assertion to do
|
|
||||||
// it.
|
|
||||||
EXPECT_LE(difference, 0) << "Leaked " << difference << " unit(s) of Water!";
|
|
||||||
}
|
|
||||||
|
|
||||||
int initially_allocated_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(ListenersTest, DoesNotLeak) {
|
|
||||||
Water* water = new Water;
|
|
||||||
delete water;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This should fail when the --check_for_leaks command line flag is
|
|
||||||
// specified.
|
|
||||||
TEST(ListenersTest, LeaksWater) {
|
|
||||||
Water* water = new Water;
|
|
||||||
EXPECT_TRUE(water != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
bool check_for_leaks = false;
|
|
||||||
if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
|
|
||||||
check_for_leaks = true;
|
|
||||||
else
|
|
||||||
printf("%s\n", "Run this program with --check_for_leaks to enable "
|
|
||||||
"custom leak checking in the tests.");
|
|
||||||
|
|
||||||
// If we are given the --check_for_leaks command line flag, installs the
|
|
||||||
// leak checker.
|
|
||||||
if (check_for_leaks) {
|
|
||||||
TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
|
|
||||||
|
|
||||||
// Adds the leak checker to the end of the test event listener list,
|
|
||||||
// after the default text output printer and the default XML report
|
|
||||||
// generator.
|
|
||||||
//
|
|
||||||
// The order is important - it ensures that failures generated in the
|
|
||||||
// leak checker's OnTestEnd() method are processed by the text and XML
|
|
||||||
// printers *before* their OnTestEnd() methods are called, such that
|
|
||||||
// they are attributed to the right test. Remember that a listener
|
|
||||||
// receives an OnXyzStart event *after* listeners preceding it in the
|
|
||||||
// list received that event, and receives an OnXyzEnd event *before*
|
|
||||||
// listeners preceding it.
|
|
||||||
//
|
|
||||||
// We don't need to worry about deleting the new listener later, as
|
|
||||||
// Google Test will do it.
|
|
||||||
listeners.Append(new LeakChecker);
|
|
||||||
}
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
|
@ -1,153 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
|
|
||||||
// This sample shows how to write a simple unit test for a function,
|
|
||||||
// using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
|
|
||||||
|
|
||||||
|
|
||||||
// Step 1. Include necessary header files such that the stuff your
|
|
||||||
// test logic needs is declared.
|
|
||||||
//
|
|
||||||
// Don't forget gtest.h, which declares the testing framework.
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include "sample1.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
|
|
||||||
// Step 2. Use the TEST macro to define your tests.
|
|
||||||
//
|
|
||||||
// TEST has two parameters: the test case name and the test name.
|
|
||||||
// After using the macro, you should define your test logic between a
|
|
||||||
// pair of braces. You can use a bunch of macros to indicate the
|
|
||||||
// success or failure of a test. EXPECT_TRUE and EXPECT_EQ are
|
|
||||||
// examples of such macros. For a complete list, see gtest.h.
|
|
||||||
//
|
|
||||||
// <TechnicalDetails>
|
|
||||||
//
|
|
||||||
// In Google Test, tests are grouped into test cases. This is how we
|
|
||||||
// keep test code organized. You should put logically related tests
|
|
||||||
// into the same test case.
|
|
||||||
//
|
|
||||||
// The test case name and the test name should both be valid C++
|
|
||||||
// identifiers. And you should not use underscore (_) in the names.
|
|
||||||
//
|
|
||||||
// Google Test guarantees that each test you define is run exactly
|
|
||||||
// once, but it makes no guarantee on the order the tests are
|
|
||||||
// executed. Therefore, you should write your tests in such a way
|
|
||||||
// that their results don't depend on their order.
|
|
||||||
//
|
|
||||||
// </TechnicalDetails>
|
|
||||||
|
|
||||||
|
|
||||||
// Tests Factorial().
|
|
||||||
|
|
||||||
// Tests factorial of negative numbers.
|
|
||||||
TEST(FactorialTest, Negative) {
|
|
||||||
// This test is named "Negative", and belongs to the "FactorialTest"
|
|
||||||
// test case.
|
|
||||||
EXPECT_EQ(1, Factorial(-5));
|
|
||||||
EXPECT_EQ(1, Factorial(-1));
|
|
||||||
EXPECT_GT(Factorial(-10), 0);
|
|
||||||
|
|
||||||
// <TechnicalDetails>
|
|
||||||
//
|
|
||||||
// EXPECT_EQ(expected, actual) is the same as
|
|
||||||
//
|
|
||||||
// EXPECT_TRUE((expected) == (actual))
|
|
||||||
//
|
|
||||||
// except that it will print both the expected value and the actual
|
|
||||||
// value when the assertion fails. This is very helpful for
|
|
||||||
// debugging. Therefore in this case EXPECT_EQ is preferred.
|
|
||||||
//
|
|
||||||
// On the other hand, EXPECT_TRUE accepts any Boolean expression,
|
|
||||||
// and is thus more general.
|
|
||||||
//
|
|
||||||
// </TechnicalDetails>
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests factorial of 0.
|
|
||||||
TEST(FactorialTest, Zero) {
|
|
||||||
EXPECT_EQ(1, Factorial(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests factorial of positive numbers.
|
|
||||||
TEST(FactorialTest, Positive) {
|
|
||||||
EXPECT_EQ(1, Factorial(1));
|
|
||||||
EXPECT_EQ(2, Factorial(2));
|
|
||||||
EXPECT_EQ(6, Factorial(3));
|
|
||||||
EXPECT_EQ(40320, Factorial(8));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tests IsPrime()
|
|
||||||
|
|
||||||
// Tests negative input.
|
|
||||||
TEST(IsPrimeTest, Negative) {
|
|
||||||
// This test belongs to the IsPrimeTest test case.
|
|
||||||
|
|
||||||
EXPECT_FALSE(IsPrime(-1));
|
|
||||||
EXPECT_FALSE(IsPrime(-2));
|
|
||||||
EXPECT_FALSE(IsPrime(INT_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests some trivial cases.
|
|
||||||
TEST(IsPrimeTest, Trivial) {
|
|
||||||
EXPECT_FALSE(IsPrime(0));
|
|
||||||
EXPECT_FALSE(IsPrime(1));
|
|
||||||
EXPECT_TRUE(IsPrime(2));
|
|
||||||
EXPECT_TRUE(IsPrime(3));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests positive input.
|
|
||||||
TEST(IsPrimeTest, Positive) {
|
|
||||||
EXPECT_FALSE(IsPrime(4));
|
|
||||||
EXPECT_TRUE(IsPrime(5));
|
|
||||||
EXPECT_FALSE(IsPrime(6));
|
|
||||||
EXPECT_TRUE(IsPrime(23));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 3. Call RUN_ALL_TESTS() in main().
|
|
||||||
//
|
|
||||||
// We do this by linking in src/gtest_main.cc file, which consists of
|
|
||||||
// a main() function which calls RUN_ALL_TESTS() for us.
|
|
||||||
//
|
|
||||||
// This runs all the tests you've defined, prints the result, and
|
|
||||||
// returns 0 if successful, or 1 otherwise.
|
|
||||||
//
|
|
||||||
// Did you notice that we didn't register the tests? The
|
|
||||||
// RUN_ALL_TESTS() macro magically knows about all the tests we
|
|
||||||
// defined. Isn't this convenient?
|
|
|
@ -1,56 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#include "sample2.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
// Clones a 0-terminated C string, allocating memory using new.
|
|
||||||
const char* MyString::CloneCString(const char* a_c_string) {
|
|
||||||
if (a_c_string == NULL) return NULL;
|
|
||||||
|
|
||||||
const size_t len = strlen(a_c_string);
|
|
||||||
char* const clone = new char[ len + 1 ];
|
|
||||||
memcpy(clone, a_c_string, len + 1);
|
|
||||||
|
|
||||||
return clone;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets the 0-terminated C string this MyString object
|
|
||||||
// represents.
|
|
||||||
void MyString::Set(const char* a_c_string) {
|
|
||||||
// Makes sure this works when c_string == c_string_
|
|
||||||
const char* const temp = MyString::CloneCString(a_c_string);
|
|
||||||
delete[] c_string_;
|
|
||||||
c_string_ = temp;
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#ifndef GTEST_SAMPLES_SAMPLE2_H_
|
|
||||||
#define GTEST_SAMPLES_SAMPLE2_H_
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
|
||||||
// A simple string class.
|
|
||||||
class MyString {
|
|
||||||
private:
|
|
||||||
const char* c_string_;
|
|
||||||
const MyString& operator=(const MyString& rhs);
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Clones a 0-terminated C string, allocating memory using new.
|
|
||||||
static const char* CloneCString(const char* a_c_string);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// C'tors
|
|
||||||
|
|
||||||
// The default c'tor constructs a NULL string.
|
|
||||||
MyString() : c_string_(NULL) {}
|
|
||||||
|
|
||||||
// Constructs a MyString by cloning a 0-terminated C string.
|
|
||||||
explicit MyString(const char* a_c_string) : c_string_(NULL) {
|
|
||||||
Set(a_c_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy c'tor
|
|
||||||
MyString(const MyString& string) : c_string_(NULL) {
|
|
||||||
Set(string.c_string_);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// D'tor. MyString is intended to be a final class, so the d'tor
|
|
||||||
// doesn't need to be virtual.
|
|
||||||
~MyString() { delete[] c_string_; }
|
|
||||||
|
|
||||||
// Gets the 0-terminated C string this MyString object represents.
|
|
||||||
const char* c_string() const { return c_string_; }
|
|
||||||
|
|
||||||
size_t Length() const {
|
|
||||||
return c_string_ == NULL ? 0 : strlen(c_string_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets the 0-terminated C string this MyString object represents.
|
|
||||||
void Set(const char* c_string);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // GTEST_SAMPLES_SAMPLE2_H_
|
|
|
@ -1,109 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
|
|
||||||
// This sample shows how to write a more complex unit test for a class
|
|
||||||
// that has multiple member functions.
|
|
||||||
//
|
|
||||||
// Usually, it's a good idea to have one test for each method in your
|
|
||||||
// class. You don't have to do that exactly, but it helps to keep
|
|
||||||
// your tests organized. You may also throw in additional tests as
|
|
||||||
// needed.
|
|
||||||
|
|
||||||
#include "sample2.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
// In this example, we test the MyString class (a simple string).
|
|
||||||
|
|
||||||
// Tests the default c'tor.
|
|
||||||
TEST(MyString, DefaultConstructor) {
|
|
||||||
const MyString s;
|
|
||||||
|
|
||||||
// Asserts that s.c_string() returns NULL.
|
|
||||||
//
|
|
||||||
// <TechnicalDetails>
|
|
||||||
//
|
|
||||||
// If we write NULL instead of
|
|
||||||
//
|
|
||||||
// static_cast<const char *>(NULL)
|
|
||||||
//
|
|
||||||
// in this assertion, it will generate a warning on gcc 3.4. The
|
|
||||||
// reason is that EXPECT_EQ needs to know the types of its
|
|
||||||
// arguments in order to print them when it fails. Since NULL is
|
|
||||||
// #defined as 0, the compiler will use the formatter function for
|
|
||||||
// int to print it. However, gcc thinks that NULL should be used as
|
|
||||||
// a pointer, not an int, and therefore complains.
|
|
||||||
//
|
|
||||||
// The root of the problem is C++'s lack of distinction between the
|
|
||||||
// integer number 0 and the null pointer constant. Unfortunately,
|
|
||||||
// we have to live with this fact.
|
|
||||||
//
|
|
||||||
// </TechnicalDetails>
|
|
||||||
EXPECT_STREQ(NULL, s.c_string());
|
|
||||||
|
|
||||||
EXPECT_EQ(0u, s.Length());
|
|
||||||
}
|
|
||||||
|
|
||||||
const char kHelloString[] = "Hello, world!";
|
|
||||||
|
|
||||||
// Tests the c'tor that accepts a C string.
|
|
||||||
TEST(MyString, ConstructorFromCString) {
|
|
||||||
const MyString s(kHelloString);
|
|
||||||
EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
|
|
||||||
EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
|
|
||||||
s.Length());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests the copy c'tor.
|
|
||||||
TEST(MyString, CopyConstructor) {
|
|
||||||
const MyString s1(kHelloString);
|
|
||||||
const MyString s2 = s1;
|
|
||||||
EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests the Set method.
|
|
||||||
TEST(MyString, Set) {
|
|
||||||
MyString s;
|
|
||||||
|
|
||||||
s.Set(kHelloString);
|
|
||||||
EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
|
|
||||||
|
|
||||||
// Set should work when the input pointer is the same as the one
|
|
||||||
// already in the MyString object.
|
|
||||||
s.Set(s.c_string());
|
|
||||||
EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
|
|
||||||
|
|
||||||
// Can we set the MyString to NULL?
|
|
||||||
s.Set(NULL);
|
|
||||||
EXPECT_STREQ(NULL, s.c_string());
|
|
||||||
}
|
|
|
@ -1,172 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
|
|
||||||
#define GTEST_SAMPLES_SAMPLE3_INL_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
// Queue is a simple queue implemented as a singled-linked list.
|
|
||||||
//
|
|
||||||
// The element type must support copy constructor.
|
|
||||||
template <typename E> // E is the element type
|
|
||||||
class Queue;
|
|
||||||
|
|
||||||
// QueueNode is a node in a Queue, which consists of an element of
|
|
||||||
// type E and a pointer to the next node.
|
|
||||||
template <typename E> // E is the element type
|
|
||||||
class QueueNode {
|
|
||||||
friend class Queue<E>;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Gets the element in this node.
|
|
||||||
const E& element() const { return element_; }
|
|
||||||
|
|
||||||
// Gets the next node in the queue.
|
|
||||||
QueueNode* next() { return next_; }
|
|
||||||
const QueueNode* next() const { return next_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Creates a node with a given element value. The next pointer is
|
|
||||||
// set to NULL.
|
|
||||||
explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}
|
|
||||||
|
|
||||||
// We disable the default assignment operator and copy c'tor.
|
|
||||||
const QueueNode& operator = (const QueueNode&);
|
|
||||||
QueueNode(const QueueNode&);
|
|
||||||
|
|
||||||
E element_;
|
|
||||||
QueueNode* next_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename E> // E is the element type.
|
|
||||||
class Queue {
|
|
||||||
public:
|
|
||||||
// Creates an empty queue.
|
|
||||||
Queue() : head_(NULL), last_(NULL), size_(0) {}
|
|
||||||
|
|
||||||
// D'tor. Clears the queue.
|
|
||||||
~Queue() { Clear(); }
|
|
||||||
|
|
||||||
// Clears the queue.
|
|
||||||
void Clear() {
|
|
||||||
if (size_ > 0) {
|
|
||||||
// 1. Deletes every node.
|
|
||||||
QueueNode<E>* node = head_;
|
|
||||||
QueueNode<E>* next = node->next();
|
|
||||||
for (; ;) {
|
|
||||||
delete node;
|
|
||||||
node = next;
|
|
||||||
if (node == NULL) break;
|
|
||||||
next = node->next();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Resets the member variables.
|
|
||||||
head_ = last_ = NULL;
|
|
||||||
size_ = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the number of elements.
|
|
||||||
size_t Size() const { return size_; }
|
|
||||||
|
|
||||||
// Gets the first element of the queue, or NULL if the queue is empty.
|
|
||||||
QueueNode<E>* Head() { return head_; }
|
|
||||||
const QueueNode<E>* Head() const { return head_; }
|
|
||||||
|
|
||||||
// Gets the last element of the queue, or NULL if the queue is empty.
|
|
||||||
QueueNode<E>* Last() { return last_; }
|
|
||||||
const QueueNode<E>* Last() const { return last_; }
|
|
||||||
|
|
||||||
// Adds an element to the end of the queue. A copy of the element is
|
|
||||||
// created using the copy constructor, and then stored in the queue.
|
|
||||||
// Changes made to the element in the queue doesn't affect the source
|
|
||||||
// object, and vice versa.
|
|
||||||
void Enqueue(const E& element) {
|
|
||||||
QueueNode<E>* new_node = new QueueNode<E>(element);
|
|
||||||
|
|
||||||
if (size_ == 0) {
|
|
||||||
head_ = last_ = new_node;
|
|
||||||
size_ = 1;
|
|
||||||
} else {
|
|
||||||
last_->next_ = new_node;
|
|
||||||
last_ = new_node;
|
|
||||||
size_++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes the head of the queue and returns it. Returns NULL if
|
|
||||||
// the queue is empty.
|
|
||||||
E* Dequeue() {
|
|
||||||
if (size_ == 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QueueNode<E>* const old_head = head_;
|
|
||||||
head_ = head_->next_;
|
|
||||||
size_--;
|
|
||||||
if (size_ == 0) {
|
|
||||||
last_ = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
E* element = new E(old_head->element());
|
|
||||||
delete old_head;
|
|
||||||
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Applies a function/functor on each element of the queue, and
|
|
||||||
// returns the result in a new queue. The original queue is not
|
|
||||||
// affected.
|
|
||||||
template <typename F>
|
|
||||||
Queue* Map(F function) const {
|
|
||||||
Queue* new_queue = new Queue();
|
|
||||||
for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
|
|
||||||
new_queue->Enqueue(function(node->element()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QueueNode<E>* head_; // The first node of the queue.
|
|
||||||
QueueNode<E>* last_; // The last node of the queue.
|
|
||||||
size_t size_; // The number of elements in the queue.
|
|
||||||
|
|
||||||
// We disallow copying a queue.
|
|
||||||
Queue(const Queue&);
|
|
||||||
const Queue& operator = (const Queue&);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GTEST_SAMPLES_SAMPLE3_INL_H_
|
|
|
@ -1,151 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
|
|
||||||
// In this example, we use a more advanced feature of Google Test called
|
|
||||||
// test fixture.
|
|
||||||
//
|
|
||||||
// A test fixture is a place to hold objects and functions shared by
|
|
||||||
// all tests in a test case. Using a test fixture avoids duplicating
|
|
||||||
// the test code necessary to initialize and cleanup those common
|
|
||||||
// objects for each test. It is also useful for defining sub-routines
|
|
||||||
// that your tests need to invoke a lot.
|
|
||||||
//
|
|
||||||
// <TechnicalDetails>
|
|
||||||
//
|
|
||||||
// The tests share the test fixture in the sense of code sharing, not
|
|
||||||
// data sharing. Each test is given its own fresh copy of the
|
|
||||||
// fixture. You cannot expect the data modified by one test to be
|
|
||||||
// passed on to another test, which is a bad idea.
|
|
||||||
//
|
|
||||||
// The reason for this design is that tests should be independent and
|
|
||||||
// repeatable. In particular, a test should not fail as the result of
|
|
||||||
// another test's failure. If one test depends on info produced by
|
|
||||||
// another test, then the two tests should really be one big test.
|
|
||||||
//
|
|
||||||
// The macros for indicating the success/failure of a test
|
|
||||||
// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
|
|
||||||
// (when Google Test prints the test result, it tells you which test
|
|
||||||
// each failure belongs to). Technically, these macros invoke a
|
|
||||||
// member function of the Test class. Therefore, you cannot use them
|
|
||||||
// in a global function. That's why you should put test sub-routines
|
|
||||||
// in a test fixture.
|
|
||||||
//
|
|
||||||
// </TechnicalDetails>
|
|
||||||
|
|
||||||
#include "sample3-inl.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
// To use a test fixture, derive a class from testing::Test.
|
|
||||||
class QueueTest : public testing::Test {
|
|
||||||
protected: // You should make the members protected s.t. they can be
|
|
||||||
// accessed from sub-classes.
|
|
||||||
|
|
||||||
// virtual void SetUp() will be called before each test is run. You
|
|
||||||
// should define it if you need to initialize the varaibles.
|
|
||||||
// Otherwise, this can be skipped.
|
|
||||||
virtual void SetUp() {
|
|
||||||
q1_.Enqueue(1);
|
|
||||||
q2_.Enqueue(2);
|
|
||||||
q2_.Enqueue(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// virtual void TearDown() will be called after each test is run.
|
|
||||||
// You should define it if there is cleanup work to do. Otherwise,
|
|
||||||
// you don't have to provide it.
|
|
||||||
//
|
|
||||||
// virtual void TearDown() {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// A helper function that some test uses.
|
|
||||||
static int Double(int n) {
|
|
||||||
return 2*n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A helper function for testing Queue::Map().
|
|
||||||
void MapTester(const Queue<int> * q) {
|
|
||||||
// Creates a new queue, where each element is twice as big as the
|
|
||||||
// corresponding one in q.
|
|
||||||
const Queue<int> * const new_q = q->Map(Double);
|
|
||||||
|
|
||||||
// Verifies that the new queue has the same size as q.
|
|
||||||
ASSERT_EQ(q->Size(), new_q->Size());
|
|
||||||
|
|
||||||
// Verifies the relationship between the elements of the two queues.
|
|
||||||
for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
|
|
||||||
n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
|
|
||||||
EXPECT_EQ(2 * n1->element(), n2->element());
|
|
||||||
}
|
|
||||||
|
|
||||||
delete new_q;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Declares the variables your tests want to use.
|
|
||||||
Queue<int> q0_;
|
|
||||||
Queue<int> q1_;
|
|
||||||
Queue<int> q2_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// When you have a test fixture, you define a test using TEST_F
|
|
||||||
// instead of TEST.
|
|
||||||
|
|
||||||
// Tests the default c'tor.
|
|
||||||
TEST_F(QueueTest, DefaultConstructor) {
|
|
||||||
// You can access data in the test fixture here.
|
|
||||||
EXPECT_EQ(0u, q0_.Size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests Dequeue().
|
|
||||||
TEST_F(QueueTest, Dequeue) {
|
|
||||||
int * n = q0_.Dequeue();
|
|
||||||
EXPECT_TRUE(n == NULL);
|
|
||||||
|
|
||||||
n = q1_.Dequeue();
|
|
||||||
ASSERT_TRUE(n != NULL);
|
|
||||||
EXPECT_EQ(1, *n);
|
|
||||||
EXPECT_EQ(0u, q1_.Size());
|
|
||||||
delete n;
|
|
||||||
|
|
||||||
n = q2_.Dequeue();
|
|
||||||
ASSERT_TRUE(n != NULL);
|
|
||||||
EXPECT_EQ(2, *n);
|
|
||||||
EXPECT_EQ(1u, q2_.Size());
|
|
||||||
delete n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests the Queue::Map() function.
|
|
||||||
TEST_F(QueueTest, Map) {
|
|
||||||
MapTester(&q0_);
|
|
||||||
MapTester(&q1_);
|
|
||||||
MapTester(&q2_);
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "sample4.h"
|
|
||||||
|
|
||||||
// Returns the current counter value, and increments it.
|
|
||||||
int Counter::Increment() {
|
|
||||||
return counter_++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prints the current counter value to STDOUT.
|
|
||||||
void Counter::Print() const {
|
|
||||||
printf("%d", counter_);
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
// A sample program demonstrating using Google C++ testing framework.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#ifndef GTEST_SAMPLES_SAMPLE4_H_
|
|
||||||
#define GTEST_SAMPLES_SAMPLE4_H_
|
|
||||||
|
|
||||||
// A simple monotonic counter.
|
|
||||||
class Counter {
|
|
||||||
private:
|
|
||||||
int counter_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Creates a counter that starts at 0.
|
|
||||||
Counter() : counter_(0) {}
|
|
||||||
|
|
||||||
// Returns the current counter value, and increments it.
|
|
||||||
int Increment();
|
|
||||||
|
|
||||||
// Prints the current counter value to STDOUT.
|
|
||||||
void Print() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GTEST_SAMPLES_SAMPLE4_H_
|
|
|
@ -1,45 +0,0 @@
|
||||||
// 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)
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
#include "sample4.h"
|
|
||||||
|
|
||||||
// Tests the Increment() method.
|
|
||||||
TEST(Counter, Increment) {
|
|
||||||
Counter c;
|
|
||||||
|
|
||||||
// EXPECT_EQ() evaluates its arguments exactly once, so they
|
|
||||||
// can have side effects.
|
|
||||||
|
|
||||||
EXPECT_EQ(0, c.Increment());
|
|
||||||
EXPECT_EQ(1, c.Increment());
|
|
||||||
EXPECT_EQ(2, c.Increment());
|
|
||||||
}
|
|
|
@ -1,199 +0,0 @@
|
||||||
// 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)
|
|
||||||
|
|
||||||
// This sample teaches how to reuse a test fixture in multiple test
|
|
||||||
// cases by deriving sub-fixtures from it.
|
|
||||||
//
|
|
||||||
// When you define a test fixture, you specify the name of the test
|
|
||||||
// case that will use this fixture. Therefore, a test fixture can
|
|
||||||
// be used by only one test case.
|
|
||||||
//
|
|
||||||
// Sometimes, more than one test cases may want to use the same or
|
|
||||||
// slightly different test fixtures. For example, you may want to
|
|
||||||
// make sure that all tests for a GUI library don't leak important
|
|
||||||
// system resources like fonts and brushes. In Google Test, you do
|
|
||||||
// this by putting the shared logic in a super (as in "super class")
|
|
||||||
// test fixture, and then have each test case use a fixture derived
|
|
||||||
// from this super fixture.
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "sample3-inl.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
#include "sample1.h"
|
|
||||||
|
|
||||||
// In this sample, we want to ensure that every test finishes within
|
|
||||||
// ~5 seconds. If a test takes longer to run, we consider it a
|
|
||||||
// failure.
|
|
||||||
//
|
|
||||||
// We put the code for timing a test in a test fixture called
|
|
||||||
// "QuickTest". QuickTest is intended to be the super fixture that
|
|
||||||
// other fixtures derive from, therefore there is no test case with
|
|
||||||
// the name "QuickTest". This is OK.
|
|
||||||
//
|
|
||||||
// Later, we will derive multiple test fixtures from QuickTest.
|
|
||||||
class QuickTest : public testing::Test {
|
|
||||||
protected:
|
|
||||||
// Remember that SetUp() is run immediately before a test starts.
|
|
||||||
// This is a good place to record the start time.
|
|
||||||
virtual void SetUp() {
|
|
||||||
start_time_ = time(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TearDown() is invoked immediately after a test finishes. Here we
|
|
||||||
// check if the test was too slow.
|
|
||||||
virtual void TearDown() {
|
|
||||||
// Gets the time when the test finishes
|
|
||||||
const time_t end_time = time(NULL);
|
|
||||||
|
|
||||||
// Asserts that the test took no more than ~5 seconds. Did you
|
|
||||||
// know that you can use assertions in SetUp() and TearDown() as
|
|
||||||
// well?
|
|
||||||
EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
|
|
||||||
}
|
|
||||||
|
|
||||||
// The UTC time (in seconds) when the test starts
|
|
||||||
time_t start_time_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// We derive a fixture named IntegerFunctionTest from the QuickTest
|
|
||||||
// fixture. All tests using this fixture will be automatically
|
|
||||||
// required to be quick.
|
|
||||||
class IntegerFunctionTest : public QuickTest {
|
|
||||||
// We don't need any more logic than already in the QuickTest fixture.
|
|
||||||
// Therefore the body is empty.
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Now we can write tests in the IntegerFunctionTest test case.
|
|
||||||
|
|
||||||
// Tests Factorial()
|
|
||||||
TEST_F(IntegerFunctionTest, Factorial) {
|
|
||||||
// Tests factorial of negative numbers.
|
|
||||||
EXPECT_EQ(1, Factorial(-5));
|
|
||||||
EXPECT_EQ(1, Factorial(-1));
|
|
||||||
EXPECT_GT(Factorial(-10), 0);
|
|
||||||
|
|
||||||
// Tests factorial of 0.
|
|
||||||
EXPECT_EQ(1, Factorial(0));
|
|
||||||
|
|
||||||
// Tests factorial of positive numbers.
|
|
||||||
EXPECT_EQ(1, Factorial(1));
|
|
||||||
EXPECT_EQ(2, Factorial(2));
|
|
||||||
EXPECT_EQ(6, Factorial(3));
|
|
||||||
EXPECT_EQ(40320, Factorial(8));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tests IsPrime()
|
|
||||||
TEST_F(IntegerFunctionTest, IsPrime) {
|
|
||||||
// Tests negative input.
|
|
||||||
EXPECT_FALSE(IsPrime(-1));
|
|
||||||
EXPECT_FALSE(IsPrime(-2));
|
|
||||||
EXPECT_FALSE(IsPrime(INT_MIN));
|
|
||||||
|
|
||||||
// Tests some trivial cases.
|
|
||||||
EXPECT_FALSE(IsPrime(0));
|
|
||||||
EXPECT_FALSE(IsPrime(1));
|
|
||||||
EXPECT_TRUE(IsPrime(2));
|
|
||||||
EXPECT_TRUE(IsPrime(3));
|
|
||||||
|
|
||||||
// Tests positive input.
|
|
||||||
EXPECT_FALSE(IsPrime(4));
|
|
||||||
EXPECT_TRUE(IsPrime(5));
|
|
||||||
EXPECT_FALSE(IsPrime(6));
|
|
||||||
EXPECT_TRUE(IsPrime(23));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// The next test case (named "QueueTest") also needs to be quick, so
|
|
||||||
// we derive another fixture from QuickTest.
|
|
||||||
//
|
|
||||||
// The QueueTest test fixture has some logic and shared objects in
|
|
||||||
// addition to what's in QuickTest already. We define the additional
|
|
||||||
// stuff inside the body of the test fixture, as usual.
|
|
||||||
class QueueTest : public QuickTest {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
// First, we need to set up the super fixture (QuickTest).
|
|
||||||
QuickTest::SetUp();
|
|
||||||
|
|
||||||
// Second, some additional setup for this fixture.
|
|
||||||
q1_.Enqueue(1);
|
|
||||||
q2_.Enqueue(2);
|
|
||||||
q2_.Enqueue(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// By default, TearDown() inherits the behavior of
|
|
||||||
// QuickTest::TearDown(). As we have no additional cleaning work
|
|
||||||
// for QueueTest, we omit it here.
|
|
||||||
//
|
|
||||||
// virtual void TearDown() {
|
|
||||||
// QuickTest::TearDown();
|
|
||||||
// }
|
|
||||||
|
|
||||||
Queue<int> q0_;
|
|
||||||
Queue<int> q1_;
|
|
||||||
Queue<int> q2_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Now, let's write tests using the QueueTest fixture.
|
|
||||||
|
|
||||||
// Tests the default constructor.
|
|
||||||
TEST_F(QueueTest, DefaultConstructor) {
|
|
||||||
EXPECT_EQ(0u, q0_.Size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests Dequeue().
|
|
||||||
TEST_F(QueueTest, Dequeue) {
|
|
||||||
int* n = q0_.Dequeue();
|
|
||||||
EXPECT_TRUE(n == NULL);
|
|
||||||
|
|
||||||
n = q1_.Dequeue();
|
|
||||||
EXPECT_TRUE(n != NULL);
|
|
||||||
EXPECT_EQ(1, *n);
|
|
||||||
EXPECT_EQ(0u, q1_.Size());
|
|
||||||
delete n;
|
|
||||||
|
|
||||||
n = q2_.Dequeue();
|
|
||||||
EXPECT_TRUE(n != NULL);
|
|
||||||
EXPECT_EQ(2, *n);
|
|
||||||
EXPECT_EQ(1u, q2_.Size());
|
|
||||||
delete n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If necessary, you can derive further test fixtures from a derived
|
|
||||||
// fixture itself. For example, you can derive another fixture from
|
|
||||||
// QueueTest. Google Test imposes no limit on how deep the hierarchy
|
|
||||||
// can be. In practice, however, you probably don't want it to be too
|
|
||||||
// deep as to be confusing.
|
|
|
@ -1,224 +0,0 @@
|
||||||
// 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)
|
|
||||||
|
|
||||||
// This sample shows how to test common properties of multiple
|
|
||||||
// implementations of the same interface (aka interface tests).
|
|
||||||
|
|
||||||
// The interface and its implementations are in this header.
|
|
||||||
#include "prime_tables.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
// First, we define some factory functions for creating instances of
|
|
||||||
// the implementations. You may be able to skip this step if all your
|
|
||||||
// implementations can be constructed the same way.
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
PrimeTable* CreatePrimeTable();
|
|
||||||
|
|
||||||
template <>
|
|
||||||
PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
|
|
||||||
return new OnTheFlyPrimeTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
|
|
||||||
return new PreCalculatedPrimeTable(10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then we define a test fixture class template.
|
|
||||||
template <class T>
|
|
||||||
class PrimeTableTest : public testing::Test {
|
|
||||||
protected:
|
|
||||||
// The ctor calls the factory function to create a prime table
|
|
||||||
// implemented by T.
|
|
||||||
PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
|
|
||||||
|
|
||||||
virtual ~PrimeTableTest() { delete table_; }
|
|
||||||
|
|
||||||
// Note that we test an implementation via the base interface
|
|
||||||
// instead of the actual implementation class. This is important
|
|
||||||
// for keeping the tests close to the real world scenario, where the
|
|
||||||
// implementation is invoked via the base interface. It avoids
|
|
||||||
// got-yas where the implementation class has a method that shadows
|
|
||||||
// a method with the same name (but slightly different argument
|
|
||||||
// types) in the base interface, for example.
|
|
||||||
PrimeTable* const table_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if GTEST_HAS_TYPED_TEST
|
|
||||||
|
|
||||||
using testing::Types;
|
|
||||||
|
|
||||||
// Google Test offers two ways for reusing tests for different types.
|
|
||||||
// The first is called "typed tests". You should use it if you
|
|
||||||
// already know *all* the types you are gonna exercise when you write
|
|
||||||
// the tests.
|
|
||||||
|
|
||||||
// To write a typed test case, first use
|
|
||||||
//
|
|
||||||
// TYPED_TEST_CASE(TestCaseName, TypeList);
|
|
||||||
//
|
|
||||||
// to declare it and specify the type parameters. As with TEST_F,
|
|
||||||
// TestCaseName must match the test fixture name.
|
|
||||||
|
|
||||||
// The list of types we want to test.
|
|
||||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
|
|
||||||
|
|
||||||
TYPED_TEST_CASE(PrimeTableTest, Implementations);
|
|
||||||
|
|
||||||
// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
|
|
||||||
// similar to TEST_F.
|
|
||||||
TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
|
||||||
// Inside the test body, you can refer to the type parameter by
|
|
||||||
// TypeParam, and refer to the fixture class by TestFixture. We
|
|
||||||
// don't need them in this example.
|
|
||||||
|
|
||||||
// Since we are in the template world, C++ requires explicitly
|
|
||||||
// writing 'this->' when referring to members of the fixture class.
|
|
||||||
// This is something you have to learn to live with.
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(-5));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(0));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(1));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(4));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(6));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(2));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(3));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(5));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(7));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(11));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(131));
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
|
|
||||||
EXPECT_EQ(2, this->table_->GetNextPrime(0));
|
|
||||||
EXPECT_EQ(3, this->table_->GetNextPrime(2));
|
|
||||||
EXPECT_EQ(5, this->table_->GetNextPrime(3));
|
|
||||||
EXPECT_EQ(7, this->table_->GetNextPrime(5));
|
|
||||||
EXPECT_EQ(11, this->table_->GetNextPrime(7));
|
|
||||||
EXPECT_EQ(131, this->table_->GetNextPrime(128));
|
|
||||||
}
|
|
||||||
|
|
||||||
// That's it! Google Test will repeat each TYPED_TEST for each type
|
|
||||||
// in the type list specified in TYPED_TEST_CASE. Sit back and be
|
|
||||||
// happy that you don't have to define them multiple times.
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_TYPED_TEST
|
|
||||||
|
|
||||||
#if GTEST_HAS_TYPED_TEST_P
|
|
||||||
|
|
||||||
using testing::Types;
|
|
||||||
|
|
||||||
// Sometimes, however, you don't yet know all the types that you want
|
|
||||||
// to test when you write the tests. For example, if you are the
|
|
||||||
// author of an interface and expect other people to implement it, you
|
|
||||||
// might want to write a set of tests to make sure each implementation
|
|
||||||
// conforms to some basic requirements, but you don't know what
|
|
||||||
// implementations will be written in the future.
|
|
||||||
//
|
|
||||||
// How can you write the tests without committing to the type
|
|
||||||
// parameters? That's what "type-parameterized tests" can do for you.
|
|
||||||
// It is a bit more involved than typed tests, but in return you get a
|
|
||||||
// test pattern that can be reused in many contexts, which is a big
|
|
||||||
// win. Here's how you do it:
|
|
||||||
|
|
||||||
// First, define a test fixture class template. Here we just reuse
|
|
||||||
// the PrimeTableTest fixture defined earlier:
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class PrimeTableTest2 : public PrimeTableTest<T> {
|
|
||||||
};
|
|
||||||
|
|
||||||
// Then, declare the test case. The argument is the name of the test
|
|
||||||
// fixture, and also the name of the test case (as usual). The _P
|
|
||||||
// suffix is for "parameterized" or "pattern".
|
|
||||||
TYPED_TEST_CASE_P(PrimeTableTest2);
|
|
||||||
|
|
||||||
// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
|
|
||||||
// similar to what you do with TEST_F.
|
|
||||||
TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(-5));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(0));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(1));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(4));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(6));
|
|
||||||
EXPECT_FALSE(this->table_->IsPrime(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(2));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(3));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(5));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(7));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(11));
|
|
||||||
EXPECT_TRUE(this->table_->IsPrime(131));
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
|
|
||||||
EXPECT_EQ(2, this->table_->GetNextPrime(0));
|
|
||||||
EXPECT_EQ(3, this->table_->GetNextPrime(2));
|
|
||||||
EXPECT_EQ(5, this->table_->GetNextPrime(3));
|
|
||||||
EXPECT_EQ(7, this->table_->GetNextPrime(5));
|
|
||||||
EXPECT_EQ(11, this->table_->GetNextPrime(7));
|
|
||||||
EXPECT_EQ(131, this->table_->GetNextPrime(128));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type-parameterized tests involve one extra step: you have to
|
|
||||||
// enumerate the tests you defined:
|
|
||||||
REGISTER_TYPED_TEST_CASE_P(
|
|
||||||
PrimeTableTest2, // The first argument is the test case name.
|
|
||||||
// The rest of the arguments are the test names.
|
|
||||||
ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
|
|
||||||
|
|
||||||
// At this point the test pattern is done. However, you don't have
|
|
||||||
// any real test yet as you haven't said which types you want to run
|
|
||||||
// the tests with.
|
|
||||||
|
|
||||||
// To turn the abstract test pattern into real tests, you instantiate
|
|
||||||
// it with a list of types. Usually the test pattern will be defined
|
|
||||||
// in a .h file, and anyone can #include and instantiate it. You can
|
|
||||||
// even instantiate it more than once in the same program. To tell
|
|
||||||
// different instances apart, you give each of them a name, which will
|
|
||||||
// become part of the test case name and can be used in test filters.
|
|
||||||
|
|
||||||
// The list of types we want to test. Note that it doesn't have to be
|
|
||||||
// defined at the time we write the TYPED_TEST_P()s.
|
|
||||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
|
|
||||||
PrimeTableImplementations;
|
|
||||||
INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated, // Instance name
|
|
||||||
PrimeTableTest2, // Test case name
|
|
||||||
PrimeTableImplementations); // Type list
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_TYPED_TEST_P
|
|
|
@ -1,130 +0,0 @@
|
||||||
// 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)
|
|
||||||
|
|
||||||
// This sample shows how to test common properties of multiple
|
|
||||||
// implementations of an interface (aka interface tests) using
|
|
||||||
// value-parameterized tests. Each test in the test case has
|
|
||||||
// a parameter that is an interface pointer to an implementation
|
|
||||||
// tested.
|
|
||||||
|
|
||||||
// The interface and its implementations are in this header.
|
|
||||||
#include "prime_tables.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
using ::testing::TestWithParam;
|
|
||||||
using ::testing::Values;
|
|
||||||
|
|
||||||
// As a general rule, to prevent a test from affecting the tests that come
|
|
||||||
// after it, you should create and destroy the tested objects for each test
|
|
||||||
// instead of reusing them. In this sample we will define a simple factory
|
|
||||||
// function for PrimeTable objects. We will instantiate objects in test's
|
|
||||||
// SetUp() method and delete them in TearDown() method.
|
|
||||||
typedef PrimeTable* CreatePrimeTableFunc();
|
|
||||||
|
|
||||||
PrimeTable* CreateOnTheFlyPrimeTable() {
|
|
||||||
return new OnTheFlyPrimeTable();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <size_t max_precalculated>
|
|
||||||
PrimeTable* CreatePreCalculatedPrimeTable() {
|
|
||||||
return new PreCalculatedPrimeTable(max_precalculated);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inside the test body, fixture constructor, SetUp(), and TearDown() you
|
|
||||||
// can refer to the test parameter by GetParam(). In this case, the test
|
|
||||||
// parameter is a factory function which we call in fixture's SetUp() to
|
|
||||||
// create and store an instance of PrimeTable.
|
|
||||||
class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
|
|
||||||
public:
|
|
||||||
virtual ~PrimeTableTest() { delete table_; }
|
|
||||||
virtual void SetUp() { table_ = (*GetParam())(); }
|
|
||||||
virtual void TearDown() {
|
|
||||||
delete table_;
|
|
||||||
table_ = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
PrimeTable* table_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
|
||||||
EXPECT_FALSE(table_->IsPrime(-5));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(0));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(1));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(4));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(6));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
|
|
||||||
EXPECT_TRUE(table_->IsPrime(2));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(3));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(5));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(7));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(11));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(131));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
|
|
||||||
EXPECT_EQ(2, table_->GetNextPrime(0));
|
|
||||||
EXPECT_EQ(3, table_->GetNextPrime(2));
|
|
||||||
EXPECT_EQ(5, table_->GetNextPrime(3));
|
|
||||||
EXPECT_EQ(7, table_->GetNextPrime(5));
|
|
||||||
EXPECT_EQ(11, table_->GetNextPrime(7));
|
|
||||||
EXPECT_EQ(131, table_->GetNextPrime(128));
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to run value-parameterized tests, you need to instantiate them,
|
|
||||||
// or bind them to a list of values which will be used as test parameters.
|
|
||||||
// You can instantiate them in a different translation module, or even
|
|
||||||
// instantiate them several times.
|
|
||||||
//
|
|
||||||
// Here, we instantiate our tests with a list of two PrimeTable object
|
|
||||||
// factory functions:
|
|
||||||
INSTANTIATE_TEST_CASE_P(
|
|
||||||
OnTheFlyAndPreCalculated,
|
|
||||||
PrimeTableTest,
|
|
||||||
Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Google Test may not support value-parameterized tests with some
|
|
||||||
// compilers. If we use conditional compilation to compile out all
|
|
||||||
// code referring to the gtest_main library, MSVC linker will not link
|
|
||||||
// that library at all and consequently complain about missing entry
|
|
||||||
// point defined in that library (fatal error LNK1561: entry point
|
|
||||||
// must be defined). This dummy test keeps gtest_main linked in.
|
|
||||||
TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
|
|
@ -1,173 +0,0 @@
|
||||||
// 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)
|
|
||||||
|
|
||||||
// This sample shows how to test code relying on some global flag variables.
|
|
||||||
// Combine() helps with generating all possible combinations of such flags,
|
|
||||||
// and each test is given one combination as a parameter.
|
|
||||||
|
|
||||||
// Use class definitions to test from this header.
|
|
||||||
#include "prime_tables.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
// Suppose we want to introduce a new, improved implementation of PrimeTable
|
|
||||||
// which combines speed of PrecalcPrimeTable and versatility of
|
|
||||||
// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
|
|
||||||
// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
|
|
||||||
// appropriate under the circumstances. But in low memory conditions, it can be
|
|
||||||
// told to instantiate without PrecalcPrimeTable instance at all and use only
|
|
||||||
// OnTheFlyPrimeTable.
|
|
||||||
class HybridPrimeTable : public PrimeTable {
|
|
||||||
public:
|
|
||||||
HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
|
|
||||||
: on_the_fly_impl_(new OnTheFlyPrimeTable),
|
|
||||||
precalc_impl_(force_on_the_fly ? NULL :
|
|
||||||
new PreCalculatedPrimeTable(max_precalculated)),
|
|
||||||
max_precalculated_(max_precalculated) {}
|
|
||||||
virtual ~HybridPrimeTable() {
|
|
||||||
delete on_the_fly_impl_;
|
|
||||||
delete precalc_impl_;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool IsPrime(int n) const {
|
|
||||||
if (precalc_impl_ != NULL && n < max_precalculated_)
|
|
||||||
return precalc_impl_->IsPrime(n);
|
|
||||||
else
|
|
||||||
return on_the_fly_impl_->IsPrime(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int GetNextPrime(int p) const {
|
|
||||||
int next_prime = -1;
|
|
||||||
if (precalc_impl_ != NULL && p < max_precalculated_)
|
|
||||||
next_prime = precalc_impl_->GetNextPrime(p);
|
|
||||||
|
|
||||||
return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
OnTheFlyPrimeTable* on_the_fly_impl_;
|
|
||||||
PreCalculatedPrimeTable* precalc_impl_;
|
|
||||||
int max_precalculated_;
|
|
||||||
};
|
|
||||||
|
|
||||||
using ::testing::TestWithParam;
|
|
||||||
using ::testing::Bool;
|
|
||||||
using ::testing::Values;
|
|
||||||
using ::testing::Combine;
|
|
||||||
|
|
||||||
// To test all code paths for HybridPrimeTable we must test it with numbers
|
|
||||||
// both within and outside PreCalculatedPrimeTable's capacity and also with
|
|
||||||
// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
|
|
||||||
// accept different combinations of parameters for instantiating a
|
|
||||||
// HybridPrimeTable instance.
|
|
||||||
class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
// This can be written as
|
|
||||||
//
|
|
||||||
// bool force_on_the_fly;
|
|
||||||
// int max_precalculated;
|
|
||||||
// tie(force_on_the_fly, max_precalculated) = GetParam();
|
|
||||||
//
|
|
||||||
// once the Google C++ Style Guide allows use of ::std::tr1::tie.
|
|
||||||
//
|
|
||||||
bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
|
|
||||||
int max_precalculated = ::std::tr1::get<1>(GetParam());
|
|
||||||
table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
|
|
||||||
}
|
|
||||||
virtual void TearDown() {
|
|
||||||
delete table_;
|
|
||||||
table_ = NULL;
|
|
||||||
}
|
|
||||||
HybridPrimeTable* table_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
|
||||||
// Inside the test body, you can refer to the test parameter by GetParam().
|
|
||||||
// In this case, the test parameter is a PrimeTable interface pointer which
|
|
||||||
// we can use directly.
|
|
||||||
// Please note that you can also save it in the fixture's SetUp() method
|
|
||||||
// or constructor and use saved copy in the tests.
|
|
||||||
|
|
||||||
EXPECT_FALSE(table_->IsPrime(-5));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(0));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(1));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(4));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(6));
|
|
||||||
EXPECT_FALSE(table_->IsPrime(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
|
|
||||||
EXPECT_TRUE(table_->IsPrime(2));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(3));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(5));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(7));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(11));
|
|
||||||
EXPECT_TRUE(table_->IsPrime(131));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
|
|
||||||
EXPECT_EQ(2, table_->GetNextPrime(0));
|
|
||||||
EXPECT_EQ(3, table_->GetNextPrime(2));
|
|
||||||
EXPECT_EQ(5, table_->GetNextPrime(3));
|
|
||||||
EXPECT_EQ(7, table_->GetNextPrime(5));
|
|
||||||
EXPECT_EQ(11, table_->GetNextPrime(7));
|
|
||||||
EXPECT_EQ(131, table_->GetNextPrime(128));
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to run value-parameterized tests, you need to instantiate them,
|
|
||||||
// or bind them to a list of values which will be used as test parameters.
|
|
||||||
// You can instantiate them in a different translation module, or even
|
|
||||||
// instantiate them several times.
|
|
||||||
//
|
|
||||||
// Here, we instantiate our tests with a list of parameters. We must combine
|
|
||||||
// all variations of the boolean flag suppressing PrecalcPrimeTable and some
|
|
||||||
// meaningful values for tests. We choose a small value (1), and a value that
|
|
||||||
// will put some of the tested numbers beyond the capability of the
|
|
||||||
// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
|
|
||||||
// possible combinations.
|
|
||||||
INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
|
|
||||||
PrimeTableTest,
|
|
||||||
Combine(Bool(), Values(1, 10)));
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Google Test may not support Combine() with some compilers. If we
|
|
||||||
// use conditional compilation to compile out all code referring to
|
|
||||||
// the gtest_main library, MSVC linker will not link that library at
|
|
||||||
// all and consequently complain about missing entry point defined in
|
|
||||||
// that library (fatal error LNK1561: entry point must be
|
|
||||||
// defined). This dummy test keeps gtest_main linked in.
|
|
||||||
TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_COMBINE
|
|
|
@ -1,160 +0,0 @@
|
||||||
// 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: vladl@google.com (Vlad Losev)
|
|
||||||
|
|
||||||
// This sample shows how to use Google Test listener API to implement
|
|
||||||
// an alternative console output and how to use the UnitTest reflection API
|
|
||||||
// to enumerate test cases and tests and to inspect their results.
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
using ::testing::EmptyTestEventListener;
|
|
||||||
using ::testing::InitGoogleTest;
|
|
||||||
using ::testing::Test;
|
|
||||||
using ::testing::TestCase;
|
|
||||||
using ::testing::TestEventListeners;
|
|
||||||
using ::testing::TestInfo;
|
|
||||||
using ::testing::TestPartResult;
|
|
||||||
using ::testing::UnitTest;
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// Provides alternative output mode which produces minimal amount of
|
|
||||||
// information about tests.
|
|
||||||
class TersePrinter : public EmptyTestEventListener {
|
|
||||||
private:
|
|
||||||
// Called before any test activity starts.
|
|
||||||
virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}
|
|
||||||
|
|
||||||
// Called after all test activities have ended.
|
|
||||||
virtual void OnTestProgramEnd(const UnitTest& unit_test) {
|
|
||||||
fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called before a test starts.
|
|
||||||
virtual void OnTestStart(const TestInfo& test_info) {
|
|
||||||
fprintf(stdout,
|
|
||||||
"*** Test %s.%s starting.\n",
|
|
||||||
test_info.test_case_name(),
|
|
||||||
test_info.name());
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called after a failed assertion or a SUCCEED() invocation.
|
|
||||||
virtual void OnTestPartResult(const TestPartResult& test_part_result) {
|
|
||||||
fprintf(stdout,
|
|
||||||
"%s in %s:%d\n%s\n",
|
|
||||||
test_part_result.failed() ? "*** Failure" : "Success",
|
|
||||||
test_part_result.file_name(),
|
|
||||||
test_part_result.line_number(),
|
|
||||||
test_part_result.summary());
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called after a test ends.
|
|
||||||
virtual void OnTestEnd(const TestInfo& test_info) {
|
|
||||||
fprintf(stdout,
|
|
||||||
"*** Test %s.%s ending.\n",
|
|
||||||
test_info.test_case_name(),
|
|
||||||
test_info.name());
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
}; // class TersePrinter
|
|
||||||
|
|
||||||
TEST(CustomOutputTest, PrintsMessage) {
|
|
||||||
printf("Printing something from the test body...\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(CustomOutputTest, Succeeds) {
|
|
||||||
SUCCEED() << "SUCCEED() has been invoked from here";
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(CustomOutputTest, Fails) {
|
|
||||||
EXPECT_EQ(1, 2)
|
|
||||||
<< "This test fails in order to demonstrate alternative failure messages";
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
bool terse_output = false;
|
|
||||||
if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
|
|
||||||
terse_output = true;
|
|
||||||
else
|
|
||||||
printf("%s\n", "Run this program with --terse_output to change the way "
|
|
||||||
"it prints its output.");
|
|
||||||
|
|
||||||
UnitTest& unit_test = *UnitTest::GetInstance();
|
|
||||||
|
|
||||||
// If we are given the --terse_output command line flag, suppresses the
|
|
||||||
// standard output and attaches own result printer.
|
|
||||||
if (terse_output) {
|
|
||||||
TestEventListeners& listeners = unit_test.listeners();
|
|
||||||
|
|
||||||
// Removes the default console output listener from the list so it will
|
|
||||||
// not receive events from Google Test and won't print any output. Since
|
|
||||||
// this operation transfers ownership of the listener to the caller we
|
|
||||||
// have to delete it as well.
|
|
||||||
delete listeners.Release(listeners.default_result_printer());
|
|
||||||
|
|
||||||
// Adds the custom output listener to the list. It will now receive
|
|
||||||
// events from Google Test and print the alternative output. We don't
|
|
||||||
// have to worry about deleting it since Google Test assumes ownership
|
|
||||||
// over it after adding it to the list.
|
|
||||||
listeners.Append(new TersePrinter);
|
|
||||||
}
|
|
||||||
int ret_val = RUN_ALL_TESTS();
|
|
||||||
|
|
||||||
// This is an example of using the UnitTest reflection API to inspect test
|
|
||||||
// results. Here we discount failures from the tests we expected to fail.
|
|
||||||
int unexpectedly_failed_tests = 0;
|
|
||||||
for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
|
|
||||||
const TestCase& test_case = *unit_test.GetTestCase(i);
|
|
||||||
for (int j = 0; j < test_case.total_test_count(); ++j) {
|
|
||||||
const TestInfo& test_info = *test_case.GetTestInfo(j);
|
|
||||||
// Counts failed tests that were not meant to fail (those without
|
|
||||||
// 'Fails' in the name).
|
|
||||||
if (test_info.result()->Failed() &&
|
|
||||||
strcmp(test_info.name(), "Fails") != 0) {
|
|
||||||
unexpectedly_failed_tests++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test that were meant to fail should not affect the test program outcome.
|
|
||||||
if (unexpectedly_failed_tests == 0)
|
|
||||||
ret_val = 0;
|
|
||||||
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
|
@ -1,250 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""fuse_gtest_files.py v0.2.0
|
|
||||||
Fuses Google Test source code into a .h file and a .cc file.
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
|
|
||||||
|
|
||||||
Scans GTEST_ROOT_DIR for Google Test source code, and generates
|
|
||||||
two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
|
|
||||||
Then you can build your tests by adding OUTPUT_DIR to the include
|
|
||||||
search path and linking with OUTPUT_DIR/gtest/gtest-all.cc. These
|
|
||||||
two files contain everything you need to use Google Test. Hence
|
|
||||||
you can "install" Google Test by copying them to wherever you want.
|
|
||||||
|
|
||||||
GTEST_ROOT_DIR can be omitted and defaults to the parent
|
|
||||||
directory of the directory holding this script.
|
|
||||||
|
|
||||||
EXAMPLES
|
|
||||||
./fuse_gtest_files.py fused_gtest
|
|
||||||
./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
|
|
||||||
|
|
||||||
This tool is experimental. In particular, it assumes that there is no
|
|
||||||
conditional inclusion of Google Test headers. Please report any
|
|
||||||
problems to googletestframework@googlegroups.com. You can read
|
|
||||||
http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
|
|
||||||
more information.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sets
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# We assume that this file is in the scripts/ directory in the Google
|
|
||||||
# Test root directory.
|
|
||||||
DEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
|
|
||||||
|
|
||||||
# Regex for matching '#include "gtest/..."'.
|
|
||||||
INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(gtest/.+)"')
|
|
||||||
|
|
||||||
# Regex for matching '#include "src/..."'.
|
|
||||||
INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
|
|
||||||
|
|
||||||
# Where to find the source seed files.
|
|
||||||
GTEST_H_SEED = 'include/gtest/gtest.h'
|
|
||||||
GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
|
|
||||||
GTEST_ALL_CC_SEED = 'src/gtest-all.cc'
|
|
||||||
|
|
||||||
# Where to put the generated files.
|
|
||||||
GTEST_H_OUTPUT = 'gtest/gtest.h'
|
|
||||||
GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
|
|
||||||
|
|
||||||
|
|
||||||
def VerifyFileExists(directory, relative_path):
|
|
||||||
"""Verifies that the given file exists; aborts on failure.
|
|
||||||
|
|
||||||
relative_path is the file path relative to the given directory.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if not os.path.isfile(os.path.join(directory, relative_path)):
|
|
||||||
print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
|
|
||||||
directory)
|
|
||||||
print ('Please either specify a valid project root directory '
|
|
||||||
'or omit it on the command line.')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def ValidateGTestRootDir(gtest_root):
|
|
||||||
"""Makes sure gtest_root points to a valid gtest root directory.
|
|
||||||
|
|
||||||
The function aborts the program on failure.
|
|
||||||
"""
|
|
||||||
|
|
||||||
VerifyFileExists(gtest_root, GTEST_H_SEED)
|
|
||||||
VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)
|
|
||||||
|
|
||||||
|
|
||||||
def VerifyOutputFile(output_dir, relative_path):
|
|
||||||
"""Verifies that the given output file path is valid.
|
|
||||||
|
|
||||||
relative_path is relative to the output_dir directory.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Makes sure the output file either doesn't exist or can be overwritten.
|
|
||||||
output_file = os.path.join(output_dir, relative_path)
|
|
||||||
if os.path.exists(output_file):
|
|
||||||
# TODO(wan@google.com): The following user-interaction doesn't
|
|
||||||
# work with automated processes. We should provide a way for the
|
|
||||||
# Makefile to force overwriting the files.
|
|
||||||
print ('%s already exists in directory %s - overwrite it? (y/N) ' %
|
|
||||||
(relative_path, output_dir))
|
|
||||||
answer = sys.stdin.readline().strip()
|
|
||||||
if answer not in ['y', 'Y']:
|
|
||||||
print 'ABORTED.'
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Makes sure the directory holding the output file exists; creates
|
|
||||||
# it and all its ancestors if necessary.
|
|
||||||
parent_directory = os.path.dirname(output_file)
|
|
||||||
if not os.path.isdir(parent_directory):
|
|
||||||
os.makedirs(parent_directory)
|
|
||||||
|
|
||||||
|
|
||||||
def ValidateOutputDir(output_dir):
|
|
||||||
"""Makes sure output_dir points to a valid output directory.
|
|
||||||
|
|
||||||
The function aborts the program on failure.
|
|
||||||
"""
|
|
||||||
|
|
||||||
VerifyOutputFile(output_dir, GTEST_H_OUTPUT)
|
|
||||||
VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)
|
|
||||||
|
|
||||||
|
|
||||||
def FuseGTestH(gtest_root, output_dir):
|
|
||||||
"""Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
|
|
||||||
|
|
||||||
output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
|
|
||||||
processed_files = sets.Set() # Holds all gtest headers we've processed.
|
|
||||||
|
|
||||||
def ProcessFile(gtest_header_path):
|
|
||||||
"""Processes the given gtest header file."""
|
|
||||||
|
|
||||||
# We don't process the same header twice.
|
|
||||||
if gtest_header_path in processed_files:
|
|
||||||
return
|
|
||||||
|
|
||||||
processed_files.add(gtest_header_path)
|
|
||||||
|
|
||||||
# Reads each line in the given gtest header.
|
|
||||||
for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
|
|
||||||
m = INCLUDE_GTEST_FILE_REGEX.match(line)
|
|
||||||
if m:
|
|
||||||
# It's '#include "gtest/..."' - let's process it recursively.
|
|
||||||
ProcessFile('include/' + m.group(1))
|
|
||||||
else:
|
|
||||||
# Otherwise we copy the line unchanged to the output file.
|
|
||||||
output_file.write(line)
|
|
||||||
|
|
||||||
ProcessFile(GTEST_H_SEED)
|
|
||||||
output_file.close()
|
|
||||||
|
|
||||||
|
|
||||||
def FuseGTestAllCcToFile(gtest_root, output_file):
|
|
||||||
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
|
|
||||||
|
|
||||||
processed_files = sets.Set()
|
|
||||||
|
|
||||||
def ProcessFile(gtest_source_file):
|
|
||||||
"""Processes the given gtest source file."""
|
|
||||||
|
|
||||||
# We don't process the same #included file twice.
|
|
||||||
if gtest_source_file in processed_files:
|
|
||||||
return
|
|
||||||
|
|
||||||
processed_files.add(gtest_source_file)
|
|
||||||
|
|
||||||
# Reads each line in the given gtest source file.
|
|
||||||
for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
|
|
||||||
m = INCLUDE_GTEST_FILE_REGEX.match(line)
|
|
||||||
if m:
|
|
||||||
if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
|
|
||||||
# It's '#include "gtest/gtest-spi.h"'. This file is not
|
|
||||||
# #included by "gtest/gtest.h", so we need to process it.
|
|
||||||
ProcessFile(GTEST_SPI_H_SEED)
|
|
||||||
else:
|
|
||||||
# It's '#include "gtest/foo.h"' where foo is not gtest-spi.
|
|
||||||
# We treat it as '#include "gtest/gtest.h"', as all other
|
|
||||||
# gtest headers are being fused into gtest.h and cannot be
|
|
||||||
# #included directly.
|
|
||||||
|
|
||||||
# There is no need to #include "gtest/gtest.h" more than once.
|
|
||||||
if not GTEST_H_SEED in processed_files:
|
|
||||||
processed_files.add(GTEST_H_SEED)
|
|
||||||
output_file.write('#include "%s"\n' % (GTEST_H_OUTPUT,))
|
|
||||||
else:
|
|
||||||
m = INCLUDE_SRC_FILE_REGEX.match(line)
|
|
||||||
if m:
|
|
||||||
# It's '#include "src/foo"' - let's process it recursively.
|
|
||||||
ProcessFile(m.group(1))
|
|
||||||
else:
|
|
||||||
output_file.write(line)
|
|
||||||
|
|
||||||
ProcessFile(GTEST_ALL_CC_SEED)
|
|
||||||
|
|
||||||
|
|
||||||
def FuseGTestAllCc(gtest_root, output_dir):
|
|
||||||
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
|
|
||||||
|
|
||||||
output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
|
|
||||||
FuseGTestAllCcToFile(gtest_root, output_file)
|
|
||||||
output_file.close()
|
|
||||||
|
|
||||||
|
|
||||||
def FuseGTest(gtest_root, output_dir):
|
|
||||||
"""Fuses gtest.h and gtest-all.cc."""
|
|
||||||
|
|
||||||
ValidateGTestRootDir(gtest_root)
|
|
||||||
ValidateOutputDir(output_dir)
|
|
||||||
|
|
||||||
FuseGTestH(gtest_root, output_dir)
|
|
||||||
FuseGTestAllCc(gtest_root, output_dir)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argc = len(sys.argv)
|
|
||||||
if argc == 2:
|
|
||||||
# fuse_gtest_files.py OUTPUT_DIR
|
|
||||||
FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])
|
|
||||||
elif argc == 3:
|
|
||||||
# fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
|
|
||||||
FuseGTest(sys.argv[1], sys.argv[2])
|
|
||||||
else:
|
|
||||||
print __doc__
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
|
@ -1,730 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""gen_gtest_pred_impl.py v0.1
|
|
||||||
|
|
||||||
Generates the implementation of Google Test predicate assertions and
|
|
||||||
accompanying tests.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
gen_gtest_pred_impl.py MAX_ARITY
|
|
||||||
|
|
||||||
where MAX_ARITY is a positive integer.
|
|
||||||
|
|
||||||
The command generates the implementation of up-to MAX_ARITY-ary
|
|
||||||
predicate assertions, and writes it to file gtest_pred_impl.h in the
|
|
||||||
directory where the script is. It also generates the accompanying
|
|
||||||
unit test in file gtest_pred_impl_unittest.cc.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
|
|
||||||
# Where this script is.
|
|
||||||
SCRIPT_DIR = os.path.dirname(sys.argv[0])
|
|
||||||
|
|
||||||
# Where to store the generated header.
|
|
||||||
HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
|
|
||||||
|
|
||||||
# Where to store the generated unit test.
|
|
||||||
UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
|
|
||||||
|
|
||||||
|
|
||||||
def HeaderPreamble(n):
|
|
||||||
"""Returns the preamble for the header file.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
n: the maximum arity of the predicate macros to be generated.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# A map that defines the values used in the preamble template.
|
|
||||||
DEFS = {
|
|
||||||
'today' : time.strftime('%m/%d/%Y'),
|
|
||||||
'year' : time.strftime('%Y'),
|
|
||||||
'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
|
|
||||||
'n' : n
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
"""// 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 %(today)s by command
|
|
||||||
// '%(command)s'. 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 %(n)s.
|
|
||||||
// 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())
|
|
||||||
""" % DEFS)
|
|
||||||
|
|
||||||
|
|
||||||
def Arity(n):
|
|
||||||
"""Returns the English name of the given arity."""
|
|
||||||
|
|
||||||
if n < 0:
|
|
||||||
return None
|
|
||||||
elif n <= 3:
|
|
||||||
return ['nullary', 'unary', 'binary', 'ternary'][n]
|
|
||||||
else:
|
|
||||||
return '%s-ary' % n
|
|
||||||
|
|
||||||
|
|
||||||
def Title(word):
|
|
||||||
"""Returns the given word in title case. The difference between
|
|
||||||
this and string's title() method is that Title('4-ary') is '4-ary'
|
|
||||||
while '4-ary'.title() is '4-Ary'."""
|
|
||||||
|
|
||||||
return word[0].upper() + word[1:]
|
|
||||||
|
|
||||||
|
|
||||||
def OneTo(n):
|
|
||||||
"""Returns the list [1, 2, 3, ..., n]."""
|
|
||||||
|
|
||||||
return range(1, n + 1)
|
|
||||||
|
|
||||||
|
|
||||||
def Iter(n, format, sep=''):
|
|
||||||
"""Given a positive integer n, a format string that contains 0 or
|
|
||||||
more '%s' format specs, and optionally a separator string, returns
|
|
||||||
the join of n strings, each formatted with the format string on an
|
|
||||||
iterator ranged from 1 to n.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# How many '%s' specs are in format?
|
|
||||||
spec_count = len(format.split('%s')) - 1
|
|
||||||
return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
|
|
||||||
|
|
||||||
|
|
||||||
def ImplementationForArity(n):
|
|
||||||
"""Returns the implementation of n-ary predicate assertions."""
|
|
||||||
|
|
||||||
# A map the defines the values used in the implementation template.
|
|
||||||
DEFS = {
|
|
||||||
'n' : str(n),
|
|
||||||
'vs' : Iter(n, 'v%s', sep=', '),
|
|
||||||
'vts' : Iter(n, '#v%s', sep=', '),
|
|
||||||
'arity' : Arity(n),
|
|
||||||
'Arity' : Title(Arity(n))
|
|
||||||
}
|
|
||||||
|
|
||||||
impl = """
|
|
||||||
|
|
||||||
// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use
|
|
||||||
// this in your code.
|
|
||||||
template <typename Pred""" % DEFS
|
|
||||||
|
|
||||||
impl += Iter(n, """,
|
|
||||||
typename T%s""")
|
|
||||||
|
|
||||||
impl += """>
|
|
||||||
AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
|
|
||||||
|
|
||||||
impl += Iter(n, """,
|
|
||||||
const char* e%s""")
|
|
||||||
|
|
||||||
impl += """,
|
|
||||||
Pred pred"""
|
|
||||||
|
|
||||||
impl += Iter(n, """,
|
|
||||||
const T%s& v%s""")
|
|
||||||
|
|
||||||
impl += """) {
|
|
||||||
if (pred(%(vs)s)) return AssertionSuccess();
|
|
||||||
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
impl += ' return AssertionFailure() << pred_text << "("'
|
|
||||||
|
|
||||||
impl += Iter(n, """
|
|
||||||
<< e%s""", sep=' << ", "')
|
|
||||||
|
|
||||||
impl += ' << ") evaluates to false, where"'
|
|
||||||
|
|
||||||
impl += Iter(n, """
|
|
||||||
<< "\\n" << e%s << " evaluates to " << v%s""")
|
|
||||||
|
|
||||||
impl += """;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
|
|
||||||
// Don't use this in your code.
|
|
||||||
#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
|
|
||||||
GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\
|
|
||||||
on_failure)
|
|
||||||
|
|
||||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use
|
|
||||||
// this in your code.
|
|
||||||
#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
|
|
||||||
GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
|
|
||||||
|
|
||||||
impl += Iter(n, """, \\
|
|
||||||
#v%s""")
|
|
||||||
|
|
||||||
impl += """, \\
|
|
||||||
pred"""
|
|
||||||
|
|
||||||
impl += Iter(n, """, \\
|
|
||||||
v%s""")
|
|
||||||
|
|
||||||
impl += """), on_failure)
|
|
||||||
|
|
||||||
// %(Arity)s predicate assertion macros.
|
|
||||||
#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
|
|
||||||
GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
|
|
||||||
#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
|
|
||||||
GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
|
|
||||||
#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
|
|
||||||
GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
|
|
||||||
#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
|
|
||||||
GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
|
|
||||||
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
return impl
|
|
||||||
|
|
||||||
|
|
||||||
def HeaderPostamble():
|
|
||||||
"""Returns the postamble for the header file."""
|
|
||||||
|
|
||||||
return """
|
|
||||||
|
|
||||||
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def GenerateFile(path, content):
|
|
||||||
"""Given a file path and a content string, overwrites it with the
|
|
||||||
given content."""
|
|
||||||
|
|
||||||
print 'Updating file %s . . .' % path
|
|
||||||
|
|
||||||
f = file(path, 'w+')
|
|
||||||
print >>f, content,
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
print 'File %s has been updated.' % path
|
|
||||||
|
|
||||||
|
|
||||||
def GenerateHeader(n):
|
|
||||||
"""Given the maximum arity n, updates the header file that implements
|
|
||||||
the predicate assertions."""
|
|
||||||
|
|
||||||
GenerateFile(HEADER,
|
|
||||||
HeaderPreamble(n)
|
|
||||||
+ ''.join([ImplementationForArity(i) for i in OneTo(n)])
|
|
||||||
+ HeaderPostamble())
|
|
||||||
|
|
||||||
|
|
||||||
def UnitTestPreamble():
|
|
||||||
"""Returns the preamble for the unit test file."""
|
|
||||||
|
|
||||||
# A map that defines the values used in the preamble template.
|
|
||||||
DEFS = {
|
|
||||||
'today' : time.strftime('%m/%d/%Y'),
|
|
||||||
'year' : time.strftime('%Y'),
|
|
||||||
'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
"""// 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 %(today)s by command
|
|
||||||
// '%(command)s'. DO NOT EDIT BY HAND!
|
|
||||||
|
|
||||||
// Regression test for gtest_pred_impl.h
|
|
||||||
//
|
|
||||||
// This file is generated by a script and quite long. If you intend to
|
|
||||||
// learn how Google Test works by reading its unit tests, read
|
|
||||||
// gtest_unittest.cc instead.
|
|
||||||
//
|
|
||||||
// This is intended as a regression test for the Google Test predicate
|
|
||||||
// assertions. We compile it as part of the gtest_unittest target
|
|
||||||
// only to keep the implementation tidy and compact, as it is quite
|
|
||||||
// involved to set up the stage for testing Google Test using Google
|
|
||||||
// Test itself.
|
|
||||||
//
|
|
||||||
// Currently, gtest_unittest takes ~11 seconds to run in the testing
|
|
||||||
// daemon. In the future, if it grows too large and needs much more
|
|
||||||
// time to finish, we should consider separating this file into a
|
|
||||||
// stand-alone regression test.
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
#include "gtest/gtest-spi.h"
|
|
||||||
|
|
||||||
// A user-defined data type.
|
|
||||||
struct Bool {
|
|
||||||
explicit Bool(int val) : value(val != 0) {}
|
|
||||||
|
|
||||||
bool operator>(int n) const { return value > Bool(n).value; }
|
|
||||||
|
|
||||||
Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
|
|
||||||
|
|
||||||
bool operator==(const Bool& rhs) const { return value == rhs.value; }
|
|
||||||
|
|
||||||
bool value;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Enables Bool to be used in assertions.
|
|
||||||
std::ostream& operator<<(std::ostream& os, const Bool& x) {
|
|
||||||
return os << (x.value ? "true" : "false");
|
|
||||||
}
|
|
||||||
|
|
||||||
""" % DEFS)
|
|
||||||
|
|
||||||
|
|
||||||
def TestsForArity(n):
|
|
||||||
"""Returns the tests for n-ary predicate assertions."""
|
|
||||||
|
|
||||||
# A map that defines the values used in the template for the tests.
|
|
||||||
DEFS = {
|
|
||||||
'n' : n,
|
|
||||||
'es' : Iter(n, 'e%s', sep=', '),
|
|
||||||
'vs' : Iter(n, 'v%s', sep=', '),
|
|
||||||
'vts' : Iter(n, '#v%s', sep=', '),
|
|
||||||
'tvs' : Iter(n, 'T%s v%s', sep=', '),
|
|
||||||
'int_vs' : Iter(n, 'int v%s', sep=', '),
|
|
||||||
'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
|
|
||||||
'types' : Iter(n, 'typename T%s', sep=', '),
|
|
||||||
'v_sum' : Iter(n, 'v%s', sep=' + '),
|
|
||||||
'arity' : Arity(n),
|
|
||||||
'Arity' : Title(Arity(n)),
|
|
||||||
}
|
|
||||||
|
|
||||||
tests = (
|
|
||||||
"""// Sample functions/functors for testing %(arity)s predicate assertions.
|
|
||||||
|
|
||||||
// A %(arity)s predicate function.
|
|
||||||
template <%(types)s>
|
|
||||||
bool PredFunction%(n)s(%(tvs)s) {
|
|
||||||
return %(v_sum)s > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The following two functions are needed to circumvent a bug in
|
|
||||||
// gcc 2.95.3, which sometimes has problem with the above template
|
|
||||||
// function.
|
|
||||||
bool PredFunction%(n)sInt(%(int_vs)s) {
|
|
||||||
return %(v_sum)s > 0;
|
|
||||||
}
|
|
||||||
bool PredFunction%(n)sBool(%(Bool_vs)s) {
|
|
||||||
return %(v_sum)s > 0;
|
|
||||||
}
|
|
||||||
""" % DEFS)
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
// A %(arity)s predicate functor.
|
|
||||||
struct PredFunctor%(n)s {
|
|
||||||
template <%(types)s>
|
|
||||||
bool operator()(""" % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, 'const T%s& v%s', sep=""",
|
|
||||||
""")
|
|
||||||
|
|
||||||
tests += """) {
|
|
||||||
return %(v_sum)s > 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
// A %(arity)s predicate-formatter function.
|
|
||||||
template <%(types)s>
|
|
||||||
testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, 'const char* e%s', sep=""",
|
|
||||||
""")
|
|
||||||
|
|
||||||
tests += Iter(n, """,
|
|
||||||
const T%s& v%s""")
|
|
||||||
|
|
||||||
tests += """) {
|
|
||||||
if (PredFunction%(n)s(%(vs)s))
|
|
||||||
return testing::AssertionSuccess();
|
|
||||||
|
|
||||||
return testing::AssertionFailure()
|
|
||||||
<< """ % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, 'e%s', sep=' << " + " << ')
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
<< " is expected to be positive, but evaluates to "
|
|
||||||
<< %(v_sum)s << ".";
|
|
||||||
}
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
// A %(arity)s predicate-formatter functor.
|
|
||||||
struct PredFormatFunctor%(n)s {
|
|
||||||
template <%(types)s>
|
|
||||||
testing::AssertionResult operator()(""" % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, 'const char* e%s', sep=""",
|
|
||||||
""")
|
|
||||||
|
|
||||||
tests += Iter(n, """,
|
|
||||||
const T%s& v%s""")
|
|
||||||
|
|
||||||
tests += """) const {
|
|
||||||
return PredFormatFunction%(n)s(%(es)s, %(vs)s);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
|
|
||||||
|
|
||||||
class Predicate%(n)sTest : public testing::Test {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
expected_to_finish_ = true;
|
|
||||||
finished_ = false;""" % DEFS
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
""" + Iter(n, 'n%s_ = ') + """0;
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
virtual void TearDown() {
|
|
||||||
// Verifies that each of the predicate's arguments was evaluated
|
|
||||||
// exactly once."""
|
|
||||||
|
|
||||||
tests += ''.join(["""
|
|
||||||
EXPECT_EQ(1, n%s_) <<
|
|
||||||
"The predicate assertion didn't evaluate argument %s "
|
|
||||||
"exactly once.";""" % (i, i + 1) for i in OneTo(n)])
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
|
|
||||||
// Verifies that the control flow in the test function is expected.
|
|
||||||
if (expected_to_finish_ && !finished_) {
|
|
||||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
|
||||||
} else if (!expected_to_finish_ && finished_) {
|
|
||||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
|
||||||
"as expected.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// true iff the test function is expected to run to finish.
|
|
||||||
static bool expected_to_finish_;
|
|
||||||
|
|
||||||
// true iff the test function did run to finish.
|
|
||||||
static bool finished_;
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, """
|
|
||||||
static int n%s_;""")
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
};
|
|
||||||
|
|
||||||
bool Predicate%(n)sTest::expected_to_finish_;
|
|
||||||
bool Predicate%(n)sTest::finished_;
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
|
|
||||||
""") % DEFS
|
|
||||||
|
|
||||||
tests += """
|
|
||||||
typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
|
|
||||||
typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
|
|
||||||
typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
|
|
||||||
typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
|
|
||||||
""" % DEFS
|
|
||||||
|
|
||||||
def GenTest(use_format, use_assert, expect_failure,
|
|
||||||
use_functor, use_user_type):
|
|
||||||
"""Returns the test for a predicate assertion macro.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
use_format: true iff the assertion is a *_PRED_FORMAT*.
|
|
||||||
use_assert: true iff the assertion is a ASSERT_*.
|
|
||||||
expect_failure: true iff the assertion is expected to fail.
|
|
||||||
use_functor: true iff the first argument of the assertion is
|
|
||||||
a functor (as opposed to a function)
|
|
||||||
use_user_type: true iff the predicate functor/function takes
|
|
||||||
argument(s) of a user-defined type.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
|
|
||||||
of a successful EXPECT_PRED_FORMATn() that takes a functor
|
|
||||||
whose arguments have built-in types."""
|
|
||||||
|
|
||||||
if use_assert:
|
|
||||||
assrt = 'ASSERT' # 'assert' is reserved, so we cannot use
|
|
||||||
# that identifier here.
|
|
||||||
else:
|
|
||||||
assrt = 'EXPECT'
|
|
||||||
|
|
||||||
assertion = assrt + '_PRED'
|
|
||||||
|
|
||||||
if use_format:
|
|
||||||
pred_format = 'PredFormat'
|
|
||||||
assertion += '_FORMAT'
|
|
||||||
else:
|
|
||||||
pred_format = 'Pred'
|
|
||||||
|
|
||||||
assertion += '%(n)s' % DEFS
|
|
||||||
|
|
||||||
if use_functor:
|
|
||||||
pred_format_type = 'functor'
|
|
||||||
pred_format += 'Functor%(n)s()'
|
|
||||||
else:
|
|
||||||
pred_format_type = 'function'
|
|
||||||
pred_format += 'Function%(n)s'
|
|
||||||
if not use_format:
|
|
||||||
if use_user_type:
|
|
||||||
pred_format += 'Bool'
|
|
||||||
else:
|
|
||||||
pred_format += 'Int'
|
|
||||||
|
|
||||||
test_name = pred_format_type.title()
|
|
||||||
|
|
||||||
if use_user_type:
|
|
||||||
arg_type = 'user-defined type (Bool)'
|
|
||||||
test_name += 'OnUserType'
|
|
||||||
if expect_failure:
|
|
||||||
arg = 'Bool(n%s_++)'
|
|
||||||
else:
|
|
||||||
arg = 'Bool(++n%s_)'
|
|
||||||
else:
|
|
||||||
arg_type = 'built-in type (int)'
|
|
||||||
test_name += 'OnBuiltInType'
|
|
||||||
if expect_failure:
|
|
||||||
arg = 'n%s_++'
|
|
||||||
else:
|
|
||||||
arg = '++n%s_'
|
|
||||||
|
|
||||||
if expect_failure:
|
|
||||||
successful_or_failed = 'failed'
|
|
||||||
expected_or_not = 'expected.'
|
|
||||||
test_name += 'Failure'
|
|
||||||
else:
|
|
||||||
successful_or_failed = 'successful'
|
|
||||||
expected_or_not = 'UNEXPECTED!'
|
|
||||||
test_name += 'Success'
|
|
||||||
|
|
||||||
# A map that defines the values used in the test template.
|
|
||||||
defs = DEFS.copy()
|
|
||||||
defs.update({
|
|
||||||
'assert' : assrt,
|
|
||||||
'assertion' : assertion,
|
|
||||||
'test_name' : test_name,
|
|
||||||
'pf_type' : pred_format_type,
|
|
||||||
'pf' : pred_format,
|
|
||||||
'arg_type' : arg_type,
|
|
||||||
'arg' : arg,
|
|
||||||
'successful' : successful_or_failed,
|
|
||||||
'expected' : expected_or_not,
|
|
||||||
})
|
|
||||||
|
|
||||||
test = """
|
|
||||||
// Tests a %(successful)s %(assertion)s where the
|
|
||||||
// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
|
|
||||||
TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
|
|
||||||
|
|
||||||
indent = (len(assertion) + 3)*' '
|
|
||||||
extra_indent = ''
|
|
||||||
|
|
||||||
if expect_failure:
|
|
||||||
extra_indent = ' '
|
|
||||||
if use_assert:
|
|
||||||
test += """
|
|
||||||
expected_to_finish_ = false;
|
|
||||||
EXPECT_FATAL_FAILURE({ // NOLINT"""
|
|
||||||
else:
|
|
||||||
test += """
|
|
||||||
EXPECT_NONFATAL_FAILURE({ // NOLINT"""
|
|
||||||
|
|
||||||
test += '\n' + extra_indent + """ %(assertion)s(%(pf)s""" % defs
|
|
||||||
|
|
||||||
test = test % defs
|
|
||||||
test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
|
|
||||||
test += ');\n' + extra_indent + ' finished_ = true;\n'
|
|
||||||
|
|
||||||
if expect_failure:
|
|
||||||
test += ' }, "");\n'
|
|
||||||
|
|
||||||
test += '}\n'
|
|
||||||
return test
|
|
||||||
|
|
||||||
# Generates tests for all 2**6 = 64 combinations.
|
|
||||||
tests += ''.join([GenTest(use_format, use_assert, expect_failure,
|
|
||||||
use_functor, use_user_type)
|
|
||||||
for use_format in [0, 1]
|
|
||||||
for use_assert in [0, 1]
|
|
||||||
for expect_failure in [0, 1]
|
|
||||||
for use_functor in [0, 1]
|
|
||||||
for use_user_type in [0, 1]
|
|
||||||
])
|
|
||||||
|
|
||||||
return tests
|
|
||||||
|
|
||||||
|
|
||||||
def UnitTestPostamble():
|
|
||||||
"""Returns the postamble for the tests."""
|
|
||||||
|
|
||||||
return ''
|
|
||||||
|
|
||||||
|
|
||||||
def GenerateUnitTest(n):
|
|
||||||
"""Returns the tests for up-to n-ary predicate assertions."""
|
|
||||||
|
|
||||||
GenerateFile(UNIT_TEST,
|
|
||||||
UnitTestPreamble()
|
|
||||||
+ ''.join([TestsForArity(i) for i in OneTo(n)])
|
|
||||||
+ UnitTestPostamble())
|
|
||||||
|
|
||||||
|
|
||||||
def _Main():
|
|
||||||
"""The entry point of the script. Generates the header file and its
|
|
||||||
unit test."""
|
|
||||||
|
|
||||||
if len(sys.argv) != 2:
|
|
||||||
print __doc__
|
|
||||||
print 'Author: ' + __author__
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
n = int(sys.argv[1])
|
|
||||||
GenerateHeader(n)
|
|
||||||
GenerateUnitTest(n)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
_Main()
|
|
|
@ -1,274 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# These variables are automatically filled in by the configure script.
|
|
||||||
name="@PACKAGE_TARNAME@"
|
|
||||||
version="@PACKAGE_VERSION@"
|
|
||||||
|
|
||||||
show_usage()
|
|
||||||
{
|
|
||||||
echo "Usage: gtest-config [OPTIONS...]"
|
|
||||||
}
|
|
||||||
|
|
||||||
show_help()
|
|
||||||
{
|
|
||||||
show_usage
|
|
||||||
cat <<\EOF
|
|
||||||
|
|
||||||
The `gtest-config' script provides access to the necessary compile and linking
|
|
||||||
flags to connect with Google C++ Testing Framework, both in a build prior to
|
|
||||||
installation, and on the system proper after installation. The installation
|
|
||||||
overrides may be issued in combination with any other queries, but will only
|
|
||||||
affect installation queries if called on a built but not installed gtest. The
|
|
||||||
installation queries may not be issued with any other types of queries, and
|
|
||||||
only one installation query may be made at a time. The version queries and
|
|
||||||
compiler flag queries may be combined as desired but not mixed. Different
|
|
||||||
version queries are always combined with logical "and" semantics, and only the
|
|
||||||
last of any particular query is used while all previous ones ignored. All
|
|
||||||
versions must be specified as a sequence of numbers separated by periods.
|
|
||||||
Compiler flag queries output the union of the sets of flags when combined.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
|
|
||||||
|
|
||||||
g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
|
|
||||||
g++ $(gtest-config --ldflags --libs) -o foo foo.o
|
|
||||||
|
|
||||||
# When using a built but not installed Google Test:
|
|
||||||
g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
|
|
||||||
|
|
||||||
# When using an installed Google Test, but with installation overrides:
|
|
||||||
export GTEST_PREFIX="/opt"
|
|
||||||
g++ $(gtest-config --libdir="/opt/lib64" ...) ...
|
|
||||||
|
|
||||||
Help:
|
|
||||||
--usage brief usage information
|
|
||||||
--help display this help message
|
|
||||||
|
|
||||||
Installation Overrides:
|
|
||||||
--prefix=<dir> overrides the installation prefix
|
|
||||||
--exec-prefix=<dir> overrides the executable installation prefix
|
|
||||||
--libdir=<dir> overrides the library installation prefix
|
|
||||||
--includedir=<dir> overrides the header file installation prefix
|
|
||||||
|
|
||||||
Installation Queries:
|
|
||||||
--prefix installation prefix
|
|
||||||
--exec-prefix executable installation prefix
|
|
||||||
--libdir library installation directory
|
|
||||||
--includedir header file installation directory
|
|
||||||
--version the version of the Google Test installation
|
|
||||||
|
|
||||||
Version Queries:
|
|
||||||
--min-version=VERSION return 0 if the version is at least VERSION
|
|
||||||
--exact-version=VERSION return 0 if the version is exactly VERSION
|
|
||||||
--max-version=VERSION return 0 if the version is at most VERSION
|
|
||||||
|
|
||||||
Compilation Flag Queries:
|
|
||||||
--cppflags compile flags specific to the C-like preprocessors
|
|
||||||
--cxxflags compile flags appropriate for C++ programs
|
|
||||||
--ldflags linker flags
|
|
||||||
--libs libraries for linking
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
# This function bounds our version with a min and a max. It uses some clever
|
|
||||||
# POSIX-compliant variable expansion to portably do all the work in the shell
|
|
||||||
# and avoid any dependency on a particular "sed" or "awk" implementation.
|
|
||||||
# Notable is that it will only ever compare the first 3 components of versions.
|
|
||||||
# Further components will be cleanly stripped off. All versions must be
|
|
||||||
# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
|
|
||||||
# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should
|
|
||||||
# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
|
|
||||||
# continuing to maintain our own shell version.
|
|
||||||
check_versions()
|
|
||||||
{
|
|
||||||
major_version=${version%%.*}
|
|
||||||
minor_version="0"
|
|
||||||
point_version="0"
|
|
||||||
if test "${version#*.}" != "${version}"; then
|
|
||||||
minor_version=${version#*.}
|
|
||||||
minor_version=${minor_version%%.*}
|
|
||||||
fi
|
|
||||||
if test "${version#*.*.}" != "${version}"; then
|
|
||||||
point_version=${version#*.*.}
|
|
||||||
point_version=${point_version%%.*}
|
|
||||||
fi
|
|
||||||
|
|
||||||
min_version="$1"
|
|
||||||
min_major_version=${min_version%%.*}
|
|
||||||
min_minor_version="0"
|
|
||||||
min_point_version="0"
|
|
||||||
if test "${min_version#*.}" != "${min_version}"; then
|
|
||||||
min_minor_version=${min_version#*.}
|
|
||||||
min_minor_version=${min_minor_version%%.*}
|
|
||||||
fi
|
|
||||||
if test "${min_version#*.*.}" != "${min_version}"; then
|
|
||||||
min_point_version=${min_version#*.*.}
|
|
||||||
min_point_version=${min_point_version%%.*}
|
|
||||||
fi
|
|
||||||
|
|
||||||
max_version="$2"
|
|
||||||
max_major_version=${max_version%%.*}
|
|
||||||
max_minor_version="0"
|
|
||||||
max_point_version="0"
|
|
||||||
if test "${max_version#*.}" != "${max_version}"; then
|
|
||||||
max_minor_version=${max_version#*.}
|
|
||||||
max_minor_version=${max_minor_version%%.*}
|
|
||||||
fi
|
|
||||||
if test "${max_version#*.*.}" != "${max_version}"; then
|
|
||||||
max_point_version=${max_version#*.*.}
|
|
||||||
max_point_version=${max_point_version%%.*}
|
|
||||||
fi
|
|
||||||
|
|
||||||
test $(($major_version)) -lt $(($min_major_version)) && exit 1
|
|
||||||
if test $(($major_version)) -eq $(($min_major_version)); then
|
|
||||||
test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
|
|
||||||
if test $(($minor_version)) -eq $(($min_minor_version)); then
|
|
||||||
test $(($point_version)) -lt $(($min_point_version)) && exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
test $(($major_version)) -gt $(($max_major_version)) && exit 1
|
|
||||||
if test $(($major_version)) -eq $(($max_major_version)); then
|
|
||||||
test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
|
|
||||||
if test $(($minor_version)) -eq $(($max_minor_version)); then
|
|
||||||
test $(($point_version)) -gt $(($max_point_version)) && exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show the usage line when no arguments are specified.
|
|
||||||
if test $# -eq 0; then
|
|
||||||
show_usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
while test $# -gt 0; do
|
|
||||||
case $1 in
|
|
||||||
--usage) show_usage; exit 0;;
|
|
||||||
--help) show_help; exit 0;;
|
|
||||||
|
|
||||||
# Installation overrides
|
|
||||||
--prefix=*) GTEST_PREFIX=${1#--prefix=};;
|
|
||||||
--exec-prefix=*) GTEST_EXEC_PREFIX=${1#--exec-prefix=};;
|
|
||||||
--libdir=*) GTEST_LIBDIR=${1#--libdir=};;
|
|
||||||
--includedir=*) GTEST_INCLUDEDIR=${1#--includedir=};;
|
|
||||||
|
|
||||||
# Installation queries
|
|
||||||
--prefix|--exec-prefix|--libdir|--includedir|--version)
|
|
||||||
if test -n "${do_query}"; then
|
|
||||||
show_usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
do_query=${1#--}
|
|
||||||
;;
|
|
||||||
|
|
||||||
# Version checking
|
|
||||||
--min-version=*)
|
|
||||||
do_check_versions=yes
|
|
||||||
min_version=${1#--min-version=}
|
|
||||||
;;
|
|
||||||
--max-version=*)
|
|
||||||
do_check_versions=yes
|
|
||||||
max_version=${1#--max-version=}
|
|
||||||
;;
|
|
||||||
--exact-version=*)
|
|
||||||
do_check_versions=yes
|
|
||||||
exact_version=${1#--exact-version=}
|
|
||||||
;;
|
|
||||||
|
|
||||||
# Compiler flag output
|
|
||||||
--cppflags) echo_cppflags=yes;;
|
|
||||||
--cxxflags) echo_cxxflags=yes;;
|
|
||||||
--ldflags) echo_ldflags=yes;;
|
|
||||||
--libs) echo_libs=yes;;
|
|
||||||
|
|
||||||
# Everything else is an error
|
|
||||||
*) show_usage; exit 1;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# These have defaults filled in by the configure script but can also be
|
|
||||||
# overridden by environment variables or command line parameters.
|
|
||||||
prefix="${GTEST_PREFIX:-@prefix@}"
|
|
||||||
exec_prefix="${GTEST_EXEC_PREFIX:-@exec_prefix@}"
|
|
||||||
libdir="${GTEST_LIBDIR:-@libdir@}"
|
|
||||||
includedir="${GTEST_INCLUDEDIR:-@includedir@}"
|
|
||||||
|
|
||||||
# We try and detect if our binary is not located at its installed location. If
|
|
||||||
# it's not, we provide variables pointing to the source and build tree rather
|
|
||||||
# than to the install tree. This allows building against a just-built gtest
|
|
||||||
# rather than an installed gtest.
|
|
||||||
bindir="@bindir@"
|
|
||||||
this_relative_bindir=`dirname $0`
|
|
||||||
this_bindir=`cd ${this_relative_bindir}; pwd -P`
|
|
||||||
if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
|
|
||||||
# The path to the script doesn't end in the bindir sequence from Autoconf,
|
|
||||||
# assume that we are in a build tree.
|
|
||||||
build_dir=`dirname ${this_bindir}`
|
|
||||||
src_dir=`cd ${this_bindir}; cd @top_srcdir@; pwd -P`
|
|
||||||
|
|
||||||
# TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we
|
|
||||||
# should work to remove it, and/or remove libtool altogether, replacing it
|
|
||||||
# with direct references to the library and a link path.
|
|
||||||
gtest_libs="${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
|
|
||||||
gtest_ldflags=""
|
|
||||||
|
|
||||||
# We provide hooks to include from either the source or build dir, where the
|
|
||||||
# build dir is always preferred. This will potentially allow us to write
|
|
||||||
# build rules for generated headers and have them automatically be preferred
|
|
||||||
# over provided versions.
|
|
||||||
gtest_cppflags="-I${build_dir}/include -I${src_dir}/include"
|
|
||||||
gtest_cxxflags="@PTHREAD_CFLAGS@"
|
|
||||||
else
|
|
||||||
# We're using an installed gtest, although it may be staged under some
|
|
||||||
# prefix. Assume (as our own libraries do) that we can resolve the prefix,
|
|
||||||
# and are present in the dynamic link paths.
|
|
||||||
gtest_ldflags="-L${libdir}"
|
|
||||||
gtest_libs="-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
|
|
||||||
gtest_cppflags="-I${includedir}"
|
|
||||||
gtest_cxxflags="@PTHREAD_CFLAGS@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do an installation query if requested.
|
|
||||||
if test -n "$do_query"; then
|
|
||||||
case $do_query in
|
|
||||||
prefix) echo $prefix; exit 0;;
|
|
||||||
exec-prefix) echo $exec_prefix; exit 0;;
|
|
||||||
libdir) echo $libdir; exit 0;;
|
|
||||||
includedir) echo $includedir; exit 0;;
|
|
||||||
version) echo $version; exit 0;;
|
|
||||||
*) show_usage; exit 1;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do a version check if requested.
|
|
||||||
if test "$do_check_versions" = "yes"; then
|
|
||||||
# Make sure we didn't receive a bad combination of parameters.
|
|
||||||
test "$echo_cppflags" = "yes" && show_usage && exit 1
|
|
||||||
test "$echo_cxxflags" = "yes" && show_usage && exit 1
|
|
||||||
test "$echo_ldflags" = "yes" && show_usage && exit 1
|
|
||||||
test "$echo_libs" = "yes" && show_usage && exit 1
|
|
||||||
|
|
||||||
if test "$exact_version" != ""; then
|
|
||||||
check_versions $exact_version $exact_version
|
|
||||||
# unreachable
|
|
||||||
else
|
|
||||||
check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
|
|
||||||
# unreachable
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do the output in the correct order so that these can be used in-line of
|
|
||||||
# a compiler invocation.
|
|
||||||
output=""
|
|
||||||
test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags"
|
|
||||||
test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags"
|
|
||||||
test "$echo_ldflags" = "yes" && output="$output $gtest_ldflags"
|
|
||||||
test "$echo_libs" = "yes" && output="$output $gtest_libs"
|
|
||||||
echo $output
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,855 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""pump v0.2.0 - Pretty Useful for Meta Programming.
|
|
||||||
|
|
||||||
A tool for preprocessor meta programming. Useful for generating
|
|
||||||
repetitive boilerplate code. Especially useful for writing C++
|
|
||||||
classes, functions, macros, and templates that need to work with
|
|
||||||
various number of arguments.
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
pump.py SOURCE_FILE
|
|
||||||
|
|
||||||
EXAMPLES:
|
|
||||||
pump.py foo.cc.pump
|
|
||||||
Converts foo.cc.pump to foo.cc.
|
|
||||||
|
|
||||||
GRAMMAR:
|
|
||||||
CODE ::= ATOMIC_CODE*
|
|
||||||
ATOMIC_CODE ::= $var ID = EXPRESSION
|
|
||||||
| $var ID = [[ CODE ]]
|
|
||||||
| $range ID EXPRESSION..EXPRESSION
|
|
||||||
| $for ID SEPARATOR [[ CODE ]]
|
|
||||||
| $($)
|
|
||||||
| $ID
|
|
||||||
| $(EXPRESSION)
|
|
||||||
| $if EXPRESSION [[ CODE ]] ELSE_BRANCH
|
|
||||||
| [[ CODE ]]
|
|
||||||
| RAW_CODE
|
|
||||||
SEPARATOR ::= RAW_CODE | EMPTY
|
|
||||||
ELSE_BRANCH ::= $else [[ CODE ]]
|
|
||||||
| $elif EXPRESSION [[ CODE ]] ELSE_BRANCH
|
|
||||||
| EMPTY
|
|
||||||
EXPRESSION has Python syntax.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
TOKEN_TABLE = [
|
|
||||||
(re.compile(r'\$var\s+'), '$var'),
|
|
||||||
(re.compile(r'\$elif\s+'), '$elif'),
|
|
||||||
(re.compile(r'\$else\s+'), '$else'),
|
|
||||||
(re.compile(r'\$for\s+'), '$for'),
|
|
||||||
(re.compile(r'\$if\s+'), '$if'),
|
|
||||||
(re.compile(r'\$range\s+'), '$range'),
|
|
||||||
(re.compile(r'\$[_A-Za-z]\w*'), '$id'),
|
|
||||||
(re.compile(r'\$\(\$\)'), '$($)'),
|
|
||||||
(re.compile(r'\$'), '$'),
|
|
||||||
(re.compile(r'\[\[\n?'), '[['),
|
|
||||||
(re.compile(r'\]\]\n?'), ']]'),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Cursor:
|
|
||||||
"""Represents a position (line and column) in a text file."""
|
|
||||||
|
|
||||||
def __init__(self, line=-1, column=-1):
|
|
||||||
self.line = line
|
|
||||||
self.column = column
|
|
||||||
|
|
||||||
def __eq__(self, rhs):
|
|
||||||
return self.line == rhs.line and self.column == rhs.column
|
|
||||||
|
|
||||||
def __ne__(self, rhs):
|
|
||||||
return not self == rhs
|
|
||||||
|
|
||||||
def __lt__(self, rhs):
|
|
||||||
return self.line < rhs.line or (
|
|
||||||
self.line == rhs.line and self.column < rhs.column)
|
|
||||||
|
|
||||||
def __le__(self, rhs):
|
|
||||||
return self < rhs or self == rhs
|
|
||||||
|
|
||||||
def __gt__(self, rhs):
|
|
||||||
return rhs < self
|
|
||||||
|
|
||||||
def __ge__(self, rhs):
|
|
||||||
return rhs <= self
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self == Eof():
|
|
||||||
return 'EOF'
|
|
||||||
else:
|
|
||||||
return '%s(%s)' % (self.line + 1, self.column)
|
|
||||||
|
|
||||||
def __add__(self, offset):
|
|
||||||
return Cursor(self.line, self.column + offset)
|
|
||||||
|
|
||||||
def __sub__(self, offset):
|
|
||||||
return Cursor(self.line, self.column - offset)
|
|
||||||
|
|
||||||
def Clone(self):
|
|
||||||
"""Returns a copy of self."""
|
|
||||||
|
|
||||||
return Cursor(self.line, self.column)
|
|
||||||
|
|
||||||
|
|
||||||
# Special cursor to indicate the end-of-file.
|
|
||||||
def Eof():
|
|
||||||
"""Returns the special cursor to denote the end-of-file."""
|
|
||||||
return Cursor(-1, -1)
|
|
||||||
|
|
||||||
|
|
||||||
class Token:
|
|
||||||
"""Represents a token in a Pump source file."""
|
|
||||||
|
|
||||||
def __init__(self, start=None, end=None, value=None, token_type=None):
|
|
||||||
if start is None:
|
|
||||||
self.start = Eof()
|
|
||||||
else:
|
|
||||||
self.start = start
|
|
||||||
if end is None:
|
|
||||||
self.end = Eof()
|
|
||||||
else:
|
|
||||||
self.end = end
|
|
||||||
self.value = value
|
|
||||||
self.token_type = token_type
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return 'Token @%s: \'%s\' type=%s' % (
|
|
||||||
self.start, self.value, self.token_type)
|
|
||||||
|
|
||||||
def Clone(self):
|
|
||||||
"""Returns a copy of self."""
|
|
||||||
|
|
||||||
return Token(self.start.Clone(), self.end.Clone(), self.value,
|
|
||||||
self.token_type)
|
|
||||||
|
|
||||||
|
|
||||||
def StartsWith(lines, pos, string):
|
|
||||||
"""Returns True iff the given position in lines starts with 'string'."""
|
|
||||||
|
|
||||||
return lines[pos.line][pos.column:].startswith(string)
|
|
||||||
|
|
||||||
|
|
||||||
def FindFirstInLine(line, token_table):
|
|
||||||
best_match_start = -1
|
|
||||||
for (regex, token_type) in token_table:
|
|
||||||
m = regex.search(line)
|
|
||||||
if m:
|
|
||||||
# We found regex in lines
|
|
||||||
if best_match_start < 0 or m.start() < best_match_start:
|
|
||||||
best_match_start = m.start()
|
|
||||||
best_match_length = m.end() - m.start()
|
|
||||||
best_match_token_type = token_type
|
|
||||||
|
|
||||||
if best_match_start < 0:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return (best_match_start, best_match_length, best_match_token_type)
|
|
||||||
|
|
||||||
|
|
||||||
def FindFirst(lines, token_table, cursor):
|
|
||||||
"""Finds the first occurrence of any string in strings in lines."""
|
|
||||||
|
|
||||||
start = cursor.Clone()
|
|
||||||
cur_line_number = cursor.line
|
|
||||||
for line in lines[start.line:]:
|
|
||||||
if cur_line_number == start.line:
|
|
||||||
line = line[start.column:]
|
|
||||||
m = FindFirstInLine(line, token_table)
|
|
||||||
if m:
|
|
||||||
# We found a regex in line.
|
|
||||||
(start_column, length, token_type) = m
|
|
||||||
if cur_line_number == start.line:
|
|
||||||
start_column += start.column
|
|
||||||
found_start = Cursor(cur_line_number, start_column)
|
|
||||||
found_end = found_start + length
|
|
||||||
return MakeToken(lines, found_start, found_end, token_type)
|
|
||||||
cur_line_number += 1
|
|
||||||
# We failed to find str in lines
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def SubString(lines, start, end):
|
|
||||||
"""Returns a substring in lines."""
|
|
||||||
|
|
||||||
if end == Eof():
|
|
||||||
end = Cursor(len(lines) - 1, len(lines[-1]))
|
|
||||||
|
|
||||||
if start >= end:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
if start.line == end.line:
|
|
||||||
return lines[start.line][start.column:end.column]
|
|
||||||
|
|
||||||
result_lines = ([lines[start.line][start.column:]] +
|
|
||||||
lines[start.line + 1:end.line] +
|
|
||||||
[lines[end.line][:end.column]])
|
|
||||||
return ''.join(result_lines)
|
|
||||||
|
|
||||||
|
|
||||||
def StripMetaComments(str):
|
|
||||||
"""Strip meta comments from each line in the given string."""
|
|
||||||
|
|
||||||
# First, completely remove lines containing nothing but a meta
|
|
||||||
# comment, including the trailing \n.
|
|
||||||
str = re.sub(r'^\s*\$\$.*\n', '', str)
|
|
||||||
|
|
||||||
# Then, remove meta comments from contentful lines.
|
|
||||||
return re.sub(r'\s*\$\$.*', '', str)
|
|
||||||
|
|
||||||
|
|
||||||
def MakeToken(lines, start, end, token_type):
|
|
||||||
"""Creates a new instance of Token."""
|
|
||||||
|
|
||||||
return Token(start, end, SubString(lines, start, end), token_type)
|
|
||||||
|
|
||||||
|
|
||||||
def ParseToken(lines, pos, regex, token_type):
|
|
||||||
line = lines[pos.line][pos.column:]
|
|
||||||
m = regex.search(line)
|
|
||||||
if m and not m.start():
|
|
||||||
return MakeToken(lines, pos, pos + m.end(), token_type)
|
|
||||||
else:
|
|
||||||
print 'ERROR: %s expected at %s.' % (token_type, pos)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
ID_REGEX = re.compile(r'[_A-Za-z]\w*')
|
|
||||||
EQ_REGEX = re.compile(r'=')
|
|
||||||
REST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\$\$)')
|
|
||||||
OPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\s*')
|
|
||||||
WHITE_SPACE_REGEX = re.compile(r'\s')
|
|
||||||
DOT_DOT_REGEX = re.compile(r'\.\.')
|
|
||||||
|
|
||||||
|
|
||||||
def Skip(lines, pos, regex):
|
|
||||||
line = lines[pos.line][pos.column:]
|
|
||||||
m = re.search(regex, line)
|
|
||||||
if m and not m.start():
|
|
||||||
return pos + m.end()
|
|
||||||
else:
|
|
||||||
return pos
|
|
||||||
|
|
||||||
|
|
||||||
def SkipUntil(lines, pos, regex, token_type):
|
|
||||||
line = lines[pos.line][pos.column:]
|
|
||||||
m = re.search(regex, line)
|
|
||||||
if m:
|
|
||||||
return pos + m.start()
|
|
||||||
else:
|
|
||||||
print ('ERROR: %s expected on line %s after column %s.' %
|
|
||||||
(token_type, pos.line + 1, pos.column))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def ParseExpTokenInParens(lines, pos):
|
|
||||||
def ParseInParens(pos):
|
|
||||||
pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)
|
|
||||||
pos = Skip(lines, pos, r'\(')
|
|
||||||
pos = Parse(pos)
|
|
||||||
pos = Skip(lines, pos, r'\)')
|
|
||||||
return pos
|
|
||||||
|
|
||||||
def Parse(pos):
|
|
||||||
pos = SkipUntil(lines, pos, r'\(|\)', ')')
|
|
||||||
if SubString(lines, pos, pos + 1) == '(':
|
|
||||||
pos = Parse(pos + 1)
|
|
||||||
pos = Skip(lines, pos, r'\)')
|
|
||||||
return Parse(pos)
|
|
||||||
else:
|
|
||||||
return pos
|
|
||||||
|
|
||||||
start = pos.Clone()
|
|
||||||
pos = ParseInParens(pos)
|
|
||||||
return MakeToken(lines, start, pos, 'exp')
|
|
||||||
|
|
||||||
|
|
||||||
def RStripNewLineFromToken(token):
|
|
||||||
if token.value.endswith('\n'):
|
|
||||||
return Token(token.start, token.end, token.value[:-1], token.token_type)
|
|
||||||
else:
|
|
||||||
return token
|
|
||||||
|
|
||||||
|
|
||||||
def TokenizeLines(lines, pos):
|
|
||||||
while True:
|
|
||||||
found = FindFirst(lines, TOKEN_TABLE, pos)
|
|
||||||
if not found:
|
|
||||||
yield MakeToken(lines, pos, Eof(), 'code')
|
|
||||||
return
|
|
||||||
|
|
||||||
if found.start == pos:
|
|
||||||
prev_token = None
|
|
||||||
prev_token_rstripped = None
|
|
||||||
else:
|
|
||||||
prev_token = MakeToken(lines, pos, found.start, 'code')
|
|
||||||
prev_token_rstripped = RStripNewLineFromToken(prev_token)
|
|
||||||
|
|
||||||
if found.token_type == '$var':
|
|
||||||
if prev_token_rstripped:
|
|
||||||
yield prev_token_rstripped
|
|
||||||
yield found
|
|
||||||
id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
|
|
||||||
yield id_token
|
|
||||||
pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
|
|
||||||
|
|
||||||
eq_token = ParseToken(lines, pos, EQ_REGEX, '=')
|
|
||||||
yield eq_token
|
|
||||||
pos = Skip(lines, eq_token.end, r'\s*')
|
|
||||||
|
|
||||||
if SubString(lines, pos, pos + 2) != '[[':
|
|
||||||
exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')
|
|
||||||
yield exp_token
|
|
||||||
pos = Cursor(exp_token.end.line + 1, 0)
|
|
||||||
elif found.token_type == '$for':
|
|
||||||
if prev_token_rstripped:
|
|
||||||
yield prev_token_rstripped
|
|
||||||
yield found
|
|
||||||
id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
|
|
||||||
yield id_token
|
|
||||||
pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)
|
|
||||||
elif found.token_type == '$range':
|
|
||||||
if prev_token_rstripped:
|
|
||||||
yield prev_token_rstripped
|
|
||||||
yield found
|
|
||||||
id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
|
|
||||||
yield id_token
|
|
||||||
pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
|
|
||||||
|
|
||||||
dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')
|
|
||||||
yield MakeToken(lines, pos, dots_pos, 'exp')
|
|
||||||
yield MakeToken(lines, dots_pos, dots_pos + 2, '..')
|
|
||||||
pos = dots_pos + 2
|
|
||||||
new_pos = Cursor(pos.line + 1, 0)
|
|
||||||
yield MakeToken(lines, pos, new_pos, 'exp')
|
|
||||||
pos = new_pos
|
|
||||||
elif found.token_type == '$':
|
|
||||||
if prev_token:
|
|
||||||
yield prev_token
|
|
||||||
yield found
|
|
||||||
exp_token = ParseExpTokenInParens(lines, found.end)
|
|
||||||
yield exp_token
|
|
||||||
pos = exp_token.end
|
|
||||||
elif (found.token_type == ']]' or found.token_type == '$if' or
|
|
||||||
found.token_type == '$elif' or found.token_type == '$else'):
|
|
||||||
if prev_token_rstripped:
|
|
||||||
yield prev_token_rstripped
|
|
||||||
yield found
|
|
||||||
pos = found.end
|
|
||||||
else:
|
|
||||||
if prev_token:
|
|
||||||
yield prev_token
|
|
||||||
yield found
|
|
||||||
pos = found.end
|
|
||||||
|
|
||||||
|
|
||||||
def Tokenize(s):
|
|
||||||
"""A generator that yields the tokens in the given string."""
|
|
||||||
if s != '':
|
|
||||||
lines = s.splitlines(True)
|
|
||||||
for token in TokenizeLines(lines, Cursor(0, 0)):
|
|
||||||
yield token
|
|
||||||
|
|
||||||
|
|
||||||
class CodeNode:
|
|
||||||
def __init__(self, atomic_code_list=None):
|
|
||||||
self.atomic_code = atomic_code_list
|
|
||||||
|
|
||||||
|
|
||||||
class VarNode:
|
|
||||||
def __init__(self, identifier=None, atomic_code=None):
|
|
||||||
self.identifier = identifier
|
|
||||||
self.atomic_code = atomic_code
|
|
||||||
|
|
||||||
|
|
||||||
class RangeNode:
|
|
||||||
def __init__(self, identifier=None, exp1=None, exp2=None):
|
|
||||||
self.identifier = identifier
|
|
||||||
self.exp1 = exp1
|
|
||||||
self.exp2 = exp2
|
|
||||||
|
|
||||||
|
|
||||||
class ForNode:
|
|
||||||
def __init__(self, identifier=None, sep=None, code=None):
|
|
||||||
self.identifier = identifier
|
|
||||||
self.sep = sep
|
|
||||||
self.code = code
|
|
||||||
|
|
||||||
|
|
||||||
class ElseNode:
|
|
||||||
def __init__(self, else_branch=None):
|
|
||||||
self.else_branch = else_branch
|
|
||||||
|
|
||||||
|
|
||||||
class IfNode:
|
|
||||||
def __init__(self, exp=None, then_branch=None, else_branch=None):
|
|
||||||
self.exp = exp
|
|
||||||
self.then_branch = then_branch
|
|
||||||
self.else_branch = else_branch
|
|
||||||
|
|
||||||
|
|
||||||
class RawCodeNode:
|
|
||||||
def __init__(self, token=None):
|
|
||||||
self.raw_code = token
|
|
||||||
|
|
||||||
|
|
||||||
class LiteralDollarNode:
|
|
||||||
def __init__(self, token):
|
|
||||||
self.token = token
|
|
||||||
|
|
||||||
|
|
||||||
class ExpNode:
|
|
||||||
def __init__(self, token, python_exp):
|
|
||||||
self.token = token
|
|
||||||
self.python_exp = python_exp
|
|
||||||
|
|
||||||
|
|
||||||
def PopFront(a_list):
|
|
||||||
head = a_list[0]
|
|
||||||
a_list[:1] = []
|
|
||||||
return head
|
|
||||||
|
|
||||||
|
|
||||||
def PushFront(a_list, elem):
|
|
||||||
a_list[:0] = [elem]
|
|
||||||
|
|
||||||
|
|
||||||
def PopToken(a_list, token_type=None):
|
|
||||||
token = PopFront(a_list)
|
|
||||||
if token_type is not None and token.token_type != token_type:
|
|
||||||
print 'ERROR: %s expected at %s' % (token_type, token.start)
|
|
||||||
print 'ERROR: %s found instead' % (token,)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return token
|
|
||||||
|
|
||||||
|
|
||||||
def PeekToken(a_list):
|
|
||||||
if not a_list:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return a_list[0]
|
|
||||||
|
|
||||||
|
|
||||||
def ParseExpNode(token):
|
|
||||||
python_exp = re.sub(r'([_A-Za-z]\w*)', r'self.GetValue("\1")', token.value)
|
|
||||||
return ExpNode(token, python_exp)
|
|
||||||
|
|
||||||
|
|
||||||
def ParseElseNode(tokens):
|
|
||||||
def Pop(token_type=None):
|
|
||||||
return PopToken(tokens, token_type)
|
|
||||||
|
|
||||||
next = PeekToken(tokens)
|
|
||||||
if not next:
|
|
||||||
return None
|
|
||||||
if next.token_type == '$else':
|
|
||||||
Pop('$else')
|
|
||||||
Pop('[[')
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
return code_node
|
|
||||||
elif next.token_type == '$elif':
|
|
||||||
Pop('$elif')
|
|
||||||
exp = Pop('code')
|
|
||||||
Pop('[[')
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
inner_else_node = ParseElseNode(tokens)
|
|
||||||
return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])
|
|
||||||
elif not next.value.strip():
|
|
||||||
Pop('code')
|
|
||||||
return ParseElseNode(tokens)
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def ParseAtomicCodeNode(tokens):
|
|
||||||
def Pop(token_type=None):
|
|
||||||
return PopToken(tokens, token_type)
|
|
||||||
|
|
||||||
head = PopFront(tokens)
|
|
||||||
t = head.token_type
|
|
||||||
if t == 'code':
|
|
||||||
return RawCodeNode(head)
|
|
||||||
elif t == '$var':
|
|
||||||
id_token = Pop('id')
|
|
||||||
Pop('=')
|
|
||||||
next = PeekToken(tokens)
|
|
||||||
if next.token_type == 'exp':
|
|
||||||
exp_token = Pop()
|
|
||||||
return VarNode(id_token, ParseExpNode(exp_token))
|
|
||||||
Pop('[[')
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
return VarNode(id_token, code_node)
|
|
||||||
elif t == '$for':
|
|
||||||
id_token = Pop('id')
|
|
||||||
next_token = PeekToken(tokens)
|
|
||||||
if next_token.token_type == 'code':
|
|
||||||
sep_token = next_token
|
|
||||||
Pop('code')
|
|
||||||
else:
|
|
||||||
sep_token = None
|
|
||||||
Pop('[[')
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
return ForNode(id_token, sep_token, code_node)
|
|
||||||
elif t == '$if':
|
|
||||||
exp_token = Pop('code')
|
|
||||||
Pop('[[')
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
else_node = ParseElseNode(tokens)
|
|
||||||
return IfNode(ParseExpNode(exp_token), code_node, else_node)
|
|
||||||
elif t == '$range':
|
|
||||||
id_token = Pop('id')
|
|
||||||
exp1_token = Pop('exp')
|
|
||||||
Pop('..')
|
|
||||||
exp2_token = Pop('exp')
|
|
||||||
return RangeNode(id_token, ParseExpNode(exp1_token),
|
|
||||||
ParseExpNode(exp2_token))
|
|
||||||
elif t == '$id':
|
|
||||||
return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))
|
|
||||||
elif t == '$($)':
|
|
||||||
return LiteralDollarNode(head)
|
|
||||||
elif t == '$':
|
|
||||||
exp_token = Pop('exp')
|
|
||||||
return ParseExpNode(exp_token)
|
|
||||||
elif t == '[[':
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
Pop(']]')
|
|
||||||
return code_node
|
|
||||||
else:
|
|
||||||
PushFront(tokens, head)
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def ParseCodeNode(tokens):
|
|
||||||
atomic_code_list = []
|
|
||||||
while True:
|
|
||||||
if not tokens:
|
|
||||||
break
|
|
||||||
atomic_code_node = ParseAtomicCodeNode(tokens)
|
|
||||||
if atomic_code_node:
|
|
||||||
atomic_code_list.append(atomic_code_node)
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
return CodeNode(atomic_code_list)
|
|
||||||
|
|
||||||
|
|
||||||
def ParseToAST(pump_src_text):
|
|
||||||
"""Convert the given Pump source text into an AST."""
|
|
||||||
tokens = list(Tokenize(pump_src_text))
|
|
||||||
code_node = ParseCodeNode(tokens)
|
|
||||||
return code_node
|
|
||||||
|
|
||||||
|
|
||||||
class Env:
|
|
||||||
def __init__(self):
|
|
||||||
self.variables = []
|
|
||||||
self.ranges = []
|
|
||||||
|
|
||||||
def Clone(self):
|
|
||||||
clone = Env()
|
|
||||||
clone.variables = self.variables[:]
|
|
||||||
clone.ranges = self.ranges[:]
|
|
||||||
return clone
|
|
||||||
|
|
||||||
def PushVariable(self, var, value):
|
|
||||||
# If value looks like an int, store it as an int.
|
|
||||||
try:
|
|
||||||
int_value = int(value)
|
|
||||||
if ('%s' % int_value) == value:
|
|
||||||
value = int_value
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
self.variables[:0] = [(var, value)]
|
|
||||||
|
|
||||||
def PopVariable(self):
|
|
||||||
self.variables[:1] = []
|
|
||||||
|
|
||||||
def PushRange(self, var, lower, upper):
|
|
||||||
self.ranges[:0] = [(var, lower, upper)]
|
|
||||||
|
|
||||||
def PopRange(self):
|
|
||||||
self.ranges[:1] = []
|
|
||||||
|
|
||||||
def GetValue(self, identifier):
|
|
||||||
for (var, value) in self.variables:
|
|
||||||
if identifier == var:
|
|
||||||
return value
|
|
||||||
|
|
||||||
print 'ERROR: meta variable %s is undefined.' % (identifier,)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def EvalExp(self, exp):
|
|
||||||
try:
|
|
||||||
result = eval(exp.python_exp)
|
|
||||||
except Exception, e:
|
|
||||||
print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)
|
|
||||||
print ('ERROR: failed to evaluate meta expression %s at %s' %
|
|
||||||
(exp.python_exp, exp.token.start))
|
|
||||||
sys.exit(1)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def GetRange(self, identifier):
|
|
||||||
for (var, lower, upper) in self.ranges:
|
|
||||||
if identifier == var:
|
|
||||||
return (lower, upper)
|
|
||||||
|
|
||||||
print 'ERROR: range %s is undefined.' % (identifier,)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
class Output:
|
|
||||||
def __init__(self):
|
|
||||||
self.string = ''
|
|
||||||
|
|
||||||
def GetLastLine(self):
|
|
||||||
index = self.string.rfind('\n')
|
|
||||||
if index < 0:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
return self.string[index + 1:]
|
|
||||||
|
|
||||||
def Append(self, s):
|
|
||||||
self.string += s
|
|
||||||
|
|
||||||
|
|
||||||
def RunAtomicCode(env, node, output):
|
|
||||||
if isinstance(node, VarNode):
|
|
||||||
identifier = node.identifier.value.strip()
|
|
||||||
result = Output()
|
|
||||||
RunAtomicCode(env.Clone(), node.atomic_code, result)
|
|
||||||
value = result.string
|
|
||||||
env.PushVariable(identifier, value)
|
|
||||||
elif isinstance(node, RangeNode):
|
|
||||||
identifier = node.identifier.value.strip()
|
|
||||||
lower = int(env.EvalExp(node.exp1))
|
|
||||||
upper = int(env.EvalExp(node.exp2))
|
|
||||||
env.PushRange(identifier, lower, upper)
|
|
||||||
elif isinstance(node, ForNode):
|
|
||||||
identifier = node.identifier.value.strip()
|
|
||||||
if node.sep is None:
|
|
||||||
sep = ''
|
|
||||||
else:
|
|
||||||
sep = node.sep.value
|
|
||||||
(lower, upper) = env.GetRange(identifier)
|
|
||||||
for i in range(lower, upper + 1):
|
|
||||||
new_env = env.Clone()
|
|
||||||
new_env.PushVariable(identifier, i)
|
|
||||||
RunCode(new_env, node.code, output)
|
|
||||||
if i != upper:
|
|
||||||
output.Append(sep)
|
|
||||||
elif isinstance(node, RawCodeNode):
|
|
||||||
output.Append(node.raw_code.value)
|
|
||||||
elif isinstance(node, IfNode):
|
|
||||||
cond = env.EvalExp(node.exp)
|
|
||||||
if cond:
|
|
||||||
RunCode(env.Clone(), node.then_branch, output)
|
|
||||||
elif node.else_branch is not None:
|
|
||||||
RunCode(env.Clone(), node.else_branch, output)
|
|
||||||
elif isinstance(node, ExpNode):
|
|
||||||
value = env.EvalExp(node)
|
|
||||||
output.Append('%s' % (value,))
|
|
||||||
elif isinstance(node, LiteralDollarNode):
|
|
||||||
output.Append('$')
|
|
||||||
elif isinstance(node, CodeNode):
|
|
||||||
RunCode(env.Clone(), node, output)
|
|
||||||
else:
|
|
||||||
print 'BAD'
|
|
||||||
print node
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def RunCode(env, code_node, output):
|
|
||||||
for atomic_code in code_node.atomic_code:
|
|
||||||
RunAtomicCode(env, atomic_code, output)
|
|
||||||
|
|
||||||
|
|
||||||
def IsSingleLineComment(cur_line):
|
|
||||||
return '//' in cur_line
|
|
||||||
|
|
||||||
|
|
||||||
def IsInPreprocessorDirective(prev_lines, cur_line):
|
|
||||||
if cur_line.lstrip().startswith('#'):
|
|
||||||
return True
|
|
||||||
return prev_lines and prev_lines[-1].endswith('\\')
|
|
||||||
|
|
||||||
|
|
||||||
def WrapComment(line, output):
|
|
||||||
loc = line.find('//')
|
|
||||||
before_comment = line[:loc].rstrip()
|
|
||||||
if before_comment == '':
|
|
||||||
indent = loc
|
|
||||||
else:
|
|
||||||
output.append(before_comment)
|
|
||||||
indent = len(before_comment) - len(before_comment.lstrip())
|
|
||||||
prefix = indent*' ' + '// '
|
|
||||||
max_len = 80 - len(prefix)
|
|
||||||
comment = line[loc + 2:].strip()
|
|
||||||
segs = [seg for seg in re.split(r'(\w+\W*)', comment) if seg != '']
|
|
||||||
cur_line = ''
|
|
||||||
for seg in segs:
|
|
||||||
if len((cur_line + seg).rstrip()) < max_len:
|
|
||||||
cur_line += seg
|
|
||||||
else:
|
|
||||||
if cur_line.strip() != '':
|
|
||||||
output.append(prefix + cur_line.rstrip())
|
|
||||||
cur_line = seg.lstrip()
|
|
||||||
if cur_line.strip() != '':
|
|
||||||
output.append(prefix + cur_line.strip())
|
|
||||||
|
|
||||||
|
|
||||||
def WrapCode(line, line_concat, output):
|
|
||||||
indent = len(line) - len(line.lstrip())
|
|
||||||
prefix = indent*' ' # Prefix of the current line
|
|
||||||
max_len = 80 - indent - len(line_concat) # Maximum length of the current line
|
|
||||||
new_prefix = prefix + 4*' ' # Prefix of a continuation line
|
|
||||||
new_max_len = max_len - 4 # Maximum length of a continuation line
|
|
||||||
# Prefers to wrap a line after a ',' or ';'.
|
|
||||||
segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']
|
|
||||||
cur_line = '' # The current line without leading spaces.
|
|
||||||
for seg in segs:
|
|
||||||
# If the line is still too long, wrap at a space.
|
|
||||||
while cur_line == '' and len(seg.strip()) > max_len:
|
|
||||||
seg = seg.lstrip()
|
|
||||||
split_at = seg.rfind(' ', 0, max_len)
|
|
||||||
output.append(prefix + seg[:split_at].strip() + line_concat)
|
|
||||||
seg = seg[split_at + 1:]
|
|
||||||
prefix = new_prefix
|
|
||||||
max_len = new_max_len
|
|
||||||
|
|
||||||
if len((cur_line + seg).rstrip()) < max_len:
|
|
||||||
cur_line = (cur_line + seg).lstrip()
|
|
||||||
else:
|
|
||||||
output.append(prefix + cur_line.rstrip() + line_concat)
|
|
||||||
prefix = new_prefix
|
|
||||||
max_len = new_max_len
|
|
||||||
cur_line = seg.lstrip()
|
|
||||||
if cur_line.strip() != '':
|
|
||||||
output.append(prefix + cur_line.strip())
|
|
||||||
|
|
||||||
|
|
||||||
def WrapPreprocessorDirective(line, output):
|
|
||||||
WrapCode(line, ' \\', output)
|
|
||||||
|
|
||||||
|
|
||||||
def WrapPlainCode(line, output):
|
|
||||||
WrapCode(line, '', output)
|
|
||||||
|
|
||||||
|
|
||||||
def IsMultiLineIWYUPragma(line):
|
|
||||||
return re.search(r'/\* IWYU pragma: ', line)
|
|
||||||
|
|
||||||
|
|
||||||
def IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
|
|
||||||
return (re.match(r'^#(ifndef|define|endif\s*//)\s*[\w_]+\s*$', line) or
|
|
||||||
re.match(r'^#include\s', line) or
|
|
||||||
# Don't break IWYU pragmas, either; that causes iwyu.py problems.
|
|
||||||
re.search(r'// IWYU pragma: ', line))
|
|
||||||
|
|
||||||
|
|
||||||
def WrapLongLine(line, output):
|
|
||||||
line = line.rstrip()
|
|
||||||
if len(line) <= 80:
|
|
||||||
output.append(line)
|
|
||||||
elif IsSingleLineComment(line):
|
|
||||||
if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
|
|
||||||
# The style guide made an exception to allow long header guard lines,
|
|
||||||
# includes and IWYU pragmas.
|
|
||||||
output.append(line)
|
|
||||||
else:
|
|
||||||
WrapComment(line, output)
|
|
||||||
elif IsInPreprocessorDirective(output, line):
|
|
||||||
if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
|
|
||||||
# The style guide made an exception to allow long header guard lines,
|
|
||||||
# includes and IWYU pragmas.
|
|
||||||
output.append(line)
|
|
||||||
else:
|
|
||||||
WrapPreprocessorDirective(line, output)
|
|
||||||
elif IsMultiLineIWYUPragma(line):
|
|
||||||
output.append(line)
|
|
||||||
else:
|
|
||||||
WrapPlainCode(line, output)
|
|
||||||
|
|
||||||
|
|
||||||
def BeautifyCode(string):
|
|
||||||
lines = string.splitlines()
|
|
||||||
output = []
|
|
||||||
for line in lines:
|
|
||||||
WrapLongLine(line, output)
|
|
||||||
output2 = [line.rstrip() for line in output]
|
|
||||||
return '\n'.join(output2) + '\n'
|
|
||||||
|
|
||||||
|
|
||||||
def ConvertFromPumpSource(src_text):
|
|
||||||
"""Return the text generated from the given Pump source text."""
|
|
||||||
ast = ParseToAST(StripMetaComments(src_text))
|
|
||||||
output = Output()
|
|
||||||
RunCode(Env(), ast, output)
|
|
||||||
return BeautifyCode(output.string)
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
|
||||||
if len(argv) == 1:
|
|
||||||
print __doc__
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
file_path = argv[-1]
|
|
||||||
output_str = ConvertFromPumpSource(file(file_path, 'r').read())
|
|
||||||
if file_path.endswith('.pump'):
|
|
||||||
output_file_path = file_path[:-5]
|
|
||||||
else:
|
|
||||||
output_file_path = '-'
|
|
||||||
if output_file_path == '-':
|
|
||||||
print output_str,
|
|
||||||
else:
|
|
||||||
output_file = file(output_file_path, 'w')
|
|
||||||
output_file.write('// This file was GENERATED by command:\n')
|
|
||||||
output_file.write('// %s %s\n' %
|
|
||||||
(os.path.basename(__file__), os.path.basename(file_path)))
|
|
||||||
output_file.write('// DO NOT EDIT BY HAND!!!\n\n')
|
|
||||||
output_file.write(output_str)
|
|
||||||
output_file.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main(sys.argv)
|
|
|
@ -1,59 +0,0 @@
|
||||||
# A Makefile for fusing Google Test and building a sample test against it.
|
|
||||||
#
|
|
||||||
# SYNOPSIS:
|
|
||||||
#
|
|
||||||
# make [all] - makes everything.
|
|
||||||
# make TARGET - makes the given target.
|
|
||||||
# make check - makes everything and runs the built sample test.
|
|
||||||
# make clean - removes all files generated by make.
|
|
||||||
|
|
||||||
# Points to the root of fused Google Test, relative to where this file is.
|
|
||||||
FUSED_GTEST_DIR = output
|
|
||||||
|
|
||||||
# Paths to the fused gtest files.
|
|
||||||
FUSED_GTEST_H = $(FUSED_GTEST_DIR)/gtest/gtest.h
|
|
||||||
FUSED_GTEST_ALL_CC = $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
|
|
||||||
|
|
||||||
# Where to find the sample test.
|
|
||||||
SAMPLE_DIR = ../../samples
|
|
||||||
|
|
||||||
# Where to find gtest_main.cc.
|
|
||||||
GTEST_MAIN_CC = ../../src/gtest_main.cc
|
|
||||||
|
|
||||||
# Flags passed to the preprocessor.
|
|
||||||
# We have no idea here whether pthreads is available in the system, so
|
|
||||||
# disable its use.
|
|
||||||
CPPFLAGS += -I$(FUSED_GTEST_DIR) -DGTEST_HAS_PTHREAD=0
|
|
||||||
|
|
||||||
# Flags passed to the C++ compiler.
|
|
||||||
CXXFLAGS += -g
|
|
||||||
|
|
||||||
all : sample1_unittest
|
|
||||||
|
|
||||||
check : all
|
|
||||||
./sample1_unittest
|
|
||||||
|
|
||||||
clean :
|
|
||||||
rm -rf $(FUSED_GTEST_DIR) sample1_unittest *.o
|
|
||||||
|
|
||||||
$(FUSED_GTEST_H) :
|
|
||||||
../fuse_gtest_files.py $(FUSED_GTEST_DIR)
|
|
||||||
|
|
||||||
$(FUSED_GTEST_ALL_CC) :
|
|
||||||
../fuse_gtest_files.py $(FUSED_GTEST_DIR)
|
|
||||||
|
|
||||||
gtest-all.o : $(FUSED_GTEST_H) $(FUSED_GTEST_ALL_CC)
|
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
|
|
||||||
|
|
||||||
gtest_main.o : $(FUSED_GTEST_H) $(GTEST_MAIN_CC)
|
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_MAIN_CC)
|
|
||||||
|
|
||||||
sample1.o : $(SAMPLE_DIR)/sample1.cc $(SAMPLE_DIR)/sample1.h
|
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1.cc
|
|
||||||
|
|
||||||
sample1_unittest.o : $(SAMPLE_DIR)/sample1_unittest.cc \
|
|
||||||
$(SAMPLE_DIR)/sample1.h $(FUSED_GTEST_H)
|
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1_unittest.cc
|
|
||||||
|
|
||||||
sample1_unittest : sample1.o sample1_unittest.o gtest-all.o gtest_main.o
|
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,78 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""upload_gtest.py v0.1.0 -- uploads a Google Test patch for review.
|
|
||||||
|
|
||||||
This simple wrapper passes all command line flags and
|
|
||||||
--cc=googletestframework@googlegroups.com to upload.py.
|
|
||||||
|
|
||||||
USAGE: upload_gtest.py [options for upload.py]
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
CC_FLAG = '--cc='
|
|
||||||
GTEST_GROUP = 'googletestframework@googlegroups.com'
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
# Finds the path to upload.py, assuming it is in the same directory
|
|
||||||
# as this file.
|
|
||||||
my_dir = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
upload_py_path = os.path.join(my_dir, 'upload.py')
|
|
||||||
|
|
||||||
# Adds Google Test discussion group to the cc line if it's not there
|
|
||||||
# already.
|
|
||||||
upload_py_argv = [upload_py_path]
|
|
||||||
found_cc_flag = False
|
|
||||||
for arg in sys.argv[1:]:
|
|
||||||
if arg.startswith(CC_FLAG):
|
|
||||||
found_cc_flag = True
|
|
||||||
cc_line = arg[len(CC_FLAG):]
|
|
||||||
cc_list = [addr for addr in cc_line.split(',') if addr]
|
|
||||||
if GTEST_GROUP not in cc_list:
|
|
||||||
cc_list.append(GTEST_GROUP)
|
|
||||||
upload_py_argv.append(CC_FLAG + ','.join(cc_list))
|
|
||||||
else:
|
|
||||||
upload_py_argv.append(arg)
|
|
||||||
|
|
||||||
if not found_cc_flag:
|
|
||||||
upload_py_argv.append(CC_FLAG + GTEST_GROUP)
|
|
||||||
|
|
||||||
# Invokes upload.py with the modified command line flags.
|
|
||||||
os.execv(upload_py_path, upload_py_argv)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
1
src/tests/googletest/sources
Submodule
1
src/tests/googletest/sources
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 4650552ff637bb44ecf7784060091cbed3252211
|
|
@ -1,48 +0,0 @@
|
||||||
// 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 "src/gtest.cc"
|
|
||||||
#include "src/gtest-death-test.cc"
|
|
||||||
#include "src/gtest-filepath.cc"
|
|
||||||
#include "src/gtest-port.cc"
|
|
||||||
#include "src/gtest-printers.cc"
|
|
||||||
#include "src/gtest-test-part.cc"
|
|
||||||
#include "src/gtest-typed-test.cc"
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,382 +0,0 @@
|
||||||
// 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
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,805 +0,0 @@
|
||||||
// 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 "src/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
|
|
|
@ -1,363 +0,0 @@
|
||||||
// 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
|
|
|
@ -1,110 +0,0 @@
|
||||||
// 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 "src/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
|
|
|
@ -1,110 +0,0 @@
|
||||||
// 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
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,38 +0,0 @@
|
||||||
// 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();
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
// Copyright 2010, 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)
|
|
||||||
//
|
|
||||||
// Tests that verify interaction of exceptions and death tests.
|
|
||||||
|
|
||||||
#include "gtest/gtest-death-test.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_HAS_DEATH_TEST
|
|
||||||
|
|
||||||
# if GTEST_HAS_SEH
|
|
||||||
# include <windows.h> // For RaiseException().
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# include "gtest/gtest-spi.h"
|
|
||||||
|
|
||||||
# if GTEST_HAS_EXCEPTIONS
|
|
||||||
|
|
||||||
# include <exception> // For std::exception.
|
|
||||||
|
|
||||||
// Tests that death tests report thrown exceptions as failures and that the
|
|
||||||
// exceptions do not escape death test macros.
|
|
||||||
TEST(CxxExceptionDeathTest, ExceptionIsFailure) {
|
|
||||||
try {
|
|
||||||
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
|
|
||||||
} catch (...) { // NOLINT
|
|
||||||
FAIL() << "An exception escaped a death test macro invocation "
|
|
||||||
<< "with catch_exceptions "
|
|
||||||
<< (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TestException : public std::exception {
|
|
||||||
public:
|
|
||||||
virtual const char* what() const throw() { return "exceptional message"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
|
|
||||||
// Verifies that the exception message is quoted in the failure text.
|
|
||||||
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
|
|
||||||
"exceptional message");
|
|
||||||
// Verifies that the location is mentioned in the failure text.
|
|
||||||
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
|
|
||||||
"gtest-death-test_ex_test.cc");
|
|
||||||
}
|
|
||||||
# endif // GTEST_HAS_EXCEPTIONS
|
|
||||||
|
|
||||||
# if GTEST_HAS_SEH
|
|
||||||
// Tests that enabling interception of SEH exceptions with the
|
|
||||||
// catch_exceptions flag does not interfere with SEH exceptions being
|
|
||||||
// treated as death by death tests.
|
|
||||||
TEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
|
|
||||||
EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
|
|
||||||
<< "with catch_exceptions "
|
|
||||||
<< (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
testing::InitGoogleTest(&argc, argv);
|
|
||||||
testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,680 +0,0 @@
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// Google Test filepath utilities
|
|
||||||
//
|
|
||||||
// This file tests classes and functions used internally by
|
|
||||||
// Google Test. They are subject to change without notice.
|
|
||||||
//
|
|
||||||
// This file is #included from gtest_unittest.cc, to avoid changing
|
|
||||||
// build or make-files for some existing Google Test clients. Do not
|
|
||||||
// #include this file anywhere else!
|
|
||||||
|
|
||||||
#include "gtest/internal/gtest-filepath.h"
|
|
||||||
#include "gtest/gtest.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 "src/gtest-internal-inl.h"
|
|
||||||
#undef GTEST_IMPLEMENTATION_
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
# include <windows.h> // NOLINT
|
|
||||||
#elif GTEST_OS_WINDOWS
|
|
||||||
# include <direct.h> // NOLINT
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
namespace testing {
|
|
||||||
namespace internal {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
// TODO(wan@google.com): Move these to the POSIX adapter section in
|
|
||||||
// gtest-port.h.
|
|
||||||
|
|
||||||
// Windows CE doesn't have the remove C function.
|
|
||||||
int remove(const char* path) {
|
|
||||||
LPCWSTR wpath = String::AnsiToUtf16(path);
|
|
||||||
int ret = DeleteFile(wpath) ? 0 : -1;
|
|
||||||
delete [] wpath;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
// Windows CE doesn't have the _rmdir C function.
|
|
||||||
int _rmdir(const char* path) {
|
|
||||||
FilePath filepath(path);
|
|
||||||
LPCWSTR wpath = String::AnsiToUtf16(
|
|
||||||
filepath.RemoveTrailingPathSeparator().c_str());
|
|
||||||
int ret = RemoveDirectory(wpath) ? 0 : -1;
|
|
||||||
delete [] wpath;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
TEST(GetCurrentDirTest, ReturnsCurrentDir) {
|
|
||||||
const FilePath original_dir = FilePath::GetCurrentDir();
|
|
||||||
EXPECT_FALSE(original_dir.IsEmpty());
|
|
||||||
|
|
||||||
posix::ChDir(GTEST_PATH_SEP_);
|
|
||||||
const FilePath cwd = FilePath::GetCurrentDir();
|
|
||||||
posix::ChDir(original_dir.c_str());
|
|
||||||
|
|
||||||
# if GTEST_OS_WINDOWS
|
|
||||||
|
|
||||||
// Skips the ":".
|
|
||||||
const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
|
|
||||||
ASSERT_TRUE(cwd_without_drive != NULL);
|
|
||||||
EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
|
|
||||||
|
|
||||||
# else
|
|
||||||
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
|
|
||||||
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
|
|
||||||
EXPECT_TRUE(FilePath("").IsEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
|
|
||||||
EXPECT_FALSE(FilePath("a").IsEmpty());
|
|
||||||
EXPECT_FALSE(FilePath(".").IsEmpty());
|
|
||||||
EXPECT_FALSE(FilePath("a/b").IsEmpty());
|
|
||||||
EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "" -> ""
|
|
||||||
TEST(RemoveDirectoryNameTest, WhenEmptyName) {
|
|
||||||
EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "afile" -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, ButNoDirectory) {
|
|
||||||
EXPECT_EQ("afile",
|
|
||||||
FilePath("afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "/afile" -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
|
|
||||||
EXPECT_EQ("afile",
|
|
||||||
FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "adir/" -> ""
|
|
||||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
|
|
||||||
EXPECT_EQ("",
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "adir/afile" -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
|
|
||||||
EXPECT_EQ("afile",
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName "adir/subdir/afile" -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
|
|
||||||
EXPECT_EQ("afile",
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
|
|
||||||
.RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#if GTEST_HAS_ALT_PATH_SEP_
|
|
||||||
|
|
||||||
// Tests that RemoveDirectoryName() works with the alternate separator
|
|
||||||
// on Windows.
|
|
||||||
|
|
||||||
// RemoveDirectoryName("/afile") -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName("adir/") -> ""
|
|
||||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName("adir/afile") -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveDirectoryName("adir/subdir/afile") -> "afile"
|
|
||||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("afile",
|
|
||||||
FilePath("adir/subdir/afile").RemoveDirectoryName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// RemoveFileName "" -> "./"
|
|
||||||
TEST(RemoveFileNameTest, EmptyName) {
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
// On Windows CE, we use the root as the current directory.
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
|
|
||||||
#else
|
|
||||||
EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName "adir/" -> "adir/"
|
|
||||||
TEST(RemoveFileNameTest, ButNoFile) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName "adir/afile" -> "adir/"
|
|
||||||
TEST(RemoveFileNameTest, GivesDirName) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
|
|
||||||
TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
|
|
||||||
.RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName "/afile" -> "/"
|
|
||||||
TEST(RemoveFileNameTest, GivesRootDir) {
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_,
|
|
||||||
FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#if GTEST_HAS_ALT_PATH_SEP_
|
|
||||||
|
|
||||||
// Tests that RemoveFileName() works with the alternate separator on
|
|
||||||
// Windows.
|
|
||||||
|
|
||||||
// RemoveFileName("adir/") -> "adir/"
|
|
||||||
TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir/").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName("adir/afile") -> "adir/"
|
|
||||||
TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir/afile").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
|
|
||||||
TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
|
|
||||||
EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
|
|
||||||
FilePath("adir/subdir/afile").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveFileName("/afile") -> "\"
|
|
||||||
TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
|
|
||||||
0, "xml");
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
|
|
||||||
12, "xml");
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
|
|
||||||
FilePath("bar"), 0, "xml");
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
|
|
||||||
FilePath("bar"), 12, "xml");
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
|
|
||||||
0, "xml");
|
|
||||||
EXPECT_EQ("bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
|
|
||||||
FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
|
|
||||||
14, "xml");
|
|
||||||
EXPECT_EQ("bar_14.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
|
|
||||||
FilePath("bar.xml"));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
|
|
||||||
FilePath("bar.xml"));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, Path1BeingEmpty) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath(""),
|
|
||||||
FilePath("bar.xml"));
|
|
||||||
EXPECT_EQ("bar.xml", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, Path2BeingEmpty) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, BothPathBeingEmpty) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath(""),
|
|
||||||
FilePath(""));
|
|
||||||
EXPECT_EQ("", actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, Path1ContainsPathSep) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
|
|
||||||
FilePath("foobar.xml"));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
|
|
||||||
actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, Path2ContainsPathSep) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_),
|
|
||||||
FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
|
|
||||||
actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ConcatPathsTest, Path2EndsWithPathSep) {
|
|
||||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
|
|
||||||
FilePath("bar" GTEST_PATH_SEP_));
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveTrailingPathSeparator "" -> ""
|
|
||||||
TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
|
|
||||||
EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveTrailingPathSeparator "foo" -> "foo"
|
|
||||||
TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
|
|
||||||
EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveTrailingPathSeparator "foo/" -> "foo"
|
|
||||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
|
|
||||||
EXPECT_EQ("foo",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
|
|
||||||
#if GTEST_HAS_ALT_PATH_SEP_
|
|
||||||
EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
|
|
||||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
|
|
||||||
.RemoveTrailingPathSeparator().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
|
|
||||||
TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ "bar")
|
|
||||||
.RemoveTrailingPathSeparator().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(DirectoryTest, RootDirectoryExists) {
|
|
||||||
#if GTEST_OS_WINDOWS // We are on Windows.
|
|
||||||
char current_drive[_MAX_PATH]; // NOLINT
|
|
||||||
current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
|
|
||||||
current_drive[1] = ':';
|
|
||||||
current_drive[2] = '\\';
|
|
||||||
current_drive[3] = '\0';
|
|
||||||
EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
|
|
||||||
#else
|
|
||||||
EXPECT_TRUE(FilePath("/").DirectoryExists());
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
}
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
|
|
||||||
const int saved_drive_ = _getdrive();
|
|
||||||
// Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
|
|
||||||
for (char drive = 'Z'; drive >= 'A'; drive--)
|
|
||||||
if (_chdrive(drive - 'A' + 1) == -1) {
|
|
||||||
char non_drive[_MAX_PATH]; // NOLINT
|
|
||||||
non_drive[0] = drive;
|
|
||||||
non_drive[1] = ':';
|
|
||||||
non_drive[2] = '\\';
|
|
||||||
non_drive[3] = '\0';
|
|
||||||
EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
_chdrive(saved_drive_);
|
|
||||||
}
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
|
|
||||||
#if !GTEST_OS_WINDOWS_MOBILE
|
|
||||||
// Windows CE _does_ consider an empty directory to exist.
|
|
||||||
TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
|
|
||||||
EXPECT_FALSE(FilePath("").DirectoryExists());
|
|
||||||
}
|
|
||||||
#endif // !GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
TEST(DirectoryTest, CurrentDirectoryExists) {
|
|
||||||
#if GTEST_OS_WINDOWS // We are on Windows.
|
|
||||||
# ifndef _WIN32_CE // Windows CE doesn't have a current directory.
|
|
||||||
|
|
||||||
EXPECT_TRUE(FilePath(".").DirectoryExists());
|
|
||||||
EXPECT_TRUE(FilePath(".\\").DirectoryExists());
|
|
||||||
|
|
||||||
# endif // _WIN32_CE
|
|
||||||
#else
|
|
||||||
EXPECT_TRUE(FilePath(".").DirectoryExists());
|
|
||||||
EXPECT_TRUE(FilePath("./").DirectoryExists());
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
}
|
|
||||||
|
|
||||||
// "foo/bar" == foo//bar" == "foo///bar"
|
|
||||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ "bar").string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
|
|
||||||
GTEST_PATH_SEP_ "bar").string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// "/bar" == //bar" == "///bar"
|
|
||||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath(GTEST_PATH_SEP_ "bar").string());
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
|
|
||||||
EXPECT_EQ(GTEST_PATH_SEP_ "bar",
|
|
||||||
FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// "foo/" == foo//" == "foo///"
|
|
||||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_).string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#if GTEST_HAS_ALT_PATH_SEP_
|
|
||||||
|
|
||||||
// Tests that separators at the end of the string are normalized
|
|
||||||
// regardless of their combination (e.g. "foo\" =="foo/\" ==
|
|
||||||
// "foo\\/").
|
|
||||||
TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo/").string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo" GTEST_PATH_SEP_ "/").string());
|
|
||||||
EXPECT_EQ("foo" GTEST_PATH_SEP_,
|
|
||||||
FilePath("foo//" GTEST_PATH_SEP_).string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
|
|
||||||
FilePath default_path;
|
|
||||||
FilePath non_default_path("path");
|
|
||||||
non_default_path = default_path;
|
|
||||||
EXPECT_EQ("", non_default_path.string());
|
|
||||||
EXPECT_EQ("", default_path.string()); // RHS var is unchanged.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
|
|
||||||
FilePath non_default_path("path");
|
|
||||||
FilePath default_path;
|
|
||||||
default_path = non_default_path;
|
|
||||||
EXPECT_EQ("path", default_path.string());
|
|
||||||
EXPECT_EQ("path", non_default_path.string()); // RHS var is unchanged.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
|
|
||||||
const FilePath const_default_path("const_path");
|
|
||||||
FilePath non_default_path("path");
|
|
||||||
non_default_path = const_default_path;
|
|
||||||
EXPECT_EQ("const_path", non_default_path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
class DirectoryCreationTest : public Test {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
testdata_path_.Set(FilePath(
|
|
||||||
TempDir() + GetCurrentExecutableName().string() +
|
|
||||||
"_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
|
|
||||||
testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
|
|
||||||
|
|
||||||
unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
|
|
||||||
0, "txt"));
|
|
||||||
unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
|
|
||||||
1, "txt"));
|
|
||||||
|
|
||||||
remove(testdata_file_.c_str());
|
|
||||||
remove(unique_file0_.c_str());
|
|
||||||
remove(unique_file1_.c_str());
|
|
||||||
posix::RmDir(testdata_path_.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void TearDown() {
|
|
||||||
remove(testdata_file_.c_str());
|
|
||||||
remove(unique_file0_.c_str());
|
|
||||||
remove(unique_file1_.c_str());
|
|
||||||
posix::RmDir(testdata_path_.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TempDir() const {
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
return "\\temp\\";
|
|
||||||
#elif GTEST_OS_WINDOWS
|
|
||||||
const char* temp_dir = posix::GetEnv("TEMP");
|
|
||||||
if (temp_dir == NULL || temp_dir[0] == '\0')
|
|
||||||
return "\\temp\\";
|
|
||||||
else if (temp_dir[strlen(temp_dir) - 1] == '\\')
|
|
||||||
return temp_dir;
|
|
||||||
else
|
|
||||||
return std::string(temp_dir) + "\\";
|
|
||||||
#elif GTEST_OS_LINUX_ANDROID
|
|
||||||
return "/sdcard/";
|
|
||||||
#else
|
|
||||||
return "/tmp/";
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
}
|
|
||||||
|
|
||||||
void CreateTextFile(const char* filename) {
|
|
||||||
FILE* f = posix::FOpen(filename, "w");
|
|
||||||
fprintf(f, "text\n");
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strings representing a directory and a file, with identical paths
|
|
||||||
// except for the trailing separator character that distinquishes
|
|
||||||
// a directory named 'test' from a file named 'test'. Example names:
|
|
||||||
FilePath testdata_path_; // "/tmp/directory_creation/test/"
|
|
||||||
FilePath testdata_file_; // "/tmp/directory_creation/test"
|
|
||||||
FilePath unique_file0_; // "/tmp/directory_creation/test/unique.txt"
|
|
||||||
FilePath unique_file1_; // "/tmp/directory_creation/test/unique_1.txt"
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
|
|
||||||
EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
|
|
||||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
|
||||||
EXPECT_TRUE(testdata_path_.DirectoryExists());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
|
|
||||||
EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
|
|
||||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
|
||||||
// Call 'create' again... should still succeed.
|
|
||||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
|
|
||||||
FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
|
|
||||||
FilePath("unique"), "txt"));
|
|
||||||
EXPECT_EQ(unique_file0_.string(), file_path.string());
|
|
||||||
EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file not there
|
|
||||||
|
|
||||||
testdata_path_.CreateDirectoriesRecursively();
|
|
||||||
EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file still not there
|
|
||||||
CreateTextFile(file_path.c_str());
|
|
||||||
EXPECT_TRUE(file_path.FileOrDirectoryExists());
|
|
||||||
|
|
||||||
FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
|
|
||||||
FilePath("unique"), "txt"));
|
|
||||||
EXPECT_EQ(unique_file1_.string(), file_path2.string());
|
|
||||||
EXPECT_FALSE(file_path2.FileOrDirectoryExists()); // file not there
|
|
||||||
CreateTextFile(file_path2.c_str());
|
|
||||||
EXPECT_TRUE(file_path2.FileOrDirectoryExists());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
|
|
||||||
// force a failure by putting a file where we will try to create a directory.
|
|
||||||
CreateTextFile(testdata_file_.c_str());
|
|
||||||
EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
|
|
||||||
EXPECT_FALSE(testdata_file_.DirectoryExists());
|
|
||||||
EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
|
|
||||||
const FilePath test_detail_xml("test_detail.xml");
|
|
||||||
EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, DefaultConstructor) {
|
|
||||||
FilePath fp;
|
|
||||||
EXPECT_EQ("", fp.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, CharAndCopyConstructors) {
|
|
||||||
const FilePath fp("spicy");
|
|
||||||
EXPECT_EQ("spicy", fp.string());
|
|
||||||
|
|
||||||
const FilePath fp_copy(fp);
|
|
||||||
EXPECT_EQ("spicy", fp_copy.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, StringConstructor) {
|
|
||||||
const FilePath fp(std::string("cider"));
|
|
||||||
EXPECT_EQ("cider", fp.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, Set) {
|
|
||||||
const FilePath apple("apple");
|
|
||||||
FilePath mac("mac");
|
|
||||||
mac.Set(apple); // Implement Set() since overloading operator= is forbidden.
|
|
||||||
EXPECT_EQ("apple", mac.string());
|
|
||||||
EXPECT_EQ("apple", apple.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, ToString) {
|
|
||||||
const FilePath file("drink");
|
|
||||||
EXPECT_EQ("drink", file.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, RemoveExtension) {
|
|
||||||
EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
|
|
||||||
EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
|
|
||||||
EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
|
|
||||||
EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, IsDirectory) {
|
|
||||||
EXPECT_FALSE(FilePath("cola").IsDirectory());
|
|
||||||
EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
|
|
||||||
#if GTEST_HAS_ALT_PATH_SEP_
|
|
||||||
EXPECT_TRUE(FilePath("koala/").IsDirectory());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, IsAbsolutePath) {
|
|
||||||
EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
|
|
||||||
EXPECT_FALSE(FilePath("").IsAbsolutePath());
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
|
|
||||||
GTEST_PATH_SEP_ "relative").IsAbsolutePath());
|
|
||||||
EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
|
|
||||||
EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
|
|
||||||
GTEST_PATH_SEP_ "relative").IsAbsolutePath());
|
|
||||||
#else
|
|
||||||
EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
|
|
||||||
.IsAbsolutePath());
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(FilePathTest, IsRootDirectory) {
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
|
|
||||||
EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
|
|
||||||
EXPECT_TRUE(FilePath("e://").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("b:").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
|
|
||||||
#else
|
|
||||||
EXPECT_TRUE(FilePath("/").IsRootDirectory());
|
|
||||||
EXPECT_TRUE(FilePath("//").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("\\").IsRootDirectory());
|
|
||||||
EXPECT_FALSE(FilePath("/x").IsRootDirectory());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace testing
|
|
|
@ -1,154 +0,0 @@
|
||||||
// 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)
|
|
||||||
// Ported to Windows: Vadim Berman (vadimb@google.com)
|
|
||||||
|
|
||||||
#include "gtest/internal/gtest-linked_ptr.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
using testing::Message;
|
|
||||||
using testing::internal::linked_ptr;
|
|
||||||
|
|
||||||
int num;
|
|
||||||
Message* history = NULL;
|
|
||||||
|
|
||||||
// Class which tracks allocation/deallocation
|
|
||||||
class A {
|
|
||||||
public:
|
|
||||||
A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
|
|
||||||
virtual ~A() { *history << "A" << mynum << " dtor\n"; }
|
|
||||||
virtual void Use() { *history << "A" << mynum << " use\n"; }
|
|
||||||
protected:
|
|
||||||
int mynum;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Subclass
|
|
||||||
class B : public A {
|
|
||||||
public:
|
|
||||||
B() { *history << "B" << mynum << " ctor\n"; }
|
|
||||||
~B() { *history << "B" << mynum << " dtor\n"; }
|
|
||||||
virtual void Use() { *history << "B" << mynum << " use\n"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class LinkedPtrTest : public testing::Test {
|
|
||||||
public:
|
|
||||||
LinkedPtrTest() {
|
|
||||||
num = 0;
|
|
||||||
history = new Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~LinkedPtrTest() {
|
|
||||||
delete history;
|
|
||||||
history = NULL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(LinkedPtrTest, GeneralTest) {
|
|
||||||
{
|
|
||||||
linked_ptr<A> a0, a1, a2;
|
|
||||||
// Use explicit function call notation here to suppress self-assign warning.
|
|
||||||
a0.operator=(a0);
|
|
||||||
a1 = a2;
|
|
||||||
ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
|
|
||||||
ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
|
|
||||||
ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
|
|
||||||
ASSERT_TRUE(a0 == NULL);
|
|
||||||
ASSERT_TRUE(a1 == NULL);
|
|
||||||
ASSERT_TRUE(a2 == NULL);
|
|
||||||
|
|
||||||
{
|
|
||||||
linked_ptr<A> a3(new A);
|
|
||||||
a0 = a3;
|
|
||||||
ASSERT_TRUE(a0 == a3);
|
|
||||||
ASSERT_TRUE(a0 != NULL);
|
|
||||||
ASSERT_TRUE(a0.get() == a3);
|
|
||||||
ASSERT_TRUE(a0 == a3.get());
|
|
||||||
linked_ptr<A> a4(a0);
|
|
||||||
a1 = a4;
|
|
||||||
linked_ptr<A> a5(new A);
|
|
||||||
ASSERT_TRUE(a5.get() != a3);
|
|
||||||
ASSERT_TRUE(a5 != a3.get());
|
|
||||||
a2 = a5;
|
|
||||||
linked_ptr<B> b0(new B);
|
|
||||||
linked_ptr<A> a6(b0);
|
|
||||||
ASSERT_TRUE(b0 == a6);
|
|
||||||
ASSERT_TRUE(a6 == b0);
|
|
||||||
ASSERT_TRUE(b0 != NULL);
|
|
||||||
a5 = b0;
|
|
||||||
a5 = b0;
|
|
||||||
a3->Use();
|
|
||||||
a4->Use();
|
|
||||||
a5->Use();
|
|
||||||
a6->Use();
|
|
||||||
b0->Use();
|
|
||||||
(*b0).Use();
|
|
||||||
b0.get()->Use();
|
|
||||||
}
|
|
||||||
|
|
||||||
a0->Use();
|
|
||||||
a1->Use();
|
|
||||||
a2->Use();
|
|
||||||
|
|
||||||
a1 = a2;
|
|
||||||
a2.reset(new A);
|
|
||||||
a0.reset();
|
|
||||||
|
|
||||||
linked_ptr<A> a7;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_STREQ(
|
|
||||||
"A0 ctor\n"
|
|
||||||
"A1 ctor\n"
|
|
||||||
"A2 ctor\n"
|
|
||||||
"B2 ctor\n"
|
|
||||||
"A0 use\n"
|
|
||||||
"A0 use\n"
|
|
||||||
"B2 use\n"
|
|
||||||
"B2 use\n"
|
|
||||||
"B2 use\n"
|
|
||||||
"B2 use\n"
|
|
||||||
"B2 use\n"
|
|
||||||
"B2 dtor\n"
|
|
||||||
"A2 dtor\n"
|
|
||||||
"A0 use\n"
|
|
||||||
"A0 use\n"
|
|
||||||
"A1 use\n"
|
|
||||||
"A3 ctor\n"
|
|
||||||
"A0 dtor\n"
|
|
||||||
"A3 dtor\n"
|
|
||||||
"A1 dtor\n",
|
|
||||||
history->GetString().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // Unnamed namespace
|
|
|
@ -1,310 +0,0 @@
|
||||||
// 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: vladl@google.com (Vlad Losev)
|
|
||||||
//
|
|
||||||
// The Google C++ Testing Framework (Google Test)
|
|
||||||
//
|
|
||||||
// This file verifies Google Test event listeners receive events at the
|
|
||||||
// right times.
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
using ::testing::AddGlobalTestEnvironment;
|
|
||||||
using ::testing::Environment;
|
|
||||||
using ::testing::InitGoogleTest;
|
|
||||||
using ::testing::Test;
|
|
||||||
using ::testing::TestCase;
|
|
||||||
using ::testing::TestEventListener;
|
|
||||||
using ::testing::TestInfo;
|
|
||||||
using ::testing::TestPartResult;
|
|
||||||
using ::testing::UnitTest;
|
|
||||||
|
|
||||||
// Used by tests to register their events.
|
|
||||||
std::vector<std::string>* g_events = NULL;
|
|
||||||
|
|
||||||
namespace testing {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
class EventRecordingListener : public TestEventListener {
|
|
||||||
public:
|
|
||||||
explicit EventRecordingListener(const char* name) : name_(name) {}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestProgramStart"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
|
|
||||||
int iteration) {
|
|
||||||
Message message;
|
|
||||||
message << GetFullMethodName("OnTestIterationStart")
|
|
||||||
<< "(" << iteration << ")";
|
|
||||||
g_events->push_back(message.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestCaseStart"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestStart(const TestInfo& /*test_info*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestStart"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestPartResult"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestEnd(const TestInfo& /*test_info*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestEnd"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
|
|
||||||
int iteration) {
|
|
||||||
Message message;
|
|
||||||
message << GetFullMethodName("OnTestIterationEnd")
|
|
||||||
<< "(" << iteration << ")";
|
|
||||||
g_events->push_back(message.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
|
|
||||||
g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string GetFullMethodName(const char* name) {
|
|
||||||
return name_ + "." + name;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string name_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class EnvironmentInvocationCatcher : public Environment {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
g_events->push_back("Environment::SetUp");
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void TearDown() {
|
|
||||||
g_events->push_back("Environment::TearDown");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ListenerTest : public Test {
|
|
||||||
protected:
|
|
||||||
static void SetUpTestCase() {
|
|
||||||
g_events->push_back("ListenerTest::SetUpTestCase");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TearDownTestCase() {
|
|
||||||
g_events->push_back("ListenerTest::TearDownTestCase");
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void SetUp() {
|
|
||||||
g_events->push_back("ListenerTest::SetUp");
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void TearDown() {
|
|
||||||
g_events->push_back("ListenerTest::TearDown");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(ListenerTest, DoesFoo) {
|
|
||||||
// Test execution order within a test case is not guaranteed so we are not
|
|
||||||
// recording the test name.
|
|
||||||
g_events->push_back("ListenerTest::* Test Body");
|
|
||||||
SUCCEED(); // Triggers OnTestPartResult.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ListenerTest, DoesBar) {
|
|
||||||
g_events->push_back("ListenerTest::* Test Body");
|
|
||||||
SUCCEED(); // Triggers OnTestPartResult.
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
|
|
||||||
} // namespace testing
|
|
||||||
|
|
||||||
using ::testing::internal::EnvironmentInvocationCatcher;
|
|
||||||
using ::testing::internal::EventRecordingListener;
|
|
||||||
|
|
||||||
void VerifyResults(const std::vector<std::string>& data,
|
|
||||||
const char* const* expected_data,
|
|
||||||
int expected_data_size) {
|
|
||||||
const int actual_size = data.size();
|
|
||||||
// If the following assertion fails, a new entry will be appended to
|
|
||||||
// data. Hence we save data.size() first.
|
|
||||||
EXPECT_EQ(expected_data_size, actual_size);
|
|
||||||
|
|
||||||
// Compares the common prefix.
|
|
||||||
const int shorter_size = expected_data_size <= actual_size ?
|
|
||||||
expected_data_size : actual_size;
|
|
||||||
int i = 0;
|
|
||||||
for (; i < shorter_size; ++i) {
|
|
||||||
ASSERT_STREQ(expected_data[i], data[i].c_str())
|
|
||||||
<< "at position " << i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prints extra elements in the actual data.
|
|
||||||
for (; i < actual_size; ++i) {
|
|
||||||
printf(" Actual event #%d: %s\n", i, data[i].c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
std::vector<std::string> events;
|
|
||||||
g_events = &events;
|
|
||||||
InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
UnitTest::GetInstance()->listeners().Append(
|
|
||||||
new EventRecordingListener("1st"));
|
|
||||||
UnitTest::GetInstance()->listeners().Append(
|
|
||||||
new EventRecordingListener("2nd"));
|
|
||||||
|
|
||||||
AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
|
|
||||||
|
|
||||||
GTEST_CHECK_(events.size() == 0)
|
|
||||||
<< "AddGlobalTestEnvironment should not generate any events itself.";
|
|
||||||
|
|
||||||
::testing::GTEST_FLAG(repeat) = 2;
|
|
||||||
int ret_val = RUN_ALL_TESTS();
|
|
||||||
|
|
||||||
const char* const expected_events[] = {
|
|
||||||
"1st.OnTestProgramStart",
|
|
||||||
"2nd.OnTestProgramStart",
|
|
||||||
"1st.OnTestIterationStart(0)",
|
|
||||||
"2nd.OnTestIterationStart(0)",
|
|
||||||
"1st.OnEnvironmentsSetUpStart",
|
|
||||||
"2nd.OnEnvironmentsSetUpStart",
|
|
||||||
"Environment::SetUp",
|
|
||||||
"2nd.OnEnvironmentsSetUpEnd",
|
|
||||||
"1st.OnEnvironmentsSetUpEnd",
|
|
||||||
"1st.OnTestCaseStart",
|
|
||||||
"2nd.OnTestCaseStart",
|
|
||||||
"ListenerTest::SetUpTestCase",
|
|
||||||
"1st.OnTestStart",
|
|
||||||
"2nd.OnTestStart",
|
|
||||||
"ListenerTest::SetUp",
|
|
||||||
"ListenerTest::* Test Body",
|
|
||||||
"1st.OnTestPartResult",
|
|
||||||
"2nd.OnTestPartResult",
|
|
||||||
"ListenerTest::TearDown",
|
|
||||||
"2nd.OnTestEnd",
|
|
||||||
"1st.OnTestEnd",
|
|
||||||
"1st.OnTestStart",
|
|
||||||
"2nd.OnTestStart",
|
|
||||||
"ListenerTest::SetUp",
|
|
||||||
"ListenerTest::* Test Body",
|
|
||||||
"1st.OnTestPartResult",
|
|
||||||
"2nd.OnTestPartResult",
|
|
||||||
"ListenerTest::TearDown",
|
|
||||||
"2nd.OnTestEnd",
|
|
||||||
"1st.OnTestEnd",
|
|
||||||
"ListenerTest::TearDownTestCase",
|
|
||||||
"2nd.OnTestCaseEnd",
|
|
||||||
"1st.OnTestCaseEnd",
|
|
||||||
"1st.OnEnvironmentsTearDownStart",
|
|
||||||
"2nd.OnEnvironmentsTearDownStart",
|
|
||||||
"Environment::TearDown",
|
|
||||||
"2nd.OnEnvironmentsTearDownEnd",
|
|
||||||
"1st.OnEnvironmentsTearDownEnd",
|
|
||||||
"2nd.OnTestIterationEnd(0)",
|
|
||||||
"1st.OnTestIterationEnd(0)",
|
|
||||||
"1st.OnTestIterationStart(1)",
|
|
||||||
"2nd.OnTestIterationStart(1)",
|
|
||||||
"1st.OnEnvironmentsSetUpStart",
|
|
||||||
"2nd.OnEnvironmentsSetUpStart",
|
|
||||||
"Environment::SetUp",
|
|
||||||
"2nd.OnEnvironmentsSetUpEnd",
|
|
||||||
"1st.OnEnvironmentsSetUpEnd",
|
|
||||||
"1st.OnTestCaseStart",
|
|
||||||
"2nd.OnTestCaseStart",
|
|
||||||
"ListenerTest::SetUpTestCase",
|
|
||||||
"1st.OnTestStart",
|
|
||||||
"2nd.OnTestStart",
|
|
||||||
"ListenerTest::SetUp",
|
|
||||||
"ListenerTest::* Test Body",
|
|
||||||
"1st.OnTestPartResult",
|
|
||||||
"2nd.OnTestPartResult",
|
|
||||||
"ListenerTest::TearDown",
|
|
||||||
"2nd.OnTestEnd",
|
|
||||||
"1st.OnTestEnd",
|
|
||||||
"1st.OnTestStart",
|
|
||||||
"2nd.OnTestStart",
|
|
||||||
"ListenerTest::SetUp",
|
|
||||||
"ListenerTest::* Test Body",
|
|
||||||
"1st.OnTestPartResult",
|
|
||||||
"2nd.OnTestPartResult",
|
|
||||||
"ListenerTest::TearDown",
|
|
||||||
"2nd.OnTestEnd",
|
|
||||||
"1st.OnTestEnd",
|
|
||||||
"ListenerTest::TearDownTestCase",
|
|
||||||
"2nd.OnTestCaseEnd",
|
|
||||||
"1st.OnTestCaseEnd",
|
|
||||||
"1st.OnEnvironmentsTearDownStart",
|
|
||||||
"2nd.OnEnvironmentsTearDownStart",
|
|
||||||
"Environment::TearDown",
|
|
||||||
"2nd.OnEnvironmentsTearDownEnd",
|
|
||||||
"1st.OnEnvironmentsTearDownEnd",
|
|
||||||
"2nd.OnTestIterationEnd(1)",
|
|
||||||
"1st.OnTestIterationEnd(1)",
|
|
||||||
"2nd.OnTestProgramEnd",
|
|
||||||
"1st.OnTestProgramEnd"
|
|
||||||
};
|
|
||||||
VerifyResults(events,
|
|
||||||
expected_events,
|
|
||||||
sizeof(expected_events)/sizeof(expected_events[0]));
|
|
||||||
|
|
||||||
// We need to check manually for ad hoc test failures that happen after
|
|
||||||
// RUN_ALL_TESTS finishes.
|
|
||||||
if (UnitTest::GetInstance()->Failed())
|
|
||||||
ret_val = 1;
|
|
||||||
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// Tests for the Message class.
|
|
||||||
|
|
||||||
#include "gtest/gtest-message.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
using ::testing::Message;
|
|
||||||
|
|
||||||
// Tests the testing::Message class
|
|
||||||
|
|
||||||
// Tests the default constructor.
|
|
||||||
TEST(MessageTest, DefaultConstructor) {
|
|
||||||
const Message msg;
|
|
||||||
EXPECT_EQ("", msg.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests the copy constructor.
|
|
||||||
TEST(MessageTest, CopyConstructor) {
|
|
||||||
const Message msg1("Hello");
|
|
||||||
const Message msg2(msg1);
|
|
||||||
EXPECT_EQ("Hello", msg2.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests constructing a Message from a C-string.
|
|
||||||
TEST(MessageTest, ConstructsFromCString) {
|
|
||||||
Message msg("Hello");
|
|
||||||
EXPECT_EQ("Hello", msg.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a float.
|
|
||||||
TEST(MessageTest, StreamsFloat) {
|
|
||||||
const std::string s = (Message() << 1.23456F << " " << 2.34567F).GetString();
|
|
||||||
// Both numbers should be printed with enough precision.
|
|
||||||
EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s.c_str());
|
|
||||||
EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a double.
|
|
||||||
TEST(MessageTest, StreamsDouble) {
|
|
||||||
const std::string s = (Message() << 1260570880.4555497 << " "
|
|
||||||
<< 1260572265.1954534).GetString();
|
|
||||||
// Both numbers should be printed with enough precision.
|
|
||||||
EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s.c_str());
|
|
||||||
EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a non-char pointer.
|
|
||||||
TEST(MessageTest, StreamsPointer) {
|
|
||||||
int n = 0;
|
|
||||||
int* p = &n;
|
|
||||||
EXPECT_NE("(null)", (Message() << p).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a NULL non-char pointer.
|
|
||||||
TEST(MessageTest, StreamsNullPointer) {
|
|
||||||
int* p = NULL;
|
|
||||||
EXPECT_EQ("(null)", (Message() << p).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a C string.
|
|
||||||
TEST(MessageTest, StreamsCString) {
|
|
||||||
EXPECT_EQ("Foo", (Message() << "Foo").GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a NULL C string.
|
|
||||||
TEST(MessageTest, StreamsNullCString) {
|
|
||||||
char* p = NULL;
|
|
||||||
EXPECT_EQ("(null)", (Message() << p).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming std::string.
|
|
||||||
TEST(MessageTest, StreamsString) {
|
|
||||||
const ::std::string str("Hello");
|
|
||||||
EXPECT_EQ("Hello", (Message() << str).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that we can output strings containing embedded NULs.
|
|
||||||
TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
|
|
||||||
const char char_array_with_nul[] =
|
|
||||||
"Here's a NUL\0 and some more string";
|
|
||||||
const ::std::string string_with_nul(char_array_with_nul,
|
|
||||||
sizeof(char_array_with_nul) - 1);
|
|
||||||
EXPECT_EQ("Here's a NUL\\0 and some more string",
|
|
||||||
(Message() << string_with_nul).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a NUL char.
|
|
||||||
TEST(MessageTest, StreamsNULChar) {
|
|
||||||
EXPECT_EQ("\\0", (Message() << '\0').GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming int.
|
|
||||||
TEST(MessageTest, StreamsInt) {
|
|
||||||
EXPECT_EQ("123", (Message() << 123).GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that basic IO manipulators (endl, ends, and flush) can be
|
|
||||||
// streamed to Message.
|
|
||||||
TEST(MessageTest, StreamsBasicIoManip) {
|
|
||||||
EXPECT_EQ("Line 1.\nA NUL char \\0 in line 2.",
|
|
||||||
(Message() << "Line 1." << std::endl
|
|
||||||
<< "A NUL char " << std::ends << std::flush
|
|
||||||
<< " in line 2.").GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests Message::GetString()
|
|
||||||
TEST(MessageTest, GetString) {
|
|
||||||
Message msg;
|
|
||||||
msg << 1 << " lamb";
|
|
||||||
EXPECT_EQ("1 lamb", msg.GetString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests streaming a Message object to an ostream.
|
|
||||||
TEST(MessageTest, StreamsToOStream) {
|
|
||||||
Message msg("Hello");
|
|
||||||
::std::stringstream ss;
|
|
||||||
ss << msg;
|
|
||||||
EXPECT_EQ("Hello", testing::internal::StringStreamToString(&ss));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that a Message object doesn't take up too much stack space.
|
|
||||||
TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
|
|
||||||
EXPECT_LE(sizeof(Message), 16U);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
|
@ -1,215 +0,0 @@
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// Google Test UnitTestOptions tests
|
|
||||||
//
|
|
||||||
// This file tests classes and functions used internally by
|
|
||||||
// Google Test. They are subject to change without notice.
|
|
||||||
//
|
|
||||||
// This file is #included from gtest.cc, to avoid changing build or
|
|
||||||
// make-files on Windows and other platforms. Do not #include this file
|
|
||||||
// anywhere else!
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
# include <windows.h>
|
|
||||||
#elif GTEST_OS_WINDOWS
|
|
||||||
# include <direct.h>
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
// 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 "src/gtest-internal-inl.h"
|
|
||||||
#undef GTEST_IMPLEMENTATION_
|
|
||||||
|
|
||||||
namespace testing {
|
|
||||||
namespace internal {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// Turns the given relative path into an absolute path.
|
|
||||||
FilePath GetAbsolutePathOf(const FilePath& relative_path) {
|
|
||||||
return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
|
|
||||||
|
|
||||||
TEST(XmlOutputTest, GetOutputFormatDefault) {
|
|
||||||
GTEST_FLAG(output) = "";
|
|
||||||
EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(XmlOutputTest, GetOutputFormat) {
|
|
||||||
GTEST_FLAG(output) = "xml:filename";
|
|
||||||
EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(XmlOutputTest, GetOutputFileDefault) {
|
|
||||||
GTEST_FLAG(output) = "";
|
|
||||||
EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(XmlOutputTest, GetOutputFileSingleFile) {
|
|
||||||
GTEST_FLAG(output) = "xml:filename.abc";
|
|
||||||
EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
|
|
||||||
GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
|
|
||||||
const std::string expected_output_file =
|
|
||||||
GetAbsolutePathOf(
|
|
||||||
FilePath(std::string("path") + GTEST_PATH_SEP_ +
|
|
||||||
GetCurrentExecutableName().string() + ".xml")).string();
|
|
||||||
const std::string& output_file =
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile();
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
|
|
||||||
#else
|
|
||||||
EXPECT_EQ(expected_output_file, output_file.c_str());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
|
|
||||||
const std::string exe_str = GetCurrentExecutableName().string();
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
const bool success =
|
|
||||||
_strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
|
|
||||||
_strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
|
|
||||||
_strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
|
|
||||||
_strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
|
|
||||||
#else
|
|
||||||
// TODO(wan@google.com): remove the hard-coded "lt-" prefix when
|
|
||||||
// Chandler Carruth's libtool replacement is ready.
|
|
||||||
const bool success =
|
|
||||||
exe_str == "gtest-options_test" ||
|
|
||||||
exe_str == "gtest_all_test" ||
|
|
||||||
exe_str == "lt-gtest_all_test" ||
|
|
||||||
exe_str == "gtest_dll_test";
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
if (!success)
|
|
||||||
FAIL() << "GetCurrentExecutableName() returns " << exe_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
class XmlOutputChangeDirTest : public Test {
|
|
||||||
protected:
|
|
||||||
virtual void SetUp() {
|
|
||||||
original_working_dir_ = FilePath::GetCurrentDir();
|
|
||||||
posix::ChDir("..");
|
|
||||||
// This will make the test fail if run from the root directory.
|
|
||||||
EXPECT_NE(original_working_dir_.string(),
|
|
||||||
FilePath::GetCurrentDir().string());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void TearDown() {
|
|
||||||
posix::ChDir(original_working_dir_.string().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
FilePath original_working_dir_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
|
|
||||||
GTEST_FLAG(output) = "";
|
|
||||||
EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
|
|
||||||
FilePath("test_detail.xml")).string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
|
|
||||||
GTEST_FLAG(output) = "xml";
|
|
||||||
EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
|
|
||||||
FilePath("test_detail.xml")).string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
|
|
||||||
GTEST_FLAG(output) = "xml:filename.abc";
|
|
||||||
EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
|
|
||||||
FilePath("filename.abc")).string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
|
|
||||||
GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
|
|
||||||
const std::string expected_output_file =
|
|
||||||
FilePath::ConcatPaths(
|
|
||||||
original_working_dir_,
|
|
||||||
FilePath(std::string("path") + GTEST_PATH_SEP_ +
|
|
||||||
GetCurrentExecutableName().string() + ".xml")).string();
|
|
||||||
const std::string& output_file =
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile();
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
|
|
||||||
#else
|
|
||||||
EXPECT_EQ(expected_output_file, output_file.c_str());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
|
|
||||||
EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
#else
|
|
||||||
GTEST_FLAG(output) ="xml:/tmp/filename.abc";
|
|
||||||
EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
const std::string path = "c:\\tmp\\";
|
|
||||||
#else
|
|
||||||
const std::string path = "/tmp/";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GTEST_FLAG(output) = "xml:" + path;
|
|
||||||
const std::string expected_output_file =
|
|
||||||
path + GetCurrentExecutableName().string() + ".xml";
|
|
||||||
const std::string& output_file =
|
|
||||||
UnitTestOptions::GetAbsolutePathToOutputFile();
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS
|
|
||||||
EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
|
|
||||||
#else
|
|
||||||
EXPECT_EQ(expected_output_file, output_file.c_str());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace testing
|
|
|
@ -1,65 +0,0 @@
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// Tests for Google Test itself. This verifies that the basic constructs of
|
|
||||||
// Google Test work.
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#include "test/gtest-param-test_test.h"
|
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
using ::testing::Values;
|
|
||||||
using ::testing::internal::ParamGenerator;
|
|
||||||
|
|
||||||
// Tests that generators defined in a different translation unit
|
|
||||||
// are functional. The test using extern_gen is defined
|
|
||||||
// in gtest-param-test_test.cc.
|
|
||||||
ParamGenerator<int> extern_gen = Values(33);
|
|
||||||
|
|
||||||
// Tests that a parameterized test case can be defined in one translation unit
|
|
||||||
// and instantiated in another. The test is defined in gtest-param-test_test.cc
|
|
||||||
// and ExternalInstantiationTest fixture class is defined in
|
|
||||||
// gtest-param-test_test.h.
|
|
||||||
INSTANTIATE_TEST_CASE_P(MultiplesOf33,
|
|
||||||
ExternalInstantiationTest,
|
|
||||||
Values(33, 66));
|
|
||||||
|
|
||||||
// Tests that a parameterized test case can be instantiated
|
|
||||||
// in multiple translation units. Another instantiation is defined
|
|
||||||
// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
|
|
||||||
// fixture is defined in gtest-param-test_test.h
|
|
||||||
INSTANTIATE_TEST_CASE_P(Sequence2,
|
|
||||||
InstantiationInMultipleTranslaionUnitsTest,
|
|
||||||
Values(42*3, 42*4, 42*5));
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
|
|
@ -1,904 +0,0 @@
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// Tests for Google Test itself. This file verifies that the parameter
|
|
||||||
// generators objects produce correct parameter sequences and that
|
|
||||||
// Google Test runtime instantiates correct tests from those sequences.
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
# include <algorithm>
|
|
||||||
# include <iostream>
|
|
||||||
# include <list>
|
|
||||||
# include <sstream>
|
|
||||||
# include <string>
|
|
||||||
# include <vector>
|
|
||||||
|
|
||||||
// To include gtest-internal-inl.h.
|
|
||||||
# define GTEST_IMPLEMENTATION_ 1
|
|
||||||
# include "src/gtest-internal-inl.h" // for UnitTestOptions
|
|
||||||
# undef GTEST_IMPLEMENTATION_
|
|
||||||
|
|
||||||
# include "test/gtest-param-test_test.h"
|
|
||||||
|
|
||||||
using ::std::vector;
|
|
||||||
using ::std::sort;
|
|
||||||
|
|
||||||
using ::testing::AddGlobalTestEnvironment;
|
|
||||||
using ::testing::Bool;
|
|
||||||
using ::testing::Message;
|
|
||||||
using ::testing::Range;
|
|
||||||
using ::testing::TestWithParam;
|
|
||||||
using ::testing::Values;
|
|
||||||
using ::testing::ValuesIn;
|
|
||||||
|
|
||||||
# if GTEST_HAS_COMBINE
|
|
||||||
using ::testing::Combine;
|
|
||||||
using ::std::tr1::get;
|
|
||||||
using ::std::tr1::make_tuple;
|
|
||||||
using ::std::tr1::tuple;
|
|
||||||
# endif // GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
using ::testing::internal::ParamGenerator;
|
|
||||||
using ::testing::internal::UnitTestOptions;
|
|
||||||
|
|
||||||
// Prints a value to a string.
|
|
||||||
//
|
|
||||||
// TODO(wan@google.com): remove PrintValue() when we move matchers and
|
|
||||||
// EXPECT_THAT() from Google Mock to Google Test. At that time, we
|
|
||||||
// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
|
|
||||||
// EXPECT_THAT() and the matchers know how to print tuples.
|
|
||||||
template <typename T>
|
|
||||||
::std::string PrintValue(const T& value) {
|
|
||||||
::std::stringstream stream;
|
|
||||||
stream << value;
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
# if GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
// These overloads allow printing tuples in our tests. We cannot
|
|
||||||
// define an operator<< for tuples, as that definition needs to be in
|
|
||||||
// the std namespace in order to be picked up by Google Test via
|
|
||||||
// Argument-Dependent Lookup, yet defining anything in the std
|
|
||||||
// namespace in non-STL code is undefined behavior.
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
::std::string PrintValue(const tuple<T1, T2>& value) {
|
|
||||||
::std::stringstream stream;
|
|
||||||
stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T1, typename T2, typename T3>
|
|
||||||
::std::string PrintValue(const tuple<T1, T2, T3>& value) {
|
|
||||||
::std::stringstream stream;
|
|
||||||
stream << "(" << get<0>(value) << ", " << get<1>(value)
|
|
||||||
<< ", "<< get<2>(value) << ")";
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
|
||||||
typename T6, typename T7, typename T8, typename T9, typename T10>
|
|
||||||
::std::string PrintValue(
|
|
||||||
const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
|
|
||||||
::std::stringstream stream;
|
|
||||||
stream << "(" << get<0>(value) << ", " << get<1>(value)
|
|
||||||
<< ", "<< get<2>(value) << ", " << get<3>(value)
|
|
||||||
<< ", "<< get<4>(value) << ", " << get<5>(value)
|
|
||||||
<< ", "<< get<6>(value) << ", " << get<7>(value)
|
|
||||||
<< ", "<< get<8>(value) << ", " << get<9>(value) << ")";
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
# endif // GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
// Verifies that a sequence generated by the generator and accessed
|
|
||||||
// via the iterator object matches the expected one using Google Test
|
|
||||||
// assertions.
|
|
||||||
template <typename T, size_t N>
|
|
||||||
void VerifyGenerator(const ParamGenerator<T>& generator,
|
|
||||||
const T (&expected_values)[N]) {
|
|
||||||
typename ParamGenerator<T>::iterator it = generator.begin();
|
|
||||||
for (size_t i = 0; i < N; ++i) {
|
|
||||||
ASSERT_FALSE(it == generator.end())
|
|
||||||
<< "At element " << i << " when accessing via an iterator "
|
|
||||||
<< "created with the copy constructor.\n";
|
|
||||||
// We cannot use EXPECT_EQ() here as the values may be tuples,
|
|
||||||
// which don't support <<.
|
|
||||||
EXPECT_TRUE(expected_values[i] == *it)
|
|
||||||
<< "where i is " << i
|
|
||||||
<< ", expected_values[i] is " << PrintValue(expected_values[i])
|
|
||||||
<< ", *it is " << PrintValue(*it)
|
|
||||||
<< ", and 'it' is an iterator created with the copy constructor.\n";
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
EXPECT_TRUE(it == generator.end())
|
|
||||||
<< "At the presumed end of sequence when accessing via an iterator "
|
|
||||||
<< "created with the copy constructor.\n";
|
|
||||||
|
|
||||||
// Test the iterator assignment. The following lines verify that
|
|
||||||
// the sequence accessed via an iterator initialized via the
|
|
||||||
// assignment operator (as opposed to a copy constructor) matches
|
|
||||||
// just the same.
|
|
||||||
it = generator.begin();
|
|
||||||
for (size_t i = 0; i < N; ++i) {
|
|
||||||
ASSERT_FALSE(it == generator.end())
|
|
||||||
<< "At element " << i << " when accessing via an iterator "
|
|
||||||
<< "created with the assignment operator.\n";
|
|
||||||
EXPECT_TRUE(expected_values[i] == *it)
|
|
||||||
<< "where i is " << i
|
|
||||||
<< ", expected_values[i] is " << PrintValue(expected_values[i])
|
|
||||||
<< ", *it is " << PrintValue(*it)
|
|
||||||
<< ", and 'it' is an iterator created with the copy constructor.\n";
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
EXPECT_TRUE(it == generator.end())
|
|
||||||
<< "At the presumed end of sequence when accessing via an iterator "
|
|
||||||
<< "created with the assignment operator.\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
|
|
||||||
typename ParamGenerator<T>::iterator it = generator.begin();
|
|
||||||
EXPECT_TRUE(it == generator.end());
|
|
||||||
|
|
||||||
it = generator.begin();
|
|
||||||
EXPECT_TRUE(it == generator.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generator tests. They test that each of the provided generator functions
|
|
||||||
// generates an expected sequence of values. The general test pattern
|
|
||||||
// instantiates a generator using one of the generator functions,
|
|
||||||
// checks the sequence produced by the generator using its iterator API,
|
|
||||||
// and then resets the iterator back to the beginning of the sequence
|
|
||||||
// and checks the sequence again.
|
|
||||||
|
|
||||||
// Tests that iterators produced by generator functions conform to the
|
|
||||||
// ForwardIterator concept.
|
|
||||||
TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 10);
|
|
||||||
ParamGenerator<int>::iterator it = gen.begin();
|
|
||||||
|
|
||||||
// Verifies that iterator initialization works as expected.
|
|
||||||
ParamGenerator<int>::iterator it2 = it;
|
|
||||||
EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
|
|
||||||
<< "element same as its source points to";
|
|
||||||
|
|
||||||
// Verifies that iterator assignment works as expected.
|
|
||||||
it++;
|
|
||||||
EXPECT_FALSE(*it == *it2);
|
|
||||||
it2 = it;
|
|
||||||
EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
|
|
||||||
<< "element same as its source points to";
|
|
||||||
|
|
||||||
// Verifies that prefix operator++() returns *this.
|
|
||||||
EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
|
|
||||||
<< "refer to the original object";
|
|
||||||
|
|
||||||
// Verifies that the result of the postfix operator++ points to the value
|
|
||||||
// pointed to by the original iterator.
|
|
||||||
int original_value = *it; // Have to compute it outside of macro call to be
|
|
||||||
// unaffected by the parameter evaluation order.
|
|
||||||
EXPECT_EQ(original_value, *(it++));
|
|
||||||
|
|
||||||
// Verifies that prefix and postfix operator++() advance an iterator
|
|
||||||
// all the same.
|
|
||||||
it2 = it;
|
|
||||||
it++;
|
|
||||||
++it2;
|
|
||||||
EXPECT_TRUE(*it == *it2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Range() generates the expected sequence.
|
|
||||||
TEST(RangeTest, IntRangeWithDefaultStep) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 3);
|
|
||||||
const int expected_values[] = {0, 1, 2};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that Range() generates the single element sequence
|
|
||||||
// as expected when provided with range limits that are equal.
|
|
||||||
TEST(RangeTest, IntRangeSingleValue) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 1);
|
|
||||||
const int expected_values[] = {0};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that Range() with generates empty sequence when
|
|
||||||
// supplied with an empty range.
|
|
||||||
TEST(RangeTest, IntRangeEmpty) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 0);
|
|
||||||
VerifyGeneratorIsEmpty(gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Range() with custom step (greater then one) generates
|
|
||||||
// the expected sequence.
|
|
||||||
TEST(RangeTest, IntRangeWithCustomStep) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 9, 3);
|
|
||||||
const int expected_values[] = {0, 3, 6};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Range() with custom step (greater then one) generates
|
|
||||||
// the expected sequence when the last element does not fall on the
|
|
||||||
// upper range limit. Sequences generated by Range() must not have
|
|
||||||
// elements beyond the range limits.
|
|
||||||
TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
|
|
||||||
const ParamGenerator<int> gen = Range(0, 4, 3);
|
|
||||||
const int expected_values[] = {0, 3};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verifies that Range works with user-defined types that define
|
|
||||||
// copy constructor, operator=(), operator+(), and operator<().
|
|
||||||
class DogAdder {
|
|
||||||
public:
|
|
||||||
explicit DogAdder(const char* a_value) : value_(a_value) {}
|
|
||||||
DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
|
|
||||||
|
|
||||||
DogAdder operator=(const DogAdder& other) {
|
|
||||||
if (this != &other)
|
|
||||||
value_ = other.value_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
DogAdder operator+(const DogAdder& other) const {
|
|
||||||
Message msg;
|
|
||||||
msg << value_.c_str() << other.value_.c_str();
|
|
||||||
return DogAdder(msg.GetString().c_str());
|
|
||||||
}
|
|
||||||
bool operator<(const DogAdder& other) const {
|
|
||||||
return value_ < other.value_;
|
|
||||||
}
|
|
||||||
const std::string& value() const { return value_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(RangeTest, WorksWithACustomType) {
|
|
||||||
const ParamGenerator<DogAdder> gen =
|
|
||||||
Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
|
|
||||||
ParamGenerator<DogAdder>::iterator it = gen.begin();
|
|
||||||
|
|
||||||
ASSERT_FALSE(it == gen.end());
|
|
||||||
EXPECT_STREQ("cat", it->value().c_str());
|
|
||||||
|
|
||||||
ASSERT_FALSE(++it == gen.end());
|
|
||||||
EXPECT_STREQ("catdog", it->value().c_str());
|
|
||||||
|
|
||||||
EXPECT_TRUE(++it == gen.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
class IntWrapper {
|
|
||||||
public:
|
|
||||||
explicit IntWrapper(int a_value) : value_(a_value) {}
|
|
||||||
IntWrapper(const IntWrapper& other) : value_(other.value_) {}
|
|
||||||
|
|
||||||
IntWrapper operator=(const IntWrapper& other) {
|
|
||||||
value_ = other.value_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
// operator+() adds a different type.
|
|
||||||
IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
|
|
||||||
bool operator<(const IntWrapper& other) const {
|
|
||||||
return value_ < other.value_;
|
|
||||||
}
|
|
||||||
int value() const { return value_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
int value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
|
|
||||||
const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
|
|
||||||
ParamGenerator<IntWrapper>::iterator it = gen.begin();
|
|
||||||
|
|
||||||
ASSERT_FALSE(it == gen.end());
|
|
||||||
EXPECT_EQ(0, it->value());
|
|
||||||
|
|
||||||
ASSERT_FALSE(++it == gen.end());
|
|
||||||
EXPECT_EQ(1, it->value());
|
|
||||||
|
|
||||||
EXPECT_TRUE(++it == gen.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that ValuesIn() with an array parameter generates
|
|
||||||
// the expected sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInArray) {
|
|
||||||
int array[] = {3, 5, 8};
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(array);
|
|
||||||
VerifyGenerator(gen, array);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that ValuesIn() with a const array parameter generates
|
|
||||||
// the expected sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInConstArray) {
|
|
||||||
const int array[] = {3, 5, 8};
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(array);
|
|
||||||
VerifyGenerator(gen, array);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that ValuesIn() with an array parameter containing a
|
|
||||||
// single element generates the single element sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInSingleElementArray) {
|
|
||||||
int array[] = {42};
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(array);
|
|
||||||
VerifyGenerator(gen, array);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that ValuesIn() generates the expected sequence for an STL
|
|
||||||
// container (vector).
|
|
||||||
TEST(ValuesInTest, ValuesInVector) {
|
|
||||||
typedef ::std::vector<int> ContainerType;
|
|
||||||
ContainerType values;
|
|
||||||
values.push_back(3);
|
|
||||||
values.push_back(5);
|
|
||||||
values.push_back(8);
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(values);
|
|
||||||
|
|
||||||
const int expected_values[] = {3, 5, 8};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that ValuesIn() generates the expected sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInIteratorRange) {
|
|
||||||
typedef ::std::vector<int> ContainerType;
|
|
||||||
ContainerType values;
|
|
||||||
values.push_back(3);
|
|
||||||
values.push_back(5);
|
|
||||||
values.push_back(8);
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
|
||||||
|
|
||||||
const int expected_values[] = {3, 5, 8};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
|
|
||||||
// single value generates a single-element sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
|
|
||||||
typedef ::std::vector<int> ContainerType;
|
|
||||||
ContainerType values;
|
|
||||||
values.push_back(42);
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
|
||||||
|
|
||||||
const int expected_values[] = {42};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that ValuesIn() provided with an empty iterator range
|
|
||||||
// generates an empty sequence.
|
|
||||||
TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
|
|
||||||
typedef ::std::vector<int> ContainerType;
|
|
||||||
ContainerType values;
|
|
||||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
|
||||||
|
|
||||||
VerifyGeneratorIsEmpty(gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that the Values() generates the expected sequence.
|
|
||||||
TEST(ValuesTest, ValuesWorks) {
|
|
||||||
const ParamGenerator<int> gen = Values(3, 5, 8);
|
|
||||||
|
|
||||||
const int expected_values[] = {3, 5, 8};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Values() generates the expected sequences from elements of
|
|
||||||
// different types convertible to ParamGenerator's parameter type.
|
|
||||||
TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
|
|
||||||
const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
|
|
||||||
|
|
||||||
const double expected_values[] = {3.0, 5.0, 8.0};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ValuesTest, ValuesWorksForMaxLengthList) {
|
|
||||||
const ParamGenerator<int> gen = Values(
|
|
||||||
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
|
||||||
110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
|
|
||||||
210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
|
|
||||||
310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
|
|
||||||
410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
|
|
||||||
|
|
||||||
const int expected_values[] = {
|
|
||||||
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
|
||||||
110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
|
|
||||||
210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
|
|
||||||
310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
|
|
||||||
410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case test. Tests that single-parameter Values() generates the sequence
|
|
||||||
// with the single value.
|
|
||||||
TEST(ValuesTest, ValuesWithSingleParameter) {
|
|
||||||
const ParamGenerator<int> gen = Values(42);
|
|
||||||
|
|
||||||
const int expected_values[] = {42};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Bool() generates sequence (false, true).
|
|
||||||
TEST(BoolTest, BoolWorks) {
|
|
||||||
const ParamGenerator<bool> gen = Bool();
|
|
||||||
|
|
||||||
const bool expected_values[] = {false, true};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
# if GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
// Tests that Combine() with two parameters generates the expected sequence.
|
|
||||||
TEST(CombineTest, CombineWithTwoParameters) {
|
|
||||||
const char* foo = "foo";
|
|
||||||
const char* bar = "bar";
|
|
||||||
const ParamGenerator<tuple<const char*, int> > gen =
|
|
||||||
Combine(Values(foo, bar), Values(3, 4));
|
|
||||||
|
|
||||||
tuple<const char*, int> expected_values[] = {
|
|
||||||
make_tuple(foo, 3), make_tuple(foo, 4),
|
|
||||||
make_tuple(bar, 3), make_tuple(bar, 4)};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that Combine() with three parameters generates the expected sequence.
|
|
||||||
TEST(CombineTest, CombineWithThreeParameters) {
|
|
||||||
const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
|
|
||||||
Values(3, 4),
|
|
||||||
Values(5, 6));
|
|
||||||
tuple<int, int, int> expected_values[] = {
|
|
||||||
make_tuple(0, 3, 5), make_tuple(0, 3, 6),
|
|
||||||
make_tuple(0, 4, 5), make_tuple(0, 4, 6),
|
|
||||||
make_tuple(1, 3, 5), make_tuple(1, 3, 6),
|
|
||||||
make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that the Combine() with the first parameter generating a single value
|
|
||||||
// sequence generates a sequence with the number of elements equal to the
|
|
||||||
// number of elements in the sequence generated by the second parameter.
|
|
||||||
TEST(CombineTest, CombineWithFirstParameterSingleValue) {
|
|
||||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
|
|
||||||
Values(0, 1));
|
|
||||||
|
|
||||||
tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that the Combine() with the second parameter generating a single value
|
|
||||||
// sequence generates a sequence with the number of elements equal to the
|
|
||||||
// number of elements in the sequence generated by the first parameter.
|
|
||||||
TEST(CombineTest, CombineWithSecondParameterSingleValue) {
|
|
||||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
|
|
||||||
Values(42));
|
|
||||||
|
|
||||||
tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that when the first parameter produces an empty sequence,
|
|
||||||
// Combine() produces an empty sequence, too.
|
|
||||||
TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
|
|
||||||
const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
|
|
||||||
Values(0, 1));
|
|
||||||
VerifyGeneratorIsEmpty(gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that when the second parameter produces an empty sequence,
|
|
||||||
// Combine() produces an empty sequence, too.
|
|
||||||
TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
|
|
||||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
|
|
||||||
Range(1, 1));
|
|
||||||
VerifyGeneratorIsEmpty(gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edge case. Tests that combine works with the maximum number
|
|
||||||
// of parameters supported by Google Test (currently 10).
|
|
||||||
TEST(CombineTest, CombineWithMaxNumberOfParameters) {
|
|
||||||
const char* foo = "foo";
|
|
||||||
const char* bar = "bar";
|
|
||||||
const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
|
|
||||||
int, int> > gen = Combine(Values(foo, bar),
|
|
||||||
Values(1), Values(2),
|
|
||||||
Values(3), Values(4),
|
|
||||||
Values(5), Values(6),
|
|
||||||
Values(7), Values(8),
|
|
||||||
Values(9));
|
|
||||||
|
|
||||||
tuple<const char*, int, int, int, int, int, int, int, int, int>
|
|
||||||
expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
|
|
||||||
make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
# endif // GTEST_HAS_COMBINE
|
|
||||||
|
|
||||||
// Tests that an generator produces correct sequence after being
|
|
||||||
// assigned from another generator.
|
|
||||||
TEST(ParamGeneratorTest, AssignmentWorks) {
|
|
||||||
ParamGenerator<int> gen = Values(1, 2);
|
|
||||||
const ParamGenerator<int> gen2 = Values(3, 4);
|
|
||||||
gen = gen2;
|
|
||||||
|
|
||||||
const int expected_values[] = {3, 4};
|
|
||||||
VerifyGenerator(gen, expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This test verifies that the tests are expanded and run as specified:
|
|
||||||
// one test per element from the sequence produced by the generator
|
|
||||||
// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
|
|
||||||
// fixture constructor, SetUp(), and TearDown() have run and have been
|
|
||||||
// supplied with the correct parameters.
|
|
||||||
|
|
||||||
// The use of environment object allows detection of the case where no test
|
|
||||||
// case functionality is run at all. In this case TestCaseTearDown will not
|
|
||||||
// be able to detect missing tests, naturally.
|
|
||||||
template <int kExpectedCalls>
|
|
||||||
class TestGenerationEnvironment : public ::testing::Environment {
|
|
||||||
public:
|
|
||||||
static TestGenerationEnvironment* Instance() {
|
|
||||||
static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixtureConstructorExecuted() { fixture_constructor_count_++; }
|
|
||||||
void SetUpExecuted() { set_up_count_++; }
|
|
||||||
void TearDownExecuted() { tear_down_count_++; }
|
|
||||||
void TestBodyExecuted() { test_body_count_++; }
|
|
||||||
|
|
||||||
virtual void TearDown() {
|
|
||||||
// If all MultipleTestGenerationTest tests have been de-selected
|
|
||||||
// by the filter flag, the following checks make no sense.
|
|
||||||
bool perform_check = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < kExpectedCalls; ++i) {
|
|
||||||
Message msg;
|
|
||||||
msg << "TestsExpandedAndRun/" << i;
|
|
||||||
if (UnitTestOptions::FilterMatchesTest(
|
|
||||||
"TestExpansionModule/MultipleTestGenerationTest",
|
|
||||||
msg.GetString().c_str())) {
|
|
||||||
perform_check = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (perform_check) {
|
|
||||||
EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
|
|
||||||
<< "Fixture constructor of ParamTestGenerationTest test case "
|
|
||||||
<< "has not been run as expected.";
|
|
||||||
EXPECT_EQ(kExpectedCalls, set_up_count_)
|
|
||||||
<< "Fixture SetUp method of ParamTestGenerationTest test case "
|
|
||||||
<< "has not been run as expected.";
|
|
||||||
EXPECT_EQ(kExpectedCalls, tear_down_count_)
|
|
||||||
<< "Fixture TearDown method of ParamTestGenerationTest test case "
|
|
||||||
<< "has not been run as expected.";
|
|
||||||
EXPECT_EQ(kExpectedCalls, test_body_count_)
|
|
||||||
<< "Test in ParamTestGenerationTest test case "
|
|
||||||
<< "has not been run as expected.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
|
|
||||||
tear_down_count_(0), test_body_count_(0) {}
|
|
||||||
|
|
||||||
int fixture_constructor_count_;
|
|
||||||
int set_up_count_;
|
|
||||||
int tear_down_count_;
|
|
||||||
int test_body_count_;
|
|
||||||
|
|
||||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
|
|
||||||
};
|
|
||||||
|
|
||||||
const int test_generation_params[] = {36, 42, 72};
|
|
||||||
|
|
||||||
class TestGenerationTest : public TestWithParam<int> {
|
|
||||||
public:
|
|
||||||
enum {
|
|
||||||
PARAMETER_COUNT =
|
|
||||||
sizeof(test_generation_params)/sizeof(test_generation_params[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
|
|
||||||
|
|
||||||
TestGenerationTest() {
|
|
||||||
Environment::Instance()->FixtureConstructorExecuted();
|
|
||||||
current_parameter_ = GetParam();
|
|
||||||
}
|
|
||||||
virtual void SetUp() {
|
|
||||||
Environment::Instance()->SetUpExecuted();
|
|
||||||
EXPECT_EQ(current_parameter_, GetParam());
|
|
||||||
}
|
|
||||||
virtual void TearDown() {
|
|
||||||
Environment::Instance()->TearDownExecuted();
|
|
||||||
EXPECT_EQ(current_parameter_, GetParam());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetUpTestCase() {
|
|
||||||
bool all_tests_in_test_case_selected = true;
|
|
||||||
|
|
||||||
for (int i = 0; i < PARAMETER_COUNT; ++i) {
|
|
||||||
Message test_name;
|
|
||||||
test_name << "TestsExpandedAndRun/" << i;
|
|
||||||
if ( !UnitTestOptions::FilterMatchesTest(
|
|
||||||
"TestExpansionModule/MultipleTestGenerationTest",
|
|
||||||
test_name.GetString())) {
|
|
||||||
all_tests_in_test_case_selected = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPECT_TRUE(all_tests_in_test_case_selected)
|
|
||||||
<< "When running the TestGenerationTest test case all of its tests\n"
|
|
||||||
<< "must be selected by the filter flag for the test case to pass.\n"
|
|
||||||
<< "If not all of them are enabled, we can't reliably conclude\n"
|
|
||||||
<< "that the correct number of tests have been generated.";
|
|
||||||
|
|
||||||
collected_parameters_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TearDownTestCase() {
|
|
||||||
vector<int> expected_values(test_generation_params,
|
|
||||||
test_generation_params + PARAMETER_COUNT);
|
|
||||||
// Test execution order is not guaranteed by Google Test,
|
|
||||||
// so the order of values in collected_parameters_ can be
|
|
||||||
// different and we have to sort to compare.
|
|
||||||
sort(expected_values.begin(), expected_values.end());
|
|
||||||
sort(collected_parameters_.begin(), collected_parameters_.end());
|
|
||||||
|
|
||||||
EXPECT_TRUE(collected_parameters_ == expected_values);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int current_parameter_;
|
|
||||||
static vector<int> collected_parameters_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
|
|
||||||
};
|
|
||||||
vector<int> TestGenerationTest::collected_parameters_;
|
|
||||||
|
|
||||||
TEST_P(TestGenerationTest, TestsExpandedAndRun) {
|
|
||||||
Environment::Instance()->TestBodyExecuted();
|
|
||||||
EXPECT_EQ(current_parameter_, GetParam());
|
|
||||||
collected_parameters_.push_back(GetParam());
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
|
|
||||||
ValuesIn(test_generation_params));
|
|
||||||
|
|
||||||
// This test verifies that the element sequence (third parameter of
|
|
||||||
// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
|
|
||||||
// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS(). For
|
|
||||||
// that, we declare param_value_ to be a static member of
|
|
||||||
// GeneratorEvaluationTest and initialize it to 0. We set it to 1 in
|
|
||||||
// main(), just before invocation of InitGoogleTest(). After calling
|
|
||||||
// InitGoogleTest(), we set the value to 2. If the sequence is evaluated
|
|
||||||
// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
|
|
||||||
// test with parameter other than 1, and the test body will fail the
|
|
||||||
// assertion.
|
|
||||||
class GeneratorEvaluationTest : public TestWithParam<int> {
|
|
||||||
public:
|
|
||||||
static int param_value() { return param_value_; }
|
|
||||||
static void set_param_value(int param_value) { param_value_ = param_value; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static int param_value_;
|
|
||||||
};
|
|
||||||
int GeneratorEvaluationTest::param_value_ = 0;
|
|
||||||
|
|
||||||
TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
|
|
||||||
EXPECT_EQ(1, GetParam());
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(GenEvalModule,
|
|
||||||
GeneratorEvaluationTest,
|
|
||||||
Values(GeneratorEvaluationTest::param_value()));
|
|
||||||
|
|
||||||
// Tests that generators defined in a different translation unit are
|
|
||||||
// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
|
|
||||||
extern ParamGenerator<int> extern_gen;
|
|
||||||
class ExternalGeneratorTest : public TestWithParam<int> {};
|
|
||||||
TEST_P(ExternalGeneratorTest, ExternalGenerator) {
|
|
||||||
// Sequence produced by extern_gen contains only a single value
|
|
||||||
// which we verify here.
|
|
||||||
EXPECT_EQ(GetParam(), 33);
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
|
|
||||||
ExternalGeneratorTest,
|
|
||||||
extern_gen);
|
|
||||||
|
|
||||||
// Tests that a parameterized test case can be defined in one translation
|
|
||||||
// unit and instantiated in another. This test will be instantiated in
|
|
||||||
// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
|
|
||||||
// defined in gtest-param-test_test.h.
|
|
||||||
TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
|
|
||||||
EXPECT_EQ(0, GetParam() % 33);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that a parameterized test case can be instantiated with multiple
|
|
||||||
// generators.
|
|
||||||
class MultipleInstantiationTest : public TestWithParam<int> {};
|
|
||||||
TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
|
|
||||||
INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
|
|
||||||
|
|
||||||
// Tests that a parameterized test case can be instantiated
|
|
||||||
// in multiple translation units. This test will be instantiated
|
|
||||||
// here and in gtest-param-test_test2.cc.
|
|
||||||
// InstantiationInMultipleTranslationUnitsTest fixture class
|
|
||||||
// is defined in gtest-param-test_test.h.
|
|
||||||
TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
|
|
||||||
EXPECT_EQ(0, GetParam() % 42);
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(Sequence1,
|
|
||||||
InstantiationInMultipleTranslaionUnitsTest,
|
|
||||||
Values(42, 42*2));
|
|
||||||
|
|
||||||
// Tests that each iteration of parameterized test runs in a separate test
|
|
||||||
// object.
|
|
||||||
class SeparateInstanceTest : public TestWithParam<int> {
|
|
||||||
public:
|
|
||||||
SeparateInstanceTest() : count_(0) {}
|
|
||||||
|
|
||||||
static void TearDownTestCase() {
|
|
||||||
EXPECT_GE(global_count_, 2)
|
|
||||||
<< "If some (but not all) SeparateInstanceTest tests have been "
|
|
||||||
<< "filtered out this test will fail. Make sure that all "
|
|
||||||
<< "GeneratorEvaluationTest are selected or de-selected together "
|
|
||||||
<< "by the test filter.";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int count_;
|
|
||||||
static int global_count_;
|
|
||||||
};
|
|
||||||
int SeparateInstanceTest::global_count_ = 0;
|
|
||||||
|
|
||||||
TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
|
|
||||||
EXPECT_EQ(0, count_++);
|
|
||||||
global_count_++;
|
|
||||||
}
|
|
||||||
INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
|
|
||||||
|
|
||||||
// Tests that all instantiations of a test have named appropriately. Test
|
|
||||||
// defined with TEST_P(TestCaseName, TestName) and instantiated with
|
|
||||||
// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
|
|
||||||
// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
|
|
||||||
// sequence element used to instantiate the test.
|
|
||||||
class NamingTest : public TestWithParam<int> {};
|
|
||||||
|
|
||||||
TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
|
|
||||||
const ::testing::TestInfo* const test_info =
|
|
||||||
::testing::UnitTest::GetInstance()->current_test_info();
|
|
||||||
|
|
||||||
EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
|
|
||||||
|
|
||||||
Message index_stream;
|
|
||||||
index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
|
|
||||||
EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
|
|
||||||
|
|
||||||
EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
|
|
||||||
}
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
|
|
||||||
|
|
||||||
// Class that cannot be streamed into an ostream. It needs to be copyable
|
|
||||||
// (and, in case of MSVC, also assignable) in order to be a test parameter
|
|
||||||
// type. Its default copy constructor and assignment operator do exactly
|
|
||||||
// what we need.
|
|
||||||
class Unstreamable {
|
|
||||||
public:
|
|
||||||
explicit Unstreamable(int value) : value_(value) {}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CommentTest : public TestWithParam<Unstreamable> {};
|
|
||||||
|
|
||||||
TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
|
|
||||||
const ::testing::TestInfo* const test_info =
|
|
||||||
::testing::UnitTest::GetInstance()->current_test_info();
|
|
||||||
|
|
||||||
EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
|
|
||||||
}
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
|
|
||||||
CommentTest,
|
|
||||||
Values(Unstreamable(1)));
|
|
||||||
|
|
||||||
// Verify that we can create a hierarchy of test fixtures, where the base
|
|
||||||
// class fixture is not parameterized and the derived class is. In this case
|
|
||||||
// ParameterizedDerivedTest inherits from NonParameterizedBaseTest. We
|
|
||||||
// perform simple tests on both.
|
|
||||||
class NonParameterizedBaseTest : public ::testing::Test {
|
|
||||||
public:
|
|
||||||
NonParameterizedBaseTest() : n_(17) { }
|
|
||||||
protected:
|
|
||||||
int n_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ParameterizedDerivedTest : public NonParameterizedBaseTest,
|
|
||||||
public ::testing::WithParamInterface<int> {
|
|
||||||
protected:
|
|
||||||
ParameterizedDerivedTest() : count_(0) { }
|
|
||||||
int count_;
|
|
||||||
static int global_count_;
|
|
||||||
};
|
|
||||||
|
|
||||||
int ParameterizedDerivedTest::global_count_ = 0;
|
|
||||||
|
|
||||||
TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
|
|
||||||
EXPECT_EQ(17, n_);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(ParameterizedDerivedTest, SeesSequence) {
|
|
||||||
EXPECT_EQ(17, n_);
|
|
||||||
EXPECT_EQ(0, count_++);
|
|
||||||
EXPECT_EQ(GetParam(), global_count_++);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
|
|
||||||
|
|
||||||
TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
|
|
||||||
EXPECT_DEATH_IF_SUPPORTED(GetParam(),
|
|
||||||
".* value-parameterized test .*");
|
|
||||||
}
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
|
|
||||||
#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
|
|
||||||
FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
|
||||||
// Used in TestGenerationTest test case.
|
|
||||||
AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
|
|
||||||
// Used in GeneratorEvaluationTest test case. Tests that the updated value
|
|
||||||
// will be picked up for instantiating tests in GeneratorEvaluationTest.
|
|
||||||
GeneratorEvaluationTest::set_param_value(1);
|
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
|
||||||
// Used in GeneratorEvaluationTest test case. Tests that value updated
|
|
||||||
// here will NOT be used for instantiating tests in
|
|
||||||
// GeneratorEvaluationTest.
|
|
||||||
GeneratorEvaluationTest::set_param_value(2);
|
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
|
||||||
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue