mirror of
https://github.com/google/googletest.git
synced 2026-09-25 04:09:59 +03:00
Initial import.
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
Changes for 1.0.0:
|
||||
|
||||
* Initial Open Source release of Google Test
|
||||
@@ -0,0 +1,25 @@
|
||||
# This file contains a list of people who've made non-trivial
|
||||
# contribution to the Google C++ Testing Framework project. People
|
||||
# who commit code to the project are encouraged to add their names
|
||||
# here. Please keep the list sorted by first names.
|
||||
|
||||
Ajay Joshi <jaj@google.com>
|
||||
Bharat Mediratta <bharat@menalto.com>
|
||||
Chandler Carruth <chandlerc@google.com>
|
||||
Chris Prince <cprince@google.com>
|
||||
Chris Taylor <taylorc@google.com>
|
||||
Jeffrey Yasskin <jyasskin@google.com>
|
||||
Keir Mierle <mierle@gmail.com>
|
||||
Keith Ray <keith.ray@gmail.com>
|
||||
Kenton Varda <kenton@google.com>
|
||||
Markus Heule <markus.heule@gmail.com>
|
||||
Mika Raento <mikie@iki.fi>
|
||||
Patrick Hanna <phanna@google.com>
|
||||
Patrick Riley <pfr@google.com>
|
||||
Peter Kaminski <piotrk@google.com>
|
||||
Russ Cox <rsc@google.com>
|
||||
Russ Rufer <russ@pentad.com>
|
||||
Sean Mcafee <eefacm@gmail.com>
|
||||
Sigurður Ásgeirsson <siggi@google.com>
|
||||
Tracy Bialik <tracy@pentad.com>
|
||||
Zhanyong Wan <wan@google.com>
|
||||
@@ -0,0 +1,28 @@
|
||||
Copyright 2008, Google Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
# Automake file
|
||||
|
||||
# Nonstandard package files for distribution
|
||||
EXTRA_DIST = \
|
||||
CHANGES \
|
||||
CONTRIBUTORS \
|
||||
scripts/gen_gtest_pred_impl.py
|
||||
|
||||
# TODO(wan@google.com): integrate scripts/gen_gtest_pred_impl.py into
|
||||
# the build system such that a user can specify the maximum predicate
|
||||
# arity here and have the script automatically generate the
|
||||
# corresponding .h and .cc files.
|
||||
|
||||
# Scripts and utilities
|
||||
bin_SCRIPTS = scripts/gtest-config
|
||||
CLEANFILES = $(bin_SCRIPTS)
|
||||
|
||||
# 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
|
||||
|
||||
# Build rules for libraries.
|
||||
lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
|
||||
|
||||
lib_libgtest_la_SOURCES = src/gtest.cc \
|
||||
src/gtest-death-test.cc \
|
||||
src/gtest-filepath.cc \
|
||||
src/gtest-internal-inl.h \
|
||||
src/gtest-port.cc
|
||||
|
||||
pkginclude_HEADERS = include/gtest/gtest.h \
|
||||
include/gtest/gtest-death-test.h \
|
||||
include/gtest/gtest-message.h \
|
||||
include/gtest/gtest-spi.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-port.h \
|
||||
include/gtest/internal/gtest-string.h
|
||||
|
||||
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
|
||||
lib_libgtest_main_la_LIBADD = lib/libgtest.la
|
||||
|
||||
# Bulid rules for samples and tests. Automake's naming for some of
|
||||
# these variables isn't terribly obvious, so this is a brief
|
||||
# reference:
|
||||
#
|
||||
# TESTS -- Programs run automatically by "make check"
|
||||
# check_PROGRAMS -- Programs built by "make check" but not necessarily run
|
||||
|
||||
noinst_LTLIBRARIES = samples/libsamples.la
|
||||
|
||||
samples_libsamples_la_SOURCES = samples/sample1.cc \
|
||||
samples/sample1.h \
|
||||
samples/sample2.cc \
|
||||
samples/sample2.h \
|
||||
samples/sample3-inl.h \
|
||||
samples/sample4.cc \
|
||||
samples/sample4.h
|
||||
|
||||
TESTS=
|
||||
TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
|
||||
GTEST_BUILD_DIR="$(top_builddir)/test"
|
||||
check_PROGRAMS=
|
||||
|
||||
TESTS += samples/sample1_unittest
|
||||
check_PROGRAMS += samples/sample1_unittest
|
||||
samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
|
||||
samples_sample1_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample2_unittest
|
||||
check_PROGRAMS += samples/sample2_unittest
|
||||
samples_sample2_unittest_SOURCES = samples/sample2_unittest.cc
|
||||
samples_sample2_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample3_unittest
|
||||
check_PROGRAMS += samples/sample3_unittest
|
||||
samples_sample3_unittest_SOURCES = samples/sample3_unittest.cc
|
||||
samples_sample3_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample4_unittest
|
||||
check_PROGRAMS += samples/sample4_unittest
|
||||
samples_sample4_unittest_SOURCES = samples/sample4_unittest.cc
|
||||
samples_sample4_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample5_unittest
|
||||
check_PROGRAMS += samples/sample5_unittest
|
||||
samples_sample5_unittest_SOURCES = samples/sample5_unittest.cc
|
||||
samples_sample5_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += test/gtest_unittest
|
||||
check_PROGRAMS += test/gtest_unittest
|
||||
test_gtest_unittest_SOURCES = test/gtest_unittest.cc
|
||||
test_gtest_unittest_LDADD = lib/libgtest.la
|
||||
|
||||
TESTS += test/gtest-death-test_test
|
||||
check_PROGRAMS += test/gtest-death-test_test
|
||||
test_gtest_death_test_test_SOURCES = test/gtest-death-test_test.cc
|
||||
test_gtest_death_test_test_CXXFLAGS = $(AM_CXXFLAGS) -pthread
|
||||
test_gtest_death_test_test_LDADD = -lpthread lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest-filepath_test
|
||||
check_PROGRAMS += test/gtest-filepath_test
|
||||
test_gtest_filepath_test_SOURCES = test/gtest-filepath_test.cc
|
||||
test_gtest_filepath_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest-message_test
|
||||
check_PROGRAMS += test/gtest-message_test
|
||||
test_gtest_message_test_SOURCES = test/gtest-message_test.cc
|
||||
test_gtest_message_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest-options_test
|
||||
check_PROGRAMS += test/gtest-options_test
|
||||
test_gtest_options_test_SOURCES = test/gtest-options_test.cc
|
||||
test_gtest_options_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_pred_impl_unittest
|
||||
check_PROGRAMS += test/gtest_pred_impl_unittest
|
||||
test_gtest_pred_impl_unittest_SOURCES = test/gtest_pred_impl_unittest.cc
|
||||
test_gtest_pred_impl_unittest_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_environment_test
|
||||
check_PROGRAMS += test/gtest_environment_test
|
||||
test_gtest_environment_test_SOURCES = test/gtest_environment_test.cc
|
||||
test_gtest_environment_test_LDADD = lib/libgtest.la
|
||||
|
||||
TESTS += test/gtest_no_test_unittest
|
||||
check_PROGRAMS += test/gtest_no_test_unittest
|
||||
test_gtest_no_test_unittest_SOURCES = test/gtest_no_test_unittest.cc
|
||||
test_gtest_no_test_unittest_LDADD = lib/libgtest.la
|
||||
|
||||
TESTS += test/gtest_main_unittest
|
||||
check_PROGRAMS += test/gtest_main_unittest
|
||||
test_gtest_main_unittest_SOURCES = test/gtest_main_unittest.cc
|
||||
test_gtest_main_unittest_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_prod_test
|
||||
check_PROGRAMS += test/gtest_prod_test
|
||||
test_gtest_prod_test_SOURCES = test/gtest_prod_test.cc \
|
||||
test/production.cc \
|
||||
test/production.h
|
||||
test_gtest_prod_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_repeat_test
|
||||
check_PROGRAMS += test/gtest_repeat_test
|
||||
test_gtest_repeat_test_SOURCES = test/gtest_repeat_test.cc
|
||||
test_gtest_repeat_test_LDADD = lib/libgtest.la
|
||||
|
||||
TESTS += test/gtest_stress_test
|
||||
check_PROGRAMS += test/gtest_stress_test
|
||||
test_gtest_stress_test_SOURCES = test/gtest_stress_test.cc
|
||||
test_gtest_stress_test_LDADD = lib/libgtest.la
|
||||
|
||||
# The following tests depend on the presence of a Python installation and are
|
||||
# keyed off of it. TODO(chandlerc@google.com): While we currently only attempt
|
||||
# to build and execute these tests if Autoconf has found Python v2.4 on the
|
||||
# system, we don't use the PYTHON variable it specified as the valid
|
||||
# interpreter. The problem is that TESTS_ENVIRONMENT is a global variable, and
|
||||
# thus we cannot distinguish between C++ unit tests and Python unit tests.
|
||||
if HAVE_PYTHON
|
||||
check_SCRIPTS =
|
||||
|
||||
# These two Python modules are used by multiple Pythong tests below.
|
||||
check_SCRIPTS += test/gtest_test_utils.py \
|
||||
test/gtest_xml_test_utils.py
|
||||
|
||||
check_PROGRAMS += test/gtest_output_test_
|
||||
test_gtest_output_test__SOURCES = test/gtest_output_test_.cc
|
||||
test_gtest_output_test__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_output_test.py
|
||||
EXTRA_DIST += test/gtest_output_test_golden_lin.txt \
|
||||
test/gtest_output_test_golden_win.txt
|
||||
TESTS += test/gtest_output_test.py
|
||||
|
||||
check_PROGRAMS += test/gtest_color_test_
|
||||
test_gtest_color_test__SOURCES = test/gtest_color_test_.cc
|
||||
test_gtest_color_test__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_color_test.py
|
||||
TESTS += test/gtest_color_test.py
|
||||
|
||||
check_PROGRAMS += test/gtest_env_var_test_
|
||||
test_gtest_env_var_test__SOURCES = test/gtest_env_var_test_.cc
|
||||
test_gtest_env_var_test__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_env_var_test.py
|
||||
TESTS += test/gtest_env_var_test.py
|
||||
|
||||
check_PROGRAMS += test/gtest_filter_unittest_
|
||||
test_gtest_filter_unittest__SOURCES = test/gtest_filter_unittest_.cc
|
||||
test_gtest_filter_unittest__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_filter_unittest.py
|
||||
TESTS += test/gtest_filter_unittest.py
|
||||
|
||||
check_PROGRAMS += test/gtest_break_on_failure_unittest_
|
||||
test_gtest_break_on_failure_unittest__SOURCES = \
|
||||
test/gtest_break_on_failure_unittest_.cc
|
||||
test_gtest_break_on_failure_unittest__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_break_on_failure_unittest.py
|
||||
TESTS += test/gtest_break_on_failure_unittest.py
|
||||
|
||||
check_PROGRAMS += test/gtest_list_tests_unittest_
|
||||
test_gtest_list_tests_unittest__SOURCES = test/gtest_list_tests_unittest_.cc
|
||||
test_gtest_list_tests_unittest__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_list_tests_unittest.py
|
||||
TESTS += test/gtest_list_tests_unittest.py
|
||||
|
||||
check_PROGRAMS += test/gtest_xml_output_unittest_
|
||||
test_gtest_xml_output_unittest__SOURCES = test/gtest_xml_output_unittest_.cc
|
||||
test_gtest_xml_output_unittest__LDADD = lib/libgtest_main.la
|
||||
check_SCRIPTS += test/gtest_xml_output_unittest.py
|
||||
TESTS += test/gtest_xml_output_unittest.py
|
||||
|
||||
check_PROGRAMS += test/gtest_xml_outfile1_test_
|
||||
test_gtest_xml_outfile1_test__SOURCES = test/gtest_xml_outfile1_test_.cc
|
||||
test_gtest_xml_outfile1_test__LDADD = lib/libgtest_main.la
|
||||
check_PROGRAMS += test/gtest_xml_outfile2_test_
|
||||
test_gtest_xml_outfile2_test__SOURCES = test/gtest_xml_outfile2_test_.cc
|
||||
test_gtest_xml_outfile2_test__LDADD = lib/libgtest_main.la
|
||||
check_SCRIPTS += test/gtest_xml_outfiles_test.py
|
||||
TESTS += test/gtest_xml_outfiles_test.py
|
||||
|
||||
check_PROGRAMS += test/gtest_uninitialized_test_
|
||||
test_gtest_uninitialized_test__SOURCES = test/gtest_uninitialized_test_.cc
|
||||
test_gtest_uninitialized_test__LDADD = lib/libgtest.la
|
||||
check_SCRIPTS += test/gtest_uninitialized_test.py
|
||||
TESTS += test/gtest_uninitialized_test.py
|
||||
|
||||
# TODO(wan@google.com): make the build script compile and run the
|
||||
# negative-compilation tests. (The test/gtest_nc* files are unfinished
|
||||
# implementation of tests for verifying that certain kinds of misuse
|
||||
# of Google Test don't compile.)
|
||||
EXTRA_DIST += $(check_SCRIPTS) \
|
||||
test/gtest_nc.cc \
|
||||
test/gtest_nc_test.py
|
||||
|
||||
endif
|
||||
@@ -0,0 +1,134 @@
|
||||
Google C++ Testing Framework
|
||||
============================
|
||||
http://code.google.com/p/googletest/
|
||||
|
||||
Overview
|
||||
--------
|
||||
Google's framework for writing C++ tests on a variety of platforms (Linux, Mac
|
||||
OS X, Windows, Windows CE, and Symbian). Based on the xUnit architecture.
|
||||
Supports automatic test discovery, a rich set of assertions, user-defined
|
||||
assertions, death tests, fatal and non-fatal failures, various options for
|
||||
running the tests, and XML test report generation.
|
||||
|
||||
Please see the project page above for more information as well as mailing lists
|
||||
for questions, discussions, and development. There is also an IRC channel on
|
||||
OFTC (irc.oftc.net) #gtest available. Please join us!
|
||||
|
||||
Requirements
|
||||
------------
|
||||
Google Test is designed to have fairly minimal requirements to build and use
|
||||
with your projects, but there are some. Currently, the only Operating System
|
||||
(OS) on which Google Test is known to build properly is Linux, but we are
|
||||
actively working on Windows and Mac support as well. The source code itself is
|
||||
already portable across many other platforms, but we are still developing
|
||||
robust build systems for each.
|
||||
|
||||
### Linux Requirements ###
|
||||
These are the base requirements to build and use Google Test from a source
|
||||
package (as described below):
|
||||
* GNU-compatible Make or "gmake"
|
||||
* POSIX-standard shell
|
||||
* POSIX(-2) Regular Expressions (regex.h)
|
||||
* A C++98 standards compliant compiler
|
||||
|
||||
Furthermore, if you are building Google Test from a VCS Checkout (also
|
||||
described below), there are further requirements:
|
||||
* Automake version 1.9 or newer
|
||||
* Autoconf version 2.59 or newer
|
||||
* Libtool / Libtoolize
|
||||
* Python version 2.4 or newer
|
||||
|
||||
Getting the Source
|
||||
------------------
|
||||
There are two primary ways of getting Google Test's source code: you can
|
||||
download a source release in your preferred archive format, or directly check
|
||||
out the source from a Version Control System (VCS, we use Google Code's
|
||||
Subversion hosting). The VCS checkout requires a few extra steps and some extra
|
||||
software packages on your system, but lets you track development, and make
|
||||
patches to contribute much more easily, so we highly encourage it.
|
||||
|
||||
### VCS Checkout: ###
|
||||
The first step is to select whether you want to check out the main line of
|
||||
development on Google Test, or one of the released branches. The former will be
|
||||
much more active and have the latest features, but the latter provides much
|
||||
more stability and predictability. Choose whichever fits your needs best, and
|
||||
proceed with the following Subversion commands:
|
||||
|
||||
$ svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn
|
||||
|
||||
or for a release version X.Y.*'s branch:
|
||||
|
||||
$ svn checkout http://googletest.googlecode.com/svn/branches/release-X.Y/ gtest-X.Y-svn
|
||||
|
||||
Next you will need to prepare the GNU Autotools build system. Enter the
|
||||
target directory of the checkout command you used ('gtest-svn' or
|
||||
'gtest-X.Y-svn' above) and proceed with the following commands:
|
||||
|
||||
$ aclocal-1.9 # Where "1.9" must match the following automake command
|
||||
$ libtoolize -c
|
||||
$ autoheader
|
||||
$ automake-1.9 -ac # See Automake version requirements above
|
||||
$ autoconf
|
||||
|
||||
While this is a bit complicated, it will most often be automatically re-run by
|
||||
your "make" invocations, so in practice you shouldn't need to worry too much.
|
||||
Once you have completed these steps, you are ready to build the library.
|
||||
|
||||
### Source Package: ###
|
||||
Google Test is also released in source packages which can be downloaded from
|
||||
its Google Code download page[1]. Several different archive formats are
|
||||
provided, but the only difference is the tools used to manipulate them, and the
|
||||
size of the resulting file. Download whichever you are most comfortable with.
|
||||
|
||||
[1] Google Test Downloads: http://code.google.com/p/googletest/downloads/list
|
||||
|
||||
Once downloaded expand the archive using whichever tools you prefer for that
|
||||
type. This will always result in a new directory with the name "gtest-X.Y.Z"
|
||||
which contains all of the source code. Here are some examples in Linux:
|
||||
|
||||
$ tar -xvzf gtest-X.Y.Z.tar.gz
|
||||
$ tar -xvjf gtest-X.Y.Z.tar.bz2
|
||||
$ unzip gtest-X.Y.Z.zip
|
||||
|
||||
Building the Source
|
||||
-------------------
|
||||
There are two primary options for building the source at this point: build it
|
||||
inside the source code tree, or in a separate directory. We recommend building
|
||||
in a separate directory as that tends to produce both more consistent results
|
||||
and be easier to clean up should anything go wrong, but both patterns are
|
||||
supported. The only hard restriction is that while the build directory can be
|
||||
a subdirectory of the source directory, the opposite is not possible and will
|
||||
result in errors. Once you have selected where you wish to build Google Test,
|
||||
create the directory if necessary, and enter it. The following steps apply for
|
||||
either approach by simply substituting the shell variable SRCDIR with "." for
|
||||
building inside the source directory, and the relative path to the source
|
||||
directory otherwise.
|
||||
|
||||
$ ${SRCDIR}/configure # Standard GNU configure script, --help for more info
|
||||
$ make # Standard makefile following GNU conventions
|
||||
$ make check # Builds and runs all tests - all should pass
|
||||
|
||||
Other programs will only be able to use Google Test's functionality if you
|
||||
install it in a location which they can access, in Linux this is typically
|
||||
under '/usr/local'. The following command will install all of the Google Test
|
||||
libraries, public headers, and utilities necessary for other programs and
|
||||
libraries to leverage it:
|
||||
|
||||
$ sudo make install # Not necessary, but allows use by other programs
|
||||
|
||||
TODO(chandlerc@google.com): This section needs to be expanded when the
|
||||
'gtest-config' script is finished and Autoconf macro's are provided (or not
|
||||
provided) in order to properly reflect the process for other programs to
|
||||
locate, include, and link against Google Test.
|
||||
|
||||
Finally, should you need to remove Google Test from your system after having
|
||||
installed it, run the following command, and it will back out its changes.
|
||||
However, note carefully that you must run this command on the *same* Google
|
||||
Test build that you ran the install from, or the results are not predictable.
|
||||
If you install Google Test on your system, and are working from a VCS checkout,
|
||||
make sure you run this *before* updating your checkout of the source in order
|
||||
to uninstall the same version which you installed.
|
||||
|
||||
$ sudo make uninstall # Must be run against the exact same build as "install"
|
||||
|
||||
Happy testing!
|
||||
@@ -0,0 +1,43 @@
|
||||
AC_INIT([Google C++ Testing Framework],
|
||||
[1.0.0],
|
||||
[googletestframework@googlegroups.com],
|
||||
[gtest])
|
||||
|
||||
# Provide various options to initialize the Autoconf and configure processes.
|
||||
AC_PREREQ([2.59])
|
||||
AC_CONFIG_SRCDIR([./COPYING])
|
||||
AC_CONFIG_AUX_DIR([config_aux])
|
||||
AC_CONFIG_HEADERS([config_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.4. This will allow the scripts to use a "/usr/bin/env"
|
||||
# hashbang.
|
||||
#AM_PATH_PYTHON([2.4],,[:])
|
||||
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.4],[:],[PYTHON=":"])])
|
||||
AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
|
||||
|
||||
# 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
|
||||
@@ -0,0 +1,205 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file defines the public API for death tests. It is
|
||||
// #included by gtest.h so a user doesn't need to include this
|
||||
// directly.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||
|
||||
#include <gtest/internal/gtest-death-test-internal.h>
|
||||
|
||||
namespace testing {
|
||||
|
||||
// This flag controls the style of death tests. Valid values are "threadsafe",
|
||||
// meaning that the death test child process will re-execute the test binary
|
||||
// from the start, running only a single death test, or "fast",
|
||||
// meaning that the child process will execute the test logic immediately
|
||||
// after forking.
|
||||
GTEST_DECLARE_string(death_test_style);
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// The following macros are useful for writing death tests.
|
||||
|
||||
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
|
||||
// executed:
|
||||
//
|
||||
// 1. The assertion fails immediately if there are more than one
|
||||
// active threads. This is because it's safe to fork() only when
|
||||
// there is a single thread.
|
||||
//
|
||||
// 2. The parent process forks a sub-process and runs the death test
|
||||
// in it; the sub-process exits with code 0 at the end of the death
|
||||
// test, if it hasn't exited already.
|
||||
//
|
||||
// 3. The parent process waits for the sub-process to terminate.
|
||||
//
|
||||
// 4. The parent process checks the exit code and error message of
|
||||
// the sub-process.
|
||||
//
|
||||
// Note:
|
||||
//
|
||||
// It's not safe to call exit() if the current process is forked from
|
||||
// a multi-threaded process, so people usually call _exit() instead in
|
||||
// such a case. However, we are not concerned with this as we run
|
||||
// death tests only when there is a single thread. Since exit() has a
|
||||
// cleaner semantics (it also calls functions registered with atexit()
|
||||
// and on_exit()), this macro calls exit() instead of _exit() to
|
||||
// terminate the child process.
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
|
||||
// for (int i = 0; i < 5; i++) {
|
||||
// EXPECT_DEATH(server.ProcessRequest(i),
|
||||
// "Invalid request .* in ProcessRequest()")
|
||||
// << "Failed to die on request " << i);
|
||||
// }
|
||||
//
|
||||
// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
|
||||
//
|
||||
// bool KilledBySIGHUP(int exit_code) {
|
||||
// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
|
||||
// }
|
||||
//
|
||||
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
|
||||
|
||||
// Asserts that a given statement causes the program to exit, with an
|
||||
// integer exit status that satisfies predicate, and emitting error output
|
||||
// that matches regex.
|
||||
#define ASSERT_EXIT(statement, predicate, regex) \
|
||||
GTEST_DEATH_TEST(statement, predicate, regex, GTEST_FATAL_FAILURE)
|
||||
|
||||
// Like ASSERT_EXIT, but continues on to successive tests in the
|
||||
// test case, if any:
|
||||
#define EXPECT_EXIT(statement, predicate, regex) \
|
||||
GTEST_DEATH_TEST(statement, predicate, regex, GTEST_NONFATAL_FAILURE)
|
||||
|
||||
// Asserts that a given statement causes the program to exit, either by
|
||||
// explicitly exiting with a nonzero exit code or being killed by a
|
||||
// signal, and emitting error output that matches regex.
|
||||
#define ASSERT_DEATH(statement, regex) \
|
||||
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
|
||||
|
||||
// Like ASSERT_DEATH, but continues on to successive tests in the
|
||||
// test case, if any:
|
||||
#define EXPECT_DEATH(statement, regex) \
|
||||
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
|
||||
|
||||
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
|
||||
|
||||
// Tests that an exit code describes a normal exit with a given exit code.
|
||||
class ExitedWithCode {
|
||||
public:
|
||||
explicit ExitedWithCode(int exit_code);
|
||||
bool operator()(int exit_status) const;
|
||||
private:
|
||||
const int exit_code_;
|
||||
};
|
||||
|
||||
// Tests that an exit code describes an exit due to termination by a
|
||||
// given signal.
|
||||
class KilledBySignal {
|
||||
public:
|
||||
explicit KilledBySignal(int signum);
|
||||
bool operator()(int exit_status) const;
|
||||
private:
|
||||
const int signum_;
|
||||
};
|
||||
|
||||
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
|
||||
// The death testing framework causes this to have interesting semantics,
|
||||
// since the sideeffects of the call are only visible in opt mode, and not
|
||||
// in debug mode.
|
||||
//
|
||||
// In practice, this can be used to test functions that utilize the
|
||||
// LOG(DFATAL) macro using the following style:
|
||||
//
|
||||
// int DieInDebugOr12(int* sideeffect) {
|
||||
// if (sideeffect) {
|
||||
// *sideeffect = 12;
|
||||
// }
|
||||
// LOG(DFATAL) << "death";
|
||||
// return 12;
|
||||
// }
|
||||
//
|
||||
// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
|
||||
// int sideeffect = 0;
|
||||
// // Only asserts in dbg.
|
||||
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
|
||||
//
|
||||
// #ifdef NDEBUG
|
||||
// // opt-mode has sideeffect visible.
|
||||
// EXPECT_EQ(12, sideeffect);
|
||||
// #else
|
||||
// // dbg-mode no visible sideeffect.
|
||||
// EXPECT_EQ(0, sideeffect);
|
||||
// #endif
|
||||
// }
|
||||
//
|
||||
// This will assert that DieInDebugReturn12InOpt() crashes in debug
|
||||
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
|
||||
// appropriate fallback value (12 in this case) in opt mode. If you
|
||||
// need to test that a function has appropriate side-effects in opt
|
||||
// mode, include assertions against the side-effects. A general
|
||||
// pattern for this is:
|
||||
//
|
||||
// EXPECT_DEBUG_DEATH({
|
||||
// // Side-effects here will have an effect after this statement in
|
||||
// // opt mode, but none in debug mode.
|
||||
// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
|
||||
// }, "death");
|
||||
//
|
||||
#ifdef NDEBUG
|
||||
|
||||
#define EXPECT_DEBUG_DEATH(statement, regex) \
|
||||
do { statement; } while (false)
|
||||
|
||||
#define ASSERT_DEBUG_DEATH(statement, regex) \
|
||||
do { statement; } while (false)
|
||||
|
||||
#else
|
||||
|
||||
#define EXPECT_DEBUG_DEATH(statement, regex) \
|
||||
EXPECT_DEATH(statement, regex)
|
||||
|
||||
#define ASSERT_DEBUG_DEATH(statement, regex) \
|
||||
ASSERT_DEATH(statement, regex)
|
||||
|
||||
#endif // NDEBUG for EXPECT_DEBUG_DEATH
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||
@@ -0,0 +1,236 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file defines the Message class.
|
||||
//
|
||||
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
|
||||
// leave some internal implementation details in this header file.
|
||||
// They are clearly marked by comments like this:
|
||||
//
|
||||
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
//
|
||||
// Such code is NOT meant to be used by a user directly, and is subject
|
||||
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
|
||||
// program!
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-string.h" // NOLINT
|
||||
#include "gtest-internal.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
namespace testing {
|
||||
|
||||
// The Message class works like an ostream repeater.
|
||||
//
|
||||
// Typical usage:
|
||||
//
|
||||
// 1. You stream a bunch of values to a Message object.
|
||||
// It will remember the text in a StrStream.
|
||||
// 2. Then you stream the Message object to an ostream.
|
||||
// This causes the text in the Message to be streamed
|
||||
// to the ostream.
|
||||
//
|
||||
// For example;
|
||||
//
|
||||
// testing::Message foo;
|
||||
// foo << 1 << " != " << 2;
|
||||
// std::cout << foo;
|
||||
//
|
||||
// will print "1 != 2".
|
||||
//
|
||||
// Message is not intended to be inherited from. In particular, its
|
||||
// destructor is not virtual.
|
||||
//
|
||||
// Note that StrStream behaves differently in gcc and in MSVC. You
|
||||
// can stream a NULL char pointer to it in the former, but not in the
|
||||
// latter (it causes an access violation if you do). The Message
|
||||
// class hides this difference by treating a NULL char pointer as
|
||||
// "(null)".
|
||||
class Message {
|
||||
private:
|
||||
// The type of basic IO manipulators (endl, ends, and flush) for
|
||||
// narrow streams.
|
||||
typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
|
||||
|
||||
public:
|
||||
// Constructs an empty Message.
|
||||
// We allocate the StrStream separately because it otherwise each use of
|
||||
// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
|
||||
// stack frame leading to huge stack frames in some cases; gcc does not reuse
|
||||
// the stack space.
|
||||
Message() : ss_(new internal::StrStream) {}
|
||||
|
||||
// Copy constructor.
|
||||
Message(const Message& msg) : ss_(new internal::StrStream) { // NOLINT
|
||||
*ss_ << msg.GetString();
|
||||
}
|
||||
|
||||
// Constructs a Message from a C-string.
|
||||
explicit Message(const char* str) : ss_(new internal::StrStream) {
|
||||
*ss_ << str;
|
||||
}
|
||||
|
||||
~Message() { delete ss_; }
|
||||
#ifdef __SYMBIAN32__
|
||||
// Streams a value (either a pointer or not) to this object.
|
||||
template <typename T>
|
||||
inline Message& operator <<(const T& value) {
|
||||
StreamHelper(typename internal::is_pointer<T>::type(), value);
|
||||
return *this;
|
||||
}
|
||||
#else
|
||||
// Streams a non-pointer value to this object.
|
||||
template <typename T>
|
||||
inline Message& operator <<(const T& val) {
|
||||
::GTestStreamToHelper(ss_, val);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Streams a pointer value to this object.
|
||||
//
|
||||
// This function is an overload of the previous one. When you
|
||||
// stream a pointer to a Message, this definition will be used as it
|
||||
// is more specialized. (The C++ Standard, section
|
||||
// [temp.func.order].) If you stream a non-pointer, then the
|
||||
// previous definition will be used.
|
||||
//
|
||||
// The reason for this overload is that streaming a NULL pointer to
|
||||
// ostream is undefined behavior. Depending on the compiler, you
|
||||
// may get "0", "(nil)", "(null)", or an access violation. To
|
||||
// ensure consistent result across compilers, we always treat NULL
|
||||
// as "(null)".
|
||||
template <typename T>
|
||||
inline Message& operator <<(T* const& pointer) { // NOLINT
|
||||
if (pointer == NULL) {
|
||||
*ss_ << "(null)";
|
||||
} else {
|
||||
::GTestStreamToHelper(ss_, pointer);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Since the basic IO manipulators are overloaded for both narrow
|
||||
// and wide streams, we have to provide this specialized definition
|
||||
// of operator <<, even though its body is the same as the
|
||||
// templatized version above. Without this definition, streaming
|
||||
// endl or other basic IO manipulators to Message will confuse the
|
||||
// compiler.
|
||||
Message& operator <<(BasicNarrowIoManip val) {
|
||||
*ss_ << val;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Instead of 1/0, we want to see true/false for bool values.
|
||||
Message& operator <<(bool b) {
|
||||
return *this << (b ? "true" : "false");
|
||||
}
|
||||
|
||||
// These two overloads allow streaming a wide C string to a Message
|
||||
// using the UTF-8 encoding.
|
||||
Message& operator <<(const wchar_t* wide_c_str) {
|
||||
return *this << internal::String::ShowWideCString(wide_c_str);
|
||||
}
|
||||
Message& operator <<(wchar_t* wide_c_str) {
|
||||
return *this << internal::String::ShowWideCString(wide_c_str);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
// Converts the given wide string to a narrow string using the UTF-8
|
||||
// encoding, and streams the result to this Message object.
|
||||
Message& operator <<(const ::std::wstring& wstr);
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
// Converts the given wide string to a narrow string using the UTF-8
|
||||
// encoding, and streams the result to this Message object.
|
||||
Message& operator <<(const ::wstring& wstr);
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
// Gets the text streamed to this object so far as a String.
|
||||
// Each '\0' character in the buffer is replaced with "\\0".
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
internal::String GetString() const {
|
||||
return internal::StrStreamToString(ss_);
|
||||
}
|
||||
|
||||
private:
|
||||
#ifdef __SYMBIAN32__
|
||||
// These are needed as the Nokia Symbian Compiler cannot decide between
|
||||
// const T& and const T* in a function template. The Nokia compiler _can_
|
||||
// decide between class template specializations for T and T*, so a
|
||||
// tr1::type_traits-like is_pointer works, and we can overload on that.
|
||||
template <typename T>
|
||||
inline void StreamHelper(internal::true_type dummy, T* pointer) {
|
||||
if (pointer == NULL) {
|
||||
*ss_ << "(null)";
|
||||
} else {
|
||||
::GTestStreamToHelper(ss_, pointer);
|
||||
}
|
||||
}
|
||||
template <typename T>
|
||||
inline void StreamHelper(internal::false_type dummy, const T& value) {
|
||||
::GTestStreamToHelper(ss_, value);
|
||||
}
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// We'll hold the text streamed to this object here.
|
||||
internal::StrStream* const ss_;
|
||||
|
||||
// We declare (but don't implement) this to prevent the compiler
|
||||
// from implementing the assignment operator.
|
||||
void operator=(const Message&);
|
||||
};
|
||||
|
||||
// Streams a Message to an ostream.
|
||||
inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
|
||||
return os << sb.GetString();
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||
@@ -0,0 +1,247 @@
|
||||
// Copyright 2007, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Utilities for testing Google Test itself and code that uses Google Test
|
||||
// (e.g. frameworks built on top of Google Test).
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace testing {
|
||||
|
||||
// A copyable object representing the result of a test part (i.e. an
|
||||
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
|
||||
//
|
||||
// Don't inherit from TestPartResult as its destructor is not virtual.
|
||||
class TestPartResult {
|
||||
public:
|
||||
// C'tor. TestPartResult does NOT have a default constructor.
|
||||
// Always use this constructor (with parameters) to create a
|
||||
// TestPartResult object.
|
||||
TestPartResult(TestPartResultType type,
|
||||
const char* file_name,
|
||||
int line_number,
|
||||
const char* message)
|
||||
: type_(type),
|
||||
file_name_(file_name),
|
||||
line_number_(line_number),
|
||||
message_(message) {
|
||||
}
|
||||
|
||||
// Gets the outcome of the test part.
|
||||
TestPartResultType type() const { return type_; }
|
||||
|
||||
// Gets the name of the source file where the test part took place, or
|
||||
// NULL if it's unknown.
|
||||
const char* file_name() const { return file_name_.c_str(); }
|
||||
|
||||
// Gets the line in the source file where the test part took place,
|
||||
// or -1 if it's unknown.
|
||||
int line_number() const { return line_number_; }
|
||||
|
||||
// Gets the message associated with the test part.
|
||||
const char* message() const { return message_.c_str(); }
|
||||
|
||||
// Returns true iff the test part passed.
|
||||
bool passed() const { return type_ == TPRT_SUCCESS; }
|
||||
|
||||
// Returns true iff the test part failed.
|
||||
bool failed() const { return type_ != TPRT_SUCCESS; }
|
||||
|
||||
// Returns true iff the test part non-fatally failed.
|
||||
bool nonfatally_failed() const { return type_ == TPRT_NONFATAL_FAILURE; }
|
||||
|
||||
// Returns true iff the test part fatally failed.
|
||||
bool fatally_failed() const { return type_ == TPRT_FATAL_FAILURE; }
|
||||
private:
|
||||
TestPartResultType type_;
|
||||
|
||||
// The name of the source file where the test part took place, or
|
||||
// NULL if the source file is unknown.
|
||||
internal::String file_name_;
|
||||
// The line in the source file where the test part took place, or -1
|
||||
// if the line number is unknown.
|
||||
int line_number_;
|
||||
internal::String message_; // The test failure message.
|
||||
};
|
||||
|
||||
// Prints a TestPartResult object.
|
||||
std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
|
||||
|
||||
// An array of TestPartResult objects.
|
||||
//
|
||||
// We define this class as we cannot use STL containers when compiling
|
||||
// Google Test with MSVC 7.1 and exceptions disabled.
|
||||
//
|
||||
// Don't inherit from TestPartResultArray as its destructor is not
|
||||
// virtual.
|
||||
class TestPartResultArray {
|
||||
public:
|
||||
TestPartResultArray();
|
||||
~TestPartResultArray();
|
||||
|
||||
// Appends the given TestPartResult to the array.
|
||||
void Append(const TestPartResult& result);
|
||||
|
||||
// Returns the TestPartResult at the given index (0-based).
|
||||
const TestPartResult& GetTestPartResult(int index) const;
|
||||
|
||||
// Returns the number of TestPartResult objects in the array.
|
||||
int size() const;
|
||||
private:
|
||||
// Internally we use a list to simulate the array. Yes, this means
|
||||
// that random access is O(N) in time, but it's OK for its purpose.
|
||||
internal::List<TestPartResult>* const list_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestPartResultArray);
|
||||
};
|
||||
|
||||
// This interface knows how to report a test part result.
|
||||
class TestPartResultReporterInterface {
|
||||
public:
|
||||
virtual ~TestPartResultReporterInterface() {}
|
||||
|
||||
virtual void ReportTestPartResult(const TestPartResult& result) = 0;
|
||||
};
|
||||
|
||||
// This helper class can be used to mock out Google Test failure reporting
|
||||
// so that we can test Google Test or code that builds on Google Test.
|
||||
//
|
||||
// An object of this class appends a TestPartResult object to the
|
||||
// TestPartResultArray object given in the constructor whenever a
|
||||
// Google Test failure is reported.
|
||||
class ScopedFakeTestPartResultReporter
|
||||
: public TestPartResultReporterInterface {
|
||||
public:
|
||||
// The c'tor sets this object as the test part result reporter used
|
||||
// by Google Test. The 'result' parameter specifies where to report the
|
||||
// results.
|
||||
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
|
||||
|
||||
// The d'tor restores the previous test part result reporter.
|
||||
virtual ~ScopedFakeTestPartResultReporter();
|
||||
|
||||
// Appends the TestPartResult object to the TestPartResultArray
|
||||
// received in the constructor.
|
||||
//
|
||||
// This method is from the TestPartResultReporterInterface
|
||||
// interface.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
private:
|
||||
TestPartResultReporterInterface* const old_reporter_;
|
||||
TestPartResultArray* const result_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedFakeTestPartResultReporter);
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
// A helper class for implementing EXPECT_FATAL_FAILURE() and
|
||||
// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
|
||||
// TestPartResultArray contains exactly one failure that has the given
|
||||
// type and contains the given substring. If that's not the case, a
|
||||
// non-fatal failure will be generated.
|
||||
class SingleFailureChecker {
|
||||
public:
|
||||
// The constructor remembers the arguments.
|
||||
SingleFailureChecker(const TestPartResultArray* results,
|
||||
TestPartResultType type,
|
||||
const char* substr);
|
||||
~SingleFailureChecker();
|
||||
private:
|
||||
const TestPartResultArray* const results_;
|
||||
const TestPartResultType type_;
|
||||
const String substr_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(SingleFailureChecker);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
|
||||
// A macro for testing Google Test assertions or code that's expected to
|
||||
// generate Google Test fatal failures. It verifies that the given
|
||||
// statement will cause exactly one fatal Google Test failure with 'substr'
|
||||
// being part of the failure message.
|
||||
//
|
||||
// Implementation note: The verification is done in the destructor of
|
||||
// SingleFailureChecker, to make sure that it's done even when
|
||||
// 'statement' throws an exception.
|
||||
//
|
||||
// Known restrictions:
|
||||
// - 'statement' cannot reference local non-static variables or
|
||||
// non-static members of the current object.
|
||||
// - 'statement' cannot return a value.
|
||||
// - You cannot stream a failure message to this macro.
|
||||
#define EXPECT_FATAL_FAILURE(statement, substr) do {\
|
||||
class GTestExpectFatalFailureHelper {\
|
||||
public:\
|
||||
static void Execute() { statement; }\
|
||||
};\
|
||||
::testing::TestPartResultArray gtest_failures;\
|
||||
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||
>est_failures, ::testing::TPRT_FATAL_FAILURE, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
>est_failures);\
|
||||
GTestExpectFatalFailureHelper::Execute();\
|
||||
}\
|
||||
} while (false)
|
||||
|
||||
// A macro for testing Google Test assertions or code that's expected to
|
||||
// generate Google Test non-fatal failures. It asserts that the given
|
||||
// statement will cause exactly one non-fatal Google Test failure with
|
||||
// 'substr' being part of the failure message.
|
||||
//
|
||||
// 'statement' is allowed to reference local variables and members of
|
||||
// the current object.
|
||||
//
|
||||
// Implementation note: The verification is done in the destructor of
|
||||
// SingleFailureChecker, to make sure that it's done even when
|
||||
// 'statement' throws an exception or aborts the function.
|
||||
//
|
||||
// Known restrictions:
|
||||
// - You cannot stream a failure message to this macro.
|
||||
#define EXPECT_NONFATAL_FAILURE(statement, substr) do {\
|
||||
::testing::TestPartResultArray gtest_failures;\
|
||||
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||
>est_failures, ::testing::TPRT_NONFATAL_FAILURE, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
>est_failures);\
|
||||
statement;\
|
||||
}\
|
||||
} while (false)
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||
@@ -0,0 +1,1242 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file defines the public API for Google Test. It should be
|
||||
// included by any test program that uses Google Test.
|
||||
//
|
||||
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
|
||||
// leave some internal implementation details in this header file.
|
||||
// They are clearly marked by comments like this:
|
||||
//
|
||||
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
//
|
||||
// Such code is NOT meant to be used by a user directly, and is subject
|
||||
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
|
||||
// program!
|
||||
//
|
||||
// Acknowledgment: Google Test borrowed the idea of automatic test
|
||||
// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
|
||||
// easyUnit framework.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
|
||||
// The following platform macros are used throughout Google Test:
|
||||
// _WIN32_WCE Windows CE (set in project files)
|
||||
// __SYMBIAN32__ Symbian (set by Symbian tool chain)
|
||||
//
|
||||
// Note that even though _MSC_VER and _WIN32_WCE really indicate a compiler
|
||||
// and a Win32 implementation, respectively, we use them to indicate the
|
||||
// combination of compiler - Win 32 API - C library, since the code currently
|
||||
// only supports:
|
||||
// Windows proper with Visual C++ and MS C library (_MSC_VER && !_WIN32_WCE) and
|
||||
// Windows Mobile with Visual C++ and no C library (_WIN32_WCE).
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes
|
||||
// will be in the framework headers folder along with gtest.h. Define
|
||||
// GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on the
|
||||
// Mac and are not using it as a framework. More info on frameworks
|
||||
// available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-death-test.h" // NOLINT
|
||||
#include "gtest-internal.h" // NOLINT
|
||||
#include "gtest-message.h" // NOLINT
|
||||
#include "gtest-string.h" // NOLINT
|
||||
#include "gtest_prod.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
#include <gtest/gtest-death-test.h>
|
||||
#include <gtest/gtest-message.h>
|
||||
#include <gtest/gtest_prod.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
// Depending on the platform, different string classes are available.
|
||||
// On Windows, ::std::string compiles only when exceptions are
|
||||
// enabled. On Linux, in addition to ::std::string, Google also makes
|
||||
// use of class ::string, which has the same interface as
|
||||
// ::std::string, but has a different implementation.
|
||||
//
|
||||
// The user can tell us whether ::std::string is available in his
|
||||
// environment by defining the macro GTEST_HAS_STD_STRING to either 1
|
||||
// or 0 on the compiler command line. He can also define
|
||||
// GTEST_HAS_GLOBAL_STRING to 1 to indicate that ::string is available
|
||||
// AND is a distinct type to ::std::string, or define it to 0 to
|
||||
// indicate otherwise.
|
||||
//
|
||||
// If the user's ::std::string and ::string are the same class due to
|
||||
// aliasing, he should define GTEST_HAS_STD_STRING to 1 and
|
||||
// GTEST_HAS_GLOBAL_STRING to 0.
|
||||
//
|
||||
// If the user doesn't define GTEST_HAS_STD_STRING and/or
|
||||
// GTEST_HAS_GLOBAL_STRING, they are defined heuristically.
|
||||
|
||||
namespace testing {
|
||||
|
||||
// The upper limit for valid stack trace depths.
|
||||
const int kMaxStackTraceDepth = 100;
|
||||
|
||||
// This flag specifies the maximum number of stack frames to be
|
||||
// printed in a failure message.
|
||||
GTEST_DECLARE_int32(stack_trace_depth);
|
||||
|
||||
// This flag controls whether Google Test includes Google Test internal
|
||||
// stack frames in failure stack traces.
|
||||
GTEST_DECLARE_bool(show_internal_stack_frames);
|
||||
|
||||
// The possible outcomes of a test part (i.e. an assertion or an
|
||||
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
|
||||
enum TestPartResultType {
|
||||
TPRT_SUCCESS, // Succeeded.
|
||||
TPRT_NONFATAL_FAILURE, // Failed but the test can continue.
|
||||
TPRT_FATAL_FAILURE // Failed and the test should be terminated.
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
class GTestFlagSaver;
|
||||
|
||||
// Converts a streamable value to a String. A NULL pointer is
|
||||
// converted to "(null)". When the input value is a ::string,
|
||||
// ::std::string, ::wstring, or ::std::wstring object, each NUL
|
||||
// character in it is replaced with "\\0".
|
||||
// Declared in gtest-internal.h but defined here, so that it has access
|
||||
// to the definition of the Message class, required by the ARM
|
||||
// compiler.
|
||||
template <typename T>
|
||||
String StreamableToString(const T& streamable) {
|
||||
return (Message() << streamable).GetString();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// A class for indicating whether an assertion was successful. When
|
||||
// the assertion wasn't successful, the AssertionResult object
|
||||
// remembers a non-empty message that described how it failed.
|
||||
//
|
||||
// This class is useful for defining predicate-format functions to be
|
||||
// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
|
||||
//
|
||||
// The constructor of AssertionResult is private. To create an
|
||||
// instance of this class, use one of the factory functions
|
||||
// (AssertionSuccess() and AssertionFailure()).
|
||||
//
|
||||
// For example, in order to be able to write:
|
||||
//
|
||||
// // Verifies that Foo() returns an even number.
|
||||
// EXPECT_PRED_FORMAT1(IsEven, Foo());
|
||||
//
|
||||
// you just need to define:
|
||||
//
|
||||
// testing::AssertionResult IsEven(const char* expr, int n) {
|
||||
// if ((n % 2) == 0) return testing::AssertionSuccess();
|
||||
//
|
||||
// Message msg;
|
||||
// msg << "Expected: " << expr << " is even\n"
|
||||
// << " Actual: it's " << n;
|
||||
// return testing::AssertionFailure(msg);
|
||||
// }
|
||||
//
|
||||
// If Foo() returns 5, you will see the following message:
|
||||
//
|
||||
// Expected: Foo() is even
|
||||
// Actual: it's 5
|
||||
class AssertionResult {
|
||||
public:
|
||||
// Declares factory functions for making successful and failed
|
||||
// assertion results as friends.
|
||||
friend AssertionResult AssertionSuccess();
|
||||
friend AssertionResult AssertionFailure(const Message&);
|
||||
|
||||
// Returns true iff the assertion succeeded.
|
||||
operator bool() const { return failure_message_.c_str() == NULL; } // NOLINT
|
||||
|
||||
// Returns the assertion's failure message.
|
||||
const char* failure_message() const { return failure_message_.c_str(); }
|
||||
|
||||
private:
|
||||
// The default constructor. It is used when the assertion succeeded.
|
||||
AssertionResult() {}
|
||||
|
||||
// The constructor used when the assertion failed.
|
||||
explicit AssertionResult(const internal::String& failure_message);
|
||||
|
||||
// Stores the assertion's failure message.
|
||||
internal::String failure_message_;
|
||||
};
|
||||
|
||||
// Makes a successful assertion result.
|
||||
AssertionResult AssertionSuccess();
|
||||
|
||||
// Makes a failed assertion result with the given failure message.
|
||||
AssertionResult AssertionFailure(const Message& msg);
|
||||
|
||||
// The abstract class that all tests inherit from.
|
||||
//
|
||||
// In Google Test, a unit test program contains one or many TestCases, and
|
||||
// each TestCase contains one or many Tests.
|
||||
//
|
||||
// When you define a test using the TEST macro, you don't need to
|
||||
// explicitly derive from Test - the TEST macro automatically does
|
||||
// this for you.
|
||||
//
|
||||
// The only time you derive from Test is when defining a test fixture
|
||||
// to be used a TEST_F. For example:
|
||||
//
|
||||
// class FooTest : public testing::Test {
|
||||
// protected:
|
||||
// virtual void SetUp() { ... }
|
||||
// virtual void TearDown() { ... }
|
||||
// ...
|
||||
// };
|
||||
//
|
||||
// TEST_F(FooTest, Bar) { ... }
|
||||
// TEST_F(FooTest, Baz) { ... }
|
||||
//
|
||||
// Test is not copyable.
|
||||
class Test {
|
||||
public:
|
||||
friend class internal::TestInfoImpl;
|
||||
|
||||
// Defines types for pointers to functions that set up and tear down
|
||||
// a test case.
|
||||
typedef void (*SetUpTestCaseFunc)();
|
||||
typedef void (*TearDownTestCaseFunc)();
|
||||
|
||||
// The d'tor is virtual as we intend to inherit from Test.
|
||||
virtual ~Test();
|
||||
|
||||
// Returns true iff the current test has a fatal failure.
|
||||
static bool HasFatalFailure();
|
||||
|
||||
// Logs a property for the current test. Only the last value for a given
|
||||
// key is remembered.
|
||||
// These are public static so they can be called from utility functions
|
||||
// that are not members of the test fixture.
|
||||
// The arguments are const char* instead strings, as Google Test is used
|
||||
// on platforms where string doesn't compile.
|
||||
//
|
||||
// Note that a driving consideration for these RecordProperty methods
|
||||
// was to produce xml output suited to the Greenspan charting utility,
|
||||
// which at present will only chart values that fit in a 32-bit int. It
|
||||
// is the user's responsibility to restrict their values to 32-bit ints
|
||||
// if they intend them to be used with Greenspan.
|
||||
static void RecordProperty(const char* key, const char* value);
|
||||
static void RecordProperty(const char* key, int value);
|
||||
|
||||
protected:
|
||||
// Creates a Test object.
|
||||
Test();
|
||||
|
||||
// Sets up the stuff shared by all tests in this test case.
|
||||
//
|
||||
// Google Test will call Foo::SetUpTestCase() before running the first
|
||||
// test in test case Foo. Hence a sub-class can define its own
|
||||
// SetUpTestCase() method to shadow the one defined in the super
|
||||
// class.
|
||||
static void SetUpTestCase() {}
|
||||
|
||||
// Tears down the stuff shared by all tests in this test case.
|
||||
//
|
||||
// Google Test will call Foo::TearDownTestCase() after running the last
|
||||
// test in test case Foo. Hence a sub-class can define its own
|
||||
// TearDownTestCase() method to shadow the one defined in the super
|
||||
// class.
|
||||
static void TearDownTestCase() {}
|
||||
|
||||
// Sets up the test fixture.
|
||||
virtual void SetUp();
|
||||
|
||||
// Tears down the test fixture.
|
||||
virtual void TearDown();
|
||||
|
||||
private:
|
||||
// Returns true iff the current test has the same fixture class as
|
||||
// the first test in the current test case.
|
||||
static bool HasSameFixtureClass();
|
||||
|
||||
// Runs the test after the test fixture has been set up.
|
||||
//
|
||||
// A sub-class must implement this to define the test logic.
|
||||
//
|
||||
// DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
|
||||
// Instead, use the TEST or TEST_F macro.
|
||||
virtual void TestBody() = 0;
|
||||
|
||||
// Sets up, executes, and tears down the test.
|
||||
void Run();
|
||||
|
||||
// Uses a GTestFlagSaver to save and restore all Google Test flags.
|
||||
const internal::GTestFlagSaver* const gtest_flag_saver_;
|
||||
|
||||
// Often a user mis-spells SetUp() as Setup() and spends a long time
|
||||
// wondering why it is never called by Google Test. The declaration of
|
||||
// the following method is solely for catching such an error at
|
||||
// compile time:
|
||||
//
|
||||
// - The return type is deliberately chosen to be not void, so it
|
||||
// will be a conflict if a user declares void Setup() in his test
|
||||
// fixture.
|
||||
//
|
||||
// - This method is private, so it will be another compiler error
|
||||
// if a user calls it from his test fixture.
|
||||
//
|
||||
// DO NOT OVERRIDE THIS FUNCTION.
|
||||
//
|
||||
// If you see an error about overriding the following function or
|
||||
// about it being private, you have mis-spelled SetUp() as Setup().
|
||||
struct Setup_should_be_spelled_SetUp {};
|
||||
virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
|
||||
|
||||
// We disallow copying Tests.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(Test);
|
||||
};
|
||||
|
||||
|
||||
// Defines the type of a function pointer that creates a Test object
|
||||
// when invoked.
|
||||
typedef Test* (*TestMaker)();
|
||||
|
||||
|
||||
// A TestInfo object stores the following information about a test:
|
||||
//
|
||||
// Test case name
|
||||
// Test name
|
||||
// Whether the test should be run
|
||||
// A function pointer that creates the test object when invoked
|
||||
// Test result
|
||||
//
|
||||
// The constructor of TestInfo registers itself with the UnitTest
|
||||
// singleton such that the RUN_ALL_TESTS() macro knows which tests to
|
||||
// run.
|
||||
class TestInfo {
|
||||
public:
|
||||
// Destructs a TestInfo object. This function is not virtual, so
|
||||
// don't inherit from TestInfo.
|
||||
~TestInfo();
|
||||
|
||||
// Creates a TestInfo object and registers it with the UnitTest
|
||||
// singleton; returns the created object.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// test_case_name: name of the test case
|
||||
// name: name of the test
|
||||
// fixture_class_id: ID of the test fixture class
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
// maker: pointer to the function that creates a test object
|
||||
//
|
||||
// This is public only because it's needed by the TEST and TEST_F macros.
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
static TestInfo* MakeAndRegisterInstance(
|
||||
const char* test_case_name,
|
||||
const char* name,
|
||||
internal::TypeId fixture_class_id,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc,
|
||||
TestMaker maker);
|
||||
|
||||
// Returns the test case name.
|
||||
const char* test_case_name() const;
|
||||
|
||||
// Returns the test name.
|
||||
const char* name() const;
|
||||
|
||||
// Returns true if this test should run.
|
||||
//
|
||||
// Google Test allows the user to filter the tests by their full names.
|
||||
// The full name of a test Bar in test case Foo is defined as
|
||||
// "Foo.Bar". Only the tests that match the filter will run.
|
||||
//
|
||||
// A filter is a colon-separated list of glob (not regex) patterns,
|
||||
// optionally followed by a '-' and a colon-separated list of
|
||||
// negative patterns (tests to exclude). A test is run if it
|
||||
// matches one of the positive patterns and does not match any of
|
||||
// the negative patterns.
|
||||
//
|
||||
// For example, *A*:Foo.* is a filter that matches any string that
|
||||
// contains the character 'A' or starts with "Foo.".
|
||||
bool should_run() const;
|
||||
|
||||
// Returns the result of the test.
|
||||
const internal::TestResult* result() const;
|
||||
private:
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
friend class internal::DefaultDeathTestFactory;
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
friend class internal::TestInfoImpl;
|
||||
friend class internal::UnitTestImpl;
|
||||
friend class Test;
|
||||
friend class TestCase;
|
||||
|
||||
// Increments the number of death tests encountered in this test so
|
||||
// far.
|
||||
int increment_death_test_count();
|
||||
|
||||
// Accessors for the implementation object.
|
||||
internal::TestInfoImpl* impl() { return impl_; }
|
||||
const internal::TestInfoImpl* impl() const { return impl_; }
|
||||
|
||||
// Constructs a TestInfo object.
|
||||
TestInfo(const char* test_case_name, const char* name,
|
||||
internal::TypeId fixture_class_id, TestMaker maker);
|
||||
|
||||
// An opaque implementation object.
|
||||
internal::TestInfoImpl* impl_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestInfo);
|
||||
};
|
||||
|
||||
// An Environment object is capable of setting up and tearing down an
|
||||
// environment. The user should subclass this to define his own
|
||||
// environment(s).
|
||||
//
|
||||
// An Environment object does the set-up and tear-down in virtual
|
||||
// methods SetUp() and TearDown() instead of the constructor and the
|
||||
// destructor, as:
|
||||
//
|
||||
// 1. You cannot safely throw from a destructor. This is a problem
|
||||
// as in some cases Google Test is used where exceptions are enabled, and
|
||||
// we may want to implement ASSERT_* using exceptions where they are
|
||||
// available.
|
||||
// 2. You cannot use ASSERT_* directly in a constructor or
|
||||
// destructor.
|
||||
class Environment {
|
||||
public:
|
||||
// The d'tor is virtual as we need to subclass Environment.
|
||||
virtual ~Environment() {}
|
||||
|
||||
// Override this to define how to set up the environment.
|
||||
virtual void SetUp() {}
|
||||
|
||||
// Override this to define how to tear down the environment.
|
||||
virtual void TearDown() {}
|
||||
private:
|
||||
// If you see an error about overriding the following function or
|
||||
// about it being private, you have mis-spelled SetUp() as Setup().
|
||||
struct Setup_should_be_spelled_SetUp {};
|
||||
virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
|
||||
};
|
||||
|
||||
// A UnitTest consists of a list of TestCases.
|
||||
//
|
||||
// This is a singleton class. The only instance of UnitTest is
|
||||
// created when UnitTest::GetInstance() is first called. This
|
||||
// instance is never deleted.
|
||||
//
|
||||
// UnitTest is not copyable.
|
||||
//
|
||||
// This class is thread-safe as long as the methods are called
|
||||
// according to their specification.
|
||||
class UnitTest {
|
||||
public:
|
||||
// Gets the singleton UnitTest object. The first time this method
|
||||
// is called, a UnitTest object is constructed and returned.
|
||||
// Consecutive calls will return the same object.
|
||||
static UnitTest* GetInstance();
|
||||
|
||||
// Registers and returns a global test environment. When a test
|
||||
// program is run, all global test environments will be set-up in
|
||||
// the order they were registered. After all tests in the program
|
||||
// have finished, all global test environments will be torn-down in
|
||||
// the *reverse* order they were registered.
|
||||
//
|
||||
// The UnitTest object takes ownership of the given environment.
|
||||
//
|
||||
// This method can only be called from the main thread.
|
||||
Environment* AddEnvironment(Environment* env);
|
||||
|
||||
// Adds a TestPartResult to the current TestResult object. All
|
||||
// Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
|
||||
// eventually call this to report their results. The user code
|
||||
// should use the assertion macros instead of calling this directly.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
void AddTestPartResult(TestPartResultType result_type,
|
||||
const char* file_name,
|
||||
int line_number,
|
||||
const internal::String& message,
|
||||
const internal::String& os_stack_trace);
|
||||
|
||||
// Adds a TestProperty to the current TestResult object. If the result already
|
||||
// contains a property with the same key, the value will be updated.
|
||||
void RecordPropertyForCurrentTest(const char* key, const char* value);
|
||||
|
||||
// Runs all tests in this UnitTest object and prints the result.
|
||||
// Returns 0 if successful, or 1 otherwise.
|
||||
//
|
||||
// This method can only be called from the main thread.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
int Run() GTEST_MUST_USE_RESULT;
|
||||
|
||||
// Returns the TestCase object for the test that's currently running,
|
||||
// or NULL if no test is running.
|
||||
const TestCase* current_test_case() const;
|
||||
|
||||
// Returns the TestInfo object for the test that's currently running,
|
||||
// or NULL if no test is running.
|
||||
const TestInfo* current_test_info() const;
|
||||
|
||||
// Accessors for the implementation object.
|
||||
internal::UnitTestImpl* impl() { return impl_; }
|
||||
const internal::UnitTestImpl* impl() const { return impl_; }
|
||||
private:
|
||||
// ScopedTrace is a friend as it needs to modify the per-thread
|
||||
// trace stack, which is a private member of UnitTest.
|
||||
friend class internal::ScopedTrace;
|
||||
|
||||
// Creates an empty UnitTest.
|
||||
UnitTest();
|
||||
|
||||
// D'tor
|
||||
virtual ~UnitTest();
|
||||
|
||||
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
||||
// Google Test trace stack.
|
||||
void PushGTestTrace(const internal::TraceInfo& trace);
|
||||
|
||||
// Pops a trace from the per-thread Google Test trace stack.
|
||||
void PopGTestTrace();
|
||||
|
||||
// Protects mutable state in *impl_. This is mutable as some const
|
||||
// methods need to lock it too.
|
||||
mutable internal::Mutex mutex_;
|
||||
|
||||
// Opaque implementation object. This field is never changed once
|
||||
// the object is constructed. We don't mark it as const here, as
|
||||
// doing so will cause a warning in the constructor of UnitTest.
|
||||
// Mutable state in *impl_ is protected by mutex_.
|
||||
internal::UnitTestImpl* impl_;
|
||||
|
||||
// We disallow copying UnitTest.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTest);
|
||||
};
|
||||
|
||||
// A convenient wrapper for adding an environment for the test
|
||||
// program.
|
||||
//
|
||||
// You should call this before RUN_ALL_TESTS() is called, probably in
|
||||
// main(). If you use gtest_main, you need to call this before main()
|
||||
// starts for it to take effect. For example, you can define a global
|
||||
// variable like this:
|
||||
//
|
||||
// testing::Environment* const foo_env =
|
||||
// testing::AddGlobalTestEnvironment(new FooEnvironment);
|
||||
//
|
||||
// However, we strongly recommend you to write your own main() and
|
||||
// call AddGlobalTestEnvironment() there, as relying on initialization
|
||||
// of global variables makes the code harder to read and may cause
|
||||
// problems when you register multiple environments from different
|
||||
// translation units and the environments have dependencies among them
|
||||
// (remember that the compiler doesn't guarantee the order in which
|
||||
// global variables from different translation units are initialized).
|
||||
inline Environment* AddGlobalTestEnvironment(Environment* env) {
|
||||
return UnitTest::GetInstance()->AddEnvironment(env);
|
||||
}
|
||||
|
||||
// Initializes Google Test. This must be called before calling
|
||||
// RUN_ALL_TESTS(). In particular, it parses a command line for the
|
||||
// flags that Google Test recognizes. Whenever a Google Test flag is
|
||||
// seen, it is removed from argv, and *argc is decremented.
|
||||
//
|
||||
// No value is returned. Instead, the Google Test flag variables are
|
||||
// updated.
|
||||
void InitGoogleTest(int* argc, char** argv);
|
||||
|
||||
// This overloaded version can be used in Windows programs compiled in
|
||||
// UNICODE mode.
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
void InitGoogleTest(int* argc, wchar_t** argv);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
namespace internal {
|
||||
|
||||
// These overloaded versions handle ::std::string and ::std::wstring.
|
||||
#if GTEST_HAS_STD_STRING
|
||||
inline String FormatForFailureMessage(const ::std::string& str) {
|
||||
return (Message() << '"' << str << '"').GetString();
|
||||
}
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
inline String FormatForFailureMessage(const ::std::wstring& wstr) {
|
||||
return (Message() << "L\"" << wstr << '"').GetString();
|
||||
}
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
// These overloaded versions handle ::string and ::wstring.
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
inline String FormatForFailureMessage(const ::string& str) {
|
||||
return (Message() << '"' << str << '"').GetString();
|
||||
}
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
inline String FormatForFailureMessage(const ::wstring& wstr) {
|
||||
return (Message() << "L\"" << wstr << '"').GetString();
|
||||
}
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
|
||||
// operand to be used in a failure message. The type (but not value)
|
||||
// of the other operand may affect the format. This allows us to
|
||||
// print a char* as a raw pointer when it is compared against another
|
||||
// char*, and print it as a C string when it is compared against an
|
||||
// std::string object, for example.
|
||||
//
|
||||
// The default implementation ignores the type of the other operand.
|
||||
// Some specialized versions are used to handle formatting wide or
|
||||
// narrow C strings.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
template <typename T1, typename T2>
|
||||
String FormatForComparisonFailureMessage(const T1& value,
|
||||
const T2& /* other_operand */) {
|
||||
return FormatForFailureMessage(value);
|
||||
}
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_EQ.
|
||||
template <typename T1, typename T2>
|
||||
AssertionResult CmpHelperEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& expected,
|
||||
const T2& actual) {
|
||||
if (expected == actual) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
FormatForComparisonFailureMessage(expected, actual),
|
||||
FormatForComparisonFailureMessage(actual, expected),
|
||||
false);
|
||||
}
|
||||
|
||||
// With this overloaded version, we allow anonymous enums to be used
|
||||
// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
|
||||
// can be implicitly cast to BiggestInt.
|
||||
AssertionResult CmpHelperEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
BiggestInt expected,
|
||||
BiggestInt actual);
|
||||
|
||||
// The helper class for {ASSERT|EXPECT}_EQ. The template argument
|
||||
// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
|
||||
// is a null pointer literal. The following default implementation is
|
||||
// for lhs_is_null_literal being false.
|
||||
template <bool lhs_is_null_literal>
|
||||
class EqHelper {
|
||||
public:
|
||||
// This templatized version is for the general case.
|
||||
template <typename T1, typename T2>
|
||||
static AssertionResult Compare(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& expected,
|
||||
const T2& actual) {
|
||||
return CmpHelperEQ(expected_expression, actual_expression, expected,
|
||||
actual);
|
||||
}
|
||||
|
||||
// With this overloaded version, we allow anonymous enums to be used
|
||||
// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
|
||||
// enums can be implicitly cast to BiggestInt.
|
||||
//
|
||||
// Even though its body looks the same as the above version, we
|
||||
// cannot merge the two, as it will make anonymous enums unhappy.
|
||||
static AssertionResult Compare(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
BiggestInt expected,
|
||||
BiggestInt actual) {
|
||||
return CmpHelperEQ(expected_expression, actual_expression, expected,
|
||||
actual);
|
||||
}
|
||||
};
|
||||
|
||||
// This specialization is used when the first argument to ASSERT_EQ()
|
||||
// is a null pointer literal.
|
||||
template <>
|
||||
class EqHelper<true> {
|
||||
public:
|
||||
// We define two overloaded versions of Compare(). The first
|
||||
// version will be picked when the second argument to ASSERT_EQ() is
|
||||
// NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
|
||||
// EXPECT_EQ(false, a_bool).
|
||||
template <typename T1, typename T2>
|
||||
static AssertionResult Compare(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& expected,
|
||||
const T2& actual) {
|
||||
return CmpHelperEQ(expected_expression, actual_expression, expected,
|
||||
actual);
|
||||
}
|
||||
|
||||
// This version will be picked when the second argument to
|
||||
// ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer).
|
||||
template <typename T1, typename T2>
|
||||
static AssertionResult Compare(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& expected,
|
||||
T2* actual) {
|
||||
// We already know that 'expected' is a null pointer.
|
||||
return CmpHelperEQ(expected_expression, actual_expression,
|
||||
static_cast<T2*>(NULL), actual);
|
||||
}
|
||||
};
|
||||
|
||||
// A macro for implementing the helper functions needed to implement
|
||||
// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
|
||||
// of similar code.
|
||||
//
|
||||
// For each templatized helper function, we also define an overloaded
|
||||
// version for BiggestInt in order to reduce code bloat and allow
|
||||
// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
|
||||
// with gcc 4.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
#define GTEST_IMPL_CMP_HELPER(op_name, op)\
|
||||
template <typename T1, typename T2>\
|
||||
AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
|
||||
const T1& val1, const T2& val2) {\
|
||||
if (val1 op val2) {\
|
||||
return AssertionSuccess();\
|
||||
} else {\
|
||||
Message msg;\
|
||||
msg << "Expected: (" << expr1 << ") " #op " (" << expr2\
|
||||
<< "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
|
||||
<< " vs " << FormatForComparisonFailureMessage(val2, val1);\
|
||||
return AssertionFailure(msg);\
|
||||
}\
|
||||
}\
|
||||
AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
|
||||
BiggestInt val1, BiggestInt val2);
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
|
||||
// Implements the helper function for {ASSERT|EXPECT}_NE
|
||||
GTEST_IMPL_CMP_HELPER(NE, !=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LE
|
||||
GTEST_IMPL_CMP_HELPER(LE, <=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LT
|
||||
GTEST_IMPL_CMP_HELPER(LT, < )
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GE
|
||||
GTEST_IMPL_CMP_HELPER(GE, >=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GT
|
||||
GTEST_IMPL_CMP_HELPER(GT, > )
|
||||
|
||||
#undef GTEST_IMPL_CMP_HELPER
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STREQ.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const char* expected,
|
||||
const char* actual);
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const char* expected,
|
||||
const char* actual);
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRNE.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTRNE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const char* s1,
|
||||
const char* s2);
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRCASENE.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const char* s1,
|
||||
const char* s2);
|
||||
|
||||
|
||||
// Helper function for *_STREQ on wide strings.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const wchar_t* expected,
|
||||
const wchar_t* actual);
|
||||
|
||||
// Helper function for *_STRNE on wide strings.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult CmpHelperSTRNE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const wchar_t* s1,
|
||||
const wchar_t* s2);
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// IsSubstring() and IsNotSubstring() are intended to be used as the
|
||||
// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
|
||||
// themselves. They check whether needle is a substring of haystack
|
||||
// (NULL is considered a substring of itself only), and return an
|
||||
// appropriate error message when they fail.
|
||||
//
|
||||
// The {needle,haystack}_expr arguments are the stringified
|
||||
// expressions that generated the two real arguments.
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const char* needle, const char* haystack);
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const wchar_t* needle, const wchar_t* haystack);
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const char* needle, const char* haystack);
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const wchar_t* needle, const wchar_t* haystack);
|
||||
#if GTEST_HAS_STD_STRING
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::string& needle, const ::std::string& haystack);
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::string& needle, const ::std::string& haystack);
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::wstring& needle, const ::std::wstring& haystack);
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::wstring& needle, const ::std::wstring& haystack);
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Helper template function for comparing floating-points.
|
||||
//
|
||||
// Template parameter:
|
||||
//
|
||||
// RawType: the raw floating-point type (either float or double)
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
template <typename RawType>
|
||||
AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
RawType expected,
|
||||
RawType actual) {
|
||||
const FloatingPoint<RawType> lhs(expected), rhs(actual);
|
||||
|
||||
if (lhs.AlmostEquals(rhs)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
StrStream expected_ss;
|
||||
expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
|
||||
<< expected;
|
||||
|
||||
StrStream actual_ss;
|
||||
actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
|
||||
<< actual;
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
StrStreamToString(&expected_ss),
|
||||
StrStreamToString(&actual_ss),
|
||||
false);
|
||||
}
|
||||
|
||||
// Helper function for implementing ASSERT_NEAR.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
AssertionResult DoubleNearPredFormat(const char* expr1,
|
||||
const char* expr2,
|
||||
const char* abs_error_expr,
|
||||
double val1,
|
||||
double val2,
|
||||
double abs_error);
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
// A class that enables one to stream messages to assertion macros
|
||||
class AssertHelper {
|
||||
public:
|
||||
// Constructor.
|
||||
AssertHelper(TestPartResultType type, const char* file, int line,
|
||||
const char* message);
|
||||
// Message assignment is a semantic trick to enable assertion
|
||||
// streaming; see the GTEST_MESSAGE macro below.
|
||||
void operator=(const Message& message) const;
|
||||
private:
|
||||
TestPartResultType const type_;
|
||||
const char* const file_;
|
||||
int const line_;
|
||||
String const message_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(AssertHelper);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Macros for indicating success/failure in test code.
|
||||
|
||||
// ADD_FAILURE unconditionally adds a failure to the current test.
|
||||
// SUCCEED generates a success - it doesn't automatically make the
|
||||
// current test successful, as a test is only successful when it has
|
||||
// no failure.
|
||||
//
|
||||
// EXPECT_* verifies that a certain condition is satisfied. If not,
|
||||
// it behaves like ADD_FAILURE. In particular:
|
||||
//
|
||||
// EXPECT_TRUE verifies that a Boolean condition is true.
|
||||
// EXPECT_FALSE verifies that a Boolean condition is false.
|
||||
//
|
||||
// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
|
||||
// that they will also abort the current function on failure. People
|
||||
// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
|
||||
// writing data-driven tests often find themselves using ADD_FAILURE
|
||||
// and EXPECT_* more.
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// EXPECT_TRUE(server.StatusIsOK());
|
||||
// ASSERT_FALSE(server.HasPendingRequest(port))
|
||||
// << "There are still pending requests " << "on port " << port;
|
||||
|
||||
// Generates a nonfatal failure with a generic message.
|
||||
#define ADD_FAILURE() GTEST_NONFATAL_FAILURE("Failed")
|
||||
|
||||
// Generates a fatal failure with a generic message.
|
||||
#define FAIL() GTEST_FATAL_FAILURE("Failed")
|
||||
|
||||
// Generates a success with a generic message.
|
||||
#define SUCCEED() GTEST_SUCCESS("Succeeded")
|
||||
|
||||
// Boolean assertions.
|
||||
#define EXPECT_TRUE(condition) \
|
||||
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
|
||||
GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_FALSE(condition) \
|
||||
GTEST_TEST_BOOLEAN(!(condition), #condition, true, false, \
|
||||
GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_TRUE(condition) \
|
||||
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
|
||||
GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_FALSE(condition) \
|
||||
GTEST_TEST_BOOLEAN(!(condition), #condition, true, false, \
|
||||
GTEST_FATAL_FAILURE)
|
||||
|
||||
// Includes the auto-generated header that implements a family of
|
||||
// generic predicate assertion macros.
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest_pred_impl.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/gtest_pred_impl.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
// Macros for testing equalities and inequalities.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
|
||||
// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
|
||||
// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
|
||||
// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
|
||||
// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
|
||||
// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
|
||||
//
|
||||
// When they are not, Google Test prints both the tested expressions and
|
||||
// their actual values. The values must be compatible built-in types,
|
||||
// or you will get a compiler error. By "compatible" we mean that the
|
||||
// values can be compared by the respective operator.
|
||||
//
|
||||
// Note:
|
||||
//
|
||||
// 1. It is possible to make a user-defined type work with
|
||||
// {ASSERT|EXPECT}_??(), but that requires overloading the
|
||||
// comparison operators and is thus discouraged by the Google C++
|
||||
// Usage Guide. Therefore, you are advised to use the
|
||||
// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
|
||||
// equal.
|
||||
//
|
||||
// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
|
||||
// pointers (in particular, C strings). Therefore, if you use it
|
||||
// with two C strings, you are testing how their locations in memory
|
||||
// are related, not how their content is related. To compare two C
|
||||
// strings by content, use {ASSERT|EXPECT}_STR*().
|
||||
//
|
||||
// 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
|
||||
// {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
|
||||
// what the actual value is when it fails, and similarly for the
|
||||
// other comparisons.
|
||||
//
|
||||
// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
|
||||
// evaluate their arguments, which is undefined.
|
||||
//
|
||||
// 5. These macros evaluate their arguments exactly once.
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// EXPECT_NE(5, Foo());
|
||||
// EXPECT_EQ(NULL, a_pointer);
|
||||
// ASSERT_LT(i, array_size);
|
||||
// ASSERT_GT(records.size(), 0) << "There is no record left.";
|
||||
|
||||
#define EXPECT_EQ(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal:: \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL(expected)>::Compare, \
|
||||
expected, actual)
|
||||
#define EXPECT_NE(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
|
||||
#define EXPECT_LE(val1, val2) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
|
||||
#define EXPECT_LT(val1, val2) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
|
||||
#define EXPECT_GE(val1, val2) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
|
||||
#define EXPECT_GT(val1, val2) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
|
||||
|
||||
#define ASSERT_EQ(expected, actual) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal:: \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL(expected)>::Compare, \
|
||||
expected, actual)
|
||||
#define ASSERT_NE(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
|
||||
#define ASSERT_LE(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
|
||||
#define ASSERT_LT(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
|
||||
#define ASSERT_GE(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
|
||||
#define ASSERT_GT(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
|
||||
|
||||
// C String Comparisons. All tests treat NULL and any non-NULL string
|
||||
// as different. Two NULLs are equal.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
|
||||
// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
|
||||
// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
|
||||
// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
|
||||
//
|
||||
// For wide or narrow string objects, you can use the
|
||||
// {ASSERT|EXPECT}_??() macros.
|
||||
//
|
||||
// Don't depend on the order in which the arguments are evaluated,
|
||||
// which is undefined.
|
||||
//
|
||||
// These macros evaluate their arguments exactly once.
|
||||
|
||||
#define EXPECT_STREQ(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
|
||||
#define EXPECT_STRNE(s1, s2) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
|
||||
#define EXPECT_STRCASEEQ(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
|
||||
#define EXPECT_STRCASENE(s1, s2)\
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
|
||||
|
||||
#define ASSERT_STREQ(expected, actual) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
|
||||
#define ASSERT_STRNE(s1, s2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
|
||||
#define ASSERT_STRCASEEQ(expected, actual) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
|
||||
#define ASSERT_STRCASENE(s1, s2)\
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
|
||||
|
||||
// Macros for comparing floating-point numbers.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
|
||||
// Tests that two float values are almost equal.
|
||||
// * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
|
||||
// Tests that two double values are almost equal.
|
||||
// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
|
||||
// Tests that v1 and v2 are within the given distance to each other.
|
||||
//
|
||||
// Google Test uses ULP-based comparison to automatically pick a default
|
||||
// error bound that is appropriate for the operands. See the
|
||||
// FloatingPoint template class in gtest-internal.h if you are
|
||||
// interested in the implementation details.
|
||||
|
||||
#define EXPECT_FLOAT_EQ(expected, actual)\
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
|
||||
expected, actual)
|
||||
|
||||
#define EXPECT_DOUBLE_EQ(expected, actual)\
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
|
||||
expected, actual)
|
||||
|
||||
#define ASSERT_FLOAT_EQ(expected, actual)\
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
|
||||
expected, actual)
|
||||
|
||||
#define ASSERT_DOUBLE_EQ(expected, actual)\
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
|
||||
expected, actual)
|
||||
|
||||
#define EXPECT_NEAR(val1, val2, abs_error)\
|
||||
EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
|
||||
val1, val2, abs_error)
|
||||
|
||||
#define ASSERT_NEAR(val1, val2, abs_error)\
|
||||
ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
|
||||
val1, val2, abs_error)
|
||||
|
||||
// These predicate format functions work on floating-point values, and
|
||||
// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
|
||||
//
|
||||
// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
|
||||
|
||||
// Asserts that val1 is less than, or almost equal to, val2. Fails
|
||||
// otherwise. In particular, it fails if either val1 or val2 is NaN.
|
||||
AssertionResult FloatLE(const char* expr1, const char* expr2,
|
||||
float val1, float val2);
|
||||
AssertionResult DoubleLE(const char* expr1, const char* expr2,
|
||||
double val1, double val2);
|
||||
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Macros that test for HRESULT failure and success, these are only useful
|
||||
// on Windows, and rely on Windows SDK macros and APIs to compile.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
|
||||
//
|
||||
// When expr unexpectedly fails or succeeds, Google Test prints the expected result
|
||||
// and the actual result with both a human-readable string representation of
|
||||
// the error, if available, as well as the hex result code.
|
||||
#define EXPECT_HRESULT_SUCCEEDED(expr) \
|
||||
EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
|
||||
|
||||
#define ASSERT_HRESULT_SUCCEEDED(expr) \
|
||||
ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
|
||||
|
||||
#define EXPECT_HRESULT_FAILED(expr) \
|
||||
EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
|
||||
|
||||
#define ASSERT_HRESULT_FAILED(expr) \
|
||||
ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
|
||||
// Causes a trace (including the source file path, the current line
|
||||
// number, and the given message) to be included in every test failure
|
||||
// message generated by code in the current scope. The effect is
|
||||
// undone when the control leaves the current scope.
|
||||
//
|
||||
// The message argument can be anything streamable to std::ostream.
|
||||
//
|
||||
// In the implementation, we include the current line number as part
|
||||
// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
|
||||
// to appear in the same block - as long as they are on different
|
||||
// lines.
|
||||
#define SCOPED_TRACE(message) \
|
||||
::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN(gtest_trace_, __LINE__)(\
|
||||
__FILE__, __LINE__, ::testing::Message() << (message))
|
||||
|
||||
|
||||
// Defines a test.
|
||||
//
|
||||
// The first parameter is the name of the test case, and the second
|
||||
// parameter is the name of the test within the test case.
|
||||
//
|
||||
// The convention is to end the test case name with "Test". For
|
||||
// example, a test case for the Foo class can be named FooTest.
|
||||
//
|
||||
// The user should put his test code between braces after using this
|
||||
// macro. Example:
|
||||
//
|
||||
// TEST(FooTest, InitializesCorrectly) {
|
||||
// Foo foo;
|
||||
// EXPECT_TRUE(foo.StatusIsOK());
|
||||
// }
|
||||
|
||||
#define TEST(test_case_name, test_name)\
|
||||
GTEST_TEST(test_case_name, test_name, ::testing::Test)
|
||||
|
||||
|
||||
// Defines a test that uses a test fixture.
|
||||
//
|
||||
// The first parameter is the name of the test fixture class, which
|
||||
// also doubles as the test case name. The second parameter is the
|
||||
// name of the test within the test case.
|
||||
//
|
||||
// A test fixture class must be declared earlier. The user should put
|
||||
// his test code between braces after using this macro. Example:
|
||||
//
|
||||
// class FooTest : public testing::Test {
|
||||
// protected:
|
||||
// virtual void SetUp() { b_.AddElement(3); }
|
||||
//
|
||||
// Foo a_;
|
||||
// Foo b_;
|
||||
// };
|
||||
//
|
||||
// TEST_F(FooTest, InitializesCorrectly) {
|
||||
// EXPECT_TRUE(a_.StatusIsOK());
|
||||
// }
|
||||
//
|
||||
// TEST_F(FooTest, ReturnsElementCountCorrectly) {
|
||||
// EXPECT_EQ(0, a_.size());
|
||||
// EXPECT_EQ(1, b_.size());
|
||||
// }
|
||||
|
||||
#define TEST_F(test_fixture, test_name)\
|
||||
GTEST_TEST(test_fixture, test_name, test_fixture)
|
||||
|
||||
// Use this macro in main() to run all tests. It returns 0 if all
|
||||
// tests are successful, or 1 otherwise.
|
||||
//
|
||||
// RUN_ALL_TESTS() should be invoked after the command line has been
|
||||
// parsed by InitGoogleTest().
|
||||
|
||||
#define RUN_ALL_TESTS()\
|
||||
(::testing::UnitTest::GetInstance()->Run())
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
@@ -0,0 +1,368 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on 06/22/2008 by command
|
||||
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
|
||||
//
|
||||
// Implements a family of generic predicate assertion macros.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
|
||||
// Makes sure this header is not included before gtest.h.
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
#error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
|
||||
// This header implements a family of generic predicate assertion
|
||||
// macros:
|
||||
//
|
||||
// ASSERT_PRED_FORMAT1(pred_format, v1)
|
||||
// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
|
||||
// ...
|
||||
//
|
||||
// where pred_format is a function or functor that takes n (in the
|
||||
// case of ASSERT_PRED_FORMATn) values and their source expression
|
||||
// text, and returns a testing::AssertionResult. See the definition
|
||||
// of ASSERT_EQ in gtest.h for an example.
|
||||
//
|
||||
// If you don't care about formatting, you can use the more
|
||||
// restrictive version:
|
||||
//
|
||||
// ASSERT_PRED1(pred, v1)
|
||||
// ASSERT_PRED2(pred, v1, v2)
|
||||
// ...
|
||||
//
|
||||
// where pred is an n-ary function or functor that returns bool,
|
||||
// and the values v1, v2, ..., must support the << operator for
|
||||
// streaming to std::ostream.
|
||||
//
|
||||
// We also define the EXPECT_* variations.
|
||||
//
|
||||
// For now we only support predicates whose arity is at most 5.
|
||||
// Please email googletestframework@googlegroups.com if you need
|
||||
// support for higher arities.
|
||||
|
||||
// GTEST_ASSERT is the basic statement to which all of the assertions
|
||||
// in this file reduce. Don't use this in your code.
|
||||
|
||||
#define GTEST_ASSERT(expression, on_failure) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (const ::testing::AssertionResult gtest_ar = (expression)) \
|
||||
; \
|
||||
else \
|
||||
on_failure(gtest_ar.failure_message())
|
||||
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred,
|
||||
typename T1>
|
||||
AssertionResult AssertPred1Helper(const char* pred_text,
|
||||
const char* e1,
|
||||
Pred pred,
|
||||
const T1& v1) {
|
||||
if (pred(v1)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
msg << pred_text << "("
|
||||
<< e1 << ") evaluates to false, where"
|
||||
<< "\n" << e1 << " evaluates to " << v1;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT1(pred_format, v1, on_failure)\
|
||||
GTEST_ASSERT(pred_format(#v1, v1),\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED1(pred, v1, on_failure)\
|
||||
GTEST_ASSERT(::testing::AssertPred1Helper(#pred, \
|
||||
#v1, \
|
||||
pred, \
|
||||
v1), on_failure)
|
||||
|
||||
// Unary predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT1(pred_format, v1) \
|
||||
GTEST_PRED_FORMAT1(pred_format, v1, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED1(pred, v1) \
|
||||
GTEST_PRED1(pred, v1, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT1(pred_format, v1) \
|
||||
GTEST_PRED_FORMAT1(pred_format, v1, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED1(pred, v1) \
|
||||
GTEST_PRED1(pred, v1, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred,
|
||||
typename T1,
|
||||
typename T2>
|
||||
AssertionResult AssertPred2Helper(const char* pred_text,
|
||||
const char* e1,
|
||||
const char* e2,
|
||||
Pred pred,
|
||||
const T1& v1,
|
||||
const T2& v2) {
|
||||
if (pred(v1, v2)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
msg << pred_text << "("
|
||||
<< e1 << ", "
|
||||
<< e2 << ") evaluates to false, where"
|
||||
<< "\n" << e1 << " evaluates to " << v1
|
||||
<< "\n" << e2 << " evaluates to " << v2;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT2(pred_format, v1, v2, on_failure)\
|
||||
GTEST_ASSERT(pred_format(#v1, #v2, v1, v2),\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED2(pred, v1, v2, on_failure)\
|
||||
GTEST_ASSERT(::testing::AssertPred2Helper(#pred, \
|
||||
#v1, \
|
||||
#v2, \
|
||||
pred, \
|
||||
v1, \
|
||||
v2), on_failure)
|
||||
|
||||
// Binary predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
|
||||
GTEST_PRED_FORMAT2(pred_format, v1, v2, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED2(pred, v1, v2) \
|
||||
GTEST_PRED2(pred, v1, v2, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
|
||||
GTEST_PRED_FORMAT2(pred_format, v1, v2, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED2(pred, v1, v2) \
|
||||
GTEST_PRED2(pred, v1, v2, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred,
|
||||
typename T1,
|
||||
typename T2,
|
||||
typename T3>
|
||||
AssertionResult AssertPred3Helper(const char* pred_text,
|
||||
const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
Pred pred,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3) {
|
||||
if (pred(v1, v2, v3)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
msg << pred_text << "("
|
||||
<< e1 << ", "
|
||||
<< e2 << ", "
|
||||
<< e3 << ") evaluates to false, where"
|
||||
<< "\n" << e1 << " evaluates to " << v1
|
||||
<< "\n" << e2 << " evaluates to " << v2
|
||||
<< "\n" << e3 << " evaluates to " << v3;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT3(pred_format, v1, v2, v3, on_failure)\
|
||||
GTEST_ASSERT(pred_format(#v1, #v2, #v3, v1, v2, v3),\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED3(pred, v1, v2, v3, on_failure)\
|
||||
GTEST_ASSERT(::testing::AssertPred3Helper(#pred, \
|
||||
#v1, \
|
||||
#v2, \
|
||||
#v3, \
|
||||
pred, \
|
||||
v1, \
|
||||
v2, \
|
||||
v3), on_failure)
|
||||
|
||||
// Ternary predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
|
||||
GTEST_PRED_FORMAT3(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED3(pred, v1, v2, v3) \
|
||||
GTEST_PRED3(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
|
||||
GTEST_PRED_FORMAT3(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED3(pred, v1, v2, v3) \
|
||||
GTEST_PRED3(pred, v1, v2, v3, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred,
|
||||
typename T1,
|
||||
typename T2,
|
||||
typename T3,
|
||||
typename T4>
|
||||
AssertionResult AssertPred4Helper(const char* pred_text,
|
||||
const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
Pred pred,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4) {
|
||||
if (pred(v1, v2, v3, v4)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
msg << pred_text << "("
|
||||
<< e1 << ", "
|
||||
<< e2 << ", "
|
||||
<< e3 << ", "
|
||||
<< e4 << ") evaluates to false, where"
|
||||
<< "\n" << e1 << " evaluates to " << v1
|
||||
<< "\n" << e2 << " evaluates to " << v2
|
||||
<< "\n" << e3 << " evaluates to " << v3
|
||||
<< "\n" << e4 << " evaluates to " << v4;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT4(pred_format, v1, v2, v3, v4, on_failure)\
|
||||
GTEST_ASSERT(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED4(pred, v1, v2, v3, v4, on_failure)\
|
||||
GTEST_ASSERT(::testing::AssertPred4Helper(#pred, \
|
||||
#v1, \
|
||||
#v2, \
|
||||
#v3, \
|
||||
#v4, \
|
||||
pred, \
|
||||
v1, \
|
||||
v2, \
|
||||
v3, \
|
||||
v4), on_failure)
|
||||
|
||||
// 4-ary predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
|
||||
GTEST_PRED_FORMAT4(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
|
||||
GTEST_PRED4(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
|
||||
GTEST_PRED_FORMAT4(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
|
||||
GTEST_PRED4(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred,
|
||||
typename T1,
|
||||
typename T2,
|
||||
typename T3,
|
||||
typename T4,
|
||||
typename T5>
|
||||
AssertionResult AssertPred5Helper(const char* pred_text,
|
||||
const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const char* e5,
|
||||
Pred pred,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4,
|
||||
const T5& v5) {
|
||||
if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
msg << pred_text << "("
|
||||
<< e1 << ", "
|
||||
<< e2 << ", "
|
||||
<< e3 << ", "
|
||||
<< e4 << ", "
|
||||
<< e5 << ") evaluates to false, where"
|
||||
<< "\n" << e1 << " evaluates to " << v1
|
||||
<< "\n" << e2 << " evaluates to " << v2
|
||||
<< "\n" << e3 << " evaluates to " << v3
|
||||
<< "\n" << e4 << " evaluates to " << v4
|
||||
<< "\n" << e5 << " evaluates to " << v5;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5, on_failure)\
|
||||
GTEST_ASSERT(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED5(pred, v1, v2, v3, v4, v5, on_failure)\
|
||||
GTEST_ASSERT(::testing::AssertPred5Helper(#pred, \
|
||||
#v1, \
|
||||
#v2, \
|
||||
#v3, \
|
||||
#v4, \
|
||||
#v5, \
|
||||
pred, \
|
||||
v1, \
|
||||
v2, \
|
||||
v3, \
|
||||
v4, \
|
||||
v5), on_failure)
|
||||
|
||||
// 5-ary predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
|
||||
GTEST_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
|
||||
GTEST_PRED5(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
|
||||
GTEST_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
|
||||
GTEST_PRED5(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
@@ -0,0 +1,58 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Google C++ Testing Framework definitions useful in production code.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
|
||||
|
||||
// When you need to test the private or protected members of a class,
|
||||
// use the FRIEND_TEST macro to declare your tests as friends of the
|
||||
// class. For example:
|
||||
//
|
||||
// class MyClass {
|
||||
// private:
|
||||
// void MyMethod();
|
||||
// FRIEND_TEST(MyClassTest, MyMethod);
|
||||
// };
|
||||
//
|
||||
// class MyClassTest : public testing::Test {
|
||||
// // ...
|
||||
// };
|
||||
//
|
||||
// TEST_F(MyClassTest, MyMethod) {
|
||||
// // Can call MyClass::MyMethod() here.
|
||||
// }
|
||||
|
||||
#define FRIEND_TEST(test_case_name, test_name)\
|
||||
friend class test_case_name##_##test_name##_Test
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
|
||||
@@ -0,0 +1,201 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file defines internal utilities needed for implementing
|
||||
// death tests. They are subject to change without notice.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
|
||||
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
GTEST_DECLARE_string(internal_run_death_test);
|
||||
|
||||
// Names of the flags (needed for parsing Google Test flags).
|
||||
const char kDeathTestStyleFlag[] = "death_test_style";
|
||||
const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// DeathTest is a class that hides much of the complexity of the
|
||||
// GTEST_DEATH_TEST macro. It is abstract; its static Create method
|
||||
// returns a concrete class that depends on the prevailing death test
|
||||
// style, as defined by the --gtest_death_test_style and/or
|
||||
// --gtest_internal_run_death_test flags.
|
||||
|
||||
// In describing the results of death tests, these terms are used with
|
||||
// the corresponding definitions:
|
||||
//
|
||||
// exit status: The integer exit information in the format specified
|
||||
// by wait(2)
|
||||
// exit code: The integer code passed to exit(3), _exit(2), or
|
||||
// returned from main()
|
||||
class DeathTest {
|
||||
public:
|
||||
// Create returns false if there was an error determining the
|
||||
// appropriate action to take for the current death test; for example,
|
||||
// if the gtest_death_test_style flag is set to an invalid value.
|
||||
// The LastMessage method will return a more detailed message in that
|
||||
// case. Otherwise, the DeathTest pointer pointed to by the "test"
|
||||
// argument is set. If the death test should be skipped, the pointer
|
||||
// is set to NULL; otherwise, it is set to the address of a new concrete
|
||||
// DeathTest object that controls the execution of the current test.
|
||||
static bool Create(const char* statement, const RE* regex,
|
||||
const char* file, int line, DeathTest** test);
|
||||
DeathTest();
|
||||
virtual ~DeathTest() { }
|
||||
|
||||
// A helper class that aborts a death test when it's deleted.
|
||||
class ReturnSentinel {
|
||||
public:
|
||||
explicit ReturnSentinel(DeathTest* test) : test_(test) { }
|
||||
~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
|
||||
private:
|
||||
DeathTest* const test_;
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ReturnSentinel);
|
||||
} GTEST_ATTRIBUTE_UNUSED;
|
||||
|
||||
// An enumeration of possible roles that may be taken when a death
|
||||
// test is encountered. EXECUTE means that the death test logic should
|
||||
// be executed immediately. OVERSEE means that the program should prepare
|
||||
// the appropriate environment for a child process to execute the death
|
||||
// test, then wait for it to complete.
|
||||
enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
|
||||
|
||||
// An enumeration of the two reasons that a test might be aborted.
|
||||
enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_DID_NOT_DIE };
|
||||
|
||||
// Assumes one of the above roles.
|
||||
virtual TestRole AssumeRole() = 0;
|
||||
|
||||
// Waits for the death test to finish and returns its status.
|
||||
virtual int Wait() = 0;
|
||||
|
||||
// Returns true if the death test passed; that is, the test process
|
||||
// exited during the test, its exit status matches a user-supplied
|
||||
// predicate, and its stderr output matches a user-supplied regular
|
||||
// expression.
|
||||
// The user-supplied predicate may be a macro expression rather
|
||||
// than a function pointer or functor, or else Wait and Passed could
|
||||
// be combined.
|
||||
virtual bool Passed(bool exit_status_ok) = 0;
|
||||
|
||||
// Signals that the death test did not die as expected.
|
||||
virtual void Abort(AbortReason reason) = 0;
|
||||
|
||||
// Returns a human-readable outcome message regarding the outcome of
|
||||
// the last death test.
|
||||
static const char* LastMessage();
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(DeathTest);
|
||||
};
|
||||
|
||||
// Factory interface for death tests. May be mocked out for testing.
|
||||
class DeathTestFactory {
|
||||
public:
|
||||
virtual ~DeathTestFactory() { }
|
||||
virtual bool Create(const char* statement, const RE* regex,
|
||||
const char* file, int line, DeathTest** test) = 0;
|
||||
};
|
||||
|
||||
// A concrete DeathTestFactory implementation for normal use.
|
||||
class DefaultDeathTestFactory : public DeathTestFactory {
|
||||
public:
|
||||
virtual bool Create(const char* statement, const RE* regex,
|
||||
const char* file, int line, DeathTest** test);
|
||||
};
|
||||
|
||||
// Returns true if exit_status describes a process that was terminated
|
||||
// by a signal, or exited normally with a nonzero exit code.
|
||||
bool ExitedUnsuccessfully(int exit_status);
|
||||
|
||||
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
|
||||
// ASSERT_EXIT*, and EXPECT_EXIT*.
|
||||
#define GTEST_DEATH_TEST(statement, predicate, regex, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (true) { \
|
||||
const ::testing::internal::RE& gtest_regex = (regex); \
|
||||
::testing::internal::DeathTest* gtest_dt; \
|
||||
if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
|
||||
__FILE__, __LINE__, >est_dt)) { \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_, __LINE__); \
|
||||
} \
|
||||
if (gtest_dt != NULL) { \
|
||||
::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
|
||||
gtest_dt_ptr(gtest_dt); \
|
||||
switch (gtest_dt->AssumeRole()) { \
|
||||
case ::testing::internal::DeathTest::OVERSEE_TEST: \
|
||||
if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_, __LINE__); \
|
||||
} \
|
||||
break; \
|
||||
case ::testing::internal::DeathTest::EXECUTE_TEST: { \
|
||||
::testing::internal::DeathTest::ReturnSentinel \
|
||||
gtest_sentinel(gtest_dt); \
|
||||
{ statement; } \
|
||||
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN(gtest_label_, __LINE__): \
|
||||
fail(::testing::internal::DeathTest::LastMessage())
|
||||
// The symbol "fail" here expands to something into which a message
|
||||
// can be streamed.
|
||||
|
||||
// A struct representing the parsed contents of the
|
||||
// --gtest_internal_run_death_test flag, as it existed when
|
||||
// RUN_ALL_TESTS was called.
|
||||
struct InternalRunDeathTestFlag {
|
||||
String file;
|
||||
int line;
|
||||
int index;
|
||||
int status_fd;
|
||||
};
|
||||
|
||||
// Returns a newly created InternalRunDeathTestFlag object with fields
|
||||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
|
||||
// the flag is specified; otherwise returns NULL.
|
||||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
|
||||
@@ -0,0 +1,168 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: keith.ray@gmail.com (Keith Ray)
|
||||
//
|
||||
// Google Test filepath utilities
|
||||
//
|
||||
// This header file declares classes and functions used internally by
|
||||
// Google Test. They are subject to change without notice.
|
||||
//
|
||||
// This file is #included in testing/base/internal/gtest-internal.h
|
||||
// Do not include this header file separately!
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-string.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// FilePath - a class for file and directory pathname manipulation which
|
||||
// handles platform-specific conventions (like the pathname separator).
|
||||
// Used for helper functions for naming files in a directory for xml output.
|
||||
// Except for Set methods, all methods are const or static, which provides an
|
||||
// "immutable value object" -- useful for peace of mind.
|
||||
// A FilePath with a value ending in a path separator ("like/this/") represents
|
||||
// a directory, otherwise it is assumed to represent a file. In either case,
|
||||
// it may or may not represent an actual file or directory in the file system.
|
||||
// Names are NOT checked for syntax correctness -- no checking for illegal
|
||||
// characters, malformed paths, etc.
|
||||
|
||||
class FilePath {
|
||||
public:
|
||||
FilePath() : pathname_("") { }
|
||||
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
|
||||
explicit FilePath(const char* pathname) : pathname_(pathname) { }
|
||||
explicit FilePath(const String& pathname) : pathname_(pathname) { }
|
||||
|
||||
void Set(const FilePath& rhs) {
|
||||
pathname_ = rhs.pathname_;
|
||||
}
|
||||
|
||||
String ToString() const { return pathname_; }
|
||||
const char* c_str() const { return pathname_.c_str(); }
|
||||
|
||||
// Given directory = "dir", base_name = "test", number = 0,
|
||||
// extension = "xml", returns "dir/test.xml". If number is greater
|
||||
// than zero (e.g., 12), returns "dir/test_12.xml".
|
||||
// On Windows platform, uses \ as the separator rather than /.
|
||||
static FilePath MakeFileName(const FilePath& directory,
|
||||
const FilePath& base_name,
|
||||
int number,
|
||||
const char* extension);
|
||||
|
||||
// Returns a pathname for a file that does not currently exist. The pathname
|
||||
// will be directory/base_name.extension or
|
||||
// directory/base_name_<number>.extension if directory/base_name.extension
|
||||
// already exists. The number will be incremented until a pathname is found
|
||||
// that does not already exist.
|
||||
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
|
||||
// There could be a race condition if two or more processes are calling this
|
||||
// function at the same time -- they could both pick the same filename.
|
||||
static FilePath GenerateUniqueFileName(const FilePath& directory,
|
||||
const FilePath& base_name,
|
||||
const char* extension);
|
||||
|
||||
// If input name has a trailing separator character, removes it and returns
|
||||
// the name, otherwise return the name string unmodified.
|
||||
// On Windows platform, uses \ as the separator, other platforms use /.
|
||||
FilePath RemoveTrailingPathSeparator() const;
|
||||
|
||||
// Returns a copy of the FilePath with the directory part removed.
|
||||
// Example: FilePath("path/to/file").RemoveDirectoryName() returns
|
||||
// FilePath("file"). If there is no directory part ("just_a_file"), it returns
|
||||
// the FilePath unmodified. If there is no file part ("just_a_dir/") it
|
||||
// returns an empty FilePath ("").
|
||||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
||||
FilePath RemoveDirectoryName() const;
|
||||
|
||||
// RemoveFileName returns the directory path with the filename removed.
|
||||
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
|
||||
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
|
||||
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
|
||||
// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
|
||||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
||||
FilePath RemoveFileName() const;
|
||||
|
||||
// Returns a copy of the FilePath with the case-insensitive extension removed.
|
||||
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
|
||||
// FilePath("dir/file"). If a case-insensitive extension is not
|
||||
// found, returns a copy of the original FilePath.
|
||||
FilePath RemoveExtension(const char* extension) const;
|
||||
|
||||
// Creates directories so that path exists. Returns true if successful or if
|
||||
// the directories already exist; returns false if unable to create
|
||||
// directories for any reason. Will also return false if the FilePath does
|
||||
// not represent a directory (that is, it doesn't end with a path separator).
|
||||
bool CreateDirectoriesRecursively() const;
|
||||
|
||||
// Create the directory so that path exists. Returns true if successful or
|
||||
// if the directory already exists; returns false if unable to create the
|
||||
// directory for any reason, including if the parent directory does not
|
||||
// exist. Not named "CreateDirectory" because that's a macro on Windows.
|
||||
bool CreateFolder() const;
|
||||
|
||||
// Returns true if FilePath describes something in the file-system,
|
||||
// either a file, directory, or whatever, and that something exists.
|
||||
bool FileOrDirectoryExists() const;
|
||||
|
||||
// Returns true if pathname describes a directory in the file-system
|
||||
// that exists.
|
||||
bool DirectoryExists() const;
|
||||
|
||||
// Returns true if FilePath ends with a path separator, which indicates that
|
||||
// it is intended to represent a directory. Returns false otherwise.
|
||||
// This does NOT check that a directory (or file) actually exists.
|
||||
bool IsDirectory() const;
|
||||
|
||||
private:
|
||||
String pathname_;
|
||||
|
||||
// Don't implement operator= because it is banned by the style guide.
|
||||
FilePath& operator=(const FilePath& rhs);
|
||||
}; // class FilePath
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
||||
@@ -0,0 +1,569 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file declares functions and macros used internally by
|
||||
// Google Test. They are subject to change without notice.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-port.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
#include <iomanip> // NOLINT
|
||||
#include <limits> // NOLINT
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-string.h" // NOLINT
|
||||
#include "gtest-filepath.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
#include <gtest/internal/gtest-filepath.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
// Due to C++ preprocessor weirdness, we need double indirection to
|
||||
// concatenate two tokens when one of them is __LINE__. Writing
|
||||
//
|
||||
// foo ## __LINE__
|
||||
//
|
||||
// will result in the token foo__LINE__, instead of foo followed by
|
||||
// the current line number. For more details, see
|
||||
// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
|
||||
#define GTEST_CONCAT_TOKEN(foo, bar) GTEST_CONCAT_TOKEN_IMPL(foo, bar)
|
||||
#define GTEST_CONCAT_TOKEN_IMPL(foo, bar) foo ## bar
|
||||
|
||||
// Google Test defines the testing::Message class to allow construction of
|
||||
// test messages via the << operator. The idea is that anything
|
||||
// streamable to std::ostream can be streamed to a testing::Message.
|
||||
// This allows a user to use his own types in Google Test assertions by
|
||||
// overloading the << operator.
|
||||
//
|
||||
// util/gtl/stl_logging-inl.h overloads << for STL containers. These
|
||||
// overloads cannot be defined in the std namespace, as that will be
|
||||
// undefined behavior. Therefore, they are defined in the global
|
||||
// namespace instead.
|
||||
//
|
||||
// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
|
||||
// overloads are visible in either the std namespace or the global
|
||||
// namespace, but not other namespaces, including the testing
|
||||
// namespace which Google Test's Message class is in.
|
||||
//
|
||||
// To allow STL containers (and other types that has a << operator
|
||||
// defined in the global namespace) to be used in Google Test assertions,
|
||||
// testing::Message must access the custom << operator from the global
|
||||
// namespace. Hence this helper function.
|
||||
//
|
||||
// Note: Jeffrey Yasskin suggested an alternative fix by "using
|
||||
// ::operator<<;" in the definition of Message's operator<<. That fix
|
||||
// doesn't require a helper function, but unfortunately doesn't
|
||||
// compile with MSVC.
|
||||
template <typename T>
|
||||
inline void GTestStreamToHelper(std::ostream* os, const T& val) {
|
||||
*os << val;
|
||||
}
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Forward declaration of classes.
|
||||
|
||||
class Message; // Represents a failure message.
|
||||
class TestCase; // A collection of related tests.
|
||||
class TestPartResult; // Result of a test part.
|
||||
class TestInfo; // Information about a test.
|
||||
class UnitTest; // A collection of test cases.
|
||||
class UnitTestEventListenerInterface; // Listens to Google Test events.
|
||||
class AssertionResult; // Result of an assertion.
|
||||
|
||||
namespace internal {
|
||||
|
||||
struct TraceInfo; // Information about a trace point.
|
||||
class ScopedTrace; // Implements scoped trace.
|
||||
class TestInfoImpl; // Opaque implementation of TestInfo
|
||||
class TestResult; // Result of a single Test.
|
||||
class UnitTestImpl; // Opaque implementation of UnitTest
|
||||
|
||||
template <typename E> class List; // A generic list.
|
||||
template <typename E> class ListNode; // A node in a generic list.
|
||||
|
||||
// A secret type that Google Test users don't know about. It has no
|
||||
// definition on purpose. Therefore it's impossible to create a
|
||||
// Secret object, which is what we want.
|
||||
class Secret;
|
||||
|
||||
// Two overloaded helpers for checking at compile time whether an
|
||||
// expression is a null pointer literal (i.e. NULL or any 0-valued
|
||||
// compile-time integral constant). Their return values have
|
||||
// different sizes, so we can use sizeof() to test which version is
|
||||
// picked by the compiler. These helpers have no implementations, as
|
||||
// we only need their signatures.
|
||||
//
|
||||
// Given IsNullLiteralHelper(x), the compiler will pick the first
|
||||
// version if x can be implicitly converted to Secret*, and pick the
|
||||
// second version otherwise. Since Secret is a secret and incomplete
|
||||
// type, the only expression a user can write that has type Secret* is
|
||||
// a null pointer literal. Therefore, we know that x is a null
|
||||
// pointer literal if and only if the first version is picked by the
|
||||
// compiler.
|
||||
char IsNullLiteralHelper(Secret* p);
|
||||
char (&IsNullLiteralHelper(...))[2]; // NOLINT
|
||||
|
||||
// A compile-time bool constant that is true if and only if x is a
|
||||
// null pointer literal (i.e. NULL or any 0-valued compile-time
|
||||
// integral constant).
|
||||
#ifdef __SYMBIAN32__ // Symbian
|
||||
// Passing non-POD classes through ellipsis (...) crashes the ARM compiler.
|
||||
// The Nokia Symbian compiler tries to instantiate a copy constructor for
|
||||
// objects passed through ellipsis (...), failing for uncopyable objects.
|
||||
// Hence we define this to false (and lose support for NULL detection).
|
||||
#define GTEST_IS_NULL_LITERAL(x) false
|
||||
#else // ! __SYMBIAN32__
|
||||
#define GTEST_IS_NULL_LITERAL(x) \
|
||||
(sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Appends the user-supplied message to the Google-Test-generated message.
|
||||
String AppendUserMessage(const String& gtest_msg,
|
||||
const Message& user_msg);
|
||||
|
||||
// A helper class for creating scoped traces in user programs.
|
||||
class ScopedTrace {
|
||||
public:
|
||||
// The c'tor pushes the given source file location and message onto
|
||||
// a trace stack maintained by Google Test.
|
||||
ScopedTrace(const char* file, int line, const Message& message);
|
||||
|
||||
// The d'tor pops the info pushed by the c'tor.
|
||||
//
|
||||
// Note that the d'tor is not virtual in order to be efficient.
|
||||
// Don't inherit from ScopedTrace!
|
||||
~ScopedTrace();
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedTrace);
|
||||
} GTEST_ATTRIBUTE_UNUSED; // A ScopedTrace object does its job in its
|
||||
// c'tor and d'tor. Therefore it doesn't
|
||||
// need to be used otherwise.
|
||||
|
||||
// Converts a streamable value to a String. A NULL pointer is
|
||||
// converted to "(null)". When the input value is a ::string,
|
||||
// ::std::string, ::wstring, or ::std::wstring object, each NUL
|
||||
// character in it is replaced with "\\0".
|
||||
// Declared here but defined in gtest.h, so that it has access
|
||||
// to the definition of the Message class, required by the ARM
|
||||
// compiler.
|
||||
template <typename T>
|
||||
String StreamableToString(const T& streamable);
|
||||
|
||||
// Formats a value to be used in a failure message.
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
|
||||
// These are needed as the Nokia Symbian Compiler cannot decide between
|
||||
// const T& and const T* in a function template. The Nokia compiler _can_
|
||||
// decide between class template specializations for T and T*, so a
|
||||
// tr1::type_traits-like is_pointer works, and we can overload on that.
|
||||
|
||||
// This overload makes sure that all pointers (including
|
||||
// those to char or wchar_t) are printed as raw pointers.
|
||||
template <typename T>
|
||||
inline String FormatValueForFailureMessage(internal::true_type dummy,
|
||||
T* pointer) {
|
||||
return StreamableToString(static_cast<const void*>(pointer));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline String FormatValueForFailureMessage(internal::false_type dummy,
|
||||
const T& value) {
|
||||
return StreamableToString(value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline String FormatForFailureMessage(const T& value) {
|
||||
return FormatValueForFailureMessage(
|
||||
typename internal::is_pointer<T>::type(), value);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <typename T>
|
||||
inline String FormatForFailureMessage(const T& value) {
|
||||
return StreamableToString(value);
|
||||
}
|
||||
|
||||
// This overload makes sure that all pointers (including
|
||||
// those to char or wchar_t) are printed as raw pointers.
|
||||
template <typename T>
|
||||
inline String FormatForFailureMessage(T* pointer) {
|
||||
return StreamableToString(static_cast<const void*>(pointer));
|
||||
}
|
||||
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// These overloaded versions handle narrow and wide characters.
|
||||
String FormatForFailureMessage(char ch);
|
||||
String FormatForFailureMessage(wchar_t wchar);
|
||||
|
||||
// When this operand is a const char* or char*, and the other operand
|
||||
// is a ::std::string or ::string, we print this operand as a C string
|
||||
// rather than a pointer. We do the same for wide strings.
|
||||
|
||||
// This internal macro is used to avoid duplicated code.
|
||||
#define GTEST_FORMAT_IMPL(operand2_type, operand1_printer)\
|
||||
inline String FormatForComparisonFailureMessage(\
|
||||
operand2_type::value_type* str, const operand2_type& operand2) {\
|
||||
return operand1_printer(str);\
|
||||
}\
|
||||
inline String FormatForComparisonFailureMessage(\
|
||||
const operand2_type::value_type* str, const operand2_type& operand2) {\
|
||||
return operand1_printer(str);\
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
GTEST_FORMAT_IMPL(::std::string, String::ShowCStringQuoted)
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
GTEST_FORMAT_IMPL(::std::wstring, String::ShowWideCStringQuoted)
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
GTEST_FORMAT_IMPL(::string, String::ShowCStringQuoted)
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
GTEST_FORMAT_IMPL(::wstring, String::ShowWideCStringQuoted)
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
#undef GTEST_FORMAT_IMPL
|
||||
|
||||
// Constructs and returns the message for an equality assertion
|
||||
// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
|
||||
//
|
||||
// The first four parameters are the expressions used in the assertion
|
||||
// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
|
||||
// where foo is 5 and bar is 6, we have:
|
||||
//
|
||||
// expected_expression: "foo"
|
||||
// actual_expression: "bar"
|
||||
// expected_value: "5"
|
||||
// actual_value: "6"
|
||||
//
|
||||
// The ignoring_case parameter is true iff the assertion is a
|
||||
// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
|
||||
// be inserted into the message.
|
||||
AssertionResult EqFailure(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const String& expected_value,
|
||||
const String& actual_value,
|
||||
bool ignoring_case);
|
||||
|
||||
|
||||
// This template class represents an IEEE floating-point number
|
||||
// (either single-precision or double-precision, depending on the
|
||||
// template parameters).
|
||||
//
|
||||
// The purpose of this class is to do more sophisticated number
|
||||
// comparison. (Due to round-off error, etc, it's very unlikely that
|
||||
// two floating-points will be equal exactly. Hence a naive
|
||||
// comparison by the == operation often doesn't work.)
|
||||
//
|
||||
// Format of IEEE floating-point:
|
||||
//
|
||||
// The most-significant bit being the leftmost, an IEEE
|
||||
// floating-point looks like
|
||||
//
|
||||
// sign_bit exponent_bits fraction_bits
|
||||
//
|
||||
// Here, sign_bit is a single bit that designates the sign of the
|
||||
// number.
|
||||
//
|
||||
// For float, there are 8 exponent bits and 23 fraction bits.
|
||||
//
|
||||
// For double, there are 11 exponent bits and 52 fraction bits.
|
||||
//
|
||||
// More details can be found at
|
||||
// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
|
||||
//
|
||||
// Template parameter:
|
||||
//
|
||||
// RawType: the raw floating-point type (either float or double)
|
||||
template <typename RawType>
|
||||
class FloatingPoint {
|
||||
public:
|
||||
// Defines the unsigned integer type that has the same size as the
|
||||
// floating point number.
|
||||
typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
|
||||
|
||||
// Constants.
|
||||
|
||||
// # of bits in a number.
|
||||
static const size_t kBitCount = 8*sizeof(RawType);
|
||||
|
||||
// # of fraction bits in a number.
|
||||
static const size_t kFractionBitCount =
|
||||
std::numeric_limits<RawType>::digits - 1;
|
||||
|
||||
// # of exponent bits in a number.
|
||||
static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
|
||||
|
||||
// The mask for the sign bit.
|
||||
static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
|
||||
|
||||
// The mask for the fraction bits.
|
||||
static const Bits kFractionBitMask =
|
||||
~static_cast<Bits>(0) >> (kExponentBitCount + 1);
|
||||
|
||||
// The mask for the exponent bits.
|
||||
static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
|
||||
|
||||
// How many ULP's (Units in the Last Place) we want to tolerate when
|
||||
// comparing two numbers. The larger the value, the more error we
|
||||
// allow. A 0 value means that two numbers must be exactly the same
|
||||
// to be considered equal.
|
||||
//
|
||||
// The maximum error of a single floating-point operation is 0.5
|
||||
// units in the last place. On Intel CPU's, all floating-point
|
||||
// calculations are done with 80-bit precision, while double has 64
|
||||
// bits. Therefore, 4 should be enough for ordinary use.
|
||||
//
|
||||
// See the following article for more details on ULP:
|
||||
// http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
|
||||
static const size_t kMaxUlps = 4;
|
||||
|
||||
// Constructs a FloatingPoint from a raw floating-point number.
|
||||
//
|
||||
// On an Intel CPU, passing a non-normalized NAN (Not a Number)
|
||||
// around may change its bits, although the new value is guaranteed
|
||||
// to be also a NAN. Therefore, don't expect this constructor to
|
||||
// preserve the bits in x when x is a NAN.
|
||||
explicit FloatingPoint(const RawType& x) : value_(x) {}
|
||||
|
||||
// Static methods
|
||||
|
||||
// Reinterprets a bit pattern as a floating-point number.
|
||||
//
|
||||
// This function is needed to test the AlmostEquals() method.
|
||||
static RawType ReinterpretBits(const Bits bits) {
|
||||
FloatingPoint fp(0);
|
||||
fp.bits_ = bits;
|
||||
return fp.value_;
|
||||
}
|
||||
|
||||
// Returns the floating-point number that represent positive infinity.
|
||||
static RawType Infinity() {
|
||||
return ReinterpretBits(kExponentBitMask);
|
||||
}
|
||||
|
||||
// Non-static methods
|
||||
|
||||
// Returns the bits that represents this number.
|
||||
const Bits &bits() const { return bits_; }
|
||||
|
||||
// Returns the exponent bits of this number.
|
||||
Bits exponent_bits() const { return kExponentBitMask & bits_; }
|
||||
|
||||
// Returns the fraction bits of this number.
|
||||
Bits fraction_bits() const { return kFractionBitMask & bits_; }
|
||||
|
||||
// Returns the sign bit of this number.
|
||||
Bits sign_bit() const { return kSignBitMask & bits_; }
|
||||
|
||||
// Returns true iff this is NAN (not a number).
|
||||
bool is_nan() const {
|
||||
// It's a NAN if the exponent bits are all ones and the fraction
|
||||
// bits are not entirely zeros.
|
||||
return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
|
||||
}
|
||||
|
||||
// Returns true iff this number is at most kMaxUlps ULP's away from
|
||||
// rhs. In particular, this function:
|
||||
//
|
||||
// - returns false if either number is (or both are) NAN.
|
||||
// - treats really large numbers as almost equal to infinity.
|
||||
// - thinks +0.0 and -0.0 are 0 DLP's apart.
|
||||
bool AlmostEquals(const FloatingPoint& rhs) const {
|
||||
// The IEEE standard says that any comparison operation involving
|
||||
// a NAN must return false.
|
||||
if (is_nan() || rhs.is_nan()) return false;
|
||||
|
||||
return DistanceBetweenSignAndMagnitudeNumbers(bits_, rhs.bits_) <= kMaxUlps;
|
||||
}
|
||||
|
||||
private:
|
||||
// Converts an integer from the sign-and-magnitude representation to
|
||||
// the biased representation. More precisely, let N be 2 to the
|
||||
// power of (kBitCount - 1), an integer x is represented by the
|
||||
// unsigned number x + N.
|
||||
//
|
||||
// For instance,
|
||||
//
|
||||
// -N + 1 (the most negative number representable using
|
||||
// sign-and-magnitude) is represented by 1;
|
||||
// 0 is represented by N; and
|
||||
// N - 1 (the biggest number representable using
|
||||
// sign-and-magnitude) is represented by 2N - 1.
|
||||
//
|
||||
// Read http://en.wikipedia.org/wiki/Signed_number_representations
|
||||
// for more details on signed number representations.
|
||||
static Bits SignAndMagnitudeToBiased(const Bits &sam) {
|
||||
if (kSignBitMask & sam) {
|
||||
// sam represents a negative number.
|
||||
return ~sam + 1;
|
||||
} else {
|
||||
// sam represents a positive number.
|
||||
return kSignBitMask | sam;
|
||||
}
|
||||
}
|
||||
|
||||
// Given two numbers in the sign-and-magnitude representation,
|
||||
// returns the distance between them as an unsigned number.
|
||||
static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
|
||||
const Bits &sam2) {
|
||||
const Bits biased1 = SignAndMagnitudeToBiased(sam1);
|
||||
const Bits biased2 = SignAndMagnitudeToBiased(sam2);
|
||||
return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
|
||||
}
|
||||
|
||||
union {
|
||||
RawType value_; // The raw floating-point number.
|
||||
Bits bits_; // The bits that represent the number.
|
||||
};
|
||||
};
|
||||
|
||||
// Typedefs the instances of the FloatingPoint template class that we
|
||||
// care to use.
|
||||
typedef FloatingPoint<float> Float;
|
||||
typedef FloatingPoint<double> Double;
|
||||
|
||||
// In order to catch the mistake of putting tests that use different
|
||||
// test fixture classes in the same test case, we need to assign
|
||||
// unique IDs to fixture classes and compare them. The TypeId type is
|
||||
// used to hold such IDs. The user should treat TypeId as an opaque
|
||||
// type: the only operation allowed on TypeId values is to compare
|
||||
// them for equality using the == operator.
|
||||
typedef void* TypeId;
|
||||
|
||||
// GetTypeId<T>() returns the ID of type T. Different values will be
|
||||
// returned for different types. Calling the function twice with the
|
||||
// same type argument is guaranteed to return the same ID.
|
||||
template <typename T>
|
||||
inline TypeId GetTypeId() {
|
||||
static bool dummy = false;
|
||||
// The compiler is required to create an instance of the static
|
||||
// variable dummy for each T used to instantiate the template.
|
||||
// Therefore, the address of dummy is guaranteed to be unique.
|
||||
return &dummy;
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Predicate-formatters for implementing the HRESULT checking macros
|
||||
// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
|
||||
// We pass a long instead of HRESULT to avoid causing an
|
||||
// include dependency for the HRESULT type.
|
||||
AssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT
|
||||
AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#define GTEST_MESSAGE(message, result_type) \
|
||||
::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \
|
||||
= ::testing::Message()
|
||||
|
||||
#define GTEST_FATAL_FAILURE(message) \
|
||||
return GTEST_MESSAGE(message, ::testing::TPRT_FATAL_FAILURE)
|
||||
|
||||
#define GTEST_NONFATAL_FAILURE(message) \
|
||||
GTEST_MESSAGE(message, ::testing::TPRT_NONFATAL_FAILURE)
|
||||
|
||||
#define GTEST_SUCCESS(message) \
|
||||
GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS)
|
||||
|
||||
#define GTEST_TEST_BOOLEAN(boolexpr, booltext, actual, expected, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (boolexpr) \
|
||||
; \
|
||||
else \
|
||||
fail("Value of: " booltext "\n Actual: " #actual "\nExpected: " #expected)
|
||||
|
||||
// Helper macro for defining tests.
|
||||
#define GTEST_TEST(test_case_name, test_name, parent_class)\
|
||||
class test_case_name##_##test_name##_Test : public parent_class {\
|
||||
public:\
|
||||
test_case_name##_##test_name##_Test() {}\
|
||||
static ::testing::Test* NewTest() {\
|
||||
return new test_case_name##_##test_name##_Test;\
|
||||
}\
|
||||
private:\
|
||||
virtual void TestBody();\
|
||||
static ::testing::TestInfo* const test_info_;\
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(test_case_name##_##test_name##_Test);\
|
||||
};\
|
||||
\
|
||||
::testing::TestInfo* const test_case_name##_##test_name##_Test::test_info_ =\
|
||||
::testing::TestInfo::MakeAndRegisterInstance(\
|
||||
#test_case_name, \
|
||||
#test_name, \
|
||||
::testing::internal::GetTypeId< parent_class >(), \
|
||||
parent_class::SetUpTestCase, \
|
||||
parent_class::TearDownTestCase, \
|
||||
test_case_name##_##test_name##_Test::NewTest);\
|
||||
void test_case_name##_##test_name##_Test::TestBody()
|
||||
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
||||
@@ -0,0 +1,618 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Low-level types and utilities for porting Google Test to various
|
||||
// platforms. They are subject to change without notice. DO NOT USE
|
||||
// THEM IN USER CODE.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
|
||||
|
||||
// The user can define the following macros in the build script to
|
||||
// control Google Test's behavior:
|
||||
//
|
||||
// GTEST_HAS_STD_STRING - Define it to 1/0 to indicate that
|
||||
// std::string does/doesn't work (Google Test can
|
||||
// be used where std::string is unavailable).
|
||||
// Leave it undefined to let Google Test define it.
|
||||
// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
|
||||
// is/isn't available (some systems define
|
||||
// ::string, which is different to std::string).
|
||||
// Leave it undefined to let Google Test define it.
|
||||
// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
|
||||
// std::wstring does/doesn't work (Google Test can
|
||||
// be used where std::wstring is unavailable).
|
||||
// Leave it undefined to let Google Test define it.
|
||||
// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
|
||||
// is/isn't available (some systems define
|
||||
// ::wstring, which is different to std::wstring).
|
||||
// Leave it undefined to let Google Test define it.
|
||||
|
||||
// This header defines the following utilities:
|
||||
//
|
||||
// Macros indicating the name of the Google C++ Testing Framework project:
|
||||
// GTEST_NAME - a string literal of the project name.
|
||||
// GTEST_FLAG_PREFIX - a string literal of the prefix all Google
|
||||
// Test flag names share.
|
||||
// GTEST_FLAG_PREFIX_UPPER - a string literal of the prefix all Google
|
||||
// Test flag names share, in upper case.
|
||||
//
|
||||
// Macros indicating the current platform:
|
||||
// GTEST_OS_LINUX - defined iff compiled on Linux.
|
||||
// GTEST_OS_MAC - defined iff compiled on Mac OS X.
|
||||
// GTEST_OS_WINDOWS - defined iff compiled on Windows.
|
||||
// Note that it is possible that none of the GTEST_OS_ macros are defined.
|
||||
//
|
||||
// Macros indicating available Google Test features:
|
||||
// GTEST_HAS_DEATH_TEST - defined iff death tests are supported.
|
||||
//
|
||||
// Macros for basic C++ coding:
|
||||
// GTEST_AMBIGUOUS_ELSE_BLOCKER - for disabling a gcc warning.
|
||||
// GTEST_ATTRIBUTE_UNUSED - declares that a class' instances don't have to
|
||||
// be used.
|
||||
// GTEST_DISALLOW_COPY_AND_ASSIGN() - disables copy ctor and operator=.
|
||||
// GTEST_MUST_USE_RESULT - declares that a function's result must be used.
|
||||
//
|
||||
// Synchronization:
|
||||
// Mutex, MutexLock, ThreadLocal, GetThreadCount()
|
||||
// - synchronization primitives.
|
||||
//
|
||||
// Template meta programming:
|
||||
// is_pointer - as in TR1; needed on Symbian only.
|
||||
//
|
||||
// Smart pointers:
|
||||
// scoped_ptr - as in TR2.
|
||||
//
|
||||
// Regular expressions:
|
||||
// RE - a simple regular expression class using the POSIX
|
||||
// Extended Regular Expression syntax. Not available on
|
||||
// Windows.
|
||||
//
|
||||
// Logging:
|
||||
// GTEST_LOG() - logs messages at the specified severity level.
|
||||
// LogToStderr() - directs all log messages to stderr.
|
||||
// FlushInfoLog() - flushes informational log messages.
|
||||
//
|
||||
// Stderr capturing:
|
||||
// CaptureStderr() - starts capturing stderr.
|
||||
// GetCapturedStderr() - stops capturing stderr and returns the captured
|
||||
// string.
|
||||
//
|
||||
// Integer types:
|
||||
// TypeWithSize - maps an integer to a int type.
|
||||
// Int32, UInt32, Int64, UInt64, TimeInMillis
|
||||
// - integers of known sizes.
|
||||
// BiggestInt - the biggest signed integer type.
|
||||
//
|
||||
// Command-line utilities:
|
||||
// GTEST_FLAG() - references a flag.
|
||||
// GTEST_DECLARE_*() - declares a flag.
|
||||
// GTEST_DEFINE_*() - defines a flag.
|
||||
// GetArgvs() - returns the command line as a vector of strings.
|
||||
//
|
||||
// Environment variable utilities:
|
||||
// GetEnv() - gets the value of an environment variable.
|
||||
// BoolFromGTestEnv() - parses a bool environment variable.
|
||||
// Int32FromGTestEnv() - parses an Int32 environment variable.
|
||||
// StringFromGTestEnv() - parses a string environment variable.
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define GTEST_NAME "Google Test"
|
||||
#define GTEST_FLAG_PREFIX "gtest_"
|
||||
#define GTEST_FLAG_PREFIX_UPPER "GTEST_"
|
||||
|
||||
// Determines the platform on which Google Test is compiled.
|
||||
#ifdef _MSC_VER
|
||||
// TODO(kenton@google.com): GTEST_OS_WINDOWS is currently used to mean
|
||||
// both "The OS is Windows" and "The compiler is MSVC". These
|
||||
// meanings really should be separated in order to better support
|
||||
// Windows compilers other than MSVC.
|
||||
#define GTEST_OS_WINDOWS
|
||||
#elif defined __APPLE__
|
||||
#define GTEST_OS_MAC
|
||||
#elif defined __linux__
|
||||
#define GTEST_OS_LINUX
|
||||
#endif // _MSC_VER
|
||||
|
||||
// Determines whether ::std::string and ::string are available.
|
||||
|
||||
#ifndef GTEST_HAS_STD_STRING
|
||||
// The user didn't tell us whether ::std::string is available, so we
|
||||
// need to figure it out.
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Assumes that exceptions are enabled by default.
|
||||
#ifndef _HAS_EXCEPTIONS
|
||||
#define _HAS_EXCEPTIONS 1
|
||||
#endif // _HAS_EXCEPTIONS
|
||||
// GTEST_HAS_EXCEPTIONS is non-zero iff exceptions are enabled. It is
|
||||
// always defined, while _HAS_EXCEPTIONS is defined only on Windows.
|
||||
#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
|
||||
// On Windows, we can use ::std::string if the compiler version is VS
|
||||
// 2005 or above, or if exceptions are enabled.
|
||||
#define GTEST_HAS_STD_STRING ((_MSC_VER >= 1400) || GTEST_HAS_EXCEPTIONS)
|
||||
#else // We are on Linux or Mac OS.
|
||||
#define GTEST_HAS_EXCEPTIONS 0
|
||||
#define GTEST_HAS_STD_STRING 1
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#ifndef GTEST_HAS_GLOBAL_STRING
|
||||
// The user didn't tell us whether ::string is available, so we need
|
||||
// to figure it out.
|
||||
|
||||
#define GTEST_HAS_GLOBAL_STRING 0
|
||||
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
#ifndef GTEST_HAS_STD_WSTRING
|
||||
// The user didn't tell us whether ::std::wstring is available, so we need
|
||||
// to figure it out.
|
||||
// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
|
||||
// is available.
|
||||
|
||||
#ifdef GTEST_OS_CYGWIN
|
||||
// At least some versions of cygwin doesn't support ::std::wstring.
|
||||
#define GTEST_HAS_STD_WSTRING 0
|
||||
#else
|
||||
#define GTEST_HAS_STD_WSTRING GTEST_HAS_STD_STRING
|
||||
#endif // GTEST_OS_CYGWIN
|
||||
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#ifndef GTEST_HAS_GLOBAL_WSTRING
|
||||
// The user didn't tell us whether ::wstring is available, so we need
|
||||
// to figure it out.
|
||||
#define GTEST_HAS_GLOBAL_WSTRING GTEST_HAS_GLOBAL_STRING
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
#if GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || \
|
||||
GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
|
||||
#include <string> // NOLINT
|
||||
#endif // GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING ||
|
||||
// GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
#include <sstream> // NOLINT
|
||||
#else
|
||||
#include <strstream> // NOLINT
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// Determines whether to support death tests.
|
||||
#if GTEST_HAS_STD_STRING && defined(GTEST_OS_LINUX)
|
||||
#define GTEST_HAS_DEATH_TEST
|
||||
// On some platforms, <regex.h> needs someone to define size_t, and
|
||||
// won't compile if being #included first. Therefore it's important
|
||||
// that we #include it after <sys/types.h>.
|
||||
#include <regex.h>
|
||||
#include <vector>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#endif // GTEST_HAS_STD_STRING && defined(GTEST_OS_LINUX)
|
||||
|
||||
// Defines some utility macros.
|
||||
|
||||
// The GNU compiler emits a warning if nested "if" statements are followed by
|
||||
// an "else" statement and braces are not used to explicitly disambiguate the
|
||||
// "else" binding. This leads to problems with code like:
|
||||
//
|
||||
// if (gate)
|
||||
// ASSERT_*(condition) << "Some message";
|
||||
//
|
||||
// The "switch (0) case 0:" idiom is used to suppress this.
|
||||
#ifdef __INTEL_COMPILER
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER
|
||||
#else
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER switch (0) case 0: // NOLINT
|
||||
#endif
|
||||
|
||||
// Use this annotation at the end of a struct / class definition to
|
||||
// prevent the compiler from optimizing away instances that are never
|
||||
// used. This is useful when all interesting logic happens inside the
|
||||
// c'tor and / or d'tor. Example:
|
||||
//
|
||||
// struct Foo {
|
||||
// Foo() { ... }
|
||||
// } GTEST_ATTRIBUTE_UNUSED;
|
||||
#if defined(GTEST_OS_WINDOWS) || (defined(GTEST_OS_LINUX) && defined(SWIG))
|
||||
#define GTEST_ATTRIBUTE_UNUSED
|
||||
#else
|
||||
#define GTEST_ATTRIBUTE_UNUSED __attribute__ ((unused))
|
||||
#endif // GTEST_OS_WINDOWS || (GTEST_OS_LINUX && SWIG)
|
||||
|
||||
// A macro to disallow the evil copy constructor and operator= functions
|
||||
// This should be used in the private: declarations for a class.
|
||||
#define GTEST_DISALLOW_COPY_AND_ASSIGN(type)\
|
||||
type(const type &);\
|
||||
void operator=(const type &)
|
||||
|
||||
// Tell the compiler to warn about unused return values for functions declared
|
||||
// with this macro. The macro should be used on function declarations
|
||||
// following the argument list:
|
||||
//
|
||||
// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT;
|
||||
#if defined(__GNUC__) \
|
||||
&& (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \
|
||||
&& !defined(COMPILER_ICC)
|
||||
#define GTEST_MUST_USE_RESULT __attribute__ ((warn_unused_result))
|
||||
#else
|
||||
#define GTEST_MUST_USE_RESULT
|
||||
#endif // (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
|
||||
namespace testing {
|
||||
|
||||
class Message;
|
||||
|
||||
namespace internal {
|
||||
|
||||
class String;
|
||||
|
||||
// std::strstream is deprecated. However, we have to use it on
|
||||
// Windows as std::stringstream won't compile on Windows when
|
||||
// exceptions are disabled. We use std::stringstream on other
|
||||
// platforms to avoid compiler warnings there.
|
||||
#if GTEST_HAS_STD_STRING
|
||||
typedef ::std::stringstream StrStream;
|
||||
#else
|
||||
typedef ::std::strstream StrStream;
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// Defines scoped_ptr.
|
||||
|
||||
// This implementation of scoped_ptr is PARTIAL - it only contains
|
||||
// enough stuff to satisfy Google Test's need.
|
||||
template <typename T>
|
||||
class scoped_ptr {
|
||||
public:
|
||||
explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
|
||||
~scoped_ptr() { reset(); }
|
||||
|
||||
T& operator*() const { return *ptr_; }
|
||||
T* operator->() const { return ptr_; }
|
||||
T* get() const { return ptr_; }
|
||||
|
||||
T* release() {
|
||||
T* const ptr = ptr_;
|
||||
ptr_ = NULL;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void reset(T* p = NULL) {
|
||||
if (p != ptr_) {
|
||||
if (sizeof(T) > 0) { // Makes sure T is a complete type.
|
||||
delete ptr_;
|
||||
}
|
||||
ptr_ = p;
|
||||
}
|
||||
}
|
||||
private:
|
||||
T* ptr_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(scoped_ptr);
|
||||
};
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines RE. Currently only needed for death tests.
|
||||
|
||||
// A simple C++ wrapper for <regex.h>. It uses the POSIX Enxtended
|
||||
// Regular Expression syntax.
|
||||
class RE {
|
||||
public:
|
||||
// Constructs an RE from a string.
|
||||
#if GTEST_HAS_STD_STRING
|
||||
RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
RE(const char* regex) { Init(regex); } // NOLINT
|
||||
~RE();
|
||||
|
||||
// Returns the string representation of the regex.
|
||||
const char* pattern() const { return pattern_; }
|
||||
|
||||
// Returns true iff str contains regular expression re.
|
||||
|
||||
// TODO(wan): make PartialMatch() work when str contains NUL
|
||||
// characters.
|
||||
#if GTEST_HAS_STD_STRING
|
||||
static bool PartialMatch(const ::std::string& str, const RE& re) {
|
||||
return PartialMatch(str.c_str(), re);
|
||||
}
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
static bool PartialMatch(const ::string& str, const RE& re) {
|
||||
return PartialMatch(str.c_str(), re);
|
||||
}
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
static bool PartialMatch(const char* str, const RE& re);
|
||||
|
||||
private:
|
||||
void Init(const char* regex);
|
||||
|
||||
// We use a const char* instead of a string, as Google Test may be used
|
||||
// where string is not available. We also do not use Google Test's own
|
||||
// String type here, in order to simplify dependencies between the
|
||||
// files.
|
||||
const char* pattern_;
|
||||
regex_t regex_;
|
||||
bool is_valid_;
|
||||
};
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines logging utilities:
|
||||
// GTEST_LOG() - logs messages at the specified severity level.
|
||||
// LogToStderr() - directs all log messages to stderr.
|
||||
// FlushInfoLog() - flushes informational log messages.
|
||||
|
||||
enum GTestLogSeverity {
|
||||
GTEST_INFO,
|
||||
GTEST_WARNING,
|
||||
GTEST_ERROR,
|
||||
GTEST_FATAL
|
||||
};
|
||||
|
||||
void GTestLog(GTestLogSeverity severity, const char* file,
|
||||
int line, const char* msg);
|
||||
|
||||
#define GTEST_LOG(severity, msg)\
|
||||
::testing::internal::GTestLog(\
|
||||
::testing::internal::GTEST_##severity, __FILE__, __LINE__, \
|
||||
(::testing::Message() << (msg)).GetString().c_str())
|
||||
|
||||
inline void LogToStderr() {}
|
||||
inline void FlushInfoLog() { fflush(NULL); }
|
||||
|
||||
// Defines the stderr capturer:
|
||||
// CaptureStderr - starts capturing stderr.
|
||||
// GetCapturedStderr - stops capturing stderr and returns the captured string.
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||
extern ::std::vector<String> g_argvs;
|
||||
|
||||
void CaptureStderr();
|
||||
// GTEST_HAS_DEATH_TEST implies we have ::std::string.
|
||||
::std::string GetCapturedStderr();
|
||||
const ::std::vector<String>& GetArgvs();
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines synchronization primitives.
|
||||
|
||||
// A dummy implementation of synchronization primitives (mutex, lock,
|
||||
// and thread-local variable). Necessary for compiling Google Test where
|
||||
// mutex is not supported - using Google Test in multiple threads is not
|
||||
// supported on such platforms.
|
||||
|
||||
class Mutex {
|
||||
public:
|
||||
Mutex() {}
|
||||
explicit Mutex(int unused) {}
|
||||
void AssertHeld() const {}
|
||||
enum { NO_CONSTRUCTOR_NEEDED_FOR_STATIC_MUTEX = 0 };
|
||||
};
|
||||
|
||||
// We cannot call it MutexLock directly as the ctor declaration would
|
||||
// conflict with a macro named MutexLock, which is defined on some
|
||||
// platforms. Hence the typedef trick below.
|
||||
class GTestMutexLock {
|
||||
public:
|
||||
explicit GTestMutexLock(Mutex*) {} // NOLINT
|
||||
};
|
||||
|
||||
typedef GTestMutexLock MutexLock;
|
||||
|
||||
template <typename T>
|
||||
class ThreadLocal {
|
||||
public:
|
||||
T* pointer() { return &value_; }
|
||||
const T* pointer() const { return &value_; }
|
||||
const T& get() const { return value_; }
|
||||
void set(const T& value) { value_ = value; }
|
||||
private:
|
||||
T value_;
|
||||
};
|
||||
|
||||
// There's no portable way to detect the number of threads, so we just
|
||||
// return 0 to indicate that we cannot detect it.
|
||||
inline size_t GetThreadCount() { return 0; }
|
||||
|
||||
// Defines tr1::is_pointer (only needed for Symbian).
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
|
||||
// Symbian does not have tr1::type_traits, so we define our own is_pointer
|
||||
// These are needed as the Nokia Symbian Compiler cannot decide between
|
||||
// const T& and const T* in a function template.
|
||||
|
||||
template <bool bool_value>
|
||||
struct bool_constant {
|
||||
typedef bool_constant<bool_value> type;
|
||||
static const bool value = bool_value;
|
||||
};
|
||||
template <bool bool_value> const bool bool_constant<bool_value>::value;
|
||||
|
||||
typedef bool_constant<false> false_type;
|
||||
typedef bool_constant<true> true_type;
|
||||
|
||||
template <typename T>
|
||||
struct is_pointer : public false_type {};
|
||||
|
||||
template <typename T>
|
||||
struct is_pointer<T*> : public true_type {};
|
||||
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Defines BiggestInt as the biggest signed integer type the compiler
|
||||
// supports.
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
typedef __int64 BiggestInt;
|
||||
#else
|
||||
typedef long long BiggestInt; // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// The maximum number a BiggestInt can represent. This definition
|
||||
// works no matter BiggestInt is represented in one's complement or
|
||||
// two's complement.
|
||||
//
|
||||
// We cannot rely on numeric_limits in STL, as __int64 and long long
|
||||
// are not part of standard C++ and numeric_limits doesn't need to be
|
||||
// defined for them.
|
||||
const BiggestInt kMaxBiggestInt =
|
||||
~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
|
||||
|
||||
// This template class serves as a compile-time function from size to
|
||||
// type. It maps a size in bytes to a primitive type with that
|
||||
// size. e.g.
|
||||
//
|
||||
// TypeWithSize<4>::UInt
|
||||
//
|
||||
// is typedef-ed to be unsigned int (unsigned integer made up of 4
|
||||
// bytes).
|
||||
//
|
||||
// Such functionality should belong to STL, but I cannot find it
|
||||
// there.
|
||||
//
|
||||
// Google Test uses this class in the implementation of floating-point
|
||||
// comparison.
|
||||
//
|
||||
// For now it only handles UInt (unsigned int) as that's all Google Test
|
||||
// needs. Other types can be easily added in the future if need
|
||||
// arises.
|
||||
template <size_t size>
|
||||
class TypeWithSize {
|
||||
public:
|
||||
// This prevents the user from using TypeWithSize<N> with incorrect
|
||||
// values of N.
|
||||
typedef void UInt;
|
||||
};
|
||||
|
||||
// The specialization for size 4.
|
||||
template <>
|
||||
class TypeWithSize<4> {
|
||||
public:
|
||||
// unsigned int has size 4 in both gcc and MSVC.
|
||||
//
|
||||
// As base/basictypes.h doesn't compile on Windows, we cannot use
|
||||
// uint32, uint64, and etc here.
|
||||
typedef int Int;
|
||||
typedef unsigned int UInt;
|
||||
};
|
||||
|
||||
// The specialization for size 8.
|
||||
template <>
|
||||
class TypeWithSize<8> {
|
||||
public:
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
typedef __int64 Int;
|
||||
typedef unsigned __int64 UInt;
|
||||
#else
|
||||
typedef long long Int; // NOLINT
|
||||
typedef unsigned long long UInt; // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
};
|
||||
|
||||
// Integer types of known sizes.
|
||||
typedef TypeWithSize<4>::Int Int32;
|
||||
typedef TypeWithSize<4>::UInt UInt32;
|
||||
typedef TypeWithSize<8>::Int Int64;
|
||||
typedef TypeWithSize<8>::UInt UInt64;
|
||||
typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
|
||||
|
||||
// Utilities for command line flags and environment variables.
|
||||
|
||||
// A wrapper for getenv() that works on Linux, Windows, and Mac OS.
|
||||
inline const char* GetEnv(const char* name) {
|
||||
#ifdef _WIN32_WCE // We are on Windows CE.
|
||||
// CE has no environment variables.
|
||||
return NULL;
|
||||
#elif defined(GTEST_OS_WINDOWS) // We are on Windows proper.
|
||||
// MSVC 8 deprecates getenv(), so we want to suppress warning 4996
|
||||
// (deprecated function) there.
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
return getenv(name);
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else // We are on Linux or Mac OS.
|
||||
return getenv(name);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Macro for referencing flags.
|
||||
#define GTEST_FLAG(name) FLAGS_gtest_##name
|
||||
|
||||
// Macros for declaring flags.
|
||||
#define GTEST_DECLARE_bool(name) extern bool GTEST_FLAG(name)
|
||||
#define GTEST_DECLARE_int32(name) \
|
||||
extern ::testing::internal::Int32 GTEST_FLAG(name)
|
||||
#define GTEST_DECLARE_string(name) \
|
||||
extern ::testing::internal::String GTEST_FLAG(name)
|
||||
|
||||
// Macros for defining flags.
|
||||
#define GTEST_DEFINE_bool(name, default_val, doc) \
|
||||
bool GTEST_FLAG(name) = (default_val)
|
||||
#define GTEST_DEFINE_int32(name, default_val, doc) \
|
||||
::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
|
||||
#define GTEST_DEFINE_string(name, default_val, doc) \
|
||||
::testing::internal::String GTEST_FLAG(name) = (default_val)
|
||||
|
||||
// Parses 'str' for a 32-bit signed integer. If successful, writes the result
|
||||
// to *value and returns true; otherwise leaves *value unchanged and returns
|
||||
// false.
|
||||
// TODO(chandlerc): Find a better way to refactor flag and environment parsing
|
||||
// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
|
||||
// function.
|
||||
bool ParseInt32(const Message& src_text, const char* str, Int32* value);
|
||||
|
||||
// Parses a bool/Int32/string from the environment variable
|
||||
// corresponding to the given Google Test flag.
|
||||
bool BoolFromGTestEnv(const char* flag, bool default_val);
|
||||
Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
|
||||
const char* StringFromGTestEnv(const char* flag, const char* default_val);
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
|
||||
@@ -0,0 +1,280 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file declares the String class and functions used internally by
|
||||
// Google Test. They are subject to change without notice. They should not used
|
||||
// by code external to Google Test.
|
||||
//
|
||||
// This header file is #included by testing/base/internal/gtest-internal.h.
|
||||
// It should not be #included by other files.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#if defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
// When using Google Test on the Mac as a framework, all the includes will be
|
||||
// in the framework headers folder along with gtest.h.
|
||||
// Define GTEST_NOT_MAC_FRAMEWORK_MODE if you are building Google Test on
|
||||
// the Mac and are not using it as a framework.
|
||||
// More info on frameworks available here:
|
||||
// http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
|
||||
// Concepts/WhatAreFrameworks.html.
|
||||
#include "gtest-port.h" // NOLINT
|
||||
#else
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
#endif // defined(__APPLE__) && !defined(GTEST_NOT_MAC_FRAMEWORK_MODE)
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// String - a UTF-8 string class.
|
||||
//
|
||||
// We cannot use std::string as Microsoft's STL implementation in
|
||||
// Visual C++ 7.1 has problems when exception is disabled. There is a
|
||||
// hack to work around this, but we've seen cases where the hack fails
|
||||
// to work.
|
||||
//
|
||||
// Also, String is different from std::string in that it can represent
|
||||
// both NULL and the empty string, while std::string cannot represent
|
||||
// NULL.
|
||||
//
|
||||
// NULL and the empty string are considered different. NULL is less
|
||||
// than anything (including the empty string) except itself.
|
||||
//
|
||||
// This class only provides minimum functionality necessary for
|
||||
// implementing Google Test. We do not intend to implement a full-fledged
|
||||
// string class here.
|
||||
//
|
||||
// Since the purpose of this class is to provide a substitute for
|
||||
// std::string on platforms where it cannot be used, we define a copy
|
||||
// constructor and assignment operators such that we don't need
|
||||
// conditional compilation in a lot of places.
|
||||
//
|
||||
// In order to make the representation efficient, the d'tor of String
|
||||
// is not virtual. Therefore DO NOT INHERIT FROM String.
|
||||
class String {
|
||||
public:
|
||||
// Static utility methods
|
||||
|
||||
// Returns the input if it's not NULL, otherwise returns "(null)".
|
||||
// This function serves two purposes:
|
||||
//
|
||||
// 1. ShowCString(NULL) has type 'const char *', instead of the
|
||||
// type of NULL (which is int).
|
||||
//
|
||||
// 2. In MSVC, streaming a null char pointer to StrStream generates
|
||||
// an access violation, so we need to convert NULL to "(null)"
|
||||
// before streaming it.
|
||||
static inline const char* ShowCString(const char* c_str) {
|
||||
return c_str ? c_str : "(null)";
|
||||
}
|
||||
|
||||
// Returns the input enclosed in double quotes if it's not NULL;
|
||||
// otherwise returns "(null)". For example, "\"Hello\"" is returned
|
||||
// for input "Hello".
|
||||
//
|
||||
// This is useful for printing a C string in the syntax of a literal.
|
||||
//
|
||||
// Known issue: escape sequences are not handled yet.
|
||||
static String ShowCStringQuoted(const char* c_str);
|
||||
|
||||
// Clones a 0-terminated C string, allocating memory using new. The
|
||||
// caller is responsible for deleting the return value using
|
||||
// delete[]. Returns the cloned string, or NULL if the input is
|
||||
// NULL.
|
||||
//
|
||||
// This is different from strdup() in string.h, which allocates
|
||||
// memory using malloc().
|
||||
static const char* CloneCString(const char* c_str);
|
||||
|
||||
// Compares two C strings. Returns true iff they have the same content.
|
||||
//
|
||||
// Unlike strcmp(), this function can handle NULL argument(s). A
|
||||
// NULL C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
static bool CStringEquals(const char* lhs, const char* rhs);
|
||||
|
||||
// Converts a wide C string to a String using the UTF-8 encoding.
|
||||
// NULL will be converted to "(null)". If an error occurred during
|
||||
// the conversion, "(failed to convert from wide string)" is
|
||||
// returned.
|
||||
static String ShowWideCString(const wchar_t* wide_c_str);
|
||||
|
||||
// Similar to ShowWideCString(), except that this function encloses
|
||||
// the converted string in double quotes.
|
||||
static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
|
||||
|
||||
// Compares two wide C strings. Returns true iff they have the same
|
||||
// content.
|
||||
//
|
||||
// Unlike wcscmp(), this function can handle NULL argument(s). A
|
||||
// NULL C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
|
||||
|
||||
// Compares two C strings, ignoring case. Returns true iff they
|
||||
// have the same content.
|
||||
//
|
||||
// Unlike strcasecmp(), this function can handle NULL argument(s).
|
||||
// A NULL C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
static bool CaseInsensitiveCStringEquals(const char* lhs,
|
||||
const char* rhs);
|
||||
|
||||
// Formats a list of arguments to a String, using the same format
|
||||
// spec string as for printf.
|
||||
//
|
||||
// We do not use the StringPrintf class as it is not universally
|
||||
// available.
|
||||
//
|
||||
// The result is limited to 4096 characters (including the tailing
|
||||
// 0). If 4096 characters are not enough to format the input,
|
||||
// "<buffer exceeded>" is returned.
|
||||
static String Format(const char* format, ...);
|
||||
|
||||
// C'tors
|
||||
|
||||
// The default c'tor constructs a NULL string.
|
||||
String() : c_str_(NULL) {}
|
||||
|
||||
// Constructs a String by cloning a 0-terminated C string.
|
||||
String(const char* c_str) : c_str_(NULL) { // NOLINT
|
||||
*this = c_str;
|
||||
}
|
||||
|
||||
// Constructs a String by copying a given number of chars from a
|
||||
// buffer. E.g. String("hello", 3) will create the string "hel".
|
||||
String(const char* buffer, size_t len);
|
||||
|
||||
// The copy c'tor creates a new copy of the string. The two
|
||||
// String objects do not share content.
|
||||
String(const String& str) : c_str_(NULL) {
|
||||
*this = str;
|
||||
}
|
||||
|
||||
// D'tor. String is intended to be a final class, so the d'tor
|
||||
// doesn't need to be virtual.
|
||||
~String() { delete[] c_str_; }
|
||||
|
||||
// Returns true iff this is an empty string (i.e. "").
|
||||
bool empty() const {
|
||||
return (c_str_ != NULL) && (*c_str_ == '\0');
|
||||
}
|
||||
|
||||
// Compares this with another String.
|
||||
// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
|
||||
// if this is greater than rhs.
|
||||
int Compare(const String& rhs) const;
|
||||
|
||||
// Returns true iff this String equals the given C string. A NULL
|
||||
// string and a non-NULL string are considered not equal.
|
||||
bool operator==(const char* c_str) const {
|
||||
return CStringEquals(c_str_, c_str);
|
||||
}
|
||||
|
||||
// Returns true iff this String doesn't equal the given C string. A NULL
|
||||
// string and a non-NULL string are considered not equal.
|
||||
bool operator!=(const char* c_str) const {
|
||||
return !CStringEquals(c_str_, c_str);
|
||||
}
|
||||
|
||||
// Returns true iff this String ends with the given suffix. *Any*
|
||||
// String is considered to end with a NULL or empty suffix.
|
||||
bool EndsWith(const char* suffix) const;
|
||||
|
||||
// Returns true iff this String ends with the given suffix, not considering
|
||||
// case. Any String is considered to end with a NULL or empty suffix.
|
||||
bool EndsWithCaseInsensitive(const char* suffix) const;
|
||||
|
||||
// Returns the length of the encapsulated string, or -1 if the
|
||||
// string is NULL.
|
||||
int GetLength() const {
|
||||
return c_str_ ? static_cast<int>(strlen(c_str_)) : -1;
|
||||
}
|
||||
|
||||
// Gets the 0-terminated C string this String object represents.
|
||||
// The String object still owns the string. Therefore the caller
|
||||
// should NOT delete the return value.
|
||||
const char* c_str() const { return c_str_; }
|
||||
|
||||
// Sets the 0-terminated C string this String object represents.
|
||||
// The old string in this object is deleted, and this object will
|
||||
// own a clone of the input string. This function copies only up to
|
||||
// length bytes (plus a terminating null byte), or until the first
|
||||
// null byte, whichever comes first.
|
||||
//
|
||||
// This function works even when the c_str parameter has the same
|
||||
// value as that of the c_str_ field.
|
||||
void Set(const char* c_str, size_t length);
|
||||
|
||||
// Assigns a C string to this object. Self-assignment works.
|
||||
const String& operator=(const char* c_str);
|
||||
|
||||
// Assigns a String object to this object. Self-assignment works.
|
||||
const String& operator=(const String &rhs) {
|
||||
*this = rhs.c_str_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* c_str_;
|
||||
};
|
||||
|
||||
// Streams a String to an ostream.
|
||||
inline ::std::ostream& operator <<(::std::ostream& os, const String& str) {
|
||||
// We call String::ShowCString() to convert NULL to "(null)".
|
||||
// Otherwise we'll get an access violation on Windows.
|
||||
return os << String::ShowCString(str.c_str());
|
||||
}
|
||||
|
||||
// Gets the content of the StrStream's buffer as a String. Each '\0'
|
||||
// character in the buffer is replaced with "\\0".
|
||||
String StrStreamToString(StrStream* stream);
|
||||
|
||||
// Converts a streamable value to a String. A NULL pointer is
|
||||
// converted to "(null)". When the input value is a ::string,
|
||||
// ::std::string, ::wstring, or ::std::wstring object, each NUL
|
||||
// character in it is replaced with "\\0".
|
||||
|
||||
// Declared here but defined in gtest.h, so that it has access
|
||||
// to the definition of the Message class, required by the ARM
|
||||
// compiler.
|
||||
template <typename T>
|
||||
String StreamableToString(const T& streamable);
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
dnl GTEST_LIB_CHECK([minimum version [,
|
||||
dnl action if found [,action if not found]]])
|
||||
dnl
|
||||
dnl Check for the presence of the Google Test library, optionally at a minimum
|
||||
dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
|
||||
dnl standard variables for substitution including GTEST_CPPFLAGS,
|
||||
dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
|
||||
dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
|
||||
dnl optional custom action slots in the event GTEST is found or not.
|
||||
AC_DEFUN([GTEST_LIB_CHECK],
|
||||
[
|
||||
dnl Provide a flag to enable or disable Google Test usage.
|
||||
AC_ARG_ENABLE([gtest],
|
||||
[AS_HELP_STRING([--enable-gtest],
|
||||
[Enable tests using the Google C++ Testing Framework.]
|
||||
[(Default is enabled.)])],
|
||||
[],
|
||||
[enable_gtest=check])
|
||||
AC_ARG_VAR([GTEST_CONFIG],
|
||||
[The exact path of Google Test's 'gtest-config' script.])
|
||||
AC_ARG_VAR([GTEST_CPPFLAGS],
|
||||
[C-like preprocessor flags for Google Test.])
|
||||
AC_ARG_VAR([GTEST_CXXFLAGS],
|
||||
[C++ compile flags for Google Test.])
|
||||
AC_ARG_VAR([GTEST_LDFLAGS],
|
||||
[Linker path and option flags for Google Test.])
|
||||
AC_ARG_VAR([GTEST_LIBS],
|
||||
[Library linking flags for Google Test.])
|
||||
AC_ARG_VAR([GTEST_VERSION],
|
||||
[The version of Google Test available.])
|
||||
HAVE_GTEST="no"
|
||||
AS_IF([test "x$enable_gtest" != "xno"],
|
||||
[AC_PATH_PROG([GTEST_CONFIG], [gtest-config])
|
||||
AS_IF([test -x "$GTEST_CONFIG"],
|
||||
[AS_IF([test "x$1" != "x"],
|
||||
[_min_version="--min-version=$1"
|
||||
AC_MSG_CHECKING([for Google Test at least version >= $1])],
|
||||
[_min_version="--min-version=0"
|
||||
AC_MSG_CHECKING([for Google Test])])
|
||||
AS_IF([$GTEST_CONFIG $_min_version],
|
||||
[AC_MSG_RESULT([yes])
|
||||
HAVE_GTEST="yes"],
|
||||
[AC_MSG_RESULT([no])])])
|
||||
AS_IF([test "x$HAVE_GTEST" = "xyes"],
|
||||
[GTEST_CPPFLAGS=$($GTEST_CONFIG --cppflags)
|
||||
GTEST_CXXFLAGS=$($GTEST_CONFIG --cxxflags)
|
||||
GTEST_LDFLAGS=$($GTEST_CONFIG --ldflags)
|
||||
GTEST_LIBS=$($GTEST_CONFIG --libs)
|
||||
GTEST_VERSION=$($GTEST_CONFIG --version)
|
||||
AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
|
||||
[AS_IF([test "x$enable_gtest" = "xyes"],
|
||||
[AC_MSG_ERROR([
|
||||
The Google C++ Testing Framework was explicitly enabled, but a viable version
|
||||
could not be found on the system.
|
||||
])])])])
|
||||
AC_SUBST([HAVE_GTEST])
|
||||
AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
|
||||
AS_IF([test "x$HAVE_GTEST" = "xyes"],
|
||||
[AS_IF([test "x$2" != "x"],[$2],[:])],
|
||||
[AS_IF([test "x$3" != "x"],[$3],[:])])
|
||||
])
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include "sample1.h"
|
||||
|
||||
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
|
||||
int Factorial(int n) {
|
||||
int result = 1;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
result *= i;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Returns true iff n is a prime number.
|
||||
bool IsPrime(int n) {
|
||||
// Trivial case 1: small numbers
|
||||
if (n <= 1) return false;
|
||||
|
||||
// Trivial case 2: even numbers
|
||||
if (n % 2 == 0) return n == 2;
|
||||
|
||||
// Now, we have that n is odd and n >= 3.
|
||||
|
||||
// Try to divide n by every odd number i, starting from 3
|
||||
for (int i = 3; ; i += 2) {
|
||||
// We only have to try i up to the squre root of n
|
||||
if (i > n/i) break;
|
||||
|
||||
// Now, we have i <= n/i < n.
|
||||
// If n is divisible by i, n is not prime.
|
||||
if (n % i == 0) return false;
|
||||
}
|
||||
|
||||
// n has no integer factor in the range (1, n), and thus is prime.
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_SAMPLES_SAMPLE1_H_
|
||||
#define GTEST_SAMPLES_SAMPLE1_H_
|
||||
|
||||
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
|
||||
int Factorial(int n);
|
||||
|
||||
// Returns true iff n is a prime number.
|
||||
bool IsPrime(int n);
|
||||
|
||||
#endif // GTEST_SAMPLES_SAMPLE1_H_
|
||||
@@ -0,0 +1,153 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
|
||||
// This sample shows how to write a simple unit test for a function,
|
||||
// using Google C++ testing framework.
|
||||
//
|
||||
// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
|
||||
|
||||
|
||||
// Step 1. Include necessary header files such that the stuff your
|
||||
// test logic needs is declared.
|
||||
//
|
||||
// Don't forget gtest.h, which declares the testing framework.
|
||||
|
||||
#include <limits.h>
|
||||
#include "sample1.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
// Step 2. Use the TEST macro to define your tests.
|
||||
//
|
||||
// TEST has two parameters: the test case name and the test name.
|
||||
// After using the macro, you should define your test logic between a
|
||||
// pair of braces. You can use a bunch of macros to indicate the
|
||||
// success or failure of a test. EXPECT_TRUE and EXPECT_EQ are
|
||||
// examples of such macros. For a complete list, see gtest.h.
|
||||
//
|
||||
// <TechnicalDetails>
|
||||
//
|
||||
// In Google Test, tests are grouped into test cases. This is how we
|
||||
// keep test code organized. You should put logically related tests
|
||||
// into the same test case.
|
||||
//
|
||||
// The test case name and the test name should both be valid C++
|
||||
// identifiers. And you should not use underscore (_) in the names.
|
||||
//
|
||||
// Google Test guarantees that each test you define is run exactly
|
||||
// once, but it makes no guarantee on the order the tests are
|
||||
// executed. Therefore, you should write your tests in such a way
|
||||
// that their results don't depend on their order.
|
||||
//
|
||||
// </TechnicalDetails>
|
||||
|
||||
|
||||
// Tests Factorial().
|
||||
|
||||
// Tests factorial of negative numbers.
|
||||
TEST(FactorialTest, Negative) {
|
||||
// This test is named "Negative", and belongs to the "FactorialTest"
|
||||
// test case.
|
||||
EXPECT_EQ(1, Factorial(-5));
|
||||
EXPECT_EQ(1, Factorial(-1));
|
||||
EXPECT_TRUE(Factorial(-10) > 0);
|
||||
|
||||
// <TechnicalDetails>
|
||||
//
|
||||
// EXPECT_EQ(expected, actual) is the same as
|
||||
//
|
||||
// EXPECT_TRUE((expected) == (actual))
|
||||
//
|
||||
// except that it will print both the expected value and the actual
|
||||
// value when the assertion fails. This is very helpful for
|
||||
// debugging. Therefore in this case EXPECT_EQ is preferred.
|
||||
//
|
||||
// On the other hand, EXPECT_TRUE accepts any Boolean expression,
|
||||
// and is thus more general.
|
||||
//
|
||||
// </TechnicalDetails>
|
||||
}
|
||||
|
||||
// Tests factorial of 0.
|
||||
TEST(FactorialTest, Zero) {
|
||||
EXPECT_EQ(1, Factorial(0));
|
||||
}
|
||||
|
||||
// Tests factorial of positive numbers.
|
||||
TEST(FactorialTest, Positive) {
|
||||
EXPECT_EQ(1, Factorial(1));
|
||||
EXPECT_EQ(2, Factorial(2));
|
||||
EXPECT_EQ(6, Factorial(3));
|
||||
EXPECT_EQ(40320, Factorial(8));
|
||||
}
|
||||
|
||||
|
||||
// Tests IsPrime()
|
||||
|
||||
// Tests negative input.
|
||||
TEST(IsPrimeTest, Negative) {
|
||||
// This test belongs to the IsPrimeTest test case.
|
||||
|
||||
EXPECT_FALSE(IsPrime(-1));
|
||||
EXPECT_FALSE(IsPrime(-2));
|
||||
EXPECT_FALSE(IsPrime(INT_MIN));
|
||||
}
|
||||
|
||||
// Tests some trivial cases.
|
||||
TEST(IsPrimeTest, Trivial) {
|
||||
EXPECT_FALSE(IsPrime(0));
|
||||
EXPECT_FALSE(IsPrime(1));
|
||||
EXPECT_TRUE(IsPrime(2));
|
||||
EXPECT_TRUE(IsPrime(3));
|
||||
}
|
||||
|
||||
// Tests positive input.
|
||||
TEST(IsPrimeTest, Positive) {
|
||||
EXPECT_FALSE(IsPrime(4));
|
||||
EXPECT_TRUE(IsPrime(5));
|
||||
EXPECT_FALSE(IsPrime(6));
|
||||
EXPECT_TRUE(IsPrime(23));
|
||||
}
|
||||
|
||||
// Step 3. Call RUN_ALL_TESTS() in main().
|
||||
//
|
||||
// We do this by linking in src/gtest_main.cc file, which consists of
|
||||
// a main() function which calls RUN_ALL_TESTS() for us.
|
||||
//
|
||||
// This runs all the tests you've defined, prints the result, and
|
||||
// returns 0 if successful, or 1 otherwise.
|
||||
//
|
||||
// Did you notice that we didn't register the tests? The
|
||||
// RUN_ALL_TESTS() macro magically knows about all the tests we
|
||||
// defined. Isn't this convenient?
|
||||
@@ -0,0 +1,54 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include "sample2.h"
|
||||
|
||||
// Clones a 0-terminated C string, allocating memory using new.
|
||||
const char * MyString::CloneCString(const char * c_string) {
|
||||
if (c_string == NULL) return NULL;
|
||||
|
||||
const size_t len = strlen(c_string);
|
||||
char * const clone = new char[ len + 1 ];
|
||||
strcpy(clone, c_string);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
// Sets the 0-terminated C string this MyString object
|
||||
// represents.
|
||||
void MyString::Set(const char * c_string) {
|
||||
// Makes sure this works when c_string == c_string_
|
||||
const char * const temp = MyString::CloneCString(c_string);
|
||||
delete[] c_string_;
|
||||
c_string_ = temp;
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_SAMPLES_SAMPLE2_H_
|
||||
#define GTEST_SAMPLES_SAMPLE2_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// A simple string class.
|
||||
class MyString {
|
||||
private:
|
||||
const char * c_string_;
|
||||
const MyString& operator=(const MyString& rhs);
|
||||
|
||||
public:
|
||||
|
||||
// Clones a 0-terminated C string, allocating memory using new.
|
||||
static const char * CloneCString(const char * c_string);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
//
|
||||
// C'tors
|
||||
|
||||
// The default c'tor constructs a NULL string.
|
||||
MyString() : c_string_(NULL) {}
|
||||
|
||||
// Constructs a MyString by cloning a 0-terminated C string.
|
||||
explicit MyString(const char * c_string) : c_string_(NULL) {
|
||||
Set(c_string);
|
||||
}
|
||||
|
||||
// Copy c'tor
|
||||
MyString(const MyString& string) : c_string_(NULL) {
|
||||
Set(string.c_string_);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
//
|
||||
// D'tor. MyString is intended to be a final class, so the d'tor
|
||||
// doesn't need to be virtual.
|
||||
~MyString() { delete[] c_string_; }
|
||||
|
||||
// Gets the 0-terminated C string this MyString object represents.
|
||||
const char * c_string() const { return c_string_; }
|
||||
|
||||
size_t Length() const {
|
||||
return c_string_ == NULL ? 0 : strlen(c_string_);
|
||||
}
|
||||
|
||||
// Sets the 0-terminated C string this MyString object represents.
|
||||
void Set(const char * c_string);
|
||||
};
|
||||
|
||||
|
||||
#endif // GTEST_SAMPLES_SAMPLE2_H_
|
||||
@@ -0,0 +1,109 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
|
||||
// This sample shows how to write a more complex unit test for a class
|
||||
// that has multiple member functions.
|
||||
//
|
||||
// Usually, it's a good idea to have one test for each method in your
|
||||
// class. You don't have to do that exactly, but it helps to keep
|
||||
// your tests organized. You may also throw in additional tests as
|
||||
// needed.
|
||||
|
||||
#include "sample2.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// In this example, we test the MyString class (a simple string).
|
||||
|
||||
// Tests the default c'tor.
|
||||
TEST(MyString, DefaultConstructor) {
|
||||
const MyString s;
|
||||
|
||||
// Asserts that s.c_string() returns NULL.
|
||||
//
|
||||
// <TechnicalDetails>
|
||||
//
|
||||
// If we write NULL instead of
|
||||
//
|
||||
// static_cast<const char *>(NULL)
|
||||
//
|
||||
// in this assertion, it will generate a warning on gcc 3.4. The
|
||||
// reason is that EXPECT_EQ needs to know the types of its
|
||||
// arguments in order to print them when it fails. Since NULL is
|
||||
// #defined as 0, the compiler will use the formatter function for
|
||||
// int to print it. However, gcc thinks that NULL should be used as
|
||||
// a pointer, not an int, and therefore complains.
|
||||
//
|
||||
// The root of the problem is C++'s lack of distinction between the
|
||||
// integer number 0 and the null pointer constant. Unfortunately,
|
||||
// we have to live with this fact.
|
||||
//
|
||||
// </TechnicalDetails>
|
||||
EXPECT_STREQ(NULL, s.c_string());
|
||||
|
||||
EXPECT_EQ(0, s.Length());
|
||||
}
|
||||
|
||||
const char kHelloString[] = "Hello, world!";
|
||||
|
||||
// Tests the c'tor that accepts a C string.
|
||||
TEST(MyString, ConstructorFromCString) {
|
||||
const MyString s(kHelloString);
|
||||
EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);
|
||||
EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
|
||||
s.Length());
|
||||
}
|
||||
|
||||
// Tests the copy c'tor.
|
||||
TEST(MyString, CopyConstructor) {
|
||||
const MyString s1(kHelloString);
|
||||
const MyString s2 = s1;
|
||||
EXPECT_TRUE(strcmp(s2.c_string(), kHelloString) == 0);
|
||||
}
|
||||
|
||||
// Tests the Set method.
|
||||
TEST(MyString, Set) {
|
||||
MyString s;
|
||||
|
||||
s.Set(kHelloString);
|
||||
EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);
|
||||
|
||||
// Set should work when the input pointer is the same as the one
|
||||
// already in the MyString object.
|
||||
s.Set(s.c_string());
|
||||
EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);
|
||||
|
||||
// Can we set the MyString to NULL?
|
||||
s.Set(NULL);
|
||||
EXPECT_STREQ(NULL, s.c_string());
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
|
||||
#define GTEST_SAMPLES_SAMPLE3_INL_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
// Queue is a simple queue implemented as a singled-linked list.
|
||||
//
|
||||
// The element type must support copy constructor.
|
||||
template <typename E> // E is the element type
|
||||
class Queue;
|
||||
|
||||
// QueueNode is a node in a Queue, which consists of an element of
|
||||
// type E and a pointer to the next node.
|
||||
template <typename E> // E is the element type
|
||||
class QueueNode {
|
||||
friend class Queue<E>;
|
||||
|
||||
public:
|
||||
// Gets the element in this node.
|
||||
const E & element() const { return element_; }
|
||||
|
||||
// Gets the next node in the queue.
|
||||
QueueNode * next() { return next_; }
|
||||
const QueueNode * next() const { return next_; }
|
||||
|
||||
private:
|
||||
// Creates a node with a given element value. The next pointer is
|
||||
// set to NULL.
|
||||
QueueNode(const E & element) : element_(element), next_(NULL) {}
|
||||
|
||||
// We disable the default assignment operator and copy c'tor.
|
||||
const QueueNode & operator = (const QueueNode &);
|
||||
QueueNode(const QueueNode &);
|
||||
|
||||
E element_;
|
||||
QueueNode * next_;
|
||||
};
|
||||
|
||||
template <typename E> // E is the element type.
|
||||
class Queue {
|
||||
public:
|
||||
|
||||
// Creates an empty queue.
|
||||
Queue() : head_(NULL), last_(NULL), size_(0) {}
|
||||
|
||||
// D'tor. Clears the queue.
|
||||
~Queue() { Clear(); }
|
||||
|
||||
// Clears the queue.
|
||||
void Clear() {
|
||||
if (size_ > 0) {
|
||||
// 1. Deletes every node.
|
||||
QueueNode<E> * node = head_;
|
||||
QueueNode<E> * next = node->next();
|
||||
for (; ;) {
|
||||
delete node;
|
||||
node = next;
|
||||
if (node == NULL) break;
|
||||
next = node->next();
|
||||
}
|
||||
|
||||
// 2. Resets the member variables.
|
||||
head_ = last_ = NULL;
|
||||
size_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Gets the number of elements.
|
||||
size_t Size() const { return size_; }
|
||||
|
||||
// Gets the first element of the queue, or NULL if the queue is empty.
|
||||
QueueNode<E> * Head() { return head_; }
|
||||
const QueueNode<E> * Head() const { return head_; }
|
||||
|
||||
// Gets the last element of the queue, or NULL if the queue is empty.
|
||||
QueueNode<E> * Last() { return last_; }
|
||||
const QueueNode<E> * Last() const { return last_; }
|
||||
|
||||
// Adds an element to the end of the queue. A copy of the element is
|
||||
// created using the copy constructor, and then stored in the queue.
|
||||
// Changes made to the element in the queue doesn't affect the source
|
||||
// object, and vice versa.
|
||||
void Enqueue(const E & element) {
|
||||
QueueNode<E> * new_node = new QueueNode<E>(element);
|
||||
|
||||
if (size_ == 0) {
|
||||
head_ = last_ = new_node;
|
||||
size_ = 1;
|
||||
} else {
|
||||
last_->next_ = new_node;
|
||||
last_ = new_node;
|
||||
size_++;
|
||||
}
|
||||
}
|
||||
|
||||
// Removes the head of the queue and returns it. Returns NULL if
|
||||
// the queue is empty.
|
||||
E * Dequeue() {
|
||||
if (size_ == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const QueueNode<E> * const old_head = head_;
|
||||
head_ = head_->next_;
|
||||
size_--;
|
||||
if (size_ == 0) {
|
||||
last_ = NULL;
|
||||
}
|
||||
|
||||
E * element = new E(old_head->element());
|
||||
delete old_head;
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
// Applies a function/functor on each element of the queue, and
|
||||
// returns the result in a new queue. The original queue is not
|
||||
// affected.
|
||||
template <typename F>
|
||||
Queue * Map(F function) const {
|
||||
Queue * new_queue = new Queue();
|
||||
for (const QueueNode<E> * node = head_; node != NULL; node = node->next_) {
|
||||
new_queue->Enqueue(function(node->element()));
|
||||
}
|
||||
|
||||
return new_queue;
|
||||
}
|
||||
|
||||
private:
|
||||
QueueNode<E> * head_; // The first node of the queue.
|
||||
QueueNode<E> * last_; // The last node of the queue.
|
||||
size_t size_; // The number of elements in the queue.
|
||||
|
||||
// We disallow copying a queue.
|
||||
Queue(const Queue &);
|
||||
const Queue & operator = (const Queue &);
|
||||
};
|
||||
|
||||
#endif // GTEST_SAMPLES_SAMPLE3_INL_H_
|
||||
@@ -0,0 +1,151 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
|
||||
// In this example, we use a more advanced feature of Google Test called
|
||||
// test fixture.
|
||||
//
|
||||
// A test fixture is a place to hold objects and functions shared by
|
||||
// all tests in a test case. Using a test fixture avoids duplicating
|
||||
// the test code necessary to initialize and cleanup those common
|
||||
// objects for each test. It is also useful for defining sub-routines
|
||||
// that your tests need to invoke a lot.
|
||||
//
|
||||
// <TechnicalDetails>
|
||||
//
|
||||
// The tests share the test fixture in the sense of code sharing, not
|
||||
// data sharing. Each test is given its own fresh copy of the
|
||||
// fixture. You cannot expect the data modified by one test to be
|
||||
// passed on to another test, which is a bad idea.
|
||||
//
|
||||
// The reason for this design is that tests should be independent and
|
||||
// repeatable. In particular, a test should not fail as the result of
|
||||
// another test's failure. If one test depends on info produced by
|
||||
// another test, then the two tests should really be one big test.
|
||||
//
|
||||
// The macros for indicating the success/failure of a test
|
||||
// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
|
||||
// (when Google Test prints the test result, it tells you which test
|
||||
// each failure belongs to). Technically, these macros invoke a
|
||||
// member function of the Test class. Therefore, you cannot use them
|
||||
// in a global function. That's why you should put test sub-routines
|
||||
// in a test fixture.
|
||||
//
|
||||
// </TechnicalDetails>
|
||||
|
||||
#include "sample3-inl.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// To use a test fixture, derive a class from testing::Test.
|
||||
class QueueTest : public testing::Test {
|
||||
protected: // You should make the members protected s.t. they can be
|
||||
// accessed from sub-classes.
|
||||
|
||||
// virtual void SetUp() will be called before each test is run. You
|
||||
// should define it if you need to initialize the varaibles.
|
||||
// Otherwise, this can be skipped.
|
||||
virtual void SetUp() {
|
||||
q1_.Enqueue(1);
|
||||
q2_.Enqueue(2);
|
||||
q2_.Enqueue(3);
|
||||
}
|
||||
|
||||
// virtual void TearDown() will be called after each test is run.
|
||||
// You should define it if there is cleanup work to do. Otherwise,
|
||||
// you don't have to provide it.
|
||||
//
|
||||
// virtual void TearDown() {
|
||||
// }
|
||||
|
||||
// A helper function that some test uses.
|
||||
static int Double(int n) {
|
||||
return 2*n;
|
||||
}
|
||||
|
||||
// A helper function for testing Queue::Map().
|
||||
void MapTester(const Queue<int> * q) {
|
||||
// Creates a new queue, where each element is twice as big as the
|
||||
// corresponding one in q.
|
||||
const Queue<int> * const new_q = q->Map(Double);
|
||||
|
||||
// Verifies that the new queue has the same size as q.
|
||||
ASSERT_EQ(q->Size(), new_q->Size());
|
||||
|
||||
// Verifies the relationship between the elements of the two queues.
|
||||
for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
|
||||
n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
|
||||
EXPECT_EQ(2 * n1->element(), n2->element());
|
||||
}
|
||||
|
||||
delete new_q;
|
||||
}
|
||||
|
||||
// Declares the variables your tests want to use.
|
||||
Queue<int> q0_;
|
||||
Queue<int> q1_;
|
||||
Queue<int> q2_;
|
||||
};
|
||||
|
||||
// When you have a test fixture, you define a test using TEST_F
|
||||
// instead of TEST.
|
||||
|
||||
// Tests the default c'tor.
|
||||
TEST_F(QueueTest, DefaultConstructor) {
|
||||
// You can access data in the test fixture here.
|
||||
EXPECT_EQ(0, q0_.Size());
|
||||
}
|
||||
|
||||
// Tests Dequeue().
|
||||
TEST_F(QueueTest, Dequeue) {
|
||||
int * n = q0_.Dequeue();
|
||||
EXPECT_TRUE(n == NULL);
|
||||
|
||||
n = q1_.Dequeue();
|
||||
ASSERT_TRUE(n != NULL);
|
||||
EXPECT_EQ(1, *n);
|
||||
EXPECT_EQ(0, q1_.Size());
|
||||
delete n;
|
||||
|
||||
n = q2_.Dequeue();
|
||||
ASSERT_TRUE(n != NULL);
|
||||
EXPECT_EQ(2, *n);
|
||||
EXPECT_EQ(1, q2_.Size());
|
||||
delete n;
|
||||
}
|
||||
|
||||
// Tests the Queue::Map() function.
|
||||
TEST_F(QueueTest, Map) {
|
||||
MapTester(&q0_);
|
||||
MapTester(&q1_);
|
||||
MapTester(&q2_);
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "sample4.h"
|
||||
|
||||
// Returns the current counter value, and increments it.
|
||||
int Counter::Increment() {
|
||||
return counter_++;
|
||||
}
|
||||
|
||||
// Prints the current counter value to STDOUT.
|
||||
void Counter::Print() const {
|
||||
printf("%d", counter_);
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// A sample program demonstrating using Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_SAMPLES_SAMPLE4_H_
|
||||
#define GTEST_SAMPLES_SAMPLE4_H_
|
||||
|
||||
// A simple monotonic counter.
|
||||
class Counter {
|
||||
private:
|
||||
int counter_;
|
||||
|
||||
public:
|
||||
// Creates a counter that starts at 0.
|
||||
Counter() : counter_(0) {}
|
||||
|
||||
// Returns the current counter value, and increments it.
|
||||
int Increment();
|
||||
|
||||
// Prints the current counter value to STDOUT.
|
||||
void Print() const;
|
||||
};
|
||||
|
||||
#endif // GTEST_SAMPLES_SAMPLE4_H_
|
||||
@@ -0,0 +1,45 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include "sample4.h"
|
||||
|
||||
// Tests the Increment() method.
|
||||
TEST(Counter, Increment) {
|
||||
Counter c;
|
||||
|
||||
// EXPECT_EQ() evaluates its arguments exactly once, so they
|
||||
// can have side effects.
|
||||
|
||||
EXPECT_EQ(0, c.Increment());
|
||||
EXPECT_EQ(1, c.Increment());
|
||||
EXPECT_EQ(2, c.Increment());
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// This sample teaches how to reuse a test fixture in multiple test
|
||||
// cases by deriving sub-fixtures from it.
|
||||
//
|
||||
// When you define a test fixture, you specify the name of the test
|
||||
// case that will use this fixture. Therefore, a test fixture can
|
||||
// be used by only one test case.
|
||||
//
|
||||
// Sometimes, more than one test cases may want to use the same or
|
||||
// slightly different test fixtures. For example, you may want to
|
||||
// make sure that all tests for a GUI library don't leak important
|
||||
// system resources like fonts and brushes. In Google Test, you do
|
||||
// this by putting the shared logic in a super (as in "super class")
|
||||
// test fixture, and then have each test case use a fixture derived
|
||||
// from this super fixture.
|
||||
|
||||
#include <limits.h>
|
||||
#include <time.h>
|
||||
#include "sample3-inl.h"
|
||||
#include <gtest/gtest.h>
|
||||
#include "sample1.h"
|
||||
|
||||
// In this sample, we want to ensure that every test finishes within
|
||||
// ~5 seconds. If a test takes longer to run, we consider it a
|
||||
// failure.
|
||||
//
|
||||
// We put the code for timing a test in a test fixture called
|
||||
// "QuickTest". QuickTest is intended to be the super fixture that
|
||||
// other fixtures derive from, therefore there is no test case with
|
||||
// the name "QuickTest". This is OK.
|
||||
//
|
||||
// Later, we will derive multiple test fixtures from QuickTest.
|
||||
class QuickTest : public testing::Test {
|
||||
protected:
|
||||
// Remember that SetUp() is run immediately before a test starts.
|
||||
// This is a good place to record the start time.
|
||||
virtual void SetUp() {
|
||||
start_time_ = time(NULL);
|
||||
}
|
||||
|
||||
// TearDown() is invoked immediately after a test finishes. Here we
|
||||
// check if the test was too slow.
|
||||
virtual void TearDown() {
|
||||
// Gets the time when the test finishes
|
||||
const time_t end_time = time(NULL);
|
||||
|
||||
// Asserts that the test took no more than ~5 seconds. Did you
|
||||
// know that you can use assertions in SetUp() and TearDown() as
|
||||
// well?
|
||||
EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
|
||||
}
|
||||
|
||||
// The UTC time (in seconds) when the test starts
|
||||
time_t start_time_;
|
||||
};
|
||||
|
||||
|
||||
// We derive a fixture named IntegerFunctionTest from the QuickTest
|
||||
// fixture. All tests using this fixture will be automatically
|
||||
// required to be quick.
|
||||
class IntegerFunctionTest : public QuickTest {
|
||||
// We don't need any more logic than already in the QuickTest fixture.
|
||||
// Therefore the body is empty.
|
||||
};
|
||||
|
||||
|
||||
// Now we can write tests in the IntegerFunctionTest test case.
|
||||
|
||||
// Tests Factorial()
|
||||
TEST_F(IntegerFunctionTest, Factorial) {
|
||||
// Tests factorial of negative numbers.
|
||||
EXPECT_EQ(1, Factorial(-5));
|
||||
EXPECT_EQ(1, Factorial(-1));
|
||||
EXPECT_TRUE(Factorial(-10) > 0);
|
||||
|
||||
// Tests factorial of 0.
|
||||
EXPECT_EQ(1, Factorial(0));
|
||||
|
||||
// Tests factorial of positive numbers.
|
||||
EXPECT_EQ(1, Factorial(1));
|
||||
EXPECT_EQ(2, Factorial(2));
|
||||
EXPECT_EQ(6, Factorial(3));
|
||||
EXPECT_EQ(40320, Factorial(8));
|
||||
}
|
||||
|
||||
|
||||
// Tests IsPrime()
|
||||
TEST_F(IntegerFunctionTest, IsPrime) {
|
||||
// Tests negative input.
|
||||
EXPECT_TRUE(!IsPrime(-1));
|
||||
EXPECT_TRUE(!IsPrime(-2));
|
||||
EXPECT_TRUE(!IsPrime(INT_MIN));
|
||||
|
||||
// Tests some trivial cases.
|
||||
EXPECT_TRUE(!IsPrime(0));
|
||||
EXPECT_TRUE(!IsPrime(1));
|
||||
EXPECT_TRUE(IsPrime(2));
|
||||
EXPECT_TRUE(IsPrime(3));
|
||||
|
||||
// Tests positive input.
|
||||
EXPECT_TRUE(!IsPrime(4));
|
||||
EXPECT_TRUE(IsPrime(5));
|
||||
EXPECT_TRUE(!IsPrime(6));
|
||||
EXPECT_TRUE(IsPrime(23));
|
||||
}
|
||||
|
||||
|
||||
// The next test case (named "QueueTest") also needs to be quick, so
|
||||
// we derive another fixture from QuickTest.
|
||||
//
|
||||
// The QueueTest test fixture has some logic and shared objects in
|
||||
// addition to what's in QuickTest already. We define the additional
|
||||
// stuff inside the body of the test fixture, as usual.
|
||||
class QueueTest : public QuickTest {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
// First, we need to set up the super fixture (QuickTest).
|
||||
QuickTest::SetUp();
|
||||
|
||||
// Second, some additional setup for this fixture.
|
||||
q1_.Enqueue(1);
|
||||
q2_.Enqueue(2);
|
||||
q2_.Enqueue(3);
|
||||
}
|
||||
|
||||
// By default, TearDown() inherits the behavior of
|
||||
// QuickTest::TearDown(). As we have no additional cleaning work
|
||||
// for QueueTest, we omit it here.
|
||||
//
|
||||
// virtual void TearDown() {
|
||||
// QuickTest::TearDown();
|
||||
// }
|
||||
|
||||
Queue<int> q0_;
|
||||
Queue<int> q1_;
|
||||
Queue<int> q2_;
|
||||
};
|
||||
|
||||
|
||||
// Now, let's write tests using the QueueTest fixture.
|
||||
|
||||
// Tests the default constructor.
|
||||
TEST_F(QueueTest, DefaultConstructor) {
|
||||
EXPECT_EQ(0, q0_.Size());
|
||||
}
|
||||
|
||||
// Tests Dequeue().
|
||||
TEST_F(QueueTest, Dequeue) {
|
||||
int * n = q0_.Dequeue();
|
||||
EXPECT_TRUE(n == NULL);
|
||||
|
||||
n = q1_.Dequeue();
|
||||
EXPECT_TRUE(n != NULL);
|
||||
EXPECT_EQ(1, *n);
|
||||
EXPECT_EQ(0, q1_.Size());
|
||||
delete n;
|
||||
|
||||
n = q2_.Dequeue();
|
||||
EXPECT_TRUE(n != NULL);
|
||||
EXPECT_EQ(2, *n);
|
||||
EXPECT_EQ(1, q2_.Size());
|
||||
delete n;
|
||||
}
|
||||
|
||||
// If necessary, you can derive further test fixtures from a derived
|
||||
// fixture itself. For example, you can derive another fixture from
|
||||
// QueueTest. Google Test imposes no limit on how deep the hierarchy
|
||||
// can be. In practice, however, you probably don't want it to be too
|
||||
// deep as to be confusing.
|
||||
Executable
+733
@@ -0,0 +1,733 @@
|
||||
#!/usr/bin/python2.4
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""gen_gtest_pred_impl.py v0.1
|
||||
|
||||
Generates the implementation of Google Test predicate assertions and
|
||||
accompanying tests.
|
||||
|
||||
Usage:
|
||||
|
||||
gen_gtest_pred_impl.py MAX_ARITY
|
||||
|
||||
where MAX_ARITY is a positive integer.
|
||||
|
||||
The command generates the implementation of up-to MAX_ARITY-ary
|
||||
predicate assertions, and writes it to file gtest_pred_impl.h in the
|
||||
directory where the script is. It also generates the accompanying
|
||||
unit test in file gtest_pred_impl_unittest.cc.
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
# Where this script is.
|
||||
SCRIPT_DIR = os.path.dirname(sys.argv[0])
|
||||
|
||||
# Where to store the generated header.
|
||||
HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
|
||||
|
||||
# Where to store the generated unit test.
|
||||
UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
|
||||
|
||||
|
||||
def HeaderPreamble(n):
|
||||
"""Returns the preamble for the header file.
|
||||
|
||||
Args:
|
||||
n: the maximum arity of the predicate macros to be generated.
|
||||
"""
|
||||
|
||||
# A map that defines the values used in the preamble template.
|
||||
DEFS = {
|
||||
'today' : time.strftime('%m/%d/%Y'),
|
||||
'year' : time.strftime('%Y'),
|
||||
'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
|
||||
'n' : n
|
||||
}
|
||||
|
||||
return (
|
||||
"""// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on %(today)s by command
|
||||
// '%(command)s'. DO NOT EDIT BY HAND!
|
||||
//
|
||||
// Implements a family of generic predicate assertion macros.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
|
||||
// Makes sure this header is not included before gtest.h.
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
#error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_H_
|
||||
|
||||
// This header implements a family of generic predicate assertion
|
||||
// macros:
|
||||
//
|
||||
// ASSERT_PRED_FORMAT1(pred_format, v1)
|
||||
// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
|
||||
// ...
|
||||
//
|
||||
// where pred_format is a function or functor that takes n (in the
|
||||
// case of ASSERT_PRED_FORMATn) values and their source expression
|
||||
// text, and returns a testing::AssertionResult. See the definition
|
||||
// of ASSERT_EQ in gtest.h for an example.
|
||||
//
|
||||
// If you don't care about formatting, you can use the more
|
||||
// restrictive version:
|
||||
//
|
||||
// ASSERT_PRED1(pred, v1)
|
||||
// ASSERT_PRED2(pred, v1, v2)
|
||||
// ...
|
||||
//
|
||||
// where pred is an n-ary function or functor that returns bool,
|
||||
// and the values v1, v2, ..., must support the << operator for
|
||||
// streaming to std::ostream.
|
||||
//
|
||||
// We also define the EXPECT_* variations.
|
||||
//
|
||||
// For now we only support predicates whose arity is at most %(n)s.
|
||||
// Please email googletestframework@googlegroups.com if you need
|
||||
// support for higher arities.
|
||||
|
||||
// GTEST_ASSERT is the basic statement to which all of the assertions
|
||||
// in this file reduce. Don't use this in your code.
|
||||
|
||||
#define GTEST_ASSERT(expression, on_failure) \\
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \\
|
||||
if (const ::testing::AssertionResult gtest_ar = (expression)) \\
|
||||
; \\
|
||||
else \\
|
||||
on_failure(gtest_ar.failure_message())
|
||||
""" % DEFS)
|
||||
|
||||
|
||||
def Arity(n):
|
||||
"""Returns the English name of the given arity."""
|
||||
|
||||
if n < 0:
|
||||
return None
|
||||
elif n <= 3:
|
||||
return ['nullary', 'unary', 'binary', 'ternary'][n]
|
||||
else:
|
||||
return '%s-ary' % n
|
||||
|
||||
|
||||
def Title(word):
|
||||
"""Returns the given word in title case. The difference between
|
||||
this and string's title() method is that Title('4-ary') is '4-ary'
|
||||
while '4-ary'.title() is '4-Ary'."""
|
||||
|
||||
return word[0].upper() + word[1:]
|
||||
|
||||
|
||||
def OneTo(n):
|
||||
"""Returns the list [1, 2, 3, ..., n]."""
|
||||
|
||||
return range(1, n + 1)
|
||||
|
||||
|
||||
def Iter(n, format, sep=''):
|
||||
"""Given a positive integer n, a format string that contains 0 or
|
||||
more '%s' format specs, and optionally a separator string, returns
|
||||
the join of n strings, each formatted with the format string on an
|
||||
iterator ranged from 1 to n.
|
||||
|
||||
Example:
|
||||
|
||||
Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
|
||||
"""
|
||||
|
||||
# How many '%s' specs are in format?
|
||||
spec_count = len(format.split('%s')) - 1
|
||||
return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
|
||||
|
||||
|
||||
def ImplementationForArity(n):
|
||||
"""Returns the implementation of n-ary predicate assertions."""
|
||||
|
||||
# A map the defines the values used in the implementation template.
|
||||
DEFS = {
|
||||
'n' : str(n),
|
||||
'vs' : Iter(n, 'v%s', sep=', '),
|
||||
'vts' : Iter(n, '#v%s', sep=', '),
|
||||
'arity' : Arity(n),
|
||||
'Arity' : Title(Arity(n))
|
||||
}
|
||||
|
||||
impl = """
|
||||
|
||||
// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use
|
||||
// this in your code.
|
||||
template <typename Pred""" % DEFS
|
||||
|
||||
impl += Iter(n, """,
|
||||
typename T%s""")
|
||||
|
||||
impl += """>
|
||||
AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
|
||||
|
||||
impl += Iter(n, """,
|
||||
const char* e%s""")
|
||||
|
||||
impl += """,
|
||||
Pred pred"""
|
||||
|
||||
impl += Iter(n, """,
|
||||
const T%s& v%s""")
|
||||
|
||||
impl += """) {
|
||||
if (pred(%(vs)s)) return AssertionSuccess();
|
||||
|
||||
Message msg;
|
||||
""" % DEFS
|
||||
|
||||
impl += ' msg << pred_text << "("'
|
||||
|
||||
impl += Iter(n, """
|
||||
<< e%s""", sep=' << ", "')
|
||||
|
||||
impl += ' << ") evaluates to false, where"'
|
||||
|
||||
impl += Iter(n, """
|
||||
<< "\\n" << e%s << " evaluates to " << v%s""")
|
||||
|
||||
impl += """;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
|
||||
// Don't use this in your code.
|
||||
#define GTEST_PRED_FORMAT%(n)s(pred_format, %(vs)s, on_failure)\\
|
||||
GTEST_ASSERT(pred_format(%(vts)s, %(vs)s),\\
|
||||
on_failure)
|
||||
|
||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use
|
||||
// this in your code.
|
||||
#define GTEST_PRED%(n)s(pred, %(vs)s, on_failure)\\
|
||||
GTEST_ASSERT(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
|
||||
|
||||
impl += Iter(n, """, \\
|
||||
#v%s""")
|
||||
|
||||
impl += """, \\
|
||||
pred"""
|
||||
|
||||
impl += Iter(n, """, \\
|
||||
v%s""")
|
||||
|
||||
impl += """), on_failure)
|
||||
|
||||
// %(Arity)s predicate assertion macros.
|
||||
#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
|
||||
GTEST_PRED_FORMAT%(n)s(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
|
||||
GTEST_PRED%(n)s(pred, %(vs)s, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
|
||||
GTEST_PRED_FORMAT%(n)s(pred_format, %(vs)s, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
|
||||
GTEST_PRED%(n)s(pred, %(vs)s, GTEST_FATAL_FAILURE)
|
||||
|
||||
""" % DEFS
|
||||
|
||||
return impl
|
||||
|
||||
|
||||
def HeaderPostamble():
|
||||
"""Returns the postamble for the header file."""
|
||||
|
||||
return """
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
|
||||
"""
|
||||
|
||||
|
||||
def GenerateFile(path, content):
|
||||
"""Given a file path and a content string, overwrites it with the
|
||||
given content."""
|
||||
|
||||
print 'Updating file %s . . .' % path
|
||||
|
||||
f = file(path, 'w+')
|
||||
print >>f, content,
|
||||
f.close()
|
||||
|
||||
print 'File %s has been updated.' % path
|
||||
|
||||
|
||||
def GenerateHeader(n):
|
||||
"""Given the maximum arity n, updates the header file that implements
|
||||
the predicate assertions."""
|
||||
|
||||
GenerateFile(HEADER,
|
||||
HeaderPreamble(n)
|
||||
+ ''.join([ImplementationForArity(i) for i in OneTo(n)])
|
||||
+ HeaderPostamble())
|
||||
|
||||
|
||||
def UnitTestPreamble():
|
||||
"""Returns the preamble for the unit test file."""
|
||||
|
||||
# A map that defines the values used in the preamble template.
|
||||
DEFS = {
|
||||
'today' : time.strftime('%m/%d/%Y'),
|
||||
'year' : time.strftime('%Y'),
|
||||
'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
|
||||
}
|
||||
|
||||
return (
|
||||
"""// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on %(today)s by command
|
||||
// '%(command)s'. DO NOT EDIT BY HAND!
|
||||
|
||||
// Regression test for gtest_pred_impl.h
|
||||
//
|
||||
// This file is generated by a script and quite long. If you intend to
|
||||
// learn how Google Test works by reading its unit tests, read
|
||||
// gtest_unittest.cc instead.
|
||||
//
|
||||
// This is intended as a regression test for the Google Test predicate
|
||||
// assertions. We compile it as part of the gtest_unittest target
|
||||
// only to keep the implementation tidy and compact, as it is quite
|
||||
// involved to set up the stage for testing Google Test using Google
|
||||
// Test itself.
|
||||
//
|
||||
// Currently, gtest_unittest takes ~11 seconds to run in the testing
|
||||
// daemon. In the future, if it grows too large and needs much more
|
||||
// time to finish, we should consider separating this file into a
|
||||
// stand-alone regression test.
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
// A user-defined data type.
|
||||
struct Bool {
|
||||
explicit Bool(int val) : value(val != 0) {}
|
||||
|
||||
bool operator>(int n) const { return value > Bool(n).value; }
|
||||
|
||||
Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
|
||||
|
||||
bool operator==(const Bool& rhs) const { return value == rhs.value; }
|
||||
|
||||
bool value;
|
||||
};
|
||||
|
||||
// Enables Bool to be used in assertions.
|
||||
std::ostream& operator<<(std::ostream& os, const Bool& x) {
|
||||
return os << (x.value ? "true" : "false");
|
||||
}
|
||||
|
||||
""" % DEFS)
|
||||
|
||||
|
||||
def TestsForArity(n):
|
||||
"""Returns the tests for n-ary predicate assertions."""
|
||||
|
||||
# A map that defines the values used in the template for the tests.
|
||||
DEFS = {
|
||||
'n' : n,
|
||||
'es' : Iter(n, 'e%s', sep=', '),
|
||||
'vs' : Iter(n, 'v%s', sep=', '),
|
||||
'vts' : Iter(n, '#v%s', sep=', '),
|
||||
'tvs' : Iter(n, 'T%s v%s', sep=', '),
|
||||
'int_vs' : Iter(n, 'int v%s', sep=', '),
|
||||
'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
|
||||
'types' : Iter(n, 'typename T%s', sep=', '),
|
||||
'v_sum' : Iter(n, 'v%s', sep=' + '),
|
||||
'arity' : Arity(n),
|
||||
'Arity' : Title(Arity(n)),
|
||||
}
|
||||
|
||||
tests = (
|
||||
"""// Sample functions/functors for testing %(arity)s predicate assertions.
|
||||
|
||||
// A %(arity)s predicate function.
|
||||
template <%(types)s>
|
||||
bool PredFunction%(n)s(%(tvs)s) {
|
||||
return %(v_sum)s > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction%(n)sInt(%(int_vs)s) {
|
||||
return %(v_sum)s > 0;
|
||||
}
|
||||
bool PredFunction%(n)sBool(%(Bool_vs)s) {
|
||||
return %(v_sum)s > 0;
|
||||
}
|
||||
""" % DEFS)
|
||||
|
||||
tests += """
|
||||
// A %(arity)s predicate functor.
|
||||
struct PredFunctor%(n)s {
|
||||
template <%(types)s>
|
||||
bool operator()(""" % DEFS
|
||||
|
||||
tests += Iter(n, 'const T%s& v%s', sep=""",
|
||||
""")
|
||||
|
||||
tests += """) {
|
||||
return %(v_sum)s > 0;
|
||||
}
|
||||
};
|
||||
""" % DEFS
|
||||
|
||||
tests += """
|
||||
// A %(arity)s predicate-formatter function.
|
||||
template <%(types)s>
|
||||
testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
|
||||
|
||||
tests += Iter(n, 'const char* e%s', sep=""",
|
||||
""")
|
||||
|
||||
tests += Iter(n, """,
|
||||
const T%s& v%s""")
|
||||
|
||||
tests += """) {
|
||||
if (PredFunction%(n)s(%(vs)s))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << """ % DEFS
|
||||
|
||||
tests += Iter(n, 'e%s', sep=' << " + " << ')
|
||||
|
||||
tests += """
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< %(v_sum)s << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
""" % DEFS
|
||||
|
||||
tests += """
|
||||
// A %(arity)s predicate-formatter functor.
|
||||
struct PredFormatFunctor%(n)s {
|
||||
template <%(types)s>
|
||||
testing::AssertionResult operator()(""" % DEFS
|
||||
|
||||
tests += Iter(n, 'const char* e%s', sep=""",
|
||||
""")
|
||||
|
||||
tests += Iter(n, """,
|
||||
const T%s& v%s""")
|
||||
|
||||
tests += """) const {
|
||||
return PredFormatFunction%(n)s(%(es)s, %(vs)s);
|
||||
}
|
||||
};
|
||||
""" % DEFS
|
||||
|
||||
tests += """
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
|
||||
|
||||
class Predicate%(n)sTest : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;""" % DEFS
|
||||
|
||||
tests += """
|
||||
""" + Iter(n, 'n%s_ = ') + """0;
|
||||
}
|
||||
"""
|
||||
|
||||
tests += """
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once."""
|
||||
|
||||
tests += ''.join(["""
|
||||
EXPECT_EQ(1, n%s_) <<
|
||||
"The predicate assertion didn't evaluate argument %s "
|
||||
"exactly once.";""" % (i, i + 1) for i in OneTo(n)])
|
||||
|
||||
tests += """
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
""" % DEFS
|
||||
|
||||
tests += Iter(n, """
|
||||
static int n%s_;""")
|
||||
|
||||
tests += """
|
||||
};
|
||||
|
||||
bool Predicate%(n)sTest::expected_to_finish_;
|
||||
bool Predicate%(n)sTest::finished_;
|
||||
""" % DEFS
|
||||
|
||||
tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
|
||||
""") % DEFS
|
||||
|
||||
tests += """
|
||||
typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
|
||||
typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
|
||||
typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
|
||||
typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
|
||||
""" % DEFS
|
||||
|
||||
def GenTest(use_format, use_assert, expect_failure,
|
||||
use_functor, use_user_type):
|
||||
"""Returns the test for a predicate assertion macro.
|
||||
|
||||
Args:
|
||||
use_format: true iff the assertion is a *_PRED_FORMAT*.
|
||||
use_assert: true iff the assertion is a ASSERT_*.
|
||||
expect_failure: true iff the assertion is expected to fail.
|
||||
use_functor: true iff the first argument of the assertion is
|
||||
a functor (as opposed to a function)
|
||||
use_user_type: true iff the predicate functor/function takes
|
||||
argument(s) of a user-defined type.
|
||||
|
||||
Example:
|
||||
|
||||
GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
|
||||
of a successful EXPECT_PRED_FORMATn() that takes a functor
|
||||
whose arguments have built-in types."""
|
||||
|
||||
if use_assert:
|
||||
assrt = 'ASSERT' # 'assert' is reserved, so we cannot use
|
||||
# that identifier here.
|
||||
else:
|
||||
assrt = 'EXPECT'
|
||||
|
||||
assertion = assrt + '_PRED'
|
||||
|
||||
if use_format:
|
||||
pred_format = 'PredFormat'
|
||||
assertion += '_FORMAT'
|
||||
else:
|
||||
pred_format = 'Pred'
|
||||
|
||||
assertion += '%(n)s' % DEFS
|
||||
|
||||
if use_functor:
|
||||
pred_format_type = 'functor'
|
||||
pred_format += 'Functor%(n)s()'
|
||||
else:
|
||||
pred_format_type = 'function'
|
||||
pred_format += 'Function%(n)s'
|
||||
if not use_format:
|
||||
if use_user_type:
|
||||
pred_format += 'Bool'
|
||||
else:
|
||||
pred_format += 'Int'
|
||||
|
||||
test_name = pred_format_type.title()
|
||||
|
||||
if use_user_type:
|
||||
arg_type = 'user-defined type (Bool)'
|
||||
test_name += 'OnUserType'
|
||||
if expect_failure:
|
||||
arg = 'Bool(n%s_++)'
|
||||
else:
|
||||
arg = 'Bool(++n%s_)'
|
||||
else:
|
||||
arg_type = 'built-in type (int)'
|
||||
test_name += 'OnBuiltInType'
|
||||
if expect_failure:
|
||||
arg = 'n%s_++'
|
||||
else:
|
||||
arg = '++n%s_'
|
||||
|
||||
if expect_failure:
|
||||
successful_or_failed = 'failed'
|
||||
expected_or_not = 'expected.'
|
||||
test_name += 'Failure'
|
||||
else:
|
||||
successful_or_failed = 'successful'
|
||||
expected_or_not = 'UNEXPECTED!'
|
||||
test_name += 'Success'
|
||||
|
||||
# A map that defines the values used in the test template.
|
||||
defs = DEFS.copy()
|
||||
defs.update({
|
||||
'assert' : assrt,
|
||||
'assertion' : assertion,
|
||||
'test_name' : test_name,
|
||||
'pf_type' : pred_format_type,
|
||||
'pf' : pred_format,
|
||||
'arg_type' : arg_type,
|
||||
'arg' : arg,
|
||||
'successful' : successful_or_failed,
|
||||
'expected' : expected_or_not,
|
||||
})
|
||||
|
||||
test = """
|
||||
// Tests a %(successful)s %(assertion)s where the
|
||||
// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
|
||||
TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
|
||||
|
||||
indent = (len(assertion) + 3)*' '
|
||||
extra_indent = ''
|
||||
|
||||
if expect_failure:
|
||||
extra_indent = ' '
|
||||
if use_assert:
|
||||
test += """
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT"""
|
||||
else:
|
||||
test += """
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT"""
|
||||
|
||||
test += '\n' + extra_indent + """ %(assertion)s(%(pf)s""" % defs
|
||||
|
||||
test = test % defs
|
||||
test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
|
||||
test += ');\n' + extra_indent + ' finished_ = true;\n'
|
||||
|
||||
if expect_failure:
|
||||
test += ' }, "");\n'
|
||||
|
||||
test += '}\n'
|
||||
return test
|
||||
|
||||
# Generates tests for all 2**6 = 64 combinations.
|
||||
tests += ''.join([GenTest(use_format, use_assert, expect_failure,
|
||||
use_functor, use_user_type)
|
||||
for use_format in [0, 1]
|
||||
for use_assert in [0, 1]
|
||||
for expect_failure in [0, 1]
|
||||
for use_functor in [0, 1]
|
||||
for use_user_type in [0, 1]
|
||||
])
|
||||
|
||||
return tests
|
||||
|
||||
|
||||
def UnitTestPostamble():
|
||||
"""Returns the postamble for the tests."""
|
||||
|
||||
return ''
|
||||
|
||||
|
||||
def GenerateUnitTest(n):
|
||||
"""Returns the tests for up-to n-ary predicate assertions."""
|
||||
|
||||
GenerateFile(UNIT_TEST,
|
||||
UnitTestPreamble()
|
||||
+ ''.join([TestsForArity(i) for i in OneTo(n)])
|
||||
+ UnitTestPostamble())
|
||||
|
||||
|
||||
def _Main():
|
||||
"""The entry point of the script. Generates the header file and its
|
||||
unit test."""
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
print __doc__
|
||||
print 'Author: ' + __author__
|
||||
sys.exit(1)
|
||||
|
||||
n = int(sys.argv[1])
|
||||
GenerateHeader(n)
|
||||
GenerateUnitTest(n)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
_Main()
|
||||
Executable
+199
@@ -0,0 +1,199 @@
|
||||
#!/bin/sh
|
||||
|
||||
# These variables are automatically filled in by the configure script.
|
||||
prefix="@prefix@"
|
||||
exec_prefix="@exec_prefix@"
|
||||
libdir="@libdir@"
|
||||
includedir="@includedir@"
|
||||
name="@PACKAGE_TARNAME@"
|
||||
version="@PACKAGE_VERSION@"
|
||||
|
||||
gtest_ldflags="-L${libdir}"
|
||||
gtest_libs="-l${name}"
|
||||
gtest_cppflags="-I${includedir}"
|
||||
gtest_cxxflags=""
|
||||
|
||||
show_usage()
|
||||
{
|
||||
cat <<EOF
|
||||
Usage: gtest-config [OPTIONS...]
|
||||
EOF
|
||||
}
|
||||
|
||||
show_help()
|
||||
{
|
||||
show_usage
|
||||
cat <<EOF
|
||||
|
||||
The \`gtest-config' script provides access to the necessary compile and linking
|
||||
flags to connect with Google C++ Testing framework. The installation queries
|
||||
may only be issued one at a time, and may not be issued with any other types of
|
||||
queries. The version queries and compiler flag queries may be combined as
|
||||
desired but not mixed. Different version queries are always combined with "and"
|
||||
logical semantics, and only the last of any particular query is used and all
|
||||
previous ones ignored. All versions must be specified as a sequence of numbers
|
||||
separated by periods. Compiler flag queries output the union of the sets of
|
||||
flags when combined.
|
||||
|
||||
Examples:
|
||||
gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
|
||||
|
||||
gcc \$(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
|
||||
gcc \$(gtest-config --ldflags --libs) -o foo foo.o
|
||||
|
||||
Help:
|
||||
--usage brief usage information
|
||||
--help display this help message
|
||||
|
||||
Installation Queries:
|
||||
--prefix installation prefix
|
||||
--exec-prefix executable installation prefix
|
||||
--libdir library installation directory
|
||||
--includedir header file installation directory
|
||||
--version the version of the INC installation
|
||||
|
||||
Version Queries:
|
||||
--min-version=VERSION return 0 if the version is at least VERSION
|
||||
--exact-version=VERSION return 0 if the version is exactly VERSION
|
||||
--max-version=VERSION return 0 if the version is at most VERSION
|
||||
|
||||
Compilation Flag Queries:
|
||||
--cppflags compile flags specific to the C-like preprocessors
|
||||
--cxxflags compile flags appropriate for C++ programs
|
||||
--ldflags linker flags
|
||||
--libs libraries for linking
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# This function bounds our version with a min and a max. It uses some clever
|
||||
# POSIX-compliant variable expansion to portably do all the work in the shell
|
||||
# and avoid any dependency on a particular "sed" implementation. Notable is
|
||||
# that it will only ever compare the first 3 components of versions. Further
|
||||
# components will be cleanly stripped off. All versions must be unadorned, so
|
||||
# "v1.0" will *not* work. The minimum version must be in $1, and the max in
|
||||
# $2.
|
||||
check_versions()
|
||||
{
|
||||
major_version=${version%%.*}
|
||||
minor_version="0"
|
||||
point_version="0"
|
||||
if test "${version#*.}" != "${version}"; then
|
||||
minor_version=${version#*.}
|
||||
minor_version=${minor_version%%.*}
|
||||
fi
|
||||
if test "${version#*.*.}" != "${version}"; then
|
||||
point_version=${version#*.*.}
|
||||
point_version=${point_version%%.*}
|
||||
fi
|
||||
|
||||
min_version="$1"
|
||||
min_major_version=${min_version%%.*}
|
||||
min_minor_version="0"
|
||||
min_point_version="0"
|
||||
if test "${min_version#*.}" != "${min_version}"; then
|
||||
min_minor_version=${min_version#*.}
|
||||
min_minor_version=${min_minor_version%%.*}
|
||||
fi
|
||||
if test "${min_version#*.*.}" != "${min_version}"; then
|
||||
min_point_version=${min_version#*.*.}
|
||||
min_point_version=${min_point_version%%.*}
|
||||
fi
|
||||
|
||||
max_version="$2"
|
||||
max_major_version=${max_version%%.*}
|
||||
max_minor_version="0"
|
||||
max_point_version="0"
|
||||
if test "${max_version#*.}" != "${max_version}"; then
|
||||
max_minor_version=${max_version#*.}
|
||||
max_minor_version=${max_minor_version%%.*}
|
||||
fi
|
||||
if test "${max_version#*.*.}" != "${max_version}"; then
|
||||
max_point_version=${max_version#*.*.}
|
||||
max_point_version=${max_point_version%%.*}
|
||||
fi
|
||||
|
||||
test $(($major_version)) -lt $(($min_major_version)) && exit 1
|
||||
if test $(($major_version)) -eq $(($min_major_version)); then
|
||||
test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
|
||||
if test $(($minor_version)) -eq $(($min_minor_version)); then
|
||||
test $(($point_version)) -lt $(($min_point_version)) && exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
test $(($major_version)) -gt $(($max_major_version)) && exit 1
|
||||
if test $(($major_version)) -eq $(($max_major_version)); then
|
||||
test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
|
||||
if test $(($minor_version)) -eq $(($max_minor_version)); then
|
||||
test $(($point_version)) -gt $(($max_point_version)) && exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Show the usage line when no arguments are specified.
|
||||
if test $# -eq 0; then
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--usage) show_usage; exit 0;;
|
||||
--help) show_help; exit 0;;
|
||||
--prefix) echo $prefix; exit 0;;
|
||||
--exec-prefix) echo $exec_prefix; exit 0;;
|
||||
--libdir) echo $libdir; exit 0;;
|
||||
--includedir) echo $includedir; exit 0;;
|
||||
--version) echo $version; exit 0;;
|
||||
--min-version=*)
|
||||
do_check_versions=yes
|
||||
min_version=${1#--min-version=}
|
||||
;;
|
||||
--max-version=*)
|
||||
do_check_versions=yes
|
||||
max_version=${1#--max-version=}
|
||||
;;
|
||||
--exact-version=*)
|
||||
do_check_versions=yes
|
||||
exact_version=${1#--exact-version=}
|
||||
;;
|
||||
--cppflags) echo_cppflags=yes;;
|
||||
--cxxflags) echo_cxxflags=yes;;
|
||||
--ldflags) echo_ldflags=yes;;
|
||||
--libs) echo_libs=yes;;
|
||||
|
||||
# Everything else is an error
|
||||
*) show_usage; exit 1;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Do a version check if requested.
|
||||
if test "$do_check_versions" = "yes"; then
|
||||
# Make sure we didn't receive a bad combination of parameters.
|
||||
test "$echo_cppflags" = "yes" && show_usage && exit 1
|
||||
test "$echo_cxxflags" = "yes" && show_usage && exit 1
|
||||
test "$echo_ldflags" = "yes" && show_usage && exit 1
|
||||
test "$echo_libs" = "yes" && show_usage && exit 1
|
||||
|
||||
if test "$exact_version" != ""; then
|
||||
check_versions $exact_version $exact_version
|
||||
# unreachable
|
||||
else
|
||||
check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
|
||||
# unreachable
|
||||
fi
|
||||
fi
|
||||
|
||||
# Do the output in the correct order so that these can be used in-line of
|
||||
# a compiler invocation.
|
||||
output=""
|
||||
test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags"
|
||||
test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags"
|
||||
test "$echo_ldflags" = "yes" && output="$output $gtest_ldflags"
|
||||
test "$echo_libs" = "yes" && output="$output $gtest_libs"
|
||||
echo $output
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,751 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// This file implements death tests.
|
||||
|
||||
#include <gtest/gtest-death-test.h>
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <gtest/gtest-message.h>
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Constants.
|
||||
|
||||
// The default death test style.
|
||||
static const char kDefaultDeathTestStyle[] = "fast";
|
||||
|
||||
GTEST_DEFINE_string(
|
||||
death_test_style,
|
||||
internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
|
||||
"Indicates how to run a death test in a forked child process: "
|
||||
"\"threadsafe\" (child process re-executes the test binary "
|
||||
"from the beginning, running only the specific death test) or "
|
||||
"\"fast\" (child process runs the death test immediately "
|
||||
"after forking).");
|
||||
|
||||
namespace internal {
|
||||
GTEST_DEFINE_string(
|
||||
internal_run_death_test, "",
|
||||
"Indicates the file, line number, temporal index of "
|
||||
"the single death test to run, and a file descriptor to "
|
||||
"which a success code may be sent, all separated by "
|
||||
"colons. This flag is specified if and only if the current "
|
||||
"process is a sub-process launched for running a thread-safe "
|
||||
"death test. FOR INTERNAL USE ONLY.");
|
||||
} // namespace internal
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// ExitedWithCode constructor.
|
||||
ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
|
||||
}
|
||||
|
||||
// ExitedWithCode function-call operator.
|
||||
bool ExitedWithCode::operator()(int exit_status) const {
|
||||
return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
|
||||
}
|
||||
|
||||
// KilledBySignal constructor.
|
||||
KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
|
||||
}
|
||||
|
||||
// KilledBySignal function-call operator.
|
||||
bool KilledBySignal::operator()(int exit_status) const {
|
||||
return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Utilities needed for death tests.
|
||||
|
||||
// Generates a textual description of a given exit code, in the format
|
||||
// specified by wait(2).
|
||||
static String ExitSummary(int exit_code) {
|
||||
Message m;
|
||||
if (WIFEXITED(exit_code)) {
|
||||
m << "Exited with exit status " << WEXITSTATUS(exit_code);
|
||||
} else if (WIFSIGNALED(exit_code)) {
|
||||
m << "Terminated by signal " << WTERMSIG(exit_code);
|
||||
}
|
||||
#ifdef WCOREDUMP
|
||||
if (WCOREDUMP(exit_code)) {
|
||||
m << " (core dumped)";
|
||||
}
|
||||
#endif
|
||||
return m.GetString();
|
||||
}
|
||||
|
||||
// Returns true if exit_status describes a process that was terminated
|
||||
// by a signal, or exited normally with a nonzero exit code.
|
||||
bool ExitedUnsuccessfully(int exit_status) {
|
||||
return !ExitedWithCode(0)(exit_status);
|
||||
}
|
||||
|
||||
// Generates a textual failure message when a death test finds more than
|
||||
// one thread running, or cannot determine the number of threads, prior
|
||||
// to executing the given statement. It is the responsibility of the
|
||||
// caller not to pass a thread_count of 1.
|
||||
static String DeathTestThreadWarning(size_t thread_count) {
|
||||
Message msg;
|
||||
msg << "Death tests use fork(), which is unsafe particularly"
|
||||
<< " in a threaded context. For this test, " << GTEST_NAME << " ";
|
||||
if (thread_count == 0)
|
||||
msg << "couldn't detect the number of threads.";
|
||||
else
|
||||
msg << "detected " << thread_count << " threads.";
|
||||
return msg.GetString();
|
||||
}
|
||||
|
||||
// Static string containing a description of the outcome of the
|
||||
// last death test.
|
||||
static String last_death_test_message;
|
||||
|
||||
// Flag characters for reporting a death test that did not die.
|
||||
static const char kDeathTestLived = 'L';
|
||||
static const char kDeathTestReturned = 'R';
|
||||
static const char kDeathTestInternalError = 'I';
|
||||
|
||||
// An enumeration describing all of the possible ways that a death test
|
||||
// can conclude. DIED means that the process died while executing the
|
||||
// test code; LIVED means that process lived beyond the end of the test
|
||||
// code; and RETURNED means that the test statement attempted a "return,"
|
||||
// which is not allowed. IN_PROGRESS means the test has not yet
|
||||
// concluded.
|
||||
enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED };
|
||||
|
||||
// Routine for aborting the program which is safe to call from an
|
||||
// exec-style death test child process, in which case the the error
|
||||
// message is propagated back to the parent process. Otherwise, the
|
||||
// message is simply printed to stderr. In either case, the program
|
||||
// then exits with status 1.
|
||||
void DeathTestAbort(const char* format, ...) {
|
||||
// This function may be called from a threadsafe-style death test
|
||||
// child process, which operates on a very small stack. Use the
|
||||
// heap for any additional non-miniscule memory requirements.
|
||||
const InternalRunDeathTestFlag* const flag =
|
||||
GetUnitTestImpl()->internal_run_death_test_flag();
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
if (flag != NULL) {
|
||||
FILE* parent = fdopen(flag->status_fd, "w");
|
||||
fputc(kDeathTestInternalError, parent);
|
||||
vfprintf(parent, format, args);
|
||||
fclose(parent);
|
||||
va_end(args);
|
||||
_exit(1);
|
||||
} else {
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
// A replacement for CHECK that calls DeathTestAbort if the assertion
|
||||
// fails.
|
||||
#define GTEST_DEATH_TEST_CHECK(expression) \
|
||||
do { \
|
||||
if (!(expression)) { \
|
||||
DeathTestAbort("CHECK failed: File %s, line %d: %s", \
|
||||
__FILE__, __LINE__, #expression); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// This macro is similar to GTEST_DEATH_TEST_CHECK, but it is meant for
|
||||
// evaluating any system call that fulfills two conditions: it must return
|
||||
// -1 on failure, and set errno to EINTR when it is interrupted and
|
||||
// should be tried again. The macro expands to a loop that repeatedly
|
||||
// evaluates the expression as long as it evaluates to -1 and sets
|
||||
// errno to EINTR. If the expression evaluates to -1 but errno is
|
||||
// something other than EINTR, DeathTestAbort is called.
|
||||
#define GTEST_DEATH_TEST_CHECK_SYSCALL(expression) \
|
||||
do { \
|
||||
int retval; \
|
||||
do { \
|
||||
retval = (expression); \
|
||||
} while (retval == -1 && errno == EINTR); \
|
||||
if (retval == -1) { \
|
||||
DeathTestAbort("CHECK failed: File %s, line %d: %s != -1", \
|
||||
__FILE__, __LINE__, #expression); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// Death test constructor. Increments the running death test count
|
||||
// for the current test.
|
||||
DeathTest::DeathTest() {
|
||||
TestInfo* const info = GetUnitTestImpl()->current_test_info();
|
||||
if (info == NULL) {
|
||||
DeathTestAbort("Cannot run a death test outside of a TEST or "
|
||||
"TEST_F construct");
|
||||
}
|
||||
}
|
||||
|
||||
// Creates and returns a death test by dispatching to the current
|
||||
// death test factory.
|
||||
bool DeathTest::Create(const char* statement, const RE* regex,
|
||||
const char* file, int line, DeathTest** test) {
|
||||
return GetUnitTestImpl()->death_test_factory()->Create(
|
||||
statement, regex, file, line, test);
|
||||
}
|
||||
|
||||
const char* DeathTest::LastMessage() {
|
||||
return last_death_test_message.c_str();
|
||||
}
|
||||
|
||||
// ForkingDeathTest provides implementations for most of the abstract
|
||||
// methods of the DeathTest interface. Only the AssumeRole method is
|
||||
// left undefined.
|
||||
class ForkingDeathTest : public DeathTest {
|
||||
public:
|
||||
ForkingDeathTest(const char* statement, const RE* regex);
|
||||
|
||||
// All of these virtual functions are inherited from DeathTest.
|
||||
virtual int Wait();
|
||||
virtual bool Passed(bool status_ok);
|
||||
virtual void Abort(AbortReason reason);
|
||||
|
||||
protected:
|
||||
void set_forked(bool forked) { forked_ = forked; }
|
||||
void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
|
||||
void set_read_fd(int fd) { read_fd_ = fd; }
|
||||
void set_write_fd(int fd) { write_fd_ = fd; }
|
||||
|
||||
private:
|
||||
// The textual content of the code this object is testing.
|
||||
const char* const statement_;
|
||||
// The regular expression which test output must match.
|
||||
const RE* const regex_;
|
||||
// True if the death test successfully forked.
|
||||
bool forked_;
|
||||
// PID of child process during death test; 0 in the child process itself.
|
||||
pid_t child_pid_;
|
||||
// File descriptors for communicating the death test's status byte.
|
||||
int read_fd_; // Always -1 in the child process.
|
||||
int write_fd_; // Always -1 in the parent process.
|
||||
// The exit status of the child process.
|
||||
int status_;
|
||||
// How the death test concluded.
|
||||
DeathTestOutcome outcome_;
|
||||
};
|
||||
|
||||
// Constructs a ForkingDeathTest.
|
||||
ForkingDeathTest::ForkingDeathTest(const char* statement, const RE* regex)
|
||||
: DeathTest(),
|
||||
statement_(statement),
|
||||
regex_(regex),
|
||||
forked_(false),
|
||||
child_pid_(-1),
|
||||
read_fd_(-1),
|
||||
write_fd_(-1),
|
||||
status_(-1),
|
||||
outcome_(IN_PROGRESS) {
|
||||
}
|
||||
|
||||
// Reads an internal failure message from a file descriptor, then calls
|
||||
// LOG(FATAL) with that message. Called from a death test parent process
|
||||
// to read a failure message from the death test child process.
|
||||
static void FailFromInternalError(int fd) {
|
||||
Message error;
|
||||
char buffer[256];
|
||||
ssize_t num_read;
|
||||
|
||||
do {
|
||||
while ((num_read = read(fd, buffer, 255)) > 0) {
|
||||
buffer[num_read] = '\0';
|
||||
error << buffer;
|
||||
}
|
||||
} while (num_read == -1 && errno == EINTR);
|
||||
|
||||
// TODO(smcafee): Maybe just FAIL the test instead?
|
||||
if (num_read == 0) {
|
||||
GTEST_LOG(FATAL, error);
|
||||
} else {
|
||||
GTEST_LOG(FATAL,
|
||||
Message() << "Error while reading death test internal: "
|
||||
<< strerror(errno) << " [" << errno << "]");
|
||||
}
|
||||
}
|
||||
|
||||
// Waits for the child in a death test to exit, returning its exit
|
||||
// status, or 0 if no child process exists. As a side effect, sets the
|
||||
// outcome data member.
|
||||
int ForkingDeathTest::Wait() {
|
||||
if (!forked_)
|
||||
return 0;
|
||||
|
||||
// The read() here blocks until data is available (signifying the
|
||||
// failure of the death test) or until the pipe is closed (signifying
|
||||
// its success), so it's okay to call this in the parent before
|
||||
// the child process has exited.
|
||||
char flag;
|
||||
ssize_t bytes_read;
|
||||
|
||||
do {
|
||||
bytes_read = read(read_fd_, &flag, 1);
|
||||
} while (bytes_read == -1 && errno == EINTR);
|
||||
|
||||
if (bytes_read == 0) {
|
||||
outcome_ = DIED;
|
||||
} else if (bytes_read == 1) {
|
||||
switch (flag) {
|
||||
case kDeathTestReturned:
|
||||
outcome_ = RETURNED;
|
||||
break;
|
||||
case kDeathTestLived:
|
||||
outcome_ = LIVED;
|
||||
break;
|
||||
case kDeathTestInternalError:
|
||||
FailFromInternalError(read_fd_); // Does not return.
|
||||
break;
|
||||
default:
|
||||
GTEST_LOG(FATAL,
|
||||
Message() << "Death test child process reported unexpected "
|
||||
<< "status byte (" << static_cast<unsigned int>(flag)
|
||||
<< ")");
|
||||
}
|
||||
} else {
|
||||
GTEST_LOG(FATAL,
|
||||
Message() << "Read from death test child process failed: "
|
||||
<< strerror(errno));
|
||||
}
|
||||
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(read_fd_));
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(waitpid(child_pid_, &status_, 0));
|
||||
return status_;
|
||||
}
|
||||
|
||||
// Assesses the success or failure of a death test, using both private
|
||||
// members which have previously been set, and one argument:
|
||||
//
|
||||
// Private data members:
|
||||
// outcome: an enumeration describing how the death test
|
||||
// concluded: DIED, LIVED, or RETURNED. The death test fails
|
||||
// in the latter two cases
|
||||
// status: the exit status of the child process, in the format
|
||||
// specified by wait(2)
|
||||
// regex: a regular expression object to be applied to
|
||||
// the test's captured standard error output; the death test
|
||||
// fails if it does not match
|
||||
//
|
||||
// Argument:
|
||||
// status_ok: true if exit_status is acceptable in the context of
|
||||
// this particular death test, which fails if it is false
|
||||
//
|
||||
// Returns true iff all of the above conditions are met. Otherwise, the
|
||||
// first failing condition, in the order given above, is the one that is
|
||||
// reported. Also sets the static variable last_death_test_message.
|
||||
bool ForkingDeathTest::Passed(bool status_ok) {
|
||||
if (!forked_)
|
||||
return false;
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
const ::string error_message = GetCapturedStderr();
|
||||
#else
|
||||
const ::std::string error_message = GetCapturedStderr();
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
bool success = false;
|
||||
Message buffer;
|
||||
|
||||
buffer << "Death test: " << statement_ << "\n";
|
||||
switch (outcome_) {
|
||||
case LIVED:
|
||||
buffer << " Result: failed to die.\n"
|
||||
<< " Error msg: " << error_message;
|
||||
break;
|
||||
case RETURNED:
|
||||
buffer << " Result: illegal return in test statement.\n"
|
||||
<< " Error msg: " << error_message;
|
||||
break;
|
||||
case DIED:
|
||||
if (status_ok) {
|
||||
if (RE::PartialMatch(error_message, *regex_)) {
|
||||
success = true;
|
||||
} else {
|
||||
buffer << " Result: died but not with expected error.\n"
|
||||
<< " Expected: " << regex_->pattern() << "\n"
|
||||
<< "Actual msg: " << error_message;
|
||||
}
|
||||
} else {
|
||||
buffer << " Result: died but not with expected exit code:\n"
|
||||
<< " " << ExitSummary(status_) << "\n";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
GTEST_LOG(FATAL,
|
||||
"DeathTest::Passed somehow called before conclusion of test");
|
||||
}
|
||||
|
||||
last_death_test_message = buffer.GetString();
|
||||
return success;
|
||||
}
|
||||
|
||||
// Signals that the death test code which should have exited, didn't.
|
||||
// Should be called only in a death test child process.
|
||||
// Writes a status byte to the child's status file desriptor, then
|
||||
// calls _exit(1).
|
||||
void ForkingDeathTest::Abort(AbortReason reason) {
|
||||
// The parent process considers the death test to be a failure if
|
||||
// it finds any data in our pipe. So, here we write a single flag byte
|
||||
// to the pipe, then exit.
|
||||
const char flag =
|
||||
reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned;
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(write(write_fd_, &flag, 1));
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(write_fd_));
|
||||
_exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
|
||||
}
|
||||
|
||||
// A concrete death test class that forks, then immediately runs the test
|
||||
// in the child process.
|
||||
class NoExecDeathTest : public ForkingDeathTest {
|
||||
public:
|
||||
NoExecDeathTest(const char* statement, const RE* regex) :
|
||||
ForkingDeathTest(statement, regex) { }
|
||||
virtual TestRole AssumeRole();
|
||||
};
|
||||
|
||||
// The AssumeRole process for a fork-and-run death test. It implements a
|
||||
// straightforward fork, with a simple pipe to transmit the status byte.
|
||||
DeathTest::TestRole NoExecDeathTest::AssumeRole() {
|
||||
const size_t thread_count = GetThreadCount();
|
||||
if (thread_count != 1) {
|
||||
GTEST_LOG(WARNING, DeathTestThreadWarning(thread_count));
|
||||
}
|
||||
|
||||
int pipe_fd[2];
|
||||
GTEST_DEATH_TEST_CHECK(pipe(pipe_fd) != -1);
|
||||
|
||||
last_death_test_message = "";
|
||||
CaptureStderr();
|
||||
// When we fork the process below, the log file buffers are copied, but the
|
||||
// file descriptors are shared. We flush all log files here so that closing
|
||||
// the file descriptors in the child process doesn't throw off the
|
||||
// synchronization between descriptors and buffers in the parent process.
|
||||
// This is as close to the fork as possible to avoid a race condition in case
|
||||
// there are multiple threads running before the death test, and another
|
||||
// thread writes to the log file.
|
||||
FlushInfoLog();
|
||||
|
||||
const pid_t child_pid = fork();
|
||||
GTEST_DEATH_TEST_CHECK(child_pid != -1);
|
||||
set_child_pid(child_pid);
|
||||
if (child_pid == 0) {
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[0]));
|
||||
set_write_fd(pipe_fd[1]);
|
||||
// Redirects all logging to stderr in the child process to prevent
|
||||
// concurrent writes to the log files. We capture stderr in the parent
|
||||
// process and append the child process' output to a log.
|
||||
LogToStderr();
|
||||
return EXECUTE_TEST;
|
||||
} else {
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[1]));
|
||||
set_read_fd(pipe_fd[0]);
|
||||
set_forked(true);
|
||||
return OVERSEE_TEST;
|
||||
}
|
||||
}
|
||||
|
||||
// A concrete death test class that forks and re-executes the main
|
||||
// program from the beginning, with command-line flags set that cause
|
||||
// only this specific death test to be run.
|
||||
class ExecDeathTest : public ForkingDeathTest {
|
||||
public:
|
||||
ExecDeathTest(const char* statement, const RE* regex,
|
||||
const char* file, int line) :
|
||||
ForkingDeathTest(statement, regex), file_(file), line_(line) { }
|
||||
virtual TestRole AssumeRole();
|
||||
private:
|
||||
// The name of the file in which the death test is located.
|
||||
const char* const file_;
|
||||
// The line number on which the death test is located.
|
||||
const int line_;
|
||||
};
|
||||
|
||||
// Utility class for accumulating command-line arguments.
|
||||
class Arguments {
|
||||
public:
|
||||
Arguments() {
|
||||
args_.push_back(NULL);
|
||||
}
|
||||
~Arguments() {
|
||||
for (std::vector<char*>::iterator i = args_.begin();
|
||||
i + 1 != args_.end();
|
||||
++i) {
|
||||
free(*i);
|
||||
}
|
||||
}
|
||||
void AddArgument(const char* argument) {
|
||||
args_.insert(args_.end() - 1, strdup(argument));
|
||||
}
|
||||
|
||||
template <typename Str>
|
||||
void AddArguments(const ::std::vector<Str>& arguments) {
|
||||
for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
|
||||
i != arguments.end();
|
||||
++i) {
|
||||
args_.insert(args_.end() - 1, strdup(i->c_str()));
|
||||
}
|
||||
}
|
||||
char* const* Argv() {
|
||||
return &args_[0];
|
||||
}
|
||||
private:
|
||||
std::vector<char*> args_;
|
||||
};
|
||||
|
||||
// A struct that encompasses the arguments to the child process of a
|
||||
// threadsafe-style death test process.
|
||||
struct ExecDeathTestArgs {
|
||||
char* const* argv; // Command-line arguments for the child's call to exec
|
||||
int close_fd; // File descriptor to close; the read end of a pipe
|
||||
};
|
||||
|
||||
// The main function for a threadsafe-style death test child process.
|
||||
static int ExecDeathTestChildMain(void* child_arg) {
|
||||
ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(args->close_fd));
|
||||
execve(args->argv[0], args->argv, environ);
|
||||
DeathTestAbort("execve failed: %s", strerror(errno));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Two utility routines that together determine the direction the stack
|
||||
// grows.
|
||||
// This could be accomplished more elegantly by a single recursive
|
||||
// function, but we want to guard against the unlikely possibility of
|
||||
// a smart compiler optimizing the recursion away.
|
||||
static bool StackLowerThanAddress(const void* ptr) {
|
||||
int dummy;
|
||||
return &dummy < ptr;
|
||||
}
|
||||
|
||||
static bool StackGrowsDown() {
|
||||
int dummy;
|
||||
return StackLowerThanAddress(&dummy);
|
||||
}
|
||||
|
||||
// A threadsafe implementation of fork(2) for threadsafe-style death tests
|
||||
// that uses clone(2). It dies with an error message if anything goes
|
||||
// wrong.
|
||||
static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
|
||||
static const bool stack_grows_down = StackGrowsDown();
|
||||
const size_t stack_size = getpagesize();
|
||||
void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
GTEST_DEATH_TEST_CHECK(stack != MAP_FAILED);
|
||||
void* const stack_top =
|
||||
static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
|
||||
ExecDeathTestArgs args = { argv, close_fd };
|
||||
const pid_t child_pid = clone(&ExecDeathTestChildMain, stack_top,
|
||||
SIGCHLD, &args);
|
||||
GTEST_DEATH_TEST_CHECK(child_pid != -1);
|
||||
GTEST_DEATH_TEST_CHECK(munmap(stack, stack_size) != -1);
|
||||
return child_pid;
|
||||
}
|
||||
|
||||
// The AssumeRole process for a fork-and-exec death test. It re-executes the
|
||||
// main program from the beginning, setting the --gtest_filter
|
||||
// and --gtest_internal_run_death_test flags to cause only the current
|
||||
// death test to be re-run.
|
||||
DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
||||
const UnitTestImpl* const impl = GetUnitTestImpl();
|
||||
const InternalRunDeathTestFlag* const flag =
|
||||
impl->internal_run_death_test_flag();
|
||||
const TestInfo* const info = impl->current_test_info();
|
||||
const int death_test_index = info->result()->death_test_count();
|
||||
|
||||
if (flag != NULL) {
|
||||
set_write_fd(flag->status_fd);
|
||||
return EXECUTE_TEST;
|
||||
}
|
||||
|
||||
int pipe_fd[2];
|
||||
GTEST_DEATH_TEST_CHECK(pipe(pipe_fd) != -1);
|
||||
// Clear the close-on-exec flag on the write end of the pipe, lest
|
||||
// it be closed when the child process does an exec:
|
||||
GTEST_DEATH_TEST_CHECK(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
|
||||
|
||||
const String filter_flag =
|
||||
String::Format("--%s%s=%s.%s",
|
||||
GTEST_FLAG_PREFIX, kFilterFlag,
|
||||
info->test_case_name(), info->name());
|
||||
const String internal_flag =
|
||||
String::Format("--%s%s=%s:%d:%d:%d",
|
||||
GTEST_FLAG_PREFIX, kInternalRunDeathTestFlag, file_, line_,
|
||||
death_test_index, pipe_fd[1]);
|
||||
Arguments args;
|
||||
args.AddArguments(GetArgvs());
|
||||
args.AddArgument("--logtostderr");
|
||||
args.AddArgument(filter_flag.c_str());
|
||||
args.AddArgument(internal_flag.c_str());
|
||||
|
||||
last_death_test_message = "";
|
||||
|
||||
CaptureStderr();
|
||||
// See the comment in NoExecDeathTest::AssumeRole for why the next line
|
||||
// is necessary.
|
||||
FlushInfoLog();
|
||||
|
||||
const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL(close(pipe_fd[1]));
|
||||
set_child_pid(child_pid);
|
||||
set_read_fd(pipe_fd[0]);
|
||||
set_forked(true);
|
||||
return OVERSEE_TEST;
|
||||
}
|
||||
|
||||
// Creates a concrete DeathTest-derived class that depends on the
|
||||
// --gtest_death_test_style flag, and sets the pointer pointed to
|
||||
// by the "test" argument to its address. If the test should be
|
||||
// skipped, sets that pointer to NULL. Returns true, unless the
|
||||
// flag is set to an invalid value.
|
||||
bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
|
||||
const char* file, int line,
|
||||
DeathTest** test) {
|
||||
UnitTestImpl* const impl = GetUnitTestImpl();
|
||||
const InternalRunDeathTestFlag* const flag =
|
||||
impl->internal_run_death_test_flag();
|
||||
const int death_test_index = impl->current_test_info()
|
||||
->increment_death_test_count();
|
||||
|
||||
if (flag != NULL) {
|
||||
if (death_test_index > flag->index) {
|
||||
last_death_test_message = String::Format(
|
||||
"Death test count (%d) somehow exceeded expected maximum (%d)",
|
||||
death_test_index, flag->index);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(flag->file == file && flag->line == line &&
|
||||
flag->index == death_test_index)) {
|
||||
*test = NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (GTEST_FLAG(death_test_style) == "threadsafe") {
|
||||
*test = new ExecDeathTest(statement, regex, file, line);
|
||||
} else if (GTEST_FLAG(death_test_style) == "fast") {
|
||||
*test = new NoExecDeathTest(statement, regex);
|
||||
} else {
|
||||
last_death_test_message = String::Format(
|
||||
"Unknown death test style \"%s\" encountered",
|
||||
GTEST_FLAG(death_test_style).c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Splits a given string on a given delimiter, populating a given
|
||||
// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
|
||||
// ::std::string, so we can use it here.
|
||||
static void SplitString(const ::std::string& str, char delimiter,
|
||||
::std::vector< ::std::string>* dest) {
|
||||
::std::vector< ::std::string> parsed;
|
||||
::std::string::size_type pos = 0;
|
||||
while (true) {
|
||||
const ::std::string::size_type colon = str.find(':', pos);
|
||||
if (colon == ::std::string::npos) {
|
||||
parsed.push_back(str.substr(pos));
|
||||
break;
|
||||
} else {
|
||||
parsed.push_back(str.substr(pos, colon - pos));
|
||||
pos = colon + 1;
|
||||
}
|
||||
}
|
||||
dest->swap(parsed);
|
||||
}
|
||||
|
||||
// Attempts to parse a string into a positive integer. Returns true
|
||||
// if that is possible. GTEST_HAS_DEATH_TEST implies that we have
|
||||
// ::std::string, so we can use it here.
|
||||
static bool ParsePositiveInt(const ::std::string& str, int* number) {
|
||||
// Fail fast if the given string does not begin with a digit;
|
||||
// this bypasses strtol's "optional leading whitespace and plus
|
||||
// or minus sign" semantics, which are undesirable here.
|
||||
if (str.empty() || !isdigit(str[0])) {
|
||||
return false;
|
||||
}
|
||||
char* endptr;
|
||||
const long parsed = strtol(str.c_str(), &endptr, 10); // NOLINT
|
||||
if (*endptr == '\0' && parsed <= INT_MAX) {
|
||||
*number = static_cast<int>(parsed);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a newly created InternalRunDeathTestFlag object with fields
|
||||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
|
||||
// the flag is specified; otherwise returns NULL.
|
||||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
|
||||
if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
|
||||
|
||||
InternalRunDeathTestFlag* const internal_run_death_test_flag =
|
||||
new InternalRunDeathTestFlag;
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
|
||||
// can use it here.
|
||||
::std::vector< ::std::string> fields;
|
||||
SplitString(GTEST_FLAG(internal_run_death_test).c_str(), ':', &fields);
|
||||
if (fields.size() != 4
|
||||
|| !ParsePositiveInt(fields[1], &internal_run_death_test_flag->line)
|
||||
|| !ParsePositiveInt(fields[2], &internal_run_death_test_flag->index)
|
||||
|| !ParsePositiveInt(fields[3],
|
||||
&internal_run_death_test_flag->status_fd)) {
|
||||
DeathTestAbort("Bad --gtest_internal_run_death_test flag: %s",
|
||||
GTEST_FLAG(internal_run_death_test).c_str());
|
||||
}
|
||||
internal_run_death_test_flag->file = fields[0].c_str();
|
||||
return internal_run_death_test_flag;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
} // namespace testing
|
||||
@@ -0,0 +1,208 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: keith.ray@gmail.com (Keith Ray)
|
||||
|
||||
#include <gtest/internal/gtest-filepath.h>
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#endif // _WIN32
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
const char kPathSeparator = '\\';
|
||||
const char kPathSeparatorString[] = "\\";
|
||||
const char kCurrentDirectoryString[] = ".\\";
|
||||
#else
|
||||
const char kPathSeparator = '/';
|
||||
const char kPathSeparatorString[] = "/";
|
||||
const char kCurrentDirectoryString[] = "./";
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Returns a copy of the FilePath with the case-insensitive extension removed.
|
||||
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
|
||||
// FilePath("dir/file"). If a case-insensitive extension is not
|
||||
// found, returns a copy of the original FilePath.
|
||||
FilePath FilePath::RemoveExtension(const char* extension) const {
|
||||
String dot_extension(String::Format(".%s", extension));
|
||||
if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
|
||||
return FilePath(String(pathname_.c_str(), pathname_.GetLength() - 4));
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Returns a copy of the FilePath with the directory part removed.
|
||||
// Example: FilePath("path/to/file").RemoveDirectoryName() returns
|
||||
// FilePath("file"). If there is no directory part ("just_a_file"), it returns
|
||||
// the FilePath unmodified. If there is no file part ("just_a_dir/") it
|
||||
// returns an empty FilePath ("").
|
||||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
||||
FilePath FilePath::RemoveDirectoryName() const {
|
||||
const char* const last_sep = strrchr(c_str(), kPathSeparator);
|
||||
return last_sep ? FilePath(String(last_sep + 1)) : *this;
|
||||
}
|
||||
|
||||
// RemoveFileName returns the directory path with the filename removed.
|
||||
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
|
||||
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
|
||||
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
|
||||
// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
|
||||
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
||||
FilePath FilePath::RemoveFileName() const {
|
||||
const char* const last_sep = strrchr(c_str(), kPathSeparator);
|
||||
return FilePath(last_sep ? String(c_str(), last_sep + 1 - c_str())
|
||||
: String(kCurrentDirectoryString));
|
||||
}
|
||||
|
||||
// Helper functions for naming files in a directory for xml output.
|
||||
|
||||
// Given directory = "dir", base_name = "test", number = 0,
|
||||
// extension = "xml", returns "dir/test.xml". If number is greater
|
||||
// than zero (e.g., 12), returns "dir/test_12.xml".
|
||||
// On Windows platform, uses \ as the separator rather than /.
|
||||
FilePath FilePath::MakeFileName(const FilePath& directory,
|
||||
const FilePath& base_name,
|
||||
int number,
|
||||
const char* extension) {
|
||||
FilePath dir(directory.RemoveTrailingPathSeparator());
|
||||
if (number == 0) {
|
||||
return FilePath(String::Format("%s%c%s.%s", dir.c_str(), kPathSeparator,
|
||||
base_name.c_str(), extension));
|
||||
}
|
||||
return FilePath(String::Format("%s%c%s_%d.%s", dir.c_str(), kPathSeparator,
|
||||
base_name.c_str(), number, extension));
|
||||
}
|
||||
|
||||
// Returns true if pathname describes something findable in the file-system,
|
||||
// either a file, directory, or whatever.
|
||||
bool FilePath::FileOrDirectoryExists() const {
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
struct _stat file_stat = {};
|
||||
return _stat(pathname_.c_str(), &file_stat) == 0;
|
||||
#else
|
||||
struct stat file_stat = {};
|
||||
return stat(pathname_.c_str(), &file_stat) == 0;
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
// Returns true if pathname describes a directory in the file-system
|
||||
// that exists.
|
||||
bool FilePath::DirectoryExists() const {
|
||||
bool result = false;
|
||||
#ifdef _WIN32
|
||||
FilePath removed_sep(this->RemoveTrailingPathSeparator());
|
||||
struct _stat file_stat = {};
|
||||
result = _stat(removed_sep.c_str(), &file_stat) == 0 &&
|
||||
(_S_IFDIR & file_stat.st_mode) != 0;
|
||||
#else
|
||||
struct stat file_stat = {};
|
||||
result = stat(pathname_.c_str(), &file_stat) == 0 &&
|
||||
S_ISDIR(file_stat.st_mode);
|
||||
#endif // _WIN32
|
||||
return result;
|
||||
}
|
||||
|
||||
// Returns a pathname for a file that does not currently exist. The pathname
|
||||
// will be directory/base_name.extension or
|
||||
// directory/base_name_<number>.extension if directory/base_name.extension
|
||||
// already exists. The number will be incremented until a pathname is found
|
||||
// that does not already exist.
|
||||
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
|
||||
// There could be a race condition if two or more processes are calling this
|
||||
// function at the same time -- they could both pick the same filename.
|
||||
FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
|
||||
const FilePath& base_name,
|
||||
const char* extension) {
|
||||
FilePath full_pathname;
|
||||
int number = 0;
|
||||
do {
|
||||
full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
|
||||
} while (full_pathname.FileOrDirectoryExists());
|
||||
return full_pathname;
|
||||
}
|
||||
|
||||
// Returns true if FilePath ends with a path separator, which indicates that
|
||||
// it is intended to represent a directory. Returns false otherwise.
|
||||
// This does NOT check that a directory (or file) actually exists.
|
||||
bool FilePath::IsDirectory() const {
|
||||
return pathname_.EndsWith(kPathSeparatorString);
|
||||
}
|
||||
|
||||
// Create directories so that path exists. Returns true if successful or if
|
||||
// the directories already exist; returns false if unable to create directories
|
||||
// for any reason.
|
||||
bool FilePath::CreateDirectoriesRecursively() const {
|
||||
if (!this->IsDirectory()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pathname_.GetLength() == 0 || this->DirectoryExists()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
|
||||
return parent.CreateDirectoriesRecursively() && this->CreateFolder();
|
||||
}
|
||||
|
||||
// Create the directory so that path exists. Returns true if successful or
|
||||
// if the directory already exists; returns false if unable to create the
|
||||
// directory for any reason, including if the parent directory does not
|
||||
// exist. Not named "CreateDirectory" because that's a macro on Windows.
|
||||
bool FilePath::CreateFolder() const {
|
||||
#ifdef _WIN32
|
||||
int result = _mkdir(pathname_.c_str());
|
||||
#else
|
||||
int result = mkdir(pathname_.c_str(), 0777);
|
||||
#endif // _WIN32
|
||||
if (result == -1) {
|
||||
return this->DirectoryExists(); // An error is OK if the directory exists.
|
||||
}
|
||||
return true; // No error.
|
||||
}
|
||||
|
||||
// If input name has a trailing separator character, remove it and return the
|
||||
// name, otherwise return the name string unmodified.
|
||||
// On Windows platform, uses \ as the separator, other platforms use /.
|
||||
FilePath FilePath::RemoveTrailingPathSeparator() const {
|
||||
return pathname_.EndsWith(kPathSeparatorString)
|
||||
? FilePath(String(pathname_.c_str(), pathname_.GetLength() - 1))
|
||||
: *this;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
@@ -0,0 +1,1118 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Utility functions and classes used by the Google C++ testing framework.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// This file contains purely Google Test's internal implementation. Please
|
||||
// DO NOT #INCLUDE IT IN A USER PROGRAM.
|
||||
|
||||
#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
|
||||
#define GTEST_SRC_GTEST_INTERNAL_INL_H_
|
||||
|
||||
// GTEST_IMPLEMENTATION is defined iff the current translation unit is
|
||||
// part of Google Test's implementation.
|
||||
#ifndef GTEST_IMPLEMENTATION
|
||||
// A user is trying to include this from his code - just say no.
|
||||
#error "gtest-internal-inl.h is part of Google Test's internal implementation."
|
||||
#error "It must not be included except by Google Test itself."
|
||||
#endif // GTEST_IMPLEMENTATION
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <windows.h> // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#include <ostream> // NOLINT
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Declares the flags.
|
||||
//
|
||||
// We don't want the users to modify these flags in the code, but want
|
||||
// Google Test's own unit tests to be able to access them. Therefore we
|
||||
// declare them here as opposed to in gtest.h.
|
||||
GTEST_DECLARE_bool(break_on_failure);
|
||||
GTEST_DECLARE_bool(catch_exceptions);
|
||||
GTEST_DECLARE_string(color);
|
||||
GTEST_DECLARE_string(filter);
|
||||
GTEST_DECLARE_bool(list_tests);
|
||||
GTEST_DECLARE_string(output);
|
||||
GTEST_DECLARE_int32(repeat);
|
||||
GTEST_DECLARE_int32(stack_trace_depth);
|
||||
GTEST_DECLARE_bool(show_internal_stack_frames);
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Names of the flags (needed for parsing Google Test flags).
|
||||
const char kBreakOnFailureFlag[] = "break_on_failure";
|
||||
const char kCatchExceptionsFlag[] = "catch_exceptions";
|
||||
const char kFilterFlag[] = "filter";
|
||||
const char kListTestsFlag[] = "list_tests";
|
||||
const char kOutputFlag[] = "output";
|
||||
const char kColorFlag[] = "color";
|
||||
const char kRepeatFlag[] = "repeat";
|
||||
|
||||
// This class saves the values of all Google Test flags in its c'tor, and
|
||||
// restores them in its d'tor.
|
||||
class GTestFlagSaver {
|
||||
public:
|
||||
// The c'tor.
|
||||
GTestFlagSaver() {
|
||||
break_on_failure_ = GTEST_FLAG(break_on_failure);
|
||||
catch_exceptions_ = GTEST_FLAG(catch_exceptions);
|
||||
color_ = GTEST_FLAG(color);
|
||||
death_test_style_ = GTEST_FLAG(death_test_style);
|
||||
filter_ = GTEST_FLAG(filter);
|
||||
internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
|
||||
list_tests_ = GTEST_FLAG(list_tests);
|
||||
output_ = GTEST_FLAG(output);
|
||||
repeat_ = GTEST_FLAG(repeat);
|
||||
}
|
||||
|
||||
// The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
|
||||
~GTestFlagSaver() {
|
||||
GTEST_FLAG(break_on_failure) = break_on_failure_;
|
||||
GTEST_FLAG(catch_exceptions) = catch_exceptions_;
|
||||
GTEST_FLAG(color) = color_;
|
||||
GTEST_FLAG(death_test_style) = death_test_style_;
|
||||
GTEST_FLAG(filter) = filter_;
|
||||
GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
|
||||
GTEST_FLAG(list_tests) = list_tests_;
|
||||
GTEST_FLAG(output) = output_;
|
||||
GTEST_FLAG(repeat) = repeat_;
|
||||
}
|
||||
private:
|
||||
// Fields for saving the original values of flags.
|
||||
bool break_on_failure_;
|
||||
bool catch_exceptions_;
|
||||
String color_;
|
||||
String death_test_style_;
|
||||
String filter_;
|
||||
String internal_run_death_test_;
|
||||
bool list_tests_;
|
||||
String output_;
|
||||
bool pretty_;
|
||||
internal::Int32 repeat_;
|
||||
} GTEST_ATTRIBUTE_UNUSED;
|
||||
|
||||
// Converts a Unicode code-point to its UTF-8 encoding.
|
||||
String ToUtf8String(wchar_t wchar);
|
||||
|
||||
// Returns the number of active threads, or 0 when there is an error.
|
||||
size_t GetThreadCount();
|
||||
|
||||
// List is a simple singly-linked list container.
|
||||
//
|
||||
// We cannot use std::list as Microsoft's implementation of STL has
|
||||
// problems when exception is disabled. There is a hack to work
|
||||
// around this, but we've seen cases where the hack fails to work.
|
||||
//
|
||||
// TODO(wan): switch to std::list when we have a reliable fix for the
|
||||
// STL problem, e.g. when we upgrade to the next version of Visual
|
||||
// C++, or (more likely) switch to STLport.
|
||||
//
|
||||
// The element type must support copy constructor.
|
||||
|
||||
// Forward declare List
|
||||
template <typename E> // E is the element type.
|
||||
class List;
|
||||
|
||||
// ListNode is a node in a singly-linked list. It consists of an
|
||||
// element and a pointer to the next node. The last node in the list
|
||||
// has a NULL value for its next pointer.
|
||||
template <typename E> // E is the element type.
|
||||
class ListNode {
|
||||
friend class List<E>;
|
||||
|
||||
private:
|
||||
|
||||
E element_;
|
||||
ListNode * next_;
|
||||
|
||||
// The c'tor is private s.t. only in the ListNode class and in its
|
||||
// friend class List we can create a ListNode object.
|
||||
//
|
||||
// Creates a node with a given element value. The next pointer is
|
||||
// set to NULL.
|
||||
//
|
||||
// ListNode does NOT have a default constructor. Always use this
|
||||
// constructor (with parameter) to create a ListNode object.
|
||||
explicit ListNode(const E & element) : element_(element), next_(NULL) {}
|
||||
|
||||
// We disallow copying ListNode
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ListNode);
|
||||
|
||||
public:
|
||||
|
||||
// Gets the element in this node.
|
||||
E & element() { return element_; }
|
||||
const E & element() const { return element_; }
|
||||
|
||||
// Gets the next node in the list.
|
||||
ListNode * next() { return next_; }
|
||||
const ListNode * next() const { return next_; }
|
||||
};
|
||||
|
||||
|
||||
// List is a simple singly-linked list container.
|
||||
template <typename E> // E is the element type.
|
||||
class List {
|
||||
public:
|
||||
|
||||
// Creates an empty list.
|
||||
List() : head_(NULL), last_(NULL), size_(0) {}
|
||||
|
||||
// D'tor.
|
||||
virtual ~List();
|
||||
|
||||
// Clears the list.
|
||||
void Clear() {
|
||||
if ( size_ > 0 ) {
|
||||
// 1. Deletes every node.
|
||||
ListNode<E> * node = head_;
|
||||
ListNode<E> * next = node->next();
|
||||
for ( ; ; ) {
|
||||
delete node;
|
||||
node = next;
|
||||
if ( node == NULL ) break;
|
||||
next = node->next();
|
||||
}
|
||||
|
||||
// 2. Resets the member variables.
|
||||
head_ = last_ = NULL;
|
||||
size_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Gets the number of elements.
|
||||
int size() const { return size_; }
|
||||
|
||||
// Returns true if the list is empty.
|
||||
bool IsEmpty() const { return size() == 0; }
|
||||
|
||||
// Gets the first element of the list, or NULL if the list is empty.
|
||||
ListNode<E> * Head() { return head_; }
|
||||
const ListNode<E> * Head() const { return head_; }
|
||||
|
||||
// Gets the last element of the list, or NULL if the list is empty.
|
||||
ListNode<E> * Last() { return last_; }
|
||||
const ListNode<E> * Last() const { return last_; }
|
||||
|
||||
// Adds an element to the end of the list. A copy of the element is
|
||||
// created using the copy constructor, and then stored in the list.
|
||||
// Changes made to the element in the list doesn't affect the source
|
||||
// object, and vice versa.
|
||||
void PushBack(const E & element) {
|
||||
ListNode<E> * new_node = new ListNode<E>(element);
|
||||
|
||||
if ( size_ == 0 ) {
|
||||
head_ = last_ = new_node;
|
||||
size_ = 1;
|
||||
} else {
|
||||
last_->next_ = new_node;
|
||||
last_ = new_node;
|
||||
size_++;
|
||||
}
|
||||
}
|
||||
|
||||
// Adds an element to the beginning of this list.
|
||||
void PushFront(const E& element) {
|
||||
ListNode<E>* const new_node = new ListNode<E>(element);
|
||||
|
||||
if ( size_ == 0 ) {
|
||||
head_ = last_ = new_node;
|
||||
size_ = 1;
|
||||
} else {
|
||||
new_node->next_ = head_;
|
||||
head_ = new_node;
|
||||
size_++;
|
||||
}
|
||||
}
|
||||
|
||||
// Removes an element from the beginning of this list. If the
|
||||
// result argument is not NULL, the removed element is stored in the
|
||||
// memory it points to. Otherwise the element is thrown away.
|
||||
// Returns true iff the list wasn't empty before the operation.
|
||||
bool PopFront(E* result) {
|
||||
if (size_ == 0) return false;
|
||||
|
||||
if (result != NULL) {
|
||||
*result = head_->element_;
|
||||
}
|
||||
|
||||
ListNode<E>* const old_head = head_;
|
||||
size_--;
|
||||
if (size_ == 0) {
|
||||
head_ = last_ = NULL;
|
||||
} else {
|
||||
head_ = head_->next_;
|
||||
}
|
||||
delete old_head;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Inserts an element after a given node in the list. It's the
|
||||
// caller's responsibility to ensure that the given node is in the
|
||||
// list. If the given node is NULL, inserts the element at the
|
||||
// front of the list.
|
||||
ListNode<E>* InsertAfter(ListNode<E>* node, const E& element) {
|
||||
if (node == NULL) {
|
||||
PushFront(element);
|
||||
return Head();
|
||||
}
|
||||
|
||||
ListNode<E>* const new_node = new ListNode<E>(element);
|
||||
new_node->next_ = node->next_;
|
||||
node->next_ = new_node;
|
||||
size_++;
|
||||
if (node == last_) {
|
||||
last_ = new_node;
|
||||
}
|
||||
|
||||
return new_node;
|
||||
}
|
||||
|
||||
// Returns the number of elements that satisfy a given predicate.
|
||||
// The parameter 'predicate' is a Boolean function or functor that
|
||||
// accepts a 'const E &', where E is the element type.
|
||||
template <typename P> // P is the type of the predicate function/functor
|
||||
int CountIf(P predicate) const {
|
||||
int count = 0;
|
||||
for ( const ListNode<E> * node = Head();
|
||||
node != NULL;
|
||||
node = node->next() ) {
|
||||
if ( predicate(node->element()) ) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// Applies a function/functor to each element in the list. The
|
||||
// parameter 'functor' is a function/functor that accepts a 'const
|
||||
// E &', where E is the element type. This method does not change
|
||||
// the elements.
|
||||
template <typename F> // F is the type of the function/functor
|
||||
void ForEach(F functor) const {
|
||||
for ( const ListNode<E> * node = Head();
|
||||
node != NULL;
|
||||
node = node->next() ) {
|
||||
functor(node->element());
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the first node whose element satisfies a given predicate,
|
||||
// or NULL if none is found. The parameter 'predicate' is a
|
||||
// function/functor that accepts a 'const E &', where E is the
|
||||
// element type. This method does not change the elements.
|
||||
template <typename P> // P is the type of the predicate function/functor.
|
||||
const ListNode<E> * FindIf(P predicate) const {
|
||||
for ( const ListNode<E> * node = Head();
|
||||
node != NULL;
|
||||
node = node->next() ) {
|
||||
if ( predicate(node->element()) ) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template <typename P>
|
||||
ListNode<E> * FindIf(P predicate) {
|
||||
for ( ListNode<E> * node = Head();
|
||||
node != NULL;
|
||||
node = node->next() ) {
|
||||
if ( predicate(node->element() ) ) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
private:
|
||||
ListNode<E>* head_; // The first node of the list.
|
||||
ListNode<E>* last_; // The last node of the list.
|
||||
int size_; // The number of elements in the list.
|
||||
|
||||
// We disallow copying List.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(List);
|
||||
};
|
||||
|
||||
// The virtual destructor of List.
|
||||
template <typename E>
|
||||
List<E>::~List() {
|
||||
Clear();
|
||||
}
|
||||
|
||||
// A function for deleting an object. Handy for being used as a
|
||||
// functor.
|
||||
template <typename T>
|
||||
static void Delete(T * x) {
|
||||
delete x;
|
||||
}
|
||||
|
||||
// A copyable object representing a user specified test property which can be
|
||||
// output as a key/value string pair.
|
||||
//
|
||||
// Don't inherit from TestProperty as its destructor is not virtual.
|
||||
class TestProperty {
|
||||
public:
|
||||
// C'tor. TestProperty does NOT have a default constructor.
|
||||
// Always use this constructor (with parameters) to create a
|
||||
// TestProperty object.
|
||||
TestProperty(const char* key, const char* value) :
|
||||
key_(key), value_(value) {
|
||||
}
|
||||
|
||||
// Gets the user supplied key.
|
||||
const char* key() const {
|
||||
return key_.c_str();
|
||||
}
|
||||
|
||||
// Gets the user supplied value.
|
||||
const char* value() const {
|
||||
return value_.c_str();
|
||||
}
|
||||
|
||||
// Sets a new value, overriding the one supplied in the constructor.
|
||||
void SetValue(const char* new_value) {
|
||||
value_ = new_value;
|
||||
}
|
||||
|
||||
private:
|
||||
// The key supplied by the user.
|
||||
String key_;
|
||||
// The value supplied by the user.
|
||||
String value_;
|
||||
};
|
||||
|
||||
// A predicate that checks the key of a TestProperty against a known key.
|
||||
//
|
||||
// TestPropertyKeyIs is copyable.
|
||||
class TestPropertyKeyIs {
|
||||
public:
|
||||
// Constructor.
|
||||
//
|
||||
// TestPropertyKeyIs has NO default constructor.
|
||||
explicit TestPropertyKeyIs(const char* key)
|
||||
: key_(key) {}
|
||||
|
||||
// Returns true iff the test name of test property matches on key_.
|
||||
bool operator()(const TestProperty& test_property) const {
|
||||
return String(test_property.key()).Compare(key_) == 0;
|
||||
}
|
||||
|
||||
private:
|
||||
String key_;
|
||||
};
|
||||
|
||||
// The result of a single Test. This includes a list of
|
||||
// TestPartResults, a list of TestProperties, a count of how many
|
||||
// death tests there are in the Test, and how much time it took to run
|
||||
// the Test.
|
||||
//
|
||||
// TestResult is not copyable.
|
||||
class TestResult {
|
||||
public:
|
||||
// Creates an empty TestResult.
|
||||
TestResult();
|
||||
|
||||
// D'tor. Do not inherit from TestResult.
|
||||
~TestResult();
|
||||
|
||||
// Gets the list of TestPartResults.
|
||||
const internal::List<TestPartResult> & test_part_results() const {
|
||||
return test_part_results_;
|
||||
}
|
||||
|
||||
// Gets the list of TestProperties.
|
||||
const internal::List<internal::TestProperty> & test_properties() const {
|
||||
return test_properties_;
|
||||
}
|
||||
|
||||
// Gets the number of successful test parts.
|
||||
int successful_part_count() const;
|
||||
|
||||
// Gets the number of failed test parts.
|
||||
int failed_part_count() const;
|
||||
|
||||
// Gets the number of all test parts. This is the sum of the number
|
||||
// of successful test parts and the number of failed test parts.
|
||||
int total_part_count() const;
|
||||
|
||||
// Returns true iff the test passed (i.e. no test part failed).
|
||||
bool Passed() const { return !Failed(); }
|
||||
|
||||
// Returns true iff the test failed.
|
||||
bool Failed() const { return failed_part_count() > 0; }
|
||||
|
||||
// Returns true iff the test fatally failed.
|
||||
bool HasFatalFailure() const;
|
||||
|
||||
// Returns the elapsed time, in milliseconds.
|
||||
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
||||
|
||||
// Sets the elapsed time.
|
||||
void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
|
||||
|
||||
// Adds a test part result to the list.
|
||||
void AddTestPartResult(const TestPartResult& test_part_result);
|
||||
|
||||
// Adds a test property to the list. The property is validated and may add
|
||||
// a non-fatal failure if invalid (e.g., if it conflicts with reserved
|
||||
// key names). If a property is already recorded for the same key, the
|
||||
// value will be updated, rather than storing multiple values for the same
|
||||
// key.
|
||||
void RecordProperty(const internal::TestProperty& test_property);
|
||||
|
||||
// Adds a failure if the key is a reserved attribute of Google Test
|
||||
// testcase tags. Returns true if the property is valid.
|
||||
// TODO(russr): Validate attribute names are legal and human readable.
|
||||
static bool ValidateTestProperty(const internal::TestProperty& test_property);
|
||||
|
||||
// Returns the death test count.
|
||||
int death_test_count() const { return death_test_count_; }
|
||||
|
||||
// Increments the death test count, returning the new count.
|
||||
int increment_death_test_count() { return ++death_test_count_; }
|
||||
|
||||
// Clears the object.
|
||||
void Clear();
|
||||
private:
|
||||
// Protects mutable state of the property list and of owned properties, whose
|
||||
// values may be updated.
|
||||
internal::Mutex test_properites_mutex_;
|
||||
|
||||
// The list of TestPartResults
|
||||
internal::List<TestPartResult> test_part_results_;
|
||||
// The list of TestProperties
|
||||
internal::List<internal::TestProperty> test_properties_;
|
||||
// Running count of death tests.
|
||||
int death_test_count_;
|
||||
// The elapsed time, in milliseconds.
|
||||
TimeInMillis elapsed_time_;
|
||||
|
||||
// We disallow copying TestResult.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestResult);
|
||||
}; // class TestResult
|
||||
|
||||
class TestInfoImpl {
|
||||
public:
|
||||
TestInfoImpl(TestInfo* parent, const char* test_case_name,
|
||||
const char* name, TypeId fixture_class_id,
|
||||
TestMaker maker);
|
||||
~TestInfoImpl();
|
||||
|
||||
// Returns true if this test should run.
|
||||
bool should_run() const { return should_run_; }
|
||||
|
||||
// Sets the should_run member.
|
||||
void set_should_run(bool should) { should_run_ = should; }
|
||||
|
||||
// Returns true if this test is disabled. Disabled tests are not run.
|
||||
bool is_disabled() const { return is_disabled_; }
|
||||
|
||||
// Sets the is_disabled member.
|
||||
void set_is_disabled(bool is) { is_disabled_ = is; }
|
||||
|
||||
// Returns the test case name.
|
||||
const char* test_case_name() const { return test_case_name_.c_str(); }
|
||||
|
||||
// Returns the test name.
|
||||
const char* name() const { return name_.c_str(); }
|
||||
|
||||
// Returns the ID of the test fixture class.
|
||||
TypeId fixture_class_id() const { return fixture_class_id_; }
|
||||
|
||||
// Returns the test result.
|
||||
internal::TestResult* result() { return &result_; }
|
||||
const internal::TestResult* result() const { return &result_; }
|
||||
|
||||
// Creates the test object, runs it, records its result, and then
|
||||
// deletes it.
|
||||
void Run();
|
||||
|
||||
// Calls the given TestInfo object's Run() method.
|
||||
static void RunTest(TestInfo * test_info) {
|
||||
test_info->impl()->Run();
|
||||
}
|
||||
|
||||
// Clears the test result.
|
||||
void ClearResult() { result_.Clear(); }
|
||||
|
||||
// Clears the test result in the given TestInfo object.
|
||||
static void ClearTestResult(TestInfo * test_info) {
|
||||
test_info->impl()->ClearResult();
|
||||
}
|
||||
|
||||
private:
|
||||
// These fields are immutable properties of the test.
|
||||
TestInfo* const parent_; // The owner of this object
|
||||
const String test_case_name_; // Test case name
|
||||
const String name_; // Test name
|
||||
const TypeId fixture_class_id_; // ID of the test fixture class
|
||||
bool should_run_; // True iff this test should run
|
||||
bool is_disabled_; // True iff this test is disabled
|
||||
const TestMaker maker_; // The function that creates the test object
|
||||
|
||||
// This field is mutable and needs to be reset before running the
|
||||
// test for the second time.
|
||||
internal::TestResult result_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestInfoImpl);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// A test case, which consists of a list of TestInfos.
|
||||
//
|
||||
// TestCase is not copyable.
|
||||
class TestCase {
|
||||
public:
|
||||
// Creates a TestCase with the given name.
|
||||
//
|
||||
// TestCase does NOT have a default constructor. Always use this
|
||||
// constructor to create a TestCase object.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// name: name of the test case
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
TestCase(const char* name,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc);
|
||||
|
||||
// Destructor of TestCase.
|
||||
virtual ~TestCase();
|
||||
|
||||
// Gets the name of the TestCase.
|
||||
const char* name() const { return name_.c_str(); }
|
||||
|
||||
// Returns true if any test in this test case should run.
|
||||
bool should_run() const { return should_run_; }
|
||||
|
||||
// Sets the should_run member.
|
||||
void set_should_run(bool should) { should_run_ = should; }
|
||||
|
||||
// Gets the (mutable) list of TestInfos in this TestCase.
|
||||
internal::List<TestInfo*>& test_info_list() { return *test_info_list_; }
|
||||
|
||||
// Gets the (immutable) list of TestInfos in this TestCase.
|
||||
const internal::List<TestInfo *> & test_info_list() const {
|
||||
return *test_info_list_;
|
||||
}
|
||||
|
||||
// Gets the number of successful tests in this test case.
|
||||
int successful_test_count() const;
|
||||
|
||||
// Gets the number of failed tests in this test case.
|
||||
int failed_test_count() const;
|
||||
|
||||
// Gets the number of disabled tests in this test case.
|
||||
int disabled_test_count() const;
|
||||
|
||||
// Get the number of tests in this test case that should run.
|
||||
int test_to_run_count() const;
|
||||
|
||||
// Gets the number of all tests in this test case.
|
||||
int total_test_count() const;
|
||||
|
||||
// Returns true iff the test case passed.
|
||||
bool Passed() const { return !Failed(); }
|
||||
|
||||
// Returns true iff the test case failed.
|
||||
bool Failed() const { return failed_test_count() > 0; }
|
||||
|
||||
// Returns the elapsed time, in milliseconds.
|
||||
internal::TimeInMillis elapsed_time() const { return elapsed_time_; }
|
||||
|
||||
// Adds a TestInfo to this test case. Will delete the TestInfo upon
|
||||
// destruction of the TestCase object.
|
||||
void AddTestInfo(TestInfo * test_info);
|
||||
|
||||
// Finds and returns a TestInfo with the given name. If one doesn't
|
||||
// exist, returns NULL.
|
||||
TestInfo* GetTestInfo(const char* test_name);
|
||||
|
||||
// Clears the results of all tests in this test case.
|
||||
void ClearResult();
|
||||
|
||||
// Clears the results of all tests in the given test case.
|
||||
static void ClearTestCaseResult(TestCase* test_case) {
|
||||
test_case->ClearResult();
|
||||
}
|
||||
|
||||
// Runs every test in this TestCase.
|
||||
void Run();
|
||||
|
||||
// Runs every test in the given TestCase.
|
||||
static void RunTestCase(TestCase * test_case) { test_case->Run(); }
|
||||
|
||||
// Returns true iff test passed.
|
||||
static bool TestPassed(const TestInfo * test_info) {
|
||||
const internal::TestInfoImpl* const impl = test_info->impl();
|
||||
return impl->should_run() && impl->result()->Passed();
|
||||
}
|
||||
|
||||
// Returns true iff test failed.
|
||||
static bool TestFailed(const TestInfo * test_info) {
|
||||
const internal::TestInfoImpl* const impl = test_info->impl();
|
||||
return impl->should_run() && impl->result()->Failed();
|
||||
}
|
||||
|
||||
// Returns true iff test is disabled.
|
||||
static bool TestDisabled(const TestInfo * test_info) {
|
||||
return test_info->impl()->is_disabled();
|
||||
}
|
||||
|
||||
// Returns true if the given test should run.
|
||||
static bool ShouldRunTest(const TestInfo *test_info) {
|
||||
return test_info->impl()->should_run();
|
||||
}
|
||||
|
||||
private:
|
||||
// Name of the test case.
|
||||
internal::String name_;
|
||||
// List of TestInfos.
|
||||
internal::List<TestInfo*>* test_info_list_;
|
||||
// Pointer to the function that sets up the test case.
|
||||
Test::SetUpTestCaseFunc set_up_tc_;
|
||||
// Pointer to the function that tears down the test case.
|
||||
Test::TearDownTestCaseFunc tear_down_tc_;
|
||||
// True iff any test in this test case should run.
|
||||
bool should_run_;
|
||||
// Elapsed time, in milliseconds.
|
||||
internal::TimeInMillis elapsed_time_;
|
||||
|
||||
// We disallow copying TestCases.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestCase);
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Class UnitTestOptions.
|
||||
//
|
||||
// This class contains functions for processing options the user
|
||||
// specifies when running the tests. It has only static members.
|
||||
//
|
||||
// In most cases, the user can specify an option using either an
|
||||
// environment variable or a command line flag. E.g. you can set the
|
||||
// test filter using either GTEST_FILTER or --gtest_filter. If both
|
||||
// the variable and the flag are present, the latter overrides the
|
||||
// former.
|
||||
class UnitTestOptions {
|
||||
public:
|
||||
// Functions for processing the gtest_output flag.
|
||||
|
||||
// Returns the output format, or "" for normal printed output.
|
||||
static String GetOutputFormat();
|
||||
|
||||
// Returns the name of the requested output file, or the default if none
|
||||
// was explicitly specified.
|
||||
static String GetOutputFile();
|
||||
|
||||
// Functions for processing the gtest_filter flag.
|
||||
|
||||
// Returns true iff the wildcard pattern matches the string. The
|
||||
// first ':' or '\0' character in pattern marks the end of it.
|
||||
//
|
||||
// This recursive algorithm isn't very efficient, but is clear and
|
||||
// works well enough for matching test names, which are short.
|
||||
static bool PatternMatchesString(const char *pattern, const char *str);
|
||||
|
||||
// Returns true iff the user-specified filter matches the test case
|
||||
// name and the test name.
|
||||
static bool FilterMatchesTest(const String &test_case_name,
|
||||
const String &test_name);
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Function for supporting the gtest_catch_exception flag.
|
||||
|
||||
// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
|
||||
// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
|
||||
// This function is useful as an __except condition.
|
||||
static int GTestShouldProcessSEH(DWORD exception_code);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
private:
|
||||
// Returns true if "name" matches the ':' separated list of glob-style
|
||||
// filters in "filter".
|
||||
static bool MatchesFilter(const String& name, const char* filter);
|
||||
};
|
||||
|
||||
// Returns the current application's name, removing directory path if that
|
||||
// is present. Used by UnitTestOptions::GetOutputFile.
|
||||
FilePath GetCurrentExecutableName();
|
||||
|
||||
// The role interface for getting the OS stack trace as a string.
|
||||
class OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetterInterface() {}
|
||||
virtual ~OsStackTraceGetterInterface() {}
|
||||
|
||||
// Returns the current OS stack trace as a String. Parameters:
|
||||
//
|
||||
// max_depth - the maximum number of stack frames to be included
|
||||
// in the trace.
|
||||
// skip_count - the number of top frames to be skipped; doesn't count
|
||||
// against max_depth.
|
||||
virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
|
||||
|
||||
// UponLeavingGTest() should be called immediately before Google Test calls
|
||||
// user code. It saves some information about the current stack that
|
||||
// CurrentStackTrace() will use to find and hide Google Test stack frames.
|
||||
virtual void UponLeavingGTest() = 0;
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(OsStackTraceGetterInterface);
|
||||
};
|
||||
|
||||
// A working implemenation of the OsStackTraceGetterInterface interface.
|
||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetter() {}
|
||||
virtual String CurrentStackTrace(int max_depth, int skip_count);
|
||||
virtual void UponLeavingGTest();
|
||||
|
||||
// This string is inserted in place of stack frames that are part of
|
||||
// Google Test's implementation.
|
||||
static const char* const kElidedFramesMarker;
|
||||
|
||||
private:
|
||||
Mutex mutex_; // protects all internal state
|
||||
|
||||
// We save the stack frame below the frame that calls user code.
|
||||
// We do this because the address of the frame immediately below
|
||||
// the user code changes between the call to UponLeavingGTest()
|
||||
// and any calls to CurrentStackTrace() from within the user code.
|
||||
void* caller_frame_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(OsStackTraceGetter);
|
||||
};
|
||||
|
||||
// Information about a Google Test trace point.
|
||||
struct TraceInfo {
|
||||
const char* file;
|
||||
int line;
|
||||
String message;
|
||||
};
|
||||
|
||||
// The private implementation of the UnitTest class. We don't protect
|
||||
// the methods under a mutex, as this class is not accessible by a
|
||||
// user and the UnitTest class that delegates work to this class does
|
||||
// proper locking.
|
||||
class UnitTestImpl : public TestPartResultReporterInterface {
|
||||
public:
|
||||
explicit UnitTestImpl(UnitTest* parent);
|
||||
virtual ~UnitTestImpl();
|
||||
|
||||
// Reports a test part result. This method is from the
|
||||
// TestPartResultReporterInterface interface.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
|
||||
// Returns the current test part result reporter.
|
||||
TestPartResultReporterInterface* test_part_result_reporter();
|
||||
|
||||
// Sets the current test part result reporter.
|
||||
void set_test_part_result_reporter(TestPartResultReporterInterface* reporter);
|
||||
|
||||
// Gets the number of successful test cases.
|
||||
int successful_test_case_count() const;
|
||||
|
||||
// Gets the number of failed test cases.
|
||||
int failed_test_case_count() const;
|
||||
|
||||
// Gets the number of all test cases.
|
||||
int total_test_case_count() const;
|
||||
|
||||
// Gets the number of all test cases that contain at least one test
|
||||
// that should run.
|
||||
int test_case_to_run_count() const;
|
||||
|
||||
// Gets the number of successful tests.
|
||||
int successful_test_count() const;
|
||||
|
||||
// Gets the number of failed tests.
|
||||
int failed_test_count() const;
|
||||
|
||||
// Gets the number of disabled tests.
|
||||
int disabled_test_count() const;
|
||||
|
||||
// Gets the number of all tests.
|
||||
int total_test_count() const;
|
||||
|
||||
// Gets the number of tests that should run.
|
||||
int test_to_run_count() const;
|
||||
|
||||
// Gets the elapsed time, in milliseconds.
|
||||
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
||||
|
||||
// Returns true iff the unit test passed (i.e. all test cases passed).
|
||||
bool Passed() const { return !Failed(); }
|
||||
|
||||
// Returns true iff the unit test failed (i.e. some test case failed
|
||||
// or something outside of all tests failed).
|
||||
bool Failed() const {
|
||||
return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
|
||||
}
|
||||
|
||||
// Returns the TestResult for the test that's currently running, or
|
||||
// the TestResult for the ad hoc test if no test is running.
|
||||
internal::TestResult* current_test_result();
|
||||
|
||||
// Returns the TestResult for the ad hoc test.
|
||||
const internal::TestResult* ad_hoc_test_result() const {
|
||||
return &ad_hoc_test_result_;
|
||||
}
|
||||
|
||||
// Sets the unit test result printer.
|
||||
//
|
||||
// Does nothing if the input and the current printer object are the
|
||||
// same; otherwise, deletes the old printer object and makes the
|
||||
// input the current printer.
|
||||
void set_result_printer(UnitTestEventListenerInterface * result_printer);
|
||||
|
||||
// Returns the current unit test result printer if it is not NULL;
|
||||
// otherwise, creates an appropriate result printer, makes it the
|
||||
// current printer, and returns it.
|
||||
UnitTestEventListenerInterface* result_printer();
|
||||
|
||||
// Sets the OS stack trace getter.
|
||||
//
|
||||
// Does nothing if the input and the current OS stack trace getter
|
||||
// are the same; otherwise, deletes the old getter and makes the
|
||||
// input the current getter.
|
||||
void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
|
||||
|
||||
// Returns the current OS stack trace getter if it is not NULL;
|
||||
// otherwise, creates an OsStackTraceGetter, makes it the current
|
||||
// getter, and returns it.
|
||||
OsStackTraceGetterInterface* os_stack_trace_getter();
|
||||
|
||||
// Returns the current OS stack trace as a String.
|
||||
//
|
||||
// The maximum number of stack frames to be included is specified by
|
||||
// the gtest_stack_trace_depth flag. The skip_count parameter
|
||||
// specifies the number of top frames to be skipped, which doesn't
|
||||
// count against the number of frames to be included.
|
||||
//
|
||||
// For example, if Foo() calls Bar(), which in turn calls
|
||||
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
||||
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
||||
String CurrentOsStackTraceExceptTop(int skip_count);
|
||||
|
||||
// Finds and returns a TestCase with the given name. If one doesn't
|
||||
// exist, creates one and returns it.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// test_case_name: name of the test case
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
TestCase* GetTestCase(const char* test_case_name,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc);
|
||||
|
||||
// Adds a TestInfo to the unit test.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
// test_info: the TestInfo object
|
||||
void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc,
|
||||
TestInfo * test_info) {
|
||||
GetTestCase(test_info->test_case_name(),
|
||||
set_up_tc,
|
||||
tear_down_tc)->AddTestInfo(test_info);
|
||||
}
|
||||
|
||||
// Sets the TestCase object for the test that's currently running.
|
||||
void set_current_test_case(TestCase* current_test_case) {
|
||||
current_test_case_ = current_test_case;
|
||||
}
|
||||
|
||||
// Sets the TestInfo object for the test that's currently running. If
|
||||
// current_test_info is NULL, the assertion results will be stored in
|
||||
// ad_hoc_test_result_.
|
||||
void set_current_test_info(TestInfo* current_test_info) {
|
||||
current_test_info_ = current_test_info;
|
||||
}
|
||||
|
||||
// Runs all tests in this UnitTest object, prints the result, and
|
||||
// returns 0 if all tests are successful, or 1 otherwise. If any
|
||||
// exception is thrown during a test on Windows, this test is
|
||||
// considered to be failed, but the rest of the tests will still be
|
||||
// run. (We disable exceptions on Linux and Mac OS X, so the issue
|
||||
// doesn't apply there.)
|
||||
int RunAllTests();
|
||||
|
||||
// Clears the results of all tests, including the ad hoc test.
|
||||
void ClearResult() {
|
||||
test_cases_.ForEach(TestCase::ClearTestCaseResult);
|
||||
ad_hoc_test_result_.Clear();
|
||||
}
|
||||
|
||||
// Matches the full name of each test against the user-specified
|
||||
// filter to decide whether the test should run, then records the
|
||||
// result in each TestCase and TestInfo object.
|
||||
// Returns the number of tests that should run.
|
||||
int FilterTests();
|
||||
|
||||
// Lists all the tests by name.
|
||||
void ListAllTests();
|
||||
|
||||
const TestCase* current_test_case() const { return current_test_case_; }
|
||||
TestInfo* current_test_info() { return current_test_info_; }
|
||||
const TestInfo* current_test_info() const { return current_test_info_; }
|
||||
|
||||
// Returns the list of environments that need to be set-up/torn-down
|
||||
// before/after the tests are run.
|
||||
internal::List<Environment*>* environments() { return &environments_; }
|
||||
internal::List<Environment*>* environments_in_reverse_order() {
|
||||
return &environments_in_reverse_order_;
|
||||
}
|
||||
|
||||
internal::List<TestCase*>* test_cases() { return &test_cases_; }
|
||||
const internal::List<TestCase*>* test_cases() const { return &test_cases_; }
|
||||
|
||||
// Getters for the per-thread Google Test trace stack.
|
||||
internal::List<TraceInfo>* gtest_trace_stack() {
|
||||
return gtest_trace_stack_.pointer();
|
||||
}
|
||||
const internal::List<TraceInfo>* gtest_trace_stack() const {
|
||||
return gtest_trace_stack_.pointer();
|
||||
}
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
// Returns a pointer to the parsed --gtest_internal_run_death_test
|
||||
// flag, or NULL if that flag was not specified.
|
||||
// This information is useful only in a death test child process.
|
||||
const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
|
||||
return internal_run_death_test_flag_.get();
|
||||
}
|
||||
|
||||
// Returns a pointer to the current death test factory.
|
||||
internal::DeathTestFactory* death_test_factory() {
|
||||
return death_test_factory_.get();
|
||||
}
|
||||
|
||||
friend class ReplaceDeathTestFactory;
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
private:
|
||||
// The UnitTest object that owns this implementation object.
|
||||
UnitTest* const parent_;
|
||||
|
||||
// Points to (but doesn't own) the test part result reporter.
|
||||
TestPartResultReporterInterface* test_part_result_reporter_;
|
||||
|
||||
// The list of environments that need to be set-up/torn-down
|
||||
// before/after the tests are run. environments_in_reverse_order_
|
||||
// simply mirrors environments_ in reverse order.
|
||||
internal::List<Environment*> environments_;
|
||||
internal::List<Environment*> environments_in_reverse_order_;
|
||||
|
||||
internal::List<TestCase*> test_cases_; // The list of TestCases.
|
||||
|
||||
// Points to the last death test case registered. Initially NULL.
|
||||
internal::ListNode<TestCase*>* last_death_test_case_;
|
||||
|
||||
// This points to the TestCase for the currently running test. It
|
||||
// changes as Google Test goes through one test case after another.
|
||||
// When no test is running, this is set to NULL and Google Test
|
||||
// stores assertion results in ad_hoc_test_result_. Initally NULL.
|
||||
TestCase* current_test_case_;
|
||||
|
||||
// This points to the TestInfo for the currently running test. It
|
||||
// changes as Google Test goes through one test after another. When
|
||||
// no test is running, this is set to NULL and Google Test stores
|
||||
// assertion results in ad_hoc_test_result_. Initially NULL.
|
||||
TestInfo* current_test_info_;
|
||||
|
||||
// Normally, a user only writes assertions inside a TEST or TEST_F,
|
||||
// or inside a function called by a TEST or TEST_F. Since Google
|
||||
// Test keeps track of which test is current running, it can
|
||||
// associate such an assertion with the test it belongs to.
|
||||
//
|
||||
// If an assertion is encountered when no TEST or TEST_F is running,
|
||||
// Google Test attributes the assertion result to an imaginary "ad hoc"
|
||||
// test, and records the result in ad_hoc_test_result_.
|
||||
internal::TestResult ad_hoc_test_result_;
|
||||
|
||||
// The unit test result printer. Will be deleted when the UnitTest
|
||||
// object is destructed. By default, a plain text printer is used,
|
||||
// but the user can set this field to use a custom printer if that
|
||||
// is desired.
|
||||
UnitTestEventListenerInterface* result_printer_;
|
||||
|
||||
// The OS stack trace getter. Will be deleted when the UnitTest
|
||||
// object is destructed. By default, an OsStackTraceGetter is used,
|
||||
// but the user can set this field to use a custom getter if that is
|
||||
// desired.
|
||||
OsStackTraceGetterInterface* os_stack_trace_getter_;
|
||||
|
||||
// How long the test took to run, in milliseconds.
|
||||
TimeInMillis elapsed_time_;
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
// The decomposed components of the gtest_internal_run_death_test flag,
|
||||
// parsed when RUN_ALL_TESTS is called.
|
||||
internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
|
||||
internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// A per-thread stack of traces created by the SCOPED_TRACE() macro.
|
||||
internal::ThreadLocal<internal::List<TraceInfo> > gtest_trace_stack_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTestImpl);
|
||||
}; // class UnitTestImpl
|
||||
|
||||
// Convenience function for accessing the global UnitTest
|
||||
// implementation object.
|
||||
inline UnitTestImpl* GetUnitTestImpl() {
|
||||
return UnitTest::GetInstance()->impl();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
|
||||
@@ -0,0 +1,292 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#include <limits.h>
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
#include <regex.h>
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <gtest/gtest-spi.h>
|
||||
#include <gtest/gtest-message.h>
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Implements RE. Currently only needed for death tests.
|
||||
|
||||
RE::~RE() {
|
||||
regfree(®ex_);
|
||||
free(const_cast<char*>(pattern_));
|
||||
}
|
||||
|
||||
// Returns true iff str contains regular expression re.
|
||||
bool RE::PartialMatch(const char* str, const RE& re) {
|
||||
if (!re.is_valid_) return false;
|
||||
|
||||
regmatch_t match;
|
||||
return regexec(&re.regex_, str, 1, &match, 0) == 0;
|
||||
}
|
||||
|
||||
// Initializes an RE from its string representation.
|
||||
void RE::Init(const char* regex) {
|
||||
pattern_ = strdup(regex);
|
||||
is_valid_ = regcomp(®ex_, regex, REG_EXTENDED) == 0;
|
||||
EXPECT_TRUE(is_valid_)
|
||||
<< "Regular expression \"" << regex
|
||||
<< "\" is not a valid POSIX Extended regular expression.";
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Logs a message at the given severity level.
|
||||
void GTestLog(GTestLogSeverity severity, const char* file,
|
||||
int line, const char* msg) {
|
||||
const char* const marker =
|
||||
severity == GTEST_INFO ? "[ INFO ]" :
|
||||
severity == GTEST_WARNING ? "[WARNING]" :
|
||||
severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
|
||||
fprintf(stderr, "\n%s %s:%d: %s\n", marker, file, line, msg);
|
||||
if (severity == GTEST_FATAL) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines the stderr capturer.
|
||||
|
||||
class CapturedStderr {
|
||||
public:
|
||||
// The ctor redirects stderr to a temporary file.
|
||||
CapturedStderr() {
|
||||
uncaptured_fd_ = dup(STDERR_FILENO);
|
||||
|
||||
char name_template[] = "captured_stderr.XXXXXX";
|
||||
const int captured_fd = mkstemp(name_template);
|
||||
filename_ = name_template;
|
||||
fflush(NULL);
|
||||
dup2(captured_fd, STDERR_FILENO);
|
||||
close(captured_fd);
|
||||
}
|
||||
|
||||
~CapturedStderr() {
|
||||
remove(filename_.c_str());
|
||||
}
|
||||
|
||||
// Stops redirecting stderr.
|
||||
void StopCapture() {
|
||||
// Restores the original stream.
|
||||
fflush(NULL);
|
||||
dup2(uncaptured_fd_, STDERR_FILENO);
|
||||
close(uncaptured_fd_);
|
||||
uncaptured_fd_ = -1;
|
||||
}
|
||||
|
||||
// Returns the name of the temporary file holding the stderr output.
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
|
||||
// can use it here.
|
||||
::std::string filename() const { return filename_; }
|
||||
|
||||
private:
|
||||
int uncaptured_fd_;
|
||||
::std::string filename_;
|
||||
};
|
||||
|
||||
static CapturedStderr* g_captured_stderr = NULL;
|
||||
|
||||
// Returns the size (in bytes) of a file.
|
||||
static size_t GetFileSize(FILE * file) {
|
||||
fseek(file, 0, SEEK_END);
|
||||
return static_cast<size_t>(ftell(file));
|
||||
}
|
||||
|
||||
// Reads the entire content of a file as a string.
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can
|
||||
// use it here.
|
||||
static ::std::string ReadEntireFile(FILE * file) {
|
||||
const size_t file_size = GetFileSize(file);
|
||||
char* const buffer = new char[file_size];
|
||||
|
||||
size_t bytes_last_read = 0; // # of bytes read in the last fread()
|
||||
size_t bytes_read = 0; // # of bytes read so far
|
||||
|
||||
fseek(file, 0, SEEK_SET);
|
||||
|
||||
// Keeps reading the file until we cannot read further or the
|
||||
// pre-determined file size is reached.
|
||||
do {
|
||||
bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
|
||||
bytes_read += bytes_last_read;
|
||||
} while (bytes_last_read > 0 && bytes_read < file_size);
|
||||
|
||||
const ::std::string content(buffer, buffer+bytes_read);
|
||||
delete[] buffer;
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
// Starts capturing stderr.
|
||||
void CaptureStderr() {
|
||||
if (g_captured_stderr != NULL) {
|
||||
GTEST_LOG(FATAL, "Only one stderr capturer can exist at one time.");
|
||||
}
|
||||
g_captured_stderr = new CapturedStderr;
|
||||
}
|
||||
|
||||
// Stops capturing stderr and returns the captured string.
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can
|
||||
// use it here.
|
||||
::std::string GetCapturedStderr() {
|
||||
g_captured_stderr->StopCapture();
|
||||
FILE* const file = fopen(g_captured_stderr->filename().c_str(), "r");
|
||||
const ::std::string content = ReadEntireFile(file);
|
||||
fclose(file);
|
||||
|
||||
delete g_captured_stderr;
|
||||
g_captured_stderr = NULL;
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||
::std::vector<String> g_argvs;
|
||||
|
||||
// Returns the command line as a vector of strings.
|
||||
const ::std::vector<String>& GetArgvs() { return g_argvs; }
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Returns the name of the environment variable corresponding to the
|
||||
// given flag. For example, FlagToEnvVar("foo") will return
|
||||
// "GTEST_FOO" in the open-source version.
|
||||
static String FlagToEnvVar(const char* flag) {
|
||||
const String full_flag = (Message() << GTEST_FLAG_PREFIX << flag).GetString();
|
||||
|
||||
Message env_var;
|
||||
for (int i = 0; i != full_flag.GetLength(); i++) {
|
||||
env_var << static_cast<char>(toupper(full_flag.c_str()[i]));
|
||||
}
|
||||
|
||||
return env_var.GetString();
|
||||
}
|
||||
|
||||
// Reads and returns the Boolean environment variable corresponding to
|
||||
// the given flag; if it's not set, returns default_value.
|
||||
//
|
||||
// The value is considered true iff it's not "0".
|
||||
bool BoolFromGTestEnv(const char* flag, bool default_value) {
|
||||
const String env_var = FlagToEnvVar(flag);
|
||||
const char* const string_value = GetEnv(env_var.c_str());
|
||||
return string_value == NULL ?
|
||||
default_value : strcmp(string_value, "0") != 0;
|
||||
}
|
||||
|
||||
// Parses 'str' for a 32-bit signed integer. If successful, writes
|
||||
// the result to *value and returns true; otherwise leaves *value
|
||||
// unchanged and returns false.
|
||||
bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
|
||||
// Parses the environment variable as a decimal integer.
|
||||
char* end = NULL;
|
||||
const long long_value = strtol(str, &end, 10); // NOLINT
|
||||
|
||||
// Has strtol() consumed all characters in the string?
|
||||
if (*end != '\0') {
|
||||
// No - an invalid character was encountered.
|
||||
Message msg;
|
||||
msg << "WARNING: " << src_text
|
||||
<< " is expected to be a 32-bit integer, but actually"
|
||||
<< " has value \"" << str << "\".\n";
|
||||
printf("%s", msg.GetString().c_str());
|
||||
fflush(stdout);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Is the parsed value in the range of an Int32?
|
||||
const Int32 result = static_cast<Int32>(long_value);
|
||||
if (long_value == LONG_MAX || long_value == LONG_MIN ||
|
||||
// The parsed value overflows as a long. (strtol() returns
|
||||
// LONG_MAX or LONG_MIN when the input overflows.)
|
||||
result != long_value
|
||||
// The parsed value overflows as an Int32.
|
||||
) {
|
||||
Message msg;
|
||||
msg << "WARNING: " << src_text
|
||||
<< " is expected to be a 32-bit integer, but actually"
|
||||
<< " has value " << str << ", which overflows.\n";
|
||||
printf("%s", msg.GetString().c_str());
|
||||
fflush(stdout);
|
||||
return false;
|
||||
}
|
||||
|
||||
*value = result;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reads and returns a 32-bit integer stored in the environment
|
||||
// variable corresponding to the given flag; if it isn't set or
|
||||
// doesn't represent a valid 32-bit integer, returns default_value.
|
||||
Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
|
||||
const String env_var = FlagToEnvVar(flag);
|
||||
const char* const string_value = GetEnv(env_var.c_str());
|
||||
if (string_value == NULL) {
|
||||
// The environment variable is not set.
|
||||
return default_value;
|
||||
}
|
||||
|
||||
Int32 result = default_value;
|
||||
if (!ParseInt32(Message() << "Environment variable " << env_var,
|
||||
string_value, &result)) {
|
||||
printf("The default value %s is used.\n",
|
||||
(Message() << default_value).GetString().c_str());
|
||||
fflush(stdout);
|
||||
return default_value;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Reads and returns the string environment variable corresponding to
|
||||
// the given flag; if it's not set, returns default_value.
|
||||
const char* StringFromGTestEnv(const char* flag, const char* default_value) {
|
||||
const String env_var = FlagToEnvVar(flag);
|
||||
const char* const value = GetEnv(env_var.c_str());
|
||||
return value == NULL ? default_value : value;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
+3545
@@ -0,0 +1,3545 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef GTEST_OS_LINUX
|
||||
|
||||
// TODO(kenton@google.com): Use autoconf to detect availability of
|
||||
// gettimeofday().
|
||||
#define GTEST_HAS_GETTIMEOFDAY
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <sched.h>
|
||||
// Declares vsnprintf(). This header is not available on Windows.
|
||||
#include <strings.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#elif defined(_WIN32_WCE) // We are on Windows CE.
|
||||
|
||||
#include <windows.h> // NOLINT
|
||||
|
||||
#elif defined(_WIN32) // We are on Windows proper.
|
||||
|
||||
#include <io.h> // NOLINT
|
||||
#include <sys/timeb.h> // NOLINT
|
||||
#include <sys/types.h> // NOLINT
|
||||
#include <sys/stat.h> // NOLINT
|
||||
|
||||
#if defined(__MINGW__) || defined(__MINGW32__)
|
||||
// MinGW has gettimeofday() but not _ftime64().
|
||||
// TODO(kenton@google.com): Use autoconf to detect availability of
|
||||
// gettimeofday().
|
||||
// TODO(kenton@google.com): There are other ways to get the time on
|
||||
// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
|
||||
// supports these. consider using them instead.
|
||||
#define GTEST_HAS_GETTIMEOFDAY
|
||||
#include <sys/time.h> // NOLINT
|
||||
#endif
|
||||
|
||||
// cpplint thinks that the header is already included, so we want to
|
||||
// silence it.
|
||||
#include <windows.h> // NOLINT
|
||||
|
||||
#else
|
||||
|
||||
// Assume other platforms have gettimeofday().
|
||||
// TODO(kenton@google.com): Use autoconf to detect availability of
|
||||
// gettimeofday().
|
||||
#define GTEST_HAS_GETTIMEOFDAY
|
||||
|
||||
// cpplint thinks that the header is already included, so we want to
|
||||
// silence it.
|
||||
#include <sys/time.h> // NOLINT
|
||||
#include <unistd.h> // NOLINT
|
||||
|
||||
#endif
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#define fileno _fileno
|
||||
#define isatty _isatty
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Constants.
|
||||
|
||||
// A test that matches this pattern is disabled and not run.
|
||||
static const char kDisableTestPattern[] = "DISABLED_*";
|
||||
|
||||
// A test filter that matches everything.
|
||||
static const char kUniversalFilter[] = "*";
|
||||
|
||||
// The default output file for XML output.
|
||||
static const char kDefaultOutputFile[] = "test_detail.xml";
|
||||
|
||||
GTEST_DEFINE_bool(
|
||||
break_on_failure,
|
||||
internal::BoolFromGTestEnv("break_on_failure", false),
|
||||
"True iff a failed assertion should be a debugger break-point.");
|
||||
|
||||
GTEST_DEFINE_bool(
|
||||
catch_exceptions,
|
||||
internal::BoolFromGTestEnv("catch_exceptions", false),
|
||||
"True iff " GTEST_NAME
|
||||
" should catch exceptions and treat them as test failures.");
|
||||
|
||||
GTEST_DEFINE_string(
|
||||
color,
|
||||
internal::StringFromGTestEnv("color", "auto"),
|
||||
"Whether to use colors in the output. Valid values: yes, no, "
|
||||
"and auto. 'auto' means to use colors if the output is "
|
||||
"being sent to a terminal and the TERM environment variable "
|
||||
"is set to xterm or xterm-color.");
|
||||
|
||||
GTEST_DEFINE_string(
|
||||
filter,
|
||||
internal::StringFromGTestEnv("filter", kUniversalFilter),
|
||||
"A colon-separated list of glob (not regex) patterns "
|
||||
"for filtering the tests to run, optionally followed by a "
|
||||
"'-' and a : separated list of negative patterns (tests to "
|
||||
"exclude). A test is run if it matches one of the positive "
|
||||
"patterns and does not match any of the negative patterns.");
|
||||
|
||||
GTEST_DEFINE_bool(list_tests, false,
|
||||
"List all tests without running them.");
|
||||
|
||||
GTEST_DEFINE_string(
|
||||
output,
|
||||
internal::StringFromGTestEnv("output", ""),
|
||||
"A format (currently must be \"xml\"), optionally followed "
|
||||
"by a colon and an output file name or directory. A directory "
|
||||
"is indicated by a trailing pathname separator. "
|
||||
"Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
|
||||
"If a directory is specified, output files will be created "
|
||||
"within that directory, with file-names based on the test "
|
||||
"executable's name and, if necessary, made unique by adding "
|
||||
"digits.");
|
||||
|
||||
GTEST_DEFINE_int32(
|
||||
repeat,
|
||||
internal::Int32FromGTestEnv("repeat", 1),
|
||||
"How many times to repeat each test. Specify a negative number "
|
||||
"for repeating forever. Useful for shaking out flaky tests.");
|
||||
|
||||
GTEST_DEFINE_int32(
|
||||
stack_trace_depth,
|
||||
internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
|
||||
"The maximum number of stack frames to print when an "
|
||||
"assertion fails. The valid range is 0 through 100, inclusive.");
|
||||
|
||||
GTEST_DEFINE_bool(
|
||||
show_internal_stack_frames, false,
|
||||
"True iff " GTEST_NAME " should include internal stack frames when "
|
||||
"printing test failure stack traces.");
|
||||
|
||||
namespace internal {
|
||||
|
||||
// GTestIsInitialized() returns true iff the user has initialized
|
||||
// Google Test. Useful for catching the user mistake of not initializing
|
||||
// Google Test before calling RUN_ALL_TESTS().
|
||||
|
||||
// A user must call testing::InitGoogleTest() to initialize Google
|
||||
// Test. g_parse_gtest_flags_called is set to true iff
|
||||
// InitGoogleTest() has been called. We don't protect this variable
|
||||
// under a mutex as it is only accessed in the main thread.
|
||||
static bool g_parse_gtest_flags_called = false;
|
||||
static bool GTestIsInitialized() { return g_parse_gtest_flags_called; }
|
||||
|
||||
// Iterates over a list of TestCases, keeping a running sum of the
|
||||
// results of calling a given int-returning method on each.
|
||||
// Returns the sum.
|
||||
static int SumOverTestCaseList(const internal::List<TestCase*>& case_list,
|
||||
int (TestCase::*method)() const) {
|
||||
int sum = 0;
|
||||
for (const internal::ListNode<TestCase*>* node = case_list.Head();
|
||||
node != NULL;
|
||||
node = node->next()) {
|
||||
sum += (node->element()->*method)();
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
// Returns true iff the test case passed.
|
||||
static bool TestCasePassed(const TestCase* test_case) {
|
||||
return test_case->should_run() && test_case->Passed();
|
||||
}
|
||||
|
||||
// Returns true iff the test case failed.
|
||||
static bool TestCaseFailed(const TestCase* test_case) {
|
||||
return test_case->should_run() && test_case->Failed();
|
||||
}
|
||||
|
||||
// Returns true iff test_case contains at least one test that should
|
||||
// run.
|
||||
static bool ShouldRunTestCase(const TestCase* test_case) {
|
||||
return test_case->should_run();
|
||||
}
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE has no C library. The abort() function is used in
|
||||
// several places in Google Test. This implementation provides a reasonable
|
||||
// imitation of standard behaviour.
|
||||
static void abort() {
|
||||
DebugBreak();
|
||||
TerminateProcess(GetCurrentProcess(), 1);
|
||||
}
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
// AssertHelper constructor.
|
||||
AssertHelper::AssertHelper(TestPartResultType type, const char* file,
|
||||
int line, const char* message)
|
||||
: type_(type), file_(file), line_(line), message_(message) {
|
||||
}
|
||||
|
||||
// Message assignment, for assertion streaming support.
|
||||
void AssertHelper::operator=(const Message& message) const {
|
||||
UnitTest::GetInstance()->
|
||||
AddTestPartResult(type_, file_, line_,
|
||||
AppendUserMessage(message_, message),
|
||||
UnitTest::GetInstance()->impl()
|
||||
->CurrentOsStackTraceExceptTop(1)
|
||||
// Skips the stack frame for this function itself.
|
||||
); // NOLINT
|
||||
}
|
||||
|
||||
// Application pathname gotten in InitGoogleTest.
|
||||
String g_executable_path;
|
||||
|
||||
// Returns the current application's name, removing directory path if that
|
||||
// is present.
|
||||
FilePath GetCurrentExecutableName() {
|
||||
FilePath result;
|
||||
|
||||
#if defined(_WIN32_WCE) || defined(_WIN32)
|
||||
result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
|
||||
#else
|
||||
result.Set(FilePath(g_executable_path));
|
||||
#endif // _WIN32_WCE || _WIN32
|
||||
|
||||
return result.RemoveDirectoryName();
|
||||
}
|
||||
|
||||
// Functions for processing the gtest_output flag.
|
||||
|
||||
// Returns the output format, or "" for normal printed output.
|
||||
String UnitTestOptions::GetOutputFormat() {
|
||||
const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
|
||||
if (gtest_output_flag == NULL) return String("");
|
||||
|
||||
const char* const colon = strchr(gtest_output_flag, ':');
|
||||
return (colon == NULL) ?
|
||||
String(gtest_output_flag) :
|
||||
String(gtest_output_flag, colon - gtest_output_flag);
|
||||
}
|
||||
|
||||
// Returns the name of the requested output file, or the default if none
|
||||
// was explicitly specified.
|
||||
String UnitTestOptions::GetOutputFile() {
|
||||
const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
|
||||
if (gtest_output_flag == NULL)
|
||||
return String("");
|
||||
|
||||
const char* const colon = strchr(gtest_output_flag, ':');
|
||||
if (colon == NULL)
|
||||
return String(kDefaultOutputFile);
|
||||
|
||||
internal::FilePath output_name(colon + 1);
|
||||
if (!output_name.IsDirectory())
|
||||
return output_name.ToString();
|
||||
|
||||
internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
|
||||
output_name, internal::GetCurrentExecutableName(),
|
||||
GetOutputFormat().c_str()));
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
// Returns true iff the wildcard pattern matches the string. The
|
||||
// first ':' or '\0' character in pattern marks the end of it.
|
||||
//
|
||||
// This recursive algorithm isn't very efficient, but is clear and
|
||||
// works well enough for matching test names, which are short.
|
||||
bool UnitTestOptions::PatternMatchesString(const char *pattern,
|
||||
const char *str) {
|
||||
switch (*pattern) {
|
||||
case '\0':
|
||||
case ':': // Either ':' or '\0' marks the end of the pattern.
|
||||
return *str == '\0';
|
||||
case '?': // Matches any single character.
|
||||
return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
|
||||
case '*': // Matches any string (possibly empty) of characters.
|
||||
return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
|
||||
PatternMatchesString(pattern + 1, str);
|
||||
default: // Non-special character. Matches itself.
|
||||
return *pattern == *str &&
|
||||
PatternMatchesString(pattern + 1, str + 1);
|
||||
}
|
||||
}
|
||||
|
||||
bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
|
||||
const char *cur_pattern = filter;
|
||||
while (true) {
|
||||
if (PatternMatchesString(cur_pattern, name.c_str())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Finds the next pattern in the filter.
|
||||
cur_pattern = strchr(cur_pattern, ':');
|
||||
|
||||
// Returns if no more pattern can be found.
|
||||
if (cur_pattern == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skips the pattern separater (the ':' character).
|
||||
cur_pattern++;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(keithray): move String function implementations to gtest-string.cc.
|
||||
|
||||
// Returns true iff the user-specified filter matches the test case
|
||||
// name and the test name.
|
||||
bool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
|
||||
const String &test_name) {
|
||||
const String& full_name = String::Format("%s.%s",
|
||||
test_case_name.c_str(),
|
||||
test_name.c_str());
|
||||
|
||||
// Split --gtest_filter at '-', if there is one, to separate into
|
||||
// positive filter and negative filter portions
|
||||
const char* const p = GTEST_FLAG(filter).c_str();
|
||||
const char* const dash = strchr(p, '-');
|
||||
String positive;
|
||||
String negative;
|
||||
if (dash == NULL) {
|
||||
positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter
|
||||
negative = String("");
|
||||
} else {
|
||||
positive.Set(p, dash - p); // Everything up to the dash
|
||||
negative = String(dash+1); // Everything after the dash
|
||||
if (positive.empty()) {
|
||||
// Treat '-test1' as the same as '*-test1'
|
||||
positive = kUniversalFilter;
|
||||
}
|
||||
}
|
||||
|
||||
// A filter is a colon-separated list of patterns. It matches a
|
||||
// test if any pattern in it matches the test.
|
||||
return (MatchesFilter(full_name, positive.c_str()) &&
|
||||
!MatchesFilter(full_name, negative.c_str()));
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
|
||||
// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
|
||||
// This function is useful as an __except condition.
|
||||
int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
|
||||
// Google Test should handle an exception if:
|
||||
// 1. the user wants it to, AND
|
||||
// 2. this is not a breakpoint exception.
|
||||
return (GTEST_FLAG(catch_exceptions) &&
|
||||
exception_code != EXCEPTION_BREAKPOINT) ?
|
||||
EXCEPTION_EXECUTE_HANDLER :
|
||||
EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// The interface for printing the result of a UnitTest
|
||||
class UnitTestEventListenerInterface {
|
||||
public:
|
||||
// The d'tor is pure virtual as this is an abstract class.
|
||||
virtual ~UnitTestEventListenerInterface() = 0;
|
||||
|
||||
// Called before the unit test starts.
|
||||
virtual void OnUnitTestStart(const UnitTest*) {}
|
||||
|
||||
// Called after the unit test ends.
|
||||
virtual void OnUnitTestEnd(const UnitTest*) {}
|
||||
|
||||
// Called before the test case starts.
|
||||
virtual void OnTestCaseStart(const TestCase*) {}
|
||||
|
||||
// Called after the test case ends.
|
||||
virtual void OnTestCaseEnd(const TestCase*) {}
|
||||
|
||||
// Called before the global set-up starts.
|
||||
virtual void OnGlobalSetUpStart(const UnitTest*) {}
|
||||
|
||||
// Called after the global set-up ends.
|
||||
virtual void OnGlobalSetUpEnd(const UnitTest*) {}
|
||||
|
||||
// Called before the global tear-down starts.
|
||||
virtual void OnGlobalTearDownStart(const UnitTest*) {}
|
||||
|
||||
// Called after the global tear-down ends.
|
||||
virtual void OnGlobalTearDownEnd(const UnitTest*) {}
|
||||
|
||||
// Called before the test starts.
|
||||
virtual void OnTestStart(const TestInfo*) {}
|
||||
|
||||
// Called after the test ends.
|
||||
virtual void OnTestEnd(const TestInfo*) {}
|
||||
|
||||
// Called after an assertion.
|
||||
virtual void OnNewTestPartResult(const TestPartResult*) {}
|
||||
};
|
||||
|
||||
// Constructs an empty TestPartResultArray.
|
||||
TestPartResultArray::TestPartResultArray()
|
||||
: list_(new internal::List<TestPartResult>) {
|
||||
}
|
||||
|
||||
// Destructs a TestPartResultArray.
|
||||
TestPartResultArray::~TestPartResultArray() {
|
||||
delete list_;
|
||||
}
|
||||
|
||||
// Appends a TestPartResult to the array.
|
||||
void TestPartResultArray::Append(const TestPartResult& result) {
|
||||
list_->PushBack(result);
|
||||
}
|
||||
|
||||
// Returns the TestPartResult at the given index (0-based).
|
||||
const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
|
||||
if (index < 0 || index >= size()) {
|
||||
printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
|
||||
abort();
|
||||
}
|
||||
|
||||
const internal::ListNode<TestPartResult>* p = list_->Head();
|
||||
for (int i = 0; i < index; i++) {
|
||||
p = p->next();
|
||||
}
|
||||
|
||||
return p->element();
|
||||
}
|
||||
|
||||
// Returns the number of TestPartResult objects in the array.
|
||||
int TestPartResultArray::size() const {
|
||||
return list_->size();
|
||||
}
|
||||
|
||||
// The c'tor sets this object as the test part result reporter used by
|
||||
// Google Test. The 'result' parameter specifies where to report the
|
||||
// results.
|
||||
ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
|
||||
TestPartResultArray* result)
|
||||
: old_reporter_(UnitTest::GetInstance()->impl()->
|
||||
test_part_result_reporter()),
|
||||
result_(result) {
|
||||
internal::UnitTestImpl* const impl = UnitTest::GetInstance()->impl();
|
||||
impl->set_test_part_result_reporter(this);
|
||||
}
|
||||
|
||||
// The d'tor restores the test part result reporter used by Google Test
|
||||
// before.
|
||||
ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
|
||||
UnitTest::GetInstance()->impl()->
|
||||
set_test_part_result_reporter(old_reporter_);
|
||||
}
|
||||
|
||||
// Increments the test part result count and remembers the result.
|
||||
// This method is from the TestPartResultReporterInterface interface.
|
||||
void ScopedFakeTestPartResultReporter::ReportTestPartResult(
|
||||
const TestPartResult& result) {
|
||||
result_->Append(result);
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// This predicate-formatter checks that 'results' contains a test part
|
||||
// failure of the given type and that the failure message contains the
|
||||
// given substring.
|
||||
AssertionResult HasOneFailure(const char* /* results_expr */,
|
||||
const char* /* type_expr */,
|
||||
const char* /* substr_expr */,
|
||||
const TestPartResultArray& results,
|
||||
TestPartResultType type,
|
||||
const char* substr) {
|
||||
const String expected(
|
||||
type == TPRT_FATAL_FAILURE ? "1 fatal failure" :
|
||||
"1 non-fatal failure");
|
||||
Message msg;
|
||||
if (results.size() != 1) {
|
||||
msg << "Expected: " << expected << "\n"
|
||||
<< " Actual: " << results.size() << " failures";
|
||||
for (int i = 0; i < results.size(); i++) {
|
||||
msg << "\n" << results.GetTestPartResult(i);
|
||||
}
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
const TestPartResult& r = results.GetTestPartResult(0);
|
||||
if (r.type() != type) {
|
||||
msg << "Expected: " << expected << "\n"
|
||||
<< " Actual:\n"
|
||||
<< r;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
if (strstr(r.message(), substr) == NULL) {
|
||||
msg << "Expected: " << expected << " containing \""
|
||||
<< substr << "\"\n"
|
||||
<< " Actual:\n"
|
||||
<< r;
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
// The constructor of SingleFailureChecker remembers where to look up
|
||||
// test part results, what type of failure we expect, and what
|
||||
// substring the failure message should contain.
|
||||
SingleFailureChecker:: SingleFailureChecker(
|
||||
const TestPartResultArray* results,
|
||||
TestPartResultType type,
|
||||
const char* substr)
|
||||
: results_(results),
|
||||
type_(type),
|
||||
substr_(substr) {}
|
||||
|
||||
// The destructor of SingleFailureChecker verifies that the given
|
||||
// TestPartResultArray contains exactly one failure that has the given
|
||||
// type and contains the given substring. If that's not the case, a
|
||||
// non-fatal failure will be generated.
|
||||
SingleFailureChecker::~SingleFailureChecker() {
|
||||
EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str());
|
||||
}
|
||||
|
||||
// Reports a test part result.
|
||||
void UnitTestImpl::ReportTestPartResult(const TestPartResult& result) {
|
||||
current_test_result()->AddTestPartResult(result);
|
||||
result_printer()->OnNewTestPartResult(&result);
|
||||
}
|
||||
|
||||
// Returns the current test part result reporter.
|
||||
TestPartResultReporterInterface* UnitTestImpl::test_part_result_reporter() {
|
||||
return test_part_result_reporter_;
|
||||
}
|
||||
|
||||
// Sets the current test part result reporter.
|
||||
void UnitTestImpl::set_test_part_result_reporter(
|
||||
TestPartResultReporterInterface* reporter) {
|
||||
test_part_result_reporter_ = reporter;
|
||||
}
|
||||
|
||||
// Gets the number of successful test cases.
|
||||
int UnitTestImpl::successful_test_case_count() const {
|
||||
return test_cases_.CountIf(TestCasePassed);
|
||||
}
|
||||
|
||||
// Gets the number of failed test cases.
|
||||
int UnitTestImpl::failed_test_case_count() const {
|
||||
return test_cases_.CountIf(TestCaseFailed);
|
||||
}
|
||||
|
||||
// Gets the number of all test cases.
|
||||
int UnitTestImpl::total_test_case_count() const {
|
||||
return test_cases_.size();
|
||||
}
|
||||
|
||||
// Gets the number of all test cases that contain at least one test
|
||||
// that should run.
|
||||
int UnitTestImpl::test_case_to_run_count() const {
|
||||
return test_cases_.CountIf(ShouldRunTestCase);
|
||||
}
|
||||
|
||||
// Gets the number of successful tests.
|
||||
int UnitTestImpl::successful_test_count() const {
|
||||
return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
|
||||
}
|
||||
|
||||
// Gets the number of failed tests.
|
||||
int UnitTestImpl::failed_test_count() const {
|
||||
return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
|
||||
}
|
||||
|
||||
// Gets the number of disabled tests.
|
||||
int UnitTestImpl::disabled_test_count() const {
|
||||
return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
|
||||
}
|
||||
|
||||
// Gets the number of all tests.
|
||||
int UnitTestImpl::total_test_count() const {
|
||||
return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
|
||||
}
|
||||
|
||||
// Gets the number of tests that should run.
|
||||
int UnitTestImpl::test_to_run_count() const {
|
||||
return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
|
||||
}
|
||||
|
||||
// Returns the current OS stack trace as a String.
|
||||
//
|
||||
// The maximum number of stack frames to be included is specified by
|
||||
// the gtest_stack_trace_depth flag. The skip_count parameter
|
||||
// specifies the number of top frames to be skipped, which doesn't
|
||||
// count against the number of frames to be included.
|
||||
//
|
||||
// For example, if Foo() calls Bar(), which in turn calls
|
||||
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
||||
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
||||
String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
|
||||
(void)skip_count;
|
||||
return String("");
|
||||
}
|
||||
|
||||
static TimeInMillis GetTimeInMillis() {
|
||||
#ifdef _WIN32_WCE // We are on Windows CE
|
||||
// Difference between 1970-01-01 and 1601-01-01 in miliseconds.
|
||||
// http://analogous.blogspot.com/2005/04/epoch.html
|
||||
const TimeInMillis kJavaEpochToWinFileTimeDelta = 11644473600000UL;
|
||||
const DWORD kTenthMicrosInMilliSecond = 10000;
|
||||
|
||||
SYSTEMTIME now_systime;
|
||||
FILETIME now_filetime;
|
||||
ULARGE_INTEGER now_int64;
|
||||
// TODO(kenton@google.com): Shouldn't this just use
|
||||
// GetSystemTimeAsFileTime()?
|
||||
GetSystemTime(&now_systime);
|
||||
if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
|
||||
now_int64.LowPart = now_filetime.dwLowDateTime;
|
||||
now_int64.HighPart = now_filetime.dwHighDateTime;
|
||||
now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
|
||||
kJavaEpochToWinFileTimeDelta;
|
||||
return now_int64.QuadPart;
|
||||
}
|
||||
return 0;
|
||||
#elif defined(_WIN32) && !defined(GTEST_HAS_GETTIMEOFDAY)
|
||||
__timeb64 now;
|
||||
#ifdef _MSC_VER
|
||||
// MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
|
||||
// (deprecated function) there.
|
||||
// TODO(kenton@google.com): Use GetTickCount()? Or use
|
||||
// SystemTimeToFileTime()
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
_ftime64(&now);
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else
|
||||
_ftime64(&now);
|
||||
#endif // _MSC_VER
|
||||
return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
|
||||
#elif defined(GTEST_HAS_GETTIMEOFDAY)
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
|
||||
#else
|
||||
#error "Don't know how to get the current time on your system."
|
||||
#endif
|
||||
}
|
||||
|
||||
// Utilities
|
||||
|
||||
// class String
|
||||
|
||||
// Returns the input enclosed in double quotes if it's not NULL;
|
||||
// otherwise returns "(null)". For example, "\"Hello\"" is returned
|
||||
// for input "Hello".
|
||||
//
|
||||
// This is useful for printing a C string in the syntax of a literal.
|
||||
//
|
||||
// Known issue: escape sequences are not handled yet.
|
||||
String String::ShowCStringQuoted(const char* c_str) {
|
||||
return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
|
||||
}
|
||||
|
||||
// Copies at most length characters from str into a newly-allocated
|
||||
// piece of memory of size length+1. The memory is allocated with new[].
|
||||
// A terminating null byte is written to the memory, and a pointer to it
|
||||
// is returned. If str is NULL, NULL is returned.
|
||||
static char* CloneString(const char* str, size_t length) {
|
||||
if (str == NULL) {
|
||||
return NULL;
|
||||
} else {
|
||||
char* const clone = new char[length + 1];
|
||||
// MSVC 8 deprecates strncpy(), so we want to suppress warning
|
||||
// 4996 (deprecated function) there.
|
||||
#ifdef GTEST_OS_WINDOWS // We are on Windows.
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
strncpy(clone, str, length);
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else // We are on Linux or Mac OS.
|
||||
strncpy(clone, str, length);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
clone[length] = '\0';
|
||||
return clone;
|
||||
}
|
||||
}
|
||||
|
||||
// Clones a 0-terminated C string, allocating memory using new. The
|
||||
// caller is responsible for deleting[] the return value. Returns the
|
||||
// cloned string, or NULL if the input is NULL.
|
||||
const char * String::CloneCString(const char* c_str) {
|
||||
return (c_str == NULL) ?
|
||||
NULL : CloneString(c_str, strlen(c_str));
|
||||
}
|
||||
|
||||
// Compares two C strings. Returns true iff they have the same content.
|
||||
//
|
||||
// Unlike strcmp(), this function can handle NULL argument(s). A NULL
|
||||
// C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
bool String::CStringEquals(const char * lhs, const char * rhs) {
|
||||
if ( lhs == NULL ) return rhs == NULL;
|
||||
|
||||
if ( rhs == NULL ) return false;
|
||||
|
||||
return strcmp(lhs, rhs) == 0;
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
// Converts an array of wide chars to a narrow string using the UTF-8
|
||||
// encoding, and streams the result to the given Message object.
|
||||
static void StreamWideCharsToMessage(const wchar_t* wstr, size_t len,
|
||||
Message* msg) {
|
||||
for (size_t i = 0; i != len; i++) {
|
||||
// TODO(wan): consider allowing a testing::String object to
|
||||
// contain '\0'. This will make it behave more like std::string,
|
||||
// and will allow ToUtf8String() to return the correct encoding
|
||||
// for '\0' s.t. we can get rid of the conditional here (and in
|
||||
// several other places).
|
||||
if (wstr[i]) {
|
||||
*msg << internal::ToUtf8String(wstr[i]);
|
||||
} else {
|
||||
*msg << '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
} // namespace internal
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
// Converts the given wide string to a narrow string using the UTF-8
|
||||
// encoding, and streams the result to this Message object.
|
||||
Message& Message::operator <<(const ::std::wstring& wstr) {
|
||||
internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
|
||||
return *this;
|
||||
}
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
// Converts the given wide string to a narrow string using the UTF-8
|
||||
// encoding, and streams the result to this Message object.
|
||||
Message& Message::operator <<(const ::wstring& wstr) {
|
||||
internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
|
||||
return *this;
|
||||
}
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Formats a value to be used in a failure message.
|
||||
|
||||
// For a char value, we print it as a C++ char literal and as an
|
||||
// unsigned integer (both in decimal and in hexadecimal).
|
||||
String FormatForFailureMessage(char ch) {
|
||||
const unsigned int ch_as_uint = ch;
|
||||
// A String object cannot contain '\0', so we print "\\0" when ch is
|
||||
// '\0'.
|
||||
return String::Format("'%s' (%u, 0x%X)",
|
||||
ch ? String::Format("%c", ch).c_str() : "\\0",
|
||||
ch_as_uint, ch_as_uint);
|
||||
}
|
||||
|
||||
// For a wchar_t value, we print it as a C++ wchar_t literal and as an
|
||||
// unsigned integer (both in decimal and in hexidecimal).
|
||||
String FormatForFailureMessage(wchar_t wchar) {
|
||||
// The C++ standard doesn't specify the exact size of the wchar_t
|
||||
// type. It just says that it shall have the same size as another
|
||||
// integral type, called its underlying type.
|
||||
//
|
||||
// Therefore, in order to print a wchar_t value in the numeric form,
|
||||
// we first convert it to the largest integral type (UInt64) and
|
||||
// then print the converted value.
|
||||
//
|
||||
// We use streaming to print the value as "%llu" doesn't work
|
||||
// correctly with MSVC 7.1.
|
||||
const UInt64 wchar_as_uint64 = wchar;
|
||||
Message msg;
|
||||
// A String object cannot contain '\0', so we print "\\0" when wchar is
|
||||
// L'\0'.
|
||||
msg << "L'" << (wchar ? ToUtf8String(wchar).c_str() : "\\0") << "' ("
|
||||
<< wchar_as_uint64 << ", 0x" << ::std::setbase(16)
|
||||
<< wchar_as_uint64 << ")";
|
||||
return msg.GetString();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// AssertionResult constructor.
|
||||
AssertionResult::AssertionResult(const internal::String& failure_message)
|
||||
: failure_message_(failure_message) {
|
||||
}
|
||||
|
||||
|
||||
// Makes a successful assertion result.
|
||||
AssertionResult AssertionSuccess() {
|
||||
return AssertionResult();
|
||||
}
|
||||
|
||||
|
||||
// Makes a failed assertion result with the given failure message.
|
||||
AssertionResult AssertionFailure(const Message& message) {
|
||||
return AssertionResult(message.GetString());
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Constructs and returns the message for an equality assertion
|
||||
// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
|
||||
//
|
||||
// The first four parameters are the expressions used in the assertion
|
||||
// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
|
||||
// where foo is 5 and bar is 6, we have:
|
||||
//
|
||||
// expected_expression: "foo"
|
||||
// actual_expression: "bar"
|
||||
// expected_value: "5"
|
||||
// actual_value: "6"
|
||||
//
|
||||
// The ignoring_case parameter is true iff the assertion is a
|
||||
// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
|
||||
// be inserted into the message.
|
||||
AssertionResult EqFailure(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const String& expected_value,
|
||||
const String& actual_value,
|
||||
bool ignoring_case) {
|
||||
Message msg;
|
||||
msg << "Value of: " << actual_expression;
|
||||
if (actual_value != actual_expression) {
|
||||
msg << "\n Actual: " << actual_value;
|
||||
}
|
||||
|
||||
msg << "\nExpected: " << expected_expression;
|
||||
if (ignoring_case) {
|
||||
msg << " (ignoring case)";
|
||||
}
|
||||
if (expected_value != expected_expression) {
|
||||
msg << "\nWhich is: " << expected_value;
|
||||
}
|
||||
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
|
||||
// Helper function for implementing ASSERT_NEAR.
|
||||
AssertionResult DoubleNearPredFormat(const char* expr1,
|
||||
const char* expr2,
|
||||
const char* abs_error_expr,
|
||||
double val1,
|
||||
double val2,
|
||||
double abs_error) {
|
||||
const double diff = fabs(val1 - val2);
|
||||
if (diff <= abs_error) return AssertionSuccess();
|
||||
|
||||
// TODO(wan): do not print the value of an expression if it's
|
||||
// already a literal.
|
||||
Message msg;
|
||||
msg << "The difference between " << expr1 << " and " << expr2
|
||||
<< " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
|
||||
<< expr1 << " evaluates to " << val1 << ",\n"
|
||||
<< expr2 << " evaluates to " << val2 << ", and\n"
|
||||
<< abs_error_expr << " evaluates to " << abs_error << ".";
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
|
||||
// Helper template for implementing FloatLE() and DoubleLE().
|
||||
template <typename RawType>
|
||||
AssertionResult FloatingPointLE(const char* expr1,
|
||||
const char* expr2,
|
||||
RawType val1,
|
||||
RawType val2) {
|
||||
// Returns success if val1 is less than val2,
|
||||
if (val1 < val2) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
// or if val1 is almost equal to val2.
|
||||
const FloatingPoint<RawType> lhs(val1), rhs(val2);
|
||||
if (lhs.AlmostEquals(rhs)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
// Note that the above two checks will both fail if either val1 or
|
||||
// val2 is NaN, as the IEEE floating-point standard requires that
|
||||
// any predicate involving a NaN must return false.
|
||||
|
||||
StrStream val1_ss;
|
||||
val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
|
||||
<< val1;
|
||||
|
||||
StrStream val2_ss;
|
||||
val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
|
||||
<< val2;
|
||||
|
||||
Message msg;
|
||||
msg << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
|
||||
<< " Actual: " << StrStreamToString(&val1_ss) << " vs "
|
||||
<< StrStreamToString(&val2_ss);
|
||||
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Asserts that val1 is less than, or almost equal to, val2. Fails
|
||||
// otherwise. In particular, it fails if either val1 or val2 is NaN.
|
||||
AssertionResult FloatLE(const char* expr1, const char* expr2,
|
||||
float val1, float val2) {
|
||||
return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
|
||||
}
|
||||
|
||||
// Asserts that val1 is less than, or almost equal to, val2. Fails
|
||||
// otherwise. In particular, it fails if either val1 or val2 is NaN.
|
||||
AssertionResult DoubleLE(const char* expr1, const char* expr2,
|
||||
double val1, double val2) {
|
||||
return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_EQ with int or enum
|
||||
// arguments.
|
||||
AssertionResult CmpHelperEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
BiggestInt expected,
|
||||
BiggestInt actual) {
|
||||
if (expected == actual) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
FormatForComparisonFailureMessage(expected, actual),
|
||||
FormatForComparisonFailureMessage(actual, expected),
|
||||
false);
|
||||
}
|
||||
|
||||
// A macro for implementing the helper functions needed to implement
|
||||
// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here
|
||||
// just to avoid copy-and-paste of similar code.
|
||||
#define GTEST_IMPL_CMP_HELPER(op_name, op)\
|
||||
AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
|
||||
BiggestInt val1, BiggestInt val2) {\
|
||||
if (val1 op val2) {\
|
||||
return AssertionSuccess();\
|
||||
} else {\
|
||||
Message msg;\
|
||||
msg << "Expected: (" << expr1 << ") " #op " (" << expr2\
|
||||
<< "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
|
||||
<< " vs " << FormatForComparisonFailureMessage(val2, val1);\
|
||||
return AssertionFailure(msg);\
|
||||
}\
|
||||
}
|
||||
|
||||
// Implements the helper function for {ASSERT|EXPECT}_NE with int or
|
||||
// enum arguments.
|
||||
GTEST_IMPL_CMP_HELPER(NE, !=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LE with int or
|
||||
// enum arguments.
|
||||
GTEST_IMPL_CMP_HELPER(LE, <=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LT with int or
|
||||
// enum arguments.
|
||||
GTEST_IMPL_CMP_HELPER(LT, < )
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GE with int or
|
||||
// enum arguments.
|
||||
GTEST_IMPL_CMP_HELPER(GE, >=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GT with int or
|
||||
// enum arguments.
|
||||
GTEST_IMPL_CMP_HELPER(GT, > )
|
||||
|
||||
#undef GTEST_IMPL_CMP_HELPER
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STREQ.
|
||||
AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const char* expected,
|
||||
const char* actual) {
|
||||
if (String::CStringEquals(expected, actual)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
String::ShowCStringQuoted(expected),
|
||||
String::ShowCStringQuoted(actual),
|
||||
false);
|
||||
}
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
|
||||
AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const char* expected,
|
||||
const char* actual) {
|
||||
if (String::CaseInsensitiveCStringEquals(expected, actual)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
String::ShowCStringQuoted(expected),
|
||||
String::ShowCStringQuoted(actual),
|
||||
true);
|
||||
}
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRNE.
|
||||
AssertionResult CmpHelperSTRNE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const char* s1,
|
||||
const char* s2) {
|
||||
if (!String::CStringEquals(s1, s2)) {
|
||||
return AssertionSuccess();
|
||||
} else {
|
||||
Message msg;
|
||||
msg << "Expected: (" << s1_expression << ") != ("
|
||||
<< s2_expression << "), actual: \""
|
||||
<< s1 << "\" vs \"" << s2 << "\"";
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
}
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STRCASENE.
|
||||
AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const char* s1,
|
||||
const char* s2) {
|
||||
if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
|
||||
return AssertionSuccess();
|
||||
} else {
|
||||
Message msg;
|
||||
msg << "Expected: (" << s1_expression << ") != ("
|
||||
<< s2_expression << ") (ignoring case), actual: \""
|
||||
<< s1 << "\" vs \"" << s2 << "\"";
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
namespace {
|
||||
|
||||
// Helper functions for implementing IsSubString() and IsNotSubstring().
|
||||
|
||||
// This group of overloaded functions return true iff needle is a
|
||||
// substring of haystack. NULL is considered a substring of itself
|
||||
// only.
|
||||
|
||||
bool IsSubstringPred(const char* needle, const char* haystack) {
|
||||
if (needle == NULL || haystack == NULL)
|
||||
return needle == haystack;
|
||||
|
||||
return strstr(haystack, needle) != NULL;
|
||||
}
|
||||
|
||||
bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
|
||||
if (needle == NULL || haystack == NULL)
|
||||
return needle == haystack;
|
||||
|
||||
return wcsstr(haystack, needle) != NULL;
|
||||
}
|
||||
|
||||
// StringType here can be either ::std::string or ::std::wstring.
|
||||
template <typename StringType>
|
||||
bool IsSubstringPred(const StringType& needle,
|
||||
const StringType& haystack) {
|
||||
return haystack.find(needle) != StringType::npos;
|
||||
}
|
||||
|
||||
// This function implements either IsSubstring() or IsNotSubstring(),
|
||||
// depending on the value of the expected_to_be_substring parameter.
|
||||
// StringType here can be const char*, const wchar_t*, ::std::string,
|
||||
// or ::std::wstring.
|
||||
template <typename StringType>
|
||||
AssertionResult IsSubstringImpl(
|
||||
bool expected_to_be_substring,
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const StringType& needle, const StringType& haystack) {
|
||||
if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
|
||||
return AssertionSuccess();
|
||||
|
||||
const bool is_wide_string = sizeof(needle[0]) > 1;
|
||||
const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
|
||||
return AssertionFailure(
|
||||
Message()
|
||||
<< "Value of: " << needle_expr << "\n"
|
||||
<< " Actual: " << begin_string_quote << needle << "\"\n"
|
||||
<< "Expected: " << (expected_to_be_substring ? "" : "not ")
|
||||
<< "a substring of " << haystack_expr << "\n"
|
||||
<< "Which is: " << begin_string_quote << haystack << "\"");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// IsSubstring() and IsNotSubstring() check whether needle is a
|
||||
// substring of haystack (NULL is considered a substring of itself
|
||||
// only), and return an appropriate error message when they fail.
|
||||
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const char* needle, const char* haystack) {
|
||||
return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const wchar_t* needle, const wchar_t* haystack) {
|
||||
return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const char* needle, const char* haystack) {
|
||||
return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const wchar_t* needle, const wchar_t* haystack) {
|
||||
return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::string& needle, const ::std::string& haystack) {
|
||||
return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::string& needle, const ::std::string& haystack) {
|
||||
return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
AssertionResult IsSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::wstring& needle, const ::std::wstring& haystack) {
|
||||
return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
|
||||
AssertionResult IsNotSubstring(
|
||||
const char* needle_expr, const char* haystack_expr,
|
||||
const ::std::wstring& needle, const ::std::wstring& haystack) {
|
||||
return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
|
||||
}
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
namespace internal {
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
namespace {
|
||||
|
||||
// Helper function for IsHRESULT{SuccessFailure} predicates
|
||||
AssertionResult HRESULTFailureHelper(const char* expr,
|
||||
const char* expected,
|
||||
long hr) { // NOLINT
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE doesn't support FormatMessage.
|
||||
const char error_text[] = "";
|
||||
#else
|
||||
// Looks up the human-readable system message for the HRESULT code
|
||||
// and since we're not passing any params to FormatMessage, we don't
|
||||
// want inserts expanded.
|
||||
const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS;
|
||||
const DWORD kBufSize = 4096; // String::Format can't exceed this length.
|
||||
// Gets the system's human readable message string for this HRESULT.
|
||||
char error_text[kBufSize] = { '\0' };
|
||||
DWORD message_length = ::FormatMessageA(kFlags,
|
||||
0, // no source, we're asking system
|
||||
hr, // the error
|
||||
0, // no line width restrictions
|
||||
error_text, // output buffer
|
||||
kBufSize, // buf size
|
||||
NULL); // no arguments for inserts
|
||||
// Trims tailing white space (FormatMessage leaves a trailing cr-lf)
|
||||
for (; message_length && isspace(error_text[message_length - 1]);
|
||||
--message_length) {
|
||||
error_text[message_length - 1] = '\0';
|
||||
}
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
const String error_hex(String::Format("0x%08X ", hr));
|
||||
Message msg;
|
||||
msg << "Expected: " << expr << " " << expected << ".\n"
|
||||
<< " Actual: " << error_hex << error_text << "\n";
|
||||
|
||||
return ::testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT
|
||||
if (SUCCEEDED(hr)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
return HRESULTFailureHelper(expr, "succeeds", hr);
|
||||
}
|
||||
|
||||
AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT
|
||||
if (FAILED(hr)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
return HRESULTFailureHelper(expr, "fails", hr);
|
||||
}
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Utility functions for encoding Unicode text (wide strings) in
|
||||
// UTF-8.
|
||||
|
||||
// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
|
||||
// like this:
|
||||
//
|
||||
// Code-point length Encoding
|
||||
// 0 - 7 bits 0xxxxxxx
|
||||
// 8 - 11 bits 110xxxxx 10xxxxxx
|
||||
// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx
|
||||
// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
|
||||
// The maximum code-point a one-byte UTF-8 sequence can represent.
|
||||
const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
|
||||
|
||||
// The maximum code-point a two-byte UTF-8 sequence can represent.
|
||||
const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
|
||||
|
||||
// The maximum code-point a three-byte UTF-8 sequence can represent.
|
||||
const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
|
||||
|
||||
// The maximum code-point a four-byte UTF-8 sequence can represent.
|
||||
const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
|
||||
|
||||
// Chops off the n lowest bits from a bit pattern. Returns the n
|
||||
// lowest bits. As a side effect, the original bit pattern will be
|
||||
// shifted to the right by n bits.
|
||||
inline UInt32 ChopLowBits(UInt32* bits, int n) {
|
||||
const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
|
||||
*bits >>= n;
|
||||
return low_bits;
|
||||
}
|
||||
|
||||
// Converts a Unicode code-point to its UTF-8 encoding.
|
||||
String ToUtf8String(wchar_t wchar) {
|
||||
char str[5] = {}; // Initializes str to all '\0' characters.
|
||||
|
||||
UInt32 code = static_cast<UInt32>(wchar);
|
||||
if (code <= kMaxCodePoint1) {
|
||||
str[0] = static_cast<char>(code); // 0xxxxxxx
|
||||
} else if (code <= kMaxCodePoint2) {
|
||||
str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[0] = static_cast<char>(0xC0 | code); // 110xxxxx
|
||||
} else if (code <= kMaxCodePoint3) {
|
||||
str[2] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[0] = static_cast<char>(0xE0 | code); // 1110xxxx
|
||||
} else if (code <= kMaxCodePoint4) {
|
||||
str[3] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[2] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx
|
||||
str[0] = static_cast<char>(0xF0 | code); // 11110xxx
|
||||
} else {
|
||||
return String::Format("(Invalid Unicode 0x%llX)",
|
||||
static_cast<UInt64>(wchar));
|
||||
}
|
||||
|
||||
return String(str);
|
||||
}
|
||||
|
||||
// Converts a wide C string to a String using the UTF-8 encoding.
|
||||
// NULL will be converted to "(null)".
|
||||
String String::ShowWideCString(const wchar_t * wide_c_str) {
|
||||
if (wide_c_str == NULL) return String("(null)");
|
||||
|
||||
StrStream ss;
|
||||
while (*wide_c_str) {
|
||||
ss << internal::ToUtf8String(*wide_c_str++);
|
||||
}
|
||||
|
||||
return internal::StrStreamToString(&ss);
|
||||
}
|
||||
|
||||
// Similar to ShowWideCString(), except that this function encloses
|
||||
// the converted string in double quotes.
|
||||
String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
|
||||
if (wide_c_str == NULL) return String("(null)");
|
||||
|
||||
return String::Format("L\"%s\"",
|
||||
String::ShowWideCString(wide_c_str).c_str());
|
||||
}
|
||||
|
||||
// Compares two wide C strings. Returns true iff they have the same
|
||||
// content.
|
||||
//
|
||||
// Unlike wcscmp(), this function can handle NULL argument(s). A NULL
|
||||
// C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
|
||||
if (lhs == NULL) return rhs == NULL;
|
||||
|
||||
if (rhs == NULL) return false;
|
||||
|
||||
return wcscmp(lhs, rhs) == 0;
|
||||
}
|
||||
|
||||
// Helper function for *_STREQ on wide strings.
|
||||
AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const wchar_t* expected,
|
||||
const wchar_t* actual) {
|
||||
if (String::WideCStringEquals(expected, actual)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
String::ShowWideCStringQuoted(expected),
|
||||
String::ShowWideCStringQuoted(actual),
|
||||
false);
|
||||
}
|
||||
|
||||
// Helper function for *_STRNE on wide strings.
|
||||
AssertionResult CmpHelperSTRNE(const char* s1_expression,
|
||||
const char* s2_expression,
|
||||
const wchar_t* s1,
|
||||
const wchar_t* s2) {
|
||||
if (!String::WideCStringEquals(s1, s2)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
Message msg;
|
||||
msg << "Expected: (" << s1_expression << ") != ("
|
||||
<< s2_expression << "), actual: "
|
||||
<< String::ShowWideCStringQuoted(s1)
|
||||
<< " vs " << String::ShowWideCStringQuoted(s2);
|
||||
return AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// Compares two C strings, ignoring case. Returns true iff they have
|
||||
// the same content.
|
||||
//
|
||||
// Unlike strcasecmp(), this function can handle NULL argument(s). A
|
||||
// NULL C string is considered different to any non-NULL C string,
|
||||
// including the empty string.
|
||||
bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
|
||||
if ( lhs == NULL ) return rhs == NULL;
|
||||
|
||||
if ( rhs == NULL ) return false;
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
return _stricmp(lhs, rhs) == 0;
|
||||
#else // GTEST_OS_WINDOWS
|
||||
return strcasecmp(lhs, rhs) == 0;
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
// Constructs a String by copying a given number of chars from a
|
||||
// buffer. E.g. String("hello", 3) will create the string "hel".
|
||||
String::String(const char * buffer, size_t len) {
|
||||
char * const temp = new char[ len + 1 ];
|
||||
memcpy(temp, buffer, len);
|
||||
temp[ len ] = '\0';
|
||||
c_str_ = temp;
|
||||
}
|
||||
|
||||
// Compares this with another String.
|
||||
// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
|
||||
// if this is greater than rhs.
|
||||
int String::Compare(const String & rhs) const {
|
||||
if ( c_str_ == NULL ) {
|
||||
return rhs.c_str_ == NULL ? 0 : -1; // NULL < anything except NULL
|
||||
}
|
||||
|
||||
return rhs.c_str_ == NULL ? 1 : strcmp(c_str_, rhs.c_str_);
|
||||
}
|
||||
|
||||
// Returns true iff this String ends with the given suffix. *Any*
|
||||
// String is considered to end with a NULL or empty suffix.
|
||||
bool String::EndsWith(const char* suffix) const {
|
||||
if (suffix == NULL || CStringEquals(suffix, "")) return true;
|
||||
|
||||
if (c_str_ == NULL) return false;
|
||||
|
||||
const size_t this_len = strlen(c_str_);
|
||||
const size_t suffix_len = strlen(suffix);
|
||||
return (this_len >= suffix_len) &&
|
||||
CStringEquals(c_str_ + this_len - suffix_len, suffix);
|
||||
}
|
||||
|
||||
// Returns true iff this String ends with the given suffix, ignoring case.
|
||||
// Any String is considered to end with a NULL or empty suffix.
|
||||
bool String::EndsWithCaseInsensitive(const char* suffix) const {
|
||||
if (suffix == NULL || CStringEquals(suffix, "")) return true;
|
||||
|
||||
if (c_str_ == NULL) return false;
|
||||
|
||||
const size_t this_len = strlen(c_str_);
|
||||
const size_t suffix_len = strlen(suffix);
|
||||
return (this_len >= suffix_len) &&
|
||||
CaseInsensitiveCStringEquals(c_str_ + this_len - suffix_len, suffix);
|
||||
}
|
||||
|
||||
// Sets the 0-terminated C string this String object represents. The
|
||||
// old string in this object is deleted, and this object will own a
|
||||
// clone of the input string. This function copies only up to length
|
||||
// bytes (plus a terminating null byte), or until the first null byte,
|
||||
// whichever comes first.
|
||||
//
|
||||
// This function works even when the c_str parameter has the same
|
||||
// value as that of the c_str_ field.
|
||||
void String::Set(const char * c_str, size_t length) {
|
||||
// Makes sure this works when c_str == c_str_
|
||||
const char* const temp = CloneString(c_str, length);
|
||||
delete[] c_str_;
|
||||
c_str_ = temp;
|
||||
}
|
||||
|
||||
// Assigns a C string to this object. Self-assignment works.
|
||||
const String& String::operator=(const char* c_str) {
|
||||
// Makes sure this works when c_str == c_str_
|
||||
if (c_str != c_str_) {
|
||||
delete[] c_str_;
|
||||
c_str_ = CloneCString(c_str);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Formats a list of arguments to a String, using the same format
|
||||
// spec string as for printf.
|
||||
//
|
||||
// We do not use the StringPrintf class as it is not universally
|
||||
// available.
|
||||
//
|
||||
// The result is limited to 4096 characters (including the tailing 0).
|
||||
// If 4096 characters are not enough to format the input,
|
||||
// "<buffer exceeded>" is returned.
|
||||
String String::Format(const char * format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
char buffer[4096];
|
||||
// MSVC 8 deprecates vsnprintf(), so we want to suppress warning
|
||||
// 4996 (deprecated function) there.
|
||||
#ifdef GTEST_OS_WINDOWS // We are on Windows.
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
const int size =
|
||||
vsnprintf(buffer, sizeof(buffer)/sizeof(buffer[0]) - 1, format, args);
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else // We are on Linux or Mac OS.
|
||||
const int size =
|
||||
vsnprintf(buffer, sizeof(buffer)/sizeof(buffer[0]) - 1, format, args);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
va_end(args);
|
||||
|
||||
return String(size >= 0 ? buffer : "<buffer exceeded>");
|
||||
}
|
||||
|
||||
// Converts the buffer in a StrStream to a String, converting NUL
|
||||
// bytes to "\\0" along the way.
|
||||
String StrStreamToString(StrStream* ss) {
|
||||
#if GTEST_HAS_STD_STRING
|
||||
const ::std::string& str = ss->str();
|
||||
const char* const start = str.c_str();
|
||||
const char* const end = start + str.length();
|
||||
#else
|
||||
const char* const start = ss->str();
|
||||
const char* const end = start + ss->pcount();
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// We need to use a helper StrStream to do this transformation
|
||||
// because String doesn't support push_back().
|
||||
StrStream helper;
|
||||
for (const char* ch = start; ch != end; ++ch) {
|
||||
if (*ch == '\0') {
|
||||
helper << "\\0"; // Replaces NUL with "\\0";
|
||||
} else {
|
||||
helper.put(*ch);
|
||||
}
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
return String(helper.str().c_str());
|
||||
#else
|
||||
const String str(helper.str(), helper.pcount());
|
||||
helper.freeze(false);
|
||||
ss->freeze(false);
|
||||
return str;
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
}
|
||||
|
||||
// Appends the user-supplied message to the Google-Test-generated message.
|
||||
String AppendUserMessage(const String& gtest_msg,
|
||||
const Message& user_msg) {
|
||||
// Appends the user message if it's non-empty.
|
||||
const String user_msg_string = user_msg.GetString();
|
||||
if (user_msg_string.empty()) {
|
||||
return gtest_msg;
|
||||
}
|
||||
|
||||
Message msg;
|
||||
msg << gtest_msg << "\n" << user_msg_string;
|
||||
|
||||
return msg.GetString();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Prints a TestPartResult object.
|
||||
std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
|
||||
return os << result.file_name() << ":"
|
||||
<< result.line_number() << ": "
|
||||
<< (result.type() == TPRT_SUCCESS ? "Success" :
|
||||
result.type() == TPRT_FATAL_FAILURE ? "Fatal failure" :
|
||||
"Non-fatal failure") << ":\n"
|
||||
<< result.message() << std::endl;
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
// class TestResult
|
||||
|
||||
// Creates an empty TestResult.
|
||||
TestResult::TestResult()
|
||||
: death_test_count_(0),
|
||||
elapsed_time_(0) {
|
||||
}
|
||||
|
||||
// D'tor.
|
||||
TestResult::~TestResult() {
|
||||
}
|
||||
|
||||
// Adds a test part result to the list.
|
||||
void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
|
||||
test_part_results_.PushBack(test_part_result);
|
||||
}
|
||||
|
||||
// Adds a test property to the list. If a property with the same key as the
|
||||
// supplied property is already represented, the value of this test_property
|
||||
// replaces the old value for that key.
|
||||
void TestResult::RecordProperty(const TestProperty& test_property) {
|
||||
if (!ValidateTestProperty(test_property)) {
|
||||
return;
|
||||
}
|
||||
MutexLock lock(&test_properites_mutex_);
|
||||
ListNode<TestProperty>* const node_with_matching_key =
|
||||
test_properties_.FindIf(TestPropertyKeyIs(test_property.key()));
|
||||
if (node_with_matching_key == NULL) {
|
||||
test_properties_.PushBack(test_property);
|
||||
return;
|
||||
}
|
||||
TestProperty& property_with_matching_key = node_with_matching_key->element();
|
||||
property_with_matching_key.SetValue(test_property.value());
|
||||
}
|
||||
|
||||
// Adds a failure if the key is a reserved attribute of Google Test testcase tags.
|
||||
// Returns true if the property is valid.
|
||||
bool TestResult::ValidateTestProperty(const TestProperty& test_property) {
|
||||
String key(test_property.key());
|
||||
if (key == "name" || key == "status" || key == "time" || key == "classname") {
|
||||
ADD_FAILURE()
|
||||
<< "Reserved key used in RecordProperty(): "
|
||||
<< key
|
||||
<< " ('name', 'status', 'time', and 'classname' are reserved by "
|
||||
<< GTEST_NAME << ")";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Clears the object.
|
||||
void TestResult::Clear() {
|
||||
test_part_results_.Clear();
|
||||
test_properties_.Clear();
|
||||
death_test_count_ = 0;
|
||||
elapsed_time_ = 0;
|
||||
}
|
||||
|
||||
// Returns true iff the test part passed.
|
||||
static bool TestPartPassed(const TestPartResult & result) {
|
||||
return result.passed();
|
||||
}
|
||||
|
||||
// Gets the number of successful test parts.
|
||||
int TestResult::successful_part_count() const {
|
||||
return test_part_results_.CountIf(TestPartPassed);
|
||||
}
|
||||
|
||||
// Returns true iff the test part failed.
|
||||
static bool TestPartFailed(const TestPartResult & result) {
|
||||
return result.failed();
|
||||
}
|
||||
|
||||
// Gets the number of failed test parts.
|
||||
int TestResult::failed_part_count() const {
|
||||
return test_part_results_.CountIf(TestPartFailed);
|
||||
}
|
||||
|
||||
// Returns true iff the test part fatally failed.
|
||||
static bool TestPartFatallyFailed(const TestPartResult & result) {
|
||||
return result.fatally_failed();
|
||||
}
|
||||
|
||||
// Returns true iff the test fatally failed.
|
||||
bool TestResult::HasFatalFailure() const {
|
||||
return test_part_results_.CountIf(TestPartFatallyFailed) > 0;
|
||||
}
|
||||
|
||||
// Gets the number of all test parts. This is the sum of the number
|
||||
// of successful test parts and the number of failed test parts.
|
||||
int TestResult::total_part_count() const {
|
||||
return test_part_results_.size();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// class Test
|
||||
|
||||
// Creates a Test object.
|
||||
|
||||
// The c'tor saves the values of all Google Test flags.
|
||||
Test::Test()
|
||||
: gtest_flag_saver_(new internal::GTestFlagSaver) {
|
||||
}
|
||||
|
||||
// The d'tor restores the values of all Google Test flags.
|
||||
Test::~Test() {
|
||||
delete gtest_flag_saver_;
|
||||
}
|
||||
|
||||
// Sets up the test fixture.
|
||||
//
|
||||
// A sub-class may override this.
|
||||
void Test::SetUp() {
|
||||
}
|
||||
|
||||
// Tears down the test fixture.
|
||||
//
|
||||
// A sub-class may override this.
|
||||
void Test::TearDown() {
|
||||
}
|
||||
|
||||
// Allows user supplied key value pairs to be recorded for later output.
|
||||
void Test::RecordProperty(const char* key, const char* value) {
|
||||
UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
|
||||
}
|
||||
|
||||
// Allows user supplied key value pairs to be recorded for later output.
|
||||
void Test::RecordProperty(const char* key, int value) {
|
||||
Message value_message;
|
||||
value_message << value;
|
||||
RecordProperty(key, value_message.GetString().c_str());
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// We are on Windows.
|
||||
|
||||
// Adds an "exception thrown" fatal failure to the current test.
|
||||
static void AddExceptionThrownFailure(DWORD exception_code,
|
||||
const char* location) {
|
||||
Message message;
|
||||
message << "Exception thrown with code 0x" << std::setbase(16) <<
|
||||
exception_code << std::setbase(10) << " in " << location << ".";
|
||||
|
||||
UnitTest* const unit_test = UnitTest::GetInstance();
|
||||
unit_test->AddTestPartResult(
|
||||
TPRT_FATAL_FAILURE,
|
||||
static_cast<const char *>(NULL),
|
||||
// We have no info about the source file where the exception
|
||||
// occurred.
|
||||
-1, // We have no info on which line caused the exception.
|
||||
message.GetString(),
|
||||
internal::String(""));
|
||||
}
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Google Test requires all tests in the same test case to use the same test
|
||||
// fixture class. This function checks if the current test has the
|
||||
// same fixture class as the first test in the current test case. If
|
||||
// yes, it returns true; otherwise it generates a Google Test failure and
|
||||
// returns false.
|
||||
bool Test::HasSameFixtureClass() {
|
||||
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
|
||||
const TestCase* const test_case = impl->current_test_case();
|
||||
|
||||
// Info about the first test in the current test case.
|
||||
const internal::TestInfoImpl* const first_test_info =
|
||||
test_case->test_info_list().Head()->element()->impl();
|
||||
const internal::TypeId first_fixture_id = first_test_info->fixture_class_id();
|
||||
const char* const first_test_name = first_test_info->name();
|
||||
|
||||
// Info about the current test.
|
||||
const internal::TestInfoImpl* const this_test_info =
|
||||
impl->current_test_info()->impl();
|
||||
const internal::TypeId this_fixture_id = this_test_info->fixture_class_id();
|
||||
const char* const this_test_name = this_test_info->name();
|
||||
|
||||
if (this_fixture_id != first_fixture_id) {
|
||||
// Is the first test defined using TEST?
|
||||
const bool first_is_TEST = first_fixture_id == internal::GetTypeId<Test>();
|
||||
// Is this test defined using TEST?
|
||||
const bool this_is_TEST = this_fixture_id == internal::GetTypeId<Test>();
|
||||
|
||||
if (first_is_TEST || this_is_TEST) {
|
||||
// The user mixed TEST and TEST_F in this test case - we'll tell
|
||||
// him/her how to fix it.
|
||||
|
||||
// Gets the name of the TEST and the name of the TEST_F. Note
|
||||
// that first_is_TEST and this_is_TEST cannot both be true, as
|
||||
// the fixture IDs are different for the two tests.
|
||||
const char* const TEST_name =
|
||||
first_is_TEST ? first_test_name : this_test_name;
|
||||
const char* const TEST_F_name =
|
||||
first_is_TEST ? this_test_name : first_test_name;
|
||||
|
||||
ADD_FAILURE()
|
||||
<< "All tests in the same test case must use the same test fixture\n"
|
||||
<< "class, so mixing TEST_F and TEST in the same test case is\n"
|
||||
<< "illegal. In test case " << this_test_info->test_case_name()
|
||||
<< ",\n"
|
||||
<< "test " << TEST_F_name << " is defined using TEST_F but\n"
|
||||
<< "test " << TEST_name << " is defined using TEST. You probably\n"
|
||||
<< "want to change the TEST to TEST_F or move it to another test\n"
|
||||
<< "case.";
|
||||
} else {
|
||||
// The user defined two fixture classes with the same name in
|
||||
// two namespaces - we'll tell him/her how to fix it.
|
||||
ADD_FAILURE()
|
||||
<< "All tests in the same test case must use the same test fixture\n"
|
||||
<< "class. However, in test case "
|
||||
<< this_test_info->test_case_name() << ",\n"
|
||||
<< "you defined test " << first_test_name
|
||||
<< " and test " << this_test_name << "\n"
|
||||
<< "using two different test fixture classes. This can happen if\n"
|
||||
<< "the two classes are from different namespaces or translation\n"
|
||||
<< "units and have the same name. You should probably rename one\n"
|
||||
<< "of the classes to put the tests into different test cases.";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Runs the test and updates the test result.
|
||||
void Test::Run() {
|
||||
if (!HasSameFixtureClass()) return;
|
||||
|
||||
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// We are on Windows.
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
__try {
|
||||
SetUp();
|
||||
} __except(internal::UnitTestOptions::GTestShouldProcessSEH(
|
||||
GetExceptionCode())) {
|
||||
AddExceptionThrownFailure(GetExceptionCode(), "SetUp()");
|
||||
}
|
||||
|
||||
// We will run the test only if SetUp() had no fatal failure.
|
||||
if (!HasFatalFailure()) {
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
__try {
|
||||
TestBody();
|
||||
} __except(internal::UnitTestOptions::GTestShouldProcessSEH(
|
||||
GetExceptionCode())) {
|
||||
AddExceptionThrownFailure(GetExceptionCode(), "the test body");
|
||||
}
|
||||
}
|
||||
|
||||
// However, we want to clean up as much as possible. Hence we will
|
||||
// always call TearDown(), even if SetUp() or the test body has
|
||||
// failed.
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
__try {
|
||||
TearDown();
|
||||
} __except(internal::UnitTestOptions::GTestShouldProcessSEH(
|
||||
GetExceptionCode())) {
|
||||
AddExceptionThrownFailure(GetExceptionCode(), "TearDown()");
|
||||
}
|
||||
|
||||
#else // We are on Linux or Mac - exceptions are disabled.
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
SetUp();
|
||||
|
||||
// We will run the test only if SetUp() was successful.
|
||||
if (!HasFatalFailure()) {
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
TestBody();
|
||||
}
|
||||
|
||||
// However, we want to clean up as much as possible. Hence we will
|
||||
// always call TearDown(), even if SetUp() or the test body has
|
||||
// failed.
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
TearDown();
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
|
||||
// Returns true iff the current test has a fatal failure.
|
||||
bool Test::HasFatalFailure() {
|
||||
return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
|
||||
}
|
||||
|
||||
// class TestInfo
|
||||
|
||||
// Constructs a TestInfo object.
|
||||
TestInfo::TestInfo(const char* test_case_name,
|
||||
const char* name,
|
||||
internal::TypeId fixture_class_id,
|
||||
TestMaker maker) {
|
||||
impl_ = new internal::TestInfoImpl(this, test_case_name, name,
|
||||
fixture_class_id, maker);
|
||||
}
|
||||
|
||||
// Destructs a TestInfo object.
|
||||
TestInfo::~TestInfo() {
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
// Creates a TestInfo object and registers it with the UnitTest
|
||||
// singleton; returns the created object.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// test_case_name: name of the test case
|
||||
// name: name of the test
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
// maker: pointer to the function that creates a test object
|
||||
TestInfo* TestInfo::MakeAndRegisterInstance(
|
||||
const char* test_case_name,
|
||||
const char* name,
|
||||
internal::TypeId fixture_class_id,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc,
|
||||
TestMaker maker) {
|
||||
TestInfo* const test_info =
|
||||
new TestInfo(test_case_name, name, fixture_class_id, maker);
|
||||
internal::GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
|
||||
return test_info;
|
||||
}
|
||||
|
||||
// Returns the test case name.
|
||||
const char* TestInfo::test_case_name() const {
|
||||
return impl_->test_case_name();
|
||||
}
|
||||
|
||||
// Returns the test name.
|
||||
const char* TestInfo::name() const {
|
||||
return impl_->name();
|
||||
}
|
||||
|
||||
// Returns true if this test should run.
|
||||
bool TestInfo::should_run() const { return impl_->should_run(); }
|
||||
|
||||
// Returns the result of the test.
|
||||
const internal::TestResult* TestInfo::result() const { return impl_->result(); }
|
||||
|
||||
// Increments the number of death tests encountered in this test so
|
||||
// far.
|
||||
int TestInfo::increment_death_test_count() {
|
||||
return impl_->result()->increment_death_test_count();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
// A predicate that checks the test name of a TestInfo against a known
|
||||
// value.
|
||||
//
|
||||
// This is used for implementation of the TestCase class only. We put
|
||||
// it in the anonymous namespace to prevent polluting the outer
|
||||
// namespace.
|
||||
//
|
||||
// TestNameIs is copyable.
|
||||
class TestNameIs {
|
||||
public:
|
||||
// Constructor.
|
||||
//
|
||||
// TestNameIs has NO default constructor.
|
||||
explicit TestNameIs(const char* name)
|
||||
: name_(name) {}
|
||||
|
||||
// Returns true iff the test name of test_info matches name_.
|
||||
bool operator()(const TestInfo * test_info) const {
|
||||
return test_info && internal::String(test_info->name()).Compare(name_) == 0;
|
||||
}
|
||||
|
||||
private:
|
||||
internal::String name_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
// Finds and returns a TestInfo with the given name. If one doesn't
|
||||
// exist, returns NULL.
|
||||
TestInfo * TestCase::GetTestInfo(const char* test_name) {
|
||||
// Can we find a TestInfo with the given name?
|
||||
internal::ListNode<TestInfo *> * const node = test_info_list_->FindIf(
|
||||
TestNameIs(test_name));
|
||||
|
||||
// Returns the TestInfo found.
|
||||
return node ? node->element() : NULL;
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Creates the test object, runs it, records its result, and then
|
||||
// deletes it.
|
||||
void TestInfoImpl::Run() {
|
||||
if (!should_run_) return;
|
||||
|
||||
// Tells UnitTest where to store test result.
|
||||
UnitTestImpl* const impl = internal::GetUnitTestImpl();
|
||||
impl->set_current_test_info(parent_);
|
||||
|
||||
// Notifies the unit test event listener that a test is about to
|
||||
// start.
|
||||
UnitTestEventListenerInterface* const result_printer =
|
||||
impl->result_printer();
|
||||
result_printer->OnTestStart(parent_);
|
||||
|
||||
const TimeInMillis start = GetTimeInMillis();
|
||||
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// We are on Windows.
|
||||
Test* test = NULL;
|
||||
|
||||
__try {
|
||||
// Creates the test object.
|
||||
test = (*maker_)();
|
||||
} __except(internal::UnitTestOptions::GTestShouldProcessSEH(
|
||||
GetExceptionCode())) {
|
||||
AddExceptionThrownFailure(GetExceptionCode(),
|
||||
"the test fixture's constructor");
|
||||
return;
|
||||
}
|
||||
#else // We are on Linux or Mac OS - exceptions are disabled.
|
||||
|
||||
// TODO(wan): If test->Run() throws, test won't be deleted. This is
|
||||
// not a problem now as we don't use exceptions. If we were to
|
||||
// enable exceptions, we should revise the following to be
|
||||
// exception-safe.
|
||||
|
||||
// Creates the test object.
|
||||
Test* test = (*maker_)();
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Runs the test only if the constructor of the test fixture didn't
|
||||
// generate a fatal failure.
|
||||
if (!Test::HasFatalFailure()) {
|
||||
test->Run();
|
||||
}
|
||||
|
||||
// Deletes the test object.
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
delete test;
|
||||
test = NULL;
|
||||
|
||||
result_.set_elapsed_time(GetTimeInMillis() - start);
|
||||
|
||||
// Notifies the unit test event listener that a test has just finished.
|
||||
result_printer->OnTestEnd(parent_);
|
||||
|
||||
// Tells UnitTest to stop associating assertion results to this
|
||||
// test.
|
||||
impl->set_current_test_info(NULL);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// class TestCase
|
||||
|
||||
// Gets the number of successful tests in this test case.
|
||||
int TestCase::successful_test_count() const {
|
||||
return test_info_list_->CountIf(TestPassed);
|
||||
}
|
||||
|
||||
// Gets the number of failed tests in this test case.
|
||||
int TestCase::failed_test_count() const {
|
||||
return test_info_list_->CountIf(TestFailed);
|
||||
}
|
||||
|
||||
int TestCase::disabled_test_count() const {
|
||||
return test_info_list_->CountIf(TestDisabled);
|
||||
}
|
||||
|
||||
// Get the number of tests in this test case that should run.
|
||||
int TestCase::test_to_run_count() const {
|
||||
return test_info_list_->CountIf(ShouldRunTest);
|
||||
}
|
||||
|
||||
// Gets the number of all tests.
|
||||
int TestCase::total_test_count() const {
|
||||
return test_info_list_->size();
|
||||
}
|
||||
|
||||
// Creates a TestCase with the given name.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// name: name of the test case
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
TestCase::TestCase(const char* name,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc)
|
||||
: name_(name),
|
||||
set_up_tc_(set_up_tc),
|
||||
tear_down_tc_(tear_down_tc),
|
||||
should_run_(false),
|
||||
elapsed_time_(0) {
|
||||
test_info_list_ = new internal::List<TestInfo *>;
|
||||
}
|
||||
|
||||
// Destructor of TestCase.
|
||||
TestCase::~TestCase() {
|
||||
// Deletes every Test in the collection.
|
||||
test_info_list_->ForEach(internal::Delete<TestInfo>);
|
||||
|
||||
// Then deletes the Test collection.
|
||||
delete test_info_list_;
|
||||
test_info_list_ = NULL;
|
||||
}
|
||||
|
||||
// Adds a test to this test case. Will delete the test upon
|
||||
// destruction of the TestCase object.
|
||||
void TestCase::AddTestInfo(TestInfo * test_info) {
|
||||
test_info_list_->PushBack(test_info);
|
||||
}
|
||||
|
||||
// Runs every test in this TestCase.
|
||||
void TestCase::Run() {
|
||||
if (!should_run_) return;
|
||||
|
||||
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
|
||||
impl->set_current_test_case(this);
|
||||
|
||||
UnitTestEventListenerInterface * const result_printer =
|
||||
impl->result_printer();
|
||||
|
||||
result_printer->OnTestCaseStart(this);
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
set_up_tc_();
|
||||
|
||||
const internal::TimeInMillis start = internal::GetTimeInMillis();
|
||||
test_info_list_->ForEach(internal::TestInfoImpl::RunTest);
|
||||
elapsed_time_ = internal::GetTimeInMillis() - start;
|
||||
|
||||
impl->os_stack_trace_getter()->UponLeavingGTest();
|
||||
tear_down_tc_();
|
||||
result_printer->OnTestCaseEnd(this);
|
||||
impl->set_current_test_case(NULL);
|
||||
}
|
||||
|
||||
// Clears the results of all tests in this test case.
|
||||
void TestCase::ClearResult() {
|
||||
test_info_list_->ForEach(internal::TestInfoImpl::ClearTestResult);
|
||||
}
|
||||
|
||||
|
||||
// class UnitTestEventListenerInterface
|
||||
|
||||
// The virtual d'tor.
|
||||
UnitTestEventListenerInterface::~UnitTestEventListenerInterface() {
|
||||
}
|
||||
|
||||
// A result printer that never prints anything. Used in the child process
|
||||
// of an exec-style death test to avoid needless output clutter.
|
||||
class NullUnitTestResultPrinter : public UnitTestEventListenerInterface {};
|
||||
|
||||
// Formats a countable noun. Depending on its quantity, either the
|
||||
// singular form or the plural form is used. e.g.
|
||||
//
|
||||
// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
|
||||
// FormatCountableNoun(5, "book", "books") returns "5 books".
|
||||
static internal::String FormatCountableNoun(int count,
|
||||
const char * singular_form,
|
||||
const char * plural_form) {
|
||||
return internal::String::Format("%d %s", count,
|
||||
count == 1 ? singular_form : plural_form);
|
||||
}
|
||||
|
||||
// Formats the count of tests.
|
||||
static internal::String FormatTestCount(int test_count) {
|
||||
return FormatCountableNoun(test_count, "test", "tests");
|
||||
}
|
||||
|
||||
// Formats the count of test cases.
|
||||
static internal::String FormatTestCaseCount(int test_case_count) {
|
||||
return FormatCountableNoun(test_case_count, "test case", "test cases");
|
||||
}
|
||||
|
||||
// Converts a TestPartResultType enum to human-friendly string
|
||||
// representation. Both TPRT_NONFATAL_FAILURE and TPRT_FATAL_FAILURE
|
||||
// are translated to "Failure", as the user usually doesn't care about
|
||||
// the difference between the two when viewing the test result.
|
||||
static const char * TestPartResultTypeToString(TestPartResultType type) {
|
||||
switch (type) {
|
||||
case TPRT_SUCCESS:
|
||||
return "Success";
|
||||
|
||||
case TPRT_NONFATAL_FAILURE:
|
||||
case TPRT_FATAL_FAILURE:
|
||||
return "Failure";
|
||||
}
|
||||
|
||||
return "Unknown result type";
|
||||
}
|
||||
|
||||
// Prints a TestPartResult.
|
||||
static void PrintTestPartResult(
|
||||
const TestPartResult & test_part_result) {
|
||||
const char * const file_name = test_part_result.file_name();
|
||||
|
||||
printf("%s", file_name == NULL ? "unknown file" : file_name);
|
||||
if (test_part_result.line_number() >= 0) {
|
||||
printf(":%d", test_part_result.line_number());
|
||||
}
|
||||
printf(": %s\n", TestPartResultTypeToString(test_part_result.type()));
|
||||
printf("%s\n", test_part_result.message());
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// class PrettyUnitTestResultPrinter
|
||||
|
||||
namespace internal {
|
||||
|
||||
enum GTestColor {
|
||||
COLOR_RED,
|
||||
COLOR_GREEN,
|
||||
COLOR_YELLOW
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
// Returns the character attribute for the given color.
|
||||
WORD GetColorAttribute(GTestColor color) {
|
||||
switch (color) {
|
||||
case COLOR_RED: return FOREGROUND_RED;
|
||||
case COLOR_GREEN: return FOREGROUND_GREEN;
|
||||
case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// Returns the ANSI color code for the given color.
|
||||
const char* GetAnsiColorCode(GTestColor color) {
|
||||
switch (color) {
|
||||
case COLOR_RED: return "1";
|
||||
case COLOR_GREEN: return "2";
|
||||
case COLOR_YELLOW: return "3";
|
||||
};
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
// Returns true iff Google Test should use colors in the output.
|
||||
bool ShouldUseColor(bool stdout_is_tty) {
|
||||
const char* const gtest_color = GTEST_FLAG(color).c_str();
|
||||
|
||||
if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
|
||||
#ifdef _WIN32
|
||||
// On Windows the TERM variable is usually not set, but the
|
||||
// console there does support colors.
|
||||
return stdout_is_tty;
|
||||
#else
|
||||
// On non-Windows platforms, we rely on the TERM variable.
|
||||
const char* const term = GetEnv("TERM");
|
||||
const bool term_supports_color =
|
||||
String::CStringEquals(term, "xterm") ||
|
||||
String::CStringEquals(term, "xterm-color") ||
|
||||
String::CStringEquals(term, "cygwin");
|
||||
return stdout_is_tty && term_supports_color;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
|
||||
String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
|
||||
String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
|
||||
String::CStringEquals(gtest_color, "1");
|
||||
// We take "yes", "true", "t", and "1" as meaning "yes". If the
|
||||
// value is neither one of these nor "auto", we treat it as "no" to
|
||||
// be conservative.
|
||||
}
|
||||
|
||||
// Helpers for printing colored strings to stdout. Note that on Windows, we
|
||||
// cannot simply emit special characters and have the terminal change colors.
|
||||
// This routine must actually emit the characters rather than return a string
|
||||
// that would be colored when printed, as can be done on Linux.
|
||||
void ColoredPrintf(GTestColor color, const char* fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
|
||||
static const bool use_color = ShouldUseColor(isatty(fileno(stdout)) != 0);
|
||||
// The '!= 0' comparison is necessary to satisfy MSVC 7.1.
|
||||
|
||||
if (!use_color) {
|
||||
vprintf(fmt, args);
|
||||
va_end(args);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
|
||||
// Gets the current text color.
|
||||
CONSOLE_SCREEN_BUFFER_INFO buffer_info;
|
||||
GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
|
||||
const WORD old_color_attrs = buffer_info.wAttributes;
|
||||
|
||||
SetConsoleTextAttribute(stdout_handle,
|
||||
GetColorAttribute(color) | FOREGROUND_INTENSITY);
|
||||
vprintf(fmt, args);
|
||||
|
||||
// Restores the text color.
|
||||
SetConsoleTextAttribute(stdout_handle, old_color_attrs);
|
||||
#else
|
||||
printf("\033[0;3%sm", GetAnsiColorCode(color));
|
||||
vprintf(fmt, args);
|
||||
printf("\033[m"); // Resets the terminal to default.
|
||||
#endif // _WIN32
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
using internal::ColoredPrintf;
|
||||
using internal::COLOR_RED;
|
||||
using internal::COLOR_GREEN;
|
||||
using internal::COLOR_YELLOW;
|
||||
|
||||
// This class implements the UnitTestEventListenerInterface interface.
|
||||
//
|
||||
// Class PrettyUnitTestResultPrinter is copyable.
|
||||
class PrettyUnitTestResultPrinter : public UnitTestEventListenerInterface {
|
||||
public:
|
||||
PrettyUnitTestResultPrinter() {}
|
||||
static void PrintTestName(const char * test_case, const char * test) {
|
||||
printf("%s.%s", test_case, test);
|
||||
}
|
||||
|
||||
// The following methods override what's in the
|
||||
// UnitTestEventListenerInterface class.
|
||||
virtual void OnUnitTestStart(const UnitTest * unit_test);
|
||||
virtual void OnGlobalSetUpStart(const UnitTest*);
|
||||
virtual void OnTestCaseStart(const TestCase * test_case);
|
||||
virtual void OnTestStart(const TestInfo * test_info);
|
||||
virtual void OnNewTestPartResult(const TestPartResult * result);
|
||||
virtual void OnTestEnd(const TestInfo * test_info);
|
||||
virtual void OnGlobalTearDownStart(const UnitTest*);
|
||||
virtual void OnUnitTestEnd(const UnitTest * unit_test);
|
||||
|
||||
private:
|
||||
internal::String test_case_name_;
|
||||
};
|
||||
|
||||
// Called before the unit test starts.
|
||||
void PrettyUnitTestResultPrinter::OnUnitTestStart(
|
||||
const UnitTest * unit_test) {
|
||||
const char * const filter = GTEST_FLAG(filter).c_str();
|
||||
|
||||
// Prints the filter if it's not *. This reminds the user that some
|
||||
// tests may be skipped.
|
||||
if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
|
||||
ColoredPrintf(COLOR_YELLOW,
|
||||
"Note: %s filter = %s\n", GTEST_NAME, filter);
|
||||
}
|
||||
|
||||
const internal::UnitTestImpl* const impl = unit_test->impl();
|
||||
ColoredPrintf(COLOR_GREEN, "[==========] ");
|
||||
printf("Running %s from %s.\n",
|
||||
FormatTestCount(impl->test_to_run_count()).c_str(),
|
||||
FormatTestCaseCount(impl->test_case_to_run_count()).c_str());
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnGlobalSetUpStart(const UnitTest*) {
|
||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||
printf("Global test environment set-up.\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnTestCaseStart(
|
||||
const TestCase * test_case) {
|
||||
test_case_name_ = test_case->name();
|
||||
const internal::String counts =
|
||||
FormatCountableNoun(test_case->test_to_run_count(), "test", "tests");
|
||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||
printf("%s from %s\n", counts.c_str(), test_case_name_.c_str());
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo * test_info) {
|
||||
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
|
||||
PrintTestName(test_case_name_.c_str(), test_info->name());
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo * test_info) {
|
||||
if (test_info->result()->Passed()) {
|
||||
ColoredPrintf(COLOR_GREEN, "[ OK ] ");
|
||||
} else {
|
||||
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
||||
}
|
||||
PrintTestName(test_case_name_.c_str(), test_info->name());
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// Called after an assertion failure.
|
||||
void PrettyUnitTestResultPrinter::OnNewTestPartResult(
|
||||
const TestPartResult * result) {
|
||||
// If the test part succeeded, we don't need to do anything.
|
||||
if (result->type() == TPRT_SUCCESS)
|
||||
return;
|
||||
|
||||
// Print failure message from the assertion (e.g. expected this and got that).
|
||||
PrintTestPartResult(*result);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnGlobalTearDownStart(const UnitTest*) {
|
||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||
printf("Global test environment tear-down\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Internal helper for printing the list of failed tests.
|
||||
static void PrintFailedTestsPretty(const UnitTestImpl* impl) {
|
||||
const int failed_test_count = impl->failed_test_count();
|
||||
if (failed_test_count == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const internal::ListNode<TestCase*>* node = impl->test_cases()->Head();
|
||||
node != NULL; node = node->next()) {
|
||||
const TestCase* const tc = node->element();
|
||||
if (!tc->should_run() || (tc->failed_test_count() == 0)) {
|
||||
continue;
|
||||
}
|
||||
for (const internal::ListNode<TestInfo*>* tinode =
|
||||
tc->test_info_list().Head();
|
||||
tinode != NULL; tinode = tinode->next()) {
|
||||
const TestInfo* const ti = tinode->element();
|
||||
if (!tc->ShouldRunTest(ti) || tc->TestPassed(ti)) {
|
||||
continue;
|
||||
}
|
||||
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
||||
printf("%s.%s\n", ti->test_case_name(), ti->name());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
void PrettyUnitTestResultPrinter::OnUnitTestEnd(
|
||||
const UnitTest * unit_test) {
|
||||
const internal::UnitTestImpl* const impl = unit_test->impl();
|
||||
|
||||
ColoredPrintf(COLOR_GREEN, "[==========] ");
|
||||
printf("%s from %s ran.\n",
|
||||
FormatTestCount(impl->test_to_run_count()).c_str(),
|
||||
FormatTestCaseCount(impl->test_case_to_run_count()).c_str());
|
||||
ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");
|
||||
printf("%s.\n", FormatTestCount(impl->successful_test_count()).c_str());
|
||||
|
||||
int num_failures = impl->failed_test_count();
|
||||
if (!impl->Passed()) {
|
||||
const int failed_test_count = impl->failed_test_count();
|
||||
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
||||
printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
|
||||
internal::PrintFailedTestsPretty(impl);
|
||||
printf("\n%2d FAILED %s\n", num_failures,
|
||||
num_failures == 1 ? "TEST" : "TESTS");
|
||||
}
|
||||
|
||||
int num_disabled = impl->disabled_test_count();
|
||||
if (num_disabled) {
|
||||
if (!num_failures) {
|
||||
printf("\n"); // Add a spacer if no FAILURE banner is displayed.
|
||||
}
|
||||
ColoredPrintf(COLOR_YELLOW,
|
||||
" YOU HAVE %d DISABLED %s\n\n",
|
||||
num_disabled,
|
||||
num_disabled == 1 ? "TEST" : "TESTS");
|
||||
}
|
||||
// Ensure that Google Test output is printed before, e.g., heapchecker output.
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// End PrettyUnitTestResultPrinter
|
||||
|
||||
// class UnitTestEventsRepeater
|
||||
//
|
||||
// This class forwards events to other event listeners.
|
||||
class UnitTestEventsRepeater : public UnitTestEventListenerInterface {
|
||||
public:
|
||||
typedef internal::List<UnitTestEventListenerInterface *> Listeners;
|
||||
typedef internal::ListNode<UnitTestEventListenerInterface *> ListenersNode;
|
||||
UnitTestEventsRepeater() {}
|
||||
virtual ~UnitTestEventsRepeater();
|
||||
void AddListener(UnitTestEventListenerInterface *listener);
|
||||
|
||||
virtual void OnUnitTestStart(const UnitTest* unit_test);
|
||||
virtual void OnUnitTestEnd(const UnitTest* unit_test);
|
||||
virtual void OnGlobalSetUpStart(const UnitTest* unit_test);
|
||||
virtual void OnGlobalSetUpEnd(const UnitTest* unit_test);
|
||||
virtual void OnGlobalTearDownStart(const UnitTest* unit_test);
|
||||
virtual void OnGlobalTearDownEnd(const UnitTest* unit_test);
|
||||
virtual void OnTestCaseStart(const TestCase* test_case);
|
||||
virtual void OnTestCaseEnd(const TestCase* test_case);
|
||||
virtual void OnTestStart(const TestInfo* test_info);
|
||||
virtual void OnTestEnd(const TestInfo* test_info);
|
||||
virtual void OnNewTestPartResult(const TestPartResult* result);
|
||||
|
||||
private:
|
||||
Listeners listeners_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTestEventsRepeater);
|
||||
};
|
||||
|
||||
UnitTestEventsRepeater::~UnitTestEventsRepeater() {
|
||||
for (ListenersNode* listener = listeners_.Head();
|
||||
listener != NULL;
|
||||
listener = listener->next()) {
|
||||
delete listener->element();
|
||||
}
|
||||
}
|
||||
|
||||
void UnitTestEventsRepeater::AddListener(
|
||||
UnitTestEventListenerInterface *listener) {
|
||||
listeners_.PushBack(listener);
|
||||
}
|
||||
|
||||
// Since the methods are identical, use a macro to reduce boilerplate.
|
||||
// This defines a member that repeats the call to all listeners.
|
||||
#define GTEST_REPEATER_METHOD(Name, Type) \
|
||||
void UnitTestEventsRepeater::Name(const Type* parameter) { \
|
||||
for (ListenersNode* listener = listeners_.Head(); \
|
||||
listener != NULL; \
|
||||
listener = listener->next()) { \
|
||||
listener->element()->Name(parameter); \
|
||||
} \
|
||||
}
|
||||
|
||||
GTEST_REPEATER_METHOD(OnUnitTestStart, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnUnitTestEnd, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnGlobalSetUpStart, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnGlobalSetUpEnd, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnGlobalTearDownStart, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnGlobalTearDownEnd, UnitTest)
|
||||
GTEST_REPEATER_METHOD(OnTestCaseStart, TestCase)
|
||||
GTEST_REPEATER_METHOD(OnTestCaseEnd, TestCase)
|
||||
GTEST_REPEATER_METHOD(OnTestStart, TestInfo)
|
||||
GTEST_REPEATER_METHOD(OnTestEnd, TestInfo)
|
||||
GTEST_REPEATER_METHOD(OnNewTestPartResult, TestPartResult)
|
||||
|
||||
#undef GTEST_REPEATER_METHOD
|
||||
|
||||
// End PrettyUnitTestResultPrinter
|
||||
|
||||
// This class generates an XML output file.
|
||||
class XmlUnitTestResultPrinter : public UnitTestEventListenerInterface {
|
||||
public:
|
||||
explicit XmlUnitTestResultPrinter(const char* output_file);
|
||||
|
||||
virtual void OnUnitTestEnd(const UnitTest* unit_test);
|
||||
|
||||
private:
|
||||
// Is c a whitespace character that is normalized to a space character
|
||||
// when it appears in an XML attribute value?
|
||||
static bool IsNormalizableWhitespace(char c) {
|
||||
return c == 0x9 || c == 0xA || c == 0xD;
|
||||
}
|
||||
|
||||
// May c appear in a well-formed XML document?
|
||||
static bool IsValidXmlCharacter(char c) {
|
||||
return IsNormalizableWhitespace(c) || c >= 0x20;
|
||||
}
|
||||
|
||||
// Returns an XML-escaped copy of the input string str. If
|
||||
// is_attribute is true, the text is meant to appear as an attribute
|
||||
// value, and normalizable whitespace is preserved by replacing it
|
||||
// with character references.
|
||||
static internal::String EscapeXml(const char* str,
|
||||
bool is_attribute);
|
||||
|
||||
// Convenience wrapper around EscapeXml when str is an attribute value.
|
||||
static internal::String EscapeXmlAttribute(const char* str) {
|
||||
return EscapeXml(str, true);
|
||||
}
|
||||
|
||||
// Convenience wrapper around EscapeXml when str is not an attribute value.
|
||||
static internal::String EscapeXmlText(const char* str) {
|
||||
return EscapeXml(str, false);
|
||||
}
|
||||
|
||||
// Prints an XML representation of a TestInfo object.
|
||||
static void PrintXmlTestInfo(FILE* out,
|
||||
const char* test_case_name,
|
||||
const TestInfo* test_info);
|
||||
|
||||
// Prints an XML representation of a TestCase object
|
||||
static void PrintXmlTestCase(FILE* out, const TestCase* test_case);
|
||||
|
||||
// Prints an XML summary of unit_test to output stream out.
|
||||
static void PrintXmlUnitTest(FILE* out, const UnitTest* unit_test);
|
||||
|
||||
// Produces a string representing the test properties in a result as space
|
||||
// delimited XML attributes based on the property key="value" pairs.
|
||||
// When the String is not empty, it includes a space at the beginning,
|
||||
// to delimit this attribute from prior attributes.
|
||||
static internal::String TestPropertiesAsXmlAttributes(
|
||||
const internal::TestResult* result);
|
||||
|
||||
// The output file.
|
||||
const internal::String output_file_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(XmlUnitTestResultPrinter);
|
||||
};
|
||||
|
||||
// Creates a new XmlUnitTestResultPrinter.
|
||||
XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
|
||||
: output_file_(output_file) {
|
||||
if (output_file_.c_str() == NULL || output_file_.empty()) {
|
||||
fprintf(stderr, "XML output file may not be null\n");
|
||||
fflush(stderr);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
// Called after the unit test ends.
|
||||
void XmlUnitTestResultPrinter::OnUnitTestEnd(const UnitTest* unit_test) {
|
||||
FILE* xmlout = NULL;
|
||||
internal::FilePath output_file(output_file_);
|
||||
internal::FilePath output_dir(output_file.RemoveFileName());
|
||||
|
||||
if (output_dir.CreateDirectoriesRecursively()) {
|
||||
// MSVC 8 deprecates fopen(), so we want to suppress warning 4996
|
||||
// (deprecated function) there.
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// We are on Windows.
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
xmlout = fopen(output_file_.c_str(), "w");
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else // We are on Linux or Mac OS.
|
||||
xmlout = fopen(output_file_.c_str(), "w");
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
if (xmlout == NULL) {
|
||||
// TODO(wan): report the reason of the failure.
|
||||
//
|
||||
// We don't do it for now as:
|
||||
//
|
||||
// 1. There is no urgent need for it.
|
||||
// 2. It's a bit involved to make the errno variable thread-safe on
|
||||
// all three operating systems (Linux, Windows, and Mac OS).
|
||||
// 3. To interpret the meaning of errno in a thread-safe way,
|
||||
// we need the strerror_r() function, which is not available on
|
||||
// Windows.
|
||||
fprintf(stderr,
|
||||
"Unable to open file \"%s\"\n",
|
||||
output_file_.c_str());
|
||||
fflush(stderr);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
PrintXmlUnitTest(xmlout, unit_test);
|
||||
fclose(xmlout);
|
||||
}
|
||||
|
||||
// Returns an XML-escaped copy of the input string str. If is_attribute
|
||||
// is true, the text is meant to appear as an attribute value, and
|
||||
// normalizable whitespace is preserved by replacing it with character
|
||||
// references.
|
||||
//
|
||||
// Invalid XML characters in str, if any, are stripped from the output.
|
||||
// It is expected that most, if not all, of the text processed by this
|
||||
// module will consist of ordinary English text.
|
||||
// If this module is ever modified to produce version 1.1 XML output,
|
||||
// most invalid characters can be retained using character references.
|
||||
// TODO(wan): It might be nice to have a minimally invasive, human-readable
|
||||
// escaping scheme for invalid characters, rather than dropping them.
|
||||
internal::String XmlUnitTestResultPrinter::EscapeXml(const char* str,
|
||||
bool is_attribute) {
|
||||
Message m;
|
||||
|
||||
if (str != NULL) {
|
||||
for (const char* src = str; *src; ++src) {
|
||||
switch (*src) {
|
||||
case '<':
|
||||
m << "<";
|
||||
break;
|
||||
case '>':
|
||||
m << ">";
|
||||
break;
|
||||
case '&':
|
||||
m << "&";
|
||||
break;
|
||||
case '\'':
|
||||
if (is_attribute)
|
||||
m << "'";
|
||||
else
|
||||
m << '\'';
|
||||
break;
|
||||
case '"':
|
||||
if (is_attribute)
|
||||
m << """;
|
||||
else
|
||||
m << '"';
|
||||
break;
|
||||
default:
|
||||
if (IsValidXmlCharacter(*src)) {
|
||||
if (is_attribute && IsNormalizableWhitespace(*src))
|
||||
m << internal::String::Format("&#x%02X;", unsigned(*src));
|
||||
else
|
||||
m << *src;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return m.GetString();
|
||||
}
|
||||
|
||||
|
||||
// The following routines generate an XML representation of a UnitTest
|
||||
// object.
|
||||
//
|
||||
// This is how Google Test concepts map to the DTD:
|
||||
//
|
||||
// <testsuite name="AllTests"> <-- corresponds to a UnitTest object
|
||||
// <testsuite name="testcase-name"> <-- corresponds to a TestCase object
|
||||
// <testcase name="test-name"> <-- corresponds to a TestInfo object
|
||||
// <failure message="..." />
|
||||
// <failure message="..." /> <-- individual assertion failures
|
||||
// <failure message="..." />
|
||||
// </testcase>
|
||||
// </testsuite>
|
||||
// </testsuite>
|
||||
|
||||
// Prints an XML representation of a TestInfo object.
|
||||
// TODO(wan): There is also value in printing properties with the plain printer.
|
||||
void XmlUnitTestResultPrinter::PrintXmlTestInfo(FILE* out,
|
||||
const char* test_case_name,
|
||||
const TestInfo* test_info) {
|
||||
const internal::TestResult * const result = test_info->result();
|
||||
const internal::List<TestPartResult> &results = result->test_part_results();
|
||||
fprintf(out,
|
||||
" <testcase name=\"%s\" status=\"%s\" time=\"%s\" "
|
||||
"classname=\"%s\"%s",
|
||||
EscapeXmlAttribute(test_info->name()).c_str(),
|
||||
test_info->should_run() ? "run" : "notrun",
|
||||
internal::StreamableToString(result->elapsed_time()).c_str(),
|
||||
EscapeXmlAttribute(test_case_name).c_str(),
|
||||
TestPropertiesAsXmlAttributes(result).c_str());
|
||||
|
||||
int failures = 0;
|
||||
for (const internal::ListNode<TestPartResult>* part_node = results.Head();
|
||||
part_node != NULL;
|
||||
part_node = part_node->next()) {
|
||||
const TestPartResult& part = part_node->element();
|
||||
if (part.failed()) {
|
||||
const internal::String message =
|
||||
internal::String::Format("%s:%d\n%s", part.file_name(),
|
||||
part.line_number(), part.message());
|
||||
if (++failures == 1)
|
||||
fprintf(out, ">\n");
|
||||
fprintf(out,
|
||||
" <failure message=\"%s\" type=\"\"/>\n",
|
||||
EscapeXmlAttribute(message.c_str()).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (failures == 0)
|
||||
fprintf(out, " />\n");
|
||||
else
|
||||
fprintf(out, " </testcase>\n");
|
||||
}
|
||||
|
||||
// Prints an XML representation of a TestCase object
|
||||
void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
|
||||
const TestCase* test_case) {
|
||||
fprintf(out,
|
||||
" <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
|
||||
"disabled=\"%d\" ",
|
||||
EscapeXmlAttribute(test_case->name()).c_str(),
|
||||
test_case->total_test_count(),
|
||||
test_case->failed_test_count(),
|
||||
test_case->disabled_test_count());
|
||||
fprintf(out,
|
||||
"errors=\"0\" time=\"%s\">\n",
|
||||
internal::StreamableToString(test_case->elapsed_time()).c_str());
|
||||
for (const internal::ListNode<TestInfo*>* info_node =
|
||||
test_case->test_info_list().Head();
|
||||
info_node != NULL;
|
||||
info_node = info_node->next()) {
|
||||
PrintXmlTestInfo(out, test_case->name(), info_node->element());
|
||||
}
|
||||
fprintf(out, " </testsuite>\n");
|
||||
}
|
||||
|
||||
// Prints an XML summary of unit_test to output stream out.
|
||||
void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
|
||||
const UnitTest* unit_test) {
|
||||
const internal::UnitTestImpl* const impl = unit_test->impl();
|
||||
fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
||||
fprintf(out,
|
||||
"<testsuite tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
|
||||
"errors=\"0\" time=\"%s\" ",
|
||||
impl->total_test_count(),
|
||||
impl->failed_test_count(),
|
||||
impl->disabled_test_count(),
|
||||
internal::StreamableToString(impl->elapsed_time()).c_str());
|
||||
fprintf(out, "name=\"AllTests\">\n");
|
||||
for (const internal::ListNode<TestCase*>* case_node =
|
||||
impl->test_cases()->Head();
|
||||
case_node != NULL;
|
||||
case_node = case_node->next()) {
|
||||
PrintXmlTestCase(out, case_node->element());
|
||||
}
|
||||
fprintf(out, "</testsuite>\n");
|
||||
}
|
||||
|
||||
// Produces a string representing the test properties in a result as space
|
||||
// delimited XML attributes based on the property key="value" pairs.
|
||||
internal::String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
|
||||
const internal::TestResult* result) {
|
||||
using internal::TestProperty;
|
||||
Message attributes;
|
||||
const internal::List<TestProperty>& properties = result->test_properties();
|
||||
for (const internal::ListNode<TestProperty>* property_node =
|
||||
properties.Head();
|
||||
property_node != NULL;
|
||||
property_node = property_node->next()) {
|
||||
const TestProperty& property = property_node->element();
|
||||
attributes << " " << property.key() << "="
|
||||
<< "\"" << EscapeXmlAttribute(property.value()) << "\"";
|
||||
}
|
||||
return attributes.GetString();
|
||||
}
|
||||
|
||||
// End XmlUnitTestResultPrinter
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Class ScopedTrace
|
||||
|
||||
// Pushes the given source file location and message onto a per-thread
|
||||
// trace stack maintained by Google Test.
|
||||
// L < UnitTest::mutex_
|
||||
ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
|
||||
TraceInfo trace;
|
||||
trace.file = file;
|
||||
trace.line = line;
|
||||
trace.message = message.GetString();
|
||||
|
||||
UnitTest::GetInstance()->PushGTestTrace(trace);
|
||||
}
|
||||
|
||||
// Pops the info pushed by the c'tor.
|
||||
// L < UnitTest::mutex_
|
||||
ScopedTrace::~ScopedTrace() {
|
||||
UnitTest::GetInstance()->PopGTestTrace();
|
||||
}
|
||||
|
||||
|
||||
// class OsStackTraceGetter
|
||||
|
||||
// Returns the current OS stack trace as a String. Parameters:
|
||||
//
|
||||
// max_depth - the maximum number of stack frames to be included
|
||||
// in the trace.
|
||||
// skip_count - the number of top frames to be skipped; doesn't count
|
||||
// against max_depth.
|
||||
//
|
||||
// L < mutex_
|
||||
// We use "L < mutex_" to denote that the function may acquire mutex_.
|
||||
String OsStackTraceGetter::CurrentStackTrace(int, int) {
|
||||
return String("");
|
||||
}
|
||||
|
||||
// L < mutex_
|
||||
void OsStackTraceGetter::UponLeavingGTest() {
|
||||
}
|
||||
|
||||
const char* const
|
||||
OsStackTraceGetter::kElidedFramesMarker =
|
||||
"... " GTEST_NAME " internal frames ...";
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// class UnitTest
|
||||
|
||||
// Gets the singleton UnitTest object. The first time this method is
|
||||
// called, a UnitTest object is constructed and returned. Consecutive
|
||||
// calls will return the same object.
|
||||
//
|
||||
// We don't protect this under mutex_ as a user is not supposed to
|
||||
// call this before main() starts, from which point on the return
|
||||
// value will never change.
|
||||
UnitTest * UnitTest::GetInstance() {
|
||||
// When compiled with MSVC 7.1 in optimized mode, destroying the
|
||||
// UnitTest object upon exiting the program messes up the exit code,
|
||||
// causing successful tests to appear failed. We have to use a
|
||||
// different implementation in this case to bypass the compiler bug.
|
||||
// This implementation makes the compiler happy, at the cost of
|
||||
// leaking the UnitTest object.
|
||||
#if _MSC_VER == 1310 && !defined(_DEBUG) // MSVC 7.1 and optimized build.
|
||||
static UnitTest* const instance = new UnitTest;
|
||||
return instance;
|
||||
#else
|
||||
static UnitTest instance;
|
||||
return &instance;
|
||||
#endif // _MSC_VER==1310 && !defined(_DEBUG)
|
||||
}
|
||||
|
||||
// Registers and returns a global test environment. When a test
|
||||
// program is run, all global test environments will be set-up in the
|
||||
// order they were registered. After all tests in the program have
|
||||
// finished, all global test environments will be torn-down in the
|
||||
// *reverse* order they were registered.
|
||||
//
|
||||
// The UnitTest object takes ownership of the given environment.
|
||||
//
|
||||
// We don't protect this under mutex_, as we only support calling it
|
||||
// from the main thread.
|
||||
Environment* UnitTest::AddEnvironment(Environment* env) {
|
||||
if (env == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
impl_->environments()->PushBack(env);
|
||||
impl_->environments_in_reverse_order()->PushFront(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
// Adds a TestPartResult to the current TestResult object. All Google Test
|
||||
// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
|
||||
// this to report their results. The user code should use the
|
||||
// assertion macros instead of calling this directly.
|
||||
// L < mutex_
|
||||
void UnitTest::AddTestPartResult(TestPartResultType result_type,
|
||||
const char* file_name,
|
||||
int line_number,
|
||||
const internal::String& message,
|
||||
const internal::String& os_stack_trace) {
|
||||
Message msg;
|
||||
msg << message;
|
||||
|
||||
internal::MutexLock lock(&mutex_);
|
||||
if (impl_->gtest_trace_stack()->size() > 0) {
|
||||
msg << "\n" << GTEST_NAME << " trace:";
|
||||
|
||||
for (internal::ListNode<internal::TraceInfo>* node =
|
||||
impl_->gtest_trace_stack()->Head();
|
||||
node != NULL;
|
||||
node = node->next()) {
|
||||
const internal::TraceInfo& trace = node->element();
|
||||
msg << "\n" << trace.file << ":" << trace.line << ": " << trace.message;
|
||||
}
|
||||
}
|
||||
|
||||
if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
|
||||
msg << "\nStack trace:\n" << os_stack_trace;
|
||||
}
|
||||
|
||||
const TestPartResult result =
|
||||
TestPartResult(result_type, file_name, line_number,
|
||||
msg.GetString().c_str());
|
||||
impl_->test_part_result_reporter()->ReportTestPartResult(result);
|
||||
|
||||
// If this is a failure and the user wants the debugger to break on
|
||||
// failures ...
|
||||
if (result_type != TPRT_SUCCESS && GTEST_FLAG(break_on_failure)) {
|
||||
// ... then we generate a seg fault.
|
||||
*static_cast<int*>(NULL) = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Creates and adds a property to the current TestResult. If a property matching
|
||||
// the supplied value already exists, updates its value instead.
|
||||
void UnitTest::RecordPropertyForCurrentTest(const char* key,
|
||||
const char* value) {
|
||||
const internal::TestProperty test_property(key, value);
|
||||
impl_->current_test_result()->RecordProperty(test_property);
|
||||
}
|
||||
|
||||
// Runs all tests in this UnitTest object and prints the result.
|
||||
// Returns 0 if successful, or 1 otherwise.
|
||||
//
|
||||
// We don't protect this under mutex_, as we only support calling it
|
||||
// from the main thread.
|
||||
int UnitTest::Run() {
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
#if !defined(_WIN32_WCE)
|
||||
// SetErrorMode doesn't exist on CE.
|
||||
if (GTEST_FLAG(catch_exceptions)) {
|
||||
// The user wants Google Test to catch exceptions thrown by the tests.
|
||||
|
||||
// This lets fatal errors be handled by us, instead of causing pop-ups.
|
||||
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
|
||||
SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
|
||||
}
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
__try {
|
||||
return impl_->RunAllTests();
|
||||
} __except(internal::UnitTestOptions::GTestShouldProcessSEH(
|
||||
GetExceptionCode())) {
|
||||
printf("Exception thrown with code 0x%x.\nFAIL\n", GetExceptionCode());
|
||||
fflush(stdout);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#else
|
||||
// We are on Linux or Mac OS. There is no exception of any kind.
|
||||
|
||||
return impl_->RunAllTests();
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
// Returns the TestCase object for the test that's currently running,
|
||||
// or NULL if no test is running.
|
||||
// L < mutex_
|
||||
const TestCase* UnitTest::current_test_case() const {
|
||||
internal::MutexLock lock(&mutex_);
|
||||
return impl_->current_test_case();
|
||||
}
|
||||
|
||||
// Returns the TestInfo object for the test that's currently running,
|
||||
// or NULL if no test is running.
|
||||
// L < mutex_
|
||||
const TestInfo* UnitTest::current_test_info() const {
|
||||
internal::MutexLock lock(&mutex_);
|
||||
return impl_->current_test_info();
|
||||
}
|
||||
|
||||
// Creates an empty UnitTest.
|
||||
UnitTest::UnitTest() {
|
||||
impl_ = new internal::UnitTestImpl(this);
|
||||
}
|
||||
|
||||
// Destructor of UnitTest.
|
||||
UnitTest::~UnitTest() {
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
||||
// Google Test trace stack.
|
||||
// L < mutex_
|
||||
void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
|
||||
internal::MutexLock lock(&mutex_);
|
||||
impl_->gtest_trace_stack()->PushFront(trace);
|
||||
}
|
||||
|
||||
// Pops a trace from the per-thread Google Test trace stack.
|
||||
// L < mutex_
|
||||
void UnitTest::PopGTestTrace() {
|
||||
internal::MutexLock lock(&mutex_);
|
||||
impl_->gtest_trace_stack()->PopFront(NULL);
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
UnitTestImpl::UnitTestImpl(UnitTest* parent)
|
||||
: parent_(parent),
|
||||
test_cases_(),
|
||||
last_death_test_case_(NULL),
|
||||
current_test_case_(NULL),
|
||||
current_test_info_(NULL),
|
||||
ad_hoc_test_result_(),
|
||||
result_printer_(NULL),
|
||||
os_stack_trace_getter_(NULL),
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
elapsed_time_(0),
|
||||
internal_run_death_test_flag_(NULL),
|
||||
death_test_factory_(new DefaultDeathTestFactory) {
|
||||
#else
|
||||
elapsed_time_(0) {
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
// We do the assignment here instead of in the initializer list, as
|
||||
// doing that latter causes MSVC to issue a warning about using
|
||||
// 'this' in initializers.
|
||||
test_part_result_reporter_ = this;
|
||||
}
|
||||
|
||||
UnitTestImpl::~UnitTestImpl() {
|
||||
// Deletes every TestCase.
|
||||
test_cases_.ForEach(internal::Delete<TestCase>);
|
||||
|
||||
// Deletes every Environment.
|
||||
environments_.ForEach(internal::Delete<Environment>);
|
||||
|
||||
// Deletes the current test result printer.
|
||||
delete result_printer_;
|
||||
|
||||
delete os_stack_trace_getter_;
|
||||
}
|
||||
|
||||
// A predicate that checks the name of a TestCase against a known
|
||||
// value.
|
||||
//
|
||||
// This is used for implementation of the UnitTest class only. We put
|
||||
// it in the anonymous namespace to prevent polluting the outer
|
||||
// namespace.
|
||||
//
|
||||
// TestCaseNameIs is copyable.
|
||||
class TestCaseNameIs {
|
||||
public:
|
||||
// Constructor.
|
||||
explicit TestCaseNameIs(const String& name)
|
||||
: name_(name) {}
|
||||
|
||||
// Returns true iff the name of test_case matches name_.
|
||||
bool operator()(const TestCase* test_case) const {
|
||||
return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
|
||||
}
|
||||
|
||||
private:
|
||||
String name_;
|
||||
};
|
||||
|
||||
// Finds and returns a TestCase with the given name. If one doesn't
|
||||
// exist, creates one and returns it.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// test_case_name: name of the test case
|
||||
// set_up_tc: pointer to the function that sets up the test case
|
||||
// tear_down_tc: pointer to the function that tears down the test case
|
||||
TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc) {
|
||||
// Can we find a TestCase with the given name?
|
||||
internal::ListNode<TestCase*>* node = test_cases_.FindIf(
|
||||
TestCaseNameIs(test_case_name));
|
||||
|
||||
if (node == NULL) {
|
||||
// No. Let's create one.
|
||||
TestCase* const test_case =
|
||||
new TestCase(test_case_name, set_up_tc, tear_down_tc);
|
||||
|
||||
// Is this a death test case?
|
||||
if (String(test_case_name).EndsWith("DeathTest")) {
|
||||
// Yes. Inserts the test case after the last death test case
|
||||
// defined so far.
|
||||
node = test_cases_.InsertAfter(last_death_test_case_, test_case);
|
||||
last_death_test_case_ = node;
|
||||
} else {
|
||||
// No. Appends to the end of the list.
|
||||
test_cases_.PushBack(test_case);
|
||||
node = test_cases_.Last();
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the TestCase found.
|
||||
return node->element();
|
||||
}
|
||||
|
||||
// Helpers for setting up / tearing down the given environment. They
|
||||
// are for use in the List::ForEach() method.
|
||||
static void SetUpEnvironment(Environment* env) { env->SetUp(); }
|
||||
static void TearDownEnvironment(Environment* env) { env->TearDown(); }
|
||||
|
||||
// Runs all tests in this UnitTest object, prints the result, and
|
||||
// returns 0 if all tests are successful, or 1 otherwise. If any
|
||||
// exception is thrown during a test on Windows, this test is
|
||||
// considered to be failed, but the rest of the tests will still be
|
||||
// run. (We disable exceptions on Linux and Mac OS X, so the issue
|
||||
// doesn't apply there.)
|
||||
int UnitTestImpl::RunAllTests() {
|
||||
// Makes sure InitGoogleTest() was called.
|
||||
if (!GTestIsInitialized()) {
|
||||
printf("%s",
|
||||
"\nThis test program did NOT call ::testing::InitGoogleTest "
|
||||
"before calling RUN_ALL_TESTS(). Please fix it.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Lists all the tests and exits if the --gtest_list_tests
|
||||
// flag was specified.
|
||||
if (GTEST_FLAG(list_tests)) {
|
||||
ListAllTests();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// True iff we are in a subprocess for running a thread-safe-style
|
||||
// death test.
|
||||
bool in_subprocess_for_death_test = false;
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
|
||||
in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
UnitTestEventListenerInterface * const printer = result_printer();
|
||||
|
||||
// Compares the full test names with the filter to decide which
|
||||
// tests to run.
|
||||
const bool has_tests_to_run = FilterTests() > 0;
|
||||
// True iff at least one test has failed.
|
||||
bool failed = false;
|
||||
|
||||
// How many times to repeat the tests? We don't want to repeat them
|
||||
// when we are inside the subprocess of a death test.
|
||||
const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
|
||||
// Repeats forever if the repeat count is negative.
|
||||
const bool forever = repeat < 0;
|
||||
for (int i = 0; forever || i != repeat; i++) {
|
||||
if (repeat != 1) {
|
||||
printf("\nRepeating all tests (iteration %d) . . .\n\n", i + 1);
|
||||
}
|
||||
|
||||
// Tells the unit test event listener that the tests are about to
|
||||
// start.
|
||||
printer->OnUnitTestStart(parent_);
|
||||
|
||||
const TimeInMillis start = GetTimeInMillis();
|
||||
|
||||
// Runs each test case if there is at least one test to run.
|
||||
if (has_tests_to_run) {
|
||||
// Sets up all environments beforehand.
|
||||
printer->OnGlobalSetUpStart(parent_);
|
||||
environments_.ForEach(SetUpEnvironment);
|
||||
printer->OnGlobalSetUpEnd(parent_);
|
||||
|
||||
// Runs the tests only if there was no fatal failure during global
|
||||
// set-up.
|
||||
if (!Test::HasFatalFailure()) {
|
||||
test_cases_.ForEach(TestCase::RunTestCase);
|
||||
}
|
||||
|
||||
// Tears down all environments in reverse order afterwards.
|
||||
printer->OnGlobalTearDownStart(parent_);
|
||||
environments_in_reverse_order_.ForEach(TearDownEnvironment);
|
||||
printer->OnGlobalTearDownEnd(parent_);
|
||||
}
|
||||
|
||||
elapsed_time_ = GetTimeInMillis() - start;
|
||||
|
||||
// Tells the unit test event listener that the tests have just
|
||||
// finished.
|
||||
printer->OnUnitTestEnd(parent_);
|
||||
|
||||
// Gets the result and clears it.
|
||||
if (!Passed()) {
|
||||
failed = true;
|
||||
}
|
||||
ClearResult();
|
||||
}
|
||||
|
||||
// Returns 0 if all tests passed, or 1 other wise.
|
||||
return failed ? 1 : 0;
|
||||
}
|
||||
|
||||
// Compares the name of each test with the user-specified filter to
|
||||
// decide whether the test should be run, then records the result in
|
||||
// each TestCase and TestInfo object.
|
||||
// Returns the number of tests that should run.
|
||||
int UnitTestImpl::FilterTests() {
|
||||
int num_runnable_tests = 0;
|
||||
for (const internal::ListNode<TestCase *> *test_case_node =
|
||||
test_cases_.Head();
|
||||
test_case_node != NULL;
|
||||
test_case_node = test_case_node->next()) {
|
||||
TestCase * const test_case = test_case_node->element();
|
||||
const String &test_case_name = test_case->name();
|
||||
test_case->set_should_run(false);
|
||||
|
||||
for (const internal::ListNode<TestInfo *> *test_info_node =
|
||||
test_case->test_info_list().Head();
|
||||
test_info_node != NULL;
|
||||
test_info_node = test_info_node->next()) {
|
||||
TestInfo * const test_info = test_info_node->element();
|
||||
const String test_name(test_info->name());
|
||||
// A test is disabled if test case name or test name matches
|
||||
// kDisableTestPattern.
|
||||
const bool is_disabled =
|
||||
internal::UnitTestOptions::PatternMatchesString(kDisableTestPattern,
|
||||
test_case_name.c_str()) ||
|
||||
internal::UnitTestOptions::PatternMatchesString(kDisableTestPattern,
|
||||
test_name.c_str());
|
||||
test_info->impl()->set_is_disabled(is_disabled);
|
||||
|
||||
const bool should_run = !is_disabled &&
|
||||
internal::UnitTestOptions::FilterMatchesTest(test_case_name,
|
||||
test_name);
|
||||
test_info->impl()->set_should_run(should_run);
|
||||
test_case->set_should_run(test_case->should_run() || should_run);
|
||||
if (should_run) {
|
||||
num_runnable_tests++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return num_runnable_tests;
|
||||
}
|
||||
|
||||
// Lists all tests by name.
|
||||
void UnitTestImpl::ListAllTests() {
|
||||
for (const internal::ListNode<TestCase*>* test_case_node = test_cases_.Head();
|
||||
test_case_node != NULL;
|
||||
test_case_node = test_case_node->next()) {
|
||||
const TestCase* const test_case = test_case_node->element();
|
||||
|
||||
// Prints the test case name following by an indented list of test nodes.
|
||||
printf("%s.\n", test_case->name());
|
||||
|
||||
for (const internal::ListNode<TestInfo*>* test_info_node =
|
||||
test_case->test_info_list().Head();
|
||||
test_info_node != NULL;
|
||||
test_info_node = test_info_node->next()) {
|
||||
const TestInfo* const test_info = test_info_node->element();
|
||||
|
||||
printf(" %s\n", test_info->name());
|
||||
}
|
||||
}
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// Sets the unit test result printer.
|
||||
//
|
||||
// Does nothing if the input and the current printer object are the
|
||||
// same; otherwise, deletes the old printer object and makes the
|
||||
// input the current printer.
|
||||
void UnitTestImpl::set_result_printer(
|
||||
UnitTestEventListenerInterface* result_printer) {
|
||||
if (result_printer_ != result_printer) {
|
||||
delete result_printer_;
|
||||
result_printer_ = result_printer;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the current unit test result printer if it is not NULL;
|
||||
// otherwise, creates an appropriate result printer, makes it the
|
||||
// current printer, and returns it.
|
||||
UnitTestEventListenerInterface* UnitTestImpl::result_printer() {
|
||||
if (result_printer_ != NULL) {
|
||||
return result_printer_;
|
||||
}
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
if (internal_run_death_test_flag_.get() != NULL) {
|
||||
result_printer_ = new NullUnitTestResultPrinter;
|
||||
return result_printer_;
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
UnitTestEventsRepeater *repeater = new UnitTestEventsRepeater;
|
||||
const String& output_format = internal::UnitTestOptions::GetOutputFormat();
|
||||
if (output_format == "xml") {
|
||||
repeater->AddListener(new XmlUnitTestResultPrinter(
|
||||
internal::UnitTestOptions::GetOutputFile().c_str()));
|
||||
} else if (output_format != "") {
|
||||
printf("WARNING: unrecognized output format \"%s\" ignored.\n",
|
||||
output_format.c_str());
|
||||
fflush(stdout);
|
||||
}
|
||||
repeater->AddListener(new PrettyUnitTestResultPrinter);
|
||||
result_printer_ = repeater;
|
||||
return result_printer_;
|
||||
}
|
||||
|
||||
// Sets the OS stack trace getter.
|
||||
//
|
||||
// Does nothing if the input and the current OS stack trace getter are
|
||||
// the same; otherwise, deletes the old getter and makes the input the
|
||||
// current getter.
|
||||
void UnitTestImpl::set_os_stack_trace_getter(
|
||||
OsStackTraceGetterInterface* getter) {
|
||||
if (os_stack_trace_getter_ != getter) {
|
||||
delete os_stack_trace_getter_;
|
||||
os_stack_trace_getter_ = getter;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the current OS stack trace getter if it is not NULL;
|
||||
// otherwise, creates an OsStackTraceGetter, makes it the current
|
||||
// getter, and returns it.
|
||||
OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
|
||||
if (os_stack_trace_getter_ == NULL) {
|
||||
os_stack_trace_getter_ = new OsStackTraceGetter;
|
||||
}
|
||||
|
||||
return os_stack_trace_getter_;
|
||||
}
|
||||
|
||||
// Returns the TestResult for the test that's currently running, or
|
||||
// the TestResult for the ad hoc test if no test is running.
|
||||
internal::TestResult* UnitTestImpl::current_test_result() {
|
||||
return current_test_info_ ?
|
||||
current_test_info_->impl()->result() : &ad_hoc_test_result_;
|
||||
}
|
||||
|
||||
// TestInfoImpl constructor.
|
||||
TestInfoImpl::TestInfoImpl(TestInfo* parent,
|
||||
const char* test_case_name,
|
||||
const char* name,
|
||||
TypeId fixture_class_id,
|
||||
TestMaker maker) :
|
||||
parent_(parent),
|
||||
test_case_name_(String(test_case_name)),
|
||||
name_(String(name)),
|
||||
fixture_class_id_(fixture_class_id),
|
||||
should_run_(false),
|
||||
is_disabled_(false),
|
||||
maker_(maker) {
|
||||
}
|
||||
|
||||
// TestInfoImpl destructor.
|
||||
TestInfoImpl::~TestInfoImpl() {
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Parses a string as a command line flag. The string should have
|
||||
// the format "--flag=value". When def_optional is true, the "=value"
|
||||
// part can be omitted.
|
||||
//
|
||||
// Returns the value of the flag, or NULL if the parsing failed.
|
||||
const char* ParseFlagValue(const char* str,
|
||||
const char* flag,
|
||||
bool def_optional) {
|
||||
// str and flag must not be NULL.
|
||||
if (str == NULL || flag == NULL) return NULL;
|
||||
|
||||
// The flag must start with "--" followed by GTEST_FLAG_PREFIX.
|
||||
const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX, flag);
|
||||
const size_t flag_len = flag_str.GetLength();
|
||||
if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
|
||||
|
||||
// Skips the flag name.
|
||||
const char* flag_end = str + flag_len;
|
||||
|
||||
// When def_optional is true, it's OK to not have a "=value" part.
|
||||
if (def_optional && (flag_end[0] == '\0')) {
|
||||
return flag_end;
|
||||
}
|
||||
|
||||
// If def_optional is true and there are more characters after the
|
||||
// flag name, or if def_optional is false, there must be a '=' after
|
||||
// the flag name.
|
||||
if (flag_end[0] != '=') return NULL;
|
||||
|
||||
// Returns the string after "=".
|
||||
return flag_end + 1;
|
||||
}
|
||||
|
||||
// Parses a string for a bool flag, in the form of either
|
||||
// "--flag=value" or "--flag".
|
||||
//
|
||||
// In the former case, the value is taken as true as long as it does
|
||||
// not start with '0', 'f', or 'F'.
|
||||
//
|
||||
// In the latter case, the value is taken as true.
|
||||
//
|
||||
// On success, stores the value of the flag in *value, and returns
|
||||
// true. On failure, returns false without changing *value.
|
||||
bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
|
||||
// Gets the value of the flag as a string.
|
||||
const char* const value_str = ParseFlagValue(str, flag, true);
|
||||
|
||||
// Aborts if the parsing failed.
|
||||
if (value_str == NULL) return false;
|
||||
|
||||
// Converts the string value to a bool.
|
||||
*value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
|
||||
return true;
|
||||
}
|
||||
|
||||
// Parses a string for an Int32 flag, in the form of
|
||||
// "--flag=value".
|
||||
//
|
||||
// On success, stores the value of the flag in *value, and returns
|
||||
// true. On failure, returns false without changing *value.
|
||||
bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
|
||||
// Gets the value of the flag as a string.
|
||||
const char* const value_str = ParseFlagValue(str, flag, false);
|
||||
|
||||
// Aborts if the parsing failed.
|
||||
if (value_str == NULL) return false;
|
||||
|
||||
// Sets *value to the value of the flag.
|
||||
return ParseInt32(Message() << "The value of flag --" << flag,
|
||||
value_str, value);
|
||||
}
|
||||
|
||||
// Parses a string for a string flag, in the form of
|
||||
// "--flag=value".
|
||||
//
|
||||
// On success, stores the value of the flag in *value, and returns
|
||||
// true. On failure, returns false without changing *value.
|
||||
bool ParseStringFlag(const char* str, const char* flag, String* value) {
|
||||
// Gets the value of the flag as a string.
|
||||
const char* const value_str = ParseFlagValue(str, flag, false);
|
||||
|
||||
// Aborts if the parsing failed.
|
||||
if (value_str == NULL) return false;
|
||||
|
||||
// Sets *value to the value of the flag.
|
||||
*value = value_str;
|
||||
return true;
|
||||
}
|
||||
|
||||
// The internal implementation of InitGoogleTest().
|
||||
//
|
||||
// The type parameter CharType can be instantiated to either char or
|
||||
// wchar_t.
|
||||
template <typename CharType>
|
||||
void InitGoogleTestImpl(int* argc, CharType** argv) {
|
||||
g_parse_gtest_flags_called = true;
|
||||
if (*argc <= 0) return;
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
g_argvs.clear();
|
||||
for (int i = 0; i != *argc; i++) {
|
||||
g_argvs.push_back(StreamableToString(argv[i]));
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
for (int i = 1; i != *argc; i++) {
|
||||
const String arg_string = StreamableToString(argv[i]);
|
||||
const char* const arg = arg_string.c_str();
|
||||
|
||||
using internal::ParseBoolFlag;
|
||||
using internal::ParseInt32Flag;
|
||||
using internal::ParseStringFlag;
|
||||
|
||||
// Do we see a Google Test flag?
|
||||
if (ParseBoolFlag(arg, kBreakOnFailureFlag,
|
||||
>EST_FLAG(break_on_failure)) ||
|
||||
ParseBoolFlag(arg, kCatchExceptionsFlag,
|
||||
>EST_FLAG(catch_exceptions)) ||
|
||||
ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) ||
|
||||
ParseStringFlag(arg, kDeathTestStyleFlag,
|
||||
>EST_FLAG(death_test_style)) ||
|
||||
ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) ||
|
||||
ParseStringFlag(arg, kInternalRunDeathTestFlag,
|
||||
>EST_FLAG(internal_run_death_test)) ||
|
||||
ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
|
||||
ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
|
||||
ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat))
|
||||
) {
|
||||
// Yes. Shift the remainder of the argv list left by one. Note
|
||||
// that argv has (*argc + 1) elements, the last one always being
|
||||
// NULL. The following loop moves the trailing NULL element as
|
||||
// well.
|
||||
for (int j = i; j != *argc; j++) {
|
||||
argv[j] = argv[j + 1];
|
||||
}
|
||||
|
||||
// Decrements the argument count.
|
||||
(*argc)--;
|
||||
|
||||
// We also need to decrement the iterator as we just removed
|
||||
// an element.
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Initializes Google Test. This must be called before calling
|
||||
// RUN_ALL_TESTS(). In particular, it parses a command line for the
|
||||
// flags that Google Test recognizes. Whenever a Google Test flag is
|
||||
// seen, it is removed from argv, and *argc is decremented.
|
||||
//
|
||||
// No value is returned. Instead, the Google Test flag variables are
|
||||
// updated.
|
||||
void InitGoogleTest(int* argc, char** argv) {
|
||||
internal::g_executable_path = argv[0];
|
||||
internal::InitGoogleTestImpl(argc, argv);
|
||||
}
|
||||
|
||||
// This overloaded version can be used in Windows programs compiled in
|
||||
// UNICODE mode.
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
void InitGoogleTest(int* argc, wchar_t** argv) {
|
||||
// g_executable_path uses normal characters rather than wide chars, so call
|
||||
// StreamableToString to convert argv[0] to normal characters (utf8 encoding).
|
||||
internal::g_executable_path = internal::StreamableToString(argv[0]);
|
||||
internal::InitGoogleTestImpl(argc, argv);
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
} // namespace testing
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
std::cout << "Running main() from gtest_main.cc\n";
|
||||
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -0,0 +1,862 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Tests for death tests.
|
||||
|
||||
#include <gtest/gtest-death-test.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
using testing::internal::DeathTest;
|
||||
using testing::internal::DeathTestFactory;
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// A helper class whose objects replace the death test factory for a
|
||||
// single UnitTest object during their lifetimes.
|
||||
class ReplaceDeathTestFactory {
|
||||
public:
|
||||
ReplaceDeathTestFactory(UnitTest* parent, DeathTestFactory* new_factory)
|
||||
: parent_impl_(parent->impl()) {
|
||||
old_factory_ = parent_impl_->death_test_factory_.release();
|
||||
parent_impl_->death_test_factory_.reset(new_factory);
|
||||
}
|
||||
|
||||
~ReplaceDeathTestFactory() {
|
||||
parent_impl_->death_test_factory_.release();
|
||||
parent_impl_->death_test_factory_.reset(old_factory_);
|
||||
}
|
||||
private:
|
||||
// Prevents copying ReplaceDeathTestFactory objects.
|
||||
ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);
|
||||
void operator=(const ReplaceDeathTestFactory&);
|
||||
|
||||
UnitTestImpl* parent_impl_;
|
||||
DeathTestFactory* old_factory_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
// Tests that death tests work.
|
||||
|
||||
class TestForDeathTest : public testing::Test {
|
||||
protected:
|
||||
// A static member function that's expected to die.
|
||||
static void StaticMemberFunction() {
|
||||
GTEST_LOG(FATAL, "death inside StaticMemberFunction().");
|
||||
}
|
||||
|
||||
// A method of the test fixture that may die.
|
||||
void MemberFunction() {
|
||||
if (should_die_) {
|
||||
GTEST_LOG(FATAL, "death inside MemberFunction().");
|
||||
}
|
||||
}
|
||||
|
||||
// True iff MemberFunction() should die.
|
||||
bool should_die_;
|
||||
};
|
||||
|
||||
// A class with a member function that may die.
|
||||
class MayDie {
|
||||
public:
|
||||
explicit MayDie(bool should_die) : should_die_(should_die) {}
|
||||
|
||||
// A member function that may die.
|
||||
void MemberFunction() const {
|
||||
if (should_die_) {
|
||||
GTEST_LOG(FATAL, "death inside MayDie::MemberFunction().");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
// True iff MemberFunction() should die.
|
||||
bool should_die_;
|
||||
};
|
||||
|
||||
// A global function that's expected to die.
|
||||
void GlobalFunction() {
|
||||
GTEST_LOG(FATAL, "death inside GlobalFunction().");
|
||||
}
|
||||
|
||||
// A non-void function that's expected to die.
|
||||
int NonVoidFunction() {
|
||||
GTEST_LOG(FATAL, "death inside NonVoidFunction().");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// A unary function that may die.
|
||||
void DieIf(bool should_die) {
|
||||
if (should_die) {
|
||||
GTEST_LOG(FATAL, "death inside DieIf().");
|
||||
}
|
||||
}
|
||||
|
||||
// A binary function that may die.
|
||||
bool DieIfLessThan(int x, int y) {
|
||||
if (x < y) {
|
||||
GTEST_LOG(FATAL, "death inside DieIfLessThan().");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
|
||||
void DeathTestSubroutine() {
|
||||
EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction");
|
||||
ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction");
|
||||
}
|
||||
|
||||
// Death in dbg, not opt.
|
||||
int DieInDebugElse12(int* sideeffect) {
|
||||
if (sideeffect) *sideeffect = 12;
|
||||
#ifndef NDEBUG
|
||||
GTEST_LOG(FATAL, "debug death inside DieInDebugElse12()");
|
||||
#endif // NDEBUG
|
||||
return 12;
|
||||
}
|
||||
|
||||
// Returns the exit status of a process that calls exit(2) with a
|
||||
// given exit code. This is a helper function for the
|
||||
// ExitStatusPredicateTest test suite.
|
||||
static int NormalExitStatus(int exit_code) {
|
||||
pid_t child_pid = fork();
|
||||
if (child_pid == 0) {
|
||||
exit(exit_code);
|
||||
}
|
||||
int status;
|
||||
waitpid(child_pid, &status, 0);
|
||||
return status;
|
||||
}
|
||||
|
||||
// Returns the exit status of a process that raises a given signal.
|
||||
// If the signal does not cause the process to die, then it returns
|
||||
// instead the exit status of a process that exits normally with exit
|
||||
// code 1. This is a helper function for the ExitStatusPredicateTest
|
||||
// test suite.
|
||||
static int KilledExitStatus(int signum) {
|
||||
pid_t child_pid = fork();
|
||||
if (child_pid == 0) {
|
||||
raise(signum);
|
||||
exit(1);
|
||||
}
|
||||
int status;
|
||||
waitpid(child_pid, &status, 0);
|
||||
return status;
|
||||
}
|
||||
|
||||
// Tests the ExitedWithCode predicate.
|
||||
TEST(ExitStatusPredicateTest, ExitedWithCode) {
|
||||
const int status0 = NormalExitStatus(0);
|
||||
const int status1 = NormalExitStatus(1);
|
||||
const int status42 = NormalExitStatus(42);
|
||||
const testing::ExitedWithCode pred0(0);
|
||||
const testing::ExitedWithCode pred1(1);
|
||||
const testing::ExitedWithCode pred42(42);
|
||||
EXPECT_PRED1(pred0, status0);
|
||||
EXPECT_PRED1(pred1, status1);
|
||||
EXPECT_PRED1(pred42, status42);
|
||||
EXPECT_FALSE(pred0(status1));
|
||||
EXPECT_FALSE(pred42(status0));
|
||||
EXPECT_FALSE(pred1(status42));
|
||||
}
|
||||
|
||||
// Tests the KilledBySignal predicate.
|
||||
TEST(ExitStatusPredicateTest, KilledBySignal) {
|
||||
const int status_segv = KilledExitStatus(SIGSEGV);
|
||||
const int status_kill = KilledExitStatus(SIGKILL);
|
||||
const testing::KilledBySignal pred_segv(SIGSEGV);
|
||||
const testing::KilledBySignal pred_kill(SIGKILL);
|
||||
EXPECT_PRED1(pred_segv, status_segv);
|
||||
EXPECT_PRED1(pred_kill, status_kill);
|
||||
EXPECT_FALSE(pred_segv(status_kill));
|
||||
EXPECT_FALSE(pred_kill(status_segv));
|
||||
}
|
||||
|
||||
// Tests that the death test macros expand to code which may or may not
|
||||
// be followed by operator<<, and that in either case the complete text
|
||||
// comprises only a single C++ statement.
|
||||
TEST_F(TestForDeathTest, SingleStatement) {
|
||||
if (false)
|
||||
// This would fail if executed; this is a compilation test only
|
||||
ASSERT_DEATH(return, "");
|
||||
|
||||
if (true)
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
else
|
||||
// This empty "else" branch is meant to ensure that EXPECT_DEATH
|
||||
// doesn't expand into an "if" statement without an "else"
|
||||
;
|
||||
|
||||
if (false)
|
||||
ASSERT_DEATH(return, "") << "did not die";
|
||||
|
||||
if (false)
|
||||
;
|
||||
else
|
||||
EXPECT_DEATH(exit(1), "") << 1 << 2 << 3;
|
||||
}
|
||||
|
||||
void DieWithEmbeddedNul() {
|
||||
fprintf(stderr, "Hello%cworld.\n", '\0');
|
||||
abort();
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
|
||||
// message has a NUL character in it.
|
||||
TEST_F(TestForDeathTest, DISABLED_EmbeddedNulInMessage) {
|
||||
// TODO(wan@google.com): <regex.h> doesn't support matching strings
|
||||
// with embedded NUL characters - find a way to workaround it.
|
||||
EXPECT_DEATH(DieWithEmbeddedNul(), "w.*ld");
|
||||
ASSERT_DEATH(DieWithEmbeddedNul(), "w.*ld");
|
||||
}
|
||||
|
||||
// Tests that death test macros expand to code which interacts well with switch
|
||||
// statements.
|
||||
TEST_F(TestForDeathTest, SwitchStatement) {
|
||||
switch (0)
|
||||
default:
|
||||
ASSERT_DEATH(exit(1), "") << "exit in default switch handler";
|
||||
|
||||
switch (0)
|
||||
case 0:
|
||||
EXPECT_DEATH(exit(1), "") << "exit in switch case";
|
||||
}
|
||||
|
||||
// Tests that a static member function can be used in a death test.
|
||||
TEST_F(TestForDeathTest, StaticMemberFunction) {
|
||||
ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
|
||||
}
|
||||
|
||||
// Tests that a method of the test fixture can be used in a death test.
|
||||
TEST_F(TestForDeathTest, MemberFunction) {
|
||||
should_die_ = true;
|
||||
EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
|
||||
}
|
||||
|
||||
// Repeats a representative sample of death tests in the "threadsafe" style:
|
||||
|
||||
TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
should_die_ = true;
|
||||
EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
|
||||
for (int i = 0; i < 3; ++i)
|
||||
EXPECT_EXIT(exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, MixedStyles) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
bool pthread_flag;
|
||||
|
||||
void SetPthreadFlag() {
|
||||
pthread_flag = true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
pthread_flag = false;
|
||||
ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));
|
||||
ASSERT_DEATH(exit(1), "");
|
||||
ASSERT_FALSE(pthread_flag);
|
||||
}
|
||||
|
||||
// Tests that a method of another class can be used in a death test.
|
||||
TEST_F(TestForDeathTest, MethodOfAnotherClass) {
|
||||
const MayDie x(true);
|
||||
ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction");
|
||||
}
|
||||
|
||||
// Tests that a global function can be used in a death test.
|
||||
TEST_F(TestForDeathTest, GlobalFunction) {
|
||||
EXPECT_DEATH(GlobalFunction(), "GlobalFunction");
|
||||
}
|
||||
|
||||
// Tests that any value convertible to an RE works as a second
|
||||
// argument to EXPECT_DEATH.
|
||||
TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
|
||||
static const char regex_c_str[] = "GlobalFunction";
|
||||
EXPECT_DEATH(GlobalFunction(), regex_c_str);
|
||||
|
||||
const testing::internal::RE regex(regex_c_str);
|
||||
EXPECT_DEATH(GlobalFunction(), regex);
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
const string regex_str(regex_c_str);
|
||||
EXPECT_DEATH(GlobalFunction(), regex_str);
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
const ::std::string regex_std_str(regex_c_str);
|
||||
EXPECT_DEATH(GlobalFunction(), regex_std_str);
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
}
|
||||
|
||||
// Tests that a non-void function can be used in a death test.
|
||||
TEST_F(TestForDeathTest, NonVoidFunction) {
|
||||
ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction");
|
||||
}
|
||||
|
||||
// Tests that functions that take parameter(s) can be used in a death test.
|
||||
TEST_F(TestForDeathTest, FunctionWithParameter) {
|
||||
EXPECT_DEATH(DieIf(true), "DieIf\\(\\)");
|
||||
EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan");
|
||||
}
|
||||
|
||||
// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
|
||||
TEST_F(TestForDeathTest, OutsideFixture) {
|
||||
DeathTestSubroutine();
|
||||
}
|
||||
|
||||
// Tests that death tests can be done inside a loop.
|
||||
TEST_F(TestForDeathTest, InsideLoop) {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i;
|
||||
}
|
||||
}
|
||||
|
||||
// Tests that a compound statement can be used in a death test.
|
||||
TEST_F(TestForDeathTest, CompoundStatement) {
|
||||
EXPECT_DEATH({ // NOLINT
|
||||
const int x = 2;
|
||||
const int y = x + 1;
|
||||
DieIfLessThan(x, y);
|
||||
},
|
||||
"DieIfLessThan");
|
||||
}
|
||||
|
||||
// Tests that code that doesn't die causes a death test to fail.
|
||||
TEST_F(TestForDeathTest, DoesNotDie) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"),
|
||||
"failed to die");
|
||||
}
|
||||
|
||||
// Tests that a death test fails when the error message isn't expected.
|
||||
TEST_F(TestForDeathTest, ErrorMessageMismatch) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message.";
|
||||
}, "died but not with expected error");
|
||||
}
|
||||
|
||||
// On exit, *aborted will be true iff the EXPECT_DEATH() statement
|
||||
// aborted the function.
|
||||
void ExpectDeathTestHelper(bool* aborted) {
|
||||
*aborted = true;
|
||||
EXPECT_DEATH(DieIf(false), "DieIf"); // This assertion should fail.
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEATH doesn't abort the test on failure.
|
||||
TEST_F(TestForDeathTest, EXPECT_DEATH) {
|
||||
bool aborted = true;
|
||||
EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),
|
||||
"failed to die");
|
||||
EXPECT_FALSE(aborted);
|
||||
}
|
||||
|
||||
// Tests that ASSERT_DEATH does abort the test on failure.
|
||||
TEST_F(TestForDeathTest, ASSERT_DEATH) {
|
||||
static bool aborted;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
aborted = true;
|
||||
ASSERT_DEATH(DieIf(false), "DieIf"); // This assertion should fail.
|
||||
aborted = false;
|
||||
}, "failed to die");
|
||||
EXPECT_TRUE(aborted);
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEATH evaluates the arguments exactly once.
|
||||
TEST_F(TestForDeathTest, SingleEvaluation) {
|
||||
int x = 3;
|
||||
EXPECT_DEATH(DieIf((++x) == 4), "DieIf");
|
||||
|
||||
const char* regex = "DieIf";
|
||||
const char* regex_save = regex;
|
||||
EXPECT_DEATH(DieIfLessThan(3, 4), regex++);
|
||||
EXPECT_EQ(regex_save + 1, regex);
|
||||
}
|
||||
|
||||
// Tests that run-away death tests are reported as failures.
|
||||
TEST_F(TestForDeathTest, Runaway) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"),
|
||||
"failed to die.");
|
||||
|
||||
EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"),
|
||||
"illegal return in test statement.");
|
||||
}
|
||||
|
||||
|
||||
// Tests that EXPECT_DEBUG_DEATH works as expected,
|
||||
// that is, in debug mode, it:
|
||||
// 1. Asserts on death.
|
||||
// 2. Has no side effect.
|
||||
//
|
||||
// And in opt mode, it:
|
||||
// 1. Has side effects but does not assert.
|
||||
TEST_F(TestForDeathTest, TestExpectDebugDeath) {
|
||||
int sideeffect = 0;
|
||||
|
||||
EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect),
|
||||
"death.*DieInDebugElse12");
|
||||
|
||||
#ifdef NDEBUG
|
||||
// Checks that the assignment occurs in opt mode (sideeffect).
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
#else
|
||||
// Checks that the assignment does not occur in dbg mode (no sideeffect).
|
||||
EXPECT_EQ(0, sideeffect);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEBUG_DEATH works as expected,
|
||||
// that is, in debug mode, it:
|
||||
// 1. Asserts on death.
|
||||
// 2. Has no side effect.
|
||||
//
|
||||
// And in opt mode, it:
|
||||
// 1. Has side effects and returns the expected value (12).
|
||||
TEST_F(TestForDeathTest, TestExpectDebugDeathM) {
|
||||
int sideeffect = 0;
|
||||
EXPECT_DEBUG_DEATH({ // NOLINT
|
||||
// Tests that the return value is 12 in opt mode.
|
||||
EXPECT_EQ(12, DieInDebugElse12(&sideeffect));
|
||||
// Tests that the side effect occurrs in opt mode.
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
}, "death.*DieInDebugElse12") << "In ExpectDebugDeathM";
|
||||
|
||||
#ifdef NDEBUG
|
||||
// Checks that the assignment occurs in opt mode (sideeffect).
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
#else
|
||||
// Checks that the assignment does not occur in dbg mode (no sideeffect).
|
||||
EXPECT_EQ(0, sideeffect);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Tests that ASSERT_DEBUG_DEATH works as expected
|
||||
// In debug mode:
|
||||
// 1. Asserts on debug death.
|
||||
// 2. Has no side effect.
|
||||
//
|
||||
// In opt mode:
|
||||
// 1. Has side effects and returns the expected value (12).
|
||||
TEST_F(TestForDeathTest, TestAssertDebugDeathM) {
|
||||
int sideeffect = 0;
|
||||
|
||||
ASSERT_DEBUG_DEATH({ // NOLINT
|
||||
// Tests that the return value is 12 in opt mode.
|
||||
EXPECT_EQ(12, DieInDebugElse12(&sideeffect));
|
||||
// Tests that the side effect occurred in opt mode.
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
}, "death.*DieInDebugElse12") << "In AssertDebugDeathM";
|
||||
|
||||
#ifdef NDEBUG
|
||||
// Checks that the assignment occurs in opt mode (sideeffect).
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
#else
|
||||
// Checks that the assignment does not occur in dbg mode (no sideeffect).
|
||||
EXPECT_EQ(0, sideeffect);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
void ExpectDebugDeathHelper(bool* aborted) {
|
||||
*aborted = true;
|
||||
EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail.";
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
|
||||
// the function.
|
||||
TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
|
||||
bool aborted = true;
|
||||
EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), "");
|
||||
EXPECT_FALSE(aborted);
|
||||
}
|
||||
|
||||
void AssertDebugDeathHelper(bool* aborted) {
|
||||
*aborted = true;
|
||||
ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail.";
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on
|
||||
// failure.
|
||||
TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
|
||||
static bool aborted;
|
||||
aborted = false;
|
||||
EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), "");
|
||||
EXPECT_TRUE(aborted);
|
||||
}
|
||||
|
||||
#endif // _NDEBUG
|
||||
|
||||
// Tests the *_EXIT family of macros, using a variety of predicates.
|
||||
TEST_F(TestForDeathTest, ExitMacros) {
|
||||
EXPECT_EXIT(exit(1), testing::ExitedWithCode(1), "");
|
||||
ASSERT_EXIT(exit(42), testing::ExitedWithCode(42), "");
|
||||
EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
|
||||
ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar";
|
||||
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
|
||||
<< "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_EXIT(exit(0), testing::KilledBySignal(SIGSEGV), "")
|
||||
<< "This failure is expected, too.";
|
||||
}, "This failure is expected, too.");
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, InvalidStyle) {
|
||||
testing::GTEST_FLAG(death_test_style) = "rococo";
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_DEATH(exit(0), "") << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
}
|
||||
|
||||
// A DeathTestFactory that returns MockDeathTests.
|
||||
class MockDeathTestFactory : public DeathTestFactory {
|
||||
public:
|
||||
MockDeathTestFactory();
|
||||
virtual bool Create(const char* statement,
|
||||
const ::testing::internal::RE* regex,
|
||||
const char* file, int line, DeathTest** test);
|
||||
|
||||
// Sets the parameters for subsequent calls to Create.
|
||||
void SetParameters(bool create, DeathTest::TestRole role,
|
||||
int status, bool passed);
|
||||
|
||||
// Accessors.
|
||||
int AssumeRoleCalls() const { return assume_role_calls_; }
|
||||
int WaitCalls() const { return wait_calls_; }
|
||||
int PassedCalls() const { return passed_args_.size(); }
|
||||
bool PassedArgument(int n) const { return passed_args_[n]; }
|
||||
int AbortCalls() const { return abort_args_.size(); }
|
||||
DeathTest::AbortReason AbortArgument(int n) const {
|
||||
return abort_args_[n];
|
||||
}
|
||||
bool TestDeleted() const { return test_deleted_; }
|
||||
|
||||
private:
|
||||
friend class MockDeathTest;
|
||||
// If true, Create will return a MockDeathTest; otherwise it returns
|
||||
// NULL.
|
||||
bool create_;
|
||||
// The value a MockDeathTest will return from its AssumeRole method.
|
||||
DeathTest::TestRole role_;
|
||||
// The value a MockDeathTest will return from its Wait method.
|
||||
int status_;
|
||||
// The value a MockDeathTest will return from its Passed method.
|
||||
bool passed_;
|
||||
|
||||
// Number of times AssumeRole was called.
|
||||
int assume_role_calls_;
|
||||
// Number of times Wait was called.
|
||||
int wait_calls_;
|
||||
// The arguments to the calls to Passed since the last call to
|
||||
// SetParameters.
|
||||
std::vector<bool> passed_args_;
|
||||
// The arguments to the calls to Abort since the last call to
|
||||
// SetParameters.
|
||||
std::vector<DeathTest::AbortReason> abort_args_;
|
||||
// True if the last MockDeathTest returned by Create has been
|
||||
// deleted.
|
||||
bool test_deleted_;
|
||||
};
|
||||
|
||||
|
||||
// A DeathTest implementation useful in testing. It returns values set
|
||||
// at its creation from its various inherited DeathTest methods, and
|
||||
// reports calls to those methods to its parent MockDeathTestFactory
|
||||
// object.
|
||||
class MockDeathTest : public DeathTest {
|
||||
public:
|
||||
MockDeathTest(MockDeathTestFactory *parent,
|
||||
TestRole role, int status, bool passed) :
|
||||
parent_(parent), role_(role), status_(status), passed_(passed) {
|
||||
}
|
||||
virtual ~MockDeathTest() {
|
||||
parent_->test_deleted_ = true;
|
||||
}
|
||||
virtual TestRole AssumeRole() {
|
||||
++parent_->assume_role_calls_;
|
||||
return role_;
|
||||
}
|
||||
virtual int Wait() {
|
||||
++parent_->wait_calls_;
|
||||
return status_;
|
||||
}
|
||||
virtual bool Passed(bool exit_status_ok) {
|
||||
parent_->passed_args_.push_back(exit_status_ok);
|
||||
return passed_;
|
||||
}
|
||||
virtual void Abort(AbortReason reason) {
|
||||
parent_->abort_args_.push_back(reason);
|
||||
}
|
||||
private:
|
||||
MockDeathTestFactory* const parent_;
|
||||
const TestRole role_;
|
||||
const int status_;
|
||||
const bool passed_;
|
||||
};
|
||||
|
||||
|
||||
// MockDeathTestFactory constructor.
|
||||
MockDeathTestFactory::MockDeathTestFactory()
|
||||
: create_(true),
|
||||
role_(DeathTest::OVERSEE_TEST),
|
||||
status_(0),
|
||||
passed_(true),
|
||||
assume_role_calls_(0),
|
||||
wait_calls_(0),
|
||||
passed_args_(),
|
||||
abort_args_() {
|
||||
}
|
||||
|
||||
|
||||
// Sets the parameters for subsequent calls to Create.
|
||||
void MockDeathTestFactory::SetParameters(bool create,
|
||||
DeathTest::TestRole role,
|
||||
int status, bool passed) {
|
||||
create_ = create;
|
||||
role_ = role;
|
||||
status_ = status;
|
||||
passed_ = passed;
|
||||
|
||||
assume_role_calls_ = 0;
|
||||
wait_calls_ = 0;
|
||||
passed_args_.clear();
|
||||
abort_args_.clear();
|
||||
}
|
||||
|
||||
|
||||
// Sets test to NULL (if create_ is false) or to the address of a new
|
||||
// MockDeathTest object with parameters taken from the last call
|
||||
// to SetParameters (if create_ is true). Always returns true.
|
||||
bool MockDeathTestFactory::Create(const char* statement,
|
||||
const ::testing::internal::RE* regex,
|
||||
const char* file, int line,
|
||||
DeathTest** test) {
|
||||
test_deleted_ = false;
|
||||
if (create_) {
|
||||
*test = new MockDeathTest(this, role_, status_, passed_);
|
||||
} else {
|
||||
*test = NULL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// A test fixture for testing the logic of the GTEST_DEATH_TEST macro.
|
||||
// It installs a MockDeathTestFactory that is used for the duration
|
||||
// of the test case.
|
||||
class MacroLogicDeathTest : public testing::Test {
|
||||
protected:
|
||||
static testing::internal::ReplaceDeathTestFactory* replacer_;
|
||||
static MockDeathTestFactory* factory_;
|
||||
|
||||
static void SetUpTestCase() {
|
||||
factory_ = new MockDeathTestFactory;
|
||||
replacer_ = new testing::internal::ReplaceDeathTestFactory(
|
||||
testing::UnitTest::GetInstance(), factory_);
|
||||
}
|
||||
|
||||
static void TearDownTestCase() {
|
||||
delete replacer_;
|
||||
replacer_ = NULL;
|
||||
delete factory_;
|
||||
factory_ = NULL;
|
||||
}
|
||||
|
||||
// Runs a death test that breaks the rules by returning. Such a death
|
||||
// test cannot be run directly from a test routine that uses a
|
||||
// MockDeathTest, or the remainder of the routine will not be executed.
|
||||
static void RunReturningDeathTest(bool* flag) {
|
||||
ASSERT_DEATH({ // NOLINT
|
||||
*flag = true;
|
||||
return;
|
||||
}, "");
|
||||
}
|
||||
};
|
||||
|
||||
testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_
|
||||
= NULL;
|
||||
MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;
|
||||
|
||||
|
||||
// Test that nothing happens when the factory doesn't return a DeathTest:
|
||||
TEST_F(MacroLogicDeathTest, NothingHappens) {
|
||||
bool flag = false;
|
||||
factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);
|
||||
EXPECT_DEATH(flag = true, "");
|
||||
EXPECT_FALSE(flag);
|
||||
EXPECT_EQ(0, factory_->AssumeRoleCalls());
|
||||
EXPECT_EQ(0, factory_->WaitCalls());
|
||||
EXPECT_EQ(0, factory_->PassedCalls());
|
||||
EXPECT_EQ(0, factory_->AbortCalls());
|
||||
EXPECT_FALSE(factory_->TestDeleted());
|
||||
}
|
||||
|
||||
// Test that the parent process doesn't run the death test code,
|
||||
// and that the Passed method returns false when the (simulated)
|
||||
// child process exits with status 0:
|
||||
TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {
|
||||
bool flag = false;
|
||||
factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);
|
||||
EXPECT_DEATH(flag = true, "");
|
||||
EXPECT_FALSE(flag);
|
||||
EXPECT_EQ(1, factory_->AssumeRoleCalls());
|
||||
EXPECT_EQ(1, factory_->WaitCalls());
|
||||
ASSERT_EQ(1, factory_->PassedCalls());
|
||||
EXPECT_FALSE(factory_->PassedArgument(0));
|
||||
EXPECT_EQ(0, factory_->AbortCalls());
|
||||
EXPECT_TRUE(factory_->TestDeleted());
|
||||
}
|
||||
|
||||
// Tests that the Passed method was given the argument "true" when
|
||||
// the (simulated) child process exits with status 1:
|
||||
TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {
|
||||
bool flag = false;
|
||||
factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);
|
||||
EXPECT_DEATH(flag = true, "");
|
||||
EXPECT_FALSE(flag);
|
||||
EXPECT_EQ(1, factory_->AssumeRoleCalls());
|
||||
EXPECT_EQ(1, factory_->WaitCalls());
|
||||
ASSERT_EQ(1, factory_->PassedCalls());
|
||||
EXPECT_TRUE(factory_->PassedArgument(0));
|
||||
EXPECT_EQ(0, factory_->AbortCalls());
|
||||
EXPECT_TRUE(factory_->TestDeleted());
|
||||
}
|
||||
|
||||
// Tests that the (simulated) child process executes the death test
|
||||
// code, and is aborted with the correct AbortReason if it
|
||||
// executes a return statement.
|
||||
TEST_F(MacroLogicDeathTest, ChildPerformsReturn) {
|
||||
bool flag = false;
|
||||
factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
|
||||
RunReturningDeathTest(&flag);
|
||||
EXPECT_TRUE(flag);
|
||||
EXPECT_EQ(1, factory_->AssumeRoleCalls());
|
||||
EXPECT_EQ(0, factory_->WaitCalls());
|
||||
EXPECT_EQ(0, factory_->PassedCalls());
|
||||
EXPECT_EQ(1, factory_->AbortCalls());
|
||||
EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
|
||||
factory_->AbortArgument(0));
|
||||
EXPECT_TRUE(factory_->TestDeleted());
|
||||
}
|
||||
|
||||
// Tests that the (simulated) child process is aborted with the
|
||||
// correct AbortReason if it does not die.
|
||||
TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
|
||||
bool flag = false;
|
||||
factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
|
||||
EXPECT_DEATH(flag = true, "");
|
||||
EXPECT_TRUE(flag);
|
||||
EXPECT_EQ(1, factory_->AssumeRoleCalls());
|
||||
EXPECT_EQ(0, factory_->WaitCalls());
|
||||
EXPECT_EQ(0, factory_->PassedCalls());
|
||||
// This time there are two calls to Abort: one since the test didn't
|
||||
// die, and another from the ReturnSentinel when it's destroyed. The
|
||||
// sentinel normally isn't destroyed if a test doesn't die, since
|
||||
// exit(2) is called in that case by ForkingDeathTest, but not by
|
||||
// our MockDeathTest.
|
||||
ASSERT_EQ(2, factory_->AbortCalls());
|
||||
EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,
|
||||
factory_->AbortArgument(0));
|
||||
EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
|
||||
factory_->AbortArgument(1));
|
||||
EXPECT_TRUE(factory_->TestDeleted());
|
||||
}
|
||||
|
||||
// Returns the number of successful parts in the current test.
|
||||
static size_t GetSuccessfulTestPartCount() {
|
||||
return testing::UnitTest::GetInstance()->impl()->current_test_result()->
|
||||
successful_part_count();
|
||||
}
|
||||
|
||||
// Tests that a successful death test does not register a successful
|
||||
// test part.
|
||||
TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
EXPECT_EQ(0u, GetSuccessfulTestPartCount());
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsDeathTest, DeathTest) {
|
||||
EXPECT_DEATH(exit(1), "") << "unexpected failure";
|
||||
ASSERT_DEATH(exit(1), "") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_DEATH(exit(0), "") << "expected failure";
|
||||
}, "expected failure");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_DEATH(exit(0), "") << "expected failure";
|
||||
}, "expected failure");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Tests that a test case whose name ends with "DeathTest" works fine
|
||||
// on Windows.
|
||||
TEST(NotADeathTest, Test) {
|
||||
SUCCEED();
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: keith.ray@gmail.com (Keith Ray)
|
||||
//
|
||||
// Google Test filepath utilities
|
||||
//
|
||||
// This file tests classes and functions used internally by
|
||||
// Google Test. They are subject to change without notice.
|
||||
//
|
||||
// This file is #included from gtest_unittest.cc, to avoid changing
|
||||
// build or make-files for some existing Google Test clients. Do not
|
||||
// #include this file anywhere else!
|
||||
|
||||
#include <gtest/internal/gtest-filepath.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <direct.h>
|
||||
#define PATH_SEP "\\"
|
||||
#else
|
||||
#define PATH_SEP "/"
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
namespace {
|
||||
|
||||
// FilePath's functions used by UnitTestOptions::GetOutputFile.
|
||||
|
||||
// RemoveDirectoryName "" -> ""
|
||||
TEST(RemoveDirectoryNameTest, WhenEmptyName) {
|
||||
EXPECT_STREQ("", FilePath("").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, ButNoDirectory) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath("afile").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath(PATH_SEP "afile").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/" -> ""
|
||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
|
||||
EXPECT_STREQ("",
|
||||
FilePath("adir" PATH_SEP).RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath("adir" PATH_SEP "afile").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/subdir/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath("adir" PATH_SEP "subdir" PATH_SEP "afile")
|
||||
.RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
|
||||
// RemoveFileName "" -> "./"
|
||||
TEST(RemoveFileNameTest, EmptyName) {
|
||||
EXPECT_STREQ("." PATH_SEP,
|
||||
FilePath("").RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
// RemoveFileName "adir/" -> "adir/"
|
||||
TEST(RemoveFileNameTest, ButNoFile) {
|
||||
EXPECT_STREQ("adir" PATH_SEP,
|
||||
FilePath("adir" PATH_SEP).RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
// RemoveFileName "adir/afile" -> "adir/"
|
||||
TEST(RemoveFileNameTest, GivesDirName) {
|
||||
EXPECT_STREQ("adir" PATH_SEP,
|
||||
FilePath("adir" PATH_SEP "afile")
|
||||
.RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
|
||||
TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
|
||||
EXPECT_STREQ("adir" PATH_SEP "subdir" PATH_SEP,
|
||||
FilePath("adir" PATH_SEP "subdir" PATH_SEP "afile")
|
||||
.RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
// RemoveFileName "/afile" -> "/"
|
||||
TEST(RemoveFileNameTest, GivesRootDir) {
|
||||
EXPECT_STREQ(PATH_SEP,
|
||||
FilePath(PATH_SEP "afile").RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
|
||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
|
||||
0, "xml");
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
|
||||
12, "xml");
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar_12.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" PATH_SEP),
|
||||
FilePath("bar"), 0, "xml");
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" PATH_SEP),
|
||||
FilePath("bar"), 12, "xml");
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar_12.xml", actual.c_str());
|
||||
}
|
||||
|
||||
|
||||
// RemoveTrailingPathSeparator "" -> ""
|
||||
TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
|
||||
EXPECT_STREQ("",
|
||||
FilePath("").RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "foo" -> "foo"
|
||||
TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
|
||||
EXPECT_STREQ("foo",
|
||||
FilePath("foo").RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "foo/" -> "foo"
|
||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
|
||||
EXPECT_STREQ("foo",
|
||||
FilePath("foo" PATH_SEP).RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
|
||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar",
|
||||
FilePath("foo" PATH_SEP "bar" PATH_SEP).RemoveTrailingPathSeparator()
|
||||
.c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
|
||||
TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar",
|
||||
FilePath("foo" PATH_SEP "bar").RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
|
||||
class DirectoryCreationTest : public Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
testdata_path_.Set(FilePath(String::Format("%s%s%s",
|
||||
TempDir().c_str(), GetCurrentExecutableName().c_str(),
|
||||
"_directory_creation" PATH_SEP "test" PATH_SEP)));
|
||||
testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
|
||||
|
||||
unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
|
||||
0, "txt"));
|
||||
unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
|
||||
1, "txt"));
|
||||
|
||||
remove(testdata_file_.c_str());
|
||||
remove(unique_file0_.c_str());
|
||||
remove(unique_file1_.c_str());
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
_rmdir(testdata_path_.c_str());
|
||||
#else
|
||||
rmdir(testdata_path_.c_str());
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
remove(testdata_file_.c_str());
|
||||
remove(unique_file0_.c_str());
|
||||
remove(unique_file1_.c_str());
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
_rmdir(testdata_path_.c_str());
|
||||
#else
|
||||
rmdir(testdata_path_.c_str());
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
String TempDir() const {
|
||||
#ifdef _WIN32_WCE
|
||||
return String("\\temp\\");
|
||||
|
||||
#elif defined(GTEST_OS_WINDOWS)
|
||||
// MSVC 8 deprecates getenv(), so we want to suppress warning 4996
|
||||
// (deprecated function) there.
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
const char* temp_dir = getenv("TEMP");
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
|
||||
if (temp_dir == NULL || temp_dir[0] == '\0')
|
||||
return String("\\temp\\");
|
||||
else if (String(temp_dir).EndsWith("\\"))
|
||||
return String(temp_dir);
|
||||
else
|
||||
return String::Format("%s\\", temp_dir);
|
||||
#else
|
||||
return String("/tmp/");
|
||||
#endif
|
||||
}
|
||||
|
||||
void CreateTextFile(const char* filename) {
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// MSVC 8 deprecates fopen(), so we want to suppress warning 4996
|
||||
// (deprecated function) there.#pragma warning(push)
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4996) // Temporarily disables warning 4996.
|
||||
FILE* f = fopen(filename, "w");
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#else // We are on Linux or Mac OS.
|
||||
FILE* f = fopen(filename, "w");
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
fprintf(f, "text\n");
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
// Strings representing a directory and a file, with identical paths
|
||||
// except for the trailing separator character that distinquishes
|
||||
// a directory named 'test' from a file named 'test'. Example names:
|
||||
FilePath testdata_path_; // "/tmp/directory_creation/test/"
|
||||
FilePath testdata_file_; // "/tmp/directory_creation/test"
|
||||
FilePath unique_file0_; // "/tmp/directory_creation/test/unique.txt"
|
||||
FilePath unique_file1_; // "/tmp/directory_creation/test/unique_1.txt"
|
||||
};
|
||||
|
||||
TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
|
||||
EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
|
||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
||||
EXPECT_TRUE(testdata_path_.DirectoryExists());
|
||||
}
|
||||
|
||||
TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
|
||||
EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();
|
||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
||||
// Call 'create' again... should still succeed.
|
||||
EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
|
||||
}
|
||||
|
||||
TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
|
||||
FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
|
||||
FilePath("unique"), "txt"));
|
||||
EXPECT_STREQ(unique_file0_.c_str(), file_path.c_str());
|
||||
EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file not there
|
||||
|
||||
testdata_path_.CreateDirectoriesRecursively();
|
||||
EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file still not there
|
||||
CreateTextFile(file_path.c_str());
|
||||
EXPECT_TRUE(file_path.FileOrDirectoryExists());
|
||||
|
||||
FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
|
||||
FilePath("unique"), "txt"));
|
||||
EXPECT_STREQ(unique_file1_.c_str(), file_path2.c_str());
|
||||
EXPECT_FALSE(file_path2.FileOrDirectoryExists()); // file not there
|
||||
CreateTextFile(file_path2.c_str());
|
||||
EXPECT_TRUE(file_path2.FileOrDirectoryExists());
|
||||
}
|
||||
|
||||
TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
|
||||
// force a failure by putting a file where we will try to create a directory.
|
||||
CreateTextFile(testdata_file_.c_str());
|
||||
EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
|
||||
EXPECT_FALSE(testdata_file_.DirectoryExists());
|
||||
EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
|
||||
}
|
||||
|
||||
TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
|
||||
const FilePath test_detail_xml("test_detail.xml");
|
||||
EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, DefaultConstructor) {
|
||||
FilePath fp;
|
||||
EXPECT_STREQ("", fp.c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, CharAndCopyConstructors) {
|
||||
const FilePath fp("spicy");
|
||||
EXPECT_STREQ("spicy", fp.c_str());
|
||||
|
||||
const FilePath fp_copy(fp);
|
||||
EXPECT_STREQ("spicy", fp_copy.c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, StringConstructor) {
|
||||
const FilePath fp(String("cider"));
|
||||
EXPECT_STREQ("cider", fp.c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, Set) {
|
||||
const FilePath apple("apple");
|
||||
FilePath mac("mac");
|
||||
mac.Set(apple); // Implement Set() since overloading operator= is forbidden.
|
||||
EXPECT_STREQ("apple", mac.c_str());
|
||||
EXPECT_STREQ("apple", apple.c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, ToString) {
|
||||
const FilePath file("drink");
|
||||
String str(file.ToString());
|
||||
EXPECT_STREQ("drink", str.c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, RemoveExtension) {
|
||||
EXPECT_STREQ("app", FilePath("app.exe").RemoveExtension("exe").c_str());
|
||||
EXPECT_STREQ("APP", FilePath("APP.EXE").RemoveExtension("exe").c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
|
||||
EXPECT_STREQ("app", FilePath("app").RemoveExtension("exe").c_str());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, IsDirectory) {
|
||||
EXPECT_FALSE(FilePath("cola").IsDirectory());
|
||||
EXPECT_TRUE(FilePath("koala" PATH_SEP).IsDirectory());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#undef PATH_SEP
|
||||
@@ -0,0 +1,157 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Tests for the Message class.
|
||||
|
||||
#include <gtest/gtest-message.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace {
|
||||
|
||||
using ::testing::Message;
|
||||
using ::testing::internal::StrStream;
|
||||
|
||||
// A helper function that turns a Message into a C string.
|
||||
const char* ToCString(const Message& msg) {
|
||||
static testing::internal::String result;
|
||||
result = msg.GetString();
|
||||
return result.c_str();
|
||||
}
|
||||
|
||||
// Tests the testing::Message class
|
||||
|
||||
// Tests the default constructor.
|
||||
TEST(MessageTest, DefaultConstructor) {
|
||||
const Message msg;
|
||||
EXPECT_STREQ("", ToCString(msg));
|
||||
}
|
||||
|
||||
// Tests the copy constructor.
|
||||
TEST(MessageTest, CopyConstructor) {
|
||||
const Message msg1("Hello");
|
||||
const Message msg2(msg1);
|
||||
EXPECT_STREQ("Hello", ToCString(msg2));
|
||||
}
|
||||
|
||||
// Tests constructing a Message from a C-string.
|
||||
TEST(MessageTest, ConstructsFromCString) {
|
||||
Message msg("Hello");
|
||||
EXPECT_STREQ("Hello", ToCString(msg));
|
||||
}
|
||||
|
||||
// Tests streaming a non-char pointer.
|
||||
TEST(MessageTest, StreamsPointer) {
|
||||
int n = 0;
|
||||
int* p = &n;
|
||||
EXPECT_STRNE("(null)", ToCString(Message() << p));
|
||||
}
|
||||
|
||||
// Tests streaming a NULL non-char pointer.
|
||||
TEST(MessageTest, StreamsNullPointer) {
|
||||
int* p = NULL;
|
||||
EXPECT_STREQ("(null)", ToCString(Message() << p));
|
||||
}
|
||||
|
||||
// Tests streaming a C string.
|
||||
TEST(MessageTest, StreamsCString) {
|
||||
EXPECT_STREQ("Foo", ToCString(Message() << "Foo"));
|
||||
}
|
||||
|
||||
// Tests streaming a NULL C string.
|
||||
TEST(MessageTest, StreamsNullCString) {
|
||||
char* p = NULL;
|
||||
EXPECT_STREQ("(null)", ToCString(Message() << p));
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
|
||||
// Tests streaming std::string.
|
||||
//
|
||||
// As std::string has problem in MSVC when exception is disabled, we only
|
||||
// test this where std::string can be used.
|
||||
TEST(MessageTest, StreamsString) {
|
||||
const ::std::string str("Hello");
|
||||
EXPECT_STREQ("Hello", ToCString(Message() << str));
|
||||
}
|
||||
|
||||
// Tests that we can output strings containing embedded NULs.
|
||||
TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
|
||||
const char char_array_with_nul[] =
|
||||
"Here's a NUL\0 and some more string";
|
||||
const ::std::string string_with_nul(char_array_with_nul,
|
||||
sizeof(char_array_with_nul) - 1);
|
||||
EXPECT_STREQ("Here's a NUL\\0 and some more string",
|
||||
ToCString(Message() << string_with_nul));
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// Tests streaming a NUL char.
|
||||
TEST(MessageTest, StreamsNULChar) {
|
||||
EXPECT_STREQ("\\0", ToCString(Message() << '\0'));
|
||||
}
|
||||
|
||||
// Tests streaming int.
|
||||
TEST(MessageTest, StreamsInt) {
|
||||
EXPECT_STREQ("123", ToCString(Message() << 123));
|
||||
}
|
||||
|
||||
// Tests that basic IO manipulators (endl, ends, and flush) can be
|
||||
// streamed to Message.
|
||||
TEST(MessageTest, StreamsBasicIoManip) {
|
||||
EXPECT_STREQ("Line 1.\nA NUL char \\0 in line 2.",
|
||||
ToCString(Message() << "Line 1." << std::endl
|
||||
<< "A NUL char " << std::ends << std::flush
|
||||
<< " in line 2."));
|
||||
}
|
||||
|
||||
// Tests Message::GetString()
|
||||
TEST(MessageTest, GetString) {
|
||||
Message msg;
|
||||
msg << 1 << " lamb";
|
||||
EXPECT_STREQ("1 lamb", msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming a Message object to an ostream.
|
||||
TEST(MessageTest, StreamsToOStream) {
|
||||
Message msg("Hello");
|
||||
StrStream ss;
|
||||
ss << msg;
|
||||
EXPECT_STREQ("Hello", testing::internal::StrStreamToString(&ss).c_str());
|
||||
}
|
||||
|
||||
// Tests that a Message object doesn't take up too much stack space.
|
||||
TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
|
||||
EXPECT_LE(sizeof(Message), 16U);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -0,0 +1,122 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: keith.ray@gmail.com (Keith Ray)
|
||||
//
|
||||
// Google Test UnitTestOptions tests
|
||||
//
|
||||
// This file tests classes and functions used internally by
|
||||
// Google Test. They are subject to change without notice.
|
||||
//
|
||||
// This file is #included from gtest.cc, to avoid changing build or
|
||||
// make-files on Windows and other platforms. Do not #include this file
|
||||
// anywhere else!
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
|
||||
namespace internal {
|
||||
namespace {
|
||||
|
||||
// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFormatDefault) {
|
||||
GTEST_FLAG(output) = "";
|
||||
EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFormat) {
|
||||
GTEST_FLAG(output) = "xml:filename";
|
||||
EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileDefault) {
|
||||
GTEST_FLAG(output) = "";
|
||||
EXPECT_STREQ("test_detail.xml",
|
||||
UnitTestOptions::GetOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileSingleFile) {
|
||||
GTEST_FLAG(output) = "xml:filename.abc";
|
||||
EXPECT_STREQ("filename.abc",
|
||||
UnitTestOptions::GetOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
GTEST_FLAG(output) = "xml:pathname\\";
|
||||
const String& output_file = UnitTestOptions::GetOutputFile();
|
||||
EXPECT_TRUE(_strcmpi(output_file.c_str(),
|
||||
"pathname\\gtest-options_test.xml") == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
"pathname\\gtest-options-ex_test.xml") == 0)
|
||||
<< " output_file = " << output_file;
|
||||
#else
|
||||
GTEST_FLAG(output) = "xml:pathname/";
|
||||
const String& output_file = UnitTestOptions::GetOutputFile();
|
||||
// TODO(wan@google.com): libtool causes the test binary file to be
|
||||
// named lt-gtest-options_test. Therefore the output file may be
|
||||
// named .../lt-gtest-options_test.xml. We should remove this
|
||||
// hard-coded logic when Chandler Carruth's libtool replacement is
|
||||
// ready.
|
||||
EXPECT_TRUE(output_file == "pathname/gtest-options_test.xml" ||
|
||||
output_file == "pathname/lt-gtest-options_test.xml")
|
||||
<< " output_file = " << output_file;
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
|
||||
const FilePath executable = GetCurrentExecutableName();
|
||||
const char* const exe_str = executable.c_str();
|
||||
#if defined(_WIN32_WCE) || defined(GTEST_OS_WINDOWS)
|
||||
ASSERT_TRUE(_strcmpi("gtest-options_test", exe_str) == 0 ||
|
||||
_strcmpi("gtest-options-ex_test", exe_str) == 0)
|
||||
<< "GetCurrentExecutableName() returns " << exe_str;
|
||||
#else
|
||||
// TODO(wan@google.com): remove the hard-coded "lt-" prefix when
|
||||
// Chandler Carruth's libtool replacement is ready.
|
||||
EXPECT_TRUE(String(exe_str) == "gtest-options_test" ||
|
||||
String(exe_str) == "lt-gtest-options_test")
|
||||
<< "GetCurrentExecutableName() returns " << exe_str;
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
Executable
+178
@@ -0,0 +1,178 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test for Google Test's break-on-failure mode.
|
||||
|
||||
A user can ask Google Test to seg-fault when an assertion fails, using
|
||||
either the GTEST_BREAK_ON_FAILURE environment variable or the
|
||||
--gtest_break_on_failure flag. This script tests such functionality
|
||||
by invoking gtest_break_on_failure_unittest_ (a program written with
|
||||
Google Test) with different environments and command line flags.
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
# Constants.
|
||||
|
||||
# The environment variable for enabling/disabling the break-on-failure mode.
|
||||
BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
|
||||
|
||||
# The command line flag for enabling/disabling the break-on-failure mode.
|
||||
BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
|
||||
|
||||
# Path to the gtest_break_on_failure_unittest_ program.
|
||||
EXE_PATH = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_break_on_failure_unittest_');
|
||||
|
||||
|
||||
# Utilities.
|
||||
|
||||
def SetEnvVar(env_var, value):
|
||||
"""Sets an environment variable to a given value; unsets it when the
|
||||
given value is None.
|
||||
"""
|
||||
|
||||
if value is not None:
|
||||
os.environ[env_var] = value
|
||||
elif env_var in os.environ:
|
||||
del os.environ[env_var]
|
||||
|
||||
|
||||
def Run(command):
|
||||
"""Runs a command; returns 1 if it has a segmentation fault, or 0 otherwise.
|
||||
"""
|
||||
|
||||
return os.system(command) == signal.SIGSEGV
|
||||
|
||||
|
||||
# The unit test.
|
||||
|
||||
class GTestBreakOnFailureUnitTest(unittest.TestCase):
|
||||
"""Tests using the GTEST_BREAK_ON_FAILURE environment variable or
|
||||
the --gtest_break_on_failure flag to turn assertion failures into
|
||||
segmentation faults.
|
||||
"""
|
||||
|
||||
def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
|
||||
"""Runs gtest_break_on_failure_unittest_ and verifies that it does
|
||||
(or does not) have a seg-fault.
|
||||
|
||||
Args:
|
||||
env_var_value: value of the GTEST_BREAK_ON_FAILURE environment
|
||||
variable; None if the variable should be unset.
|
||||
flag_value: value of the --gtest_break_on_failure flag;
|
||||
None if the flag should not be present.
|
||||
expect_seg_fault: 1 if the program is expected to generate a seg-fault;
|
||||
0 otherwise.
|
||||
"""
|
||||
|
||||
SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
|
||||
|
||||
if env_var_value is None:
|
||||
env_var_value_msg = ' is not set'
|
||||
else:
|
||||
env_var_value_msg = '=' + env_var_value
|
||||
|
||||
if flag_value is None:
|
||||
flag = ''
|
||||
elif flag_value == '0':
|
||||
flag = ' --%s=0' % BREAK_ON_FAILURE_FLAG
|
||||
else:
|
||||
flag = ' --%s' % BREAK_ON_FAILURE_FLAG
|
||||
|
||||
command = EXE_PATH + flag
|
||||
|
||||
if expect_seg_fault:
|
||||
should_or_not = 'should'
|
||||
else:
|
||||
should_or_not = 'should not'
|
||||
|
||||
has_seg_fault = Run(command)
|
||||
|
||||
SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
|
||||
|
||||
msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
|
||||
(BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, command, should_or_not))
|
||||
self.assert_(has_seg_fault == expect_seg_fault, msg)
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of the default mode."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value=None,
|
||||
expect_seg_fault=0)
|
||||
|
||||
def testEnvVar(self):
|
||||
"""Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value=None,
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value=None,
|
||||
expect_seg_fault=1)
|
||||
|
||||
def testFlag(self):
|
||||
"""Tests using the --gtest_break_on_failure flag."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
|
||||
def testFlagOverridesEnvVar(self):
|
||||
"""Tests that the flag overrides the environment variable."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,59 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Unit test for Google Test's break-on-failure mode.
|
||||
//
|
||||
// A user can ask Google Test to seg-fault when an assertion fails, using
|
||||
// either the GTEST_BREAK_ON_FAILURE environment variable or the
|
||||
// --gtest_break_on_failure flag. This file is used for testing such
|
||||
// functionality.
|
||||
//
|
||||
// This program will be invoked from a Python unit test. It is
|
||||
// expected to fail. Don't run it directly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
// A test that's expected to fail.
|
||||
TEST(Foo, Bar) {
|
||||
EXPECT_EQ(2, 3);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Executable
+123
@@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2008, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Verifies that Google Test correctly determines whether to use colors."""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
COLOR_ENV_VAR = 'GTEST_COLOR'
|
||||
COLOR_FLAG = 'gtest_color'
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_color_test_')
|
||||
|
||||
|
||||
def SetEnvVar(env_var, value):
|
||||
"""Sets the env variable to 'value'; unsets it when 'value' is None."""
|
||||
|
||||
if value is not None:
|
||||
os.environ[env_var] = value
|
||||
elif env_var in os.environ:
|
||||
del os.environ[env_var]
|
||||
|
||||
|
||||
def UsesColor(term, color_env_var, color_flag):
|
||||
"""Runs gtest_color_test_ and returns its exit code."""
|
||||
|
||||
SetEnvVar('TERM', term)
|
||||
SetEnvVar(COLOR_ENV_VAR, color_env_var)
|
||||
cmd = COMMAND
|
||||
if color_flag is not None:
|
||||
cmd += ' --%s=%s' % (COLOR_FLAG, color_flag)
|
||||
return os.system(cmd)
|
||||
|
||||
|
||||
class GTestColorTest(unittest.TestCase):
|
||||
def testNoEnvVarNoFlag(self):
|
||||
"""Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
|
||||
|
||||
self.assert_(not UsesColor('dumb', None, None))
|
||||
self.assert_(not UsesColor('emacs', None, None))
|
||||
self.assert_(not UsesColor('xterm-mono', None, None))
|
||||
self.assert_(not UsesColor('unknown', None, None))
|
||||
self.assert_(not UsesColor(None, None, None))
|
||||
self.assert_(UsesColor('cygwin', None, None))
|
||||
self.assert_(UsesColor('xterm', None, None))
|
||||
self.assert_(UsesColor('xterm-color', None, None))
|
||||
|
||||
def testFlagOnly(self):
|
||||
"""Tests the case when there's --gtest_color but not GTEST_COLOR."""
|
||||
|
||||
self.assert_(not UsesColor('dumb', None, 'no'))
|
||||
self.assert_(not UsesColor('xterm-color', None, 'no'))
|
||||
self.assert_(not UsesColor('emacs', None, 'auto'))
|
||||
self.assert_(UsesColor('xterm', None, 'auto'))
|
||||
self.assert_(UsesColor('dumb', None, 'yes'))
|
||||
self.assert_(UsesColor('xterm', None, 'yes'))
|
||||
|
||||
def testEnvVarOnly(self):
|
||||
"""Tests the case when there's GTEST_COLOR but not --gtest_color."""
|
||||
|
||||
self.assert_(not UsesColor('dumb', 'no', None))
|
||||
self.assert_(not UsesColor('xterm-color', 'no', None))
|
||||
self.assert_(not UsesColor('dumb', 'auto', None))
|
||||
self.assert_(UsesColor('xterm-color', 'auto', None))
|
||||
self.assert_(UsesColor('dumb', 'yes', None))
|
||||
self.assert_(UsesColor('xterm-color', 'yes', None))
|
||||
|
||||
def testEnvVarAndFlag(self):
|
||||
"""Tests the case when there are both GTEST_COLOR and --gtest_color."""
|
||||
|
||||
self.assert_(not UsesColor('xterm-color', 'no', 'no'))
|
||||
self.assert_(UsesColor('dumb', 'no', 'yes'))
|
||||
self.assert_(UsesColor('xterm-color', 'no', 'auto'))
|
||||
|
||||
def testAliasesOfYesAndNo(self):
|
||||
"""Tests using aliases in specifying --gtest_color."""
|
||||
|
||||
self.assert_(UsesColor('dumb', None, 'true'))
|
||||
self.assert_(UsesColor('dumb', None, 'YES'))
|
||||
self.assert_(UsesColor('dumb', None, 'T'))
|
||||
self.assert_(UsesColor('dumb', None, '1'))
|
||||
|
||||
self.assert_(not UsesColor('xterm', None, 'f'))
|
||||
self.assert_(not UsesColor('xterm', None, 'false'))
|
||||
self.assert_(not UsesColor('xterm', None, '0'))
|
||||
self.assert_(not UsesColor('xterm', None, 'unknown'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// A helper program for testing how Google Test determines whether to use
|
||||
// colors in the output. It prints "YES" and returns 1 if Google Test
|
||||
// decides to use colors, and prints "NO" and returns 0 otherwise.
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
bool ShouldUseColor(bool stdout_is_tty);
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
using testing::internal::ShouldUseColor;
|
||||
|
||||
// The purpose of this is to ensure that the UnitTest singleton is
|
||||
// created before main() is entered, and thus that ShouldUseColor()
|
||||
// works the same way as in a real Google-Test-based test. We don't actual
|
||||
// run the TEST itself.
|
||||
TEST(GTestColorTest, Dummy) {
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
if (ShouldUseColor(true)) {
|
||||
// Google Test decides to use colors in the output (assuming it
|
||||
// goes to a TTY).
|
||||
printf("YES\n");
|
||||
return 1;
|
||||
} else {
|
||||
// Google Test decides not to use colors in the output.
|
||||
printf("NO\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Executable
+134
@@ -0,0 +1,134 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2008, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Verifies that Google Test correctly parses environment variables."""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
IS_WINDOWS = os.name == 'nt'
|
||||
IS_LINUX = os.name == 'posix'
|
||||
|
||||
if IS_WINDOWS:
|
||||
BUILD_DIRS = [
|
||||
'build.dbg\\',
|
||||
'build.opt\\',
|
||||
'build.dbg8\\',
|
||||
'build.opt8\\',
|
||||
]
|
||||
COMMAND = 'gtest_env_var_test_.exe'
|
||||
|
||||
if IS_LINUX:
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_env_var_test_')
|
||||
|
||||
|
||||
def AssertEq(expected, actual):
|
||||
if expected != actual:
|
||||
print 'Expected: %s' % (expected,)
|
||||
print ' Actual: %s' % (actual,)
|
||||
raise AssertionError
|
||||
|
||||
|
||||
def SetEnvVar(env_var, value):
|
||||
"""Sets the env variable to 'value'; unsets it when 'value' is None."""
|
||||
|
||||
if value is not None:
|
||||
os.environ[env_var] = value
|
||||
elif env_var in os.environ:
|
||||
del os.environ[env_var]
|
||||
|
||||
|
||||
def GetFlag(command, flag):
|
||||
"""Runs gtest_env_var_test_ and returns its output."""
|
||||
|
||||
cmd = command
|
||||
if flag is not None:
|
||||
cmd += ' %s' % (flag,)
|
||||
stdin, stdout = os.popen2(cmd, 'b')
|
||||
stdin.close()
|
||||
line = stdout.readline()
|
||||
stdout.close()
|
||||
return line
|
||||
|
||||
|
||||
def TestFlag(command, flag, test_val, default_val):
|
||||
"""Verifies that the given flag is affected by the corresponding env var."""
|
||||
|
||||
env_var = 'GTEST_' + flag.upper()
|
||||
SetEnvVar(env_var, test_val)
|
||||
AssertEq(test_val, GetFlag(command, flag))
|
||||
SetEnvVar(env_var, None)
|
||||
AssertEq(default_val, GetFlag(command, flag))
|
||||
|
||||
|
||||
def TestEnvVarAffectsFlag(command):
|
||||
"""An environment variable should affect the corresponding flag."""
|
||||
|
||||
TestFlag(command, 'break_on_failure', '1', '0')
|
||||
TestFlag(command, 'color', 'yes', 'auto')
|
||||
TestFlag(command, 'filter', 'FooTest.Bar', '*')
|
||||
TestFlag(command, 'output', 'tmp/foo.xml', '')
|
||||
TestFlag(command, 'repeat', '999', '1')
|
||||
|
||||
if IS_WINDOWS:
|
||||
TestFlag(command, 'catch_exceptions', '1', '0')
|
||||
if IS_LINUX:
|
||||
TestFlag(command, 'stack_trace_depth', '0', '100')
|
||||
TestFlag(command, 'death_test_style', 'thread-safe', 'fast')
|
||||
|
||||
|
||||
if IS_WINDOWS:
|
||||
|
||||
def main():
|
||||
for build_dir in BUILD_DIRS:
|
||||
command = build_dir + COMMAND
|
||||
print 'Testing with %s . . .' % (command,)
|
||||
TestEnvVarAffectsFlag(command)
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
if IS_LINUX:
|
||||
|
||||
class GTestEnvVarTest(unittest.TestCase):
|
||||
def testEnvVarAffectsFlag(self):
|
||||
TestEnvVarAffectsFlag(COMMAND)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,111 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// A helper program for testing that Google Test parses the environment
|
||||
// variables correctly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
using ::std::cout;
|
||||
|
||||
namespace testing {
|
||||
|
||||
// The purpose of this is to make the test more realistic by ensuring
|
||||
// that the UnitTest singleton is created before main() is entered.
|
||||
// We don't actual run the TEST itself.
|
||||
TEST(GTestEnvVarTest, Dummy) {
|
||||
}
|
||||
|
||||
void PrintFlag(const char* flag) {
|
||||
if (strcmp(flag, "break_on_failure") == 0) {
|
||||
cout << GTEST_FLAG(break_on_failure);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "catch_exceptions") == 0) {
|
||||
cout << GTEST_FLAG(catch_exceptions);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "color") == 0) {
|
||||
cout << GTEST_FLAG(color);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "death_test_style") == 0) {
|
||||
cout << GTEST_FLAG(death_test_style);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "filter") == 0) {
|
||||
cout << GTEST_FLAG(filter);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "output") == 0) {
|
||||
cout << GTEST_FLAG(output);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "repeat") == 0) {
|
||||
cout << GTEST_FLAG(repeat);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "stack_trace_depth") == 0) {
|
||||
cout << GTEST_FLAG(stack_trace_depth);
|
||||
return;
|
||||
}
|
||||
|
||||
cout << "Invalid flag name " << flag
|
||||
<< ". Valid names are break_on_failure, color, filter, etc.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
if (argc != 2) {
|
||||
cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
testing::PrintFlag(argv[1]);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
// Copyright 2007, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Tests using global test environments.
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace testing {
|
||||
GTEST_DECLARE_string(filter);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
enum FailureType {
|
||||
NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE
|
||||
};
|
||||
|
||||
// For testing using global test environments.
|
||||
class MyEnvironment : public testing::Environment {
|
||||
public:
|
||||
MyEnvironment() { Reset(); }
|
||||
|
||||
// Depending on the value of failure_in_set_up_, SetUp() will
|
||||
// generate a non-fatal failure, generate a fatal failure, or
|
||||
// succeed.
|
||||
virtual void SetUp() {
|
||||
set_up_was_run_ = true;
|
||||
|
||||
switch (failure_in_set_up_) {
|
||||
case NON_FATAL_FAILURE:
|
||||
ADD_FAILURE() << "Expected non-fatal failure in global set-up.";
|
||||
break;
|
||||
case FATAL_FAILURE:
|
||||
FAIL() << "Expected fatal failure in global set-up.";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates a non-fatal failure.
|
||||
virtual void TearDown() {
|
||||
tear_down_was_run_ = true;
|
||||
ADD_FAILURE() << "Expected non-fatal failure in global tear-down.";
|
||||
}
|
||||
|
||||
// Resets the state of the environment s.t. it can be reused.
|
||||
void Reset() {
|
||||
failure_in_set_up_ = NO_FAILURE;
|
||||
set_up_was_run_ = false;
|
||||
tear_down_was_run_ = false;
|
||||
}
|
||||
|
||||
// We call this function to set the type of failure SetUp() should
|
||||
// generate.
|
||||
void set_failure_in_set_up(FailureType type) {
|
||||
failure_in_set_up_ = type;
|
||||
}
|
||||
|
||||
// Was SetUp() run?
|
||||
bool set_up_was_run() const { return set_up_was_run_; }
|
||||
|
||||
// Was TearDown() run?
|
||||
bool tear_down_was_run() const { return tear_down_was_run_; }
|
||||
private:
|
||||
FailureType failure_in_set_up_;
|
||||
bool set_up_was_run_;
|
||||
bool tear_down_was_run_;
|
||||
};
|
||||
|
||||
// Was the TEST run?
|
||||
bool test_was_run;
|
||||
|
||||
// The sole purpose of this TEST is to enable us to check whether it
|
||||
// was run.
|
||||
TEST(FooTest, Bar) {
|
||||
test_was_run = true;
|
||||
}
|
||||
|
||||
// Prints the message and aborts the program if condition is false.
|
||||
void Check(bool condition, const char* msg) {
|
||||
if (!condition) {
|
||||
printf("FAILED: %s\n", msg);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
// Runs the tests. Return true iff successful.
|
||||
//
|
||||
// The 'failure' parameter specifies the type of failure that should
|
||||
// be generated by the global set-up.
|
||||
int RunAllTests(MyEnvironment* env, FailureType failure) {
|
||||
env->Reset();
|
||||
env->set_failure_in_set_up(failure);
|
||||
test_was_run = false;
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
// Registers a global test environment, and verifies that the
|
||||
// registration function returns its argument.
|
||||
MyEnvironment* const env = new MyEnvironment;
|
||||
Check(testing::AddGlobalTestEnvironment(env) == env,
|
||||
"AddGlobalTestEnvironment() should return its argument.");
|
||||
|
||||
// Verifies that RUN_ALL_TESTS() runs the tests when the global
|
||||
// set-up is successful.
|
||||
Check(RunAllTests(env, NO_FAILURE) != 0,
|
||||
"RUN_ALL_TESTS() should return non-zero, as the global tear-down "
|
||||
"should generate a failure.");
|
||||
Check(test_was_run,
|
||||
"The tests should run, as the global set-up should generate no "
|
||||
"failure");
|
||||
Check(env->tear_down_was_run(),
|
||||
"The global tear-down should run, as the global set-up was run.");
|
||||
|
||||
// Verifies that RUN_ALL_TESTS() runs the tests when the global
|
||||
// set-up generates no fatal failure.
|
||||
Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,
|
||||
"RUN_ALL_TESTS() should return non-zero, as both the global set-up "
|
||||
"and the global tear-down should generate a non-fatal failure.");
|
||||
Check(test_was_run,
|
||||
"The tests should run, as the global set-up should generate no "
|
||||
"fatal failure.");
|
||||
Check(env->tear_down_was_run(),
|
||||
"The global tear-down should run, as the global set-up was run.");
|
||||
|
||||
// Verifies that RUN_ALL_TESTS() runs no test when the global set-up
|
||||
// generates a fatal failure.
|
||||
Check(RunAllTests(env, FATAL_FAILURE) != 0,
|
||||
"RUN_ALL_TESTS() should return non-zero, as the global set-up "
|
||||
"should generate a fatal failure.");
|
||||
Check(!test_was_run,
|
||||
"The tests should not run, as the global set-up should generate "
|
||||
"a fatal failure.");
|
||||
Check(env->tear_down_was_run(),
|
||||
"The global tear-down should run, as the global set-up was run.");
|
||||
|
||||
// Verifies that RUN_ALL_TESTS() doesn't do global set-up or
|
||||
// tear-down when there is no test to run.
|
||||
testing::GTEST_FLAG(filter) = "-*";
|
||||
Check(RunAllTests(env, NO_FAILURE) == 0,
|
||||
"RUN_ALL_TESTS() should return zero, as there is no test to run.");
|
||||
Check(!env->set_up_was_run(),
|
||||
"The global set-up should not run, as there is no test to run.");
|
||||
Check(!env->tear_down_was_run(),
|
||||
"The global tear-down should not run, "
|
||||
"as the global set-up was not run.");
|
||||
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
Executable
+315
@@ -0,0 +1,315 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2005, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test for Google Test test filters.
|
||||
|
||||
A user can specify which test(s) in a Google Test program to run via either
|
||||
the GTEST_FILTER environment variable or the --gtest_filter flag.
|
||||
This script tests such functionality by invoking
|
||||
gtest_filter_unittest_ (a program written with Google Test) with different
|
||||
environments and command line flags.
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
# Constants.
|
||||
|
||||
# The environment variable for specifying the test filters.
|
||||
FILTER_ENV_VAR = 'GTEST_FILTER'
|
||||
|
||||
# The command line flag for specifying the test filters.
|
||||
FILTER_FLAG = 'gtest_filter'
|
||||
|
||||
# Command to run the gtest_filter_unittest_ program.
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_filter_unittest_')
|
||||
|
||||
# Regex for parsing test case names from Google Test's output.
|
||||
TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ test.* from (\w+)')
|
||||
|
||||
# Regex for parsing test names from Google Test's output.
|
||||
TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+)')
|
||||
|
||||
# Full names of all tests in gtest_filter_unittests_.
|
||||
ALL_TESTS = [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
]
|
||||
|
||||
|
||||
# Utilities.
|
||||
|
||||
|
||||
def SetEnvVar(env_var, value):
|
||||
"""Sets the env variable to 'value'; unsets it when 'value' is None."""
|
||||
|
||||
if value is not None:
|
||||
os.environ[env_var] = value
|
||||
elif env_var in os.environ:
|
||||
del os.environ[env_var]
|
||||
|
||||
|
||||
def Run(command):
|
||||
"""Runs a Google Test program and returns a list of full names of the
|
||||
tests that were run.
|
||||
"""
|
||||
|
||||
stdout_file = os.popen(command, 'r')
|
||||
tests_run = []
|
||||
test_case = ''
|
||||
test = ''
|
||||
for line in stdout_file:
|
||||
match = TEST_CASE_REGEX.match(line)
|
||||
if match is not None:
|
||||
test_case = match.group(1)
|
||||
else:
|
||||
match = TEST_REGEX.match(line)
|
||||
if match is not None:
|
||||
test = match.group(1)
|
||||
tests_run += [test_case + '.' + test]
|
||||
stdout_file.close()
|
||||
return tests_run
|
||||
|
||||
|
||||
# The unit test.
|
||||
|
||||
|
||||
class GTestFilterUnitTest(unittest.TestCase):
|
||||
"""Tests using the GTEST_FILTER environment variable or the
|
||||
--gtest_filter flag to filter tests.
|
||||
"""
|
||||
|
||||
# Utilities.
|
||||
|
||||
def AssertSetEqual(self, lhs, rhs):
|
||||
"""Asserts that two sets are equal."""
|
||||
|
||||
for elem in lhs:
|
||||
self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
|
||||
|
||||
for elem in rhs:
|
||||
self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
|
||||
|
||||
def RunAndVerify(self, gtest_filter, tests_to_run):
|
||||
"""Runs gtest_flag_unittest_ with the given filter, and verifies
|
||||
that the right set of tests were run.
|
||||
"""
|
||||
|
||||
# First, tests using GTEST_FILTER.
|
||||
|
||||
SetEnvVar(FILTER_ENV_VAR, gtest_filter)
|
||||
tests_run = Run(COMMAND)
|
||||
SetEnvVar(FILTER_ENV_VAR, None)
|
||||
|
||||
self.AssertSetEqual(tests_run, tests_to_run)
|
||||
|
||||
# Next, tests using --gtest_filter.
|
||||
|
||||
if gtest_filter is None:
|
||||
command = COMMAND
|
||||
else:
|
||||
command = '%s --%s=%s' % (COMMAND, FILTER_FLAG, gtest_filter)
|
||||
|
||||
tests_run = Run(command)
|
||||
self.AssertSetEqual(tests_run, tests_to_run)
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of not specifying the filter."""
|
||||
|
||||
self.RunAndVerify(None, ALL_TESTS)
|
||||
|
||||
def testEmptyFilter(self):
|
||||
"""Tests an empty filter."""
|
||||
|
||||
self.RunAndVerify('', [])
|
||||
|
||||
def testBadFilter(self):
|
||||
"""Tests a filter that matches nothing."""
|
||||
|
||||
self.RunAndVerify('BadFilter', [])
|
||||
|
||||
def testFullName(self):
|
||||
"""Tests filtering by full name."""
|
||||
|
||||
self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
|
||||
|
||||
def testUniversalFilters(self):
|
||||
"""Tests filters that match everything."""
|
||||
|
||||
self.RunAndVerify('*', ALL_TESTS)
|
||||
self.RunAndVerify('*.*', ALL_TESTS)
|
||||
|
||||
def testFilterByTestCase(self):
|
||||
"""Tests filtering by test case name."""
|
||||
|
||||
self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
|
||||
|
||||
def testFilterByTest(self):
|
||||
"""Tests filtering by test name."""
|
||||
|
||||
self.RunAndVerify('*.Test1', ['BarTest.Test1', 'BazTest.Test1'])
|
||||
|
||||
def testWildcardInTestCaseName(self):
|
||||
"""Tests using wildcard in the test case name."""
|
||||
|
||||
self.RunAndVerify('*a*.*', [
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
|
||||
def testWildcardInTestName(self):
|
||||
"""Tests using wildcard in the test name."""
|
||||
|
||||
self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
|
||||
|
||||
def testFilterWithoutDot(self):
|
||||
"""Tests a filter that has no '.' in it."""
|
||||
|
||||
self.RunAndVerify('*z*', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
|
||||
def testTwoPatterns(self):
|
||||
"""Tests filters that consist of two patterns."""
|
||||
|
||||
self.RunAndVerify('Foo*.*:*A*', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BazTest.TestA',
|
||||
])
|
||||
|
||||
# An empty pattern + a non-empty one
|
||||
self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
|
||||
|
||||
def testThreePatterns(self):
|
||||
"""Tests filters that consist of three patterns."""
|
||||
|
||||
self.RunAndVerify('*oo*:*A*:*1', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.Test1',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
])
|
||||
|
||||
# The 2nd pattern is empty.
|
||||
self.RunAndVerify('*oo*::*1', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.Test1',
|
||||
|
||||
'BazTest.Test1',
|
||||
])
|
||||
|
||||
# The last 2 patterns are empty.
|
||||
self.RunAndVerify('*oo*::', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
])
|
||||
|
||||
def testNegativeFilters(self):
|
||||
self.RunAndVerify('*-FooTest.Abc', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
|
||||
self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
])
|
||||
|
||||
self.RunAndVerify('BarTest.*-BarTest.Test1', [
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
])
|
||||
|
||||
# Tests without leading '*'.
|
||||
self.RunAndVerify('-FooTest.Abc:FooTest.Xyz', [
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
|
||||
def testFlagOverridesEnvVar(self):
|
||||
"""Tests that the --gtest_filter flag overrides the GTEST_FILTER
|
||||
environment variable."""
|
||||
|
||||
SetEnvVar(FILTER_ENV_VAR, 'Foo*')
|
||||
command = '%s --%s=%s' % (COMMAND, FILTER_FLAG, '*1')
|
||||
tests_run = Run(command)
|
||||
SetEnvVar(FILTER_ENV_VAR, None)
|
||||
|
||||
self.AssertSetEqual(tests_run, ['BarTest.Test1', 'BazTest.Test1'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,90 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Unit test for Google Test test filters.
|
||||
//
|
||||
// A user can specify which test(s) in a Google Test program to run via
|
||||
// either the GTEST_FILTER environment variable or the --gtest_filter
|
||||
// flag. This is used for testing such functionality.
|
||||
//
|
||||
// The program will be invoked from a Python unit test. Don't run it
|
||||
// directly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
// Test case FooTest.
|
||||
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(FooTest, Abc) {
|
||||
}
|
||||
|
||||
TEST_F(FooTest, Xyz) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
|
||||
// Test case BarTest.
|
||||
|
||||
TEST(BarTest, Test1) {
|
||||
}
|
||||
|
||||
TEST(BarTest, Test2) {
|
||||
}
|
||||
|
||||
TEST(BarTest, Test3) {
|
||||
}
|
||||
|
||||
|
||||
// Test case BazTest.
|
||||
|
||||
TEST(BazTest, Test1) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
TEST(BazTest, TestA) {
|
||||
}
|
||||
|
||||
TEST(BazTest, TestB) {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Executable
+165
@@ -0,0 +1,165 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test for Google Test's --gtest_list_tests flag.
|
||||
|
||||
A user can ask Google Test to list all tests by specifying the
|
||||
--gtest_list_tests flag. This script tests such functionality
|
||||
by invoking gtest_list_tests_unittest_ (a program written with
|
||||
Google Test) the command line flags.
|
||||
"""
|
||||
|
||||
__author__ = 'phanna@google.com (Patrick Hanna)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
# Constants.
|
||||
|
||||
# The command line flag for enabling/disabling listing all tests.
|
||||
LIST_TESTS_FLAG = 'gtest_list_tests'
|
||||
|
||||
# Path to the gtest_list_tests_unittest_ program.
|
||||
EXE_PATH = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_list_tests_unittest_');
|
||||
|
||||
# The expected output when running gtest_list_tests_unittest_ with
|
||||
# --gtest_list_tests
|
||||
EXPECTED_OUTPUT = """FooDeathTest.
|
||||
Test1
|
||||
Foo.
|
||||
Bar1
|
||||
Bar2
|
||||
Bar3
|
||||
Abc.
|
||||
Xyz
|
||||
Def
|
||||
FooBar.
|
||||
Baz
|
||||
FooTest.
|
||||
Test1
|
||||
Test2
|
||||
Test3
|
||||
"""
|
||||
|
||||
# Utilities.
|
||||
|
||||
def Run(command):
|
||||
"""Runs a command and returns the list of tests printed.
|
||||
"""
|
||||
|
||||
stdout_file = os.popen(command, "r")
|
||||
|
||||
output = stdout_file.read()
|
||||
|
||||
stdout_file.close()
|
||||
return output
|
||||
|
||||
|
||||
# The unit test.
|
||||
|
||||
class GTestListTestsUnitTest(unittest.TestCase):
|
||||
"""Tests using the --gtest_list_tests flag to list all tests.
|
||||
"""
|
||||
|
||||
def RunAndVerify(self, flag_value, expected_output, other_flag):
|
||||
"""Runs gtest_list_tests_unittest_ and verifies that it prints
|
||||
the correct tests.
|
||||
|
||||
Args:
|
||||
flag_value: value of the --gtest_list_tests flag;
|
||||
None if the flag should not be present.
|
||||
|
||||
expected_output: the expected output after running command;
|
||||
|
||||
other_flag: a different flag to be passed to command
|
||||
along with gtest_list_tests;
|
||||
None if the flag should not be present.
|
||||
"""
|
||||
|
||||
if flag_value is None:
|
||||
flag = ''
|
||||
flag_expression = "not set"
|
||||
elif flag_value == '0':
|
||||
flag = ' --%s=0' % LIST_TESTS_FLAG
|
||||
flag_expression = "0"
|
||||
else:
|
||||
flag = ' --%s' % LIST_TESTS_FLAG
|
||||
flag_expression = "1"
|
||||
|
||||
command = EXE_PATH + flag
|
||||
|
||||
if other_flag is not None:
|
||||
command += " " + other_flag
|
||||
|
||||
output = Run(command)
|
||||
|
||||
msg = ('when %s is %s, the output of "%s" is "%s".' %
|
||||
(LIST_TESTS_FLAG, flag_expression, command, output))
|
||||
|
||||
if expected_output is not None:
|
||||
self.assert_(output == expected_output, msg)
|
||||
else:
|
||||
self.assert_(output != EXPECTED_OUTPUT, msg)
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of the default mode."""
|
||||
|
||||
self.RunAndVerify(flag_value=None,
|
||||
expected_output=None,
|
||||
other_flag=None)
|
||||
|
||||
def testFlag(self):
|
||||
"""Tests using the --gtest_list_tests flag."""
|
||||
|
||||
self.RunAndVerify(flag_value='0',
|
||||
expected_output=None,
|
||||
other_flag=None)
|
||||
self.RunAndVerify(flag_value='1',
|
||||
expected_output=EXPECTED_OUTPUT,
|
||||
other_flag=None)
|
||||
|
||||
def testOverrideOtherFlags(self):
|
||||
"""Tests that --gtest_list_tests overrides all other flags."""
|
||||
|
||||
self.RunAndVerify(flag_value="1",
|
||||
expected_output=EXPECTED_OUTPUT,
|
||||
other_flag="--gtest_filter=*")
|
||||
self.RunAndVerify(flag_value="1",
|
||||
expected_output=EXPECTED_OUTPUT,
|
||||
other_flag="--gtest_break_on_failure")
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,87 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: phanna@google.com (Patrick Hanna)
|
||||
|
||||
// Unit test for Google Test's --gtest_list_tests flag.
|
||||
//
|
||||
// A user can ask Google Test to list all tests that will run
|
||||
// so that when using a filter, a user will know what
|
||||
// tests to look for. The tests will not be run after listing.
|
||||
//
|
||||
// This program will be invoked from a Python unit test.
|
||||
// Don't run it directly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
// Several different test cases and tests that will be listed.
|
||||
TEST(Foo, Bar1) {
|
||||
}
|
||||
|
||||
TEST(Foo, Bar2) {
|
||||
}
|
||||
|
||||
TEST(Foo, Bar3) {
|
||||
}
|
||||
|
||||
TEST(Abc, Xyz) {
|
||||
}
|
||||
|
||||
TEST(Abc, Def) {
|
||||
}
|
||||
|
||||
TEST(FooBar, Baz) {
|
||||
}
|
||||
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(FooTest, Test1) {
|
||||
}
|
||||
|
||||
TEST_F(FooTest, Test2) {
|
||||
}
|
||||
|
||||
TEST_F(FooTest, Test3) {
|
||||
}
|
||||
|
||||
TEST(FooDeathTest, Test1) {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Tests that we don't have to define main() when we link to
|
||||
// gtest_main instead of gtest.
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(GTestMainTest, ShouldSucceed) {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// We are using the main() function defined in src/gtest_main.cc, so
|
||||
// we don't define it here.
|
||||
@@ -0,0 +1,115 @@
|
||||
// Copyright 2007, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// This file is the input to a negative-compilation test for Google
|
||||
// Test. Code here is NOT supposed to compile. Its purpose is to
|
||||
// verify that certain incorrect usages of the Google Test API are
|
||||
// indeed rejected by the compiler.
|
||||
//
|
||||
// We still need to write the negative-compilation test itself, which
|
||||
// will be tightly coupled with the build environment.
|
||||
//
|
||||
// TODO(wan@google.com): finish the negative-compilation test.
|
||||
|
||||
#ifdef TEST_CANNOT_IGNORE_RUN_ALL_TESTS_RESULT
|
||||
// Tests that the result of RUN_ALL_TESTS() cannot be ignored.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
RUN_ALL_TESTS(); // This line shouldn't compile.
|
||||
}
|
||||
|
||||
#elif defined(TEST_USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H)
|
||||
// Tests that a user cannot include gtest-internal-inl.h in his code.
|
||||
|
||||
#include "src/gtest-internal-inl.h"
|
||||
|
||||
#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO)
|
||||
// Tests that the compiler catches the typo when a user declares a
|
||||
// Setup() method in a test fixture.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class MyTest : public testing::Test {
|
||||
protected:
|
||||
void Setup() {}
|
||||
};
|
||||
|
||||
#elif defined(TEST_CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO)
|
||||
// Tests that the compiler catches the typo when a user calls Setup()
|
||||
// from a test fixture.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class MyTest : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
testing::Test::Setup(); // Tries to call SetUp() in the parent class.
|
||||
}
|
||||
};
|
||||
|
||||
#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO)
|
||||
// Tests that the compiler catches the typo when a user declares a
|
||||
// Setup() method in a subclass of Environment.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class MyEnvironment : public testing::Environment {
|
||||
public:
|
||||
void Setup() {}
|
||||
};
|
||||
|
||||
#elif defined(TEST_CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO)
|
||||
// Tests that the compiler catches the typo when a user calls Setup()
|
||||
// in an Environment.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class MyEnvironment : public testing::Environment {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
// Tries to call SetUp() in the parent class.
|
||||
testing::Environment::Setup();
|
||||
}
|
||||
};
|
||||
|
||||
#else
|
||||
// A sanity test. This should compile.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main() {
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
#endif
|
||||
Executable
+77
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2007, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Negative compilation test for Google Test."""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
class GTestNCTest(unittest.TestCase):
|
||||
"""Negative compilation test for Google Test."""
|
||||
|
||||
def testCompilerError(self):
|
||||
"""Verifies that erroneous code leads to expected compiler
|
||||
messages."""
|
||||
|
||||
# Defines a list of test specs, where each element is a tuple
|
||||
# (test name, list of regexes for matching the compiler errors).
|
||||
test_specs = [
|
||||
('CANNOT_IGNORE_RUN_ALL_TESTS_RESULT',
|
||||
[r'ignoring return value']),
|
||||
|
||||
('USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H',
|
||||
[r'must not be included except by Google Test itself']),
|
||||
|
||||
('CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO',
|
||||
[r'Setup_should_be_spelled_SetUp']),
|
||||
|
||||
('CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO',
|
||||
[r'Setup_should_be_spelled_SetUp']),
|
||||
|
||||
('CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO',
|
||||
[r'Setup_should_be_spelled_SetUp']),
|
||||
|
||||
('CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO',
|
||||
[r'Setup_should_be_spelled_SetUp']),
|
||||
|
||||
('SANITY',
|
||||
None)
|
||||
]
|
||||
|
||||
# TODO(wan@google.com): verify that the test specs are satisfied.
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,54 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Tests that a Google Test program that has no test defined can run
|
||||
// successfully.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
// An ad-hoc assertion outside of all tests.
|
||||
//
|
||||
// This serves two purposes:
|
||||
//
|
||||
// 1. It verifies that an ad-hoc assertion can be executed even if
|
||||
// no test is defined.
|
||||
// 2. We had a bug where the XML output won't be generated if an
|
||||
// assertion is executed before RUN_ALL_TESTS() is called, even
|
||||
// though --gtest_output=xml is specified. This makes sure the
|
||||
// bug is fixed and doesn't regress.
|
||||
EXPECT_EQ(1, 1);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Executable
+183
@@ -0,0 +1,183 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2008, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Tests the text output of Google C++ Testing Framework.
|
||||
|
||||
SYNOPSIS
|
||||
gtest_output_test.py --gengolden
|
||||
gtest_output_test.py
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import re
|
||||
import string
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
# The flag for generating the golden file
|
||||
GENGOLDEN_FLAG = '--gengolden'
|
||||
|
||||
IS_WINDOWS = os.name == 'nt'
|
||||
|
||||
if IS_WINDOWS:
|
||||
PROGRAM = r'..\build.dbg8\gtest_output_test_.exe'
|
||||
GOLDEN_NAME = 'gtest_output_test_golden_win.txt'
|
||||
else:
|
||||
PROGRAM = 'gtest_output_test_'
|
||||
GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
|
||||
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
PROGRAM) + ' --gtest_color=yes'
|
||||
|
||||
GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(),
|
||||
GOLDEN_NAME)
|
||||
|
||||
def ToUnixLineEnding(s):
|
||||
"""Changes all Windows/Mac line endings in s to UNIX line endings."""
|
||||
|
||||
return s.replace('\r\n', '\n').replace('\r', '\n')
|
||||
|
||||
|
||||
def RemoveLocations(output):
|
||||
"""Removes all file location info from a Google Test program's output.
|
||||
|
||||
Args:
|
||||
output: the output of a Google Test program.
|
||||
|
||||
Returns:
|
||||
output with all file location info (in the form of
|
||||
'DIRECTORY/FILE_NAME:LINE_NUMBER: ') replaced by
|
||||
'FILE_NAME:#: '.
|
||||
"""
|
||||
|
||||
return re.sub(r'.*[/\\](.+)\:\d+\: ', r'\1:#: ', output)
|
||||
|
||||
|
||||
def RemoveStackTraces(output):
|
||||
"""Removes all stack traces from a Google Test program's output."""
|
||||
|
||||
# *? means "find the shortest string that matches".
|
||||
return re.sub(r'Stack trace:(.|\n)*?\n\n',
|
||||
'Stack trace: (omitted)\n\n', output)
|
||||
|
||||
|
||||
def NormalizeOutput(output):
|
||||
"""Normalizes output (the output of gtest_output_test_.exe)."""
|
||||
|
||||
output = ToUnixLineEnding(output)
|
||||
output = RemoveLocations(output)
|
||||
output = RemoveStackTraces(output)
|
||||
return output
|
||||
|
||||
|
||||
def IterShellCommandOutput(cmd, stdin_string=None):
|
||||
"""Runs a command in a sub-process, and iterates the lines in its STDOUT.
|
||||
|
||||
Args:
|
||||
|
||||
cmd: The shell command.
|
||||
stdin_string: The string to be fed to the STDIN of the sub-process;
|
||||
If None, the sub-process will inherit the STDIN
|
||||
from the parent process.
|
||||
"""
|
||||
|
||||
# Spawns cmd in a sub-process, and gets its standard I/O file objects.
|
||||
stdin_file, stdout_file = os.popen2(cmd, 'b')
|
||||
|
||||
# If the caller didn't specify a string for STDIN, gets it from the
|
||||
# parent process.
|
||||
if stdin_string is None:
|
||||
stdin_string = sys.stdin.read()
|
||||
|
||||
# Feeds the STDIN string to the sub-process.
|
||||
stdin_file.write(stdin_string)
|
||||
stdin_file.close()
|
||||
|
||||
while True:
|
||||
line = stdout_file.readline()
|
||||
if not line: # EOF
|
||||
stdout_file.close()
|
||||
break
|
||||
|
||||
yield line
|
||||
|
||||
|
||||
def GetShellCommandOutput(cmd, stdin_string=None):
|
||||
"""Runs a command in a sub-process, and returns its STDOUT in a string.
|
||||
|
||||
Args:
|
||||
|
||||
cmd: The shell command.
|
||||
stdin_string: The string to be fed to the STDIN of the sub-process;
|
||||
If None, the sub-process will inherit the STDIN
|
||||
from the parent process.
|
||||
"""
|
||||
|
||||
lines = list(IterShellCommandOutput(cmd, stdin_string))
|
||||
return string.join(lines, '')
|
||||
|
||||
|
||||
def GetCommandOutput(cmd):
|
||||
"""Runs a command and returns its output with all file location
|
||||
info stripped off.
|
||||
|
||||
Args:
|
||||
cmd: the shell command.
|
||||
"""
|
||||
|
||||
# Disables exception pop-ups on Windows.
|
||||
os.environ['GUNIT_CATCH_EXCEPTIONS'] = '1'
|
||||
return NormalizeOutput(GetShellCommandOutput(cmd, ''))
|
||||
|
||||
|
||||
class GTestOutputTest(unittest.TestCase):
|
||||
def testOutput(self):
|
||||
output = GetCommandOutput(COMMAND)
|
||||
|
||||
golden_file = open(GOLDEN_PATH, 'rb')
|
||||
golden = golden_file.read()
|
||||
golden_file.close()
|
||||
|
||||
self.assertEquals(golden, output)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if sys.argv[1:] == [GENGOLDEN_FLAG]:
|
||||
output = GetCommandOutput(COMMAND)
|
||||
golden_file = open(GOLDEN_PATH, 'wb')
|
||||
golden_file.write(output)
|
||||
golden_file.close()
|
||||
else:
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,755 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// A unit test for Google Test itself. This verifies that the basic
|
||||
// constructs of Google Test work.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest-spi.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
// Tests catching fatal failures.
|
||||
|
||||
// A subroutine used by the following test.
|
||||
void TestEq1(int x) {
|
||||
ASSERT_EQ(1, x);
|
||||
}
|
||||
|
||||
// This function calls a test subroutine, catches the fatal failure it
|
||||
// generates, and then returns early.
|
||||
void TryTestSubroutine() {
|
||||
// Calls a subrountine that yields a fatal failure.
|
||||
TestEq1(2);
|
||||
|
||||
// Catches the fatal failure and aborts the test.
|
||||
//
|
||||
// The testing::Test:: prefix is necessary when calling
|
||||
// HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
|
||||
if (testing::Test::HasFatalFailure()) return;
|
||||
|
||||
// If we get here, something is wrong.
|
||||
FAIL() << "This should never be reached.";
|
||||
}
|
||||
|
||||
// Tests catching a fatal failure in a subroutine.
|
||||
TEST(FatalFailureTest, FatalFailureInSubroutine) {
|
||||
printf("(expecting a failure that x should be 1)\n");
|
||||
|
||||
TryTestSubroutine();
|
||||
}
|
||||
|
||||
// Tests catching a fatal failure in a nested subroutine.
|
||||
TEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
|
||||
printf("(expecting a failure that x should be 1)\n");
|
||||
|
||||
// Calls a subrountine that yields a fatal failure.
|
||||
TryTestSubroutine();
|
||||
|
||||
// Catches the fatal failure and aborts the test.
|
||||
//
|
||||
// When calling HasFatalFailure() inside a TEST, TEST_F, or test
|
||||
// fixture, the testing::Test:: prefix is not needed.
|
||||
if (HasFatalFailure()) return;
|
||||
|
||||
// If we get here, something is wrong.
|
||||
FAIL() << "This should never be reached.";
|
||||
}
|
||||
|
||||
// Tests HasFatalFailure() after a failed EXPECT check.
|
||||
TEST(FatalFailureTest, NonfatalFailureInSubroutine) {
|
||||
printf("(expecting a failure on false)\n");
|
||||
EXPECT_TRUE(false); // Generates a nonfatal failure
|
||||
ASSERT_FALSE(HasFatalFailure()); // This should succeed.
|
||||
}
|
||||
|
||||
// Tests interleaving user logging and Google Test assertions.
|
||||
TEST(LoggingTest, InterleavingLoggingAndAssertions) {
|
||||
static const int a[4] = {
|
||||
3, 9, 2, 6
|
||||
};
|
||||
|
||||
printf("(expecting 2 failures on (3) >= (a[i]))\n");
|
||||
for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
|
||||
printf("i == %d\n", i);
|
||||
EXPECT_GE(3, a[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Tests the SCOPED_TRACE macro.
|
||||
|
||||
// A helper function for testing SCOPED_TRACE.
|
||||
void SubWithoutTrace(int n) {
|
||||
EXPECT_EQ(1, n);
|
||||
ASSERT_EQ(2, n);
|
||||
}
|
||||
|
||||
// Another helper function for testing SCOPED_TRACE.
|
||||
void SubWithTrace(int n) {
|
||||
SCOPED_TRACE(testing::Message() << "n = " << n);
|
||||
|
||||
SubWithoutTrace(n);
|
||||
}
|
||||
|
||||
// Tests that SCOPED_TRACE() obeys lexical scopes.
|
||||
TEST(SCOPED_TRACETest, ObeysScopes) {
|
||||
printf("(expected to fail)\n");
|
||||
|
||||
// There should be no trace before SCOPED_TRACE() is invoked.
|
||||
ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
|
||||
|
||||
{
|
||||
SCOPED_TRACE("Expected trace");
|
||||
// After SCOPED_TRACE(), a failure in the current scope should contain
|
||||
// the trace.
|
||||
ADD_FAILURE() << "This failure is expected, and should have a trace.";
|
||||
}
|
||||
|
||||
// Once the control leaves the scope of the SCOPED_TRACE(), there
|
||||
// should be no trace again.
|
||||
ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
|
||||
}
|
||||
|
||||
// Tests that SCOPED_TRACE works inside a loop.
|
||||
TEST(SCOPED_TRACETest, WorksInLoop) {
|
||||
printf("(expected to fail)\n");
|
||||
|
||||
for (int i = 1; i <= 2; i++) {
|
||||
SCOPED_TRACE(testing::Message() << "i = " << i);
|
||||
|
||||
SubWithoutTrace(i);
|
||||
}
|
||||
}
|
||||
|
||||
// Tests that SCOPED_TRACE works in a subroutine.
|
||||
TEST(SCOPED_TRACETest, WorksInSubroutine) {
|
||||
printf("(expected to fail)\n");
|
||||
|
||||
SubWithTrace(1);
|
||||
SubWithTrace(2);
|
||||
}
|
||||
|
||||
// Tests that SCOPED_TRACE can be nested.
|
||||
TEST(SCOPED_TRACETest, CanBeNested) {
|
||||
printf("(expected to fail)\n");
|
||||
|
||||
SCOPED_TRACE(""); // A trace without a message.
|
||||
|
||||
SubWithTrace(2);
|
||||
}
|
||||
|
||||
// Tests that multiple SCOPED_TRACEs can be used in the same scope.
|
||||
TEST(SCOPED_TRACETest, CanBeRepeated) {
|
||||
printf("(expected to fail)\n");
|
||||
|
||||
SCOPED_TRACE("A");
|
||||
ADD_FAILURE()
|
||||
<< "This failure is expected, and should contain trace point A.";
|
||||
|
||||
SCOPED_TRACE("B");
|
||||
ADD_FAILURE()
|
||||
<< "This failure is expected, and should contain trace point A and B.";
|
||||
|
||||
{
|
||||
SCOPED_TRACE("C");
|
||||
ADD_FAILURE() << "This failure is expected, and should contain "
|
||||
<< "trace point A, B, and C.";
|
||||
}
|
||||
|
||||
SCOPED_TRACE("D");
|
||||
ADD_FAILURE() << "This failure is expected, and should contain "
|
||||
<< "trace point A, B, and D.";
|
||||
}
|
||||
|
||||
// Tests using assertions outside of TEST and TEST_F.
|
||||
//
|
||||
// This function creates two failures intentionally.
|
||||
void AdHocTest() {
|
||||
printf("The non-test part of the code is expected to have 2 failures.\n\n");
|
||||
EXPECT_TRUE(false);
|
||||
EXPECT_EQ(2, 3);
|
||||
}
|
||||
|
||||
|
||||
// Runs all TESTs, all TEST_Fs, and the ad hoc test.
|
||||
int RunAllTests() {
|
||||
AdHocTest();
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
// Tests non-fatal failures in the fixture constructor.
|
||||
class NonFatalFailureInFixtureConstructorTest : public testing::Test {
|
||||
protected:
|
||||
NonFatalFailureInFixtureConstructorTest() {
|
||||
printf("(expecting 5 failures)\n");
|
||||
ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
|
||||
}
|
||||
|
||||
~NonFatalFailureInFixtureConstructorTest() {
|
||||
ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
ADD_FAILURE() << "Expected failure #2, in SetUp().";
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
ADD_FAILURE() << "Expected failure #4, in TearDown.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
|
||||
ADD_FAILURE() << "Expected failure #3, in the test body.";
|
||||
}
|
||||
|
||||
// Tests fatal failures in the fixture constructor.
|
||||
class FatalFailureInFixtureConstructorTest : public testing::Test {
|
||||
protected:
|
||||
FatalFailureInFixtureConstructorTest() {
|
||||
printf("(expecting 2 failures)\n");
|
||||
Init();
|
||||
}
|
||||
|
||||
~FatalFailureInFixtureConstructorTest() {
|
||||
ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
ADD_FAILURE() << "UNEXPECTED failure in SetUp(). "
|
||||
<< "We should never get here, as the test fixture c'tor "
|
||||
<< "had a fatal failure.";
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
ADD_FAILURE() << "UNEXPECTED failure in TearDown(). "
|
||||
<< "We should never get here, as the test fixture c'tor "
|
||||
<< "had a fatal failure.";
|
||||
}
|
||||
private:
|
||||
void Init() {
|
||||
FAIL() << "Expected failure #1, in the test fixture c'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
|
||||
ADD_FAILURE() << "UNEXPECTED failure in the test body. "
|
||||
<< "We should never get here, as the test fixture c'tor "
|
||||
<< "had a fatal failure.";
|
||||
}
|
||||
|
||||
// Tests non-fatal failures in SetUp().
|
||||
class NonFatalFailureInSetUpTest : public testing::Test {
|
||||
protected:
|
||||
virtual ~NonFatalFailureInSetUpTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
printf("(expecting 4 failures)\n");
|
||||
ADD_FAILURE() << "Expected failure #1, in SetUp().";
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
FAIL() << "Expected failure #3, in TearDown().";
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "Expected failure #4, in the test fixture d'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
|
||||
FAIL() << "Expected failure #2, in the test function.";
|
||||
}
|
||||
|
||||
// Tests fatal failures in SetUp().
|
||||
class FatalFailureInSetUpTest : public testing::Test {
|
||||
protected:
|
||||
virtual ~FatalFailureInSetUpTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
printf("(expecting 3 failures)\n");
|
||||
FAIL() << "Expected failure #1, in SetUp().";
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
FAIL() << "Expected failure #2, in TearDown().";
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "Expected failure #3, in the test fixture d'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
|
||||
FAIL() << "UNEXPECTED failure in the test function. "
|
||||
<< "We should never get here, as SetUp() failed.";
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// This group of tests verifies that Google Test handles SEH and C++
|
||||
// exceptions correctly.
|
||||
|
||||
// A function that throws an SEH exception.
|
||||
static void ThrowSEH() {
|
||||
int* p = NULL;
|
||||
*p = 0; // Raises an access violation.
|
||||
}
|
||||
|
||||
// Tests exceptions thrown in the test fixture constructor.
|
||||
class ExceptionInFixtureCtorTest : public testing::Test {
|
||||
protected:
|
||||
ExceptionInFixtureCtorTest() {
|
||||
printf("(expecting a failure on thrown exception "
|
||||
"in the test fixture's constructor)\n");
|
||||
|
||||
ThrowSEH();
|
||||
}
|
||||
|
||||
virtual ~ExceptionInFixtureCtorTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
FAIL() << "UNEXPECTED failure in SetUp(). "
|
||||
<< "We should never get here, as the test fixture c'tor threw.";
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
FAIL() << "UNEXPECTED failure in TearDown(). "
|
||||
<< "We should never get here, as the test fixture c'tor threw.";
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "UNEXPECTED failure in the d'tor. "
|
||||
<< "We should never get here, as the test fixture c'tor threw.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExceptionInFixtureCtorTest, ExceptionInFixtureCtor) {
|
||||
FAIL() << "UNEXPECTED failure in the test function. "
|
||||
<< "We should never get here, as the test fixture c'tor threw.";
|
||||
}
|
||||
|
||||
// Tests exceptions thrown in SetUp().
|
||||
class ExceptionInSetUpTest : public testing::Test {
|
||||
protected:
|
||||
virtual ~ExceptionInSetUpTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
printf("(expecting 3 failures)\n");
|
||||
|
||||
ThrowSEH();
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
FAIL() << "Expected failure #2, in TearDown().";
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "Expected failure #3, in the test fixture d'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExceptionInSetUpTest, ExceptionInSetUp) {
|
||||
FAIL() << "UNEXPECTED failure in the test function. "
|
||||
<< "We should never get here, as SetUp() threw.";
|
||||
}
|
||||
|
||||
// Tests that TearDown() and the test fixture d'tor are always called,
|
||||
// even when the test function throws an exception.
|
||||
class ExceptionInTestFunctionTest : public testing::Test {
|
||||
protected:
|
||||
virtual ~ExceptionInTestFunctionTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
FAIL() << "Expected failure #2, in TearDown().";
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "Expected failure #3, in the test fixture d'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
// Tests that the test fixture d'tor is always called, even when the
|
||||
// test function throws an SEH exception.
|
||||
TEST_F(ExceptionInTestFunctionTest, SEH) {
|
||||
printf("(expecting 3 failures)\n");
|
||||
|
||||
ThrowSEH();
|
||||
}
|
||||
|
||||
#if GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// Tests that the test fixture d'tor is always called, even when the
|
||||
// test function throws a C++ exception. We do this only when
|
||||
// GTEST_HAS_EXCEPTIONS is non-zero, i.e. C++ exceptions are enabled.
|
||||
TEST_F(ExceptionInTestFunctionTest, CppException) {
|
||||
throw 1;
|
||||
}
|
||||
|
||||
// Tests exceptions thrown in TearDown().
|
||||
class ExceptionInTearDownTest : public testing::Test {
|
||||
protected:
|
||||
virtual ~ExceptionInTearDownTest() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
throw 1;
|
||||
}
|
||||
private:
|
||||
void Deinit() {
|
||||
FAIL() << "Expected failure #2, in the test fixture d'tor.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExceptionInTearDownTest, ExceptionInTearDown) {
|
||||
printf("(expecting 2 failures)\n");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_EXCEPTIONS
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// The MixedUpTestCaseTest test case verifies that Google Test will fail a
|
||||
// test if it uses a different fixture class than what other tests in
|
||||
// the same test case use. It deliberately contains two fixture
|
||||
// classes with the same name but defined in different namespaces.
|
||||
|
||||
// The MixedUpTestCaseWithSameTestNameTest test case verifies that
|
||||
// when the user defines two tests with the same test case name AND
|
||||
// same test name (but in different namespaces), the second test will
|
||||
// fail.
|
||||
|
||||
namespace foo {
|
||||
|
||||
class MixedUpTestCaseTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
|
||||
TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
|
||||
|
||||
class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(MixedUpTestCaseWithSameTestNameTest,
|
||||
TheSecondTestWithThisNameShouldFail) {}
|
||||
|
||||
} // namespace foo
|
||||
|
||||
namespace bar {
|
||||
|
||||
class MixedUpTestCaseTest : public testing::Test {
|
||||
};
|
||||
|
||||
// The following two tests are expected to fail. We rely on the
|
||||
// golden file to check that Google Test generates the right error message.
|
||||
TEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
|
||||
TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
|
||||
|
||||
class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
|
||||
};
|
||||
|
||||
// Expected to fail. We rely on the golden file to check that Google Test
|
||||
// generates the right error message.
|
||||
TEST_F(MixedUpTestCaseWithSameTestNameTest,
|
||||
TheSecondTestWithThisNameShouldFail) {}
|
||||
|
||||
} // namespace bar
|
||||
|
||||
// The following two test cases verify that Google Test catches the user
|
||||
// error of mixing TEST and TEST_F in the same test case. The first
|
||||
// test case checks the scenario where TEST_F appears before TEST, and
|
||||
// the second one checks where TEST appears before TEST_F.
|
||||
|
||||
class TEST_F_before_TEST_in_same_test_case : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
|
||||
|
||||
// Expected to fail. We rely on the golden file to check that Google Test
|
||||
// generates the right error message.
|
||||
TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
|
||||
|
||||
class TEST_before_TEST_F_in_same_test_case : public testing::Test {
|
||||
};
|
||||
|
||||
TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
|
||||
|
||||
// Expected to fail. We rely on the golden file to check that Google Test
|
||||
// generates the right error message.
|
||||
TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
|
||||
}
|
||||
|
||||
// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
|
||||
int global_integer = 0;
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
|
||||
TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
|
||||
global_integer = 0;
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
|
||||
}, "Expected non-fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
|
||||
// (static or not).
|
||||
TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
|
||||
int m = 0;
|
||||
static int n;
|
||||
n = 1;
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
EXPECT_EQ(m, n) << "Expected non-fatal failure.";
|
||||
}, "Expected non-fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
|
||||
// one non-fatal failure and no fatal failure.
|
||||
TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
ADD_FAILURE() << "Expected non-fatal failure.";
|
||||
}, "Expected non-fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
|
||||
// non-fatal failure.
|
||||
TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
|
||||
// non-fatal failures.
|
||||
TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
ADD_FAILURE() << "Expected non-fatal failure 1.";
|
||||
ADD_FAILURE() << "Expected non-fatal failure 2.";
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
|
||||
// failure.
|
||||
TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
FAIL() << "Expected fatal failure.";
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
|
||||
// tested returns.
|
||||
TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
return;
|
||||
}, "");
|
||||
}
|
||||
|
||||
#if GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
|
||||
// tested throws.
|
||||
TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
|
||||
printf("(expecting a failure)\n");
|
||||
try {
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
throw 0;
|
||||
}, "");
|
||||
} catch(int) { // NOLINT
|
||||
}
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
|
||||
TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
|
||||
global_integer = 0;
|
||||
EXPECT_FATAL_FAILURE({
|
||||
ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
|
||||
}, "Expected fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() can reference local static
|
||||
// variables.
|
||||
TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
|
||||
static int n;
|
||||
n = 1;
|
||||
EXPECT_FATAL_FAILURE({
|
||||
ASSERT_EQ(0, n) << "Expected fatal failure.";
|
||||
}, "Expected fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
|
||||
// one fatal failure and no non-fatal failure.
|
||||
TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
|
||||
EXPECT_FATAL_FAILURE({
|
||||
FAIL() << "Expected fatal failure.";
|
||||
}, "Expected fatal failure.");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
|
||||
// failure.
|
||||
TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_FATAL_FAILURE({
|
||||
}, "");
|
||||
}
|
||||
|
||||
// A helper for generating a fatal failure.
|
||||
void FatalFailure() {
|
||||
FAIL() << "Expected fatal failure.";
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() fails when there are two
|
||||
// fatal failures.
|
||||
TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_FATAL_FAILURE({
|
||||
FatalFailure();
|
||||
FatalFailure();
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
|
||||
// failure.
|
||||
TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_FATAL_FAILURE({
|
||||
ADD_FAILURE() << "Expected non-fatal failure.";
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
|
||||
// tested returns.
|
||||
TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
|
||||
printf("(expecting a failure)\n");
|
||||
EXPECT_FATAL_FAILURE({
|
||||
return;
|
||||
}, "");
|
||||
}
|
||||
|
||||
#if GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
|
||||
// tested throws.
|
||||
TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
|
||||
printf("(expecting a failure)\n");
|
||||
try {
|
||||
EXPECT_FATAL_FAILURE({
|
||||
throw 0;
|
||||
}, "");
|
||||
} catch(int) { // NOLINT
|
||||
}
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// Two test environments for testing testing::AddGlobalTestEnvironment().
|
||||
|
||||
class FooEnvironment : public testing::Environment {
|
||||
public:
|
||||
virtual void SetUp() {
|
||||
printf("%s", "FooEnvironment::SetUp() called.\n");
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
printf("%s", "FooEnvironment::TearDown() called.\n");
|
||||
FAIL() << "Expected fatal failure.";
|
||||
}
|
||||
};
|
||||
|
||||
class BarEnvironment : public testing::Environment {
|
||||
public:
|
||||
virtual void SetUp() {
|
||||
printf("%s", "BarEnvironment::SetUp() called.\n");
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
printf("%s", "BarEnvironment::TearDown() called.\n");
|
||||
ADD_FAILURE() << "Expected non-fatal failure.";
|
||||
}
|
||||
};
|
||||
|
||||
// The main function.
|
||||
//
|
||||
// The idea is to use Google Test to run all the tests we have defined (some
|
||||
// of them are intended to fail), and then compare the test results
|
||||
// with the "golden" file.
|
||||
int main(int argc, char **argv) {
|
||||
// We just run the tests, knowing some of them are intended to fail.
|
||||
// We will use a separate Python script to compare the output of
|
||||
// this program with the golden file.
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
|
||||
// Skip the usual output capturing if we're running as the child
|
||||
// process of an threadsafe-style death test.
|
||||
freopen("/dev/null", "w", stdout);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Registers two global test environments.
|
||||
// The golden file verifies that they are set up in the order they
|
||||
// are registered, and torn down in the reverse order.
|
||||
testing::AddGlobalTestEnvironment(new FooEnvironment);
|
||||
testing::AddGlobalTestEnvironment(new BarEnvironment);
|
||||
|
||||
return RunAllTests();
|
||||
}
|
||||
@@ -0,0 +1,383 @@
|
||||
The non-test part of the code is expected to have 2 failures.
|
||||
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: 3
|
||||
Expected: 2
|
||||
[0;32m[==========] [mRunning 37 tests from 13 test cases.
|
||||
[0;32m[----------] [mGlobal test environment set-up.
|
||||
FooEnvironment::SetUp() called.
|
||||
BarEnvironment::SetUp() called.
|
||||
[0;32m[----------] [m3 tests from FatalFailureTest
|
||||
[0;32m[ RUN ] [mFatalFailureTest.FatalFailureInSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.FatalFailureInSubroutine
|
||||
[0;32m[ RUN ] [mFatalFailureTest.FatalFailureInNestedSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[0;32m[ RUN ] [mFatalFailureTest.NonfatalFailureInSubroutine
|
||||
(expecting a failure on false)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.NonfatalFailureInSubroutine
|
||||
[0;32m[----------] [m1 test from LoggingTest
|
||||
[0;32m[ RUN ] [mLoggingTest.InterleavingLoggingAndAssertions
|
||||
(expecting 2 failures on (3) >= (a[i]))
|
||||
i == 0
|
||||
i == 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Expected: (3) >= (a[i]), actual: 3 vs 9
|
||||
i == 2
|
||||
i == 3
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Expected: (3) >= (a[i]), actual: 3 vs 6
|
||||
[0;31m[ FAILED ] [mLoggingTest.InterleavingLoggingAndAssertions
|
||||
[0;32m[----------] [m5 tests from SCOPED_TRACETest
|
||||
[0;32m[ RUN ] [mSCOPED_TRACETest.ObeysScopes
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and shouldn't have a trace.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should have a trace.
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: Expected trace
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and shouldn't have a trace.
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.ObeysScopes
|
||||
[0;32m[ RUN ] [mSCOPED_TRACETest.WorksInLoop
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: i = 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: i = 2
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.WorksInLoop
|
||||
[0;32m[ RUN ] [mSCOPED_TRACETest.WorksInSubroutine
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: n = 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: n = 2
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.WorksInSubroutine
|
||||
[0;32m[ RUN ] [mSCOPED_TRACETest.CanBeNested
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: n = 2
|
||||
gtest_output_test_.cc:#:
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.CanBeNested
|
||||
[0;32m[ RUN ] [mSCOPED_TRACETest.CanBeRepeated
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A.
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A and B.
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and C.
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: C
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and D.
|
||||
Google Test trace:
|
||||
gtest_output_test_.cc:#: D
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.CanBeRepeated
|
||||
[0;32m[----------] [m1 test from NonFatalFailureInFixtureConstructorTest
|
||||
[0;32m[ RUN ] [mNonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
(expecting 5 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test body.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #4, in TearDown.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #5, in the test fixture d'tor.
|
||||
[0;31m[ FAILED ] [mNonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[0;32m[----------] [m1 test from FatalFailureInFixtureConstructorTest
|
||||
[0;32m[ RUN ] [mFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
(expecting 2 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in the test fixture d'tor.
|
||||
[0;31m[ FAILED ] [mFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[0;32m[----------] [m1 test from NonFatalFailureInSetUpTest
|
||||
[0;32m[ RUN ] [mNonFatalFailureInSetUpTest.FailureInSetUp
|
||||
(expecting 4 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in the test function.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #4, in the test fixture d'tor.
|
||||
[0;31m[ FAILED ] [mNonFatalFailureInSetUpTest.FailureInSetUp
|
||||
[0;32m[----------] [m1 test from FatalFailureInSetUpTest
|
||||
[0;32m[ RUN ] [mFatalFailureInSetUpTest.FailureInSetUp
|
||||
(expecting 3 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test fixture d'tor.
|
||||
[0;31m[ FAILED ] [mFatalFailureInSetUpTest.FailureInSetUp
|
||||
[0;32m[----------] [m4 tests from MixedUpTestCaseTest
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseTest.FirstTestFromNamespaceFoo
|
||||
[0;32m[ OK ] [mMixedUpTestCaseTest.FirstTestFromNamespaceFoo
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[0;32m[ OK ] [mMixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseTest.ThisShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseTest,
|
||||
you defined test FirstTestFromNamespaceFoo and test ThisShouldFail
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseTest.ThisShouldFail
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseTest.ThisShouldFailToo
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseTest,
|
||||
you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseTest.ThisShouldFailToo
|
||||
[0;32m[----------] [m2 tests from MixedUpTestCaseWithSameTestNameTest
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[0;32m[ OK ] [mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[0;32m[ RUN ] [mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseWithSameTestNameTest,
|
||||
you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[0;32m[----------] [m2 tests from TEST_F_before_TEST_in_same_test_case
|
||||
[0;32m[ RUN ] [mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
|
||||
[0;32m[ OK ] [mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
|
||||
[0;32m[ RUN ] [mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class, so mixing TEST_F and TEST in the same test case is
|
||||
illegal. In test case TEST_F_before_TEST_in_same_test_case,
|
||||
test DefinedUsingTEST_F is defined using TEST_F but
|
||||
test DefinedUsingTESTAndShouldFail is defined using TEST. You probably
|
||||
want to change the TEST to TEST_F or move it to another test
|
||||
case.
|
||||
[0;31m[ FAILED ] [mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
[0;32m[----------] [m2 tests from TEST_before_TEST_F_in_same_test_case
|
||||
[0;32m[ RUN ] [mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
|
||||
[0;32m[ OK ] [mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
|
||||
[0;32m[ RUN ] [mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class, so mixing TEST_F and TEST in the same test case is
|
||||
illegal. In test case TEST_before_TEST_F_in_same_test_case,
|
||||
test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but
|
||||
test DefinedUsingTEST is defined using TEST. You probably
|
||||
want to change the TEST to TEST_F or move it to another test
|
||||
case.
|
||||
[0;31m[ FAILED ] [mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
[0;32m[----------] [m7 tests from ExpectNonfatalFailureTest
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ OK ] [mExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.CanReferenceLocalVariables
|
||||
[0;32m[ OK ] [mExpectNonfatalFailureTest.CanReferenceLocalVariables
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
|
||||
[0;32m[ OK ] [mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure 1.
|
||||
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure 2.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[0;32m[----------] [m7 tests from ExpectFatalFailureTest
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ OK ] [mExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.CanReferenceLocalStaticVariables
|
||||
[0;32m[ OK ] [mExpectFatalFailureTest.CanReferenceLocalStaticVariables
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
|
||||
[0;32m[ OK ] [mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[0;32m[----------] [mGlobal test environment tear-down
|
||||
BarEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
FooEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
[0;32m[==========] [m37 tests from 13 test cases ran.
|
||||
[0;32m[ PASSED ] [m11 tests.
|
||||
[0;31m[ FAILED ] [m26 tests, listed below:
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.FatalFailureInSubroutine
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[0;31m[ FAILED ] [mFatalFailureTest.NonfatalFailureInSubroutine
|
||||
[0;31m[ FAILED ] [mLoggingTest.InterleavingLoggingAndAssertions
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.ObeysScopes
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.WorksInLoop
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.WorksInSubroutine
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.CanBeNested
|
||||
[0;31m[ FAILED ] [mSCOPED_TRACETest.CanBeRepeated
|
||||
[0;31m[ FAILED ] [mNonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[0;31m[ FAILED ] [mFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[0;31m[ FAILED ] [mNonFatalFailureInSetUpTest.FailureInSetUp
|
||||
[0;31m[ FAILED ] [mFatalFailureInSetUpTest.FailureInSetUp
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseTest.ThisShouldFail
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseTest.ThisShouldFailToo
|
||||
[0;31m[ FAILED ] [mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[0;31m[ FAILED ] [mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
[0;31m[ FAILED ] [mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
|
||||
26 FAILED TESTS
|
||||
@@ -0,0 +1,415 @@
|
||||
The non-test part of the code is expected to have 2 failures.
|
||||
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: 3
|
||||
Expected: 2
|
||||
[==========] Running 40 tests from 16 test cases.
|
||||
[----------] Global test environment set-up.
|
||||
FooEnvironment::SetUp() called.
|
||||
BarEnvironment::SetUp() called.
|
||||
[----------] 3 tests from FatalFailureTest
|
||||
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine
|
||||
[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
(expecting a failure on false)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
[----------] 1 test from LoggingTest
|
||||
[ RUN ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
(expecting 2 failures on (3) >= (a[i]))
|
||||
i == 0
|
||||
i == 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Expected: (3) >= (a[i]), actual: 3 vs 9
|
||||
i == 2
|
||||
i == 3
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Expected: (3) >= (a[i]), actual: 3 vs 6
|
||||
[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
[----------] 5 tests from SCOPED_TRACETest
|
||||
[ RUN ] SCOPED_TRACETest.ObeysScopes
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and shouldn't have a trace.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should have a trace.
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: Expected trace
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and shouldn't have a trace.
|
||||
[ FAILED ] SCOPED_TRACETest.ObeysScopes
|
||||
[ RUN ] SCOPED_TRACETest.WorksInLoop
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: i = 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: i = 2
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInLoop
|
||||
[ RUN ] SCOPED_TRACETest.WorksInSubroutine
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: n = 1
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: n = 2
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInSubroutine
|
||||
[ RUN ] SCOPED_TRACETest.CanBeNested
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: n = 2
|
||||
gtest_output_test_.cc:#:
|
||||
[ FAILED ] SCOPED_TRACETest.CanBeNested
|
||||
[ RUN ] SCOPED_TRACETest.CanBeRepeated
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A.
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A and B.
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and C.
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: C
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and D.
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: D
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
[ FAILED ] SCOPED_TRACETest.CanBeRepeated
|
||||
[----------] 1 test from NonFatalFailureInFixtureConstructorTest
|
||||
[ RUN ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
(expecting 5 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test body.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #4, in TearDown.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #5, in the test fixture d'tor.
|
||||
[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[----------] 1 test from FatalFailureInFixtureConstructorTest
|
||||
[ RUN ] FatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
(expecting 2 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in the test fixture d'tor.
|
||||
[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[----------] 1 test from NonFatalFailureInSetUpTest
|
||||
[ RUN ] NonFatalFailureInSetUpTest.FailureInSetUp
|
||||
(expecting 4 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in the test function.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #4, in the test fixture d'tor.
|
||||
[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp
|
||||
[----------] 1 test from FatalFailureInSetUpTest
|
||||
[ RUN ] FatalFailureInSetUpTest.FailureInSetUp
|
||||
(expecting 3 failures)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test fixture d'tor.
|
||||
[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp
|
||||
[----------] 1 test from ExceptionInFixtureCtorTest
|
||||
[ RUN ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor
|
||||
(expecting a failure on thrown exception in the test fixture's constructor)
|
||||
unknown file: Failure
|
||||
Exception thrown with code 0xc0000005 in the test fixture's constructor.
|
||||
[----------] 1 test from ExceptionInSetUpTest
|
||||
[ RUN ] ExceptionInSetUpTest.ExceptionInSetUp
|
||||
(expecting 3 failures)
|
||||
unknown file: Failure
|
||||
Exception thrown with code 0xc0000005 in SetUp().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test fixture d'tor.
|
||||
[ FAILED ] ExceptionInSetUpTest.ExceptionInSetUp
|
||||
[----------] 1 test from ExceptionInTestFunctionTest
|
||||
[ RUN ] ExceptionInTestFunctionTest.SEH
|
||||
(expecting 3 failures)
|
||||
unknown file: Failure
|
||||
Exception thrown with code 0xc0000005 in the test body.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in TearDown().
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test fixture d'tor.
|
||||
[ FAILED ] ExceptionInTestFunctionTest.SEH
|
||||
[----------] 4 tests from MixedUpTestCaseTest
|
||||
[ RUN ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
|
||||
[ OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
|
||||
[ RUN ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[ OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[ RUN ] MixedUpTestCaseTest.ThisShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseTest,
|
||||
you defined test FirstTestFromNamespaceFoo and test ThisShouldFail
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[ FAILED ] MixedUpTestCaseTest.ThisShouldFail
|
||||
[ RUN ] MixedUpTestCaseTest.ThisShouldFailToo
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseTest,
|
||||
you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo
|
||||
[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest
|
||||
[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[ OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class. However, in test case MixedUpTestCaseWithSameTestNameTest,
|
||||
you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail
|
||||
using two different test fixture classes. This can happen if
|
||||
the two classes are from different namespaces or translation
|
||||
units and have the same name. You should probably rename one
|
||||
of the classes to put the tests into different test cases.
|
||||
[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[----------] 2 tests from TEST_F_before_TEST_in_same_test_case
|
||||
[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
|
||||
[ OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
|
||||
[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class, so mixing TEST_F and TEST in the same test case is
|
||||
illegal. In test case TEST_F_before_TEST_in_same_test_case,
|
||||
test DefinedUsingTEST_F is defined using TEST_F but
|
||||
test DefinedUsingTESTAndShouldFail is defined using TEST. You probably
|
||||
want to change the TEST to TEST_F or move it to another test
|
||||
case.
|
||||
[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
[----------] 2 tests from TEST_before_TEST_F_in_same_test_case
|
||||
[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
|
||||
[ OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
|
||||
[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
gtest.cc:#: Failure
|
||||
Failed
|
||||
All tests in the same test case must use the same test fixture
|
||||
class, so mixing TEST_F and TEST in the same test case is
|
||||
illegal. In test case TEST_before_TEST_F_in_same_test_case,
|
||||
test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but
|
||||
test DefinedUsingTEST is defined using TEST. You probably
|
||||
want to change the TEST to TEST_F or move it to another test
|
||||
case.
|
||||
[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
[----------] 7 tests from ExpectNonfatalFailureTest
|
||||
[ RUN ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[ OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[ RUN ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
|
||||
[ OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
|
||||
[ RUN ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
|
||||
[ OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure 1.
|
||||
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure 2.
|
||||
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[----------] 7 tests from ExpectFatalFailureTest
|
||||
[ RUN ] ExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[ OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[ RUN ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
|
||||
[ OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
|
||||
[ RUN ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
|
||||
[ OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[----------] Global test environment tear-down
|
||||
BarEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
FooEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
[==========] 40 tests from 16 test cases ran.
|
||||
[ PASSED ] 11 tests.
|
||||
[ FAILED ] 29 tests, listed below:
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
[ FAILED ] SCOPED_TRACETest.ObeysScopes
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInLoop
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInSubroutine
|
||||
[ FAILED ] SCOPED_TRACETest.CanBeNested
|
||||
[ FAILED ] SCOPED_TRACETest.CanBeRepeated
|
||||
[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp
|
||||
[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp
|
||||
[ FAILED ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor
|
||||
[ FAILED ] ExceptionInSetUpTest.ExceptionInSetUp
|
||||
[ FAILED ] ExceptionInTestFunctionTest.SEH
|
||||
[ FAILED ] MixedUpTestCaseTest.ThisShouldFail
|
||||
[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo
|
||||
[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
|
||||
[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
|
||||
29 FAILED TESTS
|
||||
@@ -0,0 +1,2432 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on 06/11/2008 by command
|
||||
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
|
||||
|
||||
// Regression test for gtest_pred_impl.h
|
||||
//
|
||||
// This file is generated by a script and quite long. If you intend to
|
||||
// learn how Google Test works by reading its unit tests, read
|
||||
// gtest_unittest.cc instead.
|
||||
//
|
||||
// This is intended as a regression test for the Google Test predicate
|
||||
// assertions. We compile it as part of the gtest_unittest target
|
||||
// only to keep the implementation tidy and compact, as it is quite
|
||||
// involved to set up the stage for testing Google Test using Google
|
||||
// Test itself.
|
||||
//
|
||||
// Currently, gtest_unittest takes ~11 seconds to run in the testing
|
||||
// daemon. In the future, if it grows too large and needs much more
|
||||
// time to finish, we should consider separating this file into a
|
||||
// stand-alone regression test.
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
// A user-defined data type.
|
||||
struct Bool {
|
||||
explicit Bool(int val) : value(val != 0) {}
|
||||
|
||||
bool operator>(int n) const { return value > Bool(n).value; }
|
||||
|
||||
Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
|
||||
|
||||
bool operator==(const Bool& rhs) const { return value == rhs.value; }
|
||||
|
||||
bool value;
|
||||
};
|
||||
|
||||
// Enables Bool to be used in assertions.
|
||||
std::ostream& operator<<(std::ostream& os, const Bool& x) {
|
||||
return os << (x.value ? "true" : "false");
|
||||
}
|
||||
|
||||
// Sample functions/functors for testing unary predicate assertions.
|
||||
|
||||
// A unary predicate function.
|
||||
template <typename T1>
|
||||
bool PredFunction1(T1 v1) {
|
||||
return v1 > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction1Int(int v1) {
|
||||
return v1 > 0;
|
||||
}
|
||||
bool PredFunction1Bool(Bool v1) {
|
||||
return v1 > 0;
|
||||
}
|
||||
|
||||
// A unary predicate functor.
|
||||
struct PredFunctor1 {
|
||||
template <typename T1>
|
||||
bool operator()(const T1& v1) {
|
||||
return v1 > 0;
|
||||
}
|
||||
};
|
||||
|
||||
// A unary predicate-formatter function.
|
||||
template <typename T1>
|
||||
testing::AssertionResult PredFormatFunction1(const char* e1,
|
||||
const T1& v1) {
|
||||
if (PredFunction1(v1))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< v1 << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A unary predicate-formatter functor.
|
||||
struct PredFormatFunctor1 {
|
||||
template <typename T1>
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const T1& v1) const {
|
||||
return PredFormatFunction1(e1, v1);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.
|
||||
|
||||
class Predicate1Test : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;
|
||||
n1_ = 0;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once.
|
||||
EXPECT_EQ(1, n1_) <<
|
||||
"The predicate assertion didn't evaluate argument 2 "
|
||||
"exactly once.";
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
|
||||
static int n1_;
|
||||
};
|
||||
|
||||
bool Predicate1Test::expected_to_finish_;
|
||||
bool Predicate1Test::finished_;
|
||||
int Predicate1Test::n1_;
|
||||
|
||||
typedef Predicate1Test EXPECT_PRED_FORMAT1Test;
|
||||
typedef Predicate1Test ASSERT_PRED_FORMAT1Test;
|
||||
typedef Predicate1Test EXPECT_PRED1Test;
|
||||
typedef Predicate1Test ASSERT_PRED1Test;
|
||||
|
||||
// Tests a successful EXPECT_PRED1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED1(PredFunction1Int,
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED1(PredFunction1Bool,
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED1(PredFunctor1(),
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED1(PredFunctor1(),
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED1(PredFunction1Int,
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED1(PredFunction1Bool,
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED1(PredFunctor1(),
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED1(PredFunctor1(),
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED1(PredFunction1Int,
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED1(PredFunction1Bool,
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED1(PredFunctor1(),
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED1(PredFunctor1(),
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED1(PredFunction1Int,
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED1(PredFunction1Bool,
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED1(PredFunctor1(),
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED1(PredFunctor1(),
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunction1,
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunction1,
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunction1,
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunction1,
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunction1,
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunction1,
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
++n1_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
Bool(++n1_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunction1,
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunction1,
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
n1_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT1 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
|
||||
Bool(n1_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
// Sample functions/functors for testing binary predicate assertions.
|
||||
|
||||
// A binary predicate function.
|
||||
template <typename T1, typename T2>
|
||||
bool PredFunction2(T1 v1, T2 v2) {
|
||||
return v1 + v2 > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction2Int(int v1, int v2) {
|
||||
return v1 + v2 > 0;
|
||||
}
|
||||
bool PredFunction2Bool(Bool v1, Bool v2) {
|
||||
return v1 + v2 > 0;
|
||||
}
|
||||
|
||||
// A binary predicate functor.
|
||||
struct PredFunctor2 {
|
||||
template <typename T1, typename T2>
|
||||
bool operator()(const T1& v1,
|
||||
const T2& v2) {
|
||||
return v1 + v2 > 0;
|
||||
}
|
||||
};
|
||||
|
||||
// A binary predicate-formatter function.
|
||||
template <typename T1, typename T2>
|
||||
testing::AssertionResult PredFormatFunction2(const char* e1,
|
||||
const char* e2,
|
||||
const T1& v1,
|
||||
const T2& v2) {
|
||||
if (PredFunction2(v1, v2))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< v1 + v2 << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A binary predicate-formatter functor.
|
||||
struct PredFormatFunctor2 {
|
||||
template <typename T1, typename T2>
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const char* e2,
|
||||
const T1& v1,
|
||||
const T2& v2) const {
|
||||
return PredFormatFunction2(e1, e2, v1, v2);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.
|
||||
|
||||
class Predicate2Test : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;
|
||||
n1_ = n2_ = 0;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once.
|
||||
EXPECT_EQ(1, n1_) <<
|
||||
"The predicate assertion didn't evaluate argument 2 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n2_) <<
|
||||
"The predicate assertion didn't evaluate argument 3 "
|
||||
"exactly once.";
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
|
||||
static int n1_;
|
||||
static int n2_;
|
||||
};
|
||||
|
||||
bool Predicate2Test::expected_to_finish_;
|
||||
bool Predicate2Test::finished_;
|
||||
int Predicate2Test::n1_;
|
||||
int Predicate2Test::n2_;
|
||||
|
||||
typedef Predicate2Test EXPECT_PRED_FORMAT2Test;
|
||||
typedef Predicate2Test ASSERT_PRED_FORMAT2Test;
|
||||
typedef Predicate2Test EXPECT_PRED2Test;
|
||||
typedef Predicate2Test ASSERT_PRED2Test;
|
||||
|
||||
// Tests a successful EXPECT_PRED2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED2(PredFunction2Int,
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED2(PredFunction2Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED2(PredFunctor2(),
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED2(PredFunctor2(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED2(PredFunction2Int,
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED2(PredFunction2Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED2(PredFunctor2(),
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED2(PredFunctor2(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED2(PredFunction2Int,
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED2(PredFunction2Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED2(PredFunctor2(),
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED2(PredFunctor2(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED2(PredFunction2Int,
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED2(PredFunction2Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED2(PredFunctor2(),
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED2(PredFunctor2(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunction2,
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunction2,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunction2,
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunction2,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunction2,
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunction2,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
++n1_,
|
||||
++n2_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunction2,
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunction2,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
n1_++,
|
||||
n2_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT2 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
// Sample functions/functors for testing ternary predicate assertions.
|
||||
|
||||
// A ternary predicate function.
|
||||
template <typename T1, typename T2, typename T3>
|
||||
bool PredFunction3(T1 v1, T2 v2, T3 v3) {
|
||||
return v1 + v2 + v3 > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction3Int(int v1, int v2, int v3) {
|
||||
return v1 + v2 + v3 > 0;
|
||||
}
|
||||
bool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {
|
||||
return v1 + v2 + v3 > 0;
|
||||
}
|
||||
|
||||
// A ternary predicate functor.
|
||||
struct PredFunctor3 {
|
||||
template <typename T1, typename T2, typename T3>
|
||||
bool operator()(const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3) {
|
||||
return v1 + v2 + v3 > 0;
|
||||
}
|
||||
};
|
||||
|
||||
// A ternary predicate-formatter function.
|
||||
template <typename T1, typename T2, typename T3>
|
||||
testing::AssertionResult PredFormatFunction3(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3) {
|
||||
if (PredFunction3(v1, v2, v3))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2 << " + " << e3
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< v1 + v2 + v3 << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A ternary predicate-formatter functor.
|
||||
struct PredFormatFunctor3 {
|
||||
template <typename T1, typename T2, typename T3>
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3) const {
|
||||
return PredFormatFunction3(e1, e2, e3, v1, v2, v3);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.
|
||||
|
||||
class Predicate3Test : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;
|
||||
n1_ = n2_ = n3_ = 0;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once.
|
||||
EXPECT_EQ(1, n1_) <<
|
||||
"The predicate assertion didn't evaluate argument 2 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n2_) <<
|
||||
"The predicate assertion didn't evaluate argument 3 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n3_) <<
|
||||
"The predicate assertion didn't evaluate argument 4 "
|
||||
"exactly once.";
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
|
||||
static int n1_;
|
||||
static int n2_;
|
||||
static int n3_;
|
||||
};
|
||||
|
||||
bool Predicate3Test::expected_to_finish_;
|
||||
bool Predicate3Test::finished_;
|
||||
int Predicate3Test::n1_;
|
||||
int Predicate3Test::n2_;
|
||||
int Predicate3Test::n3_;
|
||||
|
||||
typedef Predicate3Test EXPECT_PRED_FORMAT3Test;
|
||||
typedef Predicate3Test ASSERT_PRED_FORMAT3Test;
|
||||
typedef Predicate3Test EXPECT_PRED3Test;
|
||||
typedef Predicate3Test ASSERT_PRED3Test;
|
||||
|
||||
// Tests a successful EXPECT_PRED3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED3(PredFunction3Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED3(PredFunction3Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED3(PredFunctor3(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED3(PredFunctor3(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED3(PredFunction3Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED3(PredFunction3Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED3(PredFunctor3(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED3(PredFunctor3(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED3(PredFunction3Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED3(PredFunction3Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED3(PredFunctor3(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED3(PredFunctor3(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED3(PredFunction3Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED3(PredFunction3Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED3(PredFunctor3(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED3(PredFunctor3(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunction3,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunction3,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunction3,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunction3,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunction3,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunction3,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunction3,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunction3,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT3 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
// Sample functions/functors for testing 4-ary predicate assertions.
|
||||
|
||||
// A 4-ary predicate function.
|
||||
template <typename T1, typename T2, typename T3, typename T4>
|
||||
bool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {
|
||||
return v1 + v2 + v3 + v4 > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction4Int(int v1, int v2, int v3, int v4) {
|
||||
return v1 + v2 + v3 + v4 > 0;
|
||||
}
|
||||
bool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {
|
||||
return v1 + v2 + v3 + v4 > 0;
|
||||
}
|
||||
|
||||
// A 4-ary predicate functor.
|
||||
struct PredFunctor4 {
|
||||
template <typename T1, typename T2, typename T3, typename T4>
|
||||
bool operator()(const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4) {
|
||||
return v1 + v2 + v3 + v4 > 0;
|
||||
}
|
||||
};
|
||||
|
||||
// A 4-ary predicate-formatter function.
|
||||
template <typename T1, typename T2, typename T3, typename T4>
|
||||
testing::AssertionResult PredFormatFunction4(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4) {
|
||||
if (PredFunction4(v1, v2, v3, v4))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< v1 + v2 + v3 + v4 << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A 4-ary predicate-formatter functor.
|
||||
struct PredFormatFunctor4 {
|
||||
template <typename T1, typename T2, typename T3, typename T4>
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4) const {
|
||||
return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.
|
||||
|
||||
class Predicate4Test : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;
|
||||
n1_ = n2_ = n3_ = n4_ = 0;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once.
|
||||
EXPECT_EQ(1, n1_) <<
|
||||
"The predicate assertion didn't evaluate argument 2 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n2_) <<
|
||||
"The predicate assertion didn't evaluate argument 3 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n3_) <<
|
||||
"The predicate assertion didn't evaluate argument 4 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n4_) <<
|
||||
"The predicate assertion didn't evaluate argument 5 "
|
||||
"exactly once.";
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
|
||||
static int n1_;
|
||||
static int n2_;
|
||||
static int n3_;
|
||||
static int n4_;
|
||||
};
|
||||
|
||||
bool Predicate4Test::expected_to_finish_;
|
||||
bool Predicate4Test::finished_;
|
||||
int Predicate4Test::n1_;
|
||||
int Predicate4Test::n2_;
|
||||
int Predicate4Test::n3_;
|
||||
int Predicate4Test::n4_;
|
||||
|
||||
typedef Predicate4Test EXPECT_PRED_FORMAT4Test;
|
||||
typedef Predicate4Test ASSERT_PRED_FORMAT4Test;
|
||||
typedef Predicate4Test EXPECT_PRED4Test;
|
||||
typedef Predicate4Test ASSERT_PRED4Test;
|
||||
|
||||
// Tests a successful EXPECT_PRED4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED4(PredFunction4Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED4(PredFunction4Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED4(PredFunctor4(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED4(PredFunctor4(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED4(PredFunction4Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED4(PredFunction4Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED4(PredFunctor4(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED4(PredFunctor4(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED4(PredFunction4Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED4(PredFunction4Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED4(PredFunctor4(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED4(PredFunctor4(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED4(PredFunction4Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED4(PredFunction4Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED4(PredFunctor4(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED4(PredFunctor4(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunction4,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunction4,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunction4,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunction4,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunction4,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunction4,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunction4,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunction4,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT4 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
// Sample functions/functors for testing 5-ary predicate assertions.
|
||||
|
||||
// A 5-ary predicate function.
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||
bool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {
|
||||
return v1 + v2 + v3 + v4 + v5 > 0;
|
||||
}
|
||||
|
||||
// The following two functions are needed to circumvent a bug in
|
||||
// gcc 2.95.3, which sometimes has problem with the above template
|
||||
// function.
|
||||
bool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {
|
||||
return v1 + v2 + v3 + v4 + v5 > 0;
|
||||
}
|
||||
bool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {
|
||||
return v1 + v2 + v3 + v4 + v5 > 0;
|
||||
}
|
||||
|
||||
// A 5-ary predicate functor.
|
||||
struct PredFunctor5 {
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||
bool operator()(const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4,
|
||||
const T5& v5) {
|
||||
return v1 + v2 + v3 + v4 + v5 > 0;
|
||||
}
|
||||
};
|
||||
|
||||
// A 5-ary predicate-formatter function.
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||
testing::AssertionResult PredFormatFunction5(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const char* e5,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4,
|
||||
const T5& v5) {
|
||||
if (PredFunction5(v1, v2, v3, v4, v5))
|
||||
return testing::AssertionSuccess();
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
|
||||
<< " is expected to be positive, but evaluates to "
|
||||
<< v1 + v2 + v3 + v4 + v5 << ".";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A 5-ary predicate-formatter functor.
|
||||
struct PredFormatFunctor5 {
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const char* e5,
|
||||
const T1& v1,
|
||||
const T2& v2,
|
||||
const T3& v3,
|
||||
const T4& v4,
|
||||
const T5& v5) const {
|
||||
return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.
|
||||
|
||||
class Predicate5Test : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
expected_to_finish_ = true;
|
||||
finished_ = false;
|
||||
n1_ = n2_ = n3_ = n4_ = n5_ = 0;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Verifies that each of the predicate's arguments was evaluated
|
||||
// exactly once.
|
||||
EXPECT_EQ(1, n1_) <<
|
||||
"The predicate assertion didn't evaluate argument 2 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n2_) <<
|
||||
"The predicate assertion didn't evaluate argument 3 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n3_) <<
|
||||
"The predicate assertion didn't evaluate argument 4 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n4_) <<
|
||||
"The predicate assertion didn't evaluate argument 5 "
|
||||
"exactly once.";
|
||||
EXPECT_EQ(1, n5_) <<
|
||||
"The predicate assertion didn't evaluate argument 6 "
|
||||
"exactly once.";
|
||||
|
||||
// Verifies that the control flow in the test function is expected.
|
||||
if (expected_to_finish_ && !finished_) {
|
||||
FAIL() << "The predicate assertion unexpactedly aborted the test.";
|
||||
} else if (!expected_to_finish_ && finished_) {
|
||||
FAIL() << "The failed predicate assertion didn't abort the test "
|
||||
"as expected.";
|
||||
}
|
||||
}
|
||||
|
||||
// true iff the test function is expected to run to finish.
|
||||
static bool expected_to_finish_;
|
||||
|
||||
// true iff the test function did run to finish.
|
||||
static bool finished_;
|
||||
|
||||
static int n1_;
|
||||
static int n2_;
|
||||
static int n3_;
|
||||
static int n4_;
|
||||
static int n5_;
|
||||
};
|
||||
|
||||
bool Predicate5Test::expected_to_finish_;
|
||||
bool Predicate5Test::finished_;
|
||||
int Predicate5Test::n1_;
|
||||
int Predicate5Test::n2_;
|
||||
int Predicate5Test::n3_;
|
||||
int Predicate5Test::n4_;
|
||||
int Predicate5Test::n5_;
|
||||
|
||||
typedef Predicate5Test EXPECT_PRED_FORMAT5Test;
|
||||
typedef Predicate5Test ASSERT_PRED_FORMAT5Test;
|
||||
typedef Predicate5Test EXPECT_PRED5Test;
|
||||
typedef Predicate5Test ASSERT_PRED5Test;
|
||||
|
||||
// Tests a successful EXPECT_PRED5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED5(PredFunction5Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED5(PredFunction5Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED5(PredFunctor5(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED5(PredFunctor5(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED5(PredFunction5Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED5(PredFunction5Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED5(PredFunctor5(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED5(PredFunctor5(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED5(PredFunction5Int,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED5(PredFunction5Bool,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED5(PredFunctor5(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED5(PredFunctor5(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED5(PredFunction5Int,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED5(PredFunction5Bool,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED5(PredFunctor5(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED5(PredFunctor5(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunction5,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunction5,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunction5,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunction5,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed EXPECT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunction5,
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunction5,
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
++n1_,
|
||||
++n2_,
|
||||
++n3_,
|
||||
++n4_,
|
||||
++n5_);
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a successful ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
Bool(++n1_),
|
||||
Bool(++n2_),
|
||||
Bool(++n3_),
|
||||
Bool(++n4_),
|
||||
Bool(++n5_));
|
||||
finished_ = true;
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunction5,
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a function on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunction5,
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a built-in type (int).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
n1_++,
|
||||
n2_++,
|
||||
n3_++,
|
||||
n4_++,
|
||||
n5_++);
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
|
||||
// Tests a failed ASSERT_PRED_FORMAT5 where the
|
||||
// predicate-formatter is a functor on a user-defined type (Bool).
|
||||
TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
|
||||
expected_to_finish_ = false;
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
|
||||
Bool(n1_++),
|
||||
Bool(n2_++),
|
||||
Bool(n3_++),
|
||||
Bool(n4_++),
|
||||
Bool(n5_++));
|
||||
finished_ = true;
|
||||
}, "");
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Unit test for include/gtest/gtest_prod.h.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include "test/production.h"
|
||||
|
||||
// Tests that private members can be accessed from a TEST declared as
|
||||
// a friend of the class.
|
||||
TEST(PrivateCodeTest, CanAccessPrivateMembers) {
|
||||
PrivateCode a;
|
||||
EXPECT_EQ(0, a.x_);
|
||||
|
||||
a.set_x(1);
|
||||
EXPECT_EQ(1, a.x_);
|
||||
}
|
||||
|
||||
typedef testing::Test PrivateCodeFixtureTest;
|
||||
|
||||
// Tests that private members can be accessed from a TEST_F declared
|
||||
// as a friend of the class.
|
||||
TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {
|
||||
PrivateCode a;
|
||||
EXPECT_EQ(0, a.x_);
|
||||
|
||||
a.set_x(2);
|
||||
EXPECT_EQ(2, a.x_);
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Tests the --gtest_repeat=number flag.
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
|
||||
GTEST_DECLARE_string(death_test_style);
|
||||
GTEST_DECLARE_string(filter);
|
||||
GTEST_DECLARE_int32(repeat);
|
||||
|
||||
} // namespace testing
|
||||
|
||||
using testing::GTEST_FLAG(death_test_style);
|
||||
using testing::GTEST_FLAG(filter);
|
||||
using testing::GTEST_FLAG(repeat);
|
||||
|
||||
namespace {
|
||||
|
||||
#define GTEST_CHECK_INT_EQ_(expected, actual) \
|
||||
do {\
|
||||
const int expected_val = (expected);\
|
||||
const int actual_val = (actual);\
|
||||
if (expected_val != actual_val) {\
|
||||
::std::cout << "Value of: " #actual "\n"\
|
||||
<< " Actual: " << actual_val << "\n"\
|
||||
<< "Expected: " #expected "\n"\
|
||||
<< "Which is: " << expected_val << "\n";\
|
||||
abort();\
|
||||
}\
|
||||
} while(false)
|
||||
|
||||
|
||||
// Used for verifying that global environment set-up and tear-down are
|
||||
// inside the gtest_repeat loop.
|
||||
|
||||
int g_environment_set_up_count = 0;
|
||||
int g_environment_tear_down_count = 0;
|
||||
|
||||
class MyEnvironment : public testing::Environment {
|
||||
public:
|
||||
MyEnvironment() {}
|
||||
virtual void SetUp() { g_environment_set_up_count++; }
|
||||
virtual void TearDown() { g_environment_tear_down_count++; }
|
||||
};
|
||||
|
||||
// A test that should fail.
|
||||
|
||||
int g_should_fail_count = 0;
|
||||
|
||||
TEST(FooTest, ShouldFail) {
|
||||
g_should_fail_count++;
|
||||
EXPECT_EQ(0, 1) << "Expected failure.";
|
||||
}
|
||||
|
||||
// A test that should pass.
|
||||
|
||||
int g_should_pass_count = 0;
|
||||
|
||||
TEST(FooTest, ShouldPass) {
|
||||
g_should_pass_count++;
|
||||
}
|
||||
|
||||
// A test that contains a thread-safe death test and a fast death
|
||||
// test. It should pass.
|
||||
|
||||
int g_death_test_count = 0;
|
||||
|
||||
TEST(BarDeathTest, ThreadSafeAndFast) {
|
||||
g_death_test_count++;
|
||||
|
||||
GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
EXPECT_DEATH(abort(), "");
|
||||
|
||||
GTEST_FLAG(death_test_style) = "fast";
|
||||
EXPECT_DEATH(abort(), "");
|
||||
}
|
||||
|
||||
// Resets the count for each test.
|
||||
void ResetCounts() {
|
||||
g_environment_set_up_count = 0;
|
||||
g_environment_tear_down_count = 0;
|
||||
g_should_fail_count = 0;
|
||||
g_should_pass_count = 0;
|
||||
g_death_test_count = 0;
|
||||
}
|
||||
|
||||
// Checks that the count for each test is expected.
|
||||
void CheckCounts(int expected) {
|
||||
// We cannot use Google Test assertions here since we are testing Google Test
|
||||
// itself.
|
||||
GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
|
||||
GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
|
||||
GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
|
||||
GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
|
||||
GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
|
||||
}
|
||||
|
||||
// Tests the behavior of Google Test when --gtest_repeat is not specified.
|
||||
void TestRepeatUnspecified() {
|
||||
ResetCounts();
|
||||
GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
|
||||
CheckCounts(1);
|
||||
}
|
||||
|
||||
// Tests the behavior of Google Test when --gtest_repeat has the given value.
|
||||
void TestRepeat(int repeat) {
|
||||
GTEST_FLAG(repeat) = repeat;
|
||||
|
||||
ResetCounts();
|
||||
GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
|
||||
CheckCounts(repeat);
|
||||
}
|
||||
|
||||
// Tests using --gtest_repeat when --gtest_filter specifies an empty
|
||||
// set of tests.
|
||||
void TestRepeatWithEmptyFilter(int repeat) {
|
||||
GTEST_FLAG(repeat) = repeat;
|
||||
GTEST_FLAG(filter) = "None";
|
||||
|
||||
ResetCounts();
|
||||
GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
|
||||
CheckCounts(0);
|
||||
}
|
||||
|
||||
// Tests using --gtest_repeat when --gtest_filter specifies a set of
|
||||
// successful tests.
|
||||
void TestRepeatWithFilterForSuccessfulTests(int repeat) {
|
||||
GTEST_FLAG(repeat) = repeat;
|
||||
GTEST_FLAG(filter) = "*-*ShouldFail";
|
||||
|
||||
ResetCounts();
|
||||
GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
|
||||
GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
|
||||
}
|
||||
|
||||
// Tests using --gtest_repeat when --gtest_filter specifies a set of
|
||||
// failed tests.
|
||||
void TestRepeatWithFilterForFailedTests(int repeat) {
|
||||
GTEST_FLAG(repeat) = repeat;
|
||||
GTEST_FLAG(filter) = "*ShouldFail";
|
||||
|
||||
ResetCounts();
|
||||
GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
|
||||
GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
|
||||
GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
|
||||
GTEST_CHECK_INT_EQ_(0, g_death_test_count);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
testing::AddGlobalTestEnvironment(new MyEnvironment);
|
||||
|
||||
TestRepeatUnspecified();
|
||||
TestRepeat(0);
|
||||
TestRepeat(1);
|
||||
TestRepeat(5);
|
||||
|
||||
TestRepeatWithEmptyFilter(2);
|
||||
TestRepeatWithEmptyFilter(3);
|
||||
|
||||
TestRepeatWithFilterForSuccessfulTests(3);
|
||||
|
||||
TestRepeatWithFilterForFailedTests(4);
|
||||
|
||||
// It would be nice to verify that the tests indeed loop forever
|
||||
// when GTEST_FLAG(repeat) is negative, but this test will be quite
|
||||
// complicated to write. Since this flag is for interactive
|
||||
// debugging only and doesn't affect the normal test result, such a
|
||||
// test would be an overkill.
|
||||
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
// Copyright 2007, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Tests that SCOPED_TRACE() and various Google Test assertions can be
|
||||
// used in a large number of threads concurrently.
|
||||
|
||||
#include <iostream>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// We must define this macro in order to #include
|
||||
// gtest-internal-inl.h. This is how Google Test prevents a user from
|
||||
// accidentally depending on its internal implementation.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
namespace {
|
||||
|
||||
using internal::List;
|
||||
using internal::ListNode;
|
||||
using internal::String;
|
||||
using internal::TestProperty;
|
||||
using internal::TestPropertyKeyIs;
|
||||
|
||||
// How many threads to create?
|
||||
const int kThreadCount = 50;
|
||||
|
||||
String IdToKey(int id, const char* suffix) {
|
||||
Message key;
|
||||
key << "key_" << id << "_" << suffix;
|
||||
return key.GetString();
|
||||
}
|
||||
|
||||
String IdToString(int id) {
|
||||
Message id_message;
|
||||
id_message << id;
|
||||
return id_message.GetString();
|
||||
}
|
||||
|
||||
void ExpectKeyAndValueWereRecordedForId(const List<TestProperty>& properties,
|
||||
int id,
|
||||
const char* suffix) {
|
||||
TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());
|
||||
const ListNode<TestProperty>* node = properties.FindIf(matches_key);
|
||||
EXPECT_TRUE(node != NULL) << "expecting " << suffix << " node for id " << id;
|
||||
EXPECT_STREQ(IdToString(id).c_str(), node->element().value());
|
||||
}
|
||||
|
||||
// Calls a large number of Google Test assertions, where exactly one of them
|
||||
// will fail.
|
||||
void ManyAsserts(int id) {
|
||||
::std::cout << "Thread #" << id << " running...\n";
|
||||
|
||||
SCOPED_TRACE(Message() << "Thread #" << id);
|
||||
|
||||
for (int i = 0; i < kThreadCount; i++) {
|
||||
SCOPED_TRACE(Message() << "Iteration #" << i);
|
||||
|
||||
// A bunch of assertions that should succeed.
|
||||
EXPECT_TRUE(true);
|
||||
ASSERT_FALSE(false) << "This shouldn't fail.";
|
||||
EXPECT_STREQ("a", "a");
|
||||
ASSERT_LE(5, 6);
|
||||
EXPECT_EQ(i, i) << "This shouldn't fail.";
|
||||
|
||||
// RecordProperty() should interact safely with other threads as well.
|
||||
// The shared_key forces property updates.
|
||||
Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str());
|
||||
Test::RecordProperty(IdToKey(id, "int").c_str(), id);
|
||||
Test::RecordProperty("shared_key", IdToString(id).c_str());
|
||||
|
||||
// This assertion should fail kThreadCount times per thread. It
|
||||
// is for testing whether Google Test can handle failed assertions in a
|
||||
// multi-threaded context.
|
||||
EXPECT_LT(i, 0) << "This should always fail.";
|
||||
}
|
||||
}
|
||||
|
||||
// Tests using SCOPED_TRACE() and Google Test assertions in many threads
|
||||
// concurrently.
|
||||
TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {
|
||||
// TODO(wan): when Google Test is made thread-safe, run
|
||||
// ManyAsserts() in many threads here.
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Executable
+106
@@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test utilities for Google C++ Testing Framework."""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
# Initially maps a flag to its default value. After
|
||||
# _ParseAndStripGTestFlags() is called, maps a flag to its actual
|
||||
# value.
|
||||
_flag_map = {'gtest_source_dir': os.path.dirname(sys.argv[0]),
|
||||
'gtest_build_dir': os.path.dirname(sys.argv[0])}
|
||||
_gtest_flags_are_parsed = False
|
||||
|
||||
|
||||
def _ParseAndStripGTestFlags(argv):
|
||||
"""Parses and strips Google Test flags from argv. This is idempotent."""
|
||||
|
||||
global _gtest_flags_are_parsed
|
||||
if _gtest_flags_are_parsed:
|
||||
return
|
||||
|
||||
_gtest_flags_are_parsed = True
|
||||
for flag in _flag_map:
|
||||
# The environment variable overrides the default value.
|
||||
if flag.upper() in os.environ:
|
||||
_flag_map[flag] = os.environ[flag.upper()]
|
||||
|
||||
# The command line flag overrides the environment variable.
|
||||
i = 1 # Skips the program name.
|
||||
while i < len(argv):
|
||||
prefix = '--' + flag + '='
|
||||
if argv[i].startswith(prefix):
|
||||
_flag_map[flag] = argv[i][len(prefix):]
|
||||
del argv[i]
|
||||
break
|
||||
else:
|
||||
# We don't increment i in case we just found a --gtest_* flag
|
||||
# and removed it from argv.
|
||||
i += 1
|
||||
|
||||
|
||||
def GetFlag(flag):
|
||||
"""Returns the value of the given flag."""
|
||||
|
||||
# In case GetFlag() is called before Main(), we always call
|
||||
# _ParseAndStripGTestFlags() here to make sure the --gtest_* flags
|
||||
# are parsed.
|
||||
_ParseAndStripGTestFlags(sys.argv)
|
||||
|
||||
return _flag_map[flag]
|
||||
|
||||
|
||||
def GetSourceDir():
|
||||
"""Returns the absolute path of the directory where the .py files are."""
|
||||
|
||||
return os.path.abspath(GetFlag('gtest_source_dir'))
|
||||
|
||||
|
||||
def GetBuildDir():
|
||||
"""Returns the absolute path of the directory where the test binaries are."""
|
||||
|
||||
return os.path.abspath(GetFlag('gtest_build_dir'))
|
||||
|
||||
|
||||
def Main():
|
||||
"""Runs the unit test."""
|
||||
|
||||
# We must call _ParseAndStripGTestFlags() before calling
|
||||
# unittest.main(). Otherwise the latter will be confused by the
|
||||
# --gtest_* flags.
|
||||
_ParseAndStripGTestFlags(sys.argv)
|
||||
unittest.main()
|
||||
Executable
+110
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2008, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Verifies that Google Test warns the user when not initialized properly."""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
IS_WINDOWS = os.name == 'nt'
|
||||
IS_LINUX = os.name == 'posix'
|
||||
|
||||
if IS_WINDOWS:
|
||||
BUILD_DIRS = [
|
||||
'build.dbg\\',
|
||||
'build.opt\\',
|
||||
'build.dbg8\\',
|
||||
'build.opt8\\',
|
||||
]
|
||||
COMMAND = 'gtest_uninitialized_test_.exe'
|
||||
|
||||
if IS_LINUX:
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_uninitialized_test_')
|
||||
|
||||
|
||||
def Assert(condition):
|
||||
if not condition:
|
||||
raise AssertionError
|
||||
|
||||
|
||||
def AssertEq(expected, actual):
|
||||
if expected != actual:
|
||||
print 'Expected: %s' % (expected,)
|
||||
print ' Actual: %s' % (actual,)
|
||||
raise AssertionError
|
||||
|
||||
|
||||
def GetOutput(command):
|
||||
"""Runs the given command and returns its output."""
|
||||
|
||||
stdin, stdout = os.popen2(command, 't')
|
||||
stdin.close()
|
||||
output = stdout.read()
|
||||
stdout.close()
|
||||
return output
|
||||
|
||||
|
||||
def TestExitCodeAndOutput(command):
|
||||
"""Runs the given command and verifies its exit code and output."""
|
||||
|
||||
# 256 corresponds to return code 0.
|
||||
AssertEq(256, os.system(command))
|
||||
output = GetOutput(command)
|
||||
Assert('InitGoogleTest' in output)
|
||||
|
||||
|
||||
if IS_WINDOWS:
|
||||
|
||||
def main():
|
||||
for build_dir in BUILD_DIRS:
|
||||
command = build_dir + COMMAND
|
||||
print 'Testing with %s . . .' % (command,)
|
||||
TestExitCodeAndOutput(command)
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
if IS_LINUX:
|
||||
|
||||
class GTestUninitializedTest(unittest.TestCase):
|
||||
def testExitCodeAndOutput(self):
|
||||
TestExitCodeAndOutput(COMMAND)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(DummyTest, Dummy) {
|
||||
// This test doesn't verify anything. We just need it to create a
|
||||
// realistic stage for testing the behavior of Google Test when
|
||||
// RUN_ALL_TESTS() is called without testing::InitGoogleTest() being
|
||||
// called first.
|
||||
}
|
||||
|
||||
int main() {
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -0,0 +1,4299 @@
|
||||
// Copyright 2005, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Tests for Google Test itself. This verifies that the basic constructs of
|
||||
// Google Test work.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
bool ParseInt32Flag(const char* str, const char* flag, Int32* value);
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
using testing::internal::ParseInt32Flag;
|
||||
|
||||
namespace testing {
|
||||
|
||||
GTEST_DECLARE_string(output);
|
||||
GTEST_DECLARE_string(color);
|
||||
|
||||
namespace internal {
|
||||
bool ShouldUseColor(bool stdout_is_tty);
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
using testing::GTEST_FLAG(color);
|
||||
using testing::ScopedFakeTestPartResultReporter;
|
||||
using testing::TestPartResult;
|
||||
using testing::TestPartResultArray;
|
||||
using testing::UnitTest;
|
||||
using testing::internal::AppendUserMessage;
|
||||
using testing::internal::EqFailure;
|
||||
using testing::internal::Int32;
|
||||
using testing::internal::List;
|
||||
using testing::internal::OsStackTraceGetter;
|
||||
using testing::internal::OsStackTraceGetterInterface;
|
||||
using testing::internal::ShouldUseColor;
|
||||
using testing::internal::StreamableToString;
|
||||
using testing::internal::String;
|
||||
using testing::internal::TestProperty;
|
||||
using testing::internal::TestResult;
|
||||
using testing::internal::ToUtf8String;
|
||||
using testing::internal::UnitTestImpl;
|
||||
using testing::internal::UnitTestOptions;
|
||||
|
||||
// This line tests that we can define tests in an unnamed namespace.
|
||||
namespace {
|
||||
|
||||
#ifndef __SYMBIAN32__
|
||||
// NULL testing does not work with Symbian compilers.
|
||||
|
||||
// Tests that GTEST_IS_NULL_LITERAL(x) is true when x is a null
|
||||
// pointer literal.
|
||||
TEST(NullLiteralTest, IsTrueForNullLiterals) {
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(NULL));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(0));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(1 - 1));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(0U));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(0L));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(false));
|
||||
EXPECT_TRUE(GTEST_IS_NULL_LITERAL(true && false));
|
||||
}
|
||||
|
||||
// Tests that GTEST_IS_NULL_LITERAL(x) is false when x is not a null
|
||||
// pointer literal.
|
||||
TEST(NullLiteralTest, IsFalseForNonNullLiterals) {
|
||||
EXPECT_FALSE(GTEST_IS_NULL_LITERAL(1));
|
||||
EXPECT_FALSE(GTEST_IS_NULL_LITERAL(0.0));
|
||||
EXPECT_FALSE(GTEST_IS_NULL_LITERAL('a'));
|
||||
EXPECT_FALSE(GTEST_IS_NULL_LITERAL(static_cast<void*>(NULL)));
|
||||
}
|
||||
|
||||
#endif // __SYMBIAN32__
|
||||
// Tests ToUtf8String().
|
||||
|
||||
// Tests that the NUL character L'\0' is encoded correctly.
|
||||
TEST(ToUtf8StringTest, CanEncodeNul) {
|
||||
EXPECT_STREQ("", ToUtf8String(L'\0').c_str());
|
||||
}
|
||||
|
||||
// Tests that ASCII characters are encoded correctly.
|
||||
TEST(ToUtf8StringTest, CanEncodeAscii) {
|
||||
EXPECT_STREQ("a", ToUtf8String(L'a').c_str());
|
||||
EXPECT_STREQ("Z", ToUtf8String(L'Z').c_str());
|
||||
EXPECT_STREQ("&", ToUtf8String(L'&').c_str());
|
||||
EXPECT_STREQ("\x7F", ToUtf8String(L'\x7F').c_str());
|
||||
}
|
||||
|
||||
// Tests that Unicode code-points that have 8 to 11 bits are encoded
|
||||
// as 110xxxxx 10xxxxxx.
|
||||
TEST(ToUtf8StringTest, CanEncode8To11Bits) {
|
||||
// 000 1101 0011 => 110-00011 10-010011
|
||||
EXPECT_STREQ("\xC3\x93", ToUtf8String(L'\xD3').c_str());
|
||||
|
||||
// 101 0111 0110 => 110-10101 10-110110
|
||||
EXPECT_STREQ("\xD5\xB6", ToUtf8String(L'\x576').c_str());
|
||||
}
|
||||
|
||||
// Tests that Unicode code-points that have 12 to 16 bits are encoded
|
||||
// as 1110xxxx 10xxxxxx 10xxxxxx.
|
||||
TEST(ToUtf8StringTest, CanEncode12To16Bits) {
|
||||
// 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
|
||||
EXPECT_STREQ("\xE0\xA3\x93", ToUtf8String(L'\x8D3').c_str());
|
||||
|
||||
// 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
|
||||
EXPECT_STREQ("\xEC\x9D\x8D", ToUtf8String(L'\xC74D').c_str());
|
||||
}
|
||||
|
||||
#if !defined(GTEST_OS_WINDOWS) && !defined(__SYMBIAN32__)
|
||||
|
||||
// Tests in this group require a wchar_t to hold > 16 bits, and thus
|
||||
// are skipped on Windows and Symbian, where a wchar_t is 16-bit wide.
|
||||
|
||||
// Tests that Unicode code-points that have 17 to 21 bits are encoded
|
||||
// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
|
||||
TEST(ToUtf8StringTest, CanEncode17To21Bits) {
|
||||
// 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
|
||||
EXPECT_STREQ("\xF0\x90\xA3\x93", ToUtf8String(L'\x108D3').c_str());
|
||||
|
||||
// 1 0111 1000 0110 0011 0100 => 11110-101 10-111000 10-011000 10-110100
|
||||
EXPECT_STREQ("\xF5\xB8\x98\xB4", ToUtf8String(L'\x178634').c_str());
|
||||
}
|
||||
|
||||
// Tests that encoding an invalid code-point generates the expected result.
|
||||
TEST(ToUtf8StringTest, CanEncodeInvalidCodePoint) {
|
||||
EXPECT_STREQ("(Invalid Unicode 0x1234ABCD)",
|
||||
ToUtf8String(L'\x1234ABCD').c_str());
|
||||
}
|
||||
|
||||
#endif // Windows or Symbian
|
||||
|
||||
// Tests the List template class.
|
||||
|
||||
// Tests List::PushFront().
|
||||
TEST(ListTest, PushFront) {
|
||||
List<int> a;
|
||||
ASSERT_EQ(0u, a.size());
|
||||
|
||||
// Calls PushFront() on an empty list.
|
||||
a.PushFront(1);
|
||||
ASSERT_EQ(1u, a.size());
|
||||
EXPECT_EQ(1, a.Head()->element());
|
||||
ASSERT_EQ(a.Head(), a.Last());
|
||||
|
||||
// Calls PushFront() on a singleton list.
|
||||
a.PushFront(2);
|
||||
ASSERT_EQ(2u, a.size());
|
||||
EXPECT_EQ(2, a.Head()->element());
|
||||
EXPECT_EQ(1, a.Last()->element());
|
||||
|
||||
// Calls PushFront() on a list with more than one elements.
|
||||
a.PushFront(3);
|
||||
ASSERT_EQ(3u, a.size());
|
||||
EXPECT_EQ(3, a.Head()->element());
|
||||
EXPECT_EQ(2, a.Head()->next()->element());
|
||||
EXPECT_EQ(1, a.Last()->element());
|
||||
}
|
||||
|
||||
// Tests List::PopFront().
|
||||
TEST(ListTest, PopFront) {
|
||||
List<int> a;
|
||||
|
||||
// Popping on an empty list should fail.
|
||||
EXPECT_FALSE(a.PopFront(NULL));
|
||||
|
||||
// Popping again on an empty list should fail, and the result element
|
||||
// shouldn't be overwritten.
|
||||
int element = 1;
|
||||
EXPECT_FALSE(a.PopFront(&element));
|
||||
EXPECT_EQ(1, element);
|
||||
|
||||
a.PushFront(2);
|
||||
a.PushFront(3);
|
||||
|
||||
// PopFront() should pop the element in the front of the list.
|
||||
EXPECT_TRUE(a.PopFront(&element));
|
||||
EXPECT_EQ(3, element);
|
||||
|
||||
// After popping the last element, the list should be empty.
|
||||
EXPECT_TRUE(a.PopFront(NULL));
|
||||
EXPECT_EQ(0u, a.size());
|
||||
}
|
||||
|
||||
// Tests inserting at the beginning using List::InsertAfter().
|
||||
TEST(ListTest, InsertAfterAtBeginning) {
|
||||
List<int> a;
|
||||
ASSERT_EQ(0u, a.size());
|
||||
|
||||
// Inserts into an empty list.
|
||||
a.InsertAfter(NULL, 1);
|
||||
ASSERT_EQ(1u, a.size());
|
||||
EXPECT_EQ(1, a.Head()->element());
|
||||
ASSERT_EQ(a.Head(), a.Last());
|
||||
|
||||
// Inserts at the beginning of a singleton list.
|
||||
a.InsertAfter(NULL, 2);
|
||||
ASSERT_EQ(2u, a.size());
|
||||
EXPECT_EQ(2, a.Head()->element());
|
||||
EXPECT_EQ(1, a.Last()->element());
|
||||
|
||||
// Inserts at the beginning of a list with more than one elements.
|
||||
a.InsertAfter(NULL, 3);
|
||||
ASSERT_EQ(3u, a.size());
|
||||
EXPECT_EQ(3, a.Head()->element());
|
||||
EXPECT_EQ(2, a.Head()->next()->element());
|
||||
EXPECT_EQ(1, a.Last()->element());
|
||||
}
|
||||
|
||||
// Tests inserting at a location other than the beginning using
|
||||
// List::InsertAfter().
|
||||
TEST(ListTest, InsertAfterNotAtBeginning) {
|
||||
// Prepares a singleton list.
|
||||
List<int> a;
|
||||
a.PushBack(1);
|
||||
|
||||
// Inserts at the end of a singleton list.
|
||||
a.InsertAfter(a.Last(), 2);
|
||||
ASSERT_EQ(2u, a.size());
|
||||
EXPECT_EQ(1, a.Head()->element());
|
||||
EXPECT_EQ(2, a.Last()->element());
|
||||
|
||||
// Inserts at the end of a list with more than one elements.
|
||||
a.InsertAfter(a.Last(), 3);
|
||||
ASSERT_EQ(3u, a.size());
|
||||
EXPECT_EQ(1, a.Head()->element());
|
||||
EXPECT_EQ(2, a.Head()->next()->element());
|
||||
EXPECT_EQ(3, a.Last()->element());
|
||||
|
||||
// Inserts in the middle of a list.
|
||||
a.InsertAfter(a.Head(), 4);
|
||||
ASSERT_EQ(4u, a.size());
|
||||
EXPECT_EQ(1, a.Head()->element());
|
||||
EXPECT_EQ(4, a.Head()->next()->element());
|
||||
EXPECT_EQ(2, a.Head()->next()->next()->element());
|
||||
EXPECT_EQ(3, a.Last()->element());
|
||||
}
|
||||
|
||||
|
||||
// Tests the String class.
|
||||
|
||||
// Tests String's constructors.
|
||||
TEST(StringTest, Constructors) {
|
||||
// Default ctor.
|
||||
String s1;
|
||||
EXPECT_EQ(NULL, s1.c_str());
|
||||
|
||||
// Implicitly constructs from a C-string.
|
||||
String s2 = "Hi";
|
||||
EXPECT_STREQ("Hi", s2.c_str());
|
||||
|
||||
// Constructs from a C-string and a length.
|
||||
String s3("hello", 3);
|
||||
EXPECT_STREQ("hel", s3.c_str());
|
||||
|
||||
// Copy ctor.
|
||||
String s4 = s3;
|
||||
EXPECT_STREQ("hel", s4.c_str());
|
||||
}
|
||||
|
||||
// Tests String::ShowCString().
|
||||
TEST(StringTest, ShowCString) {
|
||||
EXPECT_STREQ("(null)", String::ShowCString(NULL));
|
||||
EXPECT_STREQ("", String::ShowCString(""));
|
||||
EXPECT_STREQ("foo", String::ShowCString("foo"));
|
||||
}
|
||||
|
||||
// Tests String::ShowCStringQuoted().
|
||||
TEST(StringTest, ShowCStringQuoted) {
|
||||
EXPECT_STREQ("(null)",
|
||||
String::ShowCStringQuoted(NULL).c_str());
|
||||
EXPECT_STREQ("\"\"",
|
||||
String::ShowCStringQuoted("").c_str());
|
||||
EXPECT_STREQ("\"foo\"",
|
||||
String::ShowCStringQuoted("foo").c_str());
|
||||
}
|
||||
|
||||
// Tests String::operator==().
|
||||
TEST(StringTest, Equals) {
|
||||
const String null(NULL);
|
||||
EXPECT_TRUE(null == NULL); // NOLINT
|
||||
EXPECT_FALSE(null == ""); // NOLINT
|
||||
EXPECT_FALSE(null == "bar"); // NOLINT
|
||||
|
||||
const String empty("");
|
||||
EXPECT_FALSE(empty == NULL); // NOLINT
|
||||
EXPECT_TRUE(empty == ""); // NOLINT
|
||||
EXPECT_FALSE(empty == "bar"); // NOLINT
|
||||
|
||||
const String foo("foo");
|
||||
EXPECT_FALSE(foo == NULL); // NOLINT
|
||||
EXPECT_FALSE(foo == ""); // NOLINT
|
||||
EXPECT_FALSE(foo == "bar"); // NOLINT
|
||||
EXPECT_TRUE(foo == "foo"); // NOLINT
|
||||
}
|
||||
|
||||
// Tests String::operator!=().
|
||||
TEST(StringTest, NotEquals) {
|
||||
const String null(NULL);
|
||||
EXPECT_FALSE(null != NULL); // NOLINT
|
||||
EXPECT_TRUE(null != ""); // NOLINT
|
||||
EXPECT_TRUE(null != "bar"); // NOLINT
|
||||
|
||||
const String empty("");
|
||||
EXPECT_TRUE(empty != NULL); // NOLINT
|
||||
EXPECT_FALSE(empty != ""); // NOLINT
|
||||
EXPECT_TRUE(empty != "bar"); // NOLINT
|
||||
|
||||
const String foo("foo");
|
||||
EXPECT_TRUE(foo != NULL); // NOLINT
|
||||
EXPECT_TRUE(foo != ""); // NOLINT
|
||||
EXPECT_TRUE(foo != "bar"); // NOLINT
|
||||
EXPECT_FALSE(foo != "foo"); // NOLINT
|
||||
}
|
||||
|
||||
// Tests String::EndsWith().
|
||||
TEST(StringTest, EndsWith) {
|
||||
EXPECT_TRUE(String("foobar").EndsWith("bar"));
|
||||
EXPECT_TRUE(String("foobar").EndsWith(""));
|
||||
EXPECT_TRUE(String("").EndsWith(""));
|
||||
|
||||
EXPECT_FALSE(String("foobar").EndsWith("foo"));
|
||||
EXPECT_FALSE(String("").EndsWith("foo"));
|
||||
}
|
||||
|
||||
// Tests String::EndsWithCaseInsensitive().
|
||||
TEST(StringTest, EndsWithCaseInsensitive) {
|
||||
EXPECT_TRUE(String("foobar").EndsWithCaseInsensitive("BAR"));
|
||||
EXPECT_TRUE(String("foobaR").EndsWithCaseInsensitive("bar"));
|
||||
EXPECT_TRUE(String("foobar").EndsWithCaseInsensitive(""));
|
||||
EXPECT_TRUE(String("").EndsWithCaseInsensitive(""));
|
||||
|
||||
EXPECT_FALSE(String("Foobar").EndsWithCaseInsensitive("foo"));
|
||||
EXPECT_FALSE(String("foobar").EndsWithCaseInsensitive("Foo"));
|
||||
EXPECT_FALSE(String("").EndsWithCaseInsensitive("foo"));
|
||||
}
|
||||
|
||||
// Tests that NULL can be assigned to a String.
|
||||
TEST(StringTest, CanBeAssignedNULL) {
|
||||
const String src(NULL);
|
||||
String dest;
|
||||
|
||||
dest = src;
|
||||
EXPECT_STREQ(NULL, dest.c_str());
|
||||
}
|
||||
|
||||
// Tests that the empty string "" can be assigned to a String.
|
||||
TEST(StringTest, CanBeAssignedEmpty) {
|
||||
const String src("");
|
||||
String dest;
|
||||
|
||||
dest = src;
|
||||
EXPECT_STREQ("", dest.c_str());
|
||||
}
|
||||
|
||||
// Tests that a non-empty string can be assigned to a String.
|
||||
TEST(StringTest, CanBeAssignedNonEmpty) {
|
||||
const String src("hello");
|
||||
String dest;
|
||||
|
||||
dest = src;
|
||||
EXPECT_STREQ("hello", dest.c_str());
|
||||
}
|
||||
|
||||
// Tests that a String can be assigned to itself.
|
||||
TEST(StringTest, CanBeAssignedSelf) {
|
||||
String dest("hello");
|
||||
|
||||
dest = dest;
|
||||
EXPECT_STREQ("hello", dest.c_str());
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Tests String::ShowWideCString().
|
||||
TEST(StringTest, ShowWideCString) {
|
||||
EXPECT_STREQ("(null)",
|
||||
String::ShowWideCString(NULL).c_str());
|
||||
EXPECT_STREQ("", String::ShowWideCString(L"").c_str());
|
||||
EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str());
|
||||
}
|
||||
|
||||
// Tests String::ShowWideCStringQuoted().
|
||||
TEST(StringTest, ShowWideCStringQuoted) {
|
||||
EXPECT_STREQ("(null)",
|
||||
String::ShowWideCStringQuoted(NULL).c_str());
|
||||
EXPECT_STREQ("L\"\"",
|
||||
String::ShowWideCStringQuoted(L"").c_str());
|
||||
EXPECT_STREQ("L\"foo\"",
|
||||
String::ShowWideCStringQuoted(L"foo").c_str());
|
||||
}
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Tests TestProperty construction.
|
||||
TEST(TestPropertyTest, StringValue) {
|
||||
TestProperty property("key", "1");
|
||||
EXPECT_STREQ("key", property.key());
|
||||
EXPECT_STREQ("1", property.value());
|
||||
}
|
||||
|
||||
// Tests TestProperty replacing a value.
|
||||
TEST(TestPropertyTest, ReplaceStringValue) {
|
||||
TestProperty property("key", "1");
|
||||
EXPECT_STREQ("1", property.value());
|
||||
property.SetValue("2");
|
||||
EXPECT_STREQ("2", property.value());
|
||||
}
|
||||
|
||||
// Tests the TestPartResult class.
|
||||
|
||||
// The test fixture for testing TestPartResult.
|
||||
class TestPartResultTest : public testing::Test {
|
||||
protected:
|
||||
TestPartResultTest()
|
||||
: r1_(testing::TPRT_SUCCESS,
|
||||
"foo/bar.cc",
|
||||
10,
|
||||
"Success!"),
|
||||
r2_(testing::TPRT_NONFATAL_FAILURE,
|
||||
"foo/bar.cc",
|
||||
-1,
|
||||
"Failure!"),
|
||||
r3_(testing::TPRT_FATAL_FAILURE,
|
||||
NULL,
|
||||
-1,
|
||||
"Failure!") {}
|
||||
|
||||
TestPartResult r1_, r2_, r3_;
|
||||
};
|
||||
|
||||
// Tests TestPartResult::type()
|
||||
TEST_F(TestPartResultTest, type) {
|
||||
EXPECT_EQ(testing::TPRT_SUCCESS, r1_.type());
|
||||
EXPECT_EQ(testing::TPRT_NONFATAL_FAILURE, r2_.type());
|
||||
EXPECT_EQ(testing::TPRT_FATAL_FAILURE, r3_.type());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::file_name()
|
||||
TEST_F(TestPartResultTest, file_name) {
|
||||
EXPECT_STREQ("foo/bar.cc", r1_.file_name());
|
||||
EXPECT_STREQ(NULL, r3_.file_name());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::line_number()
|
||||
TEST_F(TestPartResultTest, line_number) {
|
||||
EXPECT_EQ(10, r1_.line_number());
|
||||
EXPECT_EQ(-1, r2_.line_number());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::message()
|
||||
TEST_F(TestPartResultTest, message) {
|
||||
EXPECT_STREQ("Success!", r1_.message());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::passed()
|
||||
TEST_F(TestPartResultTest, Passed) {
|
||||
EXPECT_TRUE(r1_.passed());
|
||||
EXPECT_FALSE(r2_.passed());
|
||||
EXPECT_FALSE(r3_.passed());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::failed()
|
||||
TEST_F(TestPartResultTest, Failed) {
|
||||
EXPECT_FALSE(r1_.failed());
|
||||
EXPECT_TRUE(r2_.failed());
|
||||
EXPECT_TRUE(r3_.failed());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::fatally_failed()
|
||||
TEST_F(TestPartResultTest, FatallyFailed) {
|
||||
EXPECT_FALSE(r1_.fatally_failed());
|
||||
EXPECT_FALSE(r2_.fatally_failed());
|
||||
EXPECT_TRUE(r3_.fatally_failed());
|
||||
}
|
||||
|
||||
// Tests TestPartResult::nonfatally_failed()
|
||||
TEST_F(TestPartResultTest, NonfatallyFailed) {
|
||||
EXPECT_FALSE(r1_.nonfatally_failed());
|
||||
EXPECT_TRUE(r2_.nonfatally_failed());
|
||||
EXPECT_FALSE(r3_.nonfatally_failed());
|
||||
}
|
||||
|
||||
// Tests the TestPartResultArray class.
|
||||
|
||||
class TestPartResultArrayTest : public testing::Test {
|
||||
protected:
|
||||
TestPartResultArrayTest()
|
||||
: r1_(testing::TPRT_NONFATAL_FAILURE,
|
||||
"foo/bar.cc",
|
||||
-1,
|
||||
"Failure 1"),
|
||||
r2_(testing::TPRT_FATAL_FAILURE,
|
||||
"foo/bar.cc",
|
||||
-1,
|
||||
"Failure 2") {}
|
||||
|
||||
const TestPartResult r1_, r2_;
|
||||
};
|
||||
|
||||
// Tests that TestPartResultArray initially has size 0.
|
||||
TEST_F(TestPartResultArrayTest, InitialSizeIsZero) {
|
||||
TestPartResultArray results;
|
||||
EXPECT_EQ(0, results.size());
|
||||
}
|
||||
|
||||
// Tests that TestPartResultArray contains the given TestPartResult
|
||||
// after one Append() operation.
|
||||
TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {
|
||||
TestPartResultArray results;
|
||||
results.Append(r1_);
|
||||
EXPECT_EQ(1, results.size());
|
||||
EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
|
||||
}
|
||||
|
||||
// Tests that TestPartResultArray contains the given TestPartResults
|
||||
// after two Append() operations.
|
||||
TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {
|
||||
TestPartResultArray results;
|
||||
results.Append(r1_);
|
||||
results.Append(r2_);
|
||||
EXPECT_EQ(2, results.size());
|
||||
EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
|
||||
EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message());
|
||||
}
|
||||
|
||||
void ScopedFakeTestPartResultReporterTestHelper() {
|
||||
FAIL() << "Expected fatal failure.";
|
||||
}
|
||||
|
||||
// Tests that ScopedFakeTestPartResultReporter intercepts test
|
||||
// failures.
|
||||
TEST(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {
|
||||
TestPartResultArray results;
|
||||
{
|
||||
ScopedFakeTestPartResultReporter reporter(&results);
|
||||
ADD_FAILURE() << "Expected non-fatal failure.";
|
||||
ScopedFakeTestPartResultReporterTestHelper();
|
||||
}
|
||||
|
||||
EXPECT_EQ(2, results.size());
|
||||
EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
|
||||
EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
|
||||
}
|
||||
|
||||
// Tests the TestResult class
|
||||
|
||||
// The test fixture for testing TestResult.
|
||||
class TestResultTest : public testing::Test {
|
||||
protected:
|
||||
typedef List<TestPartResult> TPRList;
|
||||
|
||||
// We make use of 2 TestPartResult objects,
|
||||
TestPartResult * pr1, * pr2;
|
||||
|
||||
// ... and 3 TestResult objects.
|
||||
TestResult * r0, * r1, * r2;
|
||||
|
||||
virtual void SetUp() {
|
||||
// pr1 is for success.
|
||||
pr1 = new TestPartResult(testing::TPRT_SUCCESS,
|
||||
"foo/bar.cc",
|
||||
10,
|
||||
"Success!");
|
||||
|
||||
// pr2 is for fatal failure.
|
||||
pr2 = new TestPartResult(testing::TPRT_FATAL_FAILURE,
|
||||
"foo/bar.cc",
|
||||
-1, // This line number means "unknown"
|
||||
"Failure!");
|
||||
|
||||
// Creates the TestResult objects.
|
||||
r0 = new TestResult();
|
||||
r1 = new TestResult();
|
||||
r2 = new TestResult();
|
||||
|
||||
// In order to test TestResult, we need to modify its internal
|
||||
// state, in particular the TestPartResult list it holds.
|
||||
// test_part_results() returns a const reference to this list.
|
||||
// We cast it to a non-const object s.t. it can be modified (yes,
|
||||
// this is a hack).
|
||||
TPRList * list1, * list2;
|
||||
list1 = const_cast<List<TestPartResult> *>(
|
||||
& r1->test_part_results());
|
||||
list2 = const_cast<List<TestPartResult> *>(
|
||||
& r2->test_part_results());
|
||||
|
||||
// r0 is an empty TestResult.
|
||||
|
||||
// r1 contains a single SUCCESS TestPartResult.
|
||||
list1->PushBack(*pr1);
|
||||
|
||||
// r2 contains a SUCCESS, and a FAILURE.
|
||||
list2->PushBack(*pr1);
|
||||
list2->PushBack(*pr2);
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
delete pr1;
|
||||
delete pr2;
|
||||
|
||||
delete r0;
|
||||
delete r1;
|
||||
delete r2;
|
||||
}
|
||||
};
|
||||
|
||||
// Tests TestResult::test_part_results()
|
||||
TEST_F(TestResultTest, test_part_results) {
|
||||
ASSERT_EQ(0u, r0->test_part_results().size());
|
||||
ASSERT_EQ(1u, r1->test_part_results().size());
|
||||
ASSERT_EQ(2u, r2->test_part_results().size());
|
||||
}
|
||||
|
||||
// Tests TestResult::successful_part_count()
|
||||
TEST_F(TestResultTest, successful_part_count) {
|
||||
ASSERT_EQ(0u, r0->successful_part_count());
|
||||
ASSERT_EQ(1u, r1->successful_part_count());
|
||||
ASSERT_EQ(1u, r2->successful_part_count());
|
||||
}
|
||||
|
||||
// Tests TestResult::failed_part_count()
|
||||
TEST_F(TestResultTest, failed_part_count) {
|
||||
ASSERT_EQ(0u, r0->failed_part_count());
|
||||
ASSERT_EQ(0u, r1->failed_part_count());
|
||||
ASSERT_EQ(1u, r2->failed_part_count());
|
||||
}
|
||||
|
||||
// Tests TestResult::total_part_count()
|
||||
TEST_F(TestResultTest, total_part_count) {
|
||||
ASSERT_EQ(0u, r0->total_part_count());
|
||||
ASSERT_EQ(1u, r1->total_part_count());
|
||||
ASSERT_EQ(2u, r2->total_part_count());
|
||||
}
|
||||
|
||||
// Tests TestResult::Passed()
|
||||
TEST_F(TestResultTest, Passed) {
|
||||
ASSERT_TRUE(r0->Passed());
|
||||
ASSERT_TRUE(r1->Passed());
|
||||
ASSERT_FALSE(r2->Passed());
|
||||
}
|
||||
|
||||
// Tests TestResult::Failed()
|
||||
TEST_F(TestResultTest, Failed) {
|
||||
ASSERT_FALSE(r0->Failed());
|
||||
ASSERT_FALSE(r1->Failed());
|
||||
ASSERT_TRUE(r2->Failed());
|
||||
}
|
||||
|
||||
// Tests TestResult::test_properties() has no properties when none are added.
|
||||
TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {
|
||||
TestResult test_result;
|
||||
ASSERT_EQ(0u, test_result.test_properties().size());
|
||||
}
|
||||
|
||||
// Tests TestResult::test_properties() has the expected property when added.
|
||||
TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {
|
||||
TestResult test_result;
|
||||
TestProperty property("key_1", "1");
|
||||
test_result.RecordProperty(property);
|
||||
const List<TestProperty>& properties = test_result.test_properties();
|
||||
ASSERT_EQ(1u, properties.size());
|
||||
TestProperty actual_property = properties.Head()->element();
|
||||
EXPECT_STREQ("key_1", actual_property.key());
|
||||
EXPECT_STREQ("1", actual_property.value());
|
||||
}
|
||||
|
||||
// Tests TestResult::test_properties() has multiple properties when added.
|
||||
TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {
|
||||
TestResult test_result;
|
||||
TestProperty property_1("key_1", "1");
|
||||
TestProperty property_2("key_2", "2");
|
||||
test_result.RecordProperty(property_1);
|
||||
test_result.RecordProperty(property_2);
|
||||
const List<TestProperty>& properties = test_result.test_properties();
|
||||
ASSERT_EQ(2u, properties.size());
|
||||
TestProperty actual_property_1 = properties.Head()->element();
|
||||
EXPECT_STREQ("key_1", actual_property_1.key());
|
||||
EXPECT_STREQ("1", actual_property_1.value());
|
||||
|
||||
TestProperty actual_property_2 = properties.Last()->element();
|
||||
EXPECT_STREQ("key_2", actual_property_2.key());
|
||||
EXPECT_STREQ("2", actual_property_2.value());
|
||||
}
|
||||
|
||||
// Tests TestResult::test_properties() overrides values for duplicate keys.
|
||||
TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {
|
||||
TestResult test_result;
|
||||
TestProperty property_1_1("key_1", "1");
|
||||
TestProperty property_2_1("key_2", "2");
|
||||
TestProperty property_1_2("key_1", "12");
|
||||
TestProperty property_2_2("key_2", "22");
|
||||
test_result.RecordProperty(property_1_1);
|
||||
test_result.RecordProperty(property_2_1);
|
||||
test_result.RecordProperty(property_1_2);
|
||||
test_result.RecordProperty(property_2_2);
|
||||
|
||||
const List<TestProperty>& properties = test_result.test_properties();
|
||||
ASSERT_EQ(2u, properties.size());
|
||||
TestProperty actual_property_1 = properties.Head()->element();
|
||||
EXPECT_STREQ("key_1", actual_property_1.key());
|
||||
EXPECT_STREQ("12", actual_property_1.value());
|
||||
|
||||
TestProperty actual_property_2 = properties.Last()->element();
|
||||
EXPECT_STREQ("key_2", actual_property_2.key());
|
||||
EXPECT_STREQ("22", actual_property_2.value());
|
||||
}
|
||||
|
||||
// When a property using a reserved key is supplied to this function, it tests
|
||||
// that a non-fatal failure is added, a fatal failure is not added, and that the
|
||||
// property is not recorded.
|
||||
void ExpectNonFatalFailureRecordingPropertyWithReservedKey(const char* key) {
|
||||
TestResult test_result;
|
||||
TestProperty property("name", "1");
|
||||
EXPECT_NONFATAL_FAILURE(test_result.RecordProperty(property), "Reserved key");
|
||||
ASSERT_TRUE(test_result.test_properties().IsEmpty()) << "Not recorded";
|
||||
}
|
||||
|
||||
// Attempting to recording a property with the Reserved literal "name"
|
||||
// should add a non-fatal failure and the property should not be recorded.
|
||||
TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledName) {
|
||||
ExpectNonFatalFailureRecordingPropertyWithReservedKey("name");
|
||||
}
|
||||
|
||||
// Attempting to recording a property with the Reserved literal "status"
|
||||
// should add a non-fatal failure and the property should not be recorded.
|
||||
TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledStatus) {
|
||||
ExpectNonFatalFailureRecordingPropertyWithReservedKey("status");
|
||||
}
|
||||
|
||||
// Attempting to recording a property with the Reserved literal "time"
|
||||
// should add a non-fatal failure and the property should not be recorded.
|
||||
TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledTime) {
|
||||
ExpectNonFatalFailureRecordingPropertyWithReservedKey("time");
|
||||
}
|
||||
|
||||
// Attempting to recording a property with the Reserved literal "classname"
|
||||
// should add a non-fatal failure and the property should not be recorded.
|
||||
TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledClassname) {
|
||||
ExpectNonFatalFailureRecordingPropertyWithReservedKey("classname");
|
||||
}
|
||||
|
||||
// Tests that GTestFlagSaver works on Windows and Mac.
|
||||
|
||||
class GTestFlagSaverTest : public testing::Test {
|
||||
protected:
|
||||
// Saves the Google Test flags such that we can restore them later, and
|
||||
// then sets them to their default values. This will be called
|
||||
// before the first test in this test case is run.
|
||||
static void SetUpTestCase() {
|
||||
saver_ = new testing::internal::GTestFlagSaver;
|
||||
|
||||
testing::GTEST_FLAG(break_on_failure) = false;
|
||||
testing::GTEST_FLAG(catch_exceptions) = false;
|
||||
testing::GTEST_FLAG(color) = "auto";
|
||||
testing::GTEST_FLAG(filter) = "";
|
||||
testing::GTEST_FLAG(list_tests) = false;
|
||||
testing::GTEST_FLAG(output) = "";
|
||||
testing::GTEST_FLAG(repeat) = 1;
|
||||
}
|
||||
|
||||
// Restores the Google Test flags that the tests have modified. This will
|
||||
// be called after the last test in this test case is run.
|
||||
static void TearDownTestCase() {
|
||||
delete saver_;
|
||||
saver_ = NULL;
|
||||
}
|
||||
|
||||
// Verifies that the Google Test flags have their default values, and then
|
||||
// modifies each of them.
|
||||
void VerifyAndModifyFlags() {
|
||||
EXPECT_FALSE(testing::GTEST_FLAG(break_on_failure));
|
||||
EXPECT_FALSE(testing::GTEST_FLAG(catch_exceptions));
|
||||
EXPECT_STREQ("auto", testing::GTEST_FLAG(color).c_str());
|
||||
EXPECT_STREQ("", testing::GTEST_FLAG(filter).c_str());
|
||||
EXPECT_FALSE(testing::GTEST_FLAG(list_tests));
|
||||
EXPECT_STREQ("", testing::GTEST_FLAG(output).c_str());
|
||||
EXPECT_EQ(1, testing::GTEST_FLAG(repeat));
|
||||
|
||||
testing::GTEST_FLAG(break_on_failure) = true;
|
||||
testing::GTEST_FLAG(catch_exceptions) = true;
|
||||
testing::GTEST_FLAG(color) = "no";
|
||||
testing::GTEST_FLAG(filter) = "abc";
|
||||
testing::GTEST_FLAG(list_tests) = true;
|
||||
testing::GTEST_FLAG(output) = "xml:foo.xml";
|
||||
testing::GTEST_FLAG(repeat) = 100;
|
||||
}
|
||||
private:
|
||||
// For saving Google Test flags during this test case.
|
||||
static testing::internal::GTestFlagSaver* saver_;
|
||||
};
|
||||
|
||||
testing::internal::GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;
|
||||
|
||||
// Google Test doesn't guarantee the order of tests. The following two
|
||||
// tests are designed to work regardless of their order.
|
||||
|
||||
// Modifies the Google Test flags in the test body.
|
||||
TEST_F(GTestFlagSaverTest, ModifyGTestFlags) {
|
||||
VerifyAndModifyFlags();
|
||||
}
|
||||
|
||||
// Verifies that the Google Test flags in the body of the previous test were
|
||||
// restored to their original values.
|
||||
TEST_F(GTestFlagSaverTest, VerifyGTestFlags) {
|
||||
VerifyAndModifyFlags();
|
||||
}
|
||||
|
||||
// Sets an environment variable with the given name to the given
|
||||
// value. If the value argument is "", unsets the environment
|
||||
// variable. The caller must ensure that both arguments are not NULL.
|
||||
static void SetEnv(const char* name, const char* value) {
|
||||
#ifdef _WIN32_WCE
|
||||
// Environment variables are not supported on Windows CE.
|
||||
return;
|
||||
#elif defined(GTEST_OS_WINDOWS) // If we are on Windows proper.
|
||||
_putenv((testing::Message() << name << "=" << value).GetString().c_str());
|
||||
#else
|
||||
if (*value == '\0') {
|
||||
unsetenv(name);
|
||||
} else {
|
||||
setenv(name, value, 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
// Environment variables are not supported on Windows CE.
|
||||
|
||||
using ::testing::internal::Int32FromGTestEnv;
|
||||
|
||||
// Tests Int32FromGTestEnv().
|
||||
|
||||
// Tests that Int32FromGTestEnv() returns the default value when the
|
||||
// environment variable is not set.
|
||||
TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "");
|
||||
EXPECT_EQ(10, Int32FromGTestEnv("temp", 10));
|
||||
}
|
||||
|
||||
// Tests that Int32FromGTestEnv() returns the default value when the
|
||||
// environment variable overflows as an Int32.
|
||||
TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {
|
||||
printf("(expecting 2 warnings)\n");
|
||||
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "12345678987654321");
|
||||
EXPECT_EQ(20, Int32FromGTestEnv("temp", 20));
|
||||
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "-12345678987654321");
|
||||
EXPECT_EQ(30, Int32FromGTestEnv("temp", 30));
|
||||
}
|
||||
|
||||
// Tests that Int32FromGTestEnv() returns the default value when the
|
||||
// environment variable does not represent a valid decimal integer.
|
||||
TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {
|
||||
printf("(expecting 2 warnings)\n");
|
||||
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "A1");
|
||||
EXPECT_EQ(40, Int32FromGTestEnv("temp", 40));
|
||||
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "12X");
|
||||
EXPECT_EQ(50, Int32FromGTestEnv("temp", 50));
|
||||
}
|
||||
|
||||
// Tests that Int32FromGTestEnv() parses and returns the value of the
|
||||
// environment variable when it represents a valid decimal integer in
|
||||
// the range of an Int32.
|
||||
TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "123");
|
||||
EXPECT_EQ(123, Int32FromGTestEnv("temp", 0));
|
||||
|
||||
SetEnv(GTEST_FLAG_PREFIX_UPPER "TEMP", "-321");
|
||||
EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0));
|
||||
}
|
||||
#endif // !defined(_WIN32_WCE)
|
||||
|
||||
// Tests ParseInt32Flag().
|
||||
|
||||
// Tests that ParseInt32Flag() returns false and doesn't change the
|
||||
// output value when the flag has wrong format
|
||||
TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {
|
||||
Int32 value = 123;
|
||||
EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
|
||||
EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
}
|
||||
|
||||
// Tests that ParseInt32Flag() returns false and doesn't change the
|
||||
// output value when the flag overflows as an Int32.
|
||||
TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {
|
||||
printf("(expecting 2 warnings)\n");
|
||||
|
||||
Int32 value = 123;
|
||||
EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
|
||||
EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
}
|
||||
|
||||
// Tests that ParseInt32Flag() returns false and doesn't change the
|
||||
// output value when the flag does not represent a valid decimal
|
||||
// integer.
|
||||
TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {
|
||||
printf("(expecting 2 warnings)\n");
|
||||
|
||||
Int32 value = 123;
|
||||
EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
|
||||
EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value));
|
||||
EXPECT_EQ(123, value);
|
||||
}
|
||||
|
||||
// Tests that ParseInt32Flag() parses the value of the flag and
|
||||
// returns true when the flag represents a valid decimal integer in
|
||||
// the range of an Int32.
|
||||
TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {
|
||||
Int32 value = 123;
|
||||
EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX "abc=456", "abc", &value));
|
||||
EXPECT_EQ(456, value);
|
||||
|
||||
EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX "abc=-789", "abc", &value));
|
||||
EXPECT_EQ(-789, value);
|
||||
}
|
||||
|
||||
// For the same reason we are not explicitly testing everything in the
|
||||
// Test class, there are no separate tests for the following classes:
|
||||
//
|
||||
// TestCase, UnitTest, UnitTestResultPrinter.
|
||||
//
|
||||
// Similarly, there are no separate tests for the following macros:
|
||||
//
|
||||
// TEST, TEST_F, RUN_ALL_TESTS
|
||||
|
||||
// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
|
||||
// of various arities. They do not attempt to be exhaustive. Rather,
|
||||
// view them as smoke tests that can be easily reviewed and verified.
|
||||
// A more complete set of tests for predicate assertions can be found
|
||||
// in gtest_pred_impl_unittest.cc.
|
||||
|
||||
// First, some predicates and predicate-formatters needed by the tests.
|
||||
|
||||
// Returns true iff the argument is an even number.
|
||||
bool IsEven(int n) {
|
||||
return (n % 2) == 0;
|
||||
}
|
||||
|
||||
// A functor that returns true iff the argument is an even number.
|
||||
struct IsEvenFunctor {
|
||||
bool operator()(int n) { return IsEven(n); }
|
||||
};
|
||||
|
||||
// A predicate-formatter function that asserts the argument is an even
|
||||
// number.
|
||||
testing::AssertionResult AssertIsEven(const char* expr, int n) {
|
||||
if (IsEven(n)) {
|
||||
return testing::AssertionSuccess();
|
||||
}
|
||||
|
||||
testing::Message msg;
|
||||
msg << expr << " evaluates to " << n << ", which is not even.";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A predicate-formatter functor that asserts the argument is an even
|
||||
// number.
|
||||
struct AssertIsEvenFunctor {
|
||||
testing::AssertionResult operator()(const char* expr, int n) {
|
||||
return AssertIsEven(expr, n);
|
||||
}
|
||||
};
|
||||
|
||||
// Returns true iff the sum of the arguments is an even number.
|
||||
bool SumIsEven2(int n1, int n2) {
|
||||
return IsEven(n1 + n2);
|
||||
}
|
||||
|
||||
// A functor that returns true iff the sum of the arguments is an even
|
||||
// number.
|
||||
struct SumIsEven3Functor {
|
||||
bool operator()(int n1, int n2, int n3) {
|
||||
return IsEven(n1 + n2 + n3);
|
||||
}
|
||||
};
|
||||
|
||||
// A predicate-formatter function that asserts the sum of the
|
||||
// arguments is an even number.
|
||||
testing::AssertionResult AssertSumIsEven4(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
int n1,
|
||||
int n2,
|
||||
int n3,
|
||||
int n4) {
|
||||
const int sum = n1 + n2 + n3 + n4;
|
||||
if (IsEven(sum)) {
|
||||
return testing::AssertionSuccess();
|
||||
}
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
|
||||
<< " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4
|
||||
<< ") evaluates to " << sum << ", which is not even.";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
|
||||
// A predicate-formatter functor that asserts the sum of the arguments
|
||||
// is an even number.
|
||||
struct AssertSumIsEven5Functor {
|
||||
testing::AssertionResult operator()(const char* e1,
|
||||
const char* e2,
|
||||
const char* e3,
|
||||
const char* e4,
|
||||
const char* e5,
|
||||
int n1,
|
||||
int n2,
|
||||
int n3,
|
||||
int n4,
|
||||
int n5) {
|
||||
const int sum = n1 + n2 + n3 + n4 + n5;
|
||||
if (IsEven(sum)) {
|
||||
return testing::AssertionSuccess();
|
||||
}
|
||||
|
||||
testing::Message msg;
|
||||
msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
|
||||
<< " ("
|
||||
<< n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5
|
||||
<< ") evaluates to " << sum << ", which is not even.";
|
||||
return testing::AssertionFailure(msg);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Tests unary predicate assertions.
|
||||
|
||||
// Tests unary predicate assertions that don't use a custom formatter.
|
||||
TEST(Pred1Test, WithoutFormat) {
|
||||
// Success cases.
|
||||
EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!";
|
||||
ASSERT_PRED1(IsEven, 4);
|
||||
|
||||
// Failure cases.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED1(IsEven, 5) << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),
|
||||
"evaluates to false");
|
||||
}
|
||||
|
||||
// Tests unary predicate assertions that use a custom formatter.
|
||||
TEST(Pred1Test, WithFormat) {
|
||||
// Success cases.
|
||||
EXPECT_PRED_FORMAT1(AssertIsEven, 2);
|
||||
ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)
|
||||
<< "This failure is UNEXPECTED!";
|
||||
|
||||
// Failure cases.
|
||||
const int n = 5;
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),
|
||||
"n evaluates to 5, which is not even.");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
}
|
||||
|
||||
// Tests that unary predicate assertions evaluates their arguments
|
||||
// exactly once.
|
||||
TEST(Pred1Test, SingleEvaluationOnFailure) {
|
||||
// A success case.
|
||||
static int n = 0;
|
||||
EXPECT_PRED1(IsEven, n++);
|
||||
EXPECT_EQ(1, n) << "The argument is not evaluated exactly once.";
|
||||
|
||||
// A failure case.
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)
|
||||
<< "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
EXPECT_EQ(2, n) << "The argument is not evaluated exactly once.";
|
||||
}
|
||||
|
||||
|
||||
// Tests predicate assertions whose arity is >= 2.
|
||||
|
||||
// Tests predicate assertions that don't use a custom formatter.
|
||||
TEST(PredTest, WithoutFormat) {
|
||||
// Success cases.
|
||||
ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!";
|
||||
EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);
|
||||
|
||||
// Failure cases.
|
||||
const int n1 = 1;
|
||||
const int n2 = 2;
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);
|
||||
}, "evaluates to false");
|
||||
}
|
||||
|
||||
// Tests predicate assertions that use a custom formatter.
|
||||
TEST(PredTest, WithFormat) {
|
||||
// Success cases.
|
||||
ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<
|
||||
"This failure is UNEXPECTED!";
|
||||
EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);
|
||||
|
||||
// Failure cases.
|
||||
const int n1 = 1;
|
||||
const int n2 = 2;
|
||||
const int n3 = 4;
|
||||
const int n4 = 6;
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);
|
||||
}, "evaluates to 13, which is not even.");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)
|
||||
<< "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
}
|
||||
|
||||
// Tests that predicate assertions evaluates their arguments
|
||||
// exactly once.
|
||||
TEST(PredTest, SingleEvaluationOnFailure) {
|
||||
// A success case.
|
||||
int n1 = 0;
|
||||
int n2 = 0;
|
||||
EXPECT_PRED2(SumIsEven2, n1++, n2++);
|
||||
EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
|
||||
|
||||
// Another success case.
|
||||
n1 = n2 = 0;
|
||||
int n3 = 0;
|
||||
int n4 = 0;
|
||||
int n5 = 0;
|
||||
ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),
|
||||
n1++, n2++, n3++, n4++, n5++)
|
||||
<< "This failure is UNEXPECTED!";
|
||||
EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once.";
|
||||
|
||||
// A failure case.
|
||||
n1 = n2 = n3 = 0;
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)
|
||||
<< "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
|
||||
|
||||
// Another failure case.
|
||||
n1 = n2 = n3 = n4 = 0;
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);
|
||||
}, "evaluates to 1, which is not even.");
|
||||
EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
|
||||
EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
|
||||
}
|
||||
|
||||
|
||||
// Some helper functions for testing using overloaded/template
|
||||
// functions with ASSERT_PREDn and EXPECT_PREDn.
|
||||
|
||||
bool IsPositive(int n) {
|
||||
return n > 0;
|
||||
}
|
||||
|
||||
bool IsPositive(double x) {
|
||||
return x > 0;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool IsNegative(T x) {
|
||||
return x < 0;
|
||||
}
|
||||
|
||||
template <typename T1, typename T2>
|
||||
bool GreaterThan(T1 x1, T2 x2) {
|
||||
return x1 > x2;
|
||||
}
|
||||
|
||||
// Tests that overloaded functions can be used in *_PRED* as long as
|
||||
// their types are explicitly specified.
|
||||
TEST(PredicateAssertionTest, AcceptsOverloadedFunction) {
|
||||
EXPECT_PRED1(static_cast<bool (*)(int)>(IsPositive), 5); // NOLINT
|
||||
ASSERT_PRED1(static_cast<bool (*)(double)>(IsPositive), 6.0); // NOLINT
|
||||
}
|
||||
|
||||
// Tests that template functions can be used in *_PRED* as long as
|
||||
// their types are explicitly specified.
|
||||
TEST(PredicateAssertionTest, AcceptsTemplateFunction) {
|
||||
EXPECT_PRED1(IsNegative<int>, -5);
|
||||
// Makes sure that we can handle templates with more than one
|
||||
// parameter.
|
||||
ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
|
||||
}
|
||||
|
||||
|
||||
// Some helper functions for testing using overloaded/template
|
||||
// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.
|
||||
|
||||
testing::AssertionResult IsPositiveFormat(const char* expr, int n) {
|
||||
return n > 0 ? testing::AssertionSuccess() :
|
||||
testing::AssertionFailure(testing::Message() << "Failure");
|
||||
}
|
||||
|
||||
testing::AssertionResult IsPositiveFormat(const char* expr, double x) {
|
||||
return x > 0 ? testing::AssertionSuccess() :
|
||||
testing::AssertionFailure(testing::Message() << "Failure");
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
testing::AssertionResult IsNegativeFormat(const char* expr, T x) {
|
||||
return x < 0 ? testing::AssertionSuccess() :
|
||||
testing::AssertionFailure(testing::Message() << "Failure");
|
||||
}
|
||||
|
||||
template <typename T1, typename T2>
|
||||
testing::AssertionResult EqualsFormat(const char* expr1, const char* expr2,
|
||||
const T1& x1, const T2& x2) {
|
||||
return x1 == x2 ? testing::AssertionSuccess() :
|
||||
testing::AssertionFailure(testing::Message() << "Failure");
|
||||
}
|
||||
|
||||
// Tests that overloaded functions can be used in *_PRED_FORMAT*
|
||||
// without explictly specifying their types.
|
||||
TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {
|
||||
EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);
|
||||
ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);
|
||||
}
|
||||
|
||||
// Tests that template functions can be used in *_PRED_FORMAT* without
|
||||
// explicitly specifying their types.
|
||||
TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {
|
||||
EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);
|
||||
ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);
|
||||
}
|
||||
|
||||
|
||||
// Tests string assertions.
|
||||
|
||||
// Tests ASSERT_STREQ with non-NULL arguments.
|
||||
TEST(StringAssertionTest, ASSERT_STREQ) {
|
||||
const char * const p1 = "good";
|
||||
ASSERT_STREQ(p1, p1);
|
||||
|
||||
// Let p2 have the same content as p1, but be at a different address.
|
||||
const char p2[] = "good";
|
||||
ASSERT_STREQ(p1, p2);
|
||||
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"),
|
||||
"Expected: \"bad\"");
|
||||
}
|
||||
|
||||
// Tests ASSERT_STREQ with NULL arguments.
|
||||
TEST(StringAssertionTest, ASSERT_STREQ_Null) {
|
||||
ASSERT_STREQ(static_cast<const char *>(NULL), NULL);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"),
|
||||
"non-null");
|
||||
}
|
||||
|
||||
// Tests ASSERT_STREQ with NULL arguments.
|
||||
TEST(StringAssertionTest, ASSERT_STREQ_Null2) {
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL),
|
||||
"non-null");
|
||||
}
|
||||
|
||||
// Tests ASSERT_STRNE.
|
||||
TEST(StringAssertionTest, ASSERT_STRNE) {
|
||||
ASSERT_STRNE("hi", "Hi");
|
||||
ASSERT_STRNE("Hi", NULL);
|
||||
ASSERT_STRNE(NULL, "Hi");
|
||||
ASSERT_STRNE("", NULL);
|
||||
ASSERT_STRNE(NULL, "");
|
||||
ASSERT_STRNE("", "Hi");
|
||||
ASSERT_STRNE("Hi", "");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"),
|
||||
"\"Hi\" vs \"Hi\"");
|
||||
}
|
||||
|
||||
// Tests ASSERT_STRCASEEQ.
|
||||
TEST(StringAssertionTest, ASSERT_STRCASEEQ) {
|
||||
ASSERT_STRCASEEQ("hi", "Hi");
|
||||
ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);
|
||||
|
||||
ASSERT_STRCASEEQ("", "");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"),
|
||||
"(ignoring case)");
|
||||
}
|
||||
|
||||
// Tests ASSERT_STRCASENE.
|
||||
TEST(StringAssertionTest, ASSERT_STRCASENE) {
|
||||
ASSERT_STRCASENE("hi1", "Hi2");
|
||||
ASSERT_STRCASENE("Hi", NULL);
|
||||
ASSERT_STRCASENE(NULL, "Hi");
|
||||
ASSERT_STRCASENE("", NULL);
|
||||
ASSERT_STRCASENE(NULL, "");
|
||||
ASSERT_STRCASENE("", "Hi");
|
||||
ASSERT_STRCASENE("Hi", "");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"),
|
||||
"(ignoring case)");
|
||||
}
|
||||
|
||||
// Tests *_STREQ on wide strings.
|
||||
TEST(StringAssertionTest, STREQ_Wide) {
|
||||
// NULL strings.
|
||||
ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);
|
||||
|
||||
// Empty strings.
|
||||
ASSERT_STREQ(L"", L"");
|
||||
|
||||
// Non-null vs NULL.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL),
|
||||
"non-null");
|
||||
|
||||
// Equal strings.
|
||||
EXPECT_STREQ(L"Hi", L"Hi");
|
||||
|
||||
// Unequal strings.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"),
|
||||
"Abc");
|
||||
|
||||
// Strings containing wide characters.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"),
|
||||
"abc");
|
||||
}
|
||||
|
||||
// Tests *_STRNE on wide strings.
|
||||
TEST(StringAssertionTest, STRNE_Wide) {
|
||||
// NULL strings.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);
|
||||
}, "");
|
||||
|
||||
// Empty strings.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""),
|
||||
"L\"\"");
|
||||
|
||||
// Non-null vs NULL.
|
||||
ASSERT_STRNE(L"non-null", NULL);
|
||||
|
||||
// Equal strings.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"),
|
||||
"L\"Hi\"");
|
||||
|
||||
// Unequal strings.
|
||||
EXPECT_STRNE(L"abc", L"Abc");
|
||||
|
||||
// Strings containing wide characters.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"),
|
||||
"abc");
|
||||
}
|
||||
|
||||
// Tests for ::testing::IsSubstring().
|
||||
|
||||
// Tests that IsSubstring() returns the correct result when the input
|
||||
// argument type is const char*.
|
||||
TEST(IsSubstringTest, ReturnsCorrectResultForCString) {
|
||||
using ::testing::IsSubstring;
|
||||
|
||||
EXPECT_FALSE(IsSubstring("", "", NULL, "a"));
|
||||
EXPECT_FALSE(IsSubstring("", "", "b", NULL));
|
||||
EXPECT_FALSE(IsSubstring("", "", "needle", "haystack"));
|
||||
|
||||
EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL));
|
||||
EXPECT_TRUE(IsSubstring("", "", "needle", "two needles"));
|
||||
}
|
||||
|
||||
// Tests that IsSubstring() returns the correct result when the input
|
||||
// argument type is const wchar_t*.
|
||||
TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {
|
||||
using ::testing::IsSubstring;
|
||||
|
||||
EXPECT_FALSE(IsSubstring("", "", NULL, L"a"));
|
||||
EXPECT_FALSE(IsSubstring("", "", L"b", NULL));
|
||||
EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack"));
|
||||
|
||||
EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL));
|
||||
EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles"));
|
||||
}
|
||||
|
||||
// Tests that IsSubstring() generates the correct message when the input
|
||||
// argument type is const char*.
|
||||
TEST(IsSubstringTest, GeneratesCorrectMessageForCString) {
|
||||
EXPECT_STREQ("Value of: needle_expr\n"
|
||||
" Actual: \"needle\"\n"
|
||||
"Expected: a substring of haystack_expr\n"
|
||||
"Which is: \"haystack\"",
|
||||
::testing::IsSubstring("needle_expr", "haystack_expr",
|
||||
"needle", "haystack").failure_message());
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
|
||||
// Tests that IsSubstring returns the correct result when the input
|
||||
// argument type is ::std::string.
|
||||
TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {
|
||||
EXPECT_TRUE(::testing::IsSubstring("", "", std::string("hello"), "ahellob"));
|
||||
EXPECT_FALSE(::testing::IsSubstring("", "", "hello", std::string("world")));
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
// Tests that IsSubstring returns the correct result when the input
|
||||
// argument type is ::std::wstring.
|
||||
TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {
|
||||
using ::testing::IsSubstring;
|
||||
|
||||
EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
|
||||
EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack")));
|
||||
}
|
||||
|
||||
// Tests that IsSubstring() generates the correct message when the input
|
||||
// argument type is ::std::wstring.
|
||||
TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {
|
||||
EXPECT_STREQ("Value of: needle_expr\n"
|
||||
" Actual: L\"needle\"\n"
|
||||
"Expected: a substring of haystack_expr\n"
|
||||
"Which is: L\"haystack\"",
|
||||
::testing::IsSubstring(
|
||||
"needle_expr", "haystack_expr",
|
||||
::std::wstring(L"needle"), L"haystack").failure_message());
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
// Tests for ::testing::IsNotSubstring().
|
||||
|
||||
// Tests that IsNotSubstring() returns the correct result when the input
|
||||
// argument type is const char*.
|
||||
TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {
|
||||
using ::testing::IsNotSubstring;
|
||||
|
||||
EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack"));
|
||||
EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles"));
|
||||
}
|
||||
|
||||
// Tests that IsNotSubstring() returns the correct result when the input
|
||||
// argument type is const wchar_t*.
|
||||
TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {
|
||||
using ::testing::IsNotSubstring;
|
||||
|
||||
EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack"));
|
||||
EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles"));
|
||||
}
|
||||
|
||||
// Tests that IsNotSubstring() generates the correct message when the input
|
||||
// argument type is const wchar_t*.
|
||||
TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {
|
||||
EXPECT_STREQ("Value of: needle_expr\n"
|
||||
" Actual: L\"needle\"\n"
|
||||
"Expected: not a substring of haystack_expr\n"
|
||||
"Which is: L\"two needles\"",
|
||||
::testing::IsNotSubstring(
|
||||
"needle_expr", "haystack_expr",
|
||||
L"needle", L"two needles").failure_message());
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
|
||||
// Tests that IsNotSubstring returns the correct result when the input
|
||||
// argument type is ::std::string.
|
||||
TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {
|
||||
using ::testing::IsNotSubstring;
|
||||
|
||||
EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob"));
|
||||
EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world")));
|
||||
}
|
||||
|
||||
// Tests that IsNotSubstring() generates the correct message when the input
|
||||
// argument type is ::std::string.
|
||||
TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {
|
||||
EXPECT_STREQ("Value of: needle_expr\n"
|
||||
" Actual: \"needle\"\n"
|
||||
"Expected: not a substring of haystack_expr\n"
|
||||
"Which is: \"two needles\"",
|
||||
::testing::IsNotSubstring(
|
||||
"needle_expr", "haystack_expr",
|
||||
::std::string("needle"), "two needles").failure_message());
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
|
||||
// Tests that IsNotSubstring returns the correct result when the input
|
||||
// argument type is ::std::wstring.
|
||||
TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {
|
||||
using ::testing::IsNotSubstring;
|
||||
|
||||
EXPECT_FALSE(
|
||||
IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
|
||||
EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack")));
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
// Tests floating-point assertions.
|
||||
|
||||
template <typename RawType>
|
||||
class FloatingPointTest : public testing::Test {
|
||||
protected:
|
||||
typedef typename testing::internal::FloatingPoint<RawType> Floating;
|
||||
typedef typename Floating::Bits Bits;
|
||||
|
||||
virtual void SetUp() {
|
||||
const size_t max_ulps = Floating::kMaxUlps;
|
||||
|
||||
// The bits that represent 0.0.
|
||||
const Bits zero_bits = Floating(0).bits();
|
||||
|
||||
// Makes some numbers close to 0.0.
|
||||
close_to_positive_zero_ = Floating::ReinterpretBits(zero_bits + max_ulps/2);
|
||||
close_to_negative_zero_ = -Floating::ReinterpretBits(
|
||||
zero_bits + max_ulps - max_ulps/2);
|
||||
further_from_negative_zero_ = -Floating::ReinterpretBits(
|
||||
zero_bits + max_ulps + 1 - max_ulps/2);
|
||||
|
||||
// The bits that represent 1.0.
|
||||
const Bits one_bits = Floating(1).bits();
|
||||
|
||||
// Makes some numbers close to 1.0.
|
||||
close_to_one_ = Floating::ReinterpretBits(one_bits + max_ulps);
|
||||
further_from_one_ = Floating::ReinterpretBits(one_bits + max_ulps + 1);
|
||||
|
||||
// +infinity.
|
||||
infinity_ = Floating::Infinity();
|
||||
|
||||
// The bits that represent +infinity.
|
||||
const Bits infinity_bits = Floating(infinity_).bits();
|
||||
|
||||
// Makes some numbers close to infinity.
|
||||
close_to_infinity_ = Floating::ReinterpretBits(infinity_bits - max_ulps);
|
||||
further_from_infinity_ = Floating::ReinterpretBits(
|
||||
infinity_bits - max_ulps - 1);
|
||||
|
||||
// Makes some NAN's.
|
||||
nan1_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 1);
|
||||
nan2_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 200);
|
||||
}
|
||||
|
||||
void TestSize() {
|
||||
EXPECT_EQ(sizeof(RawType), sizeof(Bits));
|
||||
}
|
||||
|
||||
// Pre-calculated numbers to be used by the tests.
|
||||
|
||||
static RawType close_to_positive_zero_;
|
||||
static RawType close_to_negative_zero_;
|
||||
static RawType further_from_negative_zero_;
|
||||
|
||||
static RawType close_to_one_;
|
||||
static RawType further_from_one_;
|
||||
|
||||
static RawType infinity_;
|
||||
static RawType close_to_infinity_;
|
||||
static RawType further_from_infinity_;
|
||||
|
||||
static RawType nan1_;
|
||||
static RawType nan2_;
|
||||
};
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::close_to_positive_zero_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::close_to_negative_zero_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::further_from_negative_zero_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::close_to_one_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::further_from_one_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::infinity_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::close_to_infinity_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::further_from_infinity_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::nan1_;
|
||||
|
||||
template <typename RawType>
|
||||
RawType FloatingPointTest<RawType>::nan2_;
|
||||
|
||||
// Instantiates FloatingPointTest for testing *_FLOAT_EQ.
|
||||
typedef FloatingPointTest<float> FloatTest;
|
||||
|
||||
// Tests that the size of Float::Bits matches the size of float.
|
||||
TEST_F(FloatTest, Size) {
|
||||
TestSize();
|
||||
}
|
||||
|
||||
// Tests comparing with +0 and -0.
|
||||
TEST_F(FloatTest, Zeros) {
|
||||
EXPECT_FLOAT_EQ(0.0, -0.0);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),
|
||||
"1.0");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),
|
||||
"1.5");
|
||||
}
|
||||
|
||||
// Tests comparing numbers close to 0.
|
||||
//
|
||||
// This ensures that *_FLOAT_EQ handles the sign correctly and no
|
||||
// overflow occurs when comparing numbers whose absolute value is very
|
||||
// small.
|
||||
TEST_F(FloatTest, AlmostZeros) {
|
||||
EXPECT_FLOAT_EQ(0.0, close_to_positive_zero_);
|
||||
EXPECT_FLOAT_EQ(-0.0, close_to_negative_zero_);
|
||||
EXPECT_FLOAT_EQ(close_to_positive_zero_, close_to_negative_zero_);
|
||||
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_FLOAT_EQ(close_to_positive_zero_, further_from_negative_zero_);
|
||||
}, "further_from_negative_zero_");
|
||||
}
|
||||
|
||||
// Tests comparing numbers close to each other.
|
||||
TEST_F(FloatTest, SmallDiff) {
|
||||
EXPECT_FLOAT_EQ(1.0, close_to_one_);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, further_from_one_),
|
||||
"further_from_one_");
|
||||
}
|
||||
|
||||
// Tests comparing numbers far apart.
|
||||
TEST_F(FloatTest, LargeDiff) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),
|
||||
"3.0");
|
||||
}
|
||||
|
||||
// Tests comparing with infinity.
|
||||
//
|
||||
// This ensures that no overflow occurs when comparing numbers whose
|
||||
// absolute value is very large.
|
||||
TEST_F(FloatTest, Infinity) {
|
||||
EXPECT_FLOAT_EQ(infinity_, close_to_infinity_);
|
||||
EXPECT_FLOAT_EQ(-infinity_, -close_to_infinity_);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(infinity_, -infinity_),
|
||||
"-infinity_");
|
||||
|
||||
// This is interesting as the representations of infinity_ and nan1_
|
||||
// are only 1 DLP apart.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(infinity_, nan1_),
|
||||
"nan1_");
|
||||
}
|
||||
|
||||
// Tests that comparing with NAN always returns false.
|
||||
TEST_F(FloatTest, NaN) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(nan1_, nan1_),
|
||||
"nan1_");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(nan1_, nan2_),
|
||||
"nan2_");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, nan1_),
|
||||
"nan1_");
|
||||
|
||||
EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(nan1_, infinity_),
|
||||
"infinity_");
|
||||
}
|
||||
|
||||
// Tests that *_FLOAT_EQ are reflexive.
|
||||
TEST_F(FloatTest, Reflexive) {
|
||||
EXPECT_FLOAT_EQ(0.0, 0.0);
|
||||
EXPECT_FLOAT_EQ(1.0, 1.0);
|
||||
ASSERT_FLOAT_EQ(infinity_, infinity_);
|
||||
}
|
||||
|
||||
// Tests that *_FLOAT_EQ are commutative.
|
||||
TEST_F(FloatTest, Commutative) {
|
||||
// We already tested EXPECT_FLOAT_EQ(1.0, close_to_one_).
|
||||
EXPECT_FLOAT_EQ(close_to_one_, 1.0);
|
||||
|
||||
// We already tested EXPECT_FLOAT_EQ(1.0, further_from_one_).
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(further_from_one_, 1.0),
|
||||
"1.0");
|
||||
}
|
||||
|
||||
// Tests EXPECT_NEAR.
|
||||
TEST_F(FloatTest, EXPECT_NEAR) {
|
||||
EXPECT_NEAR(-1.0f, -1.1f, 0.2f);
|
||||
EXPECT_NEAR(2.0f, 3.0f, 1.0f);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.2f, 0.1f), // NOLINT
|
||||
"The difference between 1.0f and 1.2f is 0.2, "
|
||||
"which exceeds 0.1f");
|
||||
// To work around a bug in gcc 2.95.0, there is intentionally no
|
||||
// space after the first comma in the previous line.
|
||||
}
|
||||
|
||||
// Tests ASSERT_NEAR.
|
||||
TEST_F(FloatTest, ASSERT_NEAR) {
|
||||
ASSERT_NEAR(-1.0f, -1.1f, 0.2f);
|
||||
ASSERT_NEAR(2.0f, 3.0f, 1.0f);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.2f, 0.1f), // NOLINT
|
||||
"The difference between 1.0f and 1.2f is 0.2, "
|
||||
"which exceeds 0.1f");
|
||||
// To work around a bug in gcc 2.95.0, there is intentionally no
|
||||
// space after the first comma in the previous line.
|
||||
}
|
||||
|
||||
// Tests the cases where FloatLE() should succeed.
|
||||
TEST_F(FloatTest, FloatLESucceeds) {
|
||||
EXPECT_PRED_FORMAT2(testing::FloatLE, 1.0f, 2.0f); // When val1 < val2,
|
||||
ASSERT_PRED_FORMAT2(testing::FloatLE, 1.0f, 1.0f); // val1 == val2,
|
||||
|
||||
// or when val1 is greater than, but almost equals to, val2.
|
||||
EXPECT_PRED_FORMAT2(testing::FloatLE, close_to_positive_zero_, 0.0f);
|
||||
}
|
||||
|
||||
// Tests the cases where FloatLE() should fail.
|
||||
TEST_F(FloatTest, FloatLEFails) {
|
||||
// When val1 is greater than val2 by a large margin,
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(testing::FloatLE, 2.0f, 1.0f),
|
||||
"(2.0f) <= (1.0f)");
|
||||
|
||||
// or by a small yet non-negligible margin,
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::FloatLE, further_from_one_, 1.0f);
|
||||
}, "(further_from_one_) <= (1.0f)");
|
||||
|
||||
// or when either val1 or val2 is NaN.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::FloatLE, nan1_, infinity_);
|
||||
}, "(nan1_) <= (infinity_)");
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::FloatLE, -infinity_, nan1_);
|
||||
}, "(-infinity_) <= (nan1_)");
|
||||
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(testing::FloatLE, nan1_, nan1_);
|
||||
}, "(nan1_) <= (nan1_)");
|
||||
}
|
||||
|
||||
// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.
|
||||
typedef FloatingPointTest<double> DoubleTest;
|
||||
|
||||
// Tests that the size of Double::Bits matches the size of double.
|
||||
TEST_F(DoubleTest, Size) {
|
||||
TestSize();
|
||||
}
|
||||
|
||||
// Tests comparing with +0 and -0.
|
||||
TEST_F(DoubleTest, Zeros) {
|
||||
EXPECT_DOUBLE_EQ(0.0, -0.0);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),
|
||||
"1.0");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),
|
||||
"1.0");
|
||||
}
|
||||
|
||||
// Tests comparing numbers close to 0.
|
||||
//
|
||||
// This ensures that *_DOUBLE_EQ handles the sign correctly and no
|
||||
// overflow occurs when comparing numbers whose absolute value is very
|
||||
// small.
|
||||
TEST_F(DoubleTest, AlmostZeros) {
|
||||
EXPECT_DOUBLE_EQ(0.0, close_to_positive_zero_);
|
||||
EXPECT_DOUBLE_EQ(-0.0, close_to_negative_zero_);
|
||||
EXPECT_DOUBLE_EQ(close_to_positive_zero_, close_to_negative_zero_);
|
||||
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_DOUBLE_EQ(close_to_positive_zero_, further_from_negative_zero_);
|
||||
}, "further_from_negative_zero_");
|
||||
}
|
||||
|
||||
// Tests comparing numbers close to each other.
|
||||
TEST_F(DoubleTest, SmallDiff) {
|
||||
EXPECT_DOUBLE_EQ(1.0, close_to_one_);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, further_from_one_),
|
||||
"further_from_one_");
|
||||
}
|
||||
|
||||
// Tests comparing numbers far apart.
|
||||
TEST_F(DoubleTest, LargeDiff) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),
|
||||
"3.0");
|
||||
}
|
||||
|
||||
// Tests comparing with infinity.
|
||||
//
|
||||
// This ensures that no overflow occurs when comparing numbers whose
|
||||
// absolute value is very large.
|
||||
TEST_F(DoubleTest, Infinity) {
|
||||
EXPECT_DOUBLE_EQ(infinity_, close_to_infinity_);
|
||||
EXPECT_DOUBLE_EQ(-infinity_, -close_to_infinity_);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(infinity_, -infinity_),
|
||||
"-infinity_");
|
||||
|
||||
// This is interesting as the representations of infinity_ and nan1_
|
||||
// are only 1 DLP apart.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(infinity_, nan1_),
|
||||
"nan1_");
|
||||
}
|
||||
|
||||
// Tests that comparing with NAN always returns false.
|
||||
TEST_F(DoubleTest, NaN) {
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(nan1_, nan1_),
|
||||
"nan1_");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(nan1_, nan2_), "nan2_");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, nan1_), "nan1_");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(nan1_, infinity_), "infinity_");
|
||||
}
|
||||
|
||||
// Tests that *_DOUBLE_EQ are reflexive.
|
||||
TEST_F(DoubleTest, Reflexive) {
|
||||
EXPECT_DOUBLE_EQ(0.0, 0.0);
|
||||
EXPECT_DOUBLE_EQ(1.0, 1.0);
|
||||
ASSERT_DOUBLE_EQ(infinity_, infinity_);
|
||||
}
|
||||
|
||||
// Tests that *_DOUBLE_EQ are commutative.
|
||||
TEST_F(DoubleTest, Commutative) {
|
||||
// We already tested EXPECT_DOUBLE_EQ(1.0, close_to_one_).
|
||||
EXPECT_DOUBLE_EQ(close_to_one_, 1.0);
|
||||
|
||||
// We already tested EXPECT_DOUBLE_EQ(1.0, further_from_one_).
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(further_from_one_, 1.0), "1.0");
|
||||
}
|
||||
|
||||
// Tests EXPECT_NEAR.
|
||||
TEST_F(DoubleTest, EXPECT_NEAR) {
|
||||
EXPECT_NEAR(-1.0, -1.1, 0.2);
|
||||
EXPECT_NEAR(2.0, 3.0, 1.0);
|
||||
#ifdef __SYMBIAN32__
|
||||
// Symbian STLport has currently a buggy floating point output.
|
||||
// TODO(mikie): fix STLport.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.2, 0.1), // NOLINT
|
||||
"The difference between 1.0 and 1.2 is 0.19999:, "
|
||||
"which exceeds 0.1");
|
||||
#else // !__SYMBIAN32__
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.2, 0.1), // NOLINT
|
||||
"The difference between 1.0 and 1.2 is 0.2, "
|
||||
"which exceeds 0.1");
|
||||
// To work around a bug in gcc 2.95.0, there is intentionally no
|
||||
// space after the first comma in the previous statement.
|
||||
#endif // __SYMBIAN32__
|
||||
}
|
||||
|
||||
// Tests ASSERT_NEAR.
|
||||
TEST_F(DoubleTest, ASSERT_NEAR) {
|
||||
ASSERT_NEAR(-1.0, -1.1, 0.2);
|
||||
ASSERT_NEAR(2.0, 3.0, 1.0);
|
||||
#ifdef __SYMBIAN32__
|
||||
// Symbian STLport has currently a buggy floating point output.
|
||||
// TODO(mikie): fix STLport.
|
||||
EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.2, 0.1), // NOLINT
|
||||
"The difference between 1.0 and 1.2 is 0.19999:, "
|
||||
"which exceeds 0.1");
|
||||
#else // ! __SYMBIAN32__
|
||||
EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.2, 0.1), // NOLINT
|
||||
"The difference between 1.0 and 1.2 is 0.2, "
|
||||
"which exceeds 0.1");
|
||||
// To work around a bug in gcc 2.95.0, there is intentionally no
|
||||
// space after the first comma in the previous statement.
|
||||
#endif // __SYMBIAN32__
|
||||
}
|
||||
|
||||
// Tests the cases where DoubleLE() should succeed.
|
||||
TEST_F(DoubleTest, DoubleLESucceeds) {
|
||||
EXPECT_PRED_FORMAT2(testing::DoubleLE, 1.0, 2.0); // When val1 < val2,
|
||||
ASSERT_PRED_FORMAT2(testing::DoubleLE, 1.0, 1.0); // val1 == val2,
|
||||
|
||||
// or when val1 is greater than, but almost equals to, val2.
|
||||
EXPECT_PRED_FORMAT2(testing::DoubleLE, close_to_positive_zero_, 0.0);
|
||||
}
|
||||
|
||||
// Tests the cases where DoubleLE() should fail.
|
||||
TEST_F(DoubleTest, DoubleLEFails) {
|
||||
// When val1 is greater than val2 by a large margin,
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(testing::DoubleLE, 2.0, 1.0),
|
||||
"(2.0) <= (1.0)");
|
||||
|
||||
// or by a small yet non-negligible margin,
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::DoubleLE, further_from_one_, 1.0);
|
||||
}, "(further_from_one_) <= (1.0)");
|
||||
|
||||
// or when either val1 or val2 is NaN.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::DoubleLE, nan1_, infinity_);
|
||||
}, "(nan1_) <= (infinity_)");
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_PRED_FORMAT2(testing::DoubleLE, -infinity_, nan1_);
|
||||
}, " (-infinity_) <= (nan1_)");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_PRED_FORMAT2(testing::DoubleLE, nan1_, nan1_);
|
||||
}, "(nan1_) <= (nan1_)");
|
||||
}
|
||||
|
||||
|
||||
// Verifies that a test or test case whose name starts with DISABLED_ is
|
||||
// not run.
|
||||
|
||||
// A test whose name starts with DISABLED_.
|
||||
// Should not run.
|
||||
TEST(DisabledTest, DISABLED_TestShouldNotRun) {
|
||||
FAIL() << "Unexpected failure: Disabled test should not be run.";
|
||||
}
|
||||
|
||||
// A test whose name does not start with DISABLED_.
|
||||
// Should run.
|
||||
TEST(DisabledTest, NotDISABLED_TestShouldRun) {
|
||||
EXPECT_EQ(1, 1);
|
||||
}
|
||||
|
||||
// A test case whose name starts with DISABLED_.
|
||||
// Should not run.
|
||||
TEST(DISABLED_TestCase, TestShouldNotRun) {
|
||||
FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
|
||||
}
|
||||
|
||||
// A test case and test whose names start with DISABLED_.
|
||||
// Should not run.
|
||||
TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {
|
||||
FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
|
||||
}
|
||||
|
||||
// Check that when all tests in a test case are disabled, SetupTestCase() and
|
||||
// TearDownTestCase() are not called.
|
||||
class DisabledTestsTest : public testing::Test {
|
||||
protected:
|
||||
static void SetUpTestCase() {
|
||||
FAIL() << "Unexpected failure: All tests disabled in test case. "
|
||||
"SetupTestCase() should not be called.";
|
||||
}
|
||||
|
||||
static void TearDownTestCase() {
|
||||
FAIL() << "Unexpected failure: All tests disabled in test case. "
|
||||
"TearDownTestCase() should not be called.";
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {
|
||||
FAIL() << "Unexpected failure: Disabled test should not be run.";
|
||||
}
|
||||
|
||||
TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {
|
||||
FAIL() << "Unexpected failure: Disabled test should not be run.";
|
||||
}
|
||||
|
||||
|
||||
// Tests that assertion macros evaluate their arguments exactly once.
|
||||
|
||||
class SingleEvaluationTest : public testing::Test {
|
||||
protected:
|
||||
SingleEvaluationTest() {
|
||||
p1_ = s1_;
|
||||
p2_ = s2_;
|
||||
a_ = 0;
|
||||
b_ = 0;
|
||||
}
|
||||
|
||||
// This helper function is needed by the FailedASSERT_STREQ test
|
||||
// below.
|
||||
static void CompareAndIncrementCharPtrs() {
|
||||
ASSERT_STREQ(p1_++, p2_++);
|
||||
}
|
||||
|
||||
// This helper function is needed by the FailedASSERT_NE test below.
|
||||
static void CompareAndIncrementInts() {
|
||||
ASSERT_NE(a_++, b_++);
|
||||
}
|
||||
|
||||
static const char* const s1_;
|
||||
static const char* const s2_;
|
||||
static const char* p1_;
|
||||
static const char* p2_;
|
||||
|
||||
static int a_;
|
||||
static int b_;
|
||||
};
|
||||
|
||||
const char* const SingleEvaluationTest::s1_ = "01234";
|
||||
const char* const SingleEvaluationTest::s2_ = "abcde";
|
||||
const char* SingleEvaluationTest::p1_;
|
||||
const char* SingleEvaluationTest::p2_;
|
||||
int SingleEvaluationTest::a_;
|
||||
int SingleEvaluationTest::b_;
|
||||
|
||||
// Tests that when ASSERT_STREQ fails, it evaluates its arguments
|
||||
// exactly once.
|
||||
TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {
|
||||
EXPECT_FATAL_FAILURE(CompareAndIncrementCharPtrs(),
|
||||
"p2_++");
|
||||
EXPECT_EQ(s1_ + 1, p1_);
|
||||
EXPECT_EQ(s2_ + 1, p2_);
|
||||
}
|
||||
|
||||
// Tests that string assertion arguments are evaluated exactly once.
|
||||
TEST_F(SingleEvaluationTest, ASSERT_STR) {
|
||||
// successful EXPECT_STRNE
|
||||
EXPECT_STRNE(p1_++, p2_++);
|
||||
EXPECT_EQ(s1_ + 1, p1_);
|
||||
EXPECT_EQ(s2_ + 1, p2_);
|
||||
|
||||
// failed EXPECT_STRCASEEQ
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),
|
||||
"ignoring case");
|
||||
EXPECT_EQ(s1_ + 2, p1_);
|
||||
EXPECT_EQ(s2_ + 2, p2_);
|
||||
}
|
||||
|
||||
// Tests that when ASSERT_NE fails, it evaluates its arguments exactly
|
||||
// once.
|
||||
TEST_F(SingleEvaluationTest, FailedASSERT_NE) {
|
||||
EXPECT_FATAL_FAILURE(CompareAndIncrementInts(), "(a_++) != (b_++)");
|
||||
EXPECT_EQ(1, a_);
|
||||
EXPECT_EQ(1, b_);
|
||||
}
|
||||
|
||||
// Tests that assertion arguments are evaluated exactly once.
|
||||
TEST_F(SingleEvaluationTest, OtherCases) {
|
||||
// successful EXPECT_TRUE
|
||||
EXPECT_TRUE(0 == a_++); // NOLINT
|
||||
EXPECT_EQ(1, a_);
|
||||
|
||||
// failed EXPECT_TRUE
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++");
|
||||
EXPECT_EQ(2, a_);
|
||||
|
||||
// successful EXPECT_GT
|
||||
EXPECT_GT(a_++, b_++);
|
||||
EXPECT_EQ(3, a_);
|
||||
EXPECT_EQ(1, b_);
|
||||
|
||||
// failed EXPECT_LT
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)");
|
||||
EXPECT_EQ(4, a_);
|
||||
EXPECT_EQ(2, b_);
|
||||
|
||||
// successful ASSERT_TRUE
|
||||
ASSERT_TRUE(0 < a_++); // NOLINT
|
||||
EXPECT_EQ(5, a_);
|
||||
|
||||
// successful ASSERT_GT
|
||||
ASSERT_GT(a_++, b_++);
|
||||
EXPECT_EQ(6, a_);
|
||||
EXPECT_EQ(3, b_);
|
||||
}
|
||||
|
||||
|
||||
// Tests non-string assertions.
|
||||
|
||||
// Tests EqFailure(), used for implementing *EQ* assertions.
|
||||
TEST(AssertionTest, EqFailure) {
|
||||
const String foo_val("5"), bar_val("6");
|
||||
const String msg1(
|
||||
EqFailure("foo", "bar", foo_val, bar_val, false)
|
||||
.failure_message());
|
||||
EXPECT_STREQ(
|
||||
"Value of: bar\n"
|
||||
" Actual: 6\n"
|
||||
"Expected: foo\n"
|
||||
"Which is: 5",
|
||||
msg1.c_str());
|
||||
|
||||
const String msg2(
|
||||
EqFailure("foo", "6", foo_val, bar_val, false)
|
||||
.failure_message());
|
||||
EXPECT_STREQ(
|
||||
"Value of: 6\n"
|
||||
"Expected: foo\n"
|
||||
"Which is: 5",
|
||||
msg2.c_str());
|
||||
|
||||
const String msg3(
|
||||
EqFailure("5", "bar", foo_val, bar_val, false)
|
||||
.failure_message());
|
||||
EXPECT_STREQ(
|
||||
"Value of: bar\n"
|
||||
" Actual: 6\n"
|
||||
"Expected: 5",
|
||||
msg3.c_str());
|
||||
|
||||
const String msg4(
|
||||
EqFailure("5", "6", foo_val, bar_val, false).failure_message());
|
||||
EXPECT_STREQ(
|
||||
"Value of: 6\n"
|
||||
"Expected: 5",
|
||||
msg4.c_str());
|
||||
|
||||
const String msg5(
|
||||
EqFailure("foo", "bar",
|
||||
String("\"x\""), String("\"y\""),
|
||||
true).failure_message());
|
||||
EXPECT_STREQ(
|
||||
"Value of: bar\n"
|
||||
" Actual: \"y\"\n"
|
||||
"Expected: foo (ignoring case)\n"
|
||||
"Which is: \"x\"",
|
||||
msg5.c_str());
|
||||
}
|
||||
|
||||
// Tests AppendUserMessage(), used for implementing the *EQ* macros.
|
||||
TEST(AssertionTest, AppendUserMessage) {
|
||||
const String foo("foo");
|
||||
|
||||
testing::Message msg;
|
||||
EXPECT_STREQ("foo",
|
||||
AppendUserMessage(foo, msg).c_str());
|
||||
|
||||
msg << "bar";
|
||||
EXPECT_STREQ("foo\nbar",
|
||||
AppendUserMessage(foo, msg).c_str());
|
||||
}
|
||||
|
||||
// Tests ASSERT_TRUE.
|
||||
TEST(AssertionTest, ASSERT_TRUE) {
|
||||
ASSERT_TRUE(2 > 1); // NOLINT
|
||||
EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),
|
||||
"2 < 1");
|
||||
}
|
||||
|
||||
// Tests ASSERT_FALSE.
|
||||
TEST(AssertionTest, ASSERT_FALSE) {
|
||||
ASSERT_FALSE(2 < 1); // NOLINT
|
||||
EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),
|
||||
"Value of: 2 > 1\n"
|
||||
" Actual: true\n"
|
||||
"Expected: false");
|
||||
}
|
||||
|
||||
// Tests using ASSERT_EQ on double values. The purpose is to make
|
||||
// sure that the specialization we did for integer and anonymous enums
|
||||
// isn't used for double arguments.
|
||||
TEST(ExpectTest, ASSERT_EQ_Double) {
|
||||
// A success.
|
||||
ASSERT_EQ(5.6, 5.6);
|
||||
|
||||
// A failure.
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),
|
||||
"5.1");
|
||||
}
|
||||
|
||||
// Tests ASSERT_EQ.
|
||||
TEST(AssertionTest, ASSERT_EQ) {
|
||||
ASSERT_EQ(5, 2 + 3);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),
|
||||
"Value of: 2*3\n"
|
||||
" Actual: 6\n"
|
||||
"Expected: 5");
|
||||
}
|
||||
|
||||
// Tests ASSERT_EQ(NULL, pointer).
|
||||
#ifndef __SYMBIAN32__
|
||||
// The NULL-detection template magic fails to compile with
|
||||
// the Nokia compiler and crashes the ARM compiler, hence
|
||||
// not testing on Symbian.
|
||||
TEST(AssertionTest, ASSERT_EQ_NULL) {
|
||||
// A success.
|
||||
const char* p = NULL;
|
||||
ASSERT_EQ(NULL, p);
|
||||
|
||||
// A failure.
|
||||
static int n = 0;
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),
|
||||
"Value of: &n\n");
|
||||
}
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Tests ASSERT_EQ(0, non_pointer). Since the literal 0 can be
|
||||
// treated as a null pointer by the compiler, we need to make sure
|
||||
// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as
|
||||
// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).
|
||||
TEST(ExpectTest, ASSERT_EQ_0) {
|
||||
int n = 0;
|
||||
|
||||
// A success.
|
||||
ASSERT_EQ(0, n);
|
||||
|
||||
// A failure.
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),
|
||||
"Expected: 0");
|
||||
}
|
||||
|
||||
// Tests ASSERT_NE.
|
||||
TEST(AssertionTest, ASSERT_NE) {
|
||||
ASSERT_NE(6, 7);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),
|
||||
"Expected: ('a') != ('a'), "
|
||||
"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
|
||||
}
|
||||
|
||||
// Tests ASSERT_LE.
|
||||
TEST(AssertionTest, ASSERT_LE) {
|
||||
ASSERT_LE(2, 3);
|
||||
ASSERT_LE(2, 2);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),
|
||||
"Expected: (2) <= (0), actual: 2 vs 0");
|
||||
}
|
||||
|
||||
// Tests ASSERT_LT.
|
||||
TEST(AssertionTest, ASSERT_LT) {
|
||||
ASSERT_LT(2, 3);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),
|
||||
"Expected: (2) < (2), actual: 2 vs 2");
|
||||
}
|
||||
|
||||
// Tests ASSERT_GE.
|
||||
TEST(AssertionTest, ASSERT_GE) {
|
||||
ASSERT_GE(2, 1);
|
||||
ASSERT_GE(2, 2);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),
|
||||
"Expected: (2) >= (3), actual: 2 vs 3");
|
||||
}
|
||||
|
||||
// Tests ASSERT_GT.
|
||||
TEST(AssertionTest, ASSERT_GT) {
|
||||
ASSERT_GT(2, 1);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),
|
||||
"Expected: (2) > (2), actual: 2 vs 2");
|
||||
}
|
||||
|
||||
// Makes sure we deal with the precedence of <<. This test should
|
||||
// compile.
|
||||
TEST(AssertionTest, AssertPrecedence) {
|
||||
ASSERT_EQ(1 < 2, true);
|
||||
ASSERT_EQ(true && false, false);
|
||||
}
|
||||
|
||||
// A subroutine used by the following test.
|
||||
void TestEq1(int x) {
|
||||
ASSERT_EQ(1, x);
|
||||
}
|
||||
|
||||
// Tests calling a test subroutine that's not part of a fixture.
|
||||
TEST(AssertionTest, NonFixtureSubroutine) {
|
||||
EXPECT_FATAL_FAILURE(TestEq1(2),
|
||||
"Value of: x");
|
||||
}
|
||||
|
||||
// An uncopyable class.
|
||||
class Uncopyable {
|
||||
public:
|
||||
explicit Uncopyable(int value) : value_(value) {}
|
||||
|
||||
int value() const { return value_; }
|
||||
bool operator==(const Uncopyable& rhs) const {
|
||||
return value() == rhs.value();
|
||||
}
|
||||
private:
|
||||
// This constructor deliberately has no implementation, as we don't
|
||||
// want this class to be copyable.
|
||||
Uncopyable(const Uncopyable&); // NOLINT
|
||||
|
||||
int value_;
|
||||
};
|
||||
|
||||
::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {
|
||||
return os << value.value();
|
||||
}
|
||||
|
||||
|
||||
bool IsPositiveUncopyable(const Uncopyable& x) {
|
||||
return x.value() > 0;
|
||||
}
|
||||
|
||||
// A subroutine used by the following test.
|
||||
void TestAssertNonPositive() {
|
||||
Uncopyable y(-1);
|
||||
ASSERT_PRED1(IsPositiveUncopyable, y);
|
||||
}
|
||||
// A subroutine used by the following test.
|
||||
void TestAssertEqualsUncopyable() {
|
||||
Uncopyable x(5);
|
||||
Uncopyable y(-1);
|
||||
ASSERT_EQ(x, y);
|
||||
}
|
||||
|
||||
// Tests that uncopyable objects can be used in assertions.
|
||||
TEST(AssertionTest, AssertWorksWithUncopyableObject) {
|
||||
Uncopyable x(5);
|
||||
ASSERT_PRED1(IsPositiveUncopyable, x);
|
||||
ASSERT_EQ(x, x);
|
||||
EXPECT_FATAL_FAILURE(TestAssertNonPositive(),
|
||||
"IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
|
||||
EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),
|
||||
"Value of: y\n Actual: -1\nExpected: x\nWhich is: 5");
|
||||
}
|
||||
|
||||
// Tests that uncopyable objects can be used in expects.
|
||||
TEST(AssertionTest, ExpectWorksWithUncopyableObject) {
|
||||
Uncopyable x(5);
|
||||
EXPECT_PRED1(IsPositiveUncopyable, x);
|
||||
Uncopyable y(-1);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),
|
||||
"IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
|
||||
EXPECT_EQ(x, x);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),
|
||||
"Value of: y\n Actual: -1\nExpected: x\nWhich is: 5");
|
||||
}
|
||||
|
||||
|
||||
// The version of gcc used in XCode 2.2 has a bug and doesn't allow
|
||||
// anonymous enums in assertions. Therefore the following test is
|
||||
// done only on Linux and Windows.
|
||||
#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_WINDOWS)
|
||||
|
||||
// Tests using assertions with anonymous enums.
|
||||
enum {
|
||||
CASE_A = -1,
|
||||
#ifdef GTEST_OS_LINUX
|
||||
// We want to test the case where the size of the anonymous enum is
|
||||
// larger than sizeof(int), to make sure our implementation of the
|
||||
// assertions doesn't truncate the enums. However, MSVC
|
||||
// (incorrectly) doesn't allow an enum value to exceed the range of
|
||||
// an int, so this has to be conditionally compiled.
|
||||
//
|
||||
// On Linux, CASE_B and CASE_A have the same value when truncated to
|
||||
// int size. We want to test whether this will confuse the
|
||||
// assertions.
|
||||
CASE_B = ::testing::internal::kMaxBiggestInt,
|
||||
#else
|
||||
CASE_B = INT_MAX,
|
||||
#endif // GTEST_OS_LINUX
|
||||
};
|
||||
|
||||
TEST(AssertionTest, AnonymousEnum) {
|
||||
#ifdef GTEST_OS_LINUX
|
||||
EXPECT_EQ(static_cast<int>(CASE_A), static_cast<int>(CASE_B));
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
EXPECT_EQ(CASE_A, CASE_A);
|
||||
EXPECT_NE(CASE_A, CASE_B);
|
||||
EXPECT_LT(CASE_A, CASE_B);
|
||||
EXPECT_LE(CASE_A, CASE_B);
|
||||
EXPECT_GT(CASE_B, CASE_A);
|
||||
EXPECT_GE(CASE_A, CASE_A);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_GE(CASE_A, CASE_B),
|
||||
"(CASE_A) >= (CASE_B)");
|
||||
|
||||
ASSERT_EQ(CASE_A, CASE_A);
|
||||
ASSERT_NE(CASE_A, CASE_B);
|
||||
ASSERT_LT(CASE_A, CASE_B);
|
||||
ASSERT_LE(CASE_A, CASE_B);
|
||||
ASSERT_GT(CASE_B, CASE_A);
|
||||
ASSERT_GE(CASE_A, CASE_A);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(CASE_A, CASE_B),
|
||||
"Value of: CASE_B");
|
||||
}
|
||||
|
||||
#endif // defined(GTEST_OS_LINUX) || defined(GTEST_OS_WINDOWS)
|
||||
|
||||
#if defined(GTEST_OS_WINDOWS)
|
||||
|
||||
static HRESULT UnexpectedHRESULTFailure() {
|
||||
return E_UNEXPECTED;
|
||||
}
|
||||
|
||||
static HRESULT OkHRESULTSuccess() {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT FalseHRESULTSuccess() {
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
// HRESULT assertion tests test both zero and non-zero
|
||||
// success codes as well as failure message for each.
|
||||
//
|
||||
// Windows CE doesn't support message texts.
|
||||
TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {
|
||||
EXPECT_HRESULT_SUCCEEDED(S_OK);
|
||||
EXPECT_HRESULT_SUCCEEDED(S_FALSE);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
const char* expected =
|
||||
"Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
|
||||
" Actual: 0x8000FFFF";
|
||||
#else // Windows proper
|
||||
const char* expected =
|
||||
"Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
|
||||
" Actual: 0x8000FFFF Catastrophic failure";
|
||||
#endif // _WIN32_WCE
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
|
||||
expected);
|
||||
}
|
||||
|
||||
TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {
|
||||
ASSERT_HRESULT_SUCCEEDED(S_OK);
|
||||
ASSERT_HRESULT_SUCCEEDED(S_FALSE);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
const char* expected =
|
||||
"Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
|
||||
" Actual: 0x8000FFFF";
|
||||
#else // Windows proper
|
||||
const char* expected =
|
||||
"Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
|
||||
" Actual: 0x8000FFFF Catastrophic failure";
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
|
||||
expected);
|
||||
}
|
||||
|
||||
TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {
|
||||
EXPECT_HRESULT_FAILED(E_UNEXPECTED);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
const char* expected_success =
|
||||
"Expected: (OkHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000000";
|
||||
const char* expected_incorrect_function =
|
||||
"Expected: (FalseHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000001";
|
||||
#else // Windows proper
|
||||
const char* expected_success =
|
||||
"Expected: (OkHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000000 The operation completed successfully";
|
||||
const char* expected_incorrect_function =
|
||||
"Expected: (FalseHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000001 Incorrect function.";
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),
|
||||
expected_success);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),
|
||||
expected_incorrect_function);
|
||||
}
|
||||
|
||||
TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {
|
||||
ASSERT_HRESULT_FAILED(E_UNEXPECTED);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
const char* expected_success =
|
||||
"Expected: (OkHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000000";
|
||||
const char* expected_incorrect_function =
|
||||
"Expected: (FalseHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000001";
|
||||
#else // Windows proper
|
||||
const char* expected_success =
|
||||
"Expected: (OkHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000000 The operation completed successfully";
|
||||
const char* expected_incorrect_function =
|
||||
"Expected: (FalseHRESULTSuccess()) fails.\n"
|
||||
" Actual: 0x00000001 Incorrect function.";
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),
|
||||
expected_success);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),
|
||||
expected_incorrect_function);
|
||||
}
|
||||
|
||||
// Tests that streaming to the HRESULT macros works.
|
||||
TEST(HRESULTAssertionTest, Streaming) {
|
||||
EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
|
||||
ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
|
||||
EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
|
||||
ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(
|
||||
EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
|
||||
"expected failure");
|
||||
|
||||
EXPECT_FATAL_FAILURE(
|
||||
ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
|
||||
"expected failure");
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(
|
||||
EXPECT_HRESULT_FAILED(S_OK) << "expected failure",
|
||||
"expected failure");
|
||||
|
||||
EXPECT_FATAL_FAILURE(
|
||||
ASSERT_HRESULT_FAILED(S_OK) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
#endif // defined(GTEST_OS_WINDOWS)
|
||||
|
||||
// Tests that the assertion macros behave like single statements.
|
||||
TEST(AssertionSyntaxTest, BehavesLikeSingleStatement) {
|
||||
if (false)
|
||||
ASSERT_TRUE(false) << "This should never be executed; "
|
||||
"It's a compilation test only.";
|
||||
|
||||
if (true)
|
||||
EXPECT_FALSE(false);
|
||||
else
|
||||
;
|
||||
|
||||
if (false)
|
||||
ASSERT_LT(1, 3);
|
||||
|
||||
if (false)
|
||||
;
|
||||
else
|
||||
EXPECT_GT(3, 2) << "";
|
||||
}
|
||||
|
||||
// Tests that the assertion macros work well with switch statements.
|
||||
TEST(AssertionSyntaxTest, WorksWithSwitch) {
|
||||
switch (0) {
|
||||
case 1:
|
||||
break;
|
||||
default:
|
||||
ASSERT_TRUE(true);
|
||||
}
|
||||
|
||||
switch (0)
|
||||
case 0:
|
||||
EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case";
|
||||
|
||||
// Binary assertions are implemented using a different code path
|
||||
// than the Boolean assertions. Hence we test them separately.
|
||||
switch (0) {
|
||||
case 1:
|
||||
default:
|
||||
ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler";
|
||||
}
|
||||
|
||||
switch (0)
|
||||
case 0:
|
||||
EXPECT_NE(1, 2);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Returns the number of successful parts in the current test.
|
||||
static size_t GetSuccessfulPartCount() {
|
||||
return UnitTest::GetInstance()->impl()->current_test_result()->
|
||||
successful_part_count();
|
||||
}
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Tests that Google Test tracks SUCCEED*.
|
||||
TEST(SuccessfulAssertionTest, SUCCEED) {
|
||||
SUCCEED();
|
||||
SUCCEED() << "OK";
|
||||
EXPECT_EQ(2u, GetSuccessfulPartCount());
|
||||
}
|
||||
|
||||
// Tests that Google Test doesn't track successful EXPECT_*.
|
||||
TEST(SuccessfulAssertionTest, EXPECT) {
|
||||
EXPECT_TRUE(true);
|
||||
EXPECT_EQ(0u, GetSuccessfulPartCount());
|
||||
}
|
||||
|
||||
// Tests that Google Test doesn't track successful EXPECT_STR*.
|
||||
TEST(SuccessfulAssertionTest, EXPECT_STR) {
|
||||
EXPECT_STREQ("", "");
|
||||
EXPECT_EQ(0u, GetSuccessfulPartCount());
|
||||
}
|
||||
|
||||
// Tests that Google Test doesn't track successful ASSERT_*.
|
||||
TEST(SuccessfulAssertionTest, ASSERT) {
|
||||
ASSERT_TRUE(true);
|
||||
EXPECT_EQ(0u, GetSuccessfulPartCount());
|
||||
}
|
||||
|
||||
// Tests that Google Test doesn't track successful ASSERT_STR*.
|
||||
TEST(SuccessfulAssertionTest, ASSERT_STR) {
|
||||
ASSERT_STREQ("", "");
|
||||
EXPECT_EQ(0u, GetSuccessfulPartCount());
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
|
||||
namespace {
|
||||
|
||||
// Tests EXPECT_TRUE.
|
||||
TEST(ExpectTest, EXPECT_TRUE) {
|
||||
EXPECT_TRUE(2 > 1); // NOLINT
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),
|
||||
"Value of: 2 < 1\n"
|
||||
" Actual: false\n"
|
||||
"Expected: true");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),
|
||||
"2 > 3");
|
||||
}
|
||||
|
||||
// Tests EXPECT_FALSE.
|
||||
TEST(ExpectTest, EXPECT_FALSE) {
|
||||
EXPECT_FALSE(2 < 1); // NOLINT
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),
|
||||
"Value of: 2 > 1\n"
|
||||
" Actual: true\n"
|
||||
"Expected: false");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),
|
||||
"2 < 3");
|
||||
}
|
||||
|
||||
// Tests EXPECT_EQ.
|
||||
TEST(ExpectTest, EXPECT_EQ) {
|
||||
EXPECT_EQ(5, 2 + 3);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),
|
||||
"Value of: 2*3\n"
|
||||
" Actual: 6\n"
|
||||
"Expected: 5");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),
|
||||
"2 - 3");
|
||||
}
|
||||
|
||||
// Tests using EXPECT_EQ on double values. The purpose is to make
|
||||
// sure that the specialization we did for integer and anonymous enums
|
||||
// isn't used for double arguments.
|
||||
TEST(ExpectTest, EXPECT_EQ_Double) {
|
||||
// A success.
|
||||
EXPECT_EQ(5.6, 5.6);
|
||||
|
||||
// A failure.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),
|
||||
"5.1");
|
||||
}
|
||||
|
||||
#ifndef __SYMBIAN32__
|
||||
// Tests EXPECT_EQ(NULL, pointer).
|
||||
TEST(ExpectTest, EXPECT_EQ_NULL) {
|
||||
// A success.
|
||||
const char* p = NULL;
|
||||
EXPECT_EQ(NULL, p);
|
||||
|
||||
// A failure.
|
||||
int n = 0;
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),
|
||||
"Value of: &n\n");
|
||||
}
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Tests EXPECT_EQ(0, non_pointer). Since the literal 0 can be
|
||||
// treated as a null pointer by the compiler, we need to make sure
|
||||
// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as
|
||||
// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).
|
||||
TEST(ExpectTest, EXPECT_EQ_0) {
|
||||
int n = 0;
|
||||
|
||||
// A success.
|
||||
EXPECT_EQ(0, n);
|
||||
|
||||
// A failure.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),
|
||||
"Expected: 0");
|
||||
}
|
||||
|
||||
// Tests EXPECT_NE.
|
||||
TEST(ExpectTest, EXPECT_NE) {
|
||||
EXPECT_NE(6, 7);
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),
|
||||
"Expected: ('a') != ('a'), "
|
||||
"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),
|
||||
"2");
|
||||
char* const p0 = NULL;
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),
|
||||
"p0");
|
||||
// Only way to get the Nokia compiler to compile the cast
|
||||
// is to have a separate void* variable first. Putting
|
||||
// the two casts on the same line doesn't work, neither does
|
||||
// a direct C-style to char*.
|
||||
void* pv1 = (void*)0x1234; // NOLINT
|
||||
char* const p1 = reinterpret_cast<char*>(pv1);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),
|
||||
"p1");
|
||||
}
|
||||
|
||||
// Tests EXPECT_LE.
|
||||
TEST(ExpectTest, EXPECT_LE) {
|
||||
EXPECT_LE(2, 3);
|
||||
EXPECT_LE(2, 2);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),
|
||||
"Expected: (2) <= (0), actual: 2 vs 0");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),
|
||||
"(1.1) <= (0.9)");
|
||||
}
|
||||
|
||||
// Tests EXPECT_LT.
|
||||
TEST(ExpectTest, EXPECT_LT) {
|
||||
EXPECT_LT(2, 3);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),
|
||||
"Expected: (2) < (2), actual: 2 vs 2");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),
|
||||
"(2) < (1)");
|
||||
}
|
||||
|
||||
// Tests EXPECT_GE.
|
||||
TEST(ExpectTest, EXPECT_GE) {
|
||||
EXPECT_GE(2, 1);
|
||||
EXPECT_GE(2, 2);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),
|
||||
"Expected: (2) >= (3), actual: 2 vs 3");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),
|
||||
"(0.9) >= (1.1)");
|
||||
}
|
||||
|
||||
// Tests EXPECT_GT.
|
||||
TEST(ExpectTest, EXPECT_GT) {
|
||||
EXPECT_GT(2, 1);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),
|
||||
"Expected: (2) > (2), actual: 2 vs 2");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),
|
||||
"(2) > (3)");
|
||||
}
|
||||
|
||||
// Make sure we deal with the precedence of <<.
|
||||
TEST(ExpectTest, ExpectPrecedence) {
|
||||
EXPECT_EQ(1 < 2, true);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),
|
||||
"Value of: true && false");
|
||||
}
|
||||
|
||||
|
||||
// Tests the StreamableToString() function.
|
||||
|
||||
// Tests using StreamableToString() on a scalar.
|
||||
TEST(StreamableToStringTest, Scalar) {
|
||||
EXPECT_STREQ("5", StreamableToString(5).c_str());
|
||||
}
|
||||
|
||||
// Tests using StreamableToString() on a non-char pointer.
|
||||
TEST(StreamableToStringTest, Pointer) {
|
||||
int n = 0;
|
||||
int* p = &n;
|
||||
EXPECT_STRNE("(null)", StreamableToString(p).c_str());
|
||||
}
|
||||
|
||||
// Tests using StreamableToString() on a NULL non-char pointer.
|
||||
TEST(StreamableToStringTest, NullPointer) {
|
||||
int* p = NULL;
|
||||
EXPECT_STREQ("(null)", StreamableToString(p).c_str());
|
||||
}
|
||||
|
||||
// Tests using StreamableToString() on a C string.
|
||||
TEST(StreamableToStringTest, CString) {
|
||||
EXPECT_STREQ("Foo", StreamableToString("Foo").c_str());
|
||||
}
|
||||
|
||||
// Tests using StreamableToString() on a NULL C string.
|
||||
TEST(StreamableToStringTest, NullCString) {
|
||||
char* p = NULL;
|
||||
EXPECT_STREQ("(null)", StreamableToString(p).c_str());
|
||||
}
|
||||
|
||||
// Tests using streamable values as assertion messages.
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
// Tests using std::string as an assertion message.
|
||||
TEST(StreamableTest, string) {
|
||||
static const std::string str(
|
||||
"This failure message is a std::string, and is expected.");
|
||||
EXPECT_FATAL_FAILURE(FAIL() << str,
|
||||
str.c_str());
|
||||
}
|
||||
|
||||
// Tests that we can output strings containing embedded NULs.
|
||||
// Limited to Linux because we can only do this with std::string's.
|
||||
TEST(StreamableTest, stringWithEmbeddedNUL) {
|
||||
static const char char_array_with_nul[] =
|
||||
"Here's a NUL\0 and some more string";
|
||||
static const std::string string_with_nul(char_array_with_nul,
|
||||
sizeof(char_array_with_nul)
|
||||
- 1); // drops the trailing NUL
|
||||
EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,
|
||||
"Here's a NUL\\0 and some more string");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// Tests that we can output a NUL char.
|
||||
TEST(StreamableTest, NULChar) {
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
FAIL() << "A NUL" << '\0' << " and some more string";
|
||||
}, "A NUL\\0 and some more string");
|
||||
}
|
||||
|
||||
// Tests using int as an assertion message.
|
||||
TEST(StreamableTest, int) {
|
||||
EXPECT_FATAL_FAILURE(FAIL() << 900913,
|
||||
"900913");
|
||||
}
|
||||
|
||||
// Tests using NULL char pointer as an assertion message.
|
||||
//
|
||||
// In MSVC, streaming a NULL char * causes access violation. Google Test
|
||||
// implemented a workaround (substituting "(null)" for NULL). This
|
||||
// tests whether the workaround works.
|
||||
TEST(StreamableTest, NullCharPtr) {
|
||||
EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),
|
||||
"(null)");
|
||||
}
|
||||
|
||||
// Tests that basic IO manipulators (endl, ends, and flush) can be
|
||||
// streamed to testing::Message.
|
||||
TEST(StreamableTest, BasicIoManip) {
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
FAIL() << "Line 1." << std::endl
|
||||
<< "A NUL char " << std::ends << std::flush << " in line 2.";
|
||||
}, "Line 1.\nA NUL char \\0 in line 2.");
|
||||
}
|
||||
|
||||
|
||||
// Tests the macros that haven't been covered so far.
|
||||
|
||||
void AddFailureHelper(bool* aborted) {
|
||||
*aborted = true;
|
||||
ADD_FAILURE() << "Failure";
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
// Tests ADD_FAILURE.
|
||||
TEST(MacroTest, ADD_FAILURE) {
|
||||
bool aborted = true;
|
||||
EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),
|
||||
"Failure");
|
||||
EXPECT_FALSE(aborted);
|
||||
}
|
||||
|
||||
// Tests FAIL.
|
||||
TEST(MacroTest, FAIL) {
|
||||
EXPECT_FATAL_FAILURE(FAIL(),
|
||||
"Failed");
|
||||
EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.",
|
||||
"Intentional failure.");
|
||||
}
|
||||
|
||||
// Tests SUCCEED
|
||||
TEST(MacroTest, SUCCEED) {
|
||||
SUCCEED();
|
||||
SUCCEED() << "Explicit success.";
|
||||
}
|
||||
|
||||
|
||||
// Tests for EXPECT_EQ() and ASSERT_EQ().
|
||||
//
|
||||
// These tests fail *intentionally*, s.t. the failure messages can be
|
||||
// generated and tested.
|
||||
//
|
||||
// We have different tests for different argument types.
|
||||
|
||||
// Tests using bool values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, Bool) {
|
||||
EXPECT_EQ(true, true);
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(false, true),
|
||||
"Value of: true");
|
||||
}
|
||||
|
||||
// Tests using int values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, Int) {
|
||||
ASSERT_EQ(32, 32);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),
|
||||
"33");
|
||||
}
|
||||
|
||||
// Tests using time_t values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, Time_T) {
|
||||
EXPECT_EQ(static_cast<time_t>(0),
|
||||
static_cast<time_t>(0));
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),
|
||||
static_cast<time_t>(1234)),
|
||||
"1234");
|
||||
}
|
||||
|
||||
// Tests using char values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, Char) {
|
||||
ASSERT_EQ('z', 'z');
|
||||
const char ch = 'b';
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch),
|
||||
"ch");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),
|
||||
"ch");
|
||||
}
|
||||
|
||||
// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, WideChar) {
|
||||
EXPECT_EQ(L'b', L'b');
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'),
|
||||
"Value of: L'x'\n"
|
||||
" Actual: L'x' (120, 0x78)\n"
|
||||
"Expected: L'\0'\n"
|
||||
"Which is: L'\0' (0, 0x0)");
|
||||
|
||||
static wchar_t wchar;
|
||||
wchar = L'b';
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),
|
||||
"wchar");
|
||||
wchar = L'\x8119';
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(L'\x8120', wchar),
|
||||
"Value of: wchar");
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, StdString) {
|
||||
// Compares a const char* to an std::string that has identical
|
||||
// content.
|
||||
ASSERT_EQ("Test", ::std::string("Test"));
|
||||
|
||||
// Compares two identical std::strings.
|
||||
static const ::std::string str1("A * in the middle");
|
||||
static const ::std::string str2(str1);
|
||||
EXPECT_EQ(str1, str2);
|
||||
|
||||
// Compares a const char* to an std::string that has different
|
||||
// content
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")),
|
||||
"::std::string(\"test\")");
|
||||
|
||||
// Compares an std::string to a char* that has different content.
|
||||
char* const p1 = const_cast<char*>("foo");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1),
|
||||
"p1");
|
||||
|
||||
// Compares two std::strings that have different contents, one of
|
||||
// which having a NUL character in the middle. This should fail.
|
||||
static ::std::string str3(str1);
|
||||
str3.at(2) = '\0';
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),
|
||||
"Value of: str3\n"
|
||||
" Actual: \"A \\0 in the middle\"");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
|
||||
// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, StdWideString) {
|
||||
// Compares an std::wstring to a const wchar_t* that has identical
|
||||
// content.
|
||||
EXPECT_EQ(::std::wstring(L"Test\x8119"), L"Test\x8119");
|
||||
|
||||
// Compares two identical std::wstrings.
|
||||
const ::std::wstring wstr1(L"A * in the middle");
|
||||
const ::std::wstring wstr2(wstr1);
|
||||
ASSERT_EQ(wstr1, wstr2);
|
||||
|
||||
// Compares an std::wstring to a const wchar_t* that has different
|
||||
// content.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_EQ(::std::wstring(L"Test\x8119"), L"Test\x8120");
|
||||
}, "L\"Test\\x8120\"");
|
||||
|
||||
// Compares two std::wstrings that have different contents, one of
|
||||
// which having a NUL character in the middle.
|
||||
::std::wstring wstr3(wstr1);
|
||||
wstr3.at(2) = L'\0';
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),
|
||||
"wstr3");
|
||||
|
||||
// Compares a wchar_t* to an std::wstring that has different
|
||||
// content.
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar"));
|
||||
}, "");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
// Tests using ::string values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, GlobalString) {
|
||||
// Compares a const char* to a ::string that has identical content.
|
||||
EXPECT_EQ("Test", ::string("Test"));
|
||||
|
||||
// Compares two identical ::strings.
|
||||
const ::string str1("A * in the middle");
|
||||
const ::string str2(str1);
|
||||
ASSERT_EQ(str1, str2);
|
||||
|
||||
// Compares a ::string to a const char* that has different content.
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"),
|
||||
"test");
|
||||
|
||||
// Compares two ::strings that have different contents, one of which
|
||||
// having a NUL character in the middle.
|
||||
::string str3(str1);
|
||||
str3.at(2) = '\0';
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),
|
||||
"str3");
|
||||
|
||||
// Compares a ::string to a char* that has different content.
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_EQ(::string("bar"), const_cast<char*>("foo"));
|
||||
}, "");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, GlobalWideString) {
|
||||
// Compares a const wchar_t* to a ::wstring that has identical content.
|
||||
ASSERT_EQ(L"Test\x8119", ::wstring(L"Test\x8119"));
|
||||
|
||||
// Compares two identical ::wstrings.
|
||||
static const ::wstring wstr1(L"A * in the middle");
|
||||
static const ::wstring wstr2(wstr1);
|
||||
EXPECT_EQ(wstr1, wstr2);
|
||||
|
||||
// Compares a const wchar_t* to a ::wstring that has different
|
||||
// content.
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_EQ(L"Test\x8120", ::wstring(L"Test\x8119"));
|
||||
}, "Test\\x8119");
|
||||
|
||||
// Compares a wchar_t* to a ::wstring that has different content.
|
||||
wchar_t* const p1 = const_cast<wchar_t*>(L"foo");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")),
|
||||
"bar");
|
||||
|
||||
// Compares two ::wstrings that have different contents, one of which
|
||||
// having a NUL character in the middle.
|
||||
static ::wstring wstr3;
|
||||
wstr3 = wstr1;
|
||||
wstr3.at(2) = L'\0';
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),
|
||||
"wstr3");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
// Tests using char pointers in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, CharPointer) {
|
||||
char* const p0 = NULL;
|
||||
// Only way to get the Nokia compiler to compile the cast
|
||||
// is to have a separate void* variable first. Putting
|
||||
// the two casts on the same line doesn't work, neither does
|
||||
// a direct C-style to char*.
|
||||
void* pv1 = (void*)0x1234; // NOLINT
|
||||
void* pv2 = (void*)0xABC0; // NOLINT
|
||||
char* const p1 = reinterpret_cast<char*>(pv1);
|
||||
char* const p2 = reinterpret_cast<char*>(pv2);
|
||||
ASSERT_EQ(p1, p1);
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
|
||||
"Value of: p2");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
|
||||
"p2");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),
|
||||
reinterpret_cast<char*>(0xABC0)),
|
||||
"ABC0");
|
||||
}
|
||||
|
||||
// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, WideCharPointer) {
|
||||
wchar_t* const p0 = NULL;
|
||||
// Only way to get the Nokia compiler to compile the cast
|
||||
// is to have a separate void* variable first. Putting
|
||||
// the two casts on the same line doesn't work, neither does
|
||||
// a direct C-style to char*.
|
||||
void* pv1 = (void*)0x1234; // NOLINT
|
||||
void* pv2 = (void*)0xABC0; // NOLINT
|
||||
wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);
|
||||
wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);
|
||||
EXPECT_EQ(p0, p0);
|
||||
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
|
||||
"Value of: p2");
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
|
||||
"p2");
|
||||
void* pv3 = (void*)0x1234; // NOLINT
|
||||
void* pv4 = (void*)0xABC0; // NOLINT
|
||||
const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);
|
||||
const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),
|
||||
"p4");
|
||||
}
|
||||
|
||||
// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.
|
||||
TEST(EqAssertionTest, OtherPointer) {
|
||||
ASSERT_EQ(static_cast<const int*>(NULL),
|
||||
static_cast<const int*>(NULL));
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),
|
||||
reinterpret_cast<const int*>(0x1234)),
|
||||
"0x1234");
|
||||
}
|
||||
|
||||
// Tests the FRIEND_TEST macro.
|
||||
|
||||
// This class has a private member we want to test. We will test it
|
||||
// both in a TEST and in a TEST_F.
|
||||
class Foo {
|
||||
public:
|
||||
Foo() {}
|
||||
|
||||
private:
|
||||
int Bar() const { return 1; }
|
||||
|
||||
// Declares the friend tests that can access the private member
|
||||
// Bar().
|
||||
FRIEND_TEST(FRIEND_TEST_Test, TEST);
|
||||
FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
|
||||
};
|
||||
|
||||
// Tests that the FRIEND_TEST declaration allows a TEST to access a
|
||||
// class's private members. This should compile.
|
||||
TEST(FRIEND_TEST_Test, TEST) {
|
||||
ASSERT_EQ(1, Foo().Bar());
|
||||
}
|
||||
|
||||
// The fixture needed to test using FRIEND_TEST with TEST_F.
|
||||
class FRIEND_TEST_Test2 : public testing::Test {
|
||||
protected:
|
||||
Foo foo;
|
||||
};
|
||||
|
||||
// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
|
||||
// class's private members. This should compile.
|
||||
TEST_F(FRIEND_TEST_Test2, TEST_F) {
|
||||
ASSERT_EQ(1, foo.Bar());
|
||||
}
|
||||
|
||||
// Tests the life cycle of Test objects.
|
||||
|
||||
// The test fixture for testing the life cycle of Test objects.
|
||||
//
|
||||
// This class counts the number of live test objects that uses this
|
||||
// fixture.
|
||||
class TestLifeCycleTest : public testing::Test {
|
||||
protected:
|
||||
// Constructor. Increments the number of test objects that uses
|
||||
// this fixture.
|
||||
TestLifeCycleTest() { count_++; }
|
||||
|
||||
// Destructor. Decrements the number of test objects that uses this
|
||||
// fixture.
|
||||
~TestLifeCycleTest() { count_--; }
|
||||
|
||||
// Returns the number of live test objects that uses this fixture.
|
||||
int count() const { return count_; }
|
||||
|
||||
private:
|
||||
static int count_;
|
||||
};
|
||||
|
||||
int TestLifeCycleTest::count_ = 0;
|
||||
|
||||
// Tests the life cycle of test objects.
|
||||
TEST_F(TestLifeCycleTest, Test1) {
|
||||
// There should be only one test object in this test case that's
|
||||
// currently alive.
|
||||
ASSERT_EQ(1, count());
|
||||
}
|
||||
|
||||
// Tests the life cycle of test objects.
|
||||
TEST_F(TestLifeCycleTest, Test2) {
|
||||
// After Test1 is done and Test2 is started, there should still be
|
||||
// only one live test object, as the object for Test1 should've been
|
||||
// deleted.
|
||||
ASSERT_EQ(1, count());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Tests streaming a user type whose definition and operator << are
|
||||
// both in the global namespace.
|
||||
class Base {
|
||||
public:
|
||||
explicit Base(int x) : x_(x) {}
|
||||
int x() const { return x_; }
|
||||
private:
|
||||
int x_;
|
||||
};
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const Base& val) {
|
||||
return os << val.x();
|
||||
}
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const Base* pointer) {
|
||||
return os << "(" << pointer->x() << ")";
|
||||
}
|
||||
|
||||
TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {
|
||||
testing::Message msg;
|
||||
Base a(1);
|
||||
|
||||
msg << a << &a; // Uses ::operator<<.
|
||||
EXPECT_STREQ("1(1)", msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming a user type whose definition and operator<< are
|
||||
// both in an unnamed namespace.
|
||||
namespace {
|
||||
class MyTypeInUnnamedNameSpace : public Base {
|
||||
public:
|
||||
explicit MyTypeInUnnamedNameSpace(int x): Base(x) {}
|
||||
};
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const MyTypeInUnnamedNameSpace& val) {
|
||||
return os << val.x();
|
||||
}
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const MyTypeInUnnamedNameSpace* pointer) {
|
||||
return os << "(" << pointer->x() << ")";
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {
|
||||
testing::Message msg;
|
||||
MyTypeInUnnamedNameSpace a(1);
|
||||
|
||||
msg << a << &a; // Uses <unnamed_namespace>::operator<<.
|
||||
EXPECT_STREQ("1(1)", msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming a user type whose definition and operator<< are
|
||||
// both in a user namespace.
|
||||
namespace namespace1 {
|
||||
class MyTypeInNameSpace1 : public Base {
|
||||
public:
|
||||
explicit MyTypeInNameSpace1(int x): Base(x) {}
|
||||
};
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const MyTypeInNameSpace1& val) {
|
||||
return os << val.x();
|
||||
}
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const MyTypeInNameSpace1* pointer) {
|
||||
return os << "(" << pointer->x() << ")";
|
||||
}
|
||||
} // namespace namespace1
|
||||
|
||||
TEST(MessageTest, CanStreamUserTypeInUserNameSpace) {
|
||||
testing::Message msg;
|
||||
namespace1::MyTypeInNameSpace1 a(1);
|
||||
|
||||
msg << a << &a; // Uses namespace1::operator<<.
|
||||
EXPECT_STREQ("1(1)", msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming a user type whose definition is in a user namespace
|
||||
// but whose operator<< is in the global namespace.
|
||||
namespace namespace2 {
|
||||
class MyTypeInNameSpace2 : public ::Base {
|
||||
public:
|
||||
explicit MyTypeInNameSpace2(int x): Base(x) {}
|
||||
};
|
||||
} // namespace namespace2
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const namespace2::MyTypeInNameSpace2& val) {
|
||||
return os << val.x();
|
||||
}
|
||||
std::ostream& operator<<(std::ostream& os,
|
||||
const namespace2::MyTypeInNameSpace2* pointer) {
|
||||
return os << "(" << pointer->x() << ")";
|
||||
}
|
||||
|
||||
TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {
|
||||
testing::Message msg;
|
||||
namespace2::MyTypeInNameSpace2 a(1);
|
||||
|
||||
msg << a << &a; // Uses ::operator<<.
|
||||
EXPECT_STREQ("1(1)", msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming NULL pointers to testing::Message.
|
||||
TEST(MessageTest, NullPointers) {
|
||||
testing::Message msg;
|
||||
char* const p1 = NULL;
|
||||
unsigned char* const p2 = NULL;
|
||||
int* p3 = NULL;
|
||||
double* p4 = NULL;
|
||||
bool* p5 = NULL;
|
||||
testing::Message* p6 = NULL;
|
||||
|
||||
msg << p1 << p2 << p3 << p4 << p5 << p6;
|
||||
ASSERT_STREQ("(null)(null)(null)(null)(null)(null)",
|
||||
msg.GetString().c_str());
|
||||
}
|
||||
|
||||
// Tests streaming wide strings to testing::Message.
|
||||
TEST(MessageTest, WideStrings) {
|
||||
using testing::Message;
|
||||
|
||||
// Streams a NULL of type const wchar_t*.
|
||||
const wchar_t* const_wstr = NULL;
|
||||
EXPECT_STREQ("(null)",
|
||||
(Message() << const_wstr).GetString().c_str());
|
||||
|
||||
// Streams a NULL of type wchar_t*.
|
||||
wchar_t* wstr = NULL;
|
||||
EXPECT_STREQ("(null)",
|
||||
(Message() << wstr).GetString().c_str());
|
||||
|
||||
// Streams a non-NULL of type const wchar_t*.
|
||||
const_wstr = L"abc\x8119";
|
||||
EXPECT_STREQ("abc\xe8\x84\x99",
|
||||
(Message() << const_wstr).GetString().c_str());
|
||||
|
||||
// Streams a non-NULL of type wchar_t*.
|
||||
wstr = const_cast<wchar_t*>(const_wstr);
|
||||
EXPECT_STREQ("abc\xe8\x84\x99",
|
||||
(Message() << wstr).GetString().c_str());
|
||||
}
|
||||
|
||||
|
||||
// This line tests that we can define tests in the testing namespace.
|
||||
namespace testing {
|
||||
|
||||
// Tests the TestInfo class.
|
||||
|
||||
class TestInfoTest : public testing::Test {
|
||||
protected:
|
||||
static TestInfo * GetTestInfo(const char* test_name) {
|
||||
return UnitTest::GetInstance()->impl()->
|
||||
GetTestCase("TestInfoTest", NULL, NULL)->
|
||||
GetTestInfo(test_name);
|
||||
}
|
||||
|
||||
static const TestResult* GetTestResult(
|
||||
const testing::TestInfo* test_info) {
|
||||
return test_info->result();
|
||||
}
|
||||
};
|
||||
|
||||
// Tests TestInfo::test_case_name() and TestInfo::name().
|
||||
TEST_F(TestInfoTest, Names) {
|
||||
TestInfo * const test_info = GetTestInfo("Names");
|
||||
|
||||
ASSERT_STREQ("TestInfoTest", test_info->test_case_name());
|
||||
ASSERT_STREQ("Names", test_info->name());
|
||||
}
|
||||
|
||||
// Tests TestInfo::result().
|
||||
TEST_F(TestInfoTest, result) {
|
||||
TestInfo * const test_info = GetTestInfo("result");
|
||||
|
||||
// Initially, there is no TestPartResult for this test.
|
||||
ASSERT_EQ(0u, GetTestResult(test_info)->total_part_count());
|
||||
|
||||
// After the previous assertion, there is still none.
|
||||
ASSERT_EQ(0u, GetTestResult(test_info)->total_part_count());
|
||||
}
|
||||
|
||||
// Tests setting up and tearing down a test case.
|
||||
|
||||
class SetUpTestCaseTest : public testing::Test {
|
||||
protected:
|
||||
// This will be called once before the first test in this test case
|
||||
// is run.
|
||||
static void SetUpTestCase() {
|
||||
printf("Setting up the test case . . .\n");
|
||||
|
||||
// Initializes some shared resource. In this simple example, we
|
||||
// just create a C string. More complex stuff can be done if
|
||||
// desired.
|
||||
shared_resource_ = "123";
|
||||
|
||||
// Increments the number of test cases that have been set up.
|
||||
counter_++;
|
||||
|
||||
// SetUpTestCase() should be called only once.
|
||||
EXPECT_EQ(1, counter_);
|
||||
}
|
||||
|
||||
// This will be called once after the last test in this test case is
|
||||
// run.
|
||||
static void TearDownTestCase() {
|
||||
printf("Tearing down the test case . . .\n");
|
||||
|
||||
// Decrements the number of test cases that have been set up.
|
||||
counter_--;
|
||||
|
||||
// TearDownTestCase() should be called only once.
|
||||
EXPECT_EQ(0, counter_);
|
||||
|
||||
// Cleans up the shared resource.
|
||||
shared_resource_ = NULL;
|
||||
}
|
||||
|
||||
// This will be called before each test in this test case.
|
||||
virtual void SetUp() {
|
||||
// SetUpTestCase() should be called only once, so counter_ should
|
||||
// always be 1.
|
||||
EXPECT_EQ(1, counter_);
|
||||
}
|
||||
|
||||
// Number of test cases that have been set up.
|
||||
static int counter_;
|
||||
|
||||
// Some resource to be shared by all tests in this test case.
|
||||
static const char* shared_resource_;
|
||||
};
|
||||
|
||||
int SetUpTestCaseTest::counter_ = 0;
|
||||
const char* SetUpTestCaseTest::shared_resource_ = NULL;
|
||||
|
||||
// A test that uses the shared resource.
|
||||
TEST_F(SetUpTestCaseTest, Test1) {
|
||||
EXPECT_STRNE(NULL, shared_resource_);
|
||||
}
|
||||
|
||||
// Another test that uses the shared resource.
|
||||
TEST_F(SetUpTestCaseTest, Test2) {
|
||||
EXPECT_STREQ("123", shared_resource_);
|
||||
}
|
||||
|
||||
// The InitGoogleTestTest test case tests testing::InitGoogleTest().
|
||||
|
||||
// The Flags struct stores a copy of all Google Test flags.
|
||||
struct Flags {
|
||||
// Constructs a Flags struct where each flag has its default value.
|
||||
Flags() : break_on_failure(false),
|
||||
catch_exceptions(false),
|
||||
filter(""),
|
||||
list_tests(false),
|
||||
output(""),
|
||||
repeat(1) {}
|
||||
|
||||
// Factory methods.
|
||||
|
||||
// Creates a Flags struct where the gtest_break_on_failure flag has
|
||||
// the given value.
|
||||
static Flags BreakOnFailure(bool break_on_failure) {
|
||||
Flags flags;
|
||||
flags.break_on_failure = break_on_failure;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Creates a Flags struct where the gtest_catch_exceptions flag has
|
||||
// the given value.
|
||||
static Flags CatchExceptions(bool catch_exceptions) {
|
||||
Flags flags;
|
||||
flags.catch_exceptions = catch_exceptions;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Creates a Flags struct where the gtest_filter flag has the given
|
||||
// value.
|
||||
static Flags Filter(const char* filter) {
|
||||
Flags flags;
|
||||
flags.filter = filter;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Creates a Flags struct where the gtest_list_tests flag has the
|
||||
// given value.
|
||||
static Flags ListTests(bool list_tests) {
|
||||
Flags flags;
|
||||
flags.list_tests = list_tests;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Creates a Flags struct where the gtest_output flag has the given
|
||||
// value.
|
||||
static Flags Output(const char* output) {
|
||||
Flags flags;
|
||||
flags.output = output;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Creates a Flags struct where the gtest_repeat flag has the given
|
||||
// value.
|
||||
static Flags Repeat(Int32 repeat) {
|
||||
Flags flags;
|
||||
flags.repeat = repeat;
|
||||
return flags;
|
||||
}
|
||||
|
||||
// These fields store the flag values.
|
||||
bool break_on_failure;
|
||||
bool catch_exceptions;
|
||||
const char* filter;
|
||||
bool list_tests;
|
||||
const char* output;
|
||||
Int32 repeat;
|
||||
};
|
||||
|
||||
// Fixture for testing InitGoogleTest().
|
||||
class InitGoogleTestTest : public testing::Test {
|
||||
protected:
|
||||
// Clears the flags before each test.
|
||||
virtual void SetUp() {
|
||||
GTEST_FLAG(break_on_failure) = false;
|
||||
GTEST_FLAG(catch_exceptions) = false;
|
||||
GTEST_FLAG(filter) = "";
|
||||
GTEST_FLAG(list_tests) = false;
|
||||
GTEST_FLAG(output) = "";
|
||||
GTEST_FLAG(repeat) = 1;
|
||||
}
|
||||
|
||||
// Asserts that two narrow or wide string arrays are equal.
|
||||
template <typename CharType>
|
||||
static void AssertStringArrayEq(size_t size1, CharType** array1,
|
||||
size_t size2, CharType** array2) {
|
||||
ASSERT_EQ(size1, size2) << " Array sizes different.";
|
||||
|
||||
for (size_t i = 0; i != size1; i++) {
|
||||
ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
|
||||
}
|
||||
}
|
||||
|
||||
// Verifies that the flag values match the expected values.
|
||||
static void CheckFlags(const Flags& expected) {
|
||||
EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));
|
||||
EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));
|
||||
EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());
|
||||
EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
|
||||
EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
|
||||
EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
|
||||
}
|
||||
|
||||
// Parses a command line (specified by argc1 and argv1), then
|
||||
// verifies that the flag values are expected and that the
|
||||
// recognized flags are removed from the command line.
|
||||
template <typename CharType>
|
||||
static void TestParsingFlags(int argc1, const CharType** argv1,
|
||||
int argc2, const CharType** argv2,
|
||||
const Flags& expected) {
|
||||
// Parses the command line.
|
||||
InitGoogleTest(&argc1, const_cast<CharType**>(argv1));
|
||||
|
||||
// Verifies the flag values.
|
||||
CheckFlags(expected);
|
||||
|
||||
// Verifies that the recognized flags are removed from the command
|
||||
// line.
|
||||
AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);
|
||||
}
|
||||
|
||||
// This macro wraps TestParsingFlags s.t. the user doesn't need
|
||||
// to specify the array sizes.
|
||||
#define TEST_PARSING_FLAGS(argv1, argv2, expected) \
|
||||
TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \
|
||||
sizeof(argv2)/sizeof(*argv2) - 1, argv2, expected)
|
||||
};
|
||||
|
||||
// Tests parsing an empty command line.
|
||||
TEST_F(InitGoogleTestTest, Empty) {
|
||||
const char* argv[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags());
|
||||
}
|
||||
|
||||
// Tests parsing a command line that has no flag.
|
||||
TEST_F(InitGoogleTestTest, NoFlag) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags());
|
||||
}
|
||||
|
||||
// Tests parsing a bad --gtest_filter flag.
|
||||
TEST_F(InitGoogleTestTest, FilterBad) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_filter",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
"--gtest_filter",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Filter(""));
|
||||
}
|
||||
|
||||
// Tests parsing an empty --gtest_filter flag.
|
||||
TEST_F(InitGoogleTestTest, FilterEmpty) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_filter=",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Filter(""));
|
||||
}
|
||||
|
||||
// Tests parsing a non-empty --gtest_filter flag.
|
||||
TEST_F(InitGoogleTestTest, FilterNonEmpty) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_filter=abc",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Filter("abc"));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_break_on_failure.
|
||||
TEST_F(InitGoogleTestTest, BreakOnFailureNoDef) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::BreakOnFailure(true));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_break_on_failure=0.
|
||||
TEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure=0",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::BreakOnFailure(false));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_break_on_failure=f.
|
||||
TEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure=f",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::BreakOnFailure(false));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_break_on_failure=F.
|
||||
TEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure=F",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::BreakOnFailure(false));
|
||||
}
|
||||
|
||||
// Tests parsing a --gtest_break_on_failure flag that has a "true"
|
||||
// definition.
|
||||
TEST_F(InitGoogleTestTest, BreakOnFailureTrue) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure=1",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::BreakOnFailure(true));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_catch_exceptions.
|
||||
TEST_F(InitGoogleTestTest, CatchExceptions) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_catch_exceptions",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::CatchExceptions(true));
|
||||
}
|
||||
|
||||
// Tests having the same flag twice with different values. The
|
||||
// expected behavior is that the one coming last takes precedence.
|
||||
TEST_F(InitGoogleTestTest, DuplicatedFlags) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_filter=a",
|
||||
"--gtest_filter=b",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Filter("b"));
|
||||
}
|
||||
|
||||
// Tests having an unrecognized flag on the command line.
|
||||
TEST_F(InitGoogleTestTest, UnrecognizedFlag) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_break_on_failure",
|
||||
"bar", // Unrecognized by Google Test.
|
||||
"--gtest_filter=b",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
"bar",
|
||||
NULL
|
||||
};
|
||||
|
||||
Flags flags;
|
||||
flags.break_on_failure = true;
|
||||
flags.filter = "b";
|
||||
TEST_PARSING_FLAGS(argv, argv2, flags);
|
||||
}
|
||||
|
||||
// Tests having a --gtest_list_tests flag
|
||||
TEST_F(InitGoogleTestTest, ListTestsFlag) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_list_tests",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::ListTests(true));
|
||||
}
|
||||
|
||||
// Tests having a --gtest_list_tests flag with a "true" value
|
||||
TEST_F(InitGoogleTestTest, ListTestsTrue) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_list_tests=1",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::ListTests(true));
|
||||
}
|
||||
|
||||
// Tests having a --gtest_list_tests flag with a "false" value
|
||||
TEST_F(InitGoogleTestTest, ListTestsFalse) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_list_tests=0",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::ListTests(false));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_list_tests=f.
|
||||
TEST_F(InitGoogleTestTest, ListTestsFalse_f) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_list_tests=f",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::ListTests(false));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_break_on_failure=F.
|
||||
TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_list_tests=F",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::ListTests(false));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_output (invalid).
|
||||
TEST_F(InitGoogleTestTest, OutputEmpty) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_output",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
"--gtest_output",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags());
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_output=xml
|
||||
TEST_F(InitGoogleTestTest, OutputXml) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_output=xml",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Output("xml"));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_output=xml:file
|
||||
TEST_F(InitGoogleTestTest, OutputXmlFile) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_output=xml:file",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Output("xml:file"));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_output=xml:directory/path/
|
||||
TEST_F(InitGoogleTestTest, OutputXmlDirectory) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_output=xml:directory/path/",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Output("xml:directory/path/"));
|
||||
}
|
||||
|
||||
// Tests parsing --gtest_repeat=number
|
||||
TEST_F(InitGoogleTestTest, Repeat) {
|
||||
const char* argv[] = {
|
||||
"foo.exe",
|
||||
"--gtest_repeat=1000",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* argv2[] = {
|
||||
"foo.exe",
|
||||
NULL
|
||||
};
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, Flags::Repeat(1000));
|
||||
}
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Tests parsing wide strings.
|
||||
TEST_F(InitGoogleTestTest, WideStrings) {
|
||||
const wchar_t* argv[] = {
|
||||
L"foo.exe",
|
||||
L"--gtest_filter=Foo*",
|
||||
L"--gtest_list_tests=1",
|
||||
L"--gtest_break_on_failure",
|
||||
L"--non_gtest_flag",
|
||||
NULL
|
||||
};
|
||||
|
||||
const wchar_t* argv2[] = {
|
||||
L"foo.exe",
|
||||
L"--non_gtest_flag",
|
||||
NULL
|
||||
};
|
||||
|
||||
Flags expected_flags;
|
||||
expected_flags.break_on_failure = true;
|
||||
expected_flags.filter = "Foo*";
|
||||
expected_flags.list_tests = true;
|
||||
|
||||
TEST_PARSING_FLAGS(argv, argv2, expected_flags);
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Tests current_test_info() in UnitTest.
|
||||
class CurrentTestInfoTest : public Test {
|
||||
protected:
|
||||
// Tests that current_test_info() returns NULL before the first test in
|
||||
// the test case is run.
|
||||
static void SetUpTestCase() {
|
||||
// There should be no tests running at this point.
|
||||
const TestInfo* test_info =
|
||||
UnitTest::GetInstance()->current_test_info();
|
||||
EXPECT_EQ(NULL, test_info)
|
||||
<< "There should be no tests running at this point.";
|
||||
}
|
||||
|
||||
// Tests that current_test_info() returns NULL after the last test in
|
||||
// the test case has run.
|
||||
static void TearDownTestCase() {
|
||||
const TestInfo* test_info =
|
||||
UnitTest::GetInstance()->current_test_info();
|
||||
EXPECT_EQ(NULL, test_info)
|
||||
<< "There should be no tests running at this point.";
|
||||
}
|
||||
};
|
||||
|
||||
// Tests that current_test_info() returns TestInfo for currently running
|
||||
// test by checking the expected test name against the actual one.
|
||||
TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {
|
||||
const TestInfo* test_info =
|
||||
UnitTest::GetInstance()->current_test_info();
|
||||
ASSERT_TRUE(NULL != test_info)
|
||||
<< "There is a test running so we should have a valid TestInfo.";
|
||||
EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
|
||||
<< "Expected the name of the currently running test case.";
|
||||
EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name())
|
||||
<< "Expected the name of the currently running test.";
|
||||
}
|
||||
|
||||
// Tests that current_test_info() returns TestInfo for currently running
|
||||
// test by checking the expected test name against the actual one. We
|
||||
// use this test to see that the TestInfo object actually changed from
|
||||
// the previous invocation.
|
||||
TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {
|
||||
const TestInfo* test_info =
|
||||
UnitTest::GetInstance()->current_test_info();
|
||||
ASSERT_TRUE(NULL != test_info)
|
||||
<< "There is a test running so we should have a valid TestInfo.";
|
||||
EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
|
||||
<< "Expected the name of the currently running test case.";
|
||||
EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name())
|
||||
<< "Expected the name of the currently running test.";
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
|
||||
// These two lines test that we can define tests in a namespace that
|
||||
// has the name "testing" and is nested in another namespace.
|
||||
namespace my_namespace {
|
||||
namespace testing {
|
||||
|
||||
// Makes sure that TEST knows to use ::testing::Test instead of
|
||||
// ::my_namespace::testing::Test.
|
||||
class Test {};
|
||||
|
||||
// Makes sure that an assertion knows to use ::testing::Message instead of
|
||||
// ::my_namespace::testing::Message.
|
||||
class Message {};
|
||||
|
||||
// Makes sure that an assertion knows to use
|
||||
// ::testing::AssertionResult instead of
|
||||
// ::my_namespace::testing::AssertionResult.
|
||||
class AssertionResult {};
|
||||
|
||||
// Tests that an assertion that should succeed works as expected.
|
||||
TEST(NestedTestingNamespaceTest, Success) {
|
||||
EXPECT_EQ(1, 1) << "This shouldn't fail.";
|
||||
}
|
||||
|
||||
// Tests that an assertion that should fail works as expected.
|
||||
TEST(NestedTestingNamespaceTest, Failure) {
|
||||
EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.",
|
||||
"This failure is expected.");
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace my_namespace
|
||||
|
||||
// Tests that one can call superclass SetUp and TearDown methods--
|
||||
// that is, that they are not private.
|
||||
// No tests are based on this fixture; the test "passes" if it compiles
|
||||
// successfully.
|
||||
class ProtectedFixtureMethodsTest : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
testing::Test::SetUp();
|
||||
}
|
||||
virtual void TearDown() {
|
||||
testing::Test::TearDown();
|
||||
}
|
||||
};
|
||||
|
||||
// StreamingAssertionsTest tests the streaming versions of a representative
|
||||
// sample of assertions.
|
||||
TEST(StreamingAssertionsTest, Unconditional) {
|
||||
SUCCEED() << "expected success";
|
||||
EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(FAIL() << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, Truth) {
|
||||
EXPECT_TRUE(true) << "unexpected failure";
|
||||
ASSERT_TRUE(true) << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, Truth2) {
|
||||
EXPECT_FALSE(false) << "unexpected failure";
|
||||
ASSERT_FALSE(false) << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, IntegerEquals) {
|
||||
EXPECT_EQ(1, 1) << "unexpected failure";
|
||||
ASSERT_EQ(1, 1) << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, IntegerLessThan) {
|
||||
EXPECT_LT(1, 2) << "unexpected failure";
|
||||
ASSERT_LT(1, 2) << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, StringsEqual) {
|
||||
EXPECT_STREQ("foo", "foo") << "unexpected failure";
|
||||
ASSERT_STREQ("foo", "foo") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, StringsNotEqual) {
|
||||
EXPECT_STRNE("foo", "bar") << "unexpected failure";
|
||||
ASSERT_STRNE("foo", "bar") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {
|
||||
EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure";
|
||||
ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {
|
||||
EXPECT_STRCASENE("foo", "bar") << "unexpected failure";
|
||||
ASSERT_STRCASENE("foo", "bar") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsTest, FloatingPointEquals) {
|
||||
EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
|
||||
ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure",
|
||||
"expected failure");
|
||||
EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure",
|
||||
"expected failure");
|
||||
}
|
||||
|
||||
// Tests that Google Test correctly decides whether to use colors in the output.
|
||||
|
||||
TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {
|
||||
GTEST_FLAG(color) = "yes";
|
||||
|
||||
SetEnv("TERM", "xterm"); // TERM supports colors.
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
|
||||
SetEnv("TERM", "dumb"); // TERM doesn't support colors.
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
}
|
||||
|
||||
TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {
|
||||
SetEnv("TERM", "dumb"); // TERM doesn't support colors.
|
||||
|
||||
GTEST_FLAG(color) = "True";
|
||||
EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
|
||||
GTEST_FLAG(color) = "t";
|
||||
EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
|
||||
GTEST_FLAG(color) = "1";
|
||||
EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
}
|
||||
|
||||
TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {
|
||||
GTEST_FLAG(color) = "no";
|
||||
|
||||
SetEnv("TERM", "xterm"); // TERM supports colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
|
||||
SetEnv("TERM", "dumb"); // TERM doesn't support colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
}
|
||||
|
||||
TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {
|
||||
SetEnv("TERM", "xterm"); // TERM supports colors.
|
||||
|
||||
GTEST_FLAG(color) = "F";
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
GTEST_FLAG(color) = "0";
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
GTEST_FLAG(color) = "unknown";
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
}
|
||||
|
||||
TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {
|
||||
GTEST_FLAG(color) = "auto";
|
||||
|
||||
SetEnv("TERM", "xterm"); // TERM supports colors.
|
||||
EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY.
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
}
|
||||
|
||||
TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {
|
||||
GTEST_FLAG(color) = "auto";
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// On Windows, we ignore the TERM variable as it's usually not set.
|
||||
|
||||
SetEnv("TERM", "dumb");
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "");
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "xterm");
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
#else
|
||||
// On non-Windows platforms, we rely on TERM to determine if the
|
||||
// terminal supports colors.
|
||||
|
||||
SetEnv("TERM", "dumb"); // TERM doesn't support colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "emacs"); // TERM doesn't support colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "vt100"); // TERM doesn't support colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "xterm-mono"); // TERM doesn't support colors.
|
||||
EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "xterm"); // TERM supports colors.
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
|
||||
SetEnv("TERM", "xterm-color"); // TERM supports colors.
|
||||
EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY.
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
#ifndef __SYMBIAN32__
|
||||
// We will want to integrate running the unittests to a different
|
||||
// main application on Symbian.
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
if (!testing::internal::GTEST_FLAG(internal_run_death_test).empty()) {
|
||||
// Skip the usual output capturing if we're running as the child
|
||||
// process of an threadsafe-style death test.
|
||||
freopen("/dev/null", "w", stdout);
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Runs all tests using Google Test.
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
#endif // __SYMBIAN32_
|
||||
@@ -0,0 +1,49 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: keith.ray@gmail.com (Keith Ray)
|
||||
//
|
||||
// gtest_xml_outfile1_test_ writes some xml via TestProperty used by
|
||||
// gtest_xml_outfiles_test.py
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class PropertyOne : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
RecordProperty("SetUpProp", 1);
|
||||
}
|
||||
virtual void TearDown() {
|
||||
RecordProperty("TearDownProp", 1);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(PropertyOne, TestSomeProperties) {
|
||||
RecordProperty("TestSomeProperty", 1);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: keith.ray@gmail.com (Keith Ray)
|
||||
//
|
||||
// gtest_xml_outfile2_test_ writes some xml via TestProperty used by
|
||||
// gtest_xml_outfiles_test.py
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class PropertyTwo : public testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
RecordProperty("SetUpProp", 2);
|
||||
}
|
||||
virtual void TearDown() {
|
||||
RecordProperty("TearDownProp", 2);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(PropertyTwo, TestSomeProperties) {
|
||||
RecordProperty("TestSomeProperty", 2);
|
||||
}
|
||||
Executable
+134
@@ -0,0 +1,134 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2008, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test for the gtest_xml_output module."""
|
||||
|
||||
__author__ = "keith.ray@gmail.com (Keith Ray)"
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from xml.dom import minidom, Node
|
||||
|
||||
import gtest_xml_test_utils
|
||||
|
||||
|
||||
GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
|
||||
GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
|
||||
|
||||
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
||||
<testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
|
||||
</testsuite>
|
||||
</testsuite>
|
||||
"""
|
||||
|
||||
EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
||||
<testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
|
||||
</testsuite>
|
||||
</testsuite>
|
||||
"""
|
||||
|
||||
|
||||
class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
"""Unit test for Google Test's XML output functionality."""
|
||||
|
||||
def setUp(self):
|
||||
# We want the trailing '/' that the last "" provides in os.path.join, for
|
||||
# telling Google Test to create an output directory instead of a single file
|
||||
# for xml output.
|
||||
self.output_dir_ = os.path.join(tempfile.mkdtemp(), "")
|
||||
self.DeleteFilesAndDir()
|
||||
|
||||
def tearDown(self):
|
||||
self.DeleteFilesAndDir()
|
||||
|
||||
def DeleteFilesAndDir(self):
|
||||
try:
|
||||
os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml"))
|
||||
except os.error:
|
||||
pass
|
||||
try:
|
||||
os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml"))
|
||||
except os.error:
|
||||
pass
|
||||
try:
|
||||
os.removedirs(self.output_dir_)
|
||||
except os.error:
|
||||
pass
|
||||
|
||||
def testOutfile1(self):
|
||||
self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)
|
||||
|
||||
def testOutfile2(self):
|
||||
self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)
|
||||
|
||||
def _TestOutFile(self, test_name, expected_xml):
|
||||
gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
test_name)
|
||||
command = "cd %s && %s --gtest_output=xml:%s &> /dev/null" % (
|
||||
tempfile.mkdtemp(), gtest_prog_path, self.output_dir_)
|
||||
status = os.system(command)
|
||||
self.assertEquals(0, status)
|
||||
|
||||
# TODO(wan@google.com): libtool causes the built test binary to be
|
||||
# named lt-gtest_xml_outfiles_test_ instead of
|
||||
# gtest_xml_outfiles_test_. To account for this possibillity, we
|
||||
# allow both names in the following code. We should remove this
|
||||
# hack when Chandler Carruth's libtool replacement tool is ready.
|
||||
output_file_name1 = test_name + ".xml"
|
||||
output_file1 = os.path.join(self.output_dir_, output_file_name1)
|
||||
output_file_name2 = 'lt-' + output_file_name1
|
||||
output_file2 = os.path.join(self.output_dir_, output_file_name2)
|
||||
self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
|
||||
output_file1)
|
||||
|
||||
expected = minidom.parseString(expected_xml)
|
||||
if os.path.isfile(output_file1):
|
||||
actual = minidom.parse(output_file1)
|
||||
else:
|
||||
actual = minidom.parse(output_file2)
|
||||
self._NormalizeXml(actual.documentElement)
|
||||
self._AssertEquivalentElements(expected.documentElement,
|
||||
actual.documentElement)
|
||||
expected.unlink()
|
||||
actual.unlink()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ["GTEST_STACK_TRACE_DEPTH"] = "0"
|
||||
gtest_test_utils.Main()
|
||||
Executable
+171
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test for the gtest_xml_output module"""
|
||||
|
||||
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
|
||||
|
||||
import errno
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from xml.dom import minidom, Node
|
||||
|
||||
import gtest_xml_test_utils
|
||||
|
||||
GTEST_OUTPUT_FLAG = "--gtest_output"
|
||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
||||
|
||||
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite tests="13" failures="2" disabled="2" errors="0" time="*" name="AllTests">
|
||||
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
||||
</testsuite>
|
||||
<testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
||||
<testcase name="Fails" status="run" time="*" classname="FailedTest">
|
||||
<failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""/>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
<testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
|
||||
<testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
|
||||
<testcase name="Fails" status="run" time="*" classname="MixedResultTest">
|
||||
<failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""/>
|
||||
<failure message="gtest_xml_output_unittest_.cc:*
Value of: 3
Expected: 2" type=""/>
|
||||
</testcase>
|
||||
<testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/>
|
||||
</testsuite>
|
||||
<testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
|
||||
<testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
|
||||
</testsuite>
|
||||
<testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
|
||||
<testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
|
||||
<testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
|
||||
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
|
||||
</testsuite>
|
||||
<testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
|
||||
<testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
|
||||
<testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
|
||||
</testsuite>
|
||||
</testsuite>"""
|
||||
|
||||
|
||||
EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite tests="0" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
||||
</testsuite>"""
|
||||
|
||||
|
||||
class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
"""
|
||||
Unit test for Google Test's XML output functionality.
|
||||
"""
|
||||
|
||||
def testNonEmptyXmlOutput(self):
|
||||
"""
|
||||
Runs a test program that generates a non-empty XML output, and
|
||||
tests that the XML output is expected.
|
||||
"""
|
||||
self._TestXmlOutput("gtest_xml_output_unittest_",
|
||||
EXPECTED_NON_EMPTY_XML, 1)
|
||||
|
||||
def testEmptyXmlOutput(self):
|
||||
"""
|
||||
Runs a test program that generates an empty XML output, and
|
||||
tests that the XML output is expected.
|
||||
"""
|
||||
|
||||
self._TestXmlOutput("gtest_no_test_unittest",
|
||||
EXPECTED_EMPTY_XML, 0)
|
||||
|
||||
def testDefaultOutputFile(self):
|
||||
"""
|
||||
Confirms that Google Test produces an XML output file with the expected
|
||||
default name if no name is explicitly specified.
|
||||
"""
|
||||
temp_dir = tempfile.mkdtemp()
|
||||
output_file = os.path.join(temp_dir,
|
||||
GTEST_DEFAULT_OUTPUT_FILE)
|
||||
gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
"gtest_no_test_unittest")
|
||||
try:
|
||||
os.remove(output_file)
|
||||
except OSError, e:
|
||||
if e.errno != errno.ENOENT:
|
||||
raise
|
||||
|
||||
status = os.system("cd %s && %s %s=xml &> /dev/null"
|
||||
% (temp_dir, gtest_prog_path,
|
||||
GTEST_OUTPUT_FLAG))
|
||||
self.assertEquals(0, status)
|
||||
self.assert_(os.path.isfile(output_file))
|
||||
|
||||
|
||||
def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code):
|
||||
"""
|
||||
Asserts that the XML document generated by running the program
|
||||
gtest_prog_name matches expected_xml, a string containing another
|
||||
XML document. Furthermore, the program's exit code must be
|
||||
expected_exit_code.
|
||||
"""
|
||||
|
||||
xml_path = os.path.join(tempfile.mkdtemp(), gtest_prog_name + "out.xml")
|
||||
gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
gtest_prog_name)
|
||||
|
||||
command = ("%s %s=xml:%s &> /dev/null"
|
||||
% (gtest_prog_path, GTEST_OUTPUT_FLAG, xml_path))
|
||||
status = os.system(command)
|
||||
signal = status & 0xff
|
||||
self.assertEquals(0, signal,
|
||||
"%s was killed by signal %d" % (gtest_prog_name, signal))
|
||||
exit_code = status >> 8
|
||||
self.assertEquals(expected_exit_code, exit_code,
|
||||
"'%s' exited with code %s, which doesn't match "
|
||||
"the expected exit code %s."
|
||||
% (command, exit_code, expected_exit_code))
|
||||
|
||||
expected = minidom.parseString(expected_xml)
|
||||
actual = minidom.parse(xml_path)
|
||||
self._NormalizeXml(actual.documentElement)
|
||||
self._AssertEquivalentElements(expected.documentElement,
|
||||
actual.documentElement)
|
||||
expected.unlink()
|
||||
actual .unlink()
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ['GTEST_STACK_TRACE_DEPTH'] = '0'
|
||||
gtest_test_utils.Main()
|
||||
@@ -0,0 +1,120 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Author: eefacm@gmail.com (Sean Mcafee)
|
||||
|
||||
// Unit test for Google Test XML output.
|
||||
//
|
||||
// A user can specify XML output in a Google Test program to run via
|
||||
// either the GTEST_OUTPUT environment variable or the --gtest_output
|
||||
// flag. This is used for testing such functionality.
|
||||
//
|
||||
// This program will be invoked from a Python unit test. Don't run it
|
||||
// directly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class SuccessfulTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(SuccessfulTest, Succeeds) {
|
||||
SUCCEED() << "This is a success.";
|
||||
ASSERT_EQ(1, 1);
|
||||
}
|
||||
|
||||
class FailedTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(FailedTest, Fails) {
|
||||
ASSERT_EQ(1, 2);
|
||||
}
|
||||
|
||||
class DisabledTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(DisabledTest, DISABLED_test_not_run) {
|
||||
FAIL() << "Unexpected failure: Disabled test should not be run";
|
||||
}
|
||||
|
||||
TEST(MixedResultTest, Succeeds) {
|
||||
EXPECT_EQ(1, 1);
|
||||
ASSERT_EQ(1, 1);
|
||||
}
|
||||
|
||||
TEST(MixedResultTest, Fails) {
|
||||
EXPECT_EQ(1, 2);
|
||||
ASSERT_EQ(2, 3);
|
||||
}
|
||||
|
||||
TEST(MixedResultTest, DISABLED_test) {
|
||||
FAIL() << "Unexpected failure: Disabled test should not be run";
|
||||
}
|
||||
|
||||
class PropertyRecordingTest : public testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(PropertyRecordingTest, OneProperty) {
|
||||
RecordProperty("key_1", "1");
|
||||
}
|
||||
|
||||
TEST_F(PropertyRecordingTest, IntValuedProperty) {
|
||||
RecordProperty("key_int", 1);
|
||||
}
|
||||
|
||||
TEST_F(PropertyRecordingTest, ThreeProperties) {
|
||||
RecordProperty("key_1", "1");
|
||||
RecordProperty("key_2", "2");
|
||||
RecordProperty("key_3", "3");
|
||||
}
|
||||
|
||||
TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
|
||||
RecordProperty("key_1", "1");
|
||||
RecordProperty("key_1", "2");
|
||||
}
|
||||
|
||||
TEST(NoFixtureTest, RecordProperty) {
|
||||
RecordProperty("key", "1");
|
||||
}
|
||||
|
||||
void ExternalUtilityThatCallsRecordProperty(const char* key, int value) {
|
||||
testing::Test::RecordProperty(key, value);
|
||||
}
|
||||
|
||||
void ExternalUtilityThatCallsRecordProperty(const char* key,
|
||||
const char* value) {
|
||||
testing::Test::RecordProperty(key, value);
|
||||
}
|
||||
|
||||
TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
|
||||
ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
|
||||
}
|
||||
|
||||
TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
|
||||
ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
|
||||
}
|
||||
Executable
+138
@@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2006, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Unit test utilities for gtest_xml_output"""
|
||||
|
||||
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
|
||||
|
||||
import re
|
||||
import unittest
|
||||
|
||||
from xml.dom import minidom, Node
|
||||
|
||||
GTEST_OUTPUT_FLAG = "--gtest_output"
|
||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
||||
|
||||
class GTestXMLTestCase(unittest.TestCase):
|
||||
"""
|
||||
Base class for tests of Google Test's XML output functionality.
|
||||
"""
|
||||
|
||||
|
||||
def _AssertEquivalentElements(self, expected_element, actual_element):
|
||||
"""
|
||||
Asserts that actual_element (a DOM element object) is equivalent to
|
||||
expected_element (another DOM element object), in that it meets all
|
||||
of the following conditions:
|
||||
* It has the same tag name as expected_element.
|
||||
* It has the same set of attributes as expected_element, each with
|
||||
the same value as the corresponding attribute of expected_element.
|
||||
An exception is any attribute named "time", which need only be
|
||||
convertible to a long integer.
|
||||
* Each child element is equivalent to a child element of
|
||||
expected_element. Child elements are matched according to an
|
||||
attribute that varies depending on the element; "name" for
|
||||
<testsuite> and <testcase> elements, "message" for <failure>
|
||||
elements. This matching is necessary because child elements are
|
||||
not guaranteed to be ordered in any particular way.
|
||||
"""
|
||||
self.assertEquals(expected_element.tagName, actual_element.tagName)
|
||||
|
||||
expected_attributes = expected_element.attributes
|
||||
actual_attributes = actual_element .attributes
|
||||
self.assertEquals(expected_attributes.length, actual_attributes.length)
|
||||
for i in range(expected_attributes.length):
|
||||
expected_attr = expected_attributes.item(i)
|
||||
actual_attr = actual_attributes.get(expected_attr.name)
|
||||
self.assert_(actual_attr is not None)
|
||||
self.assertEquals(expected_attr.value, actual_attr.value)
|
||||
|
||||
expected_child = self._GetChildElements(expected_element)
|
||||
actual_child = self._GetChildElements(actual_element)
|
||||
self.assertEquals(len(expected_child), len(actual_child))
|
||||
for child_id, element in expected_child.iteritems():
|
||||
self.assert_(child_id in actual_child,
|
||||
'<%s> is not in <%s>' % (child_id, actual_child))
|
||||
self._AssertEquivalentElements(element, actual_child[child_id])
|
||||
|
||||
identifying_attribute = {
|
||||
"testsuite": "name",
|
||||
"testcase": "name",
|
||||
"failure": "message",
|
||||
}
|
||||
|
||||
def _GetChildElements(self, element):
|
||||
"""
|
||||
Fetches all of the Element type child nodes of element, a DOM
|
||||
Element object. Returns them as the values of a dictionary keyed by
|
||||
the value of one of the node's attributes. For <testsuite> and
|
||||
<testcase> elements, the identifying attribute is "name"; for
|
||||
<failure> elements, it is "message". An exception is raised if
|
||||
any element other than the above three is encountered, if two
|
||||
child elements with the same identifying attributes are encountered,
|
||||
or if any other type of node is encountered, other than Text nodes
|
||||
containing only whitespace.
|
||||
"""
|
||||
children = {}
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.ELEMENT_NODE:
|
||||
self.assert_(child.tagName in self.identifying_attribute,
|
||||
"Encountered unknown element <%s>" % child.tagName)
|
||||
childID = child.getAttribute(self.identifying_attribute[child.tagName])
|
||||
self.assert_(childID not in children)
|
||||
children[childID] = child
|
||||
elif child.nodeType == Node.TEXT_NODE:
|
||||
self.assert_(child.nodeValue.isspace())
|
||||
else:
|
||||
self.fail("Encountered unexpected node type %d" % child.nodeType)
|
||||
return children
|
||||
|
||||
def _NormalizeXml(self, element):
|
||||
"""
|
||||
Normalizes Google Test's XML output to eliminate references to transient
|
||||
information that may change from run to run.
|
||||
|
||||
* The "time" attribute of <testsuite> and <testcase> elements is
|
||||
replaced with a single asterisk, if it contains only digit
|
||||
characters.
|
||||
* The line number reported in the first line of the "message"
|
||||
attribute of <failure> elements is replaced with a single asterisk.
|
||||
* The directory names in file paths are removed.
|
||||
"""
|
||||
if element.tagName in ("testsuite", "testcase"):
|
||||
time = element.getAttributeNode("time")
|
||||
time.value = re.sub(r"^\d+$", "*", time.value)
|
||||
elif element.tagName == "failure":
|
||||
message = element.getAttributeNode("message")
|
||||
message.value = re.sub(r"^.*/(.*:)\d+\n", "\\1*\n", message.value)
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.ELEMENT_NODE:
|
||||
self._NormalizeXml(child)
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// This is part of the unit test for include/gtest/gtest_prod.h.
|
||||
|
||||
#include "production.h"
|
||||
|
||||
PrivateCode::PrivateCode() : x_(0) {}
|
||||
@@ -0,0 +1,55 @@
|
||||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// This is part of the unit test for include/gtest/gtest_prod.h.
|
||||
|
||||
#ifndef GTEST_TEST_PRODUCTION_H_
|
||||
#define GTEST_TEST_PRODUCTION_H_
|
||||
|
||||
#include <gtest/gtest_prod.h>
|
||||
|
||||
class PrivateCode {
|
||||
public:
|
||||
// Declares a friend test that does not use a fixture.
|
||||
FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);
|
||||
|
||||
// Declares a friend test that uses a fixture.
|
||||
FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);
|
||||
|
||||
PrivateCode();
|
||||
|
||||
int x() const { return x_; }
|
||||
private:
|
||||
void set_x(int x) { x_ = x; }
|
||||
int x_;
|
||||
};
|
||||
|
||||
#endif // GTEST_TEST_PRODUCTION_H_
|
||||
Reference in New Issue
Block a user