Unverified Commit 85f059f0 authored by Chris Johnson's avatar Chris Johnson Committed by GitHub
Browse files

Merge pull request #3 from google/master

Update master
parents 130e5aa8 fdd6a1dc
...@@ -39,6 +39,7 @@ gmock_output_test.py ...@@ -39,6 +39,7 @@ gmock_output_test.py
""" """
from io import open # pylint: disable=redefined-builtin, g-importing-member
import os import os
import re import re
import sys import sys
...@@ -152,10 +153,11 @@ def GetNormalizedCommandOutputAndLeakyTests(cmd): ...@@ -152,10 +153,11 @@ def GetNormalizedCommandOutputAndLeakyTests(cmd):
class GMockOutputTest(gmock_test_utils.TestCase): class GMockOutputTest(gmock_test_utils.TestCase):
def testOutput(self): def testOutput(self):
(output, leaky_tests) = GetNormalizedCommandOutputAndLeakyTests(COMMAND) (output, leaky_tests) = GetNormalizedCommandOutputAndLeakyTests(COMMAND)
golden_file = open(GOLDEN_PATH, 'rb') golden_file = open(GOLDEN_PATH, 'rb')
golden = golden_file.read() golden = golden_file.read().decode('utf-8')
golden_file.close() golden_file.close()
# The normalized output should match the golden file. # The normalized output should match the golden file.
......
...@@ -75,14 +75,14 @@ GMOCK WARNING: ...@@ -75,14 +75,14 @@ GMOCK WARNING:
Uninteresting mock function call - returning default value. Uninteresting mock function call - returning default value.
Function call: Bar2(0, 1) Function call: Bar2(0, 1)
Returns: false Returns: false
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details. NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#knowing-when-to-expect for details.
[ OK ] GMockOutputTest.UninterestingCall [ OK ] GMockOutputTest.UninterestingCall
[ RUN ] GMockOutputTest.UninterestingCallToVoidFunction [ RUN ] GMockOutputTest.UninterestingCallToVoidFunction
GMOCK WARNING: GMOCK WARNING:
Uninteresting mock function call - returning directly. Uninteresting mock function call - returning directly.
Function call: Bar3(0, 1) Function call: Bar3(0, 1)
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details. NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#knowing-when-to-expect for details.
[ OK ] GMockOutputTest.UninterestingCallToVoidFunction [ OK ] GMockOutputTest.UninterestingCallToVoidFunction
[ RUN ] GMockOutputTest.RetiredExpectation [ RUN ] GMockOutputTest.RetiredExpectation
unknown file: Failure unknown file: Failure
...@@ -266,14 +266,14 @@ Uninteresting mock function call - taking default action specified at: ...@@ -266,14 +266,14 @@ Uninteresting mock function call - taking default action specified at:
FILE:#: FILE:#:
Function call: Bar2(2, 2) Function call: Bar2(2, 2)
Returns: true Returns: true
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details. NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#knowing-when-to-expect for details.
GMOCK WARNING: GMOCK WARNING:
Uninteresting mock function call - taking default action specified at: Uninteresting mock function call - taking default action specified at:
FILE:#: FILE:#:
Function call: Bar2(1, 1) Function call: Bar2(1, 1)
Returns: false Returns: false
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details. NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#knowing-when-to-expect for details.
[ OK ] GMockOutputTest.UninterestingCallWithDefaultAction [ OK ] GMockOutputTest.UninterestingCallWithDefaultAction
[ RUN ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction [ RUN ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction
......
######################################################################## ########################################################################
# Note: CMake support is community-based. The maintainers do not use CMake
# internally.
#
# CMake build script for Google Test. # CMake build script for Google Test.
# #
# To run the tests for Google Test itself on Linux, use 'make test' or # To run the tests for Google Test itself on Linux, use 'make test' or
...@@ -40,8 +43,12 @@ endif() ...@@ -40,8 +43,12 @@ endif()
# as ${gtest_SOURCE_DIR} and to the root binary directory as # as ${gtest_SOURCE_DIR} and to the root binary directory as
# ${gtest_BINARY_DIR}. # ${gtest_BINARY_DIR}.
# Language "C" is required for find_package(Threads). # Language "C" is required for find_package(Threads).
# Project version:
if (CMAKE_VERSION VERSION_LESS 3.0) if (CMAKE_VERSION VERSION_LESS 3.0)
project(gtest CXX C) project(gtest CXX C)
set(PROJECT_VERSION ${GOOGLETEST_VERSION})
else() else()
cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0048 NEW)
project(gtest VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C) project(gtest VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)
...@@ -93,7 +100,7 @@ if (INSTALL_GTEST) ...@@ -93,7 +100,7 @@ if (INSTALL_GTEST)
set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE INTERNAL "") set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE INTERNAL "")
set(cmake_files_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${cmake_package_name}") set(cmake_files_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${cmake_package_name}")
set(version_file "${generated_dir}/${cmake_package_name}ConfigVersion.cmake") set(version_file "${generated_dir}/${cmake_package_name}ConfigVersion.cmake")
write_basic_package_version_file(${version_file} COMPATIBILITY AnyNewerVersion) write_basic_package_version_file(${version_file} VERSION ${GOOGLETEST_VERSION} COMPATIBILITY AnyNewerVersion)
install(EXPORT ${targets_export_name} install(EXPORT ${targets_export_name}
NAMESPACE ${cmake_package_name}:: NAMESPACE ${cmake_package_name}::
DESTINATION ${cmake_files_install_dir}) DESTINATION ${cmake_files_install_dir})
...@@ -181,7 +188,7 @@ if (gtest_build_tests) ...@@ -181,7 +188,7 @@ if (gtest_build_tests)
"$project_bin = \"${CMAKE_BINARY_DIR}/bin/$<CONFIG>\" "$project_bin = \"${CMAKE_BINARY_DIR}/bin/$<CONFIG>\"
$env:Path = \"$project_bin;$env:Path\" $env:Path = \"$project_bin;$env:Path\"
& $args") & $args")
elseif (MINGW) elseif (MINGW OR CYGWIN)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/RunTest.ps1" file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/RunTest.ps1"
CONTENT CONTENT
"$project_bin = (cygpath --windows ${CMAKE_BINARY_DIR}/bin) "$project_bin = (cygpath --windows ${CMAKE_BINARY_DIR}/bin)
...@@ -218,6 +225,7 @@ $env:Path = \"$project_bin;$env:Path\" ...@@ -218,6 +225,7 @@ $env:Path = \"$project_bin;$env:Path\"
test/gtest-typed-test2_test.cc) test/gtest-typed-test2_test.cc)
cxx_test(gtest_unittest gtest_main) cxx_test(gtest_unittest gtest_main)
cxx_test(gtest-unittest-api_test gtest) cxx_test(gtest-unittest-api_test gtest)
cxx_test(gtest_skip_in_environment_setup_test gtest_main)
cxx_test(gtest_skip_test gtest_main) cxx_test(gtest_skip_test gtest_main)
############################################################ ############################################################
...@@ -258,6 +266,8 @@ $env:Path = \"$project_bin;$env:Path\" ...@@ -258,6 +266,8 @@ $env:Path = \"$project_bin;$env:Path\"
cxx_executable(googletest-break-on-failure-unittest_ test gtest) cxx_executable(googletest-break-on-failure-unittest_ test gtest)
py_test(googletest-break-on-failure-unittest) py_test(googletest-break-on-failure-unittest)
py_test(gtest_skip_environment_check_output_test)
# Visual Studio .NET 2003 does not support STL with exceptions disabled. # Visual Studio .NET 2003 does not support STL with exceptions disabled.
if (NOT MSVC OR MSVC_VERSION GREATER 1310) # 1310 is Visual Studio .NET 2003 if (NOT MSVC OR MSVC_VERSION GREATER 1310) # 1310 is Visual Studio .NET 2003
cxx_executable_with_flags( cxx_executable_with_flags(
......
# 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-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/sample1_unittest.cc \
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-listener_test.cc \
test/gtest-message_test.cc \
test/gtest-options_test.cc \
test/googletest-param-test2-test.cc \
test/googletest-param-test2-test.cc \
test/googletest-param-test-test.cc \
test/googletest-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-typed-test2_test.cc \
test/gtest-typed-test_test.cc \
test/gtest-typed-test_test.h \
test/gtest-unittest-api_test.cc \
test/googletest-break-on-failure-unittest_.cc \
test/googletest-catch-exceptions-test_.cc \
test/googletest-color-test_.cc \
test/googletest-env-var-test_.cc \
test/gtest_environment_test.cc \
test/googletest-filter-unittest_.cc \
test/gtest_help_test_.cc \
test/googletest-list-tests-unittest_.cc \
test/gtest_main_unittest.cc \
test/gtest_no_test_unittest.cc \
test/googletest-output-test_.cc \
test/gtest_pred_impl_unittest.cc \
test/gtest_prod_test.cc \
test/gtest_repeat_test.cc \
test/googletest-shuffle-test_.cc \
test/gtest_sole_header_test.cc \
test/gtest_stress_test.cc \
test/gtest_throw_on_failure_ex_test.cc \
test/googletest-throw-on-failure-test_.cc \
test/googletest-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/googletest-break-on-failure-unittest.py \
test/googletest-catch-exceptions-test.py \
test/googletest-color-test.py \
test/googletest-env-var-test.py \
test/googletest-filter-unittest.py \
test/gtest_help_test.py \
test/googletest-list-tests-unittest.py \
test/googletest-output-test.py \
test/googletest-output-test_golden_lin.txt \
test/googletest-shuffle-test.py \
test/gtest_test_utils.py \
test/googletest-throw-on-failure-test.py \
test/googletest-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/2010/gtest-md.sln \
msvc/2010/gtest-md.vcxproj \
msvc/2010/gtest.sln \
msvc/2010/gtest.vcxproj \
msvc/2010/gtest_main-md.vcxproj \
msvc/2010/gtest_main.vcxproj \
msvc/2010/gtest_prod_test-md.vcxproj \
msvc/2010/gtest_prod_test.vcxproj \
msvc/2010/gtest_unittest-md.vcxproj \
msvc/2010/gtest_unittest.vcxproj
# 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-param-util-generated.h \
include/gtest/internal/gtest-param-util.h \
include/gtest/internal/gtest-port.h \
include/gtest/internal/gtest-port-arch.h \
include/gtest/internal/gtest-string.h \
include/gtest/internal/gtest-type-util.h \
include/gtest/internal/custom/gtest.h \
include/gtest/internal/custom/gtest-port.h \
include/gtest/internal/custom/gtest-printers.h
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
lib_libgtest_main_la_LIBADD = lib/libgtest.la
# Build 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
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 \
samples/sample2_unittest \
samples/sample3_unittest \
samples/sample4_unittest \
samples/sample5_unittest \
samples/sample6_unittest \
samples/sample7_unittest \
samples/sample8_unittest \
samples/sample9_unittest \
samples/sample10_unittest
check_PROGRAMS += samples/sample1_unittest \
samples/sample2_unittest \
samples/sample3_unittest \
samples/sample4_unittest \
samples/sample5_unittest \
samples/sample6_unittest \
samples/sample7_unittest \
samples/sample8_unittest \
samples/sample9_unittest \
samples/sample10_unittest
samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc samples/sample1.cc
samples_sample1_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample2_unittest_SOURCES = samples/sample2_unittest.cc samples/sample2.cc
samples_sample2_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample3_unittest_SOURCES = samples/sample3_unittest.cc
samples_sample3_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample4_unittest_SOURCES = samples/sample4_unittest.cc samples/sample4.cc
samples_sample4_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample5_unittest_SOURCES = samples/sample5_unittest.cc samples/sample1.cc
samples_sample5_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample6_unittest_SOURCES = samples/sample6_unittest.cc
samples_sample6_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample7_unittest_SOURCES = samples/sample7_unittest.cc
samples_sample7_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
samples_sample8_unittest_SOURCES = samples/sample8_unittest.cc
samples_sample8_unittest_LDADD = lib/libgtest_main.la \
lib/libgtest.la
# Also verify that libgtest works by itself.
samples_sample9_unittest_SOURCES = samples/sample9_unittest.cc
samples_sample9_unittest_LDADD = lib/libgtest.la
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
...@@ -6,48 +6,7 @@ To build Google Test and your tests that use it, you need to tell your build ...@@ -6,48 +6,7 @@ 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 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. depends on which build system you use, and is usually straightforward.
#### Build ### Build with CMake
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++ -std=c++11 -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++ -std=c++11 -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 ( Google Test comes with a CMake build script (
[CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt)) [CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt))
...@@ -115,7 +74,7 @@ pulled into the main build with `add_subdirectory()`. For example: ...@@ -115,7 +74,7 @@ pulled into the main build with `add_subdirectory()`. For example:
New file `CMakeLists.txt.in`: New file `CMakeLists.txt.in`:
``` cmake ```cmake
cmake_minimum_required(VERSION 2.8.2) cmake_minimum_required(VERSION 2.8.2)
project(googletest-download NONE) project(googletest-download NONE)
...@@ -135,7 +94,7 @@ ExternalProject_Add(googletest ...@@ -135,7 +94,7 @@ ExternalProject_Add(googletest
Existing build's `CMakeLists.txt`: Existing build's `CMakeLists.txt`:
``` cmake ```cmake
# Download and unpack googletest at configure time # Download and unpack googletest at configure time
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
...@@ -201,48 +160,6 @@ is not feasible, for example in a C project using Google Test for validation, ...@@ -201,48 +160,6 @@ is not feasible, for example in a C project using Google Test for validation,
then it can be specified by adding it to the options for cmake via the then it can be specified by adding it to the options for cmake via the
`DCMAKE_CXX_FLAGS` option. `DCMAKE_CXX_FLAGS` option.
### 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 above 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 ### Tweaking Google Test
Google Test can be used in diverse environments. The default configuration may Google Test can be used in diverse environments. The default configuration may
...@@ -252,14 +169,14 @@ command line. Generally, these macros are named like `GTEST_XYZ` and you define ...@@ -252,14 +169,14 @@ 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. 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 We list the most frequently used macros below. For a complete list, see file
[include/gtest/internal/gtest-port.h](https://github.com/google/googletest/blob/master/include/gtest/internal/gtest-port.h). [include/gtest/internal/gtest-port.h](https://github.com/google/googletest/blob/master/googletest/include/gtest/internal/gtest-port.h).
### Multi-threaded Tests ### Multi-threaded Tests
Google Test is thread-safe where the pthread library is available. After 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 `#include "gtest/gtest.h"`, you can check the
whether this is the case (yes if the macro is `#defined` to 1, no if it's `GTEST_IS_THREADSAFE` macro to see whether this is the case (yes if the macro is
undefined.). `#defined` to 1, no if it's undefined.).
If Google Test doesn't correctly detect whether pthread is available in your If Google Test doesn't correctly detect whether pthread is available in your
environment, you can force it with environment, you can force it with
......
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
# Test and Google Mock's option() definitions, and thus must be # Test and Google Mock's option() definitions, and thus must be
# called *after* the options have been defined. # called *after* the options have been defined.
if (POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif (POLICY CMP0054)
# Tweaks CMake's default compiler/linker settings to suit Google Test's needs. # 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 # This must be a macro(), as inside a function string() can only
...@@ -22,6 +26,8 @@ macro(fix_default_compiler_settings_) ...@@ -22,6 +26,8 @@ macro(fix_default_compiler_settings_)
# This replacement code is taken from sample in the CMake Wiki at # This replacement code is taken from sample in the CMake Wiki at
# https://gitlab.kitware.com/cmake/community/wikis/FAQ#dynamic-replace. # https://gitlab.kitware.com/cmake/community/wikis/FAQ#dynamic-replace.
foreach (flag_var foreach (flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt) if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
...@@ -75,6 +81,12 @@ macro(config_compiler_and_linker) ...@@ -75,6 +81,12 @@ macro(config_compiler_and_linker)
# Suppress "unreachable code" warning # Suppress "unreachable code" warning
# http://stackoverflow.com/questions/3232669 explains the issue. # http://stackoverflow.com/questions/3232669 explains the issue.
set(cxx_base_flags "${cxx_base_flags} -wd4702") set(cxx_base_flags "${cxx_base_flags} -wd4702")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(cxx_base_flags "-Wall -Wshadow -Werror -Wconversion")
set(cxx_exception_flags "-fexceptions")
set(cxx_no_exception_flags "-fno-exceptions")
set(cxx_strict_flags "-W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls")
set(cxx_no_rtti_flags "-fno-rtti")
elseif (CMAKE_COMPILER_IS_GNUCXX) elseif (CMAKE_COMPILER_IS_GNUCXX)
set(cxx_base_flags "-Wall -Wshadow -Werror") set(cxx_base_flags "-Wall -Wshadow -Werror")
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.0) if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.0)
......
# libgtest.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6
# Please DO NOT delete this file!
# It is necessary for linking the library.
# Names of this library.
library_names='libgtest.so'
# Is this an already installed library?
installed=yes
# Should we warn about portability when linking against -modules?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='@CMAKE_INSTALL_FULL_LIBDIR@'
<?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>
\ No newline at end of file
<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>
\ No newline at end of file
// 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"
<?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>
<?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>
\ No newline at end of file
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.8.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
This guide will explain how to use the Google Testing Framework in your Xcode projects on Mac OS X. This tutorial begins by quickly explaining what to do for experienced users. After the quick start, the guide goes provides additional explanation about each step.
# Quick Start #
Here is the quick guide for using Google Test in your Xcode project.
1. Download the source from the [website](https://github.com/google/googletest) using this command: `svn checkout http://googletest.googlecode.com/svn/trunk/ googletest-read-only`.
1. Open up the `gtest.xcodeproj` in the `googletest-read-only/xcode/` directory and build the gtest.framework.
1. Create a new "Shell Tool" target in your Xcode project called something like "UnitTests".
1. Add the gtest.framework to your project and add it to the "Link Binary with Libraries" build phase of "UnitTests".
1. Add your unit test source code to the "Compile Sources" build phase of "UnitTests".
1. Edit the "UnitTests" executable and add an environment variable named "DYLD\_FRAMEWORK\_PATH" with a value equal to the path to the framework containing the gtest.framework relative to the compiled executable.
1. Build and Go.
The following sections further explain each of the steps listed above in depth, describing in more detail how to complete it including some variations.
# Get the Source #
Currently, the gtest.framework discussed here isn't available in a tagged release of Google Test, it is only available in the trunk. As explained at the Google Test [site](https://github.com/google/googletest), you can get the code from anonymous SVN with this command:
```
svn checkout http://googletest.googlecode.com/svn/trunk/ googletest-read-only
```
Alternatively, if you are working with Subversion in your own code base, you can add Google Test as an external dependency to your own Subversion repository. By following this approach, everyone that checks out your svn repository will also receive a copy of Google Test (a specific version, if you wish) without having to check it out explicitly. This makes the set up of your project simpler and reduces the copied code in the repository.
To use `svn:externals`, decide where you would like to have the external source reside. You might choose to put the external source inside the trunk, because you want it to be part of the branch when you make a release. However, keeping it outside the trunk in a version-tagged directory called something like `third-party/googletest/1.0.1`, is another option. Once the location is established, use `svn propedit svn:externals _directory_` to set the svn:externals property on a directory in your repository. This directory won't contain the code, but be its versioned parent directory.
The command `svn propedit` will bring up your Subversion editor, making editing the long, (potentially multi-line) property simpler. This same method can be used to check out a tagged branch, by using the appropriate URL (e.g. `https://github.com/google/googletest/releases/tag/release-1.0.1`). Additionally, the svn:externals property allows the specification of a particular revision of the trunk with the `-r_##_` option (e.g. `externals/src/googletest -r60 http://googletest.googlecode.com/svn/trunk`).
Here is an example of using the svn:externals properties on a trunk (read via `svn propget`) of a project. This value checks out a copy of Google Test into the `trunk/externals/src/googletest/` directory.
```
[Computer:svn] user$ svn propget svn:externals trunk
externals/src/googletest http://googletest.googlecode.com/svn/trunk
```
# Add the Framework to Your Project #
The next step is to build and add the gtest.framework to your own project. This guide describes two common ways below.
* **Option 1** --- The simplest way to add Google Test to your own project, is to open gtest.xcodeproj (found in the xcode/ directory of the Google Test trunk) and build the framework manually. Then, add the built framework into your project using the "Add->Existing Framework..." from the context menu or "Project->Add..." from the main menu. The gtest.framework is relocatable and contains the headers and object code that you'll need to make tests. This method requires rebuilding every time you upgrade Google Test in your project.
* **Option 2** --- If you are going to be living off the trunk of Google Test, incorporating its latest features into your unit tests (or are a Google Test developer yourself). You'll want to rebuild the framework every time the source updates. to do this, you'll need to add the gtest.xcodeproj file, not the framework itself, to your own Xcode project. Then, from the build products that are revealed by the project's disclosure triangle, you can find the gtest.framework, which can be added to your targets (discussed below).
# Make a Test Target #
To start writing tests, make a new "Shell Tool" target. This target template is available under BSD, Cocoa, or Carbon. Add your unit test source code to the "Compile Sources" build phase of the target.
Next, you'll want to add gtest.framework in two different ways, depending upon which option you chose above.
* **Option 1** --- During compilation, Xcode will need to know that you are linking against the gtest.framework. Add the gtest.framework to the "Link Binary with Libraries" build phase of your test target. This will include the Google Test headers in your header search path, and will tell the linker where to find the library.
* **Option 2** --- If your working out of the trunk, you'll also want to add gtest.framework to your "Link Binary with Libraries" build phase of your test target. In addition, you'll want to add the gtest.framework as a dependency to your unit test target. This way, Xcode will make sure that gtest.framework is up to date, every time your build your target. Finally, if you don't share build directories with Google Test, you'll have to copy the gtest.framework into your own build products directory using a "Run Script" build phase.
# Set Up the Executable Run Environment #
Since the unit test executable is a shell tool, it doesn't have a bundle with a `Contents/Frameworks` directory, in which to place gtest.framework. Instead, the dynamic linker must be told at runtime to search for the framework in another location. This can be accomplished by setting the "DYLD\_FRAMEWORK\_PATH" environment variable in the "Edit Active Executable ..." Arguments tab, under "Variables to be set in the environment:". The path for this value is the path (relative or absolute) of the directory containing the gtest.framework.
If you haven't set up the DYLD\_FRAMEWORK\_PATH, correctly, you might get a message like this:
```
[Session started at 2008-08-15 06:23:57 -0600.]
dyld: Library not loaded: @loader_path/../Frameworks/gtest.framework/Versions/A/gtest
Referenced from: /Users/username/Documents/Sandbox/gtestSample/build/Debug/WidgetFrameworkTest
Reason: image not found
```
To correct this problem, go to to the directory containing the executable named in "Referenced from:" value in the error message above. Then, with the terminal in this location, find the relative path to the directory containing the gtest.framework. That is the value you'll need to set as the DYLD\_FRAMEWORK\_PATH.
# Build and Go #
Now, when you click "Build and Go", the test will be executed. Dumping out something like this:
```
[Session started at 2008-08-06 06:36:13 -0600.]
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from WidgetInitializerTest
[ RUN ] WidgetInitializerTest.TestConstructor
[ OK ] WidgetInitializerTest.TestConstructor
[ RUN ] WidgetInitializerTest.TestConversion
[ OK ] WidgetInitializerTest.TestConversion
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran.
[ PASSED ] 2 tests.
The Debugger has exited with status 0.
```
# Summary #
Unit testing is a valuable way to ensure your data model stays valid even during rapid development or refactoring. The Google Testing Framework is a great unit testing framework for C and C++ which integrates well with an Xcode development environment.
# Advanced googletest Topics # Advanced googletest Topics
<!-- GOOGLETEST_CM0016 DO NOT DELETE -->
## Introduction ## Introduction
Now that you have read the [googletest Primer](primer.md) and learned how to write Now that you have read the [googletest Primer](primer.md) and learned how to
tests using googletest, it's time to learn some new tricks. This document will write tests using googletest, it's time to learn some new tricks. This document
show you more assertions as well as how to construct complex failure messages, will show you more assertions as well as how to construct complex failure
propagate fatal failures, reuse and speed up your test fixtures, and use various messages, propagate fatal failures, reuse and speed up your test fixtures, and
flags with your tests. use various flags with your tests.
## More Assertions ## More Assertions
...@@ -56,8 +57,6 @@ switch(expression) { ...@@ -56,8 +57,6 @@ switch(expression) {
NOTE: you can only use `FAIL()` in functions that return `void`. See the NOTE: you can only use `FAIL()` in functions that return `void`. See the
[Assertion Placement section](#assertion-placement) for more information. [Assertion Placement section](#assertion-placement) for more information.
**Availability**: Linux, Windows, Mac.
### Exception Assertions ### Exception Assertions
These are for verifying that a piece of code throws (or does not throw) an These are for verifying that a piece of code throws (or does not throw) an
...@@ -80,8 +79,7 @@ EXPECT_NO_THROW({ ...@@ -80,8 +79,7 @@ EXPECT_NO_THROW({
}); });
``` ```
**Availability**: Linux, Windows, Mac; requires exceptions to be enabled in the **Availability**: requires exceptions to be enabled in the build environment
build environment (note that `google3` **disables** exceptions).
### Predicate Assertions for Better Error Messages ### Predicate Assertions for Better Error Messages
...@@ -103,12 +101,15 @@ If you already have a function or functor that returns `bool` (or a type that ...@@ -103,12 +101,15 @@ If you already have a function or functor that returns `bool` (or a type that
can be implicitly converted to `bool`), you can use it in a *predicate can be implicitly converted to `bool`), you can use it in a *predicate
assertion* to get the function arguments printed for free: assertion* to get the function arguments printed for free:
| Fatal assertion | Nonfatal assertion | Verifies | <!-- mdformat off(github rendering does not support multiline tables) -->
| ---------------------------------- | ---------------------------------- | --------------------------- |
| `ASSERT_PRED1(pred1, val1);` | `EXPECT_PRED1(pred1, val1);` | `pred1(val1)` is true | | Fatal assertion | Nonfatal assertion | Verifies |
| `ASSERT_PRED2(pred2, val1, val2);` | `EXPECT_PRED2(pred2, val1, val2);` | `pred2(val1, val2)` is true | | --------------------------------- | --------------------------------- | --------------------------- |
| `...` | `...` | ... | | `ASSERT_PRED1(pred1, val1)` | `EXPECT_PRED1(pred1, val1)` | `pred1(val1)` is true |
| `ASSERT_PRED2(pred2, val1, val2)` | `EXPECT_PRED2(pred2, val1, val2)` | `pred1(val1, val2)` is true |
| `...` | `...` | `...` |
<!-- mdformat on-->
In the above, `predn` is an `n`-ary predicate function or functor, where `val1`, In the above, `predn` is an `n`-ary predicate function or functor, where `val1`,
`val2`, ..., and `valn` are its arguments. The assertion succeeds if the `val2`, ..., and `valn` are its arguments. The assertion succeeds if the
predicate returns `true` when applied to the given arguments, and fails predicate returns `true` when applied to the given arguments, and fails
...@@ -150,11 +151,8 @@ c is 10 ...@@ -150,11 +151,8 @@ c is 10
> >
> 1. If you see a compiler error "no matching function to call" when using > 1. If you see a compiler error "no matching function to call" when using
> `ASSERT_PRED*` or `EXPECT_PRED*`, please see > `ASSERT_PRED*` or `EXPECT_PRED*`, please see
> [this](faq.md#the-compiler-complains-no-matching-function-to-call-when-i-use-assert_pred-how-do-i-fix-it) for how to resolve it. > [this](faq.md#the-compiler-complains-no-matching-function-to-call-when-i-use-assert-pred-how-do-i-fix-it)
> 1. Currently we only provide predicate assertions of arity <= 5. If you need > for how to resolve it.
> a higher-arity assertion, let [us](https://github.com/google/googletest/issues) know.
**Availability**: Linux, Windows, Mac.
#### Using a Function That Returns an AssertionResult #### Using a Function That Returns an AssertionResult
...@@ -243,8 +241,6 @@ Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print ...@@ -243,8 +241,6 @@ Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print
Expected: false Expected: false
``` ```
**Availability**: Linux, Windows, Mac.
#### Using a Predicate-Formatter #### Using a Predicate-Formatter
If you find the default message generated by `(ASSERT|EXPECT)_PRED*` and If you find the default message generated by `(ASSERT|EXPECT)_PRED*` and
...@@ -317,8 +313,6 @@ As you may have realized, many of the built-in assertions we introduced earlier ...@@ -317,8 +313,6 @@ As you may have realized, many of the built-in assertions we introduced earlier
are special cases of `(EXPECT|ASSERT)_PRED_FORMAT*`. In fact, most of them are are special cases of `(EXPECT|ASSERT)_PRED_FORMAT*`. In fact, most of them are
indeed defined using `(EXPECT|ASSERT)_PRED_FORMAT*`. indeed defined using `(EXPECT|ASSERT)_PRED_FORMAT*`.
**Availability**: Linux, Windows, Mac.
### Floating-Point Comparison ### Floating-Point Comparison
Comparing floating-point numbers is tricky. Due to round-off errors, it is very Comparing floating-point numbers is tricky. Due to round-off errors, it is very
...@@ -337,24 +331,26 @@ want to learn more, see ...@@ -337,24 +331,26 @@ want to learn more, see
#### Floating-Point Macros #### Floating-Point Macros
| Fatal assertion | Nonfatal assertion | Verifies | <!-- mdformat off(github rendering does not support multiline tables) -->
| ------------------------------- | ------------------------------ | ---------------------------------------- |
| `ASSERT_FLOAT_EQ(val1, val2);` | `EXPECT_FLOAT_EQ(val1,val2);` | the two `float` values are almost equal |
| `ASSERT_DOUBLE_EQ(val1, val2);` | `EXPECT_DOUBLE_EQ(val1, val2);`| the two `double` values are almost equal |
By "almost equal" we mean the values are within 4 ULP's from each other. | Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------- | ------------------------------- | ---------------------------------------- |
| `ASSERT_FLOAT_EQ(val1, val2);` | `EXPECT_FLOAT_EQ(val1, val2);` | the two `float` values are almost equal |
| `ASSERT_DOUBLE_EQ(val1, val2);` | `EXPECT_DOUBLE_EQ(val1, val2);` | the two `double` values are almost equal |
NOTE: `CHECK_DOUBLE_EQ()` in `base/logging.h` uses a fixed absolute error bound, <!-- mdformat on-->
so its result may differ from that of the googletest macros. That macro is
unsafe and has been deprecated. Please don't use it any more. By "almost equal" we mean the values are within 4 ULP's from each other.
The following assertions allow you to choose the acceptable error bound: The following assertions allow you to choose the acceptable error bound:
| Fatal assertion | Nonfatal assertion | Verifies | <!-- mdformat off(github rendering does not support multiline tables) -->
| ------------------------------------- | ------------------------------------- | ------------------------- |
| Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------- |
| `ASSERT_NEAR(val1, val2, abs_error);` | `EXPECT_NEAR(val1, val2, abs_error);` | the difference between `val1` and `val2` doesn't exceed the given absolute error | | `ASSERT_NEAR(val1, val2, abs_error);` | `EXPECT_NEAR(val1, val2, abs_error);` | the difference between `val1` and `val2` doesn't exceed the given absolute error |
**Availability**: Linux, Windows, Mac. <!-- mdformat on-->
#### Floating-Point Predicate-Format Functions #### Floating-Point Predicate-Format Functions
...@@ -371,19 +367,20 @@ EXPECT_PRED_FORMAT2(::testing::DoubleLE, val1, val2); ...@@ -371,19 +367,20 @@ EXPECT_PRED_FORMAT2(::testing::DoubleLE, val1, val2);
Verifies that `val1` is less than, or almost equal to, `val2`. You can replace Verifies that `val1` is less than, or almost equal to, `val2`. You can replace
`EXPECT_PRED_FORMAT2` in the above table with `ASSERT_PRED_FORMAT2`. `EXPECT_PRED_FORMAT2` in the above table with `ASSERT_PRED_FORMAT2`.
**Availability**: Linux, Windows, Mac.
### Asserting Using gMock Matchers ### Asserting Using gMock Matchers
Google-developed C++ mocking framework [gMock](../../googlemock) comes with a [gMock](../../googlemock) comes with a library of matchers for validating
library of matchers for validating arguments passed to mock objects. A gMock arguments passed to mock objects. A gMock *matcher* is basically a predicate
*matcher* is basically a predicate that knows how to describe itself. It can be that knows how to describe itself. It can be used in these assertion macros:
used in these assertion macros:
<!-- mdformat off(github rendering does not support multiline tables) -->
| Fatal assertion | Nonfatal assertion | Verifies | | Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------ | ------------------------------ | --------------------- | | ------------------------------ | ------------------------------ | --------------------- |
| `ASSERT_THAT(value, matcher);` | `EXPECT_THAT(value, matcher);` | value matches matcher | | `ASSERT_THAT(value, matcher);` | `EXPECT_THAT(value, matcher);` | value matches matcher |
<!-- mdformat on-->
For example, `StartsWith(prefix)` is a matcher that matches a string starting For example, `StartsWith(prefix)` is a matcher that matches a string starting
with `prefix`, and you can write: with `prefix`, and you can write:
...@@ -394,39 +391,27 @@ using ::testing::StartsWith; ...@@ -394,39 +391,27 @@ using ::testing::StartsWith;
EXPECT_THAT(Foo(), StartsWith("Hello")); EXPECT_THAT(Foo(), StartsWith("Hello"));
``` ```
Read this [recipe](../../googlemock/docs/CookBook.md#using-matchers-in-google-test-assertions) in Read this
the gMock Cookbook for more details. [recipe](../../googlemock/docs/cook_book.md#using-matchers-in-googletest-assertions)
in the gMock Cookbook for more details.
gMock has a rich set of matchers. You can do many things googletest cannot do gMock has a rich set of matchers. You can do many things googletest cannot do
alone with them. For a list of matchers gMock provides, read alone with them. For a list of matchers gMock provides, read
[this](../../googlemock/docs/CookBook.md#using-matchers). Especially useful among them are [this](../../googlemock/docs/cook_book.md##using-matchers). It's easy to write
some [protocol buffer matchers](https://github.com/google/nucleus/blob/master/nucleus/testing/protocol-buffer-matchers.h). It's easy to write your [own matchers](../../googlemock/docs/cook_book.md#NewMatchers) too.
your [own matchers](../../googlemock/docs/CookBook.md#writing-new-matchers-quickly) too.
For example, you can use gMock's
[EqualsProto](https://github.com/google/nucleus/blob/master/nucleus/testing/protocol-buffer-matchers.h)
to compare protos in your tests:
```c++
#include "testing/base/public/gmock.h"
using ::testing::EqualsProto;
...
EXPECT_THAT(actual_proto, EqualsProto("foo: 123 bar: 'xyz'"));
EXPECT_THAT(*actual_proto_ptr, EqualsProto(expected_proto));
```
gMock is bundled with googletest, so you don't need to add any build dependency gMock is bundled with googletest, so you don't need to add any build dependency
in order to take advantage of this. Just include `"testing/base/public/gmock.h"` in order to take advantage of this. Just include `"testing/base/public/gmock.h"`
and you're ready to go. and you're ready to go.
**Availability**: Linux, Windows, and Mac.
### More String Assertions ### More String Assertions
(Please read the [previous](#asserting-using-gmock-matchers) section first if you haven't.) (Please read the [previous](#asserting-using-gmock-matchers) section first if
you haven't.)
You can use the gMock [string matchers](../../googlemock/docs/CheatSheet.md#string-matchers) You can use the gMock
with `EXPECT_THAT()` or `ASSERT_THAT()` to do more string comparison tricks [string matchers](../../googlemock/docs/cheat_sheet.md#string-matchers) with
`EXPECT_THAT()` or `ASSERT_THAT()` to do more string comparison tricks
(sub-string, prefix, suffix, regular expression, and etc). For example, (sub-string, prefix, suffix, regular expression, and etc). For example,
```c++ ```c++
...@@ -437,11 +422,9 @@ using ::testing::MatchesRegex; ...@@ -437,11 +422,9 @@ using ::testing::MatchesRegex;
EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+")); EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+"));
``` ```
**Availability**: Linux, Windows, Mac.
If the string contains a well-formed HTML or XML document, you can check whether If the string contains a well-formed HTML or XML document, you can check whether
its DOM tree matches an [XPath its DOM tree matches an
expression](http://www.w3.org/TR/xpath/#contents): [XPath expression](http://www.w3.org/TR/xpath/#contents):
```c++ ```c++
// Currently still in //template/prototemplate/testing:xpath_matcher // Currently still in //template/prototemplate/testing:xpath_matcher
...@@ -450,8 +433,6 @@ using prototemplate::testing::MatchesXPath; ...@@ -450,8 +433,6 @@ using prototemplate::testing::MatchesXPath;
EXPECT_THAT(html_string, MatchesXPath("//a[text()='click here']")); EXPECT_THAT(html_string, MatchesXPath("//a[text()='click here']"));
``` ```
**Availability**: Linux.
### Windows HRESULT assertions ### Windows HRESULT assertions
These assertions test for `HRESULT` success or failure. These assertions test for `HRESULT` success or failure.
...@@ -473,8 +454,6 @@ CComVariant empty; ...@@ -473,8 +454,6 @@ CComVariant empty;
ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty)); ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));
``` ```
**Availability**: Windows.
### Type Assertions ### Type Assertions
You can call the function You can call the function
...@@ -515,8 +494,6 @@ void Test2() { Foo<bool> foo; foo.Bar(); } ...@@ -515,8 +494,6 @@ void Test2() { Foo<bool> foo; foo.Bar(); }
to cause a compiler error. to cause a compiler error.
**Availability**: Linux, Windows, Mac.
### Assertion Placement ### Assertion Placement
You can use assertions in any C++ function. In particular, it doesn't have to be You can use assertions in any C++ function. In particular, it doesn't have to be
...@@ -540,14 +517,17 @@ that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`. ...@@ -540,14 +517,17 @@ that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`.
NOTE: Constructors and destructors are not considered void-returning functions, NOTE: Constructors and destructors are not considered void-returning functions,
according to the C++ language specification, and so you may not use fatal according to the C++ language specification, and so you may not use fatal
assertions in them. You'll get a compilation error if you try. A simple assertions in them; you'll get a compilation error if you try. Instead, either
workaround is to transfer the entire body of the constructor or destructor to a call `abort` and crash the entire test executable, or put the fatal assertion in
private void-returning method. However, you should be aware that a fatal a `SetUp`/`TearDown` function; see
assertion failure in a constructor does not terminate the current test, as your [constructor/destructor vs. `SetUp`/`TearDown`](faq.md#CtorVsSetUp)
intuition might suggest; it merely returns from the constructor early, possibly
leaving your object in a partially-constructed state. Likewise, a fatal WARNING: A fatal assertion in a helper function (private void-returning method)
assertion failure in a destructor may leave your object in a called from a constructor or destructor does not does not terminate the current
partially-destructed state. Use assertions carefully in these situations! test, as your intuition might suggest: it merely returns from the constructor or
destructor early, possibly leaving your object in a partially-constructed or
partially-destructed state! You almost certainly want to `abort` or use
`SetUp`/`TearDown` instead.
## Teaching googletest How to Print Your Values ## Teaching googletest How to Print Your Values
...@@ -563,8 +543,6 @@ to do a better job at printing your particular type than to dump the bytes. To ...@@ -563,8 +543,6 @@ to do a better job at printing your particular type than to dump the bytes. To
do that, define `<<` for your type: do that, define `<<` for your type:
```c++ ```c++
// Streams are allowed only for logging. Don't include this for
// any other purpose.
#include <ostream> #include <ostream>
namespace foo { namespace foo {
...@@ -593,8 +571,6 @@ doesn't do what you want (and you cannot change it). If so, you can instead ...@@ -593,8 +571,6 @@ doesn't do what you want (and you cannot change it). If so, you can instead
define a `PrintTo()` function like this: define a `PrintTo()` function like this:
```c++ ```c++
// Streams are allowed only for logging. Don't include this for
// any other purpose.
#include <ostream> #include <ostream>
namespace foo { namespace foo {
...@@ -645,11 +621,10 @@ Since these precondition checks cause the processes to die, we call such tests ...@@ -645,11 +621,10 @@ Since these precondition checks cause the processes to die, we call such tests
_death tests_. More generally, any test that checks that a program terminates _death tests_. More generally, any test that checks that a program terminates
(except by throwing an exception) in an expected fashion is also a death test. (except by throwing an exception) in an expected fashion is also a death test.
Note that if a piece of code throws an exception, we don't consider it "death" Note that if a piece of code throws an exception, we don't consider it "death"
for the purpose of death tests, as the caller of the code could catch the for the purpose of death tests, as the caller of the code could catch the
exception and avoid the crash. If you want to verify exceptions thrown by your exception and avoid the crash. If you want to verify exceptions thrown by your
code, see [Exception Assertions](#exception-assertions). code, see [Exception Assertions](#ExceptionAssertions).
If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see
Catching Failures Catching Failures
...@@ -658,19 +633,20 @@ Catching Failures ...@@ -658,19 +633,20 @@ Catching Failures
googletest has the following macros to support death tests: googletest has the following macros to support death tests:
Fatal assertion | Nonfatal assertion | Verifies Fatal assertion | Nonfatal assertion | Verifies
---------------------------------------------- | ---------------------------------------------- | -------- ------------------------------------------------ | ------------------------------------------------ | --------
`ASSERT_DEATH(statement, regex);` | `EXPECT_DEATH(statement, regex);` | `statement` crashes with the given error `ASSERT_DEATH(statement, matcher);` | `EXPECT_DEATH(statement, matcher);` | `statement` crashes with the given error
`ASSERT_DEATH_IF_SUPPORTED(statement, regex);` | `EXPECT_DEATH_IF_SUPPORTED(statement, regex);` | if death tests are supported, verifies that `statement` crashes with the given error; otherwise verifies nothing `ASSERT_DEATH_IF_SUPPORTED(statement, matcher);` | `EXPECT_DEATH_IF_SUPPORTED(statement, matcher);` | if death tests are supported, verifies that `statement` crashes with the given error; otherwise verifies nothing
`ASSERT_EXIT(statement, predicate, regex);` | `EXPECT_EXIT(statement, predicate, regex);` | `statement` exits with the given error, and its exit code matches `predicate` `ASSERT_EXIT(statement, predicate, matcher);` | `EXPECT_EXIT(statement, predicate, matcher);` | `statement` exits with the given error, and its exit code matches `predicate`
where `statement` is a statement that is expected to cause the process to die, where `statement` is a statement that is expected to cause the process to die,
`predicate` is a function or function object that evaluates an integer exit `predicate` is a function or function object that evaluates an integer exit
status, and `regex` is a (Perl) regular expression that the stderr output of status, and `matcher` is either a GMock matcher matching a `const std::string&`
`statement` is expected to match. Note that `statement` can be *any valid or a (Perl) regular expression - either of which is matched against the stderr
statement* (including *compound statement*) and doesn't have to be an output of `statement`. For legacy reasons, a bare string (i.e. with no matcher)
expression. is interpreted as `ContainsRegex(str)`, **not** `Eq(str)`. Note that `statement`
can be *any valid statement* (including *compound statement*) and doesn't have
to be an expression.
As usual, the `ASSERT` variants abort the current test function, while the As usual, the `ASSERT` variants abort the current test function, while the
`EXPECT` variants do not. `EXPECT` variants do not.
...@@ -751,9 +727,9 @@ necessary. ...@@ -751,9 +727,9 @@ necessary.
### Death Test Naming ### Death Test Naming
IMPORTANT: We strongly recommend you to follow the convention of naming your IMPORTANT: We strongly recommend you to follow the convention of naming your
**test case** (not test) `*DeathTest` when it contains a death test, as **test suite** (not test) `*DeathTest` when it contains a death test, as
demonstrated in the above example. The [Death Tests And demonstrated in the above example. The
Threads](#death-tests-and-threads) section below explains why. [Death Tests And Threads](#death-tests-and-threads) section below explains why.
If a test fixture class is shared by normal tests and death tests, you can use If a test fixture class is shared by normal tests and death tests, you can use
`using` or `typedef` to introduce an alias for the fixture class and avoid `using` or `typedef` to introduce an alias for the fixture class and avoid
...@@ -773,11 +749,8 @@ TEST_F(FooDeathTest, DoesThat) { ...@@ -773,11 +749,8 @@ TEST_F(FooDeathTest, DoesThat) {
} }
``` ```
**Availability**: Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac
### Regular Expression Syntax ### Regular Expression Syntax
On POSIX systems (e.g. Linux, Cygwin, and Mac), googletest uses the On POSIX systems (e.g. Linux, Cygwin, and Mac), googletest uses the
[POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04) [POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04)
syntax. To learn about this syntax, you may want to read this syntax. To learn about this syntax, you may want to read this
...@@ -815,10 +788,9 @@ Expression | Meaning ...@@ -815,10 +788,9 @@ Expression | Meaning
To help you determine which capability is available on your system, googletest To help you determine which capability is available on your system, googletest
defines macros to govern which regular expression it is using. The macros are: defines macros to govern which regular expression it is using. The macros are:
<!--absl:google3-begin(google3-only)-->`GTEST_USES_PCRE=1`, or `GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If you want your death
<!--absl:google3-end--> `GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If tests to work in all cases, you can either `#if` on these macros or use the more
you want your death tests to work in all cases, you can either `#if` on these limited syntax only.
macros or use the more limited syntax only.
### How It Works ### How It Works
...@@ -840,11 +812,7 @@ initialized from the command-line flag `--gtest_death_test_style`). ...@@ -840,11 +812,7 @@ initialized from the command-line flag `--gtest_death_test_style`).
consideration to be run - much like the `threadsafe` mode on POSIX. consideration to be run - much like the `threadsafe` mode on POSIX.
Other values for the variable are illegal and will cause the death test to fail. Other values for the variable are illegal and will cause the death test to fail.
Currently, the flag's default value is Currently, the flag's default value is **"fast"**
"fast". However, we reserve
the right to change it in the future. Therefore, your tests should not depend on
this. In either case, the parent process waits for the child process to
complete, and checks that
1. the child's exit status satisfies the predicate, and 1. the child's exit status satisfies the predicate, and
2. the child's stderr matches the regular expression. 2. the child's stderr matches the regular expression.
...@@ -865,7 +833,8 @@ googletest has three features intended to raise awareness of threading issues. ...@@ -865,7 +833,8 @@ googletest has three features intended to raise awareness of threading issues.
1. A warning is emitted if multiple threads are running when a death test is 1. A warning is emitted if multiple threads are running when a death test is
encountered. encountered.
2. Test cases with a name ending in "DeathTest" are run before all other tests. 2. Test suites with a name ending in "DeathTest" are run before all other
tests.
3. It uses `clone()` instead of `fork()` to spawn the child process on Linux 3. It uses `clone()` instead of `fork()` to spawn the child process on Linux
(`clone()` is not available on Cygwin and Mac), as `fork()` is more likely (`clone()` is not available on Cygwin and Mac), as `fork()` is more likely
to cause the child to hang when the parent process has multiple threads. to cause the child to hang when the parent process has multiple threads.
...@@ -875,7 +844,6 @@ executed in a separate process and cannot affect the parent. ...@@ -875,7 +844,6 @@ executed in a separate process and cannot affect the parent.
### Death Test Styles ### Death Test Styles
The "threadsafe" death test style was introduced in order to help mitigate the The "threadsafe" death test style was introduced in order to help mitigate the
risks of testing in a possibly multithreaded environment. It trades increased risks of testing in a possibly multithreaded environment. It trades increased
test execution time (potentially dramatically so) for improved thread safety. test execution time (potentially dramatically so) for improved thread safety.
...@@ -910,7 +878,6 @@ TEST(MyDeathTest, TestTwo) { ...@@ -910,7 +878,6 @@ TEST(MyDeathTest, TestTwo) {
} }
``` ```
### Caveats ### Caveats
The `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If The `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If
...@@ -944,10 +911,9 @@ handlers registered with `pthread_atfork(3)`. ...@@ -944,10 +911,9 @@ handlers registered with `pthread_atfork(3)`.
If a test sub-routine is called from several places, when an assertion inside it If a test sub-routine is called from several places, when an assertion inside it
fails, it can be hard to tell which invocation of the sub-routine the failure is fails, it can be hard to tell which invocation of the sub-routine the failure is
from. from. You can alleviate this problem using extra logging or custom failure
You can alleviate this problem using extra logging or custom failure messages, messages, but that usually clutters up your tests. A better solution is to use
but that usually clutters up your tests. A better solution is to use the the `SCOPED_TRACE` macro or the `ScopedTrace` utility:
`SCOPED_TRACE` macro or the `ScopedTrace` utility:
```c++ ```c++
SCOPED_TRACE(message); SCOPED_TRACE(message);
...@@ -964,8 +930,8 @@ For example, ...@@ -964,8 +930,8 @@ For example,
```c++ ```c++
10: void Sub1(int n) { 10: void Sub1(int n) {
11: EXPECT_EQ(1, Bar(n)); 11: EXPECT_EQ(Bar(n), 1);
12: EXPECT_EQ(2, Bar(n + 1)); 12: EXPECT_EQ(Bar(n + 1), 2);
13: } 13: }
14: 14:
15: TEST(FooTest, Bar) { 15: TEST(FooTest, Bar) {
...@@ -996,10 +962,9 @@ Expected: 2 ...@@ -996,10 +962,9 @@ Expected: 2
``` ```
Without the trace, it would've been difficult to know which invocation of Without the trace, it would've been difficult to know which invocation of
`Sub1()` the two failures come from respectively. (You could add `Sub1()` the two failures come from respectively. (You could add an extra
message to each assertion in `Sub1()` to indicate the value of `n`, but that's
an extra message to each assertion in `Sub1()` to indicate the value of `n`, but tedious.)
that's tedious.)
Some tips on using `SCOPED_TRACE`: Some tips on using `SCOPED_TRACE`:
...@@ -1017,8 +982,6 @@ Some tips on using `SCOPED_TRACE`: ...@@ -1017,8 +982,6 @@ Some tips on using `SCOPED_TRACE`:
5. The trace dump is clickable in Emacs - hit `return` on a line number and 5. The trace dump is clickable in Emacs - hit `return` on a line number and
you'll be taken to that line in the source file! you'll be taken to that line in the source file!
**Availability**: Linux, Windows, Mac.
### Propagating Fatal Failures ### Propagating Fatal Failures
A common pitfall when using `ASSERT_*` and `FAIL*` is not understanding that A common pitfall when using `ASSERT_*` and `FAIL*` is not understanding that
...@@ -1099,8 +1062,7 @@ EXPECT_NO_FATAL_FAILURE({ ...@@ -1099,8 +1062,7 @@ EXPECT_NO_FATAL_FAILURE({
}); });
``` ```
**Availability**: Linux, Windows, Mac. Assertions from multiple threads are Assertions from multiple threads are currently not supported on Windows.
currently not supported on Windows.
#### Checking for Failures in the Current Test #### Checking for Failures in the Current Test
...@@ -1141,14 +1103,13 @@ Similarly, `HasNonfatalFailure()` returns `true` if the current test has at ...@@ -1141,14 +1103,13 @@ Similarly, `HasNonfatalFailure()` returns `true` if the current test has at
least one non-fatal failure, and `HasFailure()` returns `true` if the current least one non-fatal failure, and `HasFailure()` returns `true` if the current
test has at least one failure of either kind. test has at least one failure of either kind.
**Availability**: Linux, Windows, Mac.
## Logging Additional Information ## Logging Additional Information
In your test code, you can call `RecordProperty("key", value)` to log additional In your test code, you can call `RecordProperty("key", value)` to log additional
information, where `value` can be either a string or an `int`. The *last* value information, where `value` can be either a string or an `int`. The *last* value
recorded for a key will be emitted to the [XML output](#generating-an-xml-report) if you recorded for a key will be emitted to the
specify one. For example, the test [XML output](#generating-an-xml-report) if you specify one. For example, the
test
```c++ ```c++
TEST_F(WidgetUsageTest, MinAndMaxWidgets) { TEST_F(WidgetUsageTest, MinAndMaxWidgets) {
...@@ -1174,15 +1135,13 @@ will output XML like this: ...@@ -1174,15 +1135,13 @@ will output XML like this:
> ones already used by googletest (`name`, `status`, `time`, `classname`, > ones already used by googletest (`name`, `status`, `time`, `classname`,
> `type_param`, and `value_param`). > `type_param`, and `value_param`).
> * Calling `RecordProperty()` outside of the lifespan of a test is allowed. > * Calling `RecordProperty()` outside of the lifespan of a test is allowed.
> If it's called outside of a test but between a test case's > If it's called outside of a test but between a test suite's
> `SetUpTestCase()` and `TearDownTestCase()` methods, it will be attributed > `SetUpTestSuite()` and `TearDownTestSuite()` methods, it will be
> to the XML element for the test case. If it's called outside of all test > attributed to the XML element for the test suite. If it's called outside
> cases (e.g. in a test environment), it will be attributed to the top-level > of all test suites (e.g. in a test environment), it will be attributed to
> XML element. > the top-level XML element.
**Availability**: Linux, Windows, Mac. ## Sharing Resources Between Tests in the Same Test Suite
## Sharing Resources Between Tests in the Same Test Case
googletest creates a new test fixture object for each test in order to make googletest creates a new test fixture object for each test in order to make
tests independent and easier to debug. However, sometimes tests use resources tests independent and easier to debug. However, sometimes tests use resources
...@@ -1191,20 +1150,20 @@ expensive. ...@@ -1191,20 +1150,20 @@ expensive.
If the tests don't change the resource, there's no harm in their sharing a If the tests don't change the resource, there's no harm in their sharing a
single resource copy. So, in addition to per-test set-up/tear-down, googletest single resource copy. So, in addition to per-test set-up/tear-down, googletest
also supports per-test-case set-up/tear-down. To use it: also supports per-test-suite set-up/tear-down. To use it:
1. In your test fixture class (say `FooTest` ), declare as `static` some member 1. In your test fixture class (say `FooTest` ), declare as `static` some member
variables to hold the shared resources. variables to hold the shared resources.
1. Outside your test fixture class (typically just below it), define those 2. Outside your test fixture class (typically just below it), define those
member variables, optionally giving them initial values. member variables, optionally giving them initial values.
1. In the same test fixture class, define a `static void SetUpTestCase()` 3. In the same test fixture class, define a `static void SetUpTestSuite()`
function (remember not to spell it as **`SetupTestCase`** with a small `u`!) function (remember not to spell it as **`SetupTestSuite`** with a small
to set up the shared resources and a `static void TearDownTestCase()` `u`!) to set up the shared resources and a `static void TearDownTestSuite()`
function to tear them down. function to tear them down.
That's it! googletest automatically calls `SetUpTestCase()` before running the That's it! googletest automatically calls `SetUpTestSuite()` before running the
*first test* in the `FooTest` test case (i.e. before creating the first *first test* in the `FooTest` test suite (i.e. before creating the first
`FooTest` object), and calls `TearDownTestCase()` after running the *last test* `FooTest` object), and calls `TearDownTestSuite()` after running the *last test*
in it (i.e. after deleting the last `FooTest` object). In between, the tests can in it (i.e. after deleting the last `FooTest` object). In between, the tests can
use the shared resources. use the shared resources.
...@@ -1213,22 +1172,22 @@ preceding or following another. Also, the tests must either not modify the state ...@@ -1213,22 +1172,22 @@ preceding or following another. Also, the tests must either not modify the state
of any shared resource, or, if they do modify the state, they must restore the of any shared resource, or, if they do modify the state, they must restore the
state to its original value before passing control to the next test. state to its original value before passing control to the next test.
Here's an example of per-test-case set-up and tear-down: Here's an example of per-test-suite set-up and tear-down:
```c++ ```c++
class FooTest : public ::testing::Test { class FooTest : public ::testing::Test {
protected: protected:
// Per-test-case set-up. // Per-test-suite set-up.
// Called before the first test in this test case. // Called before the first test in this test suite.
// Can be omitted if not needed. // Can be omitted if not needed.
static void SetUpTestCase() { static void SetUpTestSuite() {
shared_resource_ = new ...; shared_resource_ = new ...;
} }
// Per-test-case tear-down. // Per-test-suite tear-down.
// Called after the last test in this test case. // Called after the last test in this test suite.
// Can be omitted if not needed. // Can be omitted if not needed.
static void TearDownTestCase() { static void TearDownTestSuite() {
delete shared_resource_; delete shared_resource_;
shared_resource_ = NULL; shared_resource_ = NULL;
} }
...@@ -1254,30 +1213,28 @@ TEST_F(FooTest, Test2) { ...@@ -1254,30 +1213,28 @@ TEST_F(FooTest, Test2) {
} }
``` ```
NOTE: Though the above code declares `SetUpTestCase()` protected, it may NOTE: Though the above code declares `SetUpTestSuite()` protected, it may
sometimes be necessary to declare it public, such as when using it with sometimes be necessary to declare it public, such as when using it with
`TEST_P`. `TEST_P`.
**Availability**: Linux, Windows, Mac.
## Global Set-Up and Tear-Down ## Global Set-Up and Tear-Down
Just as you can do set-up and tear-down at the test level and the test case Just as you can do set-up and tear-down at the test level and the test suite
level, you can also do it at the test program level. Here's how. level, you can also do it at the test program level. Here's how.
First, you subclass the `::testing::Environment` class to define a test First, you subclass the `::testing::Environment` class to define a test
environment, which knows how to set-up and tear-down: environment, which knows how to set-up and tear-down:
```c++ ```c++
class Environment { class Environment : public ::testing::Environment {
public: public:
virtual ~Environment() {} virtual ~Environment() {}
// Override this to define how to set up the environment. // Override this to define how to set up the environment.
virtual void SetUp() {} void SetUp() override {}
// Override this to define how to tear down the environment. // Override this to define how to tear down the environment.
virtual void TearDown() {} void TearDown() override {}
}; };
``` ```
...@@ -1289,10 +1246,12 @@ Environment* AddGlobalTestEnvironment(Environment* env); ...@@ -1289,10 +1246,12 @@ Environment* AddGlobalTestEnvironment(Environment* env);
``` ```
Now, when `RUN_ALL_TESTS()` is called, it first calls the `SetUp()` method of Now, when `RUN_ALL_TESTS()` is called, it first calls the `SetUp()` method of
the environment object, then runs the tests if there was no fatal failures, and each environment object, then runs the tests if none of the environments
finally calls `TearDown()` of the environment object. reported fatal failures and `GTEST_SKIP()` was not called. `RUN_ALL_TESTS()`
always calls `TearDown()` with each environment object, regardless of whether or
not the tests were run.
It's OK to register multiple environment objects. In this case, their `SetUp()` It's OK to register multiple environment objects. In this suite, their `SetUp()`
will be called in the order they are registered, and their `TearDown()` will be will be called in the order they are registered, and their `TearDown()` will be
called in the reverse order. called in the reverse order.
...@@ -1333,32 +1292,32 @@ number of situations, for example: ...@@ -1333,32 +1292,32 @@ number of situations, for example:
### How to Write Value-Parameterized Tests ### How to Write Value-Parameterized Tests
To write value-parameterized tests, first you should define a fixture class. It To write value-parameterized tests, first you should define a fixture class. It
must be derived from both `::testing::Test` and must be derived from both `testing::Test` and `testing::WithParamInterface<T>`
`::testing::WithParamInterface<T>` (the latter is a pure interface), where `T` (the latter is a pure interface), where `T` is the type of your parameter
is the type of your parameter values. For convenience, you can just derive the values. For convenience, you can just derive the fixture class from
fixture class from `::testing::TestWithParam<T>`, which itself is derived from `testing::TestWithParam<T>`, which itself is derived from both `testing::Test`
both `::testing::Test` and `::testing::WithParamInterface<T>`. `T` can be any and `testing::WithParamInterface<T>`. `T` can be any copyable type. If it's a
copyable type. If it's a raw pointer, you are responsible for managing the raw pointer, you are responsible for managing the lifespan of the pointed
lifespan of the pointed values. values.
NOTE: If your test fixture defines `SetUpTestCase()` or `TearDownTestCase()` NOTE: If your test fixture defines `SetUpTestSuite()` or `TearDownTestSuite()`
they must be declared **public** rather than **protected** in order to use they must be declared **public** rather than **protected** in order to use
`TEST_P`. `TEST_P`.
```c++ ```c++
class FooTest : class FooTest :
public ::testing::TestWithParam<const char*> { public testing::TestWithParam<const char*> {
// You can implement all the usual fixture class members here. // You can implement all the usual fixture class members here.
// To access the test parameter, call GetParam() from class // To access the test parameter, call GetParam() from class
// TestWithParam<T>. // TestWithParam<T>.
}; };
// Or, when you want to add parameters to a pre-existing fixture class: // Or, when you want to add parameters to a pre-existing fixture class:
class BaseTest : public ::testing::Test { class BaseTest : public testing::Test {
... ...
}; };
class BarTest : public BaseTest, class BarTest : public BaseTest,
public ::testing::WithParamInterface<const char*> { public testing::WithParamInterface<const char*> {
... ...
}; };
``` ```
...@@ -1380,40 +1339,44 @@ TEST_P(FooTest, HasBlahBlah) { ...@@ -1380,40 +1339,44 @@ TEST_P(FooTest, HasBlahBlah) {
} }
``` ```
Finally, you can use `INSTANTIATE_TEST_CASE_P` to instantiate the test case with Finally, you can use `INSTANTIATE_TEST_SUITE_P` to instantiate the test suite
any set of parameters you want. googletest defines a number of functions for with any set of parameters you want. googletest defines a number of functions
generating test parameters. They return what we call (surprise!) *parameter for generating test parameters. They return what we call (surprise!) *parameter
generators*. Here is a summary of them, which are all in the `testing` generators*. Here is a summary of them, which are all in the `testing`
namespace: namespace:
| Parameter Generator | Behavior | <!-- mdformat off(github rendering does not support multiline tables) -->
| ---------------------------- | ------------------------------------------- |
| `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1. | | Parameter Generator | Behavior |
| `Values(v1, v2, ..., vN)` | Yields values `{v1, v2, ..., vN}`. | | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `ValuesIn(container)` and `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)`. | | `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1. |
| `Bool()` | Yields sequence `{false, true}`. | | `Values(v1, v2, ..., vN)` | Yields values `{v1, v2, ..., vN}`. |
| `Combine(g1, g2, ..., gN)` | Yields all combinations (Cartesian product) as std\:\:tuples of the values generated by the `N` generators. | | `ValuesIn(container)` and `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)` |
| `Bool()` | Yields sequence `{false, true}`. |
| `Combine(g1, g2, ..., gN)` | Yields all combinations (Cartesian product) as std\:\:tuples of the values generated by the `N` generators. |
<!-- mdformat on-->
For more details, see the comments at the definitions of these functions. For more details, see the comments at the definitions of these functions.
The following statement will instantiate tests from the `FooTest` test case each The following statement will instantiate tests from the `FooTest` test suite
with parameter values `"meeny"`, `"miny"`, and `"moe"`. each with parameter values `"meeny"`, `"miny"`, and `"moe"`.
```c++ ```c++
INSTANTIATE_TEST_CASE_P(InstantiationName, INSTANTIATE_TEST_SUITE_P(InstantiationName,
FooTest, FooTest,
::testing::Values("meeny", "miny", "moe")); testing::Values("meeny", "miny", "moe"));
``` ```
NOTE: The code above must be placed at global or namespace scope, not at NOTE: The code above must be placed at global or namespace scope, not at
function scope. function scope.
NOTE: Don't forget this step! If you do your test will silently pass, but none NOTE: Don't forget this step! If you do your test will silently pass, but none
of its cases will ever run! of its suites will ever run!
To distinguish different instances of the pattern (yes, you can instantiate it To distinguish different instances of the pattern (yes, you can instantiate it
more than once), the first argument to `INSTANTIATE_TEST_CASE_P` is a prefix more than once), the first argument to `INSTANTIATE_TEST_SUITE_P` is a prefix
that will be added to the actual test case name. Remember to pick unique that will be added to the actual test suite name. Remember to pick unique
prefixes for different instantiations. The tests from the instantiation above prefixes for different instantiations. The tests from the instantiation above
will have these names: will have these names:
...@@ -1431,8 +1394,8 @@ parameter values `"cat"` and `"dog"`: ...@@ -1431,8 +1394,8 @@ parameter values `"cat"` and `"dog"`:
```c++ ```c++
const char* pets[] = {"cat", "dog"}; const char* pets[] = {"cat", "dog"};
INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest,
::testing::ValuesIn(pets)); testing::ValuesIn(pets));
``` ```
The tests from the instantiation above will have these names: The tests from the instantiation above will have these names:
...@@ -1442,13 +1405,14 @@ The tests from the instantiation above will have these names: ...@@ -1442,13 +1405,14 @@ The tests from the instantiation above will have these names:
* `AnotherInstantiationName/FooTest.HasBlahBlah/0` for `"cat"` * `AnotherInstantiationName/FooTest.HasBlahBlah/0` for `"cat"`
* `AnotherInstantiationName/FooTest.HasBlahBlah/1` for `"dog"` * `AnotherInstantiationName/FooTest.HasBlahBlah/1` for `"dog"`
Please note that `INSTANTIATE_TEST_CASE_P` will instantiate *all* tests in the Please note that `INSTANTIATE_TEST_SUITE_P` will instantiate *all* tests in the
given test case, whether their definitions come before or *after* the given test suite, whether their definitions come before or *after* the
`INSTANTIATE_TEST_CASE_P` statement. `INSTANTIATE_TEST_SUITE_P` statement.
You can see sample7_unittest.cc and sample8_unittest.cc for more examples. You can see [sample7_unittest.cc] and [sample8_unittest.cc] for more examples.
**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac [sample7_unittest.cc]: ../samples/sample7_unittest.cc "Parameterized Test example"
[sample8_unittest.cc]: ../samples/sample8_unittest.cc "Parameterized Test example with multiple parameters"
### Creating Value-Parameterized Abstract Tests ### Creating Value-Parameterized Abstract Tests
...@@ -1466,17 +1430,17 @@ To define abstract tests, you should organize your code like this: ...@@ -1466,17 +1430,17 @@ To define abstract tests, you should organize your code like this:
1. Put the definition of the parameterized test fixture class (e.g. `FooTest`) 1. Put the definition of the parameterized test fixture class (e.g. `FooTest`)
in a header file, say `foo_param_test.h`. Think of this as *declaring* your in a header file, say `foo_param_test.h`. Think of this as *declaring* your
abstract tests. abstract tests.
1. Put the `TEST_P` definitions in `foo_param_test.cc`, which includes 2. Put the `TEST_P` definitions in `foo_param_test.cc`, which includes
`foo_param_test.h`. Think of this as *implementing* your abstract tests. `foo_param_test.h`. Think of this as *implementing* your abstract tests.
Once they are defined, you can instantiate them by including `foo_param_test.h`, Once they are defined, you can instantiate them by including `foo_param_test.h`,
invoking `INSTANTIATE_TEST_CASE_P()`, and depending on the library target that invoking `INSTANTIATE_TEST_SUITE_P()`, and depending on the library target that
contains `foo_param_test.cc`. You can instantiate the same abstract test case contains `foo_param_test.cc`. You can instantiate the same abstract test suite
multiple times, possibly in different source files. multiple times, possibly in different source files.
### Specifying Names for Value-Parameterized Test Parameters ### Specifying Names for Value-Parameterized Test Parameters
The optional last argument to `INSTANTIATE_TEST_CASE_P()` allows the user to The optional last argument to `INSTANTIATE_TEST_SUITE_P()` allows the user to
specify a function or functor that generates custom test name suffixes based on specify a function or functor that generates custom test name suffixes based on
the test parameters. The function should accept one argument of type the test parameters. The function should accept one argument of type
`testing::TestParamInfo<class ParamType>`, and return `std::string`. `testing::TestParamInfo<class ParamType>`, and return `std::string`.
...@@ -1486,22 +1450,49 @@ returns the value of `testing::PrintToString(GetParam())`. It does not work for ...@@ -1486,22 +1450,49 @@ returns the value of `testing::PrintToString(GetParam())`. It does not work for
`std::string` or C strings. `std::string` or C strings.
NOTE: test names must be non-empty, unique, and may only contain ASCII NOTE: test names must be non-empty, unique, and may only contain ASCII
alphanumeric characters. In particular, they [should not contain alphanumeric characters. In particular, they
underscores](https://github.com/google/googletest/blob/master/googletest/docs/faq.md#why-should-test-case-names-and-test-names-not-contain-underscore). [should not contain underscores](faq.md#why-should-test-suite-names-and-test-names-not-contain-underscore)
```c++ ```c++
class MyTestCase : public testing::TestWithParam<int> {}; class MyTestSuite : public testing::TestWithParam<int> {};
TEST_P(MyTestCase, MyTest) TEST_P(MyTestSuite, MyTest)
{ {
std::cout << "Example Test Param: " << GetParam() << std::endl; std::cout << "Example Test Param: " << GetParam() << std::endl;
} }
INSTANTIATE_TEST_CASE_P(MyGroup, MyTestCase, testing::Range(0, 10), INSTANTIATE_TEST_SUITE_P(MyGroup, MyTestSuite, testing::Range(0, 10),
testing::PrintToStringParamName()); testing::PrintToStringParamName());
```
Providing a custom functor allows for more control over test parameter name
generation, especially for types where the automatic conversion does not
generate helpful parameter names (e.g. strings as demonstrated above). The
following example illustrates this for multiple parameters, an enumeration type
and a string, and also demonstrates how to combine generators. It uses a lambda
for conciseness:
```c++
enum class MyType { MY_FOO = 0, MY_BAR = 1 };
class MyTestSuite : public testing::TestWithParam<std::tuple<MyType, string>> {
};
INSTANTIATE_TEST_SUITE_P(
MyGroup, MyTestSuite,
testing::Combine(
testing::Values(MyType::VALUE_0, MyType::VALUE_1),
testing::ValuesIn("", "")),
[](const testing::TestParamInfo<MyTestSuite::ParamType>& info) {
string name = absl::StrCat(
std::get<0>(info.param) == MY_FOO ? "Foo" : "Bar", "_",
std::get<1>(info.param));
absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_');
return name;
});
``` ```
## Typed Tests</id> ## Typed Tests
Suppose you have multiple implementations of the same interface and want to make Suppose you have multiple implementations of the same interface and want to make
sure that all of them satisfy some common requirements. Or, you may have defined sure that all of them satisfy some common requirements. Or, you may have defined
...@@ -1532,20 +1523,20 @@ class FooTest : public ::testing::Test { ...@@ -1532,20 +1523,20 @@ class FooTest : public ::testing::Test {
}; };
``` ```
Next, associate a list of types with the test case, which will be repeated for Next, associate a list of types with the test suite, which will be repeated for
each type in the list: each type in the list:
```c++ ```c++
using MyTypes = ::testing::Types<char, int, unsigned int>; using MyTypes = ::testing::Types<char, int, unsigned int>;
TYPED_TEST_CASE(FooTest, MyTypes); TYPED_TEST_SUITE(FooTest, MyTypes);
``` ```
The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_CASE` The type alias (`using` or `typedef`) is necessary for the `TYPED_TEST_SUITE`
macro to parse correctly. Otherwise the compiler will think that each comma in macro to parse correctly. Otherwise the compiler will think that each comma in
the type list introduces a new macro argument. the type list introduces a new macro argument.
Then, use `TYPED_TEST()` instead of `TEST_F()` to define a typed test for this Then, use `TYPED_TEST()` instead of `TEST_F()` to define a typed test for this
test case. You can repeat this as many times as you want: test suite. You can repeat this as many times as you want:
```c++ ```c++
TYPED_TEST(FooTest, DoesBlah) { TYPED_TEST(FooTest, DoesBlah) {
...@@ -1569,9 +1560,9 @@ TYPED_TEST(FooTest, DoesBlah) { ...@@ -1569,9 +1560,9 @@ TYPED_TEST(FooTest, DoesBlah) {
TYPED_TEST(FooTest, HasPropertyA) { ... } TYPED_TEST(FooTest, HasPropertyA) { ... }
``` ```
You can see sample6_unittest.cc You can see [sample6_unittest.cc] for a complete example.
**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac [sample6_unittest.cc]: ../samples/sample6_unittest.cc "Typed Test example"
## Type-Parameterized Tests ## Type-Parameterized Tests
...@@ -1596,10 +1587,10 @@ class FooTest : public ::testing::Test { ...@@ -1596,10 +1587,10 @@ class FooTest : public ::testing::Test {
}; };
``` ```
Next, declare that you will define a type-parameterized test case: Next, declare that you will define a type-parameterized test suite:
```c++ ```c++
TYPED_TEST_CASE_P(FooTest); TYPED_TEST_SUITE_P(FooTest);
``` ```
Then, use `TYPED_TEST_P()` to define a type-parameterized test. You can repeat Then, use `TYPED_TEST_P()` to define a type-parameterized test. You can repeat
...@@ -1616,13 +1607,13 @@ TYPED_TEST_P(FooTest, HasPropertyA) { ... } ...@@ -1616,13 +1607,13 @@ TYPED_TEST_P(FooTest, HasPropertyA) { ... }
``` ```
Now the tricky part: you need to register all test patterns using the Now the tricky part: you need to register all test patterns using the
`REGISTER_TYPED_TEST_CASE_P` macro before you can instantiate them. The first `REGISTER_TYPED_TEST_SUITE_P` macro before you can instantiate them. The first
argument of the macro is the test case name; the rest are the names of the tests argument of the macro is the test suite name; the rest are the names of the
in this test case: tests in this test suite:
```c++ ```c++
REGISTER_TYPED_TEST_CASE_P(FooTest, REGISTER_TYPED_TEST_SUITE_P(FooTest,
DoesBlah, HasPropertyA); DoesBlah, HasPropertyA);
``` ```
Finally, you are free to instantiate the pattern with the types you want. If you Finally, you are free to instantiate the pattern with the types you want. If you
...@@ -1631,23 +1622,22 @@ source files and instantiate it multiple times. ...@@ -1631,23 +1622,22 @@ source files and instantiate it multiple times.
```c++ ```c++
typedef ::testing::Types<char, int, unsigned int> MyTypes; typedef ::testing::Types<char, int, unsigned int> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
``` ```
To distinguish different instances of the pattern, the first argument to the To distinguish different instances of the pattern, the first argument to the
`INSTANTIATE_TYPED_TEST_CASE_P` macro is a prefix that will be added to the `INSTANTIATE_TYPED_TEST_SUITE_P` macro is a prefix that will be added to the
actual test case name. Remember to pick unique prefixes for different instances. actual test suite name. Remember to pick unique prefixes for different
instances.
In the special case where the type list contains only one type, you can write In the special case where the type list contains only one type, you can write
that type directly without `::testing::Types<...>`, like this: that type directly without `::testing::Types<...>`, like this:
```c++ ```c++
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int); INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);
``` ```
You can see `sample6_unittest.cc` for a complete example. You can see [sample6_unittest.cc] for a complete example.
**Availability**: Linux, Windows (requires MSVC 8.0 or above), Mac
## Testing Private Code ## Testing Private Code
...@@ -1674,7 +1664,7 @@ To test them, we use the following special techniques: ...@@ -1674,7 +1664,7 @@ To test them, we use the following special techniques:
* Both static functions and definitions/declarations in an unnamed namespace * Both static functions and definitions/declarations in an unnamed namespace
are only visible within the same translation unit. To test them, you can are only visible within the same translation unit. To test them, you can
`#include` the entire `.cc` file being tested in your `*_test.cc` file. `#include` the entire `.cc` file being tested in your `*_test.cc` file.
(including `.cc` files is not a good way to reuse code - you should not do (#including `.cc` files is not a good way to reuse code - you should not do
this in production code!) this in production code!)
However, a better approach is to move the private code into the However, a better approach is to move the private code into the
...@@ -1704,19 +1694,16 @@ To test them, we use the following special techniques: ...@@ -1704,19 +1694,16 @@ To test them, we use the following special techniques:
this line in the class body: this line in the class body:
```c++ ```c++
FRIEND_TEST(TestCaseName, TestName); FRIEND_TEST(TestSuiteName, TestName);
``` ```
For example, For example,
```c++ ```c++
// foo.h // foo.h
#include "gtest/gtest_prod.h"
class Foo { class Foo {
... ...
private: private:
FRIEND_TEST(FooTest, BarReturnsZeroOnNull); FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
int Bar(void* x); int Bar(void* x);
...@@ -1726,7 +1713,7 @@ To test them, we use the following special techniques: ...@@ -1726,7 +1713,7 @@ To test them, we use the following special techniques:
... ...
TEST(FooTest, BarReturnsZeroOnNull) { TEST(FooTest, BarReturnsZeroOnNull) {
Foo foo; Foo foo;
EXPECT_EQ(0, foo.Bar(NULL)); // Uses Foo's private member Bar(). EXPECT_EQ(foo.Bar(NULL), 0); // Uses Foo's private member Bar().
} }
``` ```
...@@ -1764,7 +1751,6 @@ To test them, we use the following special techniques: ...@@ -1764,7 +1751,6 @@ To test them, we use the following special techniques:
} // namespace my_namespace } // namespace my_namespace
``` ```
## "Catching" Failures ## "Catching" Failures
If you are building a testing utility on top of googletest, you'll want to test If you are building a testing utility on top of googletest, you'll want to test
...@@ -1807,13 +1793,84 @@ For technical reasons, there are some caveats: ...@@ -1807,13 +1793,84 @@ For technical reasons, there are some caveats:
1. You cannot stream a failure message to either macro. 1. You cannot stream a failure message to either macro.
1. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot reference 2. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot reference
local non-static variables or non-static members of `this` object. local non-static variables or non-static members of `this` object.
1. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()()` cannot return a 3. `statement` in `EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()` cannot return a
value. value.
## Registering tests programmatically
The `TEST` macros handle the vast majority of all use cases, but there are few
were runtime registration logic is required. For those cases, the framework
provides the `::testing::RegisterTest` that allows callers to register arbitrary
tests dynamically.
This is an advanced API only to be used when the `TEST` macros are insufficient.
The macros should be preferred when possible, as they avoid most of the
complexity of calling this function.
It provides the following signature:
```c++
template <typename Factory>
TestInfo* RegisterTest(const char* test_suite_name, const char* test_name,
const char* type_param, const char* value_param,
const char* file, int line, Factory factory);
```
The `factory` argument is a factory callable (move-constructible) object or
function pointer that creates a new instance of the Test object. It handles
ownership to the caller. The signature of the callable is `Fixture*()`, where
`Fixture` is the test fixture class for the test. All tests registered with the
same `test_suite_name` must return the same fixture type. This is checked at
runtime.
The framework will infer the fixture class from the factory and will call the
`SetUpTestSuite` and `TearDownTestSuite` for it.
Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is
undefined.
Use case example:
```c++
class MyFixture : public ::testing::Test {
public:
// All of these optional, just like in regular macro usage.
static void SetUpTestSuite() { ... }
static void TearDownTestSuite() { ... }
void SetUp() override { ... }
void TearDown() override { ... }
};
class MyTest : public MyFixture {
public:
explicit MyTest(int data) : data_(data) {}
void TestBody() override { ... }
private:
int data_;
};
void RegisterMyTests(const std::vector<int>& values) {
for (int v : values) {
::testing::RegisterTest(
"MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,
std::to_string(v).c_str(),
__FILE__, __LINE__,
// Important to use the fixture type as the return type here.
[=]() -> MyFixture* { return new MyTest(v); });
}
}
...
int main(int argc, char** argv) {
std::vector<int> values_to_test = LoadValuesFromConfig();
RegisterMyTests(values_to_test);
...
return RUN_ALL_TESTS();
}
```
## Getting the Current Test's Name ## Getting the Current Test's Name
Sometimes a function may need to know the name of the currently running test. Sometimes a function may need to know the name of the currently running test.
...@@ -1826,11 +1883,11 @@ namespace testing { ...@@ -1826,11 +1883,11 @@ namespace testing {
class TestInfo { class TestInfo {
public: public:
// Returns the test case name and the test name, respectively. // Returns the test suite name and the test name, respectively.
// //
// Do NOT delete or free the return value - it's managed by the // Do NOT delete or free the return value - it's managed by the
// TestInfo class. // TestInfo class.
const char* test_case_name() const; const char* test_suite_name() const;
const char* name() const; const char* name() const;
}; };
...@@ -1848,30 +1905,26 @@ To obtain a `TestInfo` object for the currently running test, call ...@@ -1848,30 +1905,26 @@ To obtain a `TestInfo` object for the currently running test, call
printf("We are in test %s of test case %s.\n", printf("We are in test %s of test suite %s.\n",
test_info->name(), test_info->name(),
test_info->test_case_name()); test_info->test_suite_name());
``` ```
`current_test_info()` returns a null pointer if no test is running. In `current_test_info()` returns a null pointer if no test is running. In
particular, you cannot find the test case name in `TestCaseSetUp()`, particular, you cannot find the test suite name in `TestSuiteSetUp()`,
`TestCaseTearDown()` (where you know the test case name implicitly), or `TestSuiteTearDown()` (where you know the test suite name implicitly), or
functions called from them. functions called from them.
**Availability**: Linux, Windows, Mac.
## Extending googletest by Handling Test Events ## Extending googletest by Handling Test Events
googletest provides an **event listener API** to let you receive notifications googletest provides an **event listener API** to let you receive notifications
about the progress of a test program and test failures. The events you can about the progress of a test program and test failures. The events you can
listen to include the start and end of the test program, a test case, or a test listen to include the start and end of the test program, a test suite, or a test
method, among others. You may use this API to augment or replace the standard method, among others. You may use this API to augment or replace the standard
console output, replace the XML output, or provide a completely different form console output, replace the XML output, or provide a completely different form
of output, such as a GUI or a database. You can also use test events as of output, such as a GUI or a database. You can also use test events as
checkpoints to implement a resource leak checker, for example. checkpoints to implement a resource leak checker, for example.
**Availability**: Linux, Windows, Mac.
### Defining Event Listeners ### Defining Event Listeners
To define a event listener, you subclass either testing::TestEventListener or To define a event listener, you subclass either testing::TestEventListener or
...@@ -1885,7 +1938,7 @@ When an event is fired, its context is passed to the handler function as an ...@@ -1885,7 +1938,7 @@ When an event is fired, its context is passed to the handler function as an
argument. The following argument types are used: argument. The following argument types are used:
* UnitTest reflects the state of the entire test program, * UnitTest reflects the state of the entire test program,
* TestCase has information about a test case, which can contain one or more * TestSuite has information about a test suite, which can contain one or more
tests, tests,
* TestInfo contains the state of a test, and * TestInfo contains the state of a test, and
* TestPartResult represents the result of a test assertion. * TestPartResult represents the result of a test assertion.
...@@ -1900,7 +1953,7 @@ Here's an example: ...@@ -1900,7 +1953,7 @@ Here's an example:
// Called before a test starts. // Called before a test starts.
virtual void OnTestStart(const ::testing::TestInfo& test_info) { virtual void OnTestStart(const ::testing::TestInfo& test_info) {
printf("*** Test %s.%s starting.\n", printf("*** Test %s.%s starting.\n",
test_info.test_case_name(), test_info.name()); test_info.test_suite_name(), test_info.name());
} }
// Called after a failed assertion or a SUCCESS(). // Called after a failed assertion or a SUCCESS().
...@@ -1915,7 +1968,7 @@ Here's an example: ...@@ -1915,7 +1968,7 @@ Here's an example:
// Called after a test ends. // Called after a test ends.
virtual void OnTestEnd(const ::testing::TestInfo& test_info) { virtual void OnTestEnd(const ::testing::TestInfo& test_info) {
printf("*** Test %s.%s ending.\n", printf("*** Test %s.%s ending.\n",
test_info.test_case_name(), test_info.name()); test_info.test_suite_name(), test_info.name());
} }
}; };
``` ```
...@@ -1952,7 +2005,9 @@ You can do so by adding one line: ...@@ -1952,7 +2005,9 @@ You can do so by adding one line:
``` ```
Now, sit back and enjoy a completely different output from your tests. For more Now, sit back and enjoy a completely different output from your tests. For more
details, you can read this sample9_unittest.cc details, see [sample9_unittest.cc].
[sample9_unittest.cc]: ../samples/sample9_unittest.cc "Event listener example"
You may append more than one listener to the list. When an `On*Start()` or You may append more than one listener to the list. When an `On*Start()` or
`OnTestPartResult()` event is fired, the listeners will receive it in the order `OnTestPartResult()` event is fired, the listeners will receive it in the order
...@@ -1969,7 +2024,7 @@ when processing an event. There are some restrictions: ...@@ -1969,7 +2024,7 @@ when processing an event. There are some restrictions:
1. You cannot generate any failure in `OnTestPartResult()` (otherwise it will 1. You cannot generate any failure in `OnTestPartResult()` (otherwise it will
cause `OnTestPartResult()` to be called recursively). cause `OnTestPartResult()` to be called recursively).
1. A listener that handles `OnTestPartResult()` is not allowed to generate any 2. A listener that handles `OnTestPartResult()` is not allowed to generate any
failure. failure.
When you add listeners to the listener list, you should put listeners that When you add listeners to the listener list, you should put listeners that
...@@ -1977,7 +2032,9 @@ handle `OnTestPartResult()` *before* listeners that can generate failures. This ...@@ -1977,7 +2032,9 @@ handle `OnTestPartResult()` *before* listeners that can generate failures. This
ensures that failures generated by the latter are attributed to the right test ensures that failures generated by the latter are attributed to the right test
by the former. by the former.
We have a sample of failure-raising listener sample10_unittest.cc See [sample10_unittest.cc] for an example of a failure-raising listener.
[sample10_unittest.cc]: ../samples/sample10_unittest.cc "Failure-raising listener example"
## Running Test Programs: Advanced Options ## Running Test Programs: Advanced Options
...@@ -2002,25 +2059,23 @@ running them so that a filter may be applied if needed. Including the flag ...@@ -2002,25 +2059,23 @@ running them so that a filter may be applied if needed. Including the flag
format: format:
```none ```none
TestCase1. TestSuite1.
TestName1 TestName1
TestName2 TestName2
TestCase2. TestSuite2.
TestName TestName
``` ```
None of the tests listed are actually run if the flag is provided. There is no None of the tests listed are actually run if the flag is provided. There is no
corresponding environment variable for this flag. corresponding environment variable for this flag.
**Availability**: Linux, Windows, Mac.
#### Running a Subset of the Tests #### Running a Subset of the Tests
By default, a googletest program runs all tests the user has defined. Sometimes, By default, a googletest program runs all tests the user has defined. Sometimes,
you want to run only a subset of the tests (e.g. for debugging or quickly you want to run only a subset of the tests (e.g. for debugging or quickly
verifying a change). If you set the `GTEST_FILTER` environment variable or the verifying a change). If you set the `GTEST_FILTER` environment variable or the
`--gtest_filter` flag to a filter string, googletest will only run the tests `--gtest_filter` flag to a filter string, googletest will only run the tests
whose full names (in the form of `TestCaseName.TestName`) match the filter. whose full names (in the form of `TestSuiteName.TestName`) match the filter.
The format of a filter is a '`:`'-separated list of wildcard patterns (called The format of a filter is a '`:`'-separated list of wildcard patterns (called
the *positive patterns*) optionally followed by a '`-`' and another the *positive patterns*) optionally followed by a '`-`' and another
...@@ -2029,26 +2084,25 @@ the filter if and only if it matches any of the positive patterns but does not ...@@ -2029,26 +2084,25 @@ the filter if and only if it matches any of the positive patterns but does not
match any of the negative patterns. match any of the negative patterns.
A pattern may contain `'*'` (matches any string) or `'?'` (matches any single A pattern may contain `'*'` (matches any string) or `'?'` (matches any single
character). For convenience, the filter character). For convenience, the filter `'*-NegativePatterns'` can be also
written as `'-NegativePatterns'`.
`'*-NegativePatterns'` can be also written as `'-NegativePatterns'`.
For example: For example:
* `./foo_test` Has no flag, and thus runs all its tests. * `./foo_test` Has no flag, and thus runs all its tests.
* `./foo_test --gtest_filter=*` Also runs everything, due to the single * `./foo_test --gtest_filter=*` Also runs everything, due to the single
match-everything `*` value. match-everything `*` value.
* `./foo_test --gtest_filter=FooTest.*` Runs everything in test case `FooTest` * `./foo_test --gtest_filter=FooTest.*` Runs everything in test suite
. `FooTest` .
* `./foo_test --gtest_filter=*Null*:*Constructor*` Runs any test whose full * `./foo_test --gtest_filter=*Null*:*Constructor*` Runs any test whose full
name contains either `"Null"` or `"Constructor"` . name contains either `"Null"` or `"Constructor"` .
* `./foo_test --gtest_filter=-*DeathTest.*` Runs all non-death tests. * `./foo_test --gtest_filter=-*DeathTest.*` Runs all non-death tests.
* `./foo_test --gtest_filter=FooTest.*-FooTest.Bar` Runs everything in test * `./foo_test --gtest_filter=FooTest.*-FooTest.Bar` Runs everything in test
case `FooTest` except `FooTest.Bar`. suite `FooTest` except `FooTest.Bar`.
* `./foo_test --gtest_filter=FooTest.*:BarTest.*-FooTest.Bar:BarTest.Foo` Runs * `./foo_test --gtest_filter=FooTest.*:BarTest.*-FooTest.Bar:BarTest.Foo` Runs
everything in test case `FooTest` except `FooTest.Bar` and everything in everything in test suite `FooTest` except `FooTest.Bar` and everything in
test case `BarTest` except `BarTest.Foo`. test suite `BarTest` except `BarTest.Foo`.
#### Temporarily Disabling Tests #### Temporarily Disabling Tests
If you have a broken test that you cannot fix right away, you can add the If you have a broken test that you cannot fix right away, you can add the
...@@ -2056,9 +2110,9 @@ If you have a broken test that you cannot fix right away, you can add the ...@@ -2056,9 +2110,9 @@ If you have a broken test that you cannot fix right away, you can add the
better than commenting out the code or using `#if 0`, as disabled tests are better than commenting out the code or using `#if 0`, as disabled tests are
still compiled (and thus won't rot). still compiled (and thus won't rot).
If you need to disable all tests in a test case, you can either add `DISABLED_` If you need to disable all tests in a test suite, you can either add `DISABLED_`
to the front of the name of each test, or alternatively add it to the front of to the front of the name of each test, or alternatively add it to the front of
the test case name. the test suite name.
For example, the following tests won't be run by googletest, even though they For example, the following tests won't be run by googletest, even though they
will still be compiled: will still be compiled:
...@@ -2081,8 +2135,6 @@ TIP: You can easily count the number of disabled tests you have using `gsearch` ...@@ -2081,8 +2135,6 @@ TIP: You can easily count the number of disabled tests you have using `gsearch`
and/or `grep`. This number can be used as a metric for improving your test and/or `grep`. This number can be used as a metric for improving your test
quality. quality.
**Availability**: Linux, Windows, Mac.
#### Temporarily Enabling Disabled Tests #### Temporarily Enabling Disabled Tests
To include disabled tests in test execution, just invoke the test program with To include disabled tests in test execution, just invoke the test program with
...@@ -2091,8 +2143,6 @@ the `--gtest_also_run_disabled_tests` flag or set the ...@@ -2091,8 +2143,6 @@ the `--gtest_also_run_disabled_tests` flag or set the
You can combine this with the `--gtest_filter` flag to further select which You can combine this with the `--gtest_filter` flag to further select which
disabled tests to run. disabled tests to run.
**Availability**: Linux, Windows, Mac.
### Repeating the Tests ### Repeating the Tests
Once in a while you'll run into a test whose result is hit-or-miss. Perhaps it Once in a while you'll run into a test whose result is hit-or-miss. Perhaps it
...@@ -2120,12 +2170,10 @@ $ foo_test --gtest_repeat=1000 --gtest_filter=FooBar.* ...@@ -2120,12 +2170,10 @@ $ foo_test --gtest_repeat=1000 --gtest_filter=FooBar.*
Repeat the tests whose name matches the filter 1000 times. Repeat the tests whose name matches the filter 1000 times.
``` ```
If your test program contains [global set-up/tear-down](#global-set-up-and-tear-down) code, it If your test program contains
will be repeated in each iteration as well, as the flakiness may be in it. You [global set-up/tear-down](#global-set-up-and-tear-down) code, it will be
can also specify the repeat count by setting the `GTEST_REPEAT` environment repeated in each iteration as well, as the flakiness may be in it. You can also
variable. specify the repeat count by setting the `GTEST_REPEAT` environment variable.
**Availability**: Linux, Windows, Mac.
### Shuffling the Tests ### Shuffling the Tests
...@@ -2145,8 +2193,6 @@ time. ...@@ -2145,8 +2193,6 @@ time.
If you combine this with `--gtest_repeat=N`, googletest will pick a different If you combine this with `--gtest_repeat=N`, googletest will pick a different
random seed and re-shuffle the tests in each iteration. random seed and re-shuffle the tests in each iteration.
**Availability**: Linux, Windows, Mac.
### Controlling Test Output ### Controlling Test Output
#### Colored Terminal Output #### Colored Terminal Output
...@@ -2154,23 +2200,38 @@ random seed and re-shuffle the tests in each iteration. ...@@ -2154,23 +2200,38 @@ random seed and re-shuffle the tests in each iteration.
googletest can use colors in its terminal output to make it easier to spot the googletest can use colors in its terminal output to make it easier to spot the
important information: important information:
<code>
...<br/> ...<br/>
<span style="color:green">[----------]<span style="color:black"> 1 test from FooTest<br/> <font color="green">[----------]</font><font color="black"> 1 test from
<span style="color:green">[ RUN ]<span style="color:black"> FooTest.DoesAbc<br/> FooTest</font><br/>
<span style="color:green">[ OK ]<span style="color:black"> FooTest.DoesAbc<br/> <font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black">
<span style="color:green">[----------]<span style="color:black"> 2 tests from BarTest<br/> FooTest.DoesAbc</font><br/>
<span style="color:green">[ RUN ]<span style="color:black"> BarTest.HasXyzProperty<br/> <font color="green">[ &nbsp; &nbsp; &nbsp; OK ]</font><font color="black">
<span style="color:green">[ OK ]<span style="color:black"> BarTest.HasXyzProperty<br/> FooTest.DoesAbc </font><br/>
<span style="color:green">[ RUN ]<span style="color:black"> BarTest.ReturnsTrueOnSuccess<br/> <font color="green">[----------]</font><font color="black">
... some error messages ...<br/> 2 tests from BarTest</font><br/>
<span style="color:red">[ FAILED ] <span style="color:black">BarTest.ReturnsTrueOnSuccess<br/> <font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black">
...<br/> BarTest.HasXyzProperty </font><br/>
<span style="color:green">[==========]<span style="color:black"> 30 tests from 14 test cases ran.<br/> <font color="green">[ &nbsp; &nbsp; &nbsp; OK ]</font><font color="black">
<span style="color:green">[ PASSED ]<span style="color:black"> 28 tests.<br/> BarTest.HasXyzProperty</font><br/>
<span style="color:red">[ FAILED ]<span style="color:black"> 2 tests, listed below:<br/> <font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black">
<span style="color:red">[ FAILED ]<span style="color:black"> BarTest.ReturnsTrueOnSuccess<br/> BarTest.ReturnsTrueOnSuccess ... some error messages ...</font><br/>
<span style="color:red">[ FAILED ]<span style="color:black"> AnotherTest.DoesXyz<br/> <font color="red">[ &nbsp; FAILED ]</font><font color="black">
BarTest.ReturnsTrueOnSuccess ...</font><br/>
<font color="green">[==========]</font><font color="black">
30 tests from 14 test suites ran.</font><br/>
<font color="green">[ &nbsp; PASSED ]</font><font color="black">
28 tests.</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
2 tests, listed below:</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
BarTest.ReturnsTrueOnSuccess</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
AnotherTest.DoesXyz<br/>
<br/>
2 FAILED TESTS 2 FAILED TESTS
</font>
</code>
You can set the `GTEST_COLOR` environment variable or the `--gtest_color` You can set the `GTEST_COLOR` environment variable or the `--gtest_color`
command line flag to `yes`, `no`, or `auto` (the default) to enable colors, command line flag to `yes`, `no`, or `auto` (the default) to enable colors,
...@@ -2178,16 +2239,12 @@ disable colors, or let googletest decide. When the value is `auto`, googletest ...@@ -2178,16 +2239,12 @@ disable colors, or let googletest decide. When the value is `auto`, googletest
will use colors if and only if the output goes to a terminal and (on non-Windows will use colors if and only if the output goes to a terminal and (on non-Windows
platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`. platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`.
**Availability**: Linux, Windows, Mac.
#### Suppressing the Elapsed Time #### Suppressing the Elapsed Time
By default, googletest prints the time it takes to run each test. To disable By default, googletest prints the time it takes to run each test. To disable
that, run the test program with the `--gtest_print_time=0` command line flag, or that, run the test program with the `--gtest_print_time=0` command line flag, or
set the GTEST_PRINT_TIME environment variable to `0`. set the GTEST_PRINT_TIME environment variable to `0`.
**Availability**: Linux, Windows, Mac.
#### Suppressing UTF-8 Text Output #### Suppressing UTF-8 Text Output
In case of assertion failures, googletest prints expected and actual values of In case of assertion failures, googletest prints expected and actual values of
...@@ -2197,7 +2254,6 @@ text because, for example, you don't have an UTF-8 compatible output medium, run ...@@ -2197,7 +2254,6 @@ text because, for example, you don't have an UTF-8 compatible output medium, run
the test program with `--gtest_print_utf8=0` or set the `GTEST_PRINT_UTF8` the test program with `--gtest_print_utf8=0` or set the `GTEST_PRINT_UTF8`
environment variable to `0`. environment variable to `0`.
**Availability**: Linux, Windows, Mac.
#### Generating an XML Report #### Generating an XML Report
...@@ -2220,7 +2276,6 @@ program `foo_test` or `foo_test.exe`). If the file already exists (perhaps left ...@@ -2220,7 +2276,6 @@ program `foo_test` or `foo_test.exe`). If the file already exists (perhaps left
over from a previous run), googletest will pick a different name (e.g. over from a previous run), googletest will pick a different name (e.g.
`foo_test_1.xml`) to avoid overwriting it. `foo_test_1.xml`) to avoid overwriting it.
The report is based on the `junitreport` Ant task. Since that format was The report is based on the `junitreport` Ant task. Since that format was
originally intended for Java, a little interpretation is required to make it originally intended for Java, a little interpretation is required to make it
apply to googletest tests, as shown here: apply to googletest tests, as shown here:
...@@ -2238,7 +2293,7 @@ apply to googletest tests, as shown here: ...@@ -2238,7 +2293,7 @@ apply to googletest tests, as shown here:
``` ```
* The root `<testsuites>` element corresponds to the entire test program. * The root `<testsuites>` element corresponds to the entire test program.
* `<testsuite>` elements correspond to googletest test cases. * `<testsuite>` elements correspond to googletest test suites.
* `<testcase>` elements correspond to googletest test functions. * `<testcase>` elements correspond to googletest test functions.
For instance, the following program For instance, the following program
...@@ -2272,10 +2327,10 @@ could generate this report: ...@@ -2272,10 +2327,10 @@ could generate this report:
Things to note: Things to note:
* The `tests` attribute of a `<testsuites>` or `<testsuite>` element tells how * The `tests` attribute of a `<testsuites>` or `<testsuite>` element tells how
many test functions the googletest program or test case contains, while the many test functions the googletest program or test suite contains, while the
`failures` attribute tells how many of them failed. `failures` attribute tells how many of them failed.
* The `time` attribute expresses the duration of the test, test case, or * The `time` attribute expresses the duration of the test, test suite, or
entire test program in seconds. entire test program in seconds.
* The `timestamp` attribute records the local date and time of the test * The `timestamp` attribute records the local date and time of the test
...@@ -2284,9 +2339,7 @@ Things to note: ...@@ -2284,9 +2339,7 @@ Things to note:
* Each `<failure>` element corresponds to a single failed googletest * Each `<failure>` element corresponds to a single failed googletest
assertion. assertion.
**Availability**: Linux, Windows, Mac. #### Generating a JSON Report
#### Generating an JSON Report
googletest can also emit a JSON report as an alternative format to XML. To googletest can also emit a JSON report as an alternative format to XML. To
generate the JSON report, set the `GTEST_OUTPUT` environment variable or the generate the JSON report, set the `GTEST_OUTPUT` environment variable or the
...@@ -2365,8 +2418,8 @@ The report format conforms to the following JSON Schema: ...@@ -2365,8 +2418,8 @@ The report format conforms to the following JSON Schema:
} }
``` ```
The report uses the format that conforms to the following Proto3 using the [JSON The report uses the format that conforms to the following Proto3 using the
encoding](https://developers.google.com/protocol-buffers/docs/proto3#json): [JSON encoding](https://developers.google.com/protocol-buffers/docs/proto3#json):
```proto ```proto
syntax = "proto3"; syntax = "proto3";
...@@ -2430,7 +2483,7 @@ could generate this report: ...@@ -2430,7 +2483,7 @@ could generate this report:
"failures": 1, "failures": 1,
"errors": 0, "errors": 0,
"time": "0.035s", "time": "0.035s",
"timestamp": "2011-10-31T18:52:42Z" "timestamp": "2011-10-31T18:52:42Z",
"name": "AllTests", "name": "AllTests",
"testsuites": [ "testsuites": [
{ {
...@@ -2447,11 +2500,11 @@ could generate this report: ...@@ -2447,11 +2500,11 @@ could generate this report:
"classname": "", "classname": "",
"failures": [ "failures": [
{ {
"message": "Value of: add(1, 1)\x0A Actual: 3\x0AExpected: 2", "message": "Value of: add(1, 1)\n Actual: 3\nExpected: 2",
"type": "" "type": ""
}, },
{ {
"message": "Value of: add(1, -1)\x0A Actual: 1\x0AExpected: 0", "message": "Value of: add(1, -1)\n Actual: 1\nExpected: 0",
"type": "" "type": ""
} }
] ]
...@@ -2463,7 +2516,7 @@ could generate this report: ...@@ -2463,7 +2516,7 @@ could generate this report:
"classname": "" "classname": ""
} }
] ]
} },
{ {
"name": "LogicTest", "name": "LogicTest",
"tests": 1, "tests": 1,
...@@ -2485,8 +2538,6 @@ could generate this report: ...@@ -2485,8 +2538,6 @@ could generate this report:
IMPORTANT: The exact format of the JSON document is subject to change. IMPORTANT: The exact format of the JSON document is subject to change.
**Availability**: Linux, Windows, Mac.
### Controlling How Failures Are Reported ### Controlling How Failures Are Reported
#### Turning Assertion Failures into Break-Points #### Turning Assertion Failures into Break-Points
...@@ -2496,11 +2547,9 @@ debugger can catch an assertion failure and automatically drop into interactive ...@@ -2496,11 +2547,9 @@ debugger can catch an assertion failure and automatically drop into interactive
mode. googletest's *break-on-failure* mode supports this behavior. mode. googletest's *break-on-failure* mode supports this behavior.
To enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value To enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value
other than `0` . Alternatively, you can use the `--gtest_break_on_failure` other than `0`. Alternatively, you can use the `--gtest_break_on_failure`
command line flag. command line flag.
**Availability**: Linux, Windows, Mac.
#### Disabling Catching Test-Thrown Exceptions #### Disabling Catching Test-Thrown Exceptions
googletest can be used either with or without exceptions enabled. If a test googletest can be used either with or without exceptions enabled. If a test
...@@ -2515,6 +2564,3 @@ to be handled by the debugger, such that you can examine the call stack when an ...@@ -2515,6 +2564,3 @@ to be handled by the debugger, such that you can examine the call stack when an
exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS` exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS`
environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when
running the tests. running the tests.
**Availability**: Linux, Windows, Mac.
# Googletest FAQ # Googletest FAQ
<!-- GOOGLETEST_CM0014 DO NOT DELETE -->
## Why should test case names and test names not contain underscore? ## Why should test suite names and test names not contain underscore?
Underscore (`_`) is special, as C++ reserves the following to be used by the Underscore (`_`) is special, as C++ reserves the following to be used by the
compiler and the standard library: compiler and the standard library:
1. any identifier that starts with an `_` followed by an upper-case letter, and 1. any identifier that starts with an `_` followed by an upper-case letter, and
1. any identifier that contains two consecutive underscores (i.e. `__`) 2. any identifier that contains two consecutive underscores (i.e. `__`)
*anywhere* in its name. *anywhere* in its name.
User code is *prohibited* from using such identifiers. User code is *prohibited* from using such identifiers.
Now let's look at what this means for `TEST` and `TEST_F`. Now let's look at what this means for `TEST` and `TEST_F`.
Currently `TEST(TestCaseName, TestName)` generates a class named Currently `TEST(TestSuiteName, TestName)` generates a class named
`TestCaseName_TestName_Test`. What happens if `TestCaseName` or `TestName` `TestSuiteName_TestName_Test`. What happens if `TestSuiteName` or `TestName`
contains `_`? contains `_`?
1. If `TestCaseName` starts with an `_` followed by an upper-case letter (say, 1. If `TestSuiteName` starts with an `_` followed by an upper-case letter (say,
`_Foo`), we end up with `_Foo_TestName_Test`, which is reserved and thus `_Foo`), we end up with `_Foo_TestName_Test`, which is reserved and thus
invalid. invalid.
1. If `TestCaseName` ends with an `_` (say, `Foo_`), we get 2. If `TestSuiteName` ends with an `_` (say, `Foo_`), we get
`Foo__TestName_Test`, which is invalid. `Foo__TestName_Test`, which is invalid.
1. If `TestName` starts with an `_` (say, `_Bar`), we get 3. If `TestName` starts with an `_` (say, `_Bar`), we get
`TestCaseName__Bar_Test`, which is invalid. `TestSuiteName__Bar_Test`, which is invalid.
1. If `TestName` ends with an `_` (say, `Bar_`), we get 4. If `TestName` ends with an `_` (say, `Bar_`), we get
`TestCaseName_Bar__Test`, which is invalid. `TestSuiteName_Bar__Test`, which is invalid.
So clearly `TestCaseName` and `TestName` cannot start or end with `_` (Actually, So clearly `TestSuiteName` and `TestName` cannot start or end with `_`
`TestCaseName` can start with `_` -- as long as the `_` isn't followed by an (Actually, `TestSuiteName` can start with `_` -- as long as the `_` isn't
upper-case letter. But that's getting complicated. So for simplicity we just say followed by an upper-case letter. But that's getting complicated. So for
that it cannot start with `_`.). simplicity we just say that it cannot start with `_`.).
It may seem fine for `TestCaseName` and `TestName` to contain `_` in the middle. It may seem fine for `TestSuiteName` and `TestName` to contain `_` in the
However, consider this: middle. However, consider this:
```c++ ```c++
TEST(Time, Flies_Like_An_Arrow) { ... } TEST(Time, Flies_Like_An_Arrow) { ... }
...@@ -44,7 +45,7 @@ TEST(Time_Flies, Like_An_Arrow) { ... } ...@@ -44,7 +45,7 @@ TEST(Time_Flies, Like_An_Arrow) { ... }
Now, the two `TEST`s will both generate the same class Now, the two `TEST`s will both generate the same class
(`Time_Flies_Like_An_Arrow_Test`). That's not good. (`Time_Flies_Like_An_Arrow_Test`). That's not good.
So for simplicity, we just ask the users to avoid `_` in `TestCaseName` and So for simplicity, we just ask the users to avoid `_` in `TestSuiteName` and
`TestName`. The rule is more constraining than necessary, but it's simple and `TestName`. The rule is more constraining than necessary, but it's simple and
easy to remember. It also gives googletest some wiggle room in case its easy to remember. It also gives googletest some wiggle room in case its
implementation needs to change in the future. implementation needs to change in the future.
...@@ -107,12 +108,12 @@ rough guidelines: ...@@ -107,12 +108,12 @@ rough guidelines:
`new Bar(5)`. To accommodate for the differences, you can write factory `new Bar(5)`. To accommodate for the differences, you can write factory
function wrappers and pass these function pointers to the tests as their function wrappers and pass these function pointers to the tests as their
parameters. parameters.
* When a typed test fails, the output includes the name of the type, which can * When a typed test fails, the default output includes the name of the type,
help you quickly identify which implementation is wrong. Value-parameterized which can help you quickly identify which implementation is wrong.
tests cannot do this, so there you'll have to look at the iteration number Value-parameterized tests only show the number of the failed iteration by
to know which implementation the failure is from, which is less direct. default. You will need to define a function that returns the iteration name
* If you make a mistake writing a typed test, the compiler errors can be and pass it as the third parameter to INSTANTIATE_TEST_SUITE_P to have more
harder to digest, as the code is templatized. useful output.
* When using typed tests, you need to make sure you are testing against the * When using typed tests, you need to make sure you are testing against the
interface type, not the concrete types (in other words, you want to make interface type, not the concrete types (in other words, you want to make
sure `implicit_cast<MyInterface*>(my_concrete_impl)` works, not just that sure `implicit_cast<MyInterface*>(my_concrete_impl)` works, not just that
...@@ -124,23 +125,13 @@ both approaches a try. Practice is a much better way to grasp the subtle ...@@ -124,23 +125,13 @@ both approaches a try. Practice is a much better way to grasp the subtle
differences between the two tools. Once you have some concrete experience, you differences between the two tools. Once you have some concrete experience, you
can much more easily decide which one to use the next time. can much more easily decide which one to use the next time.
## My death tests became very slow - what happened?
In August 2008 we had to switch the default death test style from `fast` to
`threadsafe`, as the former is no longer safe now that threaded logging is the
default. This caused many death tests to slow down. Unfortunately this change
was necessary.
Please read [Fixing Failing Death Tests](advanced.md#death-test-styles) for what you can
do.
## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help! ## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help!
**Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated* **Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated*
now. Please use `EqualsProto`, etc instead. now. Please use `EqualsProto`, etc instead.
`ProtocolMessageEquals` and `ProtocolMessageEquiv` were redefined recently and `ProtocolMessageEquals` and `ProtocolMessageEquiv` were redefined recently and
are now less tolerant on invalid protocol buffer definitions. In particular, if are now less tolerant of invalid protocol buffer definitions. In particular, if
you have a `foo.proto` that doesn't fully qualify the type of a protocol message you have a `foo.proto` that doesn't fully qualify the type of a protocol message
it references (e.g. `message<Bar>` where it should be `message<blah.Bar>`), you it references (e.g. `message<Bar>` where it should be `message<blah.Bar>`), you
will now get run-time errors like: will now get run-time errors like:
...@@ -162,10 +153,10 @@ result, any in-memory side effects they incur are observable in their respective ...@@ -162,10 +153,10 @@ result, any in-memory side effects they incur are observable in their respective
sub-processes, but not in the parent process. You can think of them as running sub-processes, but not in the parent process. You can think of them as running
in a parallel universe, more or less. in a parallel universe, more or less.
In particular, if you use [gMock](../../googlemock) and the death test statement In particular, if you use mocking and the death test statement invokes some mock
invokes some mock methods, the parent process will think the calls have never methods, the parent process will think the calls have never occurred. Therefore,
occurred. Therefore, you may want to move your `EXPECT_CALL` statements inside you may want to move your `EXPECT_CALL` statements inside the `EXPECT_DEATH`
the `EXPECT_DEATH` macro. macro.
## EXPECT_EQ(htonl(blah), blah_blah) generates weird compiler errors in opt mode. Is this a googletest bug? ## EXPECT_EQ(htonl(blah), blah_blah) generates weird compiler errors in opt mode. Is this a googletest bug?
...@@ -224,15 +215,15 @@ doesn't mean it's valid. It just means that you were lucky. :-) ...@@ -224,15 +215,15 @@ doesn't mean it's valid. It just means that you were lucky. :-)
Yes. Yes.
Each test fixture has a corresponding and same named test case. This means only Each test fixture has a corresponding and same named test suite. This means only
one test case can use a particular fixture. Sometimes, however, multiple test one test suite can use a particular fixture. Sometimes, however, multiple test
cases may want to use the same or slightly different fixtures. For example, you cases may want to use the same or slightly different fixtures. For example, you
may want to make sure that all of a GUI library's test cases don't leak may want to make sure that all of a GUI library's test suites don't leak
important system resources like fonts and brushes. important system resources like fonts and brushes.
In googletest, you share a fixture among test cases by putting the shared logic In googletest, you share a fixture among test suites by putting the shared logic
in a base test fixture, then deriving from that base a separate fixture for each in a base test fixture, then deriving from that base a separate fixture for each
test case that wants to use this common logic. You then use `TEST_F()` to write test suite that wants to use this common logic. You then use `TEST_F()` to write
tests using each derived fixture. tests using each derived fixture.
Typically, your code looks like this: Typically, your code looks like this:
...@@ -271,8 +262,8 @@ TEST_F(FooTest, Baz) { ... } ...@@ -271,8 +262,8 @@ TEST_F(FooTest, Baz) { ... }
If necessary, you can continue to derive test fixtures from a derived fixture. If necessary, you can continue to derive test fixtures from a derived fixture.
googletest has no limit on how deep the hierarchy can be. googletest has no limit on how deep the hierarchy can be.
For a complete example using derived test fixtures, see [googletest For a complete example using derived test fixtures, see
sample](https://github.com/google/googletest/blob/master/googletest/samples/sample5_unittest.cc) [sample5_unittest.cc](../samples/sample5_unittest.cc).
## My compiler complains "void value not ignored as it ought to be." What does this mean? ## My compiler complains "void value not ignored as it ought to be." What does this mean?
...@@ -289,8 +280,8 @@ Please make sure you have read [this](advanced.md#how-it-works). ...@@ -289,8 +280,8 @@ Please make sure you have read [this](advanced.md#how-it-works).
In particular, death tests don't like having multiple threads in the parent In particular, death tests don't like having multiple threads in the parent
process. So the first thing you can try is to eliminate creating threads outside process. So the first thing you can try is to eliminate creating threads outside
of `EXPECT_DEATH()`. For example, you may want to use [mocks](../../googlemock) of `EXPECT_DEATH()`. For example, you may want to use mocks or fake objects
or fake objects instead of real ones in your tests. instead of real ones in your tests.
Sometimes this is impossible as some library you must use may be creating Sometimes this is impossible as some library you must use may be creating
threads before `main()` is even reached. In this case, you can try to minimize threads before `main()` is even reached. In this case, you can try to minimize
...@@ -328,12 +319,21 @@ The former is usually preferred, as it has the following benefits: ...@@ -328,12 +319,21 @@ The former is usually preferred, as it has the following benefits:
forgetting to call the base class' `SetUp()/TearDown()` or call them at the forgetting to call the base class' `SetUp()/TearDown()` or call them at the
wrong time. wrong time.
You may still want to use `SetUp()/TearDown()` in the following rare cases: You may still want to use `SetUp()/TearDown()` in the following cases:
* C++ does not allow virtual function calls in constructors and destructors.
You can call a method declared as virtual, but it will not use dynamic
dispatch, it will use the definition from the class the constructor of which
is currently executing. This is because calling a virtual method before the
derived class constructor has a chance to run is very dangerous - the
virtual method might operate on uninitialized data. Therefore, if you need
to call a method that will be overridden in a derived class, you have to use
`SetUp()/TearDown()`.
* In the body of a constructor (or destructor), it's not possible to use the * In the body of a constructor (or destructor), it's not possible to use the
`ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal `ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal
test failure that should prevent the test from running, it's necessary to test failure that should prevent the test from running, it's necessary to
use a `CHECK` macro or to use `SetUp()` instead of a constructor. use `abort` <!-- GOOGLETEST_CM0015 DO NOT DELETE --> and abort the whole test executable,
or to use `SetUp()` instead of a constructor.
* If the tear-down operation could throw an exception, you must use * If the tear-down operation could throw an exception, you must use
`TearDown()` as opposed to the destructor, as throwing in a destructor leads `TearDown()` as opposed to the destructor, as throwing in a destructor leads
to undefined behavior and usually will kill your program right away. Note to undefined behavior and usually will kill your program right away. Note
...@@ -346,11 +346,6 @@ You may still want to use `SetUp()/TearDown()` in the following rare cases: ...@@ -346,11 +346,6 @@ You may still want to use `SetUp()/TearDown()` in the following rare cases:
failures from a subroutine to its caller. Therefore, you shouldn't use failures from a subroutine to its caller. Therefore, you shouldn't use
googletest assertions in a destructor if your code could run on such a googletest assertions in a destructor if your code could run on such a
platform. platform.
* In a constructor or destructor, you cannot make a virtual function call on
this object. (You can call a method declared as virtual, but it will be
statically bound.) Therefore, if you need to call a method that will be
overridden in a derived class, you have to use `SetUp()/TearDown()`.
## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it? ## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it?
...@@ -421,7 +416,6 @@ parentheses: ...@@ -421,7 +416,6 @@ parentheses:
ASSERT_PRED2((GreaterThan<int, int>), 5, 0); ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
``` ```
## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why? ## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why?
Some people had been ignoring the return value of `RUN_ALL_TESTS()`. That is, Some people had been ignoring the return value of `RUN_ALL_TESTS()`. That is,
...@@ -472,17 +466,11 @@ switch to `EXPECT_*()` if that works. This ...@@ -472,17 +466,11 @@ switch to `EXPECT_*()` if that works. This
C++ is case-sensitive. Did you spell it as `Setup()`? C++ is case-sensitive. Did you spell it as `Setup()`?
Similarly, sometimes people spell `SetUpTestCase()` as `SetupTestCase()` and Similarly, sometimes people spell `SetUpTestSuite()` as `SetupTestSuite()` and
wonder why it's never called. wonder why it's never called.
## How do I jump to the line of a failure in Emacs directly?
googletest's failure message format is understood by Emacs and many other IDEs,
like acme and XCode. If a googletest message is in a compilation buffer in
Emacs, then it's clickable.
## I have several test suites which share the same test fixture logic, do I have to define a new test fixture class for each of them? This seems pretty tedious.
## I have several test cases which share the same test fixture logic, do I have to define a new test fixture class for each of them? This seems pretty tedious.
You don't have to. Instead of You don't have to. Instead of
...@@ -527,7 +515,6 @@ example: ...@@ -527,7 +515,6 @@ example:
$ ./my_test > gtest_output.txt $ ./my_test > gtest_output.txt
``` ```
## Why should I prefer test fixtures over global variables? ## Why should I prefer test fixtures over global variables?
There are several good reasons: There are several good reasons:
...@@ -537,13 +524,12 @@ There are several good reasons: ...@@ -537,13 +524,12 @@ There are several good reasons:
contaminating others, making debugging difficult. By using fixtures, each contaminating others, making debugging difficult. By using fixtures, each
test has a fresh set of variables that's different (but with the same test has a fresh set of variables that's different (but with the same
names). Thus, tests are kept independent of each other. names). Thus, tests are kept independent of each other.
1. Global variables pollute the global namespace. 2. Global variables pollute the global namespace.
1. Test fixtures can be reused via subclassing, which cannot be done easily 3. Test fixtures can be reused via subclassing, which cannot be done easily
with global variables. This is useful if many test cases have something in with global variables. This is useful if many test suites have something in
common. common.
## What can the statement argument in ASSERT_DEATH() be?
## What can the statement argument in ASSERT_DEATH() be?
`ASSERT_DEATH(*statement*, *regex*)` (or any death assertion macro) can be used `ASSERT_DEATH(*statement*, *regex*)` (or any death assertion macro) can be used
wherever `*statement*` is valid. So basically `*statement*` can be any C++ wherever `*statement*` is valid. So basically `*statement*` can be any C++
...@@ -621,14 +607,14 @@ The new NPTL thread library doesn't suffer from this problem, as it doesn't ...@@ -621,14 +607,14 @@ The new NPTL thread library doesn't suffer from this problem, as it doesn't
create a manager thread. However, if you don't control which machine your test create a manager thread. However, if you don't control which machine your test
runs on, you shouldn't depend on this. runs on, you shouldn't depend on this.
## Why does googletest require the entire test case, instead of individual tests, to be named *DeathTest when it uses ASSERT_DEATH? ## Why does googletest require the entire test suite, instead of individual tests, to be named *DeathTest when it uses ASSERT_DEATH?
googletest does not interleave tests from different test cases. That is, it runs googletest does not interleave tests from different test suites. That is, it
all tests in one test case first, and then runs all tests in the next test case, runs all tests in one test suite first, and then runs all tests in the next test
and so on. googletest does this because it needs to set up a test case before suite, and so on. googletest does this because it needs to set up a test suite
the first test in it is run, and tear it down afterwords. Splitting up the test before the first test in it is run, and tear it down afterwords. Splitting up
case would require multiple set-up and tear-down processes, which is inefficient the test case would require multiple set-up and tear-down processes, which is
and makes the semantics unclean. inefficient and makes the semantics unclean.
If we were to determine the order of tests based on test name instead of test If we were to determine the order of tests based on test name instead of test
case name, then we would have a problem with the following situation: case name, then we would have a problem with the following situation:
...@@ -642,13 +628,13 @@ TEST_F(BarTest, Xyz) { ... } ...@@ -642,13 +628,13 @@ TEST_F(BarTest, Xyz) { ... }
``` ```
Since `FooTest.AbcDeathTest` needs to run before `BarTest.Xyz`, and we don't Since `FooTest.AbcDeathTest` needs to run before `BarTest.Xyz`, and we don't
interleave tests from different test cases, we need to run all tests in the interleave tests from different test suites, we need to run all tests in the
`FooTest` case before running any test in the `BarTest` case. This contradicts `FooTest` case before running any test in the `BarTest` case. This contradicts
with the requirement to run `BarTest.DefDeathTest` before `FooTest.Uvw`. with the requirement to run `BarTest.DefDeathTest` before `FooTest.Uvw`.
## But I don't like calling my entire test case \*DeathTest when it contains both death tests and non-death tests. What do I do? ## But I don't like calling my entire test suite \*DeathTest when it contains both death tests and non-death tests. What do I do?
You don't have to, but if you like, you may split up the test case into You don't have to, but if you like, you may split up the test suite into
`FooTest` and `FooDeathTest`, where the names make it clear that they are `FooTest` and `FooDeathTest`, where the names make it clear that they are
related: related:
...@@ -682,7 +668,7 @@ there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function ...@@ -682,7 +668,7 @@ there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function
defined such that we can print a value of `FooType`. defined such that we can print a value of `FooType`.
In addition, if `FooType` is declared in a name space, the `<<` operator also In addition, if `FooType` is declared in a name space, the `<<` operator also
needs to be defined in the *same* name space. See go/totw/49 for details. needs to be defined in the *same* name space. See https://abseil.io/tips/49 for details.
## How do I suppress the memory leak messages on Windows? ## How do I suppress the memory leak messages on Windows?
...@@ -693,7 +679,6 @@ end of the program run. The easiest way to avoid this is to use the ...@@ -693,7 +679,6 @@ end of the program run. The easiest way to avoid this is to use the
statically initialized heap objects. See MSDN for more details and additional statically initialized heap objects. See MSDN for more details and additional
heap check/debug routines. heap check/debug routines.
## How can my code detect if it is running in a test? ## How can my code detect if it is running in a test?
If you write code that sniffs whether it's running in a test and does different If you write code that sniffs whether it's running in a test and does different
...@@ -707,16 +692,14 @@ In general, the recommended way to cause the code to behave differently under ...@@ -707,16 +692,14 @@ In general, the recommended way to cause the code to behave differently under
test is [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection). You can inject test is [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection). You can inject
different functionality from the test and from the production code. Since your different functionality from the test and from the production code. Since your
production code doesn't link in the for-test logic at all (the production code doesn't link in the for-test logic at all (the
[`testonly`](https://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) [`testonly`](https://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) attribute for BUILD targets helps to ensure
attribute for BUILD targets helps to ensure that), there is no danger in that), there is no danger in accidentally running it.
accidentally running it.
However, if you *really*, *really*, *really* have no choice, and if you follow However, if you *really*, *really*, *really* have no choice, and if you follow
the rule of ending your test program names with `_test`, you can use the the rule of ending your test program names with `_test`, you can use the
*horrible* hack of sniffing your executable name (`argv[0]` in `main()`) to know *horrible* hack of sniffing your executable name (`argv[0]` in `main()`) to know
whether the code is under test. whether the code is under test.
## How do I temporarily disable a test? ## How do I temporarily disable a test?
If you have a broken test that you cannot fix right away, you can add the If you have a broken test that you cannot fix right away, you can add the
...@@ -731,7 +714,7 @@ the --gtest_also_run_disabled_tests flag. ...@@ -731,7 +714,7 @@ the --gtest_also_run_disabled_tests flag.
Yes. Yes.
The rule is **all test methods in the same test case must use the same fixture The rule is **all test methods in the same test suite must use the same fixture
class.** This means that the following is **allowed** because both tests use the class.** This means that the following is **allowed** because both tests use the
same fixture class (`::testing::Test`). same fixture class (`::testing::Test`).
...@@ -751,7 +734,7 @@ TEST(CoolTest, DoSomething) { ...@@ -751,7 +734,7 @@ TEST(CoolTest, DoSomething) {
However, the following code is **not allowed** and will produce a runtime error However, the following code is **not allowed** and will produce a runtime error
from googletest because the test methods are using different test fixture from googletest because the test methods are using different test fixture
classes with the same test case name. classes with the same test suite name.
```c++ ```c++
namespace foo { namespace foo {
......
## Using GoogleTest from various build systems ## ## Using GoogleTest from various build systems
GoogleTest comes with pkg-config files that can be used to determine all GoogleTest comes with pkg-config files that can be used to determine all
necessary flags for compiling and linking to GoogleTest (and GoogleMock). necessary flags for compiling and linking to GoogleTest (and GoogleMock).
Pkg-config is a standardised plain-text format containing Pkg-config is a standardised plain-text format containing
* the includedir (-I) path * the includedir (-I) path
* necessary macro (-D) definitions * necessary macro (-D) definitions
* further required flags (-pthread) * further required flags (-pthread)
* the library (-L) path * the library (-L) path
* the library (-l) to link to * the library (-l) to link to
All current build systems support pkg-config in one way or another. For All current build systems support pkg-config in one way or another. For all
all examples here we assume you want to compile the sample examples here we assume you want to compile the sample
`samples/sample3_unittest.cc`. `samples/sample3_unittest.cc`.
### CMake
### CMake ###
Using `pkg-config` in CMake is fairly easy: Using `pkg-config` in CMake is fairly easy:
``` cmake ```cmake
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0048 NEW)
...@@ -43,11 +42,10 @@ that all libraries have been compiled with threading enabled. In addition, ...@@ -43,11 +42,10 @@ that all libraries have been compiled with threading enabled. In addition,
GoogleTest might also require `-pthread` in the compiling step, and as such GoogleTest might also require `-pthread` in the compiling step, and as such
splitting the pkg-config `Cflags` variable into include dirs and macros for splitting the pkg-config `Cflags` variable into include dirs and macros for
`target_compile_definitions()` might still miss this). The same recommendation `target_compile_definitions()` might still miss this). The same recommendation
goes for using `_LDFLAGS` over the more commonplace `_LIBRARIES`, which goes for using `_LDFLAGS` over the more commonplace `_LIBRARIES`, which happens
happens to discard `-L` flags and `-pthread`. to discard `-L` flags and `-pthread`.
### Autotools ### ### Autotools
Finding GoogleTest in Autoconf and using it from Automake is also fairly easy: Finding GoogleTest in Autoconf and using it from Automake is also fairly easy:
...@@ -77,8 +75,7 @@ testapp_CXXFLAGS = $(GTEST_CFLAGS) ...@@ -77,8 +75,7 @@ testapp_CXXFLAGS = $(GTEST_CFLAGS)
testapp_LDADD = $(GTEST_LIBS) testapp_LDADD = $(GTEST_LIBS)
``` ```
### Meson
### Meson ###
Meson natively uses pkgconfig to query dependencies: Meson natively uses pkgconfig to query dependencies:
...@@ -96,36 +93,34 @@ testapp = executable( ...@@ -96,36 +93,34 @@ testapp = executable(
test('first_and_only_test', testapp) test('first_and_only_test', testapp)
``` ```
### Plain Makefiles
### Plain Makefiles ### Since `pkg-config` is a small Unix command-line utility, it can be used in
handwritten `Makefile`s too:
Since `pkg-config` is a small Unix command-line utility, it can be used ```Makefile
in handwritten `Makefile`s too:
``` Makefile
GTEST_CFLAGS = `pkg-config --cflags gtest_main` GTEST_CFLAGS = `pkg-config --cflags gtest_main`
GTEST_LIBS = `pkg-config --libs gtest_main` GTEST_LIBS = `pkg-config --libs gtest_main`
.PHONY: tests all .PHONY: tests all
tests: all tests: all
./testapp ./testapp
all: testapp all: testapp
testapp: testapp.o testapp: testapp.o
$(CXX) $(CXXFLAGS) $(LDFLAGS) $< -o $@ $(GTEST_LIBS) $(CXX) $(CXXFLAGS) $(LDFLAGS) $< -o $@ $(GTEST_LIBS)
testapp.o: samples/sample3_unittest.cc testapp.o: samples/sample3_unittest.cc
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -c -o $@ $(GTEST_CFLAGS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -c -o $@ $(GTEST_CFLAGS)
``` ```
### Help! pkg-config can't find GoogleTest!
### Help! pkg-config can't find GoogleTest! ###
Let's say you have a `CMakeLists.txt` along the lines of the one in this Let's say you have a `CMakeLists.txt` along the lines of the one in this
tutorial and you try to run `cmake`. It is very possible that you get a tutorial and you try to run `cmake`. It is very possible that you get a failure
failure along the lines of: along the lines of:
``` ```
-- Checking for one of the modules 'gtest_main' -- Checking for one of the modules 'gtest_main'
...@@ -135,9 +130,9 @@ CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:640 (message): ...@@ -135,9 +130,9 @@ CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:640 (message):
These failures are common if you installed GoogleTest yourself and have not These failures are common if you installed GoogleTest yourself and have not
sourced it from a distro or other package manager. If so, you need to tell sourced it from a distro or other package manager. If so, you need to tell
pkg-config where it can find the `.pc` files containing the information. pkg-config where it can find the `.pc` files containing the information. Say you
Say you installed GoogleTest to `/usr/local`, then it might be that the installed GoogleTest to `/usr/local`, then it might be that the `.pc` files are
`.pc` files are installed under `/usr/local/lib64/pkgconfig`. If you set installed under `/usr/local/lib64/pkgconfig`. If you set
``` ```
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
......
# Googletest Primer # Googletest Primer
## Introduction: Why googletest? ## Introduction: Why googletest?
*googletest* helps you write better C++ tests. *googletest* helps you write better C++ tests.
googletest is a testing framework developed by the Testing googletest is a testing framework developed by the Testing Technology team with
Technology team with Google's specific Google's specific requirements and constraints in mind. No matter whether you
requirements and constraints in mind. No matter whether you work on Linux, work on Linux, Windows, or a Mac, if you write C++ code, googletest can help
Windows, or a Mac, if you write C++ code, googletest can help you. And it you. And it supports *any* kind of tests, not just unit tests.
supports *any* kind of tests, not just unit tests.
So what makes a good test, and how does googletest fit in? We believe: So what makes a good test, and how does googletest fit in? We believe:
...@@ -17,27 +15,26 @@ So what makes a good test, and how does googletest fit in? We believe: ...@@ -17,27 +15,26 @@ So what makes a good test, and how does googletest fit in? We believe:
that succeeds or fails as a result of other tests. googletest isolates the that succeeds or fails as a result of other tests. googletest isolates the
tests by running each of them on a different object. When a test fails, tests by running each of them on a different object. When a test fails,
googletest allows you to run it in isolation for quick debugging. googletest allows you to run it in isolation for quick debugging.
1. Tests should be well *organized* and reflect the structure of the tested 2. Tests should be well *organized* and reflect the structure of the tested
code. googletest groups related tests into test cases that can share data code. googletest groups related tests into test suites that can share data
and subroutines. This common pattern is easy to recognize and makes tests and subroutines. This common pattern is easy to recognize and makes tests
easy to maintain. Such consistency is especially helpful when people switch easy to maintain. Such consistency is especially helpful when people switch
projects and start to work on a new code base. projects and start to work on a new code base.
1. Tests should be *portable* and *reusable*. Google has a lot of code that is 3. Tests should be *portable* and *reusable*. Google has a lot of code that is
platform-neutral, its tests should also be platform-neutral. googletest platform-neutral, its tests should also be platform-neutral. googletest
works on different OSes, with different compilers (gcc, icc, and MSVC), with works on different OSes, with different compilers, with or without
or without exceptions, so googletest tests can easily work with a variety of exceptions, so googletest tests can work with a variety of configurations.
configurations. 4. When tests fail, they should provide as much *information* about the problem
1. When tests fail, they should provide as much *information* about the problem
as possible. googletest doesn't stop at the first test failure. Instead, it as possible. googletest doesn't stop at the first test failure. Instead, it
only stops the current test and continues with the next. You can also set up only stops the current test and continues with the next. You can also set up
tests that report non-fatal failures after which the current test continues. tests that report non-fatal failures after which the current test continues.
Thus, you can detect and fix multiple bugs in a single run-edit-compile Thus, you can detect and fix multiple bugs in a single run-edit-compile
cycle. cycle.
1. The testing framework should liberate test writers from housekeeping chores 5. The testing framework should liberate test writers from housekeeping chores
and let them focus on the test *content*. googletest automatically keeps and let them focus on the test *content*. googletest automatically keeps
track of all tests defined, and doesn't require the user to enumerate them track of all tests defined, and doesn't require the user to enumerate them
in order to run them. in order to run them.
1. Tests should be *fast*. With googletest, you can reuse shared resources 6. Tests should be *fast*. With googletest, you can reuse shared resources
across tests and pay for the set-up/tear-down only once, without making across tests and pay for the set-up/tear-down only once, without making
tests depend on each other. tests depend on each other.
...@@ -54,28 +51,32 @@ of misunderstanding these. ...@@ -54,28 +51,32 @@ of misunderstanding these.
Historically, googletest started to use the term _Test Case_ for grouping Historically, googletest started to use the term _Test Case_ for grouping
related tests, whereas current publications including the International Software related tests, whereas current publications including the International Software
Testing Qualifications Board ([ISTQB](http://www.istqb.org/)) and various Testing Qualifications Board ([ISTQB](http://www.istqb.org/)) and various
textbooks on Software Quality use the term _[Test textbooks on Software Quality use the term _[Test Suite][istqb test suite]_ for
Suite](http://glossary.istqb.org/search/test%20suite)_ for this. this.
The related term _Test_, as it is used in the googletest, is corresponding to The related term _Test_, as it is used in the googletest, is corresponding to
the term _[Test Case](http://glossary.istqb.org/search/test%20case)_ of ISTQB the term _[Test Case][istqb test case]_ of ISTQB and others.
and others.
The term _Test_ is commonly of broad enough sense, including ISTQB's definition
of _Test Case_, so it's not much of a problem here. But the term _Test Case_ as
was used in Google Test is of contradictory sense and thus confusing.
googletest recently started replacing the term _Test Case_ with _Test Suite_.
The preferred API is *TestSuite*. The older TestCase API is being slowly
deprecated and refactored away.
The term _Test_ is commonly of broad enough sense, including ISTQB's So please be aware of the different definitions of the terms:
definition of _Test Case_, so it's not much of a problem here. But the
term _Test Case_ as used in Google Test is of contradictory sense and thus confusing.
Unfortunately replacing the term _Test Case_ by _Test Suite_ throughout the <!-- mdformat off(github rendering does not support multiline tables) -->
googletest is not easy without breaking dependent projects, as `TestCase` is
part of the public API at various places.
So for the time being, please be aware of the different definitions of Meaning | googletest Term | [ISTQB](http://www.istqb.org/) Term
the terms: :----------------------------------------------------------------------------------- | :---------------------- | :----------------------------------
Exercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests) | [Test Case][istqb test case]
Meaning | googletest Term | [ISTQB](http://www.istqb.org/) Term <!-- mdformat on -->
:----------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | :----------------------------------
Exercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests) | [Test Case](http://glossary.istqb.org/search/test%20case) [istqb test case]: http://glossary.istqb.org/en/search/test%20case
A set of several tests related to one component | [TestCase](#basic-concepts) | [TestSuite](http://glossary.istqb.org/search/test%20suite) [istqb test suite]: http://glossary.istqb.org/en/search/test%20suite
## Basic Concepts ## Basic Concepts
...@@ -87,15 +88,15 @@ current function; otherwise the program continues normally. ...@@ -87,15 +88,15 @@ current function; otherwise the program continues normally.
*Tests* use assertions to verify the tested code's behavior. If a test crashes *Tests* use assertions to verify the tested code's behavior. If a test crashes
or has a failed assertion, then it *fails*; otherwise it *succeeds*. or has a failed assertion, then it *fails*; otherwise it *succeeds*.
A *test case* contains one or many tests. You should group your tests into test A *test suite* contains one or many tests. You should group your tests into test
cases that reflect the structure of the tested code. When multiple tests in a suites that reflect the structure of the tested code. When multiple tests in a
test case need to share common objects and subroutines, you can put them into a test suite need to share common objects and subroutines, you can put them into a
*test fixture* class. *test fixture* class.
A *test program* can contain multiple test cases. A *test program* can contain multiple test suites.
We'll now explain how to write a test program, starting at the individual We'll now explain how to write a test program, starting at the individual
assertion level and building up to tests and test cases. assertion level and building up to tests and test suites.
## Assertions ## Assertions
...@@ -169,7 +170,7 @@ you'll get a compiler error. We used to require the arguments to support the ...@@ -169,7 +170,7 @@ you'll get a compiler error. We used to require the arguments to support the
`<<` is supported, it will be called to print the arguments when the assertion `<<` is supported, it will be called to print the arguments when the assertion
fails; otherwise googletest will attempt to print them in the best way it can. fails; otherwise googletest will attempt to print them in the best way it can.
For more details and how to customize the printing of the arguments, see For more details and how to customize the printing of the arguments, see
gMock [recipe](../../googlemock/docs/CookBook.md#teaching-google-mock-how-to-print-your-values).). [documentation](../../googlemock/docs/cook_book.md#teaching-gmock-how-to-print-your-values)
These assertions can work with a user-defined type, but only if you define the These assertions can work with a user-defined type, but only if you define the
corresponding comparison operator (e.g. `==`, `<`, etc). Since this is corresponding comparison operator (e.g. `==`, `<`, etc). Since this is
...@@ -192,14 +193,13 @@ evaluation order. ...@@ -192,14 +193,13 @@ evaluation order.
tests if they are in the same memory location, not if they have the same value. tests if they are in the same memory location, not if they have the same value.
Therefore, if you want to compare C strings (e.g. `const char*`) by value, use Therefore, if you want to compare C strings (e.g. `const char*`) by value, use
`ASSERT_STREQ()`, which will be described later on. In particular, to assert `ASSERT_STREQ()`, which will be described later on. In particular, to assert
that a C string is `NULL`, use `ASSERT_STREQ(c_string, NULL)`. Consider use that a C string is `NULL`, use `ASSERT_STREQ(c_string, NULL)`. Consider using
`ASSERT_EQ(c_string, nullptr)` if c++11 is supported. To compare two `string` `ASSERT_EQ(c_string, nullptr)` if c++11 is supported. To compare two `string`
objects, you should use `ASSERT_EQ`. objects, you should use `ASSERT_EQ`.
When doing pointer comparisons use `*_EQ(ptr, nullptr)` and `*_NE(ptr, nullptr)` When doing pointer comparisons use `*_EQ(ptr, nullptr)` and `*_NE(ptr, nullptr)`
instead of `*_EQ(ptr, NULL)` and `*_NE(ptr, NULL)`. This is because `nullptr` is instead of `*_EQ(ptr, NULL)` and `*_NE(ptr, NULL)`. This is because `nullptr` is
typed while `NULL` is not. See [FAQ](faq.md#why-does-googletest-support-expect_eqnull-ptr-and-assert_eqnull-ptr-but-not-expect_nenull-ptr-and-assert_nenull-ptr) typed while `NULL` is not. See [FAQ](faq.md) for more details.
for more details.
If you're working with floating point numbers, you may want to use the floating If you're working with floating point numbers, you may want to use the floating
point variations of some of these macros in order to avoid problems caused by point variations of some of these macros in order to avoid problems caused by
...@@ -219,12 +219,16 @@ as `ASSERT_EQ(expected, actual)`, so lots of existing code uses this order. Now ...@@ -219,12 +219,16 @@ as `ASSERT_EQ(expected, actual)`, so lots of existing code uses this order. Now
The assertions in this group compare two **C strings**. If you want to compare The assertions in this group compare two **C strings**. If you want to compare
two `string` objects, use `EXPECT_EQ`, `EXPECT_NE`, and etc instead. two `string` objects, use `EXPECT_EQ`, `EXPECT_NE`, and etc instead.
| Fatal assertion | Nonfatal assertion | Verifies | <!-- mdformat off(github rendering does not support multiline tables) -->
| ------------------------------- | ------------------------------- | -------------------------------------------------------- |
| `ASSERT_STREQ(str1, str2);` | `EXPECT_STREQ(str1, str2);` | the two C strings have the same content | | Fatal assertion | Nonfatal assertion | Verifies |
| `ASSERT_STRNE(str1, str2);` | `EXPECT_STRNE(str1, str2);` | the two C strings have different contents | | -------------------------- | ------------------------------ | -------------------------------------------------------- |
| `ASSERT_STRCASEEQ(str1, str2);` | `EXPECT_STRCASEEQ(str1, str2);` | the two C strings have the same content, ignoring case | | `ASSERT_STREQ(str1,str2);` | `EXPECT_STREQ(str1,str2);` | the two C strings have the same content |
| `ASSERT_STRCASENE(str1, str2);` | `EXPECT_STRCASENE(str1, str2);` | the two C strings have different contents, ignoring case | | `ASSERT_STRNE(str1,str2);` | `EXPECT_STRNE(str1,str2);` | the two C strings have different contents |
| `ASSERT_STRCASEEQ(str1,str2);` | `EXPECT_STRCASEEQ(str1,str2);` | the two C strings have the same content, ignoring case |
| `ASSERT_STRCASENE(str1,str2);` | `EXPECT_STRCASENE(str1,str2);` | the two C strings have different contents, ignoring case |
<!-- mdformat on-->
Note that "CASE" in an assertion name means that case is ignored. A `NULL` Note that "CASE" in an assertion name means that case is ignored. A `NULL`
pointer and an empty string are considered *different*. pointer and an empty string are considered *different*.
...@@ -235,9 +239,8 @@ of two wide strings fails, their values will be printed as UTF-8 narrow strings. ...@@ -235,9 +239,8 @@ of two wide strings fails, their values will be printed as UTF-8 narrow strings.
**Availability**: Linux, Windows, Mac. **Availability**: Linux, Windows, Mac.
**See also**: For more string comparison tricks (substring, prefix, suffix, and **See also**: For more string comparison tricks (substring, prefix, suffix, and
regular expression matching, for example), see regular expression matching, for example), see [this](advanced.md) in the
[this](https://github.com/google/googletest/blob/master/googletest/docs/advanced.md) Advanced googletest Guide.
in the Advanced googletest Guide.
## Simple Tests ## Simple Tests
...@@ -245,23 +248,23 @@ To create a test: ...@@ -245,23 +248,23 @@ To create a test:
1. Use the `TEST()` macro to define and name a test function, These are 1. Use the `TEST()` macro to define and name a test function, These are
ordinary C++ functions that don't return a value. ordinary C++ functions that don't return a value.
1. In this function, along with any valid C++ statements you want to include, 2. In this function, along with any valid C++ statements you want to include,
use the various googletest assertions to check values. use the various googletest assertions to check values.
1. The test's result is determined by the assertions; if any assertion in the 3. The test's result is determined by the assertions; if any assertion in the
test fails (either fatally or non-fatally), or if the test crashes, the test fails (either fatally or non-fatally), or if the test crashes, the
entire test fails. Otherwise, it succeeds. entire test fails. Otherwise, it succeeds.
```c++ ```c++
TEST(TestCaseName, TestName) { TEST(TestSuiteName, TestName) {
... test body ... ... test body ...
} }
``` ```
`TEST()` arguments go from general to specific. The *first* argument is the name `TEST()` arguments go from general to specific. The *first* argument is the name
of the test case, and the *second* argument is the test's name within the test of the test suite, and the *second* argument is the test's name within the test
case. Both names must be valid C++ identifiers, and they should not contain case. Both names must be valid C++ identifiers, and they should not contain
underscore (`_`). A test's *full name* consists of its containing test case and underscore (`_`). A test's *full name* consists of its containing test suite and
its individual name. Tests from different test cases can have the same its individual name. Tests from different test suites can have the same
individual name. individual name.
For example, let's take a simple integer function: For example, let's take a simple integer function:
...@@ -270,7 +273,7 @@ For example, let's take a simple integer function: ...@@ -270,7 +273,7 @@ For example, let's take a simple integer function:
int Factorial(int n); // Returns the factorial of n int Factorial(int n); // Returns the factorial of n
``` ```
A test case for this function might look like: A test suite for this function might look like:
```c++ ```c++
// Tests factorial of 0. // Tests factorial of 0.
...@@ -287,15 +290,15 @@ TEST(FactorialTest, HandlesPositiveInput) { ...@@ -287,15 +290,15 @@ TEST(FactorialTest, HandlesPositiveInput) {
} }
``` ```
googletest groups the test results by test cases, so logically-related tests googletest groups the test results by test suites, so logically-related tests
should be in the same test case; in other words, the first argument to their should be in the same test suite; in other words, the first argument to their
`TEST()` should be the same. In the above example, we have two tests, `TEST()` should be the same. In the above example, we have two tests,
`HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test case `HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test
`FactorialTest`. suite `FactorialTest`.
When naming your test cases and tests, you should follow the same convention as When naming your test suites and tests, you should follow the same convention as
for [naming functions and for
classes](https://google.github.io/styleguide/cppguide.html#Function_Names). [naming functions and classes](https://google.github.io/styleguide/cppguide.html#Function_Names).
**Availability**: Linux, Windows, Mac. **Availability**: Linux, Windows, Mac.
...@@ -309,29 +312,29 @@ To create a fixture: ...@@ -309,29 +312,29 @@ To create a fixture:
1. Derive a class from `::testing::Test` . Start its body with `protected:` as 1. Derive a class from `::testing::Test` . Start its body with `protected:` as
we'll want to access fixture members from sub-classes. we'll want to access fixture members from sub-classes.
1. Inside the class, declare any objects you plan to use. 2. Inside the class, declare any objects you plan to use.
1. If necessary, write a default constructor or `SetUp()` function to prepare 3. If necessary, write a default constructor or `SetUp()` function to prepare
the objects for each test. A common mistake is to spell `SetUp()` as the objects for each test. A common mistake is to spell `SetUp()` as
**`Setup()`** with a small `u` - Use `override` in C++11 to make sure you **`Setup()`** with a small `u` - Use `override` in C++11 to make sure you
spelled it correctly spelled it correctly
1. If necessary, write a destructor or `TearDown()` function to release any 4. If necessary, write a destructor or `TearDown()` function to release any
resources you allocated in `SetUp()` . To learn when you should use the resources you allocated in `SetUp()` . To learn when you should use the
constructor/destructor and when you should use `SetUp()/TearDown()`, read constructor/destructor and when you should use `SetUp()/TearDown()`, read
this [FAQ](faq.md#should-i-use-the-constructordestructor-of-the-test-fixture-or-setupteardown) entry. the [FAQ](faq.md).
1. If needed, define subroutines for your tests to share. 5. If needed, define subroutines for your tests to share.
When using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to When using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to
access objects and subroutines in the test fixture: access objects and subroutines in the test fixture:
```c++ ```c++
TEST_F(TestCaseName, TestName) { TEST_F(TestFixtureName, TestName) {
... test body ... ... test body ...
} }
``` ```
Like `TEST()`, the first argument is the test case name, but for `TEST_F()` this Like `TEST()`, the first argument is the test suite name, but for `TEST_F()`
must be the name of the test fixture class. You've probably guessed: `_F` is for this must be the name of the test fixture class. You've probably guessed: `_F`
fixture. is for fixture.
Unfortunately, the C++ macro system does not allow us to create a single macro Unfortunately, the C++ macro system does not allow us to create a single macro
that can handle both types of tests. Using the wrong macro causes a compiler that can handle both types of tests. Using the wrong macro causes a compiler
...@@ -344,7 +347,7 @@ declaration`". ...@@ -344,7 +347,7 @@ declaration`".
For each test defined with `TEST_F()` , googletest will create a *fresh* test For each test defined with `TEST_F()` , googletest will create a *fresh* test
fixture at runtime, immediately initialize it via `SetUp()` , run the test, fixture at runtime, immediately initialize it via `SetUp()` , run the test,
clean up by calling `TearDown()` , and then delete the test fixture. Note that clean up by calling `TearDown()` , and then delete the test fixture. Note that
different tests in the same test case have different test fixture objects, and different tests in the same test suite have different test fixture objects, and
googletest always deletes a test fixture before it creates the next one. googletest always deletes a test fixture before it creates the next one.
googletest does **not** reuse the same test fixture for multiple tests. Any googletest does **not** reuse the same test fixture for multiple tests. Any
changes one test makes to the fixture do not affect other tests. changes one test makes to the fixture do not affect other tests.
...@@ -416,22 +419,21 @@ The above uses both `ASSERT_*` and `EXPECT_*` assertions. The rule of thumb is ...@@ -416,22 +419,21 @@ The above uses both `ASSERT_*` and `EXPECT_*` assertions. The rule of thumb is
to use `EXPECT_*` when you want the test to continue to reveal more errors after to use `EXPECT_*` when you want the test to continue to reveal more errors after
the assertion failure, and use `ASSERT_*` when continuing after failure doesn't the assertion failure, and use `ASSERT_*` when continuing after failure doesn't
make sense. For example, the second assertion in the `Dequeue` test is make sense. For example, the second assertion in the `Dequeue` test is
=ASSERT_NE(nullptr, n)=, as we need to dereference the pointer `n` later, which `ASSERT_NE(nullptr, n)`, as we need to dereference the pointer `n` later, which
would lead to a segfault when `n` is `NULL`. would lead to a segfault when `n` is `NULL`.
When these tests run, the following happens: When these tests run, the following happens:
1. googletest constructs a `QueueTest` object (let's call it `t1` ). 1. googletest constructs a `QueueTest` object (let's call it `t1` ).
1. `t1.SetUp()` initializes `t1` . 2. `t1.SetUp()` initializes `t1` .
1. The first test ( `IsEmptyInitially` ) runs on `t1` . 3. The first test ( `IsEmptyInitially` ) runs on `t1` .
1. `t1.TearDown()` cleans up after the test finishes. 4. `t1.TearDown()` cleans up after the test finishes.
1. `t1` is destructed. 5. `t1` is destructed.
1. The above steps are repeated on another `QueueTest` object, this time 6. The above steps are repeated on another `QueueTest` object, this time
running the `DequeueWorks` test. running the `DequeueWorks` test.
**Availability**: Linux, Windows, Mac. **Availability**: Linux, Windows, Mac.
## Invoking the Tests ## Invoking the Tests
`TEST()` and `TEST_F()` implicitly register their tests with googletest. So, `TEST()` and `TEST_F()` implicitly register their tests with googletest. So,
...@@ -441,11 +443,11 @@ your defined tests in order to run them. ...@@ -441,11 +443,11 @@ your defined tests in order to run them.
After defining your tests, you can run them with `RUN_ALL_TESTS()` , which After defining your tests, you can run them with `RUN_ALL_TESTS()` , which
returns `0` if all the tests are successful, or `1` otherwise. Note that returns `0` if all the tests are successful, or `1` otherwise. Note that
`RUN_ALL_TESTS()` runs *all tests* in your link unit -- they can be from `RUN_ALL_TESTS()` runs *all tests* in your link unit -- they can be from
different test cases, or even different source files. different test suites, or even different source files.
When invoked, the `RUN_ALL_TESTS()` macro: When invoked, the `RUN_ALL_TESTS()` macro:
1. Saves the state of all googletest flags * Saves the state of all googletest flags
* Creates a test fixture object for the first test. * Creates a test fixture object for the first test.
...@@ -457,7 +459,7 @@ When invoked, the `RUN_ALL_TESTS()` macro: ...@@ -457,7 +459,7 @@ When invoked, the `RUN_ALL_TESTS()` macro:
* Deletes the fixture. * Deletes the fixture.
* Restores the state of all googletest flags * Restores the state of all googletest flags
* Repeats the above steps for the next test, until all tests have run. * Repeats the above steps for the next test, until all tests have run.
...@@ -470,15 +472,17 @@ If a fatal failure happens the subsequent steps will be skipped. ...@@ -470,15 +472,17 @@ If a fatal failure happens the subsequent steps will be skipped.
> return the value of `RUN_ALL_TESTS()`. > return the value of `RUN_ALL_TESTS()`.
> >
> Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than > Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than
> once conflicts with some advanced googletest features (e.g. thread-safe [death > once conflicts with some advanced googletest features (e.g. thread-safe
> tests](advanced.md#death-tests)) and thus is not supported. > [death tests](advanced.md#death-tests)) and thus is not supported.
**Availability**: Linux, Windows, Mac. **Availability**: Linux, Windows, Mac.
## Writing the main() Function ## Writing the main() Function
Write your own main() function, which should Write your own main() function, which should return the value of
return the value of `RUN_ALL_TESTS()` `RUN_ALL_TESTS()`
You can start from this boilerplate:
```c++ ```c++
#include "this/package/foo.h" #include "this/package/foo.h"
...@@ -513,7 +517,7 @@ class FooTest : public ::testing::Test { ...@@ -513,7 +517,7 @@ class FooTest : public ::testing::Test {
// before the destructor). // before the destructor).
} }
// Objects declared here can be used by all tests in the test case for Foo. // Objects declared here can be used by all tests in the test suite for Foo.
}; };
// Tests that the Foo::Bar() method does Abc. // Tests that the Foo::Bar() method does Abc.
...@@ -537,7 +541,6 @@ int main(int argc, char **argv) { ...@@ -537,7 +541,6 @@ int main(int argc, char **argv) {
} }
``` ```
The `::testing::InitGoogleTest()` function parses the command line for The `::testing::InitGoogleTest()` function parses the command line for
googletest flags, and removes all recognized flags. This allows the user to googletest flags, and removes all recognized flags. This allows the user to
control a test program's behavior via various flags, which we'll cover in control a test program's behavior via various flags, which we'll cover in
...@@ -554,7 +557,6 @@ gtest\_main library and you are good to go. ...@@ -554,7 +557,6 @@ gtest\_main library and you are good to go.
NOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`. NOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`.
## Known Limitations ## Known Limitations
* Google Test is designed to be thread-safe. The implementation is thread-safe * Google Test is designed to be thread-safe. The implementation is thread-safe
......
<b>P</b>ump is <b>U</b>seful for <b>M</b>eta <b>P</b>rogramming. <b>P</b>ump is <b>U</b>seful for <b>M</b>eta <b>P</b>rogramming.
# The Problem # # The Problem
Template and macro libraries often need to define many classes, Template and macro libraries often need to define many classes, functions, or
functions, or macros that vary only (or almost only) in the number of macros that vary only (or almost only) in the number of arguments they take.
arguments they take. It's a lot of repetitive, mechanical, and It's a lot of repetitive, mechanical, and error-prone work.
error-prone work.
Variadic templates and variadic macros can alleviate the problem. Variadic templates and variadic macros can alleviate the problem. However, while
However, while both are being considered by the C++ committee, neither both are being considered by the C++ committee, neither is in the standard yet
is in the standard yet or widely supported by compilers. Thus they or widely supported by compilers. Thus they are often not a good choice,
are often not a good choice, especially when your code needs to be especially when your code needs to be portable. And their capabilities are still
portable. And their capabilities are still limited. limited.
As a result, authors of such libraries often have to write scripts to As a result, authors of such libraries often have to write scripts to generate
generate their implementation. However, our experience is that it's their implementation. However, our experience is that it's tedious to write such
tedious to write such scripts, which tend to reflect the structure of scripts, which tend to reflect the structure of the generated code poorly and
the generated code poorly and are often hard to read and edit. For are often hard to read and edit. For example, a small change needed in the
example, a small change needed in the generated code may require some generated code may require some non-intuitive, non-trivial changes in the
non-intuitive, non-trivial changes in the script. This is especially script. This is especially painful when experimenting with the code.
painful when experimenting with the code.
# Our Solution # # Our Solution
Pump (for Pump is Useful for Meta Programming, Pretty Useful for Meta Pump (for Pump is Useful for Meta Programming, Pretty Useful for Meta
Programming, or Practical Utility for Meta Programming, whichever you Programming, or Practical Utility for Meta Programming, whichever you prefer) is
prefer) is a simple meta-programming tool for C++. The idea is that a a simple meta-programming tool for C++. The idea is that a programmer writes a
programmer writes a `foo.pump` file which contains C++ code plus meta `foo.pump` file which contains C++ code plus meta code that manipulates the C++
code that manipulates the C++ code. The meta code can handle code. The meta code can handle iterations over a range, nested iterations, local
iterations over a range, nested iterations, local meta variable meta variable definitions, simple arithmetic, and conditional expressions. You
definitions, simple arithmetic, and conditional expressions. You can can view it as a small Domain-Specific Language. The meta language is designed
view it as a small Domain-Specific Language. The meta language is to be non-intrusive (s.t. it won't confuse Emacs' C++ mode, for example) and
designed to be non-intrusive (s.t. it won't confuse Emacs' C++ mode, concise, making Pump code intuitive and easy to maintain.
for example) and concise, making Pump code intuitive and easy to
maintain. ## Highlights
## Highlights ## * The implementation is in a single Python script and thus ultra portable: no
build or installation is needed and it works cross platforms.
* The implementation is in a single Python script and thus ultra portable: no build or installation is needed and it works cross platforms. * Pump tries to be smart with respect to
* Pump tries to be smart with respect to [Google's style guide](https://github.com/google/styleguide): it breaks long lines (easy to have when they are generated) at acceptable places to fit within 80 columns and indent the continuation lines correctly. [Google's style guide](https://github.com/google/styleguide): it breaks long
* The format is human-readable and more concise than XML. lines (easy to have when they are generated) at acceptable places to fit
* The format works relatively well with Emacs' C++ mode. within 80 columns and indent the continuation lines correctly.
* The format is human-readable and more concise than XML.
## Examples ## * The format works relatively well with Emacs' C++ mode.
The following Pump code (where meta keywords start with `$`, `[[` and `]]` are meta brackets, and `$$` starts a meta comment that ends with the line): ## Examples
The following Pump code (where meta keywords start with `$`, `[[` and `]]` are
meta brackets, and `$$` starts a meta comment that ends with the line):
``` ```
$var n = 3 $$ Defines a meta variable n. $var n = 3 $$ Defines a meta variable n.
...@@ -71,7 +70,7 @@ $if i == 0 [[ ...@@ -71,7 +70,7 @@ $if i == 0 [[
will be translated by the Pump compiler to: will be translated by the Pump compiler to:
``` cpp ```cpp
// Foo0 does blah for 0-ary predicates. // Foo0 does blah for 0-ary predicates.
template <size_t N> template <size_t N>
class Foo0 { class Foo0 {
...@@ -105,9 +104,10 @@ Func($for i + [[a$i]]); ...@@ -105,9 +104,10 @@ Func($for i + [[a$i]]);
$$ The text between i and [[ is the separator between iterations. $$ The text between i and [[ is the separator between iterations.
``` ```
will generate one of the following lines (without the comments), depending on the value of `n`: will generate one of the following lines (without the comments), depending on
the value of `n`:
``` cpp ```cpp
Func(); // If n is 0. Func(); // If n is 0.
Func(a1); // If n is 1. Func(a1); // If n is 1.
Func(a1 + a2); // If n is 2. Func(a1 + a2); // If n is 2.
...@@ -115,32 +115,38 @@ Func(a1 + a2 + a3); // If n is 3. ...@@ -115,32 +115,38 @@ Func(a1 + a2 + a3); // If n is 3.
// And so on... // And so on...
``` ```
## Constructs ## ## Constructs
We support the following meta programming constructs: We support the following meta programming constructs:
| `$var id = exp` | Defines a named constant value. `$id` is valid util the end of the current meta lexical block. | | `$var id = exp` | Defines a named constant value. `$id` is |
|:----------------|:-----------------------------------------------------------------------------------------------| : : valid util the end of the current meta :
| `$range id exp..exp` | Sets the range of an iteration variable, which can be reused in multiple loops later. | : : lexical block. :
| `$for id sep [[ code ]]` | Iteration. The range of `id` must have been defined earlier. `$id` is valid in `code`. | | :------------------------------- | :--------------------------------------- |
| `$($)` | Generates a single `$` character. | | `$range id exp..exp` | Sets the range of an iteration variable, |
| `$id` | Value of the named constant or iteration variable. | : : which can be reused in multiple loops :
| `$(exp)` | Value of the expression. | : : later. :
| `$if exp [[ code ]] else_branch` | Conditional. | | `$for id sep [[ code ]]` | Iteration. The range of `id` must have |
| `[[ code ]]` | Meta lexical block. | : : been defined earlier. `$id` is valid in :
| `cpp_code` | Raw C++ code. | : : `code`. :
| `$$ comment` | Meta comment. | | `$($)` | Generates a single `$` character. |
| `$id` | Value of the named constant or iteration |
**Note:** To give the user some freedom in formatting the Pump source : : variable. :
code, Pump ignores a new-line character if it's right after `$for foo` | `$(exp)` | Value of the expression. |
or next to `[[` or `]]`. Without this rule you'll often be forced to write | `$if exp [[ code ]] else_branch` | Conditional. |
very long lines to get the desired output. Therefore sometimes you may | `[[ code ]]` | Meta lexical block. |
need to insert an extra new-line in such places for a new-line to show | `cpp_code` | Raw C++ code. |
up in your output. | `$$ comment` | Meta comment. |
## Grammar ## **Note:** To give the user some freedom in formatting the Pump source code, Pump
ignores a new-line character if it's right after `$for foo` or next to `[[` or
``` ebnf `]]`. Without this rule you'll often be forced to write very long lines to get
the desired output. Therefore sometimes you may need to insert an extra new-line
in such places for a new-line to show up in your output.
## Grammar
```ebnf
code ::= atomic_code* code ::= atomic_code*
atomic_code ::= $var id = exp atomic_code ::= $var id = exp
| $var id = [[ code ]] | $var id = [[ code ]]
...@@ -159,19 +165,26 @@ else_branch ::= $else [[ code ]] ...@@ -159,19 +165,26 @@ else_branch ::= $else [[ code ]]
exp ::= simple_expression_in_Python_syntax exp ::= simple_expression_in_Python_syntax
``` ```
## Code ## ## Code
You can find the source code of Pump in [scripts/pump.py](../scripts/pump.py). It is still You can find the source code of Pump in [scripts/pump.py](../scripts/pump.py).
very unpolished and lacks automated tests, although it has been It is still very unpolished and lacks automated tests, although it has been
successfully used many times. If you find a chance to use it in your successfully used many times. If you find a chance to use it in your project,
project, please let us know what you think! We also welcome help on please let us know what you think! We also welcome help on improving Pump.
improving Pump.
## Real Examples ## ## Real Examples
You can find real-world applications of Pump in [Google Test](https://github.com/google/googletest/tree/master/googletest) and [Google Mock](https://github.com/google/googletest/tree/master/googlemock). The source file `foo.h.pump` generates `foo.h`. You can find real-world applications of Pump in
[Google Test](https://github.com/google/googletest/tree/master/googletest) and
[Google Mock](https://github.com/google/googletest/tree/master/googlemock). The
source file `foo.h.pump` generates `foo.h`.
## Tips ## ## Tips
* If a meta variable is followed by a letter or digit, you can separate them using `[[]]`, which inserts an empty string. For example `Foo$j[[]]Helper` generate `Foo1Helper` when `j` is 1. * If a meta variable is followed by a letter or digit, you can separate them
* To avoid extra-long Pump source lines, you can break a line anywhere you want by inserting `[[]]` followed by a new line. Since any new-line character next to `[[` or `]]` is ignored, the generated code won't contain this new line. using `[[]]`, which inserts an empty string. For example `Foo$j[[]]Helper`
generate `Foo1Helper` when `j` is 1.
* To avoid extra-long Pump source lines, you can break a line anywhere you
want by inserting `[[]]` followed by a new line. Since any new-line
character next to `[[` or `]]` is ignored, the generated code won't contain
this new line.
# Googletest Samples # Googletest Samples {#samples}
If you're like us, you'd like to look at [googletest If you're like us, you'd like to look at
samples.](https://github.com/google/googletest/tree/master/googletest/samples) [googletest samples.](https://github.com/google/googletest/tree/master/googletest/samples)
The sample directory has a number of well-commented samples showing how to use a The sample directory has a number of well-commented samples showing how to use a
variety of googletest features. variety of googletest features.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment