Compare commits
1 Commits
release-1.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d1deeb565 |
54
CHANGES
54
CHANGES
@@ -1,57 +1,3 @@
|
||||
Changes for 1.3.0:
|
||||
|
||||
* New feature: death tests on Windows, Cygwin, and Mac.
|
||||
* New feature: ability to use Google Test assertions in other testing
|
||||
frameworks.
|
||||
* New feature: ability to run disabled test via
|
||||
--gtest_also_run_disabled_tests.
|
||||
* New feature: the --help flag for printing the usage.
|
||||
* New feature: access to Google Test flag values in user code.
|
||||
* New feature: a script that packs Google Test into one .h and one
|
||||
.cc file for easy deployment.
|
||||
* New feature: support for distributing test functions to multiple
|
||||
machines (requires support from the test runner).
|
||||
* Bug fixes and implementation clean-up.
|
||||
|
||||
Changes for 1.2.1:
|
||||
|
||||
* Compatibility fixes for Linux IA-64 and IBM z/OS.
|
||||
* Added support for using Boost and other TR1 implementations.
|
||||
* Changes to the build scripts to support upcoming release of Google C++
|
||||
Mocking Framework.
|
||||
* Added Makefile to the distribution package.
|
||||
* Improved build instructions in README.
|
||||
|
||||
Changes for 1.2.0:
|
||||
|
||||
* New feature: value-parameterized tests.
|
||||
* New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
|
||||
macros.
|
||||
* Changed the XML report format to match JUnit/Ant's.
|
||||
* Added tests to the Xcode project.
|
||||
* Added scons/SConscript for building with SCons.
|
||||
* Added src/gtest-all.cc for building Google Test from a single file.
|
||||
* Fixed compatibility with Solaris and z/OS.
|
||||
* Enabled running Python tests on systems with python 2.3 installed,
|
||||
e.g. Mac OS X 10.4.
|
||||
* Bug fixes.
|
||||
|
||||
Changes for 1.1.0:
|
||||
|
||||
* New feature: type-parameterized tests.
|
||||
* New feature: exception assertions.
|
||||
* New feature: printing elapsed time of tests.
|
||||
* Improved the robustness of death tests.
|
||||
* Added an Xcode project and samples.
|
||||
* Adjusted the output format on Windows to be understandable by Visual Studio.
|
||||
* Minor bug fixes.
|
||||
|
||||
Changes for 1.0.1:
|
||||
|
||||
* Added project files for Visual Studio 7.1.
|
||||
* Fixed issues with compiling on Mac OS X.
|
||||
* Fixed issues with compiling on Cygwin.
|
||||
|
||||
Changes for 1.0.0:
|
||||
|
||||
* Initial Open Source release of Google Test
|
||||
|
||||
@@ -4,15 +4,11 @@
|
||||
# here. Please keep the list sorted by first names.
|
||||
|
||||
Ajay Joshi <jaj@google.com>
|
||||
Balázs Dán <balazs.dan@gmail.com>
|
||||
Bharat Mediratta <bharat@menalto.com>
|
||||
Chandler Carruth <chandlerc@google.com>
|
||||
Chris Prince <cprince@google.com>
|
||||
Chris Taylor <taylorc@google.com>
|
||||
Dan Egnor <egnor@google.com>
|
||||
Eric Roman <eroman@chromium.org>
|
||||
Jeffrey Yasskin <jyasskin@google.com>
|
||||
Jói Sigurðsson <joi@google.com>
|
||||
Keir Mierle <mierle@gmail.com>
|
||||
Keith Ray <keith.ray@gmail.com>
|
||||
Kenton Varda <kenton@google.com>
|
||||
@@ -21,13 +17,9 @@ Mika Raento <mikie@iki.fi>
|
||||
Patrick Hanna <phanna@google.com>
|
||||
Patrick Riley <pfr@google.com>
|
||||
Peter Kaminski <piotrk@google.com>
|
||||
Preston Jackson <preston.jackson@gmail.com>
|
||||
Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>
|
||||
Russ Cox <rsc@google.com>
|
||||
Russ Rufer <russ@pentad.com>
|
||||
Sean Mcafee <eefacm@gmail.com>
|
||||
Sigurður Ásgeirsson <siggi@google.com>
|
||||
Tracy Bialik <tracy@pentad.com>
|
||||
Vadim Berman <vadimb@google.com>
|
||||
Vlad Losev <vladl@google.com>
|
||||
Zhanyong Wan <wan@google.com>
|
||||
|
||||
226
Makefile.am
226
Makefile.am
@@ -1,55 +1,10 @@
|
||||
# Automake file
|
||||
|
||||
# TODO(chandlerc@google.com): automate the generation of *.h from *.h.pump.
|
||||
|
||||
# Nonstandard package files for distribution
|
||||
EXTRA_DIST = \
|
||||
CHANGES \
|
||||
CONTRIBUTORS \
|
||||
include/gtest/gtest-param-test.h.pump \
|
||||
include/gtest/internal/gtest-type-util.h.pump \
|
||||
include/gtest/internal/gtest-param-util-generated.h.pump \
|
||||
make/Makefile \
|
||||
scons/SConscript \
|
||||
scripts/fuse_gtest_files.py \
|
||||
scripts/gen_gtest_pred_impl.py \
|
||||
scripts/test/Makefile \
|
||||
test/gtest_all_test.cc
|
||||
|
||||
# MSVC project files
|
||||
EXTRA_DIST += \
|
||||
msvc/gtest.sln \
|
||||
msvc/gtest.vcproj \
|
||||
msvc/gtest_color_test_.vcproj \
|
||||
msvc/gtest_env_var_test_.vcproj \
|
||||
msvc/gtest_environment_test.vcproj \
|
||||
msvc/gtest_main.vcproj \
|
||||
msvc/gtest_output_test_.vcproj \
|
||||
msvc/gtest_prod_test.vcproj \
|
||||
msvc/gtest_uninitialized_test_.vcproj \
|
||||
msvc/gtest_unittest.vcproj
|
||||
|
||||
# xcode project files
|
||||
EXTRA_DIST += \
|
||||
xcode/Config/DebugProject.xcconfig \
|
||||
xcode/Config/FrameworkTarget.xcconfig \
|
||||
xcode/Config/General.xcconfig \
|
||||
xcode/Config/ReleaseProject.xcconfig \
|
||||
xcode/Config/TestTarget.xcconfig \
|
||||
xcode/Config/InternalTestTarget.xcconfig \
|
||||
xcode/Config/InternalPythonTestTarget.xcconfig \
|
||||
xcode/Resources/Info.plist \
|
||||
xcode/Scripts/versiongenerate.py \
|
||||
xcode/Scripts/runtests.sh \
|
||||
xcode/gtest.xcodeproj/project.pbxproj
|
||||
|
||||
# xcode sample files
|
||||
EXTRA_DIST += \
|
||||
xcode/Samples/FrameworkSample/Info.plist \
|
||||
xcode/Samples/FrameworkSample/widget_test.cc \
|
||||
xcode/Samples/FrameworkSample/widget.cc \
|
||||
xcode/Samples/FrameworkSample/widget.h \
|
||||
xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj
|
||||
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
|
||||
@@ -76,31 +31,22 @@ 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 \
|
||||
src/gtest-test-part.cc \
|
||||
src/gtest-typed-test.cc
|
||||
src/gtest-port.cc
|
||||
|
||||
pkginclude_HEADERS = include/gtest/gtest.h \
|
||||
include/gtest/gtest-death-test.h \
|
||||
include/gtest/gtest-message.h \
|
||||
include/gtest/gtest-param-test.h \
|
||||
include/gtest/gtest_pred_impl.h \
|
||||
include/gtest/gtest_prod.h \
|
||||
include/gtest/gtest-spi.h \
|
||||
include/gtest/gtest-test-part.h \
|
||||
include/gtest/gtest-typed-test.h
|
||||
include/gtest/gtest_pred_impl.h \
|
||||
include/gtest/gtest_prod.h
|
||||
|
||||
pkginclude_internaldir = $(pkgincludedir)/internal
|
||||
pkginclude_internal_HEADERS = \
|
||||
include/gtest/internal/gtest-death-test-internal.h \
|
||||
include/gtest/internal/gtest-filepath.h \
|
||||
include/gtest/internal/gtest-internal.h \
|
||||
include/gtest/internal/gtest-linked_ptr.h \
|
||||
include/gtest/internal/gtest-param-util-generated.h \
|
||||
include/gtest/internal/gtest-param-util.h \
|
||||
include/gtest/internal/gtest-port.h \
|
||||
include/gtest/internal/gtest-string.h \
|
||||
include/gtest/internal/gtest-type-util.h
|
||||
include/gtest/internal/gtest-string.h
|
||||
|
||||
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
|
||||
lib_libgtest_main_la_LIBADD = lib/libgtest.la
|
||||
@@ -157,26 +103,10 @@ samples_sample5_unittest_SOURCES = samples/sample5_unittest.cc
|
||||
samples_sample5_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample6_unittest
|
||||
check_PROGRAMS += samples/sample6_unittest
|
||||
samples_sample6_unittest_SOURCES = samples/prime_tables.h \
|
||||
samples/sample6_unittest.cc
|
||||
samples_sample6_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample7_unittest
|
||||
check_PROGRAMS += samples/sample7_unittest
|
||||
samples_sample7_unittest_SOURCES = samples/prime_tables.h \
|
||||
samples/sample7_unittest.cc
|
||||
samples_sample7_unittest_LDADD = lib/libgtest_main.la \
|
||||
samples/libsamples.la
|
||||
|
||||
TESTS += samples/sample8_unittest
|
||||
check_PROGRAMS += samples/sample8_unittest
|
||||
samples_sample8_unittest_SOURCES = samples/prime_tables.h \
|
||||
samples/sample8_unittest.cc
|
||||
samples_sample8_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
|
||||
@@ -184,58 +114,41 @@ 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_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-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-linked_ptr_test
|
||||
check_PROGRAMS += test/gtest-linked_ptr_test
|
||||
test_gtest_linked_ptr_test_SOURCES = test/gtest-linked_ptr_test.cc
|
||||
test_gtest_linked_ptr_test_LDADD = lib/libgtest_main.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-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_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-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-param-test_test
|
||||
check_PROGRAMS += test/gtest-param-test_test
|
||||
test_gtest_param_test_test_SOURCES = test/gtest-param-test_test.cc \
|
||||
test/gtest-param-test2_test.cc \
|
||||
test/gtest-param-test_test.h
|
||||
test_gtest_param_test_test_LDADD = lib/libgtest.la
|
||||
|
||||
TESTS += test/gtest-port_test
|
||||
check_PROGRAMS += test/gtest-port_test
|
||||
test_gtest_port_test_SOURCES = test/gtest-port_test.cc
|
||||
test_gtest_port_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 \
|
||||
@@ -248,40 +161,11 @@ 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_sole_header_test
|
||||
check_PROGRAMS += test/gtest_sole_header_test
|
||||
test_gtest_sole_header_test_SOURCES = test/gtest_sole_header_test.cc
|
||||
test_gtest_sole_header_test_LDADD = lib/libgtest_main.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
|
||||
|
||||
TESTS += test/gtest-test-part_test
|
||||
check_PROGRAMS += test/gtest-test-part_test
|
||||
test_gtest_test_part_test_SOURCES = test/gtest-test-part_test.cc
|
||||
test_gtest_test_part_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_throw_on_failure_ex_test
|
||||
check_PROGRAMS += test/gtest_throw_on_failure_ex_test
|
||||
test_gtest_throw_on_failure_ex_test_SOURCES = \
|
||||
test/gtest_throw_on_failure_ex_test.cc \
|
||||
src/gtest-all.cc
|
||||
test_gtest_throw_on_failure_ex_test_CXXFLAGS = $(AM_CXXFLAGS) -fexceptions
|
||||
|
||||
TESTS += test/gtest-typed-test_test
|
||||
check_PROGRAMS += test/gtest-typed-test_test
|
||||
test_gtest_typed_test_test_SOURCES = test/gtest-typed-test_test.cc \
|
||||
test/gtest-typed-test2_test.cc \
|
||||
test/gtest-typed-test_test.h
|
||||
test_gtest_typed_test_test_LDADD = lib/libgtest_main.la
|
||||
|
||||
TESTS += test/gtest_unittest
|
||||
check_PROGRAMS += test/gtest_unittest
|
||||
test_gtest_unittest_SOURCES = test/gtest_unittest.cc
|
||||
test_gtest_unittest_LDADD = lib/libgtest_main.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
|
||||
@@ -291,16 +175,17 @@ test_gtest_unittest_LDADD = lib/libgtest_main.la
|
||||
if HAVE_PYTHON
|
||||
check_SCRIPTS =
|
||||
|
||||
# These two Python modules are used by multiple Python tests below.
|
||||
# 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_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_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
|
||||
@@ -320,11 +205,12 @@ 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_help_test_
|
||||
test_gtest_help_test__SOURCES = test/gtest_help_test_.cc
|
||||
test_gtest_help_test__LDADD = lib/libgtest_main.la
|
||||
check_SCRIPTS += test/gtest_help_test.py
|
||||
TESTS += test/gtest_help_test.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
|
||||
@@ -332,27 +218,11 @@ 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_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_throw_on_failure_test_
|
||||
test_gtest_throw_on_failure_test__SOURCES = \
|
||||
test/gtest_throw_on_failure_test_.cc \
|
||||
src/gtest-all.cc
|
||||
test_gtest_throw_on_failure_test__CXXFLAGS = $(AM_CXXFLAGS) -fno-exceptions
|
||||
check_SCRIPTS += test/gtest_throw_on_failure_test.py
|
||||
TESTS += test/gtest_throw_on_failure_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
|
||||
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
|
||||
@@ -363,11 +233,11 @@ 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_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_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
|
||||
|
||||
218
README
218
README
@@ -5,7 +5,7 @@ http://code.google.com/p/googletest/
|
||||
Overview
|
||||
--------
|
||||
Google's framework for writing C++ tests on a variety of platforms (Linux, Mac
|
||||
OS X, Windows, Windows CE, Symbian, and etc). Based on the xUnit architecture.
|
||||
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.
|
||||
@@ -16,15 +16,12 @@ 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, we support
|
||||
building Google Test on Linux, Windows, Mac OS X, and Cygwin. We will
|
||||
also make our best effort to support other platforms (e.g. Solaris and
|
||||
IBM z/OS). However, since core members of the Google Test project
|
||||
have no access to them, Google Test may have outstanding issues on
|
||||
these platforms. If you notice any problems on your platform, please
|
||||
notify googletestframework@googlegroups.com (patches for fixing them
|
||||
are even more welcome!).
|
||||
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
|
||||
@@ -41,17 +38,6 @@ described below), there are further requirements:
|
||||
* Libtool / Libtoolize
|
||||
* Python version 2.4 or newer
|
||||
|
||||
### Windows Requirements ###
|
||||
* Microsoft Visual Studio 7.1 or newer
|
||||
|
||||
### Cygwin Requirements ###
|
||||
* Cygwin 1.5.25-14 or newer
|
||||
|
||||
### Mac OS X Requirements ###
|
||||
* Mac OS X 10.4 Tiger or newer
|
||||
* Developer Tools Installed
|
||||
* Optional: Xcode 2.5 or later for univeral-binary framework; see note below.
|
||||
|
||||
Getting the Source
|
||||
------------------
|
||||
There are two primary ways of getting Google Test's source code: you can
|
||||
@@ -68,33 +54,25 @@ 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
|
||||
$ 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
|
||||
$ 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, if you
|
||||
are using Linux, Mac OS X, or Cygwin. Enter the target directory of
|
||||
the checkout command you used ('gtest-svn' or 'gtest-X.Y-svn' above)
|
||||
and proceed with the following command:
|
||||
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:
|
||||
|
||||
autoreconf -fvi
|
||||
$ 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
|
||||
|
||||
Once you have completed this step, you are ready to build the library. Note
|
||||
that you should only need to complete this step once. The subsequent `make'
|
||||
invocations will automatically re-generate the bits of the build system that
|
||||
need to be changed.
|
||||
|
||||
If your system uses older versions of the autotools, the above command will
|
||||
fail. You may need to explicitly specify a version to use. For instance, if you
|
||||
have both GNU Automake 1.4 and 1.9 installed and `automake' would invoke the
|
||||
1.4, use instead:
|
||||
|
||||
AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 autoreconf -fvi
|
||||
|
||||
Make sure you're using the same version of automake and aclocal.
|
||||
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
|
||||
@@ -108,13 +86,12 @@ 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
|
||||
$ 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
|
||||
-------------------
|
||||
### Linux, Mac OS X (without Xcode), and Cygwin ###
|
||||
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
|
||||
@@ -127,9 +104,9 @@ 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
|
||||
$ ${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
|
||||
@@ -137,138 +114,21 @@ 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
|
||||
$ sudo make install # Not necessary, but allows use by other programs
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
sudo make uninstall # Must be run against the exact same build as "install"
|
||||
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.
|
||||
|
||||
Your project can build against Google Test simply by leveraging the
|
||||
'gtest-config' script. This script can be invoked directly out of the 'scripts'
|
||||
subdirectory of the build tree, and it will be installed in the binary
|
||||
directory specified during the 'configure'. Here are some examples of its use,
|
||||
see 'gtest-config --help' for more detailed information.
|
||||
|
||||
gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
|
||||
|
||||
g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
|
||||
g++ $(gtest-config --ldflags --libs) -o foo foo.o
|
||||
|
||||
# When using a built but not installed Google Test:
|
||||
g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
|
||||
|
||||
### Windows ###
|
||||
Open the gtest.sln file in the msvc/ folder using Visual Studio, and
|
||||
you are ready to build Google Test the same way you build any Visual
|
||||
Studio project.
|
||||
|
||||
### Mac OS X (universal-binary framework) ###
|
||||
Open the gtest.xcodeproj in the xcode/ folder using Xcode. Build the "gtest"
|
||||
target. The universal binary framework will end up in your selected build
|
||||
directory (selected in the Xcode "Preferences..." -> "Building" pane and
|
||||
defaults to xcode/build). Alternatively, at the command line, enter:
|
||||
|
||||
xcodebuild
|
||||
|
||||
This will build the "Release" configuration of the gtest.framework, but you can
|
||||
select the "Debug" configuration with a command line option. See the
|
||||
"xcodebuild" man page for more information.
|
||||
|
||||
To test the gtest.framework in Xcode, change the active target to "Check" and
|
||||
then build. This target builds all of the tests and then runs them. Don't worry
|
||||
if you see some errors. Xcode reports all test failures (even the intentional
|
||||
ones) as errors. However, you should see a "Build succeeded" message at the end
|
||||
of the build log. To run all of the tests from the command line, enter:
|
||||
|
||||
xcodebuid -target Check
|
||||
|
||||
It is also possible to build and execute individual tests within Xcode. Each
|
||||
test has its own Xcode "Target" and Xcode "Executable". To build any of the
|
||||
tests, change the active target and the active executable to the test of
|
||||
interest and then build and run.
|
||||
|
||||
NOTE: Several tests use a Python script to run the test executable. These can be
|
||||
run from Xcode by creating a "Custom Executable". For example, to run the Python
|
||||
script which executes the gtest_color_test, select the Project->New Custom
|
||||
Executable... menu item. When prompted, set the "Executable Name" to something
|
||||
like "run_gtest_color_test" and set the "Executable Path" to the path of the
|
||||
gtest_color_test.py script. Finally, choose "Run" from the Run menu and check
|
||||
the Console for the results.
|
||||
|
||||
Individual tests can be built from the command line using:
|
||||
|
||||
xcodebuild -target <test_name>
|
||||
|
||||
These tests can be executed from the command line by moving to the build
|
||||
directory and then (in bash)
|
||||
|
||||
export DYLD_FRAMEWORK_PATH=`pwd`
|
||||
./<test_name> # (if it is not a python test, e.g. ./gtest_unittest)
|
||||
# OR
|
||||
./<test_name>.py # (if it is a python test, e.g. ./gtest_color_test.py)
|
||||
|
||||
To use the gtest.framework for your own tests, first, add the framework to Xcode
|
||||
project. Next, create a new executable target and add the framework to the
|
||||
"Link Binary With Libraries" build phase. Select "Edit Active Executable" from
|
||||
the "Project" menu. In the "Arguments" tab, add
|
||||
|
||||
"DYLD_FRAMEWORK_PATH" : "/real/framework/path"
|
||||
|
||||
in the "Variables to be set in the environment:" list, where you replace
|
||||
"/real/framework/path" with the actual location of the gtest.framework. Now
|
||||
when you run your executable, it will load the framework and your test will
|
||||
run as expected.
|
||||
|
||||
### Using GNU Make ###
|
||||
The make/ directory contains a Makefile that you can use to build
|
||||
Google Test on systems where GNU make is available (e.g. Linux, Mac OS
|
||||
X, and Cygwin). It doesn't try to build Google Test's own tests.
|
||||
Instead, it just builds the Google Test library and a sample test.
|
||||
You can use it as a starting point for your own Makefile.
|
||||
|
||||
If the default settings are correct for your environment, the
|
||||
following commands should succeed:
|
||||
|
||||
cd ${SRCDIR}/make
|
||||
make
|
||||
./sample1_unittest
|
||||
|
||||
If you see errors, try to tweak the contents of make/Makefile to make
|
||||
them go away. There are instructions in make/Makefile on how to do
|
||||
it.
|
||||
|
||||
### Using Your Own Build System ###
|
||||
If none of the build solutions we provide works for you, or if you
|
||||
prefer your own build system, you just need to compile
|
||||
src/gtest-all.cc into a library and link your tests with it. Assuming
|
||||
a Linux-like system and gcc, something like the following will do:
|
||||
|
||||
cd ${SRCDIR}
|
||||
g++ -I. -I./include -c src/gtest-all.cc
|
||||
ar -rv libgtest.a gtest-all.o
|
||||
g++ -I. -I./include path/to/your_test.cc libgtest.a -o your_test
|
||||
|
||||
Regenerating Source Files
|
||||
-------------------------
|
||||
Some of Google Test's source files are generated from templates (not
|
||||
in the C++ sense) using a script. A template file is named FOO.pump,
|
||||
where FOO is the name of the file it will generate. For example, the
|
||||
file include/gtest/internal/gtest-type-util.h.pump is used to generate
|
||||
gtest-type-util.h in the same directory.
|
||||
|
||||
Normally you don't need to worry about regenerating the source files,
|
||||
unless you need to modify them (e.g. if you are working on a patch for
|
||||
Google Test). In that case, you should modify the corresponding .pump
|
||||
files instead and run the 'pump' script (for Pump is Useful for Meta
|
||||
Programming) to regenerate them. We are still working on releasing
|
||||
the script and its documentation. If you need it now, please email
|
||||
googletestframework@googlegroups.com such that we know to make it
|
||||
happen sooner.
|
||||
$ sudo make uninstall # Must be run against the exact same build as "install"
|
||||
|
||||
Happy testing!
|
||||
|
||||
15
configure.ac
15
configure.ac
@@ -1,17 +1,13 @@
|
||||
# At this point, the Xcode project assumes the version string will be three
|
||||
# integers separated by periods and surrounded by square brackets (e.g.
|
||||
# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
|
||||
# between "AC_INIT(" and the closing ")" including comments and strings.
|
||||
AC_INIT([Google C++ Testing Framework],
|
||||
[1.3.0],
|
||||
[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([build-aux])
|
||||
AC_CONFIG_HEADERS([build-aux/config.h])
|
||||
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])
|
||||
|
||||
@@ -29,12 +25,13 @@ AC_PROG_LIBTOOL
|
||||
# TODO(chandlerc@google.com): Currently we aren't running the Python tests
|
||||
# against the interpreter detected by AM_PATH_PYTHON, and so we condition
|
||||
# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
|
||||
# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
|
||||
# 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.3],[:],[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.
|
||||
|
||||
@@ -47,28 +47,38 @@ namespace testing {
|
||||
// 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);
|
||||
GTEST_DECLARE_string(death_test_style);
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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. It generates a warning if there is more than one active
|
||||
// thread. This is because it's safe to fork() or clone() only
|
||||
// when there is a single thread.
|
||||
// 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 clone()s a sub-process and runs the death
|
||||
// test in it; the sub-process exits with code 0 at the end of the
|
||||
// death test, if it hasn't exited already.
|
||||
// 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");
|
||||
@@ -85,82 +95,17 @@ GTEST_DECLARE_string_(death_test_style);
|
||||
// }
|
||||
//
|
||||
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
|
||||
//
|
||||
// On the regular expressions used in death tests:
|
||||
//
|
||||
// On POSIX-compliant systems (*nix), we use the <regex.h> library,
|
||||
// which uses the POSIX extended regex syntax.
|
||||
//
|
||||
// On other platforms (e.g. Windows), we only support a simple regex
|
||||
// syntax implemented as part of Google Test. This limited
|
||||
// implementation should be enough most of the time when writing
|
||||
// death tests; though it lacks many features you can find in PCRE
|
||||
// or POSIX extended regex syntax. For example, we don't support
|
||||
// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
|
||||
// repetition count ("x{5,7}"), among others.
|
||||
//
|
||||
// Below is the syntax that we do support. We chose it to be a
|
||||
// subset of both PCRE and POSIX extended regex, so it's easy to
|
||||
// learn wherever you come from. In the following: 'A' denotes a
|
||||
// literal character, period (.), or a single \\ escape sequence;
|
||||
// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
|
||||
// natural numbers.
|
||||
//
|
||||
// c matches any literal character c
|
||||
// \\d matches any decimal digit
|
||||
// \\D matches any character that's not a decimal digit
|
||||
// \\f matches \f
|
||||
// \\n matches \n
|
||||
// \\r matches \r
|
||||
// \\s matches any ASCII whitespace, including \n
|
||||
// \\S matches any character that's not a whitespace
|
||||
// \\t matches \t
|
||||
// \\v matches \v
|
||||
// \\w matches any letter, _, or decimal digit
|
||||
// \\W matches any character that \\w doesn't match
|
||||
// \\c matches any literal character c, which must be a punctuation
|
||||
// . matches any single character except \n
|
||||
// A? matches 0 or 1 occurrences of A
|
||||
// A* matches 0 or many occurrences of A
|
||||
// A+ matches 1 or many occurrences of A
|
||||
// ^ matches the beginning of a string (not that of each line)
|
||||
// $ matches the end of a string (not that of each line)
|
||||
// xy matches x followed by y
|
||||
//
|
||||
// If you accidentally use PCRE or POSIX extended regex features
|
||||
// not implemented by us, you will get a run-time failure. In that
|
||||
// case, please try to rewrite your regular expression within the
|
||||
// above syntax.
|
||||
//
|
||||
// This implementation is *not* meant to be as highly tuned or robust
|
||||
// as a compiled regex library, but should perform well enough for a
|
||||
// death test, which already incurs significant overhead by launching
|
||||
// a child process.
|
||||
//
|
||||
// Known caveats:
|
||||
//
|
||||
// A "threadsafe" style death test obtains the path to the test
|
||||
// program from argv[0] and re-executes it in the sub-process. For
|
||||
// simplicity, the current implementation doesn't search the PATH
|
||||
// when launching the sub-process. This means that the user must
|
||||
// invoke the test program via a path that contains at least one
|
||||
// path separator (e.g. path/to/foo_test and
|
||||
// /absolute/path/to/bar_test are fine, but foo_test is not). This
|
||||
// is rarely a problem as people usually don't put the test binary
|
||||
// directory in PATH.
|
||||
//
|
||||
// TODO(wan@google.com): make thread-safe death tests search the PATH.
|
||||
|
||||
// Asserts that a given statement causes the program to exit, with an
|
||||
// integer exit status that satisfies predicate, and emitting error output
|
||||
// that matches regex.
|
||||
#define ASSERT_EXIT(statement, predicate, regex) \
|
||||
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
|
||||
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_)
|
||||
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
|
||||
@@ -184,7 +129,6 @@ class ExitedWithCode {
|
||||
const int exit_code_;
|
||||
};
|
||||
|
||||
#if !GTEST_OS_WINDOWS
|
||||
// Tests that an exit code describes an exit due to termination by a
|
||||
// given signal.
|
||||
class KilledBySignal {
|
||||
@@ -194,7 +138,6 @@ class KilledBySignal {
|
||||
private:
|
||||
const int signum_;
|
||||
};
|
||||
#endif // !GTEST_OS_WINDOWS
|
||||
|
||||
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
|
||||
// The death testing framework causes this to have interesting semantics,
|
||||
|
||||
@@ -46,8 +46,20 @@
|
||||
#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 {
|
||||
|
||||
@@ -102,7 +114,7 @@ class Message {
|
||||
}
|
||||
|
||||
~Message() { delete ss_; }
|
||||
#if GTEST_OS_SYMBIAN
|
||||
#ifdef __SYMBIAN32__
|
||||
// Streams a value (either a pointer or not) to this object.
|
||||
template <typename T>
|
||||
inline Message& operator <<(const T& value) {
|
||||
@@ -139,7 +151,7 @@ class Message {
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
#endif // GTEST_OS_SYMBIAN
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Since the basic IO manipulators are overloaded for both narrow
|
||||
// and wide streams, we have to provide this specialized definition
|
||||
@@ -187,7 +199,7 @@ class Message {
|
||||
}
|
||||
|
||||
private:
|
||||
#if GTEST_OS_SYMBIAN
|
||||
#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
|
||||
@@ -204,7 +216,7 @@ class Message {
|
||||
inline void StreamHelper(internal::false_type dummy, const T& value) {
|
||||
::GTestStreamToHelper(ss_, value);
|
||||
}
|
||||
#endif // GTEST_OS_SYMBIAN
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// We'll hold the text streamed to this object here.
|
||||
internal::StrStream* const ss_;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,453 +0,0 @@
|
||||
$$ -*- mode: c++; -*-
|
||||
$var n = 50 $$ Maximum length of Values arguments we want to support.
|
||||
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support.
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: vladl@google.com (Vlad Losev)
|
||||
//
|
||||
// Macros and functions for implementing parameterized tests
|
||||
// in Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
||||
//
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||
|
||||
|
||||
// Value-parameterized tests allow you to test your code with different
|
||||
// parameters without writing multiple copies of the same test.
|
||||
//
|
||||
// Here is how you use value-parameterized tests:
|
||||
|
||||
#if 0
|
||||
|
||||
// To write value-parameterized tests, first you should define a fixture
|
||||
// class. It must be derived from testing::TestWithParam<T>, where T is
|
||||
// the type of your parameter values. TestWithParam<T> is itself derived
|
||||
// from testing::Test. T can be any copyable type. If it's a raw pointer,
|
||||
// you are responsible for managing the lifespan of the pointed values.
|
||||
|
||||
class FooTest : public ::testing::TestWithParam<const char*> {
|
||||
// You can implement all the usual class fixture members here.
|
||||
};
|
||||
|
||||
// Then, use the TEST_P macro to define as many parameterized tests
|
||||
// for this fixture as you want. The _P suffix is for "parameterized"
|
||||
// or "pattern", whichever you prefer to think.
|
||||
|
||||
TEST_P(FooTest, DoesBlah) {
|
||||
// Inside a test, access the test parameter with the GetParam() method
|
||||
// of the TestWithParam<T> class:
|
||||
EXPECT_TRUE(foo.Blah(GetParam()));
|
||||
...
|
||||
}
|
||||
|
||||
TEST_P(FooTest, HasBlahBlah) {
|
||||
...
|
||||
}
|
||||
|
||||
// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
|
||||
// case with any set of parameters you want. Google Test defines a number
|
||||
// of functions for generating test parameters. They return what we call
|
||||
// (surprise!) parameter generators. Here is a summary of them, which
|
||||
// are all in the testing namespace:
|
||||
//
|
||||
//
|
||||
// Range(begin, end [, step]) - Yields values {begin, begin+step,
|
||||
// begin+step+step, ...}. The values do not
|
||||
// include end. step defaults to 1.
|
||||
// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
|
||||
// ValuesIn(container) - Yields values from a C-style array, an STL
|
||||
// ValuesIn(begin,end) container, or an iterator range [begin, end).
|
||||
// Bool() - Yields sequence {false, true}.
|
||||
// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
|
||||
// for the math savvy) of the values generated
|
||||
// by the N generators.
|
||||
//
|
||||
// For more details, see comments at the definitions of these functions below
|
||||
// in this file.
|
||||
//
|
||||
// The following statement will instantiate tests from the FooTest test case
|
||||
// each with parameter values "meeny", "miny", and "moe".
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(InstantiationName,
|
||||
FooTest,
|
||||
Values("meeny", "miny", "moe"));
|
||||
|
||||
// To distinguish different instances of the pattern, (yes, you
|
||||
// can instantiate it more then once) the first argument to the
|
||||
// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
|
||||
// actual test case name. Remember to pick unique prefixes for different
|
||||
// instantiations. The tests from the instantiation above will have
|
||||
// these names:
|
||||
//
|
||||
// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
|
||||
// * InstantiationName/FooTest.DoesBlah/1 for "miny"
|
||||
// * InstantiationName/FooTest.DoesBlah/2 for "moe"
|
||||
// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
|
||||
// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
|
||||
// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
|
||||
//
|
||||
// You can use these names in --gtest_filter.
|
||||
//
|
||||
// This statement will instantiate all tests from FooTest again, each
|
||||
// with parameter values "cat" and "dog":
|
||||
|
||||
const char* pets[] = {"cat", "dog"};
|
||||
INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
|
||||
|
||||
// The tests from the instantiation above will have these names:
|
||||
//
|
||||
// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
|
||||
// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
|
||||
// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
|
||||
// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
|
||||
//
|
||||
// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
|
||||
// in the given test case, whether their definitions come before or
|
||||
// AFTER the INSTANTIATE_TEST_CASE_P statement.
|
||||
//
|
||||
// Please also note that generator expressions are evaluated in
|
||||
// RUN_ALL_TESTS(), after main() has started. This allows evaluation of
|
||||
// parameter list based on command line parameters.
|
||||
//
|
||||
// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
|
||||
// for more examples.
|
||||
//
|
||||
// In the future, we plan to publish the API for defining new parameter
|
||||
// generators. But for now this interface remains part of the internal
|
||||
// implementation and is subject to change.
|
||||
|
||||
#endif // 0
|
||||
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
#include <gtest/internal/gtest-param-util.h>
|
||||
#include <gtest/internal/gtest-param-util-generated.h>
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Functions producing parameter generators.
|
||||
//
|
||||
// Google Test uses these generators to produce parameters for value-
|
||||
// parameterized tests. When a parameterized test case is instantiated
|
||||
// with a particular generator, Google Test creates and runs tests
|
||||
// for each element in the sequence produced by the generator.
|
||||
//
|
||||
// In the following sample, tests from test case FooTest are instantiated
|
||||
// each three times with parameter values 3, 5, and 8:
|
||||
//
|
||||
// class FooTest : public TestWithParam<int> { ... };
|
||||
//
|
||||
// TEST_P(FooTest, TestThis) {
|
||||
// }
|
||||
// TEST_P(FooTest, TestThat) {
|
||||
// }
|
||||
// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
|
||||
//
|
||||
|
||||
// Range() returns generators providing sequences of values in a range.
|
||||
//
|
||||
// Synopsis:
|
||||
// Range(start, end)
|
||||
// - returns a generator producing a sequence of values {start, start+1,
|
||||
// start+2, ..., }.
|
||||
// Range(start, end, step)
|
||||
// - returns a generator producing a sequence of values {start, start+step,
|
||||
// start+step+step, ..., }.
|
||||
// Notes:
|
||||
// * The generated sequences never include end. For example, Range(1, 5)
|
||||
// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
|
||||
// returns a generator producing {1, 3, 5, 7}.
|
||||
// * start and end must have the same type. That type may be any integral or
|
||||
// floating-point type or a user defined type satisfying these conditions:
|
||||
// * It must be assignable (have operator=() defined).
|
||||
// * It must have operator+() (operator+(int-compatible type) for
|
||||
// two-operand version).
|
||||
// * It must have operator<() defined.
|
||||
// Elements in the resulting sequences will also have that type.
|
||||
// * Condition start < end must be satisfied in order for resulting sequences
|
||||
// to contain any elements.
|
||||
//
|
||||
template <typename T, typename IncrementT>
|
||||
internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
|
||||
return internal::ParamGenerator<T>(
|
||||
new internal::RangeGenerator<T, IncrementT>(start, end, step));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
internal::ParamGenerator<T> Range(T start, T end) {
|
||||
return Range(start, end, 1);
|
||||
}
|
||||
|
||||
// ValuesIn() function allows generation of tests with parameters coming from
|
||||
// a container.
|
||||
//
|
||||
// Synopsis:
|
||||
// ValuesIn(const T (&array)[N])
|
||||
// - returns a generator producing sequences with elements from
|
||||
// a C-style array.
|
||||
// ValuesIn(const Container& container)
|
||||
// - returns a generator producing sequences with elements from
|
||||
// an STL-style container.
|
||||
// ValuesIn(Iterator begin, Iterator end)
|
||||
// - returns a generator producing sequences with elements from
|
||||
// a range [begin, end) defined by a pair of STL-style iterators. These
|
||||
// iterators can also be plain C pointers.
|
||||
//
|
||||
// Please note that ValuesIn copies the values from the containers
|
||||
// passed in and keeps them to generate tests in RUN_ALL_TESTS().
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// This instantiates tests from test case StringTest
|
||||
// each with C-string values of "foo", "bar", and "baz":
|
||||
//
|
||||
// const char* strings[] = {"foo", "bar", "baz"};
|
||||
// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
|
||||
//
|
||||
// This instantiates tests from test case StlStringTest
|
||||
// each with STL strings with values "a" and "b":
|
||||
//
|
||||
// ::std::vector< ::std::string> GetParameterStrings() {
|
||||
// ::std::vector< ::std::string> v;
|
||||
// v.push_back("a");
|
||||
// v.push_back("b");
|
||||
// return v;
|
||||
// }
|
||||
//
|
||||
// INSTANTIATE_TEST_CASE_P(CharSequence,
|
||||
// StlStringTest,
|
||||
// ValuesIn(GetParameterStrings()));
|
||||
//
|
||||
//
|
||||
// This will also instantiate tests from CharTest
|
||||
// each with parameter values 'a' and 'b':
|
||||
//
|
||||
// ::std::list<char> GetParameterChars() {
|
||||
// ::std::list<char> list;
|
||||
// list.push_back('a');
|
||||
// list.push_back('b');
|
||||
// return list;
|
||||
// }
|
||||
// ::std::list<char> l = GetParameterChars();
|
||||
// INSTANTIATE_TEST_CASE_P(CharSequence2,
|
||||
// CharTest,
|
||||
// ValuesIn(l.begin(), l.end()));
|
||||
//
|
||||
template <typename ForwardIterator>
|
||||
internal::ParamGenerator<
|
||||
typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn(
|
||||
ForwardIterator begin,
|
||||
ForwardIterator end) {
|
||||
typedef typename ::std::iterator_traits<ForwardIterator>::value_type
|
||||
ParamType;
|
||||
return internal::ParamGenerator<ParamType>(
|
||||
new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
|
||||
}
|
||||
|
||||
template <typename T, size_t N>
|
||||
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
|
||||
return ValuesIn(array, array + N);
|
||||
}
|
||||
|
||||
template <class Container>
|
||||
internal::ParamGenerator<typename Container::value_type> ValuesIn(
|
||||
const Container& container) {
|
||||
return ValuesIn(container.begin(), container.end());
|
||||
}
|
||||
|
||||
// Values() allows generating tests from explicitly specified list of
|
||||
// parameters.
|
||||
//
|
||||
// Synopsis:
|
||||
// Values(T v1, T v2, ..., T vN)
|
||||
// - returns a generator producing sequences with elements v1, v2, ..., vN.
|
||||
//
|
||||
// For example, this instantiates tests from test case BarTest each
|
||||
// with values "one", "two", and "three":
|
||||
//
|
||||
// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
|
||||
//
|
||||
// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
|
||||
// The exact type of values will depend on the type of parameter in BazTest.
|
||||
//
|
||||
// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
|
||||
//
|
||||
// Currently, Values() supports from 1 to $n parameters.
|
||||
//
|
||||
$range i 1..n
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
|
||||
template <$for j, [[typename T$j]]>
|
||||
internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
|
||||
return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
|
||||
}
|
||||
|
||||
]]
|
||||
|
||||
// Bool() allows generating tests with parameters in a set of (false, true).
|
||||
//
|
||||
// Synopsis:
|
||||
// Bool()
|
||||
// - returns a generator producing sequences with elements {false, true}.
|
||||
//
|
||||
// It is useful when testing code that depends on Boolean flags. Combinations
|
||||
// of multiple flags can be tested when several Bool()'s are combined using
|
||||
// Combine() function.
|
||||
//
|
||||
// In the following example all tests in the test case FlagDependentTest
|
||||
// will be instantiated twice with parameters false and true.
|
||||
//
|
||||
// class FlagDependentTest : public testing::TestWithParam<bool> {
|
||||
// virtual void SetUp() {
|
||||
// external_flag = GetParam();
|
||||
// }
|
||||
// }
|
||||
// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
|
||||
//
|
||||
inline internal::ParamGenerator<bool> Bool() {
|
||||
return Values(false, true);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_COMBINE
|
||||
// Combine() allows the user to combine two or more sequences to produce
|
||||
// values of a Cartesian product of those sequences' elements.
|
||||
//
|
||||
// Synopsis:
|
||||
// Combine(gen1, gen2, ..., genN)
|
||||
// - returns a generator producing sequences with elements coming from
|
||||
// the Cartesian product of elements from the sequences generated by
|
||||
// gen1, gen2, ..., genN. The sequence elements will have a type of
|
||||
// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
|
||||
// of elements from sequences produces by gen1, gen2, ..., genN.
|
||||
//
|
||||
// Combine can have up to $maxtuple arguments. This number is currently limited
|
||||
// by the maximum number of elements in the tuple implementation used by Google
|
||||
// Test.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// This will instantiate tests in test case AnimalTest each one with
|
||||
// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
|
||||
// tuple("dog", BLACK), and tuple("dog", WHITE):
|
||||
//
|
||||
// enum Color { BLACK, GRAY, WHITE };
|
||||
// class AnimalTest
|
||||
// : public testing::TestWithParam<tuple<const char*, Color> > {...};
|
||||
//
|
||||
// TEST_P(AnimalTest, AnimalLooksNice) {...}
|
||||
//
|
||||
// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
|
||||
// Combine(Values("cat", "dog"),
|
||||
// Values(BLACK, WHITE)));
|
||||
//
|
||||
// This will instantiate tests in FlagDependentTest with all variations of two
|
||||
// Boolean flags:
|
||||
//
|
||||
// class FlagDependentTest
|
||||
// : public testing::TestWithParam<tuple(bool, bool)> > {
|
||||
// virtual void SetUp() {
|
||||
// // Assigns external_flag_1 and external_flag_2 values from the tuple.
|
||||
// tie(external_flag_1, external_flag_2) = GetParam();
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// TEST_P(FlagDependentTest, TestFeature1) {
|
||||
// // Test your code using external_flag_1 and external_flag_2 here.
|
||||
// }
|
||||
// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
|
||||
// Combine(Bool(), Bool()));
|
||||
//
|
||||
$range i 2..maxtuple
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
|
||||
template <$for j, [[typename Generator$j]]>
|
||||
internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
|
||||
$for j, [[const Generator$j& g$j]]) {
|
||||
return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
|
||||
$for j, [[g$j]]);
|
||||
}
|
||||
|
||||
]]
|
||||
#endif // GTEST_HAS_COMBINE
|
||||
|
||||
|
||||
|
||||
#define TEST_P(test_case_name, test_name) \
|
||||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
||||
: public test_case_name { \
|
||||
public: \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
|
||||
virtual void TestBody(); \
|
||||
private: \
|
||||
static int AddToRegistry() { \
|
||||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||
GetTestCasePatternHolder<test_case_name>(\
|
||||
#test_case_name, __FILE__, __LINE__)->AddTestPattern(\
|
||||
#test_case_name, \
|
||||
#test_name, \
|
||||
new ::testing::internal::TestMetaFactory< \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
|
||||
return 0; \
|
||||
} \
|
||||
static int gtest_registering_dummy_; \
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
|
||||
}; \
|
||||
int GTEST_TEST_CLASS_NAME_(test_case_name, \
|
||||
test_name)::gtest_registering_dummy_ = \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
|
||||
|
||||
#define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
|
||||
::testing::internal::ParamGenerator<test_case_name::ParamType> \
|
||||
gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
|
||||
int gtest_##prefix##test_case_name##_dummy_ = \
|
||||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||
GetTestCasePatternHolder<test_case_name>(\
|
||||
#test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
|
||||
#prefix, \
|
||||
>est_##prefix##test_case_name##_EvalGenerator_, \
|
||||
__FILE__, __LINE__)
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||
@@ -39,34 +39,115 @@
|
||||
|
||||
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. It can either intercept only failures that are
|
||||
// generated in the same thread that created this object or it can intercept
|
||||
// all generated failures. The scope of this mock object can be controlled with
|
||||
// the second argument to the two arguments constructor.
|
||||
// TestPartResultArray object given in the constructor whenever a
|
||||
// Google Test failure is reported.
|
||||
class ScopedFakeTestPartResultReporter
|
||||
: public TestPartResultReporterInterface {
|
||||
public:
|
||||
// The two possible mocking modes of this object.
|
||||
enum InterceptMode {
|
||||
INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
|
||||
INTERCEPT_ALL_THREADS // Intercepts all failures.
|
||||
};
|
||||
|
||||
// The c'tor sets this object as the test part result reporter used
|
||||
// by Google Test. The 'result' parameter specifies where to report the
|
||||
// results. This reporter will only catch failures generated in the current
|
||||
// thread. DEPRECATED
|
||||
// results.
|
||||
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
|
||||
|
||||
// Same as above, but you can choose the interception scope of this object.
|
||||
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
|
||||
TestPartResultArray* result);
|
||||
|
||||
// The d'tor restores the previous test part result reporter.
|
||||
virtual ~ScopedFakeTestPartResultReporter();
|
||||
|
||||
@@ -77,13 +158,10 @@ class ScopedFakeTestPartResultReporter
|
||||
// interface.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
private:
|
||||
void Init();
|
||||
|
||||
const InterceptMode intercept_mode_;
|
||||
TestPartResultReporterInterface* old_reporter_;
|
||||
TestPartResultReporterInterface* const old_reporter_;
|
||||
TestPartResultArray* const result_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedFakeTestPartResultReporter);
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
@@ -105,38 +183,28 @@ class SingleFailureChecker {
|
||||
const TestPartResultType type_;
|
||||
const String substr_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(SingleFailureChecker);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
|
||||
// A set of macros for testing Google Test assertions or code that's expected
|
||||
// to generate Google Test fatal failures. It verifies that the given
|
||||
// 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.
|
||||
//
|
||||
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
|
||||
// affects and considers failures generated in the current thread and
|
||||
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
||||
//
|
||||
// The verification of the assertion is done correctly even when the statement
|
||||
// throws an exception or aborts the current function.
|
||||
// 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.
|
||||
//
|
||||
// Note that even though the implementations of the following two
|
||||
// macros are much alike, we cannot refactor them to use a common
|
||||
// helper macro, due to some peculiarity in how the preprocessor
|
||||
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
|
||||
// gtest_unittest.cc will fail to compile if we do that.
|
||||
#define EXPECT_FATAL_FAILURE(statement, substr) \
|
||||
do { \
|
||||
#define EXPECT_FATAL_FAILURE(statement, substr) do {\
|
||||
class GTestExpectFatalFailureHelper {\
|
||||
public:\
|
||||
static void Execute() { statement; }\
|
||||
@@ -146,73 +214,31 @@ class SingleFailureChecker {
|
||||
>est_failures, ::testing::TPRT_FATAL_FAILURE, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
|
||||
GTestExpectFatalFailureHelper::Execute();\
|
||||
}\
|
||||
} while (false)
|
||||
|
||||
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
|
||||
do { \
|
||||
class GTestExpectFatalFailureHelper {\
|
||||
public:\
|
||||
static void Execute() { statement; }\
|
||||
};\
|
||||
::testing::TestPartResultArray gtest_failures;\
|
||||
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||
>est_failures, ::testing::TPRT_FATAL_FAILURE, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ALL_THREADS, >est_failures);\
|
||||
>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.
|
||||
//
|
||||
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
|
||||
// affects and considers failures generated in the current thread and
|
||||
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
||||
// statement 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.
|
||||
//
|
||||
// The verification of the assertion is done correctly even when the statement
|
||||
// throws an exception or aborts the current function.
|
||||
// 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.
|
||||
//
|
||||
// Note that even though the implementations of the following two
|
||||
// macros are much alike, we cannot refactor them to use a common
|
||||
// helper macro, due to some peculiarity in how the preprocessor
|
||||
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
|
||||
// gtest_unittest.cc will fail to compile if we do that.
|
||||
#define EXPECT_NONFATAL_FAILURE(statement, substr) \
|
||||
do {\
|
||||
#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(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
|
||||
statement;\
|
||||
}\
|
||||
} while (false)
|
||||
|
||||
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
|
||||
do {\
|
||||
::testing::TestPartResultArray gtest_failures;\
|
||||
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||
>est_failures, ::testing::TPRT_NONFATAL_FAILURE, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
|
||||
>est_failures);\
|
||||
statement;\
|
||||
}\
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: mheule@google.com (Markus Heule)
|
||||
//
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||
|
||||
#include <iosfwd>
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
namespace testing {
|
||||
|
||||
// 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.
|
||||
};
|
||||
|
||||
// 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),
|
||||
summary_(ExtractSummary(message)),
|
||||
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 summary of the failure message.
|
||||
const char* summary() const { return summary_.c_str(); }
|
||||
|
||||
// Gets the message associated with the test part.
|
||||
const char* message() const { return message_.c_str(); }
|
||||
|
||||
// Returns true iff the test part passed.
|
||||
bool passed() const { return type_ == 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_;
|
||||
|
||||
// Gets the summary of the failure message by omitting the stack
|
||||
// trace in it.
|
||||
static internal::String ExtractSummary(const char* message);
|
||||
|
||||
// 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 summary_; // The test failure summary.
|
||||
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;
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
|
||||
// statement generates new fatal failures. To do so it registers itself as the
|
||||
// current test part result reporter. Besides checking if fatal failures were
|
||||
// reported, it only delegates the reporting to the former result reporter.
|
||||
// The original result reporter is restored in the destructor.
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
class HasNewFatalFailureHelper : public TestPartResultReporterInterface {
|
||||
public:
|
||||
HasNewFatalFailureHelper();
|
||||
virtual ~HasNewFatalFailureHelper();
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
|
||||
private:
|
||||
bool has_new_fatal_failure_;
|
||||
TestPartResultReporterInterface* original_reporter_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||
@@ -1,253 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
|
||||
#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
|
||||
|
||||
// This header implements typed tests and type-parameterized tests.
|
||||
|
||||
// Typed (aka type-driven) tests repeat the same test for types in a
|
||||
// list. You must know which types you want to test with when writing
|
||||
// typed tests. Here's how you do it:
|
||||
|
||||
#if 0
|
||||
|
||||
// First, define a fixture class template. It should be parameterized
|
||||
// by a type. Remember to derive it from testing::Test.
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
public:
|
||||
...
|
||||
typedef std::list<T> List;
|
||||
static T shared_;
|
||||
T value_;
|
||||
};
|
||||
|
||||
// Next, associate a list of types with the test case, which will be
|
||||
// repeated for each type in the list. The typedef is necessary for
|
||||
// the macro to parse correctly.
|
||||
typedef testing::Types<char, int, unsigned int> MyTypes;
|
||||
TYPED_TEST_CASE(FooTest, MyTypes);
|
||||
|
||||
// If the type list contains only one type, you can write that type
|
||||
// directly without Types<...>:
|
||||
// TYPED_TEST_CASE(FooTest, int);
|
||||
|
||||
// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
|
||||
// tests for this test case as you want.
|
||||
TYPED_TEST(FooTest, DoesBlah) {
|
||||
// Inside a test, refer to TypeParam to get the type parameter.
|
||||
// Since we are inside a derived class template, C++ requires use to
|
||||
// visit the members of FooTest via 'this'.
|
||||
TypeParam n = this->value_;
|
||||
|
||||
// To visit static members of the fixture, add the TestFixture::
|
||||
// prefix.
|
||||
n += TestFixture::shared_;
|
||||
|
||||
// To refer to typedefs in the fixture, add the "typename
|
||||
// TestFixture::" prefix.
|
||||
typename TestFixture::List values;
|
||||
values.push_back(n);
|
||||
...
|
||||
}
|
||||
|
||||
TYPED_TEST(FooTest, HasPropertyA) { ... }
|
||||
|
||||
#endif // 0
|
||||
|
||||
// Type-parameterized tests are abstract test patterns parameterized
|
||||
// by a type. Compared with typed tests, type-parameterized tests
|
||||
// allow you to define the test pattern without knowing what the type
|
||||
// parameters are. The defined pattern can be instantiated with
|
||||
// different types any number of times, in any number of translation
|
||||
// units.
|
||||
//
|
||||
// If you are designing an interface or concept, you can define a
|
||||
// suite of type-parameterized tests to verify properties that any
|
||||
// valid implementation of the interface/concept should have. Then,
|
||||
// each implementation can easily instantiate the test suite to verify
|
||||
// that it conforms to the requirements, without having to write
|
||||
// similar tests repeatedly. Here's an example:
|
||||
|
||||
#if 0
|
||||
|
||||
// First, define a fixture class template. It should be parameterized
|
||||
// by a type. Remember to derive it from testing::Test.
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
...
|
||||
};
|
||||
|
||||
// Next, declare that you will define a type-parameterized test case
|
||||
// (the _P suffix is for "parameterized" or "pattern", whichever you
|
||||
// prefer):
|
||||
TYPED_TEST_CASE_P(FooTest);
|
||||
|
||||
// Then, use TYPED_TEST_P() to define as many type-parameterized tests
|
||||
// for this type-parameterized test case as you want.
|
||||
TYPED_TEST_P(FooTest, DoesBlah) {
|
||||
// Inside a test, refer to TypeParam to get the type parameter.
|
||||
TypeParam n = 0;
|
||||
...
|
||||
}
|
||||
|
||||
TYPED_TEST_P(FooTest, HasPropertyA) { ... }
|
||||
|
||||
// Now the tricky part: you need to register all test patterns before
|
||||
// you can instantiate them. The first argument of the macro is the
|
||||
// test case name; the rest are the names of the tests in this test
|
||||
// case.
|
||||
REGISTER_TYPED_TEST_CASE_P(FooTest,
|
||||
DoesBlah, HasPropertyA);
|
||||
|
||||
// Finally, you are free to instantiate the pattern with the types you
|
||||
// want. If you put the above code in a header file, you can #include
|
||||
// it in multiple C++ source files and instantiate it multiple times.
|
||||
//
|
||||
// To distinguish different instances of the pattern, the first
|
||||
// argument to the INSTANTIATE_* macro is a prefix that will be added
|
||||
// to the actual test case name. Remember to pick unique prefixes for
|
||||
// different instances.
|
||||
typedef testing::Types<char, int, unsigned int> MyTypes;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
|
||||
|
||||
// If the type list contains only one type, you can write that type
|
||||
// directly without Types<...>:
|
||||
// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
|
||||
|
||||
#endif // 0
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
#include <gtest/internal/gtest-type-util.h>
|
||||
|
||||
// Implements typed tests.
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Expands to the name of the typedef for the type parameters of the
|
||||
// given test case.
|
||||
#define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
|
||||
|
||||
#define TYPED_TEST_CASE(CaseName, Types) \
|
||||
typedef ::testing::internal::TypeList<Types>::type \
|
||||
GTEST_TYPE_PARAMS_(CaseName)
|
||||
|
||||
#define TYPED_TEST(CaseName, TestName) \
|
||||
template <typename gtest_TypeParam_> \
|
||||
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
|
||||
: public CaseName<gtest_TypeParam_> { \
|
||||
private: \
|
||||
typedef CaseName<gtest_TypeParam_> TestFixture; \
|
||||
typedef gtest_TypeParam_ TypeParam; \
|
||||
virtual void TestBody(); \
|
||||
}; \
|
||||
bool gtest_##CaseName##_##TestName##_registered_ = \
|
||||
::testing::internal::TypeParameterizedTest< \
|
||||
CaseName, \
|
||||
::testing::internal::TemplateSel< \
|
||||
GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
|
||||
GTEST_TYPE_PARAMS_(CaseName)>::Register(\
|
||||
"", #CaseName, #TestName, 0); \
|
||||
template <typename gtest_TypeParam_> \
|
||||
void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST
|
||||
|
||||
// Implements type-parameterized tests.
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Expands to the namespace name that the type-parameterized tests for
|
||||
// the given type-parameterized test case are defined in. The exact
|
||||
// name of the namespace is subject to change without notice.
|
||||
#define GTEST_CASE_NAMESPACE_(TestCaseName) \
|
||||
gtest_case_##TestCaseName##_
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Expands to the name of the variable used to remember the names of
|
||||
// the defined tests in the given test case.
|
||||
#define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
|
||||
gtest_typed_test_case_p_state_##TestCaseName##_
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
|
||||
//
|
||||
// Expands to the name of the variable used to remember the names of
|
||||
// the registered tests in the given test case.
|
||||
#define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
|
||||
gtest_registered_test_names_##TestCaseName##_
|
||||
|
||||
// The variables defined in the type-parameterized test macros are
|
||||
// static as typically these macros are used in a .h file that can be
|
||||
// #included in multiple translation units linked together.
|
||||
#define TYPED_TEST_CASE_P(CaseName) \
|
||||
static ::testing::internal::TypedTestCasePState \
|
||||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
|
||||
|
||||
#define TYPED_TEST_P(CaseName, TestName) \
|
||||
namespace GTEST_CASE_NAMESPACE_(CaseName) { \
|
||||
template <typename gtest_TypeParam_> \
|
||||
class TestName : public CaseName<gtest_TypeParam_> { \
|
||||
private: \
|
||||
typedef CaseName<gtest_TypeParam_> TestFixture; \
|
||||
typedef gtest_TypeParam_ TypeParam; \
|
||||
virtual void TestBody(); \
|
||||
}; \
|
||||
static bool gtest_##TestName##_defined_ = \
|
||||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
|
||||
__FILE__, __LINE__, #CaseName, #TestName); \
|
||||
} \
|
||||
template <typename gtest_TypeParam_> \
|
||||
void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
|
||||
|
||||
#define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
|
||||
namespace GTEST_CASE_NAMESPACE_(CaseName) { \
|
||||
typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
|
||||
} \
|
||||
static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
|
||||
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
|
||||
__FILE__, __LINE__, #__VA_ARGS__)
|
||||
|
||||
#define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
|
||||
bool gtest_##Prefix##_##CaseName = \
|
||||
::testing::internal::TypeParameterizedTestCase<CaseName, \
|
||||
GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
|
||||
::testing::internal::TypeList<Types>::type>::Register(\
|
||||
#Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
|
||||
@@ -53,6 +53,7 @@
|
||||
|
||||
// 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
|
||||
@@ -61,15 +62,26 @@
|
||||
// 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).
|
||||
|
||||
#include <limits>
|
||||
#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-param-test.h>
|
||||
#include <gtest/gtest_prod.h>
|
||||
#include <gtest/gtest-test-part.h>
|
||||
#include <gtest/gtest-typed-test.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
|
||||
@@ -93,58 +105,24 @@
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Declares the flags.
|
||||
|
||||
// This flag temporary enables the disabled tests.
|
||||
GTEST_DECLARE_bool_(also_run_disabled_tests);
|
||||
|
||||
// This flag brings the debugger on an assertion failure.
|
||||
GTEST_DECLARE_bool_(break_on_failure);
|
||||
|
||||
// This flag controls whether Google Test catches all test-thrown exceptions
|
||||
// and logs them as failures.
|
||||
GTEST_DECLARE_bool_(catch_exceptions);
|
||||
|
||||
// This flag enables using colors in terminal output. Available values are
|
||||
// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
|
||||
// to let Google Test decide.
|
||||
GTEST_DECLARE_string_(color);
|
||||
|
||||
// This flag sets up the filter to select by name using a glob pattern
|
||||
// the tests to run. If the filter is not given all tests are executed.
|
||||
GTEST_DECLARE_string_(filter);
|
||||
|
||||
// This flag causes the Google Test to list tests. None of the tests listed
|
||||
// are actually run if the flag is provided.
|
||||
GTEST_DECLARE_bool_(list_tests);
|
||||
|
||||
// This flag controls whether Google Test emits a detailed XML report to a file
|
||||
// in addition to its normal textual output.
|
||||
GTEST_DECLARE_string_(output);
|
||||
|
||||
// This flags control whether Google Test prints the elapsed time for each
|
||||
// test.
|
||||
GTEST_DECLARE_bool_(print_time);
|
||||
|
||||
// This flag sets how many times the tests are repeated. The default value
|
||||
// is 1. If the value is -1 the tests are repeating forever.
|
||||
GTEST_DECLARE_int32_(repeat);
|
||||
|
||||
// This flag controls whether Google Test includes Google Test internal
|
||||
// stack frames in failure stack traces.
|
||||
GTEST_DECLARE_bool_(show_internal_stack_frames);
|
||||
// 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);
|
||||
GTEST_DECLARE_int32(stack_trace_depth);
|
||||
|
||||
// When this flag is specified, a failed assertion will throw an
|
||||
// exception if exceptions are enabled, or exit the program with a
|
||||
// non-zero code otherwise.
|
||||
GTEST_DECLARE_bool_(throw_on_failure);
|
||||
// This flag controls whether Google Test includes Google Test internal
|
||||
// stack frames in failure stack traces.
|
||||
GTEST_DECLARE_bool(show_internal_stack_frames);
|
||||
|
||||
// The upper limit for valid stack trace depths.
|
||||
const int kMaxStackTraceDepth = 100;
|
||||
// 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 {
|
||||
|
||||
@@ -254,28 +232,12 @@ class Test {
|
||||
|
||||
// Defines types for pointers to functions that set up and tear down
|
||||
// a test case.
|
||||
typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
|
||||
typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
|
||||
typedef void (*SetUpTestCaseFunc)();
|
||||
typedef void (*TearDownTestCaseFunc)();
|
||||
|
||||
// The d'tor is virtual as we intend to inherit from Test.
|
||||
virtual ~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() {}
|
||||
|
||||
// Returns true iff the current test has a fatal failure.
|
||||
static bool HasFatalFailure();
|
||||
|
||||
@@ -298,6 +260,22 @@ class Test {
|
||||
// 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();
|
||||
|
||||
@@ -343,10 +321,15 @@ class Test {
|
||||
virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
|
||||
|
||||
// We disallow copying Tests.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
|
||||
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
|
||||
@@ -364,18 +347,34 @@ class TestInfo {
|
||||
// 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 the test case comment.
|
||||
const char* test_case_comment() const;
|
||||
|
||||
// Returns the test comment.
|
||||
const char* comment() const;
|
||||
|
||||
// Returns true if this test should run.
|
||||
//
|
||||
// Google Test allows the user to filter the tests by their full names.
|
||||
@@ -395,20 +394,13 @@ class TestInfo {
|
||||
// Returns the result of the test.
|
||||
const internal::TestResult* result() const;
|
||||
private:
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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;
|
||||
friend TestInfo* internal::MakeAndRegisterTestInfo(
|
||||
const char* test_case_name, const char* name,
|
||||
const char* test_case_comment, const char* comment,
|
||||
internal::TypeId fixture_class_id,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc,
|
||||
internal::TestFactoryBase* factory);
|
||||
|
||||
// Increments the number of death tests encountered in this test so
|
||||
// far.
|
||||
@@ -418,17 +410,14 @@ class TestInfo {
|
||||
internal::TestInfoImpl* impl() { return impl_; }
|
||||
const internal::TestInfoImpl* impl() const { return impl_; }
|
||||
|
||||
// Constructs a TestInfo object. The newly constructed instance assumes
|
||||
// ownership of the factory object.
|
||||
// Constructs a TestInfo object.
|
||||
TestInfo(const char* test_case_name, const char* name,
|
||||
const char* test_case_comment, const char* comment,
|
||||
internal::TypeId fixture_class_id,
|
||||
internal::TestFactoryBase* factory);
|
||||
internal::TypeId fixture_class_id, TestMaker maker);
|
||||
|
||||
// An opaque implementation object.
|
||||
internal::TestInfoImpl* impl_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestInfo);
|
||||
};
|
||||
|
||||
// An Environment object is capable of setting up and tearing down an
|
||||
@@ -512,11 +501,7 @@ class UnitTest {
|
||||
// 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 working directory when the first TEST() or TEST_F()
|
||||
// was executed. The UnitTest object owns the string.
|
||||
const char* original_working_dir() const;
|
||||
int Run() GTEST_MUST_USE_RESULT;
|
||||
|
||||
// Returns the TestCase object for the test that's currently running,
|
||||
// or NULL if no test is running.
|
||||
@@ -526,12 +511,6 @@ class UnitTest {
|
||||
// or NULL if no test is running.
|
||||
const TestInfo* current_test_info() const;
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
// Returns the ParameterizedTestCaseRegistry object used to keep track of
|
||||
// value-parameterized tests and instantiate and register them.
|
||||
internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
// Accessors for the implementation object.
|
||||
internal::UnitTestImpl* impl() { return impl_; }
|
||||
const internal::UnitTestImpl* impl() const { return impl_; }
|
||||
@@ -564,7 +543,7 @@ class UnitTest {
|
||||
internal::UnitTestImpl* impl_;
|
||||
|
||||
// We disallow copying UnitTest.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTest);
|
||||
};
|
||||
|
||||
// A convenient wrapper for adding an environment for the test
|
||||
@@ -596,13 +575,13 @@ inline Environment* AddGlobalTestEnvironment(Environment* env) {
|
||||
//
|
||||
// No value is returned. Instead, the Google Test flag variables are
|
||||
// updated.
|
||||
//
|
||||
// Calling the function for the second time has no user-visible effect.
|
||||
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 {
|
||||
|
||||
@@ -656,20 +635,10 @@ AssertionResult CmpHelperEQ(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& expected,
|
||||
const T2& actual) {
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push) // Saves the current warning state.
|
||||
#pragma warning(disable:4389) // Temporarily disables warning on
|
||||
// signed/unsigned mismatch.
|
||||
#endif
|
||||
|
||||
if (expected == actual) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop) // Restores the warning state.
|
||||
#endif
|
||||
|
||||
return EqFailure(expected_expression,
|
||||
actual_expression,
|
||||
FormatForComparisonFailureMessage(expected, actual),
|
||||
@@ -740,7 +709,7 @@ class EqHelper<true> {
|
||||
template <typename T1, typename T2>
|
||||
static AssertionResult Compare(const char* expected_expression,
|
||||
const char* actual_expression,
|
||||
const T1& /* expected */,
|
||||
const T1& expected,
|
||||
T2* actual) {
|
||||
// We already know that 'expected' is a null pointer.
|
||||
return CmpHelperEQ(expected_expression, actual_expression,
|
||||
@@ -758,7 +727,7 @@ class EqHelper<true> {
|
||||
// with gcc 4.
|
||||
//
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
|
||||
#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) {\
|
||||
@@ -778,17 +747,17 @@ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||
|
||||
// Implements the helper function for {ASSERT|EXPECT}_NE
|
||||
GTEST_IMPL_CMP_HELPER_(NE, !=)
|
||||
GTEST_IMPL_CMP_HELPER(NE, !=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LE
|
||||
GTEST_IMPL_CMP_HELPER_(LE, <=)
|
||||
GTEST_IMPL_CMP_HELPER(LE, <=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_LT
|
||||
GTEST_IMPL_CMP_HELPER_(LT, < )
|
||||
GTEST_IMPL_CMP_HELPER(LT, < )
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GE
|
||||
GTEST_IMPL_CMP_HELPER_(GE, >=)
|
||||
GTEST_IMPL_CMP_HELPER(GE, >=)
|
||||
// Implements the helper function for {ASSERT|EXPECT}_GT
|
||||
GTEST_IMPL_CMP_HELPER_(GT, > )
|
||||
GTEST_IMPL_CMP_HELPER(GT, > )
|
||||
|
||||
#undef GTEST_IMPL_CMP_HELPER_
|
||||
#undef GTEST_IMPL_CMP_HELPER
|
||||
|
||||
// The helper function for {ASSERT|EXPECT}_STREQ.
|
||||
//
|
||||
@@ -932,7 +901,7 @@ class AssertHelper {
|
||||
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.
|
||||
// streaming; see the GTEST_MESSAGE macro below.
|
||||
void operator=(const Message& message) const;
|
||||
private:
|
||||
TestPartResultType const type_;
|
||||
@@ -940,70 +909,11 @@ class AssertHelper {
|
||||
int const line_;
|
||||
String const message_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(AssertHelper);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
// The abstract base class that all value-parameterized tests inherit from.
|
||||
//
|
||||
// This class adds support for accessing the test parameter value via
|
||||
// the GetParam() method.
|
||||
//
|
||||
// Use it with one of the parameter generator defining functions, like Range(),
|
||||
// Values(), ValuesIn(), Bool(), and Combine().
|
||||
//
|
||||
// class FooTest : public ::testing::TestWithParam<int> {
|
||||
// protected:
|
||||
// FooTest() {
|
||||
// // Can use GetParam() here.
|
||||
// }
|
||||
// virtual ~FooTest() {
|
||||
// // Can use GetParam() here.
|
||||
// }
|
||||
// virtual void SetUp() {
|
||||
// // Can use GetParam() here.
|
||||
// }
|
||||
// virtual void TearDown {
|
||||
// // Can use GetParam() here.
|
||||
// }
|
||||
// };
|
||||
// TEST_P(FooTest, DoesBar) {
|
||||
// // Can use GetParam() method here.
|
||||
// Foo foo;
|
||||
// ASSERT_TRUE(foo.DoesBar(GetParam()));
|
||||
// }
|
||||
// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
|
||||
|
||||
template <typename T>
|
||||
class TestWithParam : public Test {
|
||||
public:
|
||||
typedef T ParamType;
|
||||
|
||||
// The current parameter value. Is also available in the test fixture's
|
||||
// constructor.
|
||||
const ParamType& GetParam() const { return *parameter_; }
|
||||
|
||||
private:
|
||||
// Sets parameter value. The caller is responsible for making sure the value
|
||||
// remains alive and unchanged throughout the current test.
|
||||
static void SetParam(const ParamType* parameter) {
|
||||
parameter_ = parameter;
|
||||
}
|
||||
|
||||
// Static value used for accessing parameter during a test lifetime.
|
||||
static const ParamType* parameter_;
|
||||
|
||||
// TestClass must be a subclass of TestWithParam<T>.
|
||||
template <class TestClass> friend class internal::ParameterizedTestFactory;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
const T* TestWithParam<T>::parameter_ = NULL;
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
// Macros for indicating success/failure in test code.
|
||||
|
||||
// ADD_FAILURE unconditionally adds a failure to the current test.
|
||||
@@ -1030,53 +940,42 @@ const T* TestWithParam<T>::parameter_ = NULL;
|
||||
// << "There are still pending requests " << "on port " << port;
|
||||
|
||||
// Generates a nonfatal failure with a generic message.
|
||||
#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
|
||||
#define ADD_FAILURE() GTEST_NONFATAL_FAILURE("Failed")
|
||||
|
||||
// Generates a fatal failure with a generic message.
|
||||
#define FAIL() GTEST_FATAL_FAILURE_("Failed")
|
||||
#define FAIL() GTEST_FATAL_FAILURE("Failed")
|
||||
|
||||
// Generates a success with a generic message.
|
||||
#define SUCCEED() GTEST_SUCCESS_("Succeeded")
|
||||
|
||||
// Macros for testing exceptions.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
|
||||
// Tests that the statement throws the expected exception.
|
||||
// * {ASSERT|EXPECT}_NO_THROW(statement):
|
||||
// Tests that the statement doesn't throw any exception.
|
||||
// * {ASSERT|EXPECT}_ANY_THROW(statement):
|
||||
// Tests that the statement throws an exception.
|
||||
|
||||
#define EXPECT_THROW(statement, expected_exception) \
|
||||
GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
|
||||
#define EXPECT_NO_THROW(statement) \
|
||||
GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
|
||||
#define EXPECT_ANY_THROW(statement) \
|
||||
GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
|
||||
#define ASSERT_THROW(statement, expected_exception) \
|
||||
GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
|
||||
#define ASSERT_NO_THROW(statement) \
|
||||
GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
|
||||
#define ASSERT_ANY_THROW(statement) \
|
||||
GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
|
||||
#define SUCCEED() GTEST_SUCCESS("Succeeded")
|
||||
|
||||
// Boolean assertions.
|
||||
#define EXPECT_TRUE(condition) \
|
||||
GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
|
||||
GTEST_NONFATAL_FAILURE_)
|
||||
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
|
||||
GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_FALSE(condition) \
|
||||
GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
|
||||
GTEST_NONFATAL_FAILURE_)
|
||||
GTEST_TEST_BOOLEAN(!(condition), #condition, true, false, \
|
||||
GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_TRUE(condition) \
|
||||
GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
|
||||
GTEST_FATAL_FAILURE_)
|
||||
GTEST_TEST_BOOLEAN(condition, #condition, false, true, \
|
||||
GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_FALSE(condition) \
|
||||
GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
|
||||
GTEST_FATAL_FAILURE_)
|
||||
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.
|
||||
//
|
||||
@@ -1126,7 +1025,7 @@ const T* TestWithParam<T>::parameter_ = NULL;
|
||||
|
||||
#define EXPECT_EQ(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal:: \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL(expected)>::Compare, \
|
||||
expected, actual)
|
||||
#define EXPECT_NE(expected, actual) \
|
||||
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
|
||||
@@ -1141,7 +1040,7 @@ const T* TestWithParam<T>::parameter_ = NULL;
|
||||
|
||||
#define ASSERT_EQ(expected, actual) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal:: \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
|
||||
EqHelper<GTEST_IS_NULL_LITERAL(expected)>::Compare, \
|
||||
expected, actual)
|
||||
#define ASSERT_NE(val1, val2) \
|
||||
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
|
||||
@@ -1239,17 +1138,16 @@ AssertionResult DoubleLE(const char* expr1, const char* expr2,
|
||||
double val1, double val2);
|
||||
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#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.
|
||||
// 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))
|
||||
|
||||
@@ -1264,20 +1162,6 @@ AssertionResult DoubleLE(const char* expr1, const char* expr2,
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Macros that execute statement and check that it doesn't generate new fatal
|
||||
// failures in the current thread.
|
||||
//
|
||||
// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
|
||||
//
|
||||
// Examples:
|
||||
//
|
||||
// EXPECT_NO_FATAL_FAILURE(Process());
|
||||
// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
|
||||
//
|
||||
#define ASSERT_NO_FATAL_FAILURE(statement) \
|
||||
GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
|
||||
#define EXPECT_NO_FATAL_FAILURE(statement) \
|
||||
GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
|
||||
|
||||
// Causes a trace (including the source file path, the current line
|
||||
// number, and the given message) to be included in every test failure
|
||||
@@ -1291,55 +1175,9 @@ AssertionResult DoubleLE(const char* expr1, const char* expr2,
|
||||
// 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__)(\
|
||||
::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN(gtest_trace_, __LINE__)(\
|
||||
__FILE__, __LINE__, ::testing::Message() << (message))
|
||||
|
||||
namespace internal {
|
||||
|
||||
// This template is declared, but intentionally undefined.
|
||||
template <typename T1, typename T2>
|
||||
struct StaticAssertTypeEqHelper;
|
||||
|
||||
template <typename T>
|
||||
struct StaticAssertTypeEqHelper<T, T> {};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Compile-time assertion for type equality.
|
||||
// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
|
||||
// the same type. The value it returns is not interesting.
|
||||
//
|
||||
// Instead of making StaticAssertTypeEq a class template, we make it a
|
||||
// function template that invokes a helper class template. This
|
||||
// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
|
||||
// defining objects of that type.
|
||||
//
|
||||
// CAVEAT:
|
||||
//
|
||||
// When used inside a method of a class template,
|
||||
// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
|
||||
// instantiated. For example, given:
|
||||
//
|
||||
// template <typename T> class Foo {
|
||||
// public:
|
||||
// void Bar() { testing::StaticAssertTypeEq<int, T>(); }
|
||||
// };
|
||||
//
|
||||
// the code:
|
||||
//
|
||||
// void Test1() { Foo<bool> foo; }
|
||||
//
|
||||
// will NOT generate a compiler error, as Foo<bool>::Bar() is never
|
||||
// actually instantiated. Instead, you need:
|
||||
//
|
||||
// void Test2() { Foo<bool> foo; foo.Bar(); }
|
||||
//
|
||||
// to cause a compiler error.
|
||||
template <typename T1, typename T2>
|
||||
bool StaticAssertTypeEq() {
|
||||
internal::StaticAssertTypeEqHelper<T1, T2>();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Defines a test.
|
||||
//
|
||||
@@ -1357,18 +1195,8 @@ bool StaticAssertTypeEq() {
|
||||
// EXPECT_TRUE(foo.StatusIsOK());
|
||||
// }
|
||||
|
||||
// Note that we call GetTestTypeId() instead of GetTypeId<
|
||||
// ::testing::Test>() here to get the type ID of testing::Test. This
|
||||
// is to work around a suspected linker bug when using Google Test as
|
||||
// a framework on Mac OS X. The bug causes GetTypeId<
|
||||
// ::testing::Test>() to return different values depending on whether
|
||||
// the call is from the Google Test framework itself or from user test
|
||||
// code. GetTestTypeId() is guaranteed to always return the same
|
||||
// value, as it always calls GetTypeId<>() from the Google Test
|
||||
// framework.
|
||||
#define TEST(test_case_name, test_name)\
|
||||
GTEST_TEST_(test_case_name, test_name, \
|
||||
::testing::Test, ::testing::internal::GetTestTypeId())
|
||||
GTEST_TEST(test_case_name, test_name, ::testing::Test)
|
||||
|
||||
|
||||
// Defines a test that uses a test fixture.
|
||||
@@ -1398,8 +1226,7 @@ bool StaticAssertTypeEq() {
|
||||
// }
|
||||
|
||||
#define TEST_F(test_fixture, test_name)\
|
||||
GTEST_TEST_(test_fixture, test_name, test_fixture, \
|
||||
::testing::internal::GetTypeId<test_fixture>())
|
||||
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.
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command
|
||||
// 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.
|
||||
@@ -69,11 +69,11 @@
|
||||
// Please email googletestframework@googlegroups.com if you need
|
||||
// support for higher arities.
|
||||
|
||||
// GTEST_ASSERT_ is the basic statement to which all of the assertions
|
||||
// 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_ \
|
||||
#define GTEST_ASSERT(expression, on_failure) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \
|
||||
if (const ::testing::AssertionResult gtest_ar = (expression)) \
|
||||
; \
|
||||
else \
|
||||
@@ -99,27 +99,27 @@ AssertionResult AssertPred1Helper(const char* pred_text,
|
||||
|
||||
// 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)
|
||||
#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)
|
||||
#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_)
|
||||
GTEST_PRED_FORMAT1(pred_format, v1, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED1(pred, v1) \
|
||||
GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
|
||||
GTEST_PRED1(pred, v1, GTEST_NONFATAL_FAILURE)
|
||||
#define ASSERT_PRED_FORMAT1(pred_format, v1) \
|
||||
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
|
||||
GTEST_PRED_FORMAT1(pred_format, v1, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED1(pred, v1) \
|
||||
GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
|
||||
GTEST_PRED1(pred, v1, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
@@ -147,29 +147,29 @@ AssertionResult AssertPred2Helper(const char* pred_text,
|
||||
|
||||
// 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)
|
||||
#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)
|
||||
#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_)
|
||||
GTEST_PRED_FORMAT2(pred_format, v1, v2, GTEST_NONFATAL_FAILURE)
|
||||
#define EXPECT_PRED2(pred, v1, v2) \
|
||||
GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
|
||||
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_)
|
||||
GTEST_PRED_FORMAT2(pred_format, v1, v2, GTEST_FATAL_FAILURE)
|
||||
#define ASSERT_PRED2(pred, v1, v2) \
|
||||
GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
|
||||
GTEST_PRED2(pred, v1, v2, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
@@ -202,31 +202,31 @@ AssertionResult AssertPred3Helper(const char* pred_text,
|
||||
|
||||
// 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)
|
||||
#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)
|
||||
#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_)
|
||||
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_)
|
||||
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_)
|
||||
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_)
|
||||
GTEST_PRED3(pred, v1, v2, v3, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
@@ -264,33 +264,33 @@ AssertionResult AssertPred4Helper(const char* pred_text,
|
||||
|
||||
// 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)
|
||||
#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)
|
||||
#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_)
|
||||
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_)
|
||||
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_)
|
||||
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_)
|
||||
GTEST_PRED4(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
@@ -333,35 +333,35 @@ AssertionResult AssertPred5Helper(const char* pred_text,
|
||||
|
||||
// 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)
|
||||
#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)
|
||||
#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_)
|
||||
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_)
|
||||
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_)
|
||||
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_)
|
||||
GTEST_PRED5(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -39,24 +39,19 @@
|
||||
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST && GTEST_OS_WINDOWS
|
||||
#include <io.h>
|
||||
#endif // GTEST_HAS_DEATH_TEST && GTEST_OS_WINDOWS
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
GTEST_DECLARE_string_(internal_run_death_test);
|
||||
GTEST_DECLARE_string(internal_run_death_test);
|
||||
|
||||
// Names of the flags (needed for parsing Google Test flags).
|
||||
const char kDeathTestStyleFlag[] = "death_test_style";
|
||||
const char kDeathTestUseFork[] = "death_test_use_fork";
|
||||
const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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
|
||||
// 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.
|
||||
@@ -90,8 +85,8 @@ class DeathTest {
|
||||
~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
|
||||
private:
|
||||
DeathTest* const test_;
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
|
||||
} GTEST_ATTRIBUTE_UNUSED_;
|
||||
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
|
||||
@@ -125,13 +120,8 @@ class DeathTest {
|
||||
// the last death test.
|
||||
static const char* LastMessage();
|
||||
|
||||
static void set_last_death_test_message(const String& message);
|
||||
|
||||
private:
|
||||
// A string containing a description of the outcome of the last death test.
|
||||
static String last_death_test_message_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(DeathTest);
|
||||
};
|
||||
|
||||
// Factory interface for death tests. May be mocked out for testing.
|
||||
@@ -155,14 +145,14 @@ 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_ \
|
||||
#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__); \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_, __LINE__); \
|
||||
} \
|
||||
if (gtest_dt != NULL) { \
|
||||
::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
|
||||
@@ -170,60 +160,32 @@ bool ExitedUnsuccessfully(int exit_status);
|
||||
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__); \
|
||||
goto GTEST_CONCAT_TOKEN(gtest_label_, __LINE__); \
|
||||
} \
|
||||
break; \
|
||||
case ::testing::internal::DeathTest::EXECUTE_TEST: { \
|
||||
::testing::internal::DeathTest::ReturnSentinel \
|
||||
gtest_sentinel(gtest_dt); \
|
||||
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||
{ statement; } \
|
||||
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
|
||||
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 class representing the parsed contents of the
|
||||
// A struct representing the parsed contents of the
|
||||
// --gtest_internal_run_death_test flag, as it existed when
|
||||
// RUN_ALL_TESTS was called.
|
||||
class InternalRunDeathTestFlag {
|
||||
public:
|
||||
InternalRunDeathTestFlag(const String& file,
|
||||
int line,
|
||||
int index,
|
||||
int status_fd)
|
||||
: file_(file), line_(line), index_(index), status_fd_(status_fd) {}
|
||||
|
||||
~InternalRunDeathTestFlag() {
|
||||
if (status_fd_ >= 0)
|
||||
// Suppress MSVC complaints about POSIX functions.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4996)
|
||||
#endif // _MSC_VER
|
||||
close(status_fd_);
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif // _MSC_VER
|
||||
}
|
||||
|
||||
String file() const { return file_; }
|
||||
int line() const { return line_; }
|
||||
int index() const { return index_; }
|
||||
int status_fd() const { return status_fd_; }
|
||||
|
||||
private:
|
||||
String file_;
|
||||
int line_;
|
||||
int index_;
|
||||
int status_fd_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
|
||||
struct InternalRunDeathTestFlag {
|
||||
String file;
|
||||
int line;
|
||||
int index;
|
||||
int status_fd;
|
||||
};
|
||||
|
||||
// Returns a newly created InternalRunDeathTestFlag object with fields
|
||||
|
||||
@@ -34,13 +34,25 @@
|
||||
// This header file declares classes and functions used internally by
|
||||
// Google Test. They are subject to change without notice.
|
||||
//
|
||||
// This file is #included in <gtest/internal/gtest-internal.h>.
|
||||
// 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 {
|
||||
@@ -60,19 +72,8 @@ class FilePath {
|
||||
public:
|
||||
FilePath() : pathname_("") { }
|
||||
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
|
||||
|
||||
explicit FilePath(const char* pathname) : pathname_(pathname) {
|
||||
Normalize();
|
||||
}
|
||||
|
||||
explicit FilePath(const String& pathname) : pathname_(pathname) {
|
||||
Normalize();
|
||||
}
|
||||
|
||||
FilePath& operator=(const FilePath& rhs) {
|
||||
Set(rhs);
|
||||
return *this;
|
||||
}
|
||||
explicit FilePath(const char* pathname) : pathname_(pathname) { }
|
||||
explicit FilePath(const String& pathname) : pathname_(pathname) { }
|
||||
|
||||
void Set(const FilePath& rhs) {
|
||||
pathname_ = rhs.pathname_;
|
||||
@@ -81,9 +82,6 @@ class FilePath {
|
||||
String ToString() const { return pathname_; }
|
||||
const char* c_str() const { return pathname_.c_str(); }
|
||||
|
||||
// Returns the current working directory, or "" if unsuccessful.
|
||||
static FilePath GetCurrentDir();
|
||||
|
||||
// Given directory = "dir", base_name = "test", number = 0,
|
||||
// extension = "xml", returns "dir/test.xml". If number is greater
|
||||
// than zero (e.g., 12), returns "dir/test_12.xml".
|
||||
@@ -93,12 +91,6 @@ class FilePath {
|
||||
int number,
|
||||
const char* extension);
|
||||
|
||||
// Given directory = "dir", relative_path = "test.xml",
|
||||
// returns "dir/test.xml".
|
||||
// On Windows, uses \ as the separator rather than /.
|
||||
static FilePath ConcatPaths(const FilePath& directory,
|
||||
const FilePath& relative_path);
|
||||
|
||||
// Returns a pathname for a file that does not currently exist. The pathname
|
||||
// will be directory/base_name.extension or
|
||||
// directory/base_name_<number>.extension if directory/base_name.extension
|
||||
@@ -111,9 +103,6 @@ class FilePath {
|
||||
const FilePath& base_name,
|
||||
const char* extension);
|
||||
|
||||
// Returns true iff the path is NULL or "".
|
||||
bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
|
||||
|
||||
// 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 /.
|
||||
@@ -166,33 +155,11 @@ class FilePath {
|
||||
// This does NOT check that a directory (or file) actually exists.
|
||||
bool IsDirectory() const;
|
||||
|
||||
// Returns true if pathname describes a root directory. (Windows has one
|
||||
// root directory per disk drive.)
|
||||
bool IsRootDirectory() const;
|
||||
|
||||
// Returns true if pathname describes an absolute path.
|
||||
bool IsAbsolutePath() const;
|
||||
|
||||
private:
|
||||
// Replaces multiple consecutive separators with a single separator.
|
||||
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
|
||||
// redundancies that might be in a pathname involving "." or "..".
|
||||
//
|
||||
// A pathname with multiple consecutive separators may occur either through
|
||||
// user error or as a result of some scripts or APIs that generate a pathname
|
||||
// with a trailing separator. On other platforms the same API or script
|
||||
// may NOT generate a pathname with a trailing "/". Then elsewhere that
|
||||
// pathname may have another "/" and pathname components added to it,
|
||||
// without checking for the separator already being there.
|
||||
// The script language and operating system may allow paths like "foo//bar"
|
||||
// but some of the functions in FilePath will not handle that correctly. In
|
||||
// particular, RemoveTrailingPathSeparator() only removes one separator, and
|
||||
// it is called in CreateDirectoriesRecursively() assuming that it will change
|
||||
// a pathname from directory syntax (trailing separator) to filename syntax.
|
||||
|
||||
void Normalize();
|
||||
|
||||
String pathname_;
|
||||
|
||||
// Don't implement operator= because it is banned by the style guide.
|
||||
FilePath& operator=(const FilePath& rhs);
|
||||
}; // class FilePath
|
||||
|
||||
} // namespace internal
|
||||
|
||||
@@ -37,24 +37,43 @@
|
||||
#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)
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <iomanip>
|
||||
#include <limits>
|
||||
#include <set>
|
||||
#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>
|
||||
#include <gtest/internal/gtest-type-util.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
|
||||
@@ -64,8 +83,8 @@
|
||||
// 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
|
||||
#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
|
||||
@@ -102,7 +121,6 @@ namespace testing {
|
||||
// Forward declaration of classes.
|
||||
|
||||
class Message; // Represents a failure message.
|
||||
class Test; // Represents a test.
|
||||
class TestCase; // A collection of related tests.
|
||||
class TestPartResult; // Result of a test part.
|
||||
class TestInfo; // Information about a test.
|
||||
@@ -121,13 +139,6 @@ 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.
|
||||
|
||||
// How many times InitGoogleTest() has been called.
|
||||
extern int g_init_gtest_count;
|
||||
|
||||
// The text used in failure messages to indicate the start of the
|
||||
// stack trace.
|
||||
extern const char kStackTraceMarker[];
|
||||
|
||||
// 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.
|
||||
@@ -153,17 +164,16 @@ 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 GTEST_ELLIPSIS_NEEDS_COPY_
|
||||
// Passing non-POD classes through ellipsis (...) crashes the ARM
|
||||
// compiler. The Nokia Symbian and the IBM XL C/C++ compiler try 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
|
||||
#define GTEST_IS_NULL_LITERAL_(x) \
|
||||
#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 // GTEST_ELLIPSIS_NEEDS_COPY_
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Appends the user-supplied message to the Google-Test-generated message.
|
||||
String AppendUserMessage(const String& gtest_msg,
|
||||
@@ -183,10 +193,10 @@ class 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.
|
||||
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,
|
||||
@@ -200,13 +210,12 @@ String StreamableToString(const T& streamable);
|
||||
|
||||
// Formats a value to be used in a failure message.
|
||||
|
||||
#ifdef GTEST_NEEDS_IS_POINTER_
|
||||
#ifdef __SYMBIAN32__
|
||||
|
||||
// These are needed as the Nokia Symbian and IBM XL C/C++ compilers
|
||||
// cannot decide between const T& and const T* in a function template.
|
||||
// These compilers _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.
|
||||
// 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.
|
||||
@@ -230,10 +239,6 @@ inline String FormatForFailureMessage(const T& value) {
|
||||
|
||||
#else
|
||||
|
||||
// These are needed as the above solution using is_pointer has the
|
||||
// limitation that T cannot be a type without external linkage, when
|
||||
// compiled using MSVC.
|
||||
|
||||
template <typename T>
|
||||
inline String FormatForFailureMessage(const T& value) {
|
||||
return StreamableToString(value);
|
||||
@@ -246,7 +251,7 @@ inline String FormatForFailureMessage(T* pointer) {
|
||||
return StreamableToString(static_cast<const void*>(pointer));
|
||||
}
|
||||
|
||||
#endif // GTEST_NEEDS_IS_POINTER_
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// These overloaded versions handle narrow and wide characters.
|
||||
String FormatForFailureMessage(char ch);
|
||||
@@ -257,31 +262,31 @@ String FormatForFailureMessage(wchar_t wchar);
|
||||
// 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)\
|
||||
#define GTEST_FORMAT_IMPL(operand2_type, operand1_printer)\
|
||||
inline String FormatForComparisonFailureMessage(\
|
||||
operand2_type::value_type* str, const operand2_type& /*operand2*/) {\
|
||||
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*/) {\
|
||||
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)
|
||||
GTEST_FORMAT_IMPL(::std::string, String::ShowCStringQuoted)
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
#if GTEST_HAS_STD_WSTRING
|
||||
GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)
|
||||
GTEST_FORMAT_IMPL(::std::wstring, String::ShowWideCStringQuoted)
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)
|
||||
GTEST_FORMAT_IMPL(::string, String::ShowCStringQuoted)
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
#if GTEST_HAS_GLOBAL_WSTRING
|
||||
GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)
|
||||
GTEST_FORMAT_IMPL(::wstring, String::ShowWideCStringQuoted)
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
#undef GTEST_FORMAT_IMPL_
|
||||
#undef GTEST_FORMAT_IMPL
|
||||
|
||||
// Constructs and returns the message for an equality assertion
|
||||
// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
|
||||
@@ -488,65 +493,21 @@ typedef FloatingPoint<double> Double;
|
||||
// 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 const void* TypeId;
|
||||
|
||||
template <typename T>
|
||||
class TypeIdHelper {
|
||||
public:
|
||||
// dummy_ must not have a const type. Otherwise an overly eager
|
||||
// compiler (e.g. MSVC 7.1 & 8.0) may try to merge
|
||||
// TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
|
||||
static bool dummy_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
bool TypeIdHelper<T>::dummy_ = false;
|
||||
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>
|
||||
TypeId GetTypeId() {
|
||||
// The compiler is required to allocate a different
|
||||
// TypeIdHelper<T>::dummy_ variable for each T used to instantiate
|
||||
// the template. Therefore, the address of dummy_ is guaranteed to
|
||||
// be unique.
|
||||
return &(TypeIdHelper<T>::dummy_);
|
||||
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;
|
||||
}
|
||||
|
||||
// Returns the type ID of ::testing::Test. Always call this instead
|
||||
// of GetTypeId< ::testing::Test>() to get the type ID of
|
||||
// ::testing::Test, as the latter may give the wrong result due to a
|
||||
// suspected linker bug when compiling Google Test as a Mac OS X
|
||||
// framework.
|
||||
TypeId GetTestTypeId();
|
||||
|
||||
// Defines the abstract factory interface that creates instances
|
||||
// of a Test object.
|
||||
class TestFactoryBase {
|
||||
public:
|
||||
virtual ~TestFactoryBase() {}
|
||||
|
||||
// Creates a test instance to run. The instance is both created and destroyed
|
||||
// within TestInfoImpl::Run()
|
||||
virtual Test* CreateTest() = 0;
|
||||
|
||||
protected:
|
||||
TestFactoryBase() {}
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
|
||||
};
|
||||
|
||||
// This class provides implementation of TeastFactoryBase interface.
|
||||
// It is used in TEST and TEST_F macros.
|
||||
template <class TestClass>
|
||||
class TestFactoryImpl : public TestFactoryBase {
|
||||
public:
|
||||
virtual Test* CreateTest() { return new TestClass; }
|
||||
};
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Predicate-formatters for implementing the HRESULT checking macros
|
||||
// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
|
||||
@@ -557,330 +518,52 @@ AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Formats a source file path and a line number as they would appear
|
||||
// in a compiler error message.
|
||||
inline String FormatFileLocation(const char* file, int line) {
|
||||
const char* const file_name = file == NULL ? "unknown file" : file;
|
||||
if (line < 0) {
|
||||
return String::Format("%s:", file_name);
|
||||
}
|
||||
#ifdef _MSC_VER
|
||||
return String::Format("%s(%d):", file_name, line);
|
||||
#else
|
||||
return String::Format("%s:%d:", file_name, line);
|
||||
#endif // _MSC_VER
|
||||
}
|
||||
|
||||
// Types of SetUpTestCase() and TearDownTestCase() functions.
|
||||
typedef void (*SetUpTestCaseFunc)();
|
||||
typedef void (*TearDownTestCaseFunc)();
|
||||
|
||||
// Creates a new TestInfo object and registers it with Google Test;
|
||||
// returns the created object.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// test_case_name: name of the test case
|
||||
// name: name of the test
|
||||
// test_case_comment: a comment on the test case that will be included in
|
||||
// the test output
|
||||
// comment: a comment on the test that will be included in the
|
||||
// test output
|
||||
// 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
|
||||
// factory: pointer to the factory that creates a test object.
|
||||
// The newly created TestInfo instance will assume
|
||||
// ownership of the factory object.
|
||||
TestInfo* MakeAndRegisterTestInfo(
|
||||
const char* test_case_name, const char* name,
|
||||
const char* test_case_comment, const char* comment,
|
||||
TypeId fixture_class_id,
|
||||
SetUpTestCaseFunc set_up_tc,
|
||||
TearDownTestCaseFunc tear_down_tc,
|
||||
TestFactoryBase* factory);
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
// State of the definition of a type-parameterized test case.
|
||||
class TypedTestCasePState {
|
||||
public:
|
||||
TypedTestCasePState() : registered_(false) {}
|
||||
|
||||
// Adds the given test name to defined_test_names_ and return true
|
||||
// if the test case hasn't been registered; otherwise aborts the
|
||||
// program.
|
||||
bool AddTestName(const char* file, int line, const char* case_name,
|
||||
const char* test_name) {
|
||||
if (registered_) {
|
||||
fprintf(stderr, "%s Test %s must be defined before "
|
||||
"REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
|
||||
FormatFileLocation(file, line).c_str(), test_name, case_name);
|
||||
fflush(stderr);
|
||||
abort();
|
||||
}
|
||||
defined_test_names_.insert(test_name);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Verifies that registered_tests match the test names in
|
||||
// defined_test_names_; returns registered_tests if successful, or
|
||||
// aborts the program otherwise.
|
||||
const char* VerifyRegisteredTestNames(
|
||||
const char* file, int line, const char* registered_tests);
|
||||
|
||||
private:
|
||||
bool registered_;
|
||||
::std::set<const char*> defined_test_names_;
|
||||
};
|
||||
|
||||
// Skips to the first non-space char after the first comma in 'str';
|
||||
// returns NULL if no comma is found in 'str'.
|
||||
inline const char* SkipComma(const char* str) {
|
||||
const char* comma = strchr(str, ',');
|
||||
if (comma == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
while (isspace(*(++comma))) {}
|
||||
return comma;
|
||||
}
|
||||
|
||||
// Returns the prefix of 'str' before the first comma in it; returns
|
||||
// the entire string if it contains no comma.
|
||||
inline String GetPrefixUntilComma(const char* str) {
|
||||
const char* comma = strchr(str, ',');
|
||||
return comma == NULL ? String(str) : String(str, comma - str);
|
||||
}
|
||||
|
||||
// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
|
||||
// registers a list of type-parameterized tests with Google Test. The
|
||||
// return value is insignificant - we just need to return something
|
||||
// such that we can call this function in a namespace scope.
|
||||
//
|
||||
// Implementation note: The GTEST_TEMPLATE_ macro declares a template
|
||||
// template parameter. It's defined in gtest-type-util.h.
|
||||
template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
|
||||
class TypeParameterizedTest {
|
||||
public:
|
||||
// 'index' is the index of the test in the type list 'Types'
|
||||
// specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
|
||||
// Types). Valid values for 'index' are [0, N - 1] where N is the
|
||||
// length of Types.
|
||||
static bool Register(const char* prefix, const char* case_name,
|
||||
const char* test_names, int index) {
|
||||
typedef typename Types::Head Type;
|
||||
typedef Fixture<Type> FixtureClass;
|
||||
typedef typename GTEST_BIND_(TestSel, Type) TestClass;
|
||||
|
||||
// First, registers the first type-parameterized test in the type
|
||||
// list.
|
||||
MakeAndRegisterTestInfo(
|
||||
String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/",
|
||||
case_name, index).c_str(),
|
||||
GetPrefixUntilComma(test_names).c_str(),
|
||||
String::Format("TypeParam = %s", GetTypeName<Type>().c_str()).c_str(),
|
||||
"",
|
||||
GetTypeId<FixtureClass>(),
|
||||
TestClass::SetUpTestCase,
|
||||
TestClass::TearDownTestCase,
|
||||
new TestFactoryImpl<TestClass>);
|
||||
|
||||
// Next, recurses (at compile time) with the tail of the type list.
|
||||
return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
|
||||
::Register(prefix, case_name, test_names, index + 1);
|
||||
}
|
||||
};
|
||||
|
||||
// The base case for the compile time recursion.
|
||||
template <GTEST_TEMPLATE_ Fixture, class TestSel>
|
||||
class TypeParameterizedTest<Fixture, TestSel, Types0> {
|
||||
public:
|
||||
static bool Register(const char* /*prefix*/, const char* /*case_name*/,
|
||||
const char* /*test_names*/, int /*index*/) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
|
||||
// registers *all combinations* of 'Tests' and 'Types' with Google
|
||||
// Test. The return value is insignificant - we just need to return
|
||||
// something such that we can call this function in a namespace scope.
|
||||
template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
|
||||
class TypeParameterizedTestCase {
|
||||
public:
|
||||
static bool Register(const char* prefix, const char* case_name,
|
||||
const char* test_names) {
|
||||
typedef typename Tests::Head Head;
|
||||
|
||||
// First, register the first test in 'Test' for each type in 'Types'.
|
||||
TypeParameterizedTest<Fixture, Head, Types>::Register(
|
||||
prefix, case_name, test_names, 0);
|
||||
|
||||
// Next, recurses (at compile time) with the tail of the test list.
|
||||
return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
|
||||
::Register(prefix, case_name, SkipComma(test_names));
|
||||
}
|
||||
};
|
||||
|
||||
// The base case for the compile time recursion.
|
||||
template <GTEST_TEMPLATE_ Fixture, typename Types>
|
||||
class TypeParameterizedTestCase<Fixture, Templates0, Types> {
|
||||
public:
|
||||
static bool Register(const char* prefix, const char* case_name,
|
||||
const char* test_names) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
// 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
|
||||
// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
|
||||
// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
|
||||
String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, int skip_count);
|
||||
|
||||
// Returns the number of failed test parts in the given test result object.
|
||||
int GetFailedPartCount(const TestResult* result);
|
||||
|
||||
// A helper for suppressing warnings on unreachable code in some macros.
|
||||
bool AlwaysTrue();
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#define GTEST_MESSAGE_(message, result_type) \
|
||||
#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_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_NONFATAL_FAILURE(message) \
|
||||
GTEST_MESSAGE(message, ::testing::TPRT_NONFATAL_FAILURE)
|
||||
|
||||
#define GTEST_SUCCESS_(message) \
|
||||
GTEST_MESSAGE_(message, ::testing::TPRT_SUCCESS)
|
||||
#define GTEST_SUCCESS(message) \
|
||||
GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS)
|
||||
|
||||
// Suppresses MSVC warnings 4072 (unreachable code) for the code following
|
||||
// statement if it returns or throws (or doesn't return or throw in some
|
||||
// situations).
|
||||
#define GTEST_HIDE_UNREACHABLE_CODE_(statement) \
|
||||
if (::testing::internal::AlwaysTrue()) { statement; }
|
||||
|
||||
#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (const char* gtest_msg = "") { \
|
||||
bool gtest_caught_expected = false; \
|
||||
try { \
|
||||
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||
} \
|
||||
catch (expected_exception const&) { \
|
||||
gtest_caught_expected = true; \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception of type " \
|
||||
#expected_exception ".\n Actual: it throws a different " \
|
||||
"type."; \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
||||
} \
|
||||
if (!gtest_caught_expected) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception of type " \
|
||||
#expected_exception ".\n Actual: it throws nothing."; \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
#define GTEST_TEST_NO_THROW_(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (const char* gtest_msg = "") { \
|
||||
try { \
|
||||
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \
|
||||
" Actual: it throws."; \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
#define GTEST_TEST_ANY_THROW_(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (const char* gtest_msg = "") { \
|
||||
bool gtest_caught_any = false; \
|
||||
try { \
|
||||
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||
} \
|
||||
catch (...) { \
|
||||
gtest_caught_any = true; \
|
||||
} \
|
||||
if (!gtest_caught_any) { \
|
||||
gtest_msg = "Expected: " #statement " throws an exception.\n" \
|
||||
" Actual: it doesn't."; \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
|
||||
#define GTEST_TEST_BOOLEAN_(boolexpr, booltext, actual, expected, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
#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)
|
||||
|
||||
#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (const char* gtest_msg = "") { \
|
||||
::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
|
||||
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
||||
gtest_msg = "Expected: " #statement " doesn't generate new fatal " \
|
||||
"failures in the current thread.\n" \
|
||||
" Actual: it does."; \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
|
||||
fail(gtest_msg)
|
||||
|
||||
// Expands to the name of the class that implements the given test.
|
||||
#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
||||
test_case_name##_##test_name##_Test
|
||||
|
||||
// Helper macro for defining tests.
|
||||
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
|
||||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
|
||||
#define GTEST_TEST(test_case_name, test_name, parent_class)\
|
||||
class test_case_name##_##test_name##_Test : public parent_class {\
|
||||
public:\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
|
||||
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_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(test_case_name##_##test_name##_Test);\
|
||||
};\
|
||||
\
|
||||
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
|
||||
::test_info_ =\
|
||||
::testing::internal::MakeAndRegisterTestInfo(\
|
||||
#test_case_name, #test_name, "", "", \
|
||||
(parent_id), \
|
||||
parent_class::SetUpTestCase, \
|
||||
parent_class::TearDownTestCase, \
|
||||
new ::testing::internal::TestFactoryImpl<\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
|
||||
::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_
|
||||
|
||||
@@ -1,242 +0,0 @@
|
||||
// Copyright 2003 Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: Dan Egnor (egnor@google.com)
|
||||
//
|
||||
// A "smart" pointer type with reference tracking. Every pointer to a
|
||||
// particular object is kept on a circular linked list. When the last pointer
|
||||
// to an object is destroyed or reassigned, the object is deleted.
|
||||
//
|
||||
// Used properly, this deletes the object when the last reference goes away.
|
||||
// There are several caveats:
|
||||
// - Like all reference counting schemes, cycles lead to leaks.
|
||||
// - Each smart pointer is actually two pointers (8 bytes instead of 4).
|
||||
// - Every time a pointer is assigned, the entire list of pointers to that
|
||||
// object is traversed. This class is therefore NOT SUITABLE when there
|
||||
// will often be more than two or three pointers to a particular object.
|
||||
// - References are only tracked as long as linked_ptr<> objects are copied.
|
||||
// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
|
||||
// will happen (double deletion).
|
||||
//
|
||||
// A good use of this class is storing object references in STL containers.
|
||||
// You can safely put linked_ptr<> in a vector<>.
|
||||
// Other uses may not be as good.
|
||||
//
|
||||
// Note: If you use an incomplete type with linked_ptr<>, the class
|
||||
// *containing* linked_ptr<> must have a constructor and destructor (even
|
||||
// if they do nothing!).
|
||||
//
|
||||
// Bill Gibbons suggested we use something like this.
|
||||
//
|
||||
// Thread Safety:
|
||||
// Unlike other linked_ptr implementations, in this implementation
|
||||
// a linked_ptr object is thread-safe in the sense that:
|
||||
// - it's safe to copy linked_ptr objects concurrently,
|
||||
// - it's safe to copy *from* a linked_ptr and read its underlying
|
||||
// raw pointer (e.g. via get()) concurrently, and
|
||||
// - it's safe to write to two linked_ptrs that point to the same
|
||||
// shared object concurrently.
|
||||
// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
|
||||
// confusion with normal linked_ptr.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// Protects copying of all linked_ptr objects.
|
||||
extern Mutex g_linked_ptr_mutex;
|
||||
|
||||
// This is used internally by all instances of linked_ptr<>. It needs to be
|
||||
// a non-template class because different types of linked_ptr<> can refer to
|
||||
// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
|
||||
// So, it needs to be possible for different types of linked_ptr to participate
|
||||
// in the same circular linked list, so we need a single class type here.
|
||||
//
|
||||
// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
|
||||
class linked_ptr_internal {
|
||||
public:
|
||||
// Create a new circle that includes only this instance.
|
||||
void join_new() {
|
||||
next_ = this;
|
||||
}
|
||||
|
||||
// Many linked_ptr operations may change p.link_ for some linked_ptr
|
||||
// variable p in the same circle as this object. Therefore we need
|
||||
// to prevent two such operations from occurring concurrently.
|
||||
//
|
||||
// Note that different types of linked_ptr objects can coexist in a
|
||||
// circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
|
||||
// linked_ptr<Derived2>). Therefore we must use a single mutex to
|
||||
// protect all linked_ptr objects. This can create serious
|
||||
// contention in production code, but is acceptable in a testing
|
||||
// framework.
|
||||
|
||||
// Join an existing circle.
|
||||
// L < g_linked_ptr_mutex
|
||||
void join(linked_ptr_internal const* ptr) {
|
||||
MutexLock lock(&g_linked_ptr_mutex);
|
||||
|
||||
linked_ptr_internal const* p = ptr;
|
||||
while (p->next_ != ptr) p = p->next_;
|
||||
p->next_ = this;
|
||||
next_ = ptr;
|
||||
}
|
||||
|
||||
// Leave whatever circle we're part of. Returns true if we were the
|
||||
// last member of the circle. Once this is done, you can join() another.
|
||||
// L < g_linked_ptr_mutex
|
||||
bool depart() {
|
||||
MutexLock lock(&g_linked_ptr_mutex);
|
||||
|
||||
if (next_ == this) return true;
|
||||
linked_ptr_internal const* p = next_;
|
||||
while (p->next_ != this) p = p->next_;
|
||||
p->next_ = next_;
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
mutable linked_ptr_internal const* next_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class linked_ptr {
|
||||
public:
|
||||
typedef T element_type;
|
||||
|
||||
// Take over ownership of a raw pointer. This should happen as soon as
|
||||
// possible after the object is created.
|
||||
explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
|
||||
~linked_ptr() { depart(); }
|
||||
|
||||
// Copy an existing linked_ptr<>, adding ourselves to the list of references.
|
||||
template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
|
||||
linked_ptr(linked_ptr const& ptr) { // NOLINT
|
||||
assert(&ptr != this);
|
||||
copy(&ptr);
|
||||
}
|
||||
|
||||
// Assignment releases the old value and acquires the new.
|
||||
template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
|
||||
depart();
|
||||
copy(&ptr);
|
||||
return *this;
|
||||
}
|
||||
|
||||
linked_ptr& operator=(linked_ptr const& ptr) {
|
||||
if (&ptr != this) {
|
||||
depart();
|
||||
copy(&ptr);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Smart pointer members.
|
||||
void reset(T* ptr = NULL) {
|
||||
depart();
|
||||
capture(ptr);
|
||||
}
|
||||
T* get() const { return value_; }
|
||||
T* operator->() const { return value_; }
|
||||
T& operator*() const { return *value_; }
|
||||
// Release ownership of the pointed object and returns it.
|
||||
// Sole ownership by this linked_ptr object is required.
|
||||
T* release() {
|
||||
bool last = link_.depart();
|
||||
assert(last);
|
||||
T* v = value_;
|
||||
value_ = NULL;
|
||||
return v;
|
||||
}
|
||||
|
||||
bool operator==(T* p) const { return value_ == p; }
|
||||
bool operator!=(T* p) const { return value_ != p; }
|
||||
template <typename U>
|
||||
bool operator==(linked_ptr<U> const& ptr) const {
|
||||
return value_ == ptr.get();
|
||||
}
|
||||
template <typename U>
|
||||
bool operator!=(linked_ptr<U> const& ptr) const {
|
||||
return value_ != ptr.get();
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename U>
|
||||
friend class linked_ptr;
|
||||
|
||||
T* value_;
|
||||
linked_ptr_internal link_;
|
||||
|
||||
void depart() {
|
||||
if (link_.depart()) delete value_;
|
||||
}
|
||||
|
||||
void capture(T* ptr) {
|
||||
value_ = ptr;
|
||||
link_.join_new();
|
||||
}
|
||||
|
||||
template <typename U> void copy(linked_ptr<U> const* ptr) {
|
||||
value_ = ptr->get();
|
||||
if (value_)
|
||||
link_.join(&ptr->link_);
|
||||
else
|
||||
link_.join_new();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T> inline
|
||||
bool operator==(T* ptr, const linked_ptr<T>& x) {
|
||||
return ptr == x.get();
|
||||
}
|
||||
|
||||
template<typename T> inline
|
||||
bool operator!=(T* ptr, const linked_ptr<T>& x) {
|
||||
return ptr != x.get();
|
||||
}
|
||||
|
||||
// A function to convert T* into linked_ptr<T>
|
||||
// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
|
||||
// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
|
||||
template <typename T>
|
||||
linked_ptr<T> make_linked_ptr(T* ptr) {
|
||||
return linked_ptr<T>(ptr);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,269 +0,0 @@
|
||||
$$ -*- mode: c++; -*-
|
||||
$var n = 50 $$ Maximum length of Values arguments we want to support.
|
||||
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support.
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
|
||||
// Type and function utilities for implementing parameterized tests.
|
||||
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
||||
//
|
||||
// Currently Google Test supports at most $n arguments in Values,
|
||||
// and at most $maxtuple arguments in Combine. Please contact
|
||||
// googletestframework@googlegroups.com if you need more.
|
||||
// Please note that the number of arguments to Combine is limited
|
||||
// by the maximum arity of the implementation of tr1::tuple which is
|
||||
// currently set at $maxtuple.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
#include <gtest/internal/gtest-param-util.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// Used in the Values() function to provide polymorphic capabilities.
|
||||
template <typename T1>
|
||||
class ValueArray1 {
|
||||
public:
|
||||
explicit ValueArray1(T1 v1) : v1_(v1) {}
|
||||
|
||||
template <typename T>
|
||||
operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
|
||||
|
||||
private:
|
||||
const T1 v1_;
|
||||
};
|
||||
|
||||
$range i 2..n
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
|
||||
template <$for j, [[typename T$j]]>
|
||||
class ValueArray$i {
|
||||
public:
|
||||
ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
|
||||
|
||||
template <typename T>
|
||||
operator ParamGenerator<T>() const {
|
||||
const T array[] = {$for j, [[v$(j)_]]};
|
||||
return ValuesIn(array);
|
||||
}
|
||||
|
||||
private:
|
||||
$for j [[
|
||||
|
||||
const T$j v$(j)_;
|
||||
]]
|
||||
|
||||
};
|
||||
|
||||
]]
|
||||
|
||||
#if GTEST_HAS_COMBINE
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Generates values from the Cartesian product of values produced
|
||||
// by the argument generators.
|
||||
//
|
||||
$range i 2..maxtuple
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
$range k 2..i
|
||||
|
||||
template <$for j, [[typename T$j]]>
|
||||
class CartesianProductGenerator$i
|
||||
: public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
|
||||
public:
|
||||
typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
|
||||
|
||||
CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
|
||||
: $for j, [[g$(j)_(g$j)]] {}
|
||||
virtual ~CartesianProductGenerator$i() {}
|
||||
|
||||
virtual ParamIteratorInterface<ParamType>* Begin() const {
|
||||
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
|
||||
}
|
||||
virtual ParamIteratorInterface<ParamType>* End() const {
|
||||
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
|
||||
}
|
||||
|
||||
private:
|
||||
class Iterator : public ParamIteratorInterface<ParamType> {
|
||||
public:
|
||||
Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
|
||||
|
||||
const ParamGenerator<T$j>& g$j,
|
||||
const typename ParamGenerator<T$j>::iterator& current$(j)]])
|
||||
: base_(base),
|
||||
$for j, [[
|
||||
|
||||
begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
|
||||
]] {
|
||||
ComputeCurrentValue();
|
||||
}
|
||||
virtual ~Iterator() {}
|
||||
|
||||
virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
|
||||
return base_;
|
||||
}
|
||||
// Advance should not be called on beyond-of-range iterators
|
||||
// so no component iterators must be beyond end of range, either.
|
||||
virtual void Advance() {
|
||||
assert(!AtEnd());
|
||||
++current$(i)_;
|
||||
|
||||
$for k [[
|
||||
if (current$(i+2-k)_ == end$(i+2-k)_) {
|
||||
current$(i+2-k)_ = begin$(i+2-k)_;
|
||||
++current$(i+2-k-1)_;
|
||||
}
|
||||
|
||||
]]
|
||||
ComputeCurrentValue();
|
||||
}
|
||||
virtual ParamIteratorInterface<ParamType>* Clone() const {
|
||||
return new Iterator(*this);
|
||||
}
|
||||
virtual const ParamType* Current() const { return ¤t_value_; }
|
||||
virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
|
||||
// Having the same base generator guarantees that the other
|
||||
// iterator is of the same type and we can downcast.
|
||||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
|
||||
<< "The program attempted to compare iterators "
|
||||
<< "from different generators." << std::endl;
|
||||
const Iterator* typed_other =
|
||||
CheckedDowncastToActualType<const Iterator>(&other);
|
||||
// We must report iterators equal if they both point beyond their
|
||||
// respective ranges. That can happen in a variety of fashions,
|
||||
// so we have to consult AtEnd().
|
||||
return (AtEnd() && typed_other->AtEnd()) ||
|
||||
($for j && [[
|
||||
|
||||
current$(j)_ == typed_other->current$(j)_
|
||||
]]);
|
||||
}
|
||||
|
||||
private:
|
||||
Iterator(const Iterator& other)
|
||||
: base_(other.base_), $for j, [[
|
||||
|
||||
begin$(j)_(other.begin$(j)_),
|
||||
end$(j)_(other.end$(j)_),
|
||||
current$(j)_(other.current$(j)_)
|
||||
]] {
|
||||
ComputeCurrentValue();
|
||||
}
|
||||
|
||||
void ComputeCurrentValue() {
|
||||
if (!AtEnd())
|
||||
current_value_ = ParamType($for j, [[*current$(j)_]]);
|
||||
}
|
||||
bool AtEnd() const {
|
||||
// We must report iterator past the end of the range when either of the
|
||||
// component iterators has reached the end of its range.
|
||||
return
|
||||
$for j || [[
|
||||
|
||||
current$(j)_ == end$(j)_
|
||||
]];
|
||||
}
|
||||
|
||||
const ParamGeneratorInterface<ParamType>* const base_;
|
||||
// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
|
||||
// current[i]_ is the actual traversing iterator.
|
||||
$for j [[
|
||||
|
||||
const typename ParamGenerator<T$j>::iterator begin$(j)_;
|
||||
const typename ParamGenerator<T$j>::iterator end$(j)_;
|
||||
typename ParamGenerator<T$j>::iterator current$(j)_;
|
||||
]]
|
||||
|
||||
ParamType current_value_;
|
||||
};
|
||||
|
||||
|
||||
$for j [[
|
||||
const ParamGenerator<T$j> g$(j)_;
|
||||
|
||||
]]
|
||||
};
|
||||
|
||||
|
||||
]]
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Helper classes providing Combine() with polymorphic features. They allow
|
||||
// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
|
||||
// convertible to U.
|
||||
//
|
||||
$range i 2..maxtuple
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
|
||||
template <$for j, [[class Generator$j]]>
|
||||
class CartesianProductHolder$i {
|
||||
public:
|
||||
CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
|
||||
: $for j, [[g$(j)_(g$j)]] {}
|
||||
template <$for j, [[typename T$j]]>
|
||||
operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
|
||||
return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
|
||||
new CartesianProductGenerator$i<$for j, [[T$j]]>(
|
||||
$for j,[[
|
||||
|
||||
static_cast<ParamGenerator<T$j> >(g$(j)_)
|
||||
]]));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
$for j [[
|
||||
const Generator$j g$(j)_;
|
||||
|
||||
]]
|
||||
};
|
||||
|
||||
]]
|
||||
|
||||
#endif // GTEST_HAS_COMBINE
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
||||
@@ -1,629 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
|
||||
// Type and function utilities for implementing parameterized tests.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
|
||||
|
||||
#include <iterator>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
#if GTEST_HAS_RTTI
|
||||
#include <typeinfo>
|
||||
#endif // GTEST_HAS_RTTI
|
||||
|
||||
#include <gtest/internal/gtest-linked_ptr.h>
|
||||
#include <gtest/internal/gtest-internal.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Outputs a message explaining invalid registration of different
|
||||
// fixture class for the same test case. This may happen when
|
||||
// TEST_P macro is used to define two tests with the same name
|
||||
// but in different namespaces.
|
||||
void ReportInvalidTestCaseType(const char* test_case_name,
|
||||
const char* file, int line);
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Downcasts the pointer of type Base to Derived.
|
||||
// Derived must be a subclass of Base. The parameter MUST
|
||||
// point to a class of type Derived, not any subclass of it.
|
||||
// When RTTI is available, the function performs a runtime
|
||||
// check to enforce this.
|
||||
template <class Derived, class Base>
|
||||
Derived* CheckedDowncastToActualType(Base* base) {
|
||||
#if GTEST_HAS_RTTI
|
||||
GTEST_CHECK_(typeid(*base) == typeid(Derived));
|
||||
Derived* derived = dynamic_cast<Derived*>(base); // NOLINT
|
||||
#else
|
||||
Derived* derived = static_cast<Derived*>(base); // Poor man's downcast.
|
||||
#endif // GTEST_HAS_RTTI
|
||||
return derived;
|
||||
}
|
||||
|
||||
template <typename> class ParamGeneratorInterface;
|
||||
template <typename> class ParamGenerator;
|
||||
|
||||
// Interface for iterating over elements provided by an implementation
|
||||
// of ParamGeneratorInterface<T>.
|
||||
template <typename T>
|
||||
class ParamIteratorInterface {
|
||||
public:
|
||||
virtual ~ParamIteratorInterface() {}
|
||||
// A pointer to the base generator instance.
|
||||
// Used only for the purposes of iterator comparison
|
||||
// to make sure that two iterators belong to the same generator.
|
||||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
|
||||
// Advances iterator to point to the next element
|
||||
// provided by the generator. The caller is responsible
|
||||
// for not calling Advance() on an iterator equal to
|
||||
// BaseGenerator()->End().
|
||||
virtual void Advance() = 0;
|
||||
// Clones the iterator object. Used for implementing copy semantics
|
||||
// of ParamIterator<T>.
|
||||
virtual ParamIteratorInterface* Clone() const = 0;
|
||||
// Dereferences the current iterator and provides (read-only) access
|
||||
// to the pointed value. It is the caller's responsibility not to call
|
||||
// Current() on an iterator equal to BaseGenerator()->End().
|
||||
// Used for implementing ParamGenerator<T>::operator*().
|
||||
virtual const T* Current() const = 0;
|
||||
// Determines whether the given iterator and other point to the same
|
||||
// element in the sequence generated by the generator.
|
||||
// Used for implementing ParamGenerator<T>::operator==().
|
||||
virtual bool Equals(const ParamIteratorInterface& other) const = 0;
|
||||
};
|
||||
|
||||
// Class iterating over elements provided by an implementation of
|
||||
// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
|
||||
// and implements the const forward iterator concept.
|
||||
template <typename T>
|
||||
class ParamIterator {
|
||||
public:
|
||||
typedef T value_type;
|
||||
typedef const T& reference;
|
||||
typedef ptrdiff_t difference_type;
|
||||
|
||||
// ParamIterator assumes ownership of the impl_ pointer.
|
||||
ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
|
||||
ParamIterator& operator=(const ParamIterator& other) {
|
||||
if (this != &other)
|
||||
impl_.reset(other.impl_->Clone());
|
||||
return *this;
|
||||
}
|
||||
|
||||
const T& operator*() const { return *impl_->Current(); }
|
||||
const T* operator->() const { return impl_->Current(); }
|
||||
// Prefix version of operator++.
|
||||
ParamIterator& operator++() {
|
||||
impl_->Advance();
|
||||
return *this;
|
||||
}
|
||||
// Postfix version of operator++.
|
||||
ParamIterator operator++(int /*unused*/) {
|
||||
ParamIteratorInterface<T>* clone = impl_->Clone();
|
||||
impl_->Advance();
|
||||
return ParamIterator(clone);
|
||||
}
|
||||
bool operator==(const ParamIterator& other) const {
|
||||
return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
|
||||
}
|
||||
bool operator!=(const ParamIterator& other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ParamGenerator<T>;
|
||||
explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
|
||||
scoped_ptr<ParamIteratorInterface<T> > impl_;
|
||||
};
|
||||
|
||||
// ParamGeneratorInterface<T> is the binary interface to access generators
|
||||
// defined in other translation units.
|
||||
template <typename T>
|
||||
class ParamGeneratorInterface {
|
||||
public:
|
||||
typedef T ParamType;
|
||||
|
||||
virtual ~ParamGeneratorInterface() {}
|
||||
|
||||
// Generator interface definition
|
||||
virtual ParamIteratorInterface<T>* Begin() const = 0;
|
||||
virtual ParamIteratorInterface<T>* End() const = 0;
|
||||
};
|
||||
|
||||
// Wraps ParamGeneratorInetrface<T> and provides general generator syntax
|
||||
// compatible with the STL Container concept.
|
||||
// This class implements copy initialization semantics and the contained
|
||||
// ParamGeneratorInterface<T> instance is shared among all copies
|
||||
// of the original object. This is possible because that instance is immutable.
|
||||
template<typename T>
|
||||
class ParamGenerator {
|
||||
public:
|
||||
typedef ParamIterator<T> iterator;
|
||||
|
||||
explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
|
||||
ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
|
||||
|
||||
ParamGenerator& operator=(const ParamGenerator& other) {
|
||||
impl_ = other.impl_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator begin() const { return iterator(impl_->Begin()); }
|
||||
iterator end() const { return iterator(impl_->End()); }
|
||||
|
||||
private:
|
||||
::testing::internal::linked_ptr<const ParamGeneratorInterface<T> > impl_;
|
||||
};
|
||||
|
||||
// Generates values from a range of two comparable values. Can be used to
|
||||
// generate sequences of user-defined types that implement operator+() and
|
||||
// operator<().
|
||||
// This class is used in the Range() function.
|
||||
template <typename T, typename IncrementT>
|
||||
class RangeGenerator : public ParamGeneratorInterface<T> {
|
||||
public:
|
||||
RangeGenerator(T begin, T end, IncrementT step)
|
||||
: begin_(begin), end_(end),
|
||||
step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
|
||||
virtual ~RangeGenerator() {}
|
||||
|
||||
virtual ParamIteratorInterface<T>* Begin() const {
|
||||
return new Iterator(this, begin_, 0, step_);
|
||||
}
|
||||
virtual ParamIteratorInterface<T>* End() const {
|
||||
return new Iterator(this, end_, end_index_, step_);
|
||||
}
|
||||
|
||||
private:
|
||||
class Iterator : public ParamIteratorInterface<T> {
|
||||
public:
|
||||
Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
|
||||
IncrementT step)
|
||||
: base_(base), value_(value), index_(index), step_(step) {}
|
||||
virtual ~Iterator() {}
|
||||
|
||||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
|
||||
return base_;
|
||||
}
|
||||
virtual void Advance() {
|
||||
value_ = value_ + step_;
|
||||
index_++;
|
||||
}
|
||||
virtual ParamIteratorInterface<T>* Clone() const {
|
||||
return new Iterator(*this);
|
||||
}
|
||||
virtual const T* Current() const { return &value_; }
|
||||
virtual bool Equals(const ParamIteratorInterface<T>& other) const {
|
||||
// Having the same base generator guarantees that the other
|
||||
// iterator is of the same type and we can downcast.
|
||||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
|
||||
<< "The program attempted to compare iterators "
|
||||
<< "from different generators." << std::endl;
|
||||
const int other_index =
|
||||
CheckedDowncastToActualType<const Iterator>(&other)->index_;
|
||||
return index_ == other_index;
|
||||
}
|
||||
|
||||
private:
|
||||
Iterator(const Iterator& other)
|
||||
: base_(other.base_), value_(other.value_), index_(other.index_),
|
||||
step_(other.step_) {}
|
||||
|
||||
const ParamGeneratorInterface<T>* const base_;
|
||||
T value_;
|
||||
int index_;
|
||||
const IncrementT step_;
|
||||
}; // class RangeGenerator::Iterator
|
||||
|
||||
static int CalculateEndIndex(const T& begin,
|
||||
const T& end,
|
||||
const IncrementT& step) {
|
||||
int end_index = 0;
|
||||
for (T i = begin; i < end; i = i + step)
|
||||
end_index++;
|
||||
return end_index;
|
||||
}
|
||||
|
||||
const T begin_;
|
||||
const T end_;
|
||||
const IncrementT step_;
|
||||
// The index for the end() iterator. All the elements in the generated
|
||||
// sequence are indexed (0-based) to aid iterator comparison.
|
||||
const int end_index_;
|
||||
}; // class RangeGenerator
|
||||
|
||||
|
||||
// Generates values from a pair of STL-style iterators. Used in the
|
||||
// ValuesIn() function. The elements are copied from the source range
|
||||
// since the source can be located on the stack, and the generator
|
||||
// is likely to persist beyond that stack frame.
|
||||
template <typename T>
|
||||
class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
|
||||
public:
|
||||
template <typename ForwardIterator>
|
||||
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
|
||||
: container_(begin, end) {}
|
||||
virtual ~ValuesInIteratorRangeGenerator() {}
|
||||
|
||||
virtual ParamIteratorInterface<T>* Begin() const {
|
||||
return new Iterator(this, container_.begin());
|
||||
}
|
||||
virtual ParamIteratorInterface<T>* End() const {
|
||||
return new Iterator(this, container_.end());
|
||||
}
|
||||
|
||||
private:
|
||||
typedef typename ::std::vector<T> ContainerType;
|
||||
|
||||
class Iterator : public ParamIteratorInterface<T> {
|
||||
public:
|
||||
Iterator(const ParamGeneratorInterface<T>* base,
|
||||
typename ContainerType::const_iterator iterator)
|
||||
: base_(base), iterator_(iterator) {}
|
||||
virtual ~Iterator() {}
|
||||
|
||||
virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
|
||||
return base_;
|
||||
}
|
||||
virtual void Advance() {
|
||||
++iterator_;
|
||||
value_.reset();
|
||||
}
|
||||
virtual ParamIteratorInterface<T>* Clone() const {
|
||||
return new Iterator(*this);
|
||||
}
|
||||
// We need to use cached value referenced by iterator_ because *iterator_
|
||||
// can return a temporary object (and of type other then T), so just
|
||||
// having "return &*iterator_;" doesn't work.
|
||||
// value_ is updated here and not in Advance() because Advance()
|
||||
// can advance iterator_ beyond the end of the range, and we cannot
|
||||
// detect that fact. The client code, on the other hand, is
|
||||
// responsible for not calling Current() on an out-of-range iterator.
|
||||
virtual const T* Current() const {
|
||||
if (value_.get() == NULL)
|
||||
value_.reset(new T(*iterator_));
|
||||
return value_.get();
|
||||
}
|
||||
virtual bool Equals(const ParamIteratorInterface<T>& other) const {
|
||||
// Having the same base generator guarantees that the other
|
||||
// iterator is of the same type and we can downcast.
|
||||
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
|
||||
<< "The program attempted to compare iterators "
|
||||
<< "from different generators." << std::endl;
|
||||
return iterator_ ==
|
||||
CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
|
||||
}
|
||||
|
||||
private:
|
||||
Iterator(const Iterator& other)
|
||||
// The explicit constructor call suppresses a false warning
|
||||
// emitted by gcc when supplied with the -Wextra option.
|
||||
: ParamIteratorInterface<T>(),
|
||||
base_(other.base_),
|
||||
iterator_(other.iterator_) {}
|
||||
|
||||
const ParamGeneratorInterface<T>* const base_;
|
||||
typename ContainerType::const_iterator iterator_;
|
||||
// A cached value of *iterator_. We keep it here to allow access by
|
||||
// pointer in the wrapping iterator's operator->().
|
||||
// value_ needs to be mutable to be accessed in Current().
|
||||
// Use of scoped_ptr helps manage cached value's lifetime,
|
||||
// which is bound by the lifespan of the iterator itself.
|
||||
mutable scoped_ptr<const T> value_;
|
||||
};
|
||||
|
||||
const ContainerType container_;
|
||||
}; // class ValuesInIteratorRangeGenerator
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// Stores a parameter value and later creates tests parameterized with that
|
||||
// value.
|
||||
template <class TestClass>
|
||||
class ParameterizedTestFactory : public TestFactoryBase {
|
||||
public:
|
||||
typedef typename TestClass::ParamType ParamType;
|
||||
explicit ParameterizedTestFactory(ParamType parameter) :
|
||||
parameter_(parameter) {}
|
||||
virtual Test* CreateTest() {
|
||||
TestClass::SetParam(¶meter_);
|
||||
return new TestClass();
|
||||
}
|
||||
|
||||
private:
|
||||
const ParamType parameter_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
|
||||
};
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// TestMetaFactoryBase is a base class for meta-factories that create
|
||||
// test factories for passing into MakeAndRegisterTestInfo function.
|
||||
template <class ParamType>
|
||||
class TestMetaFactoryBase {
|
||||
public:
|
||||
virtual ~TestMetaFactoryBase() {}
|
||||
|
||||
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
|
||||
};
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// TestMetaFactory creates test factories for passing into
|
||||
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
|
||||
// ownership of test factory pointer, same factory object cannot be passed
|
||||
// into that method twice. But ParameterizedTestCaseInfo is going to call
|
||||
// it for each Test/Parameter value combination. Thus it needs meta factory
|
||||
// creator class.
|
||||
template <class TestCase>
|
||||
class TestMetaFactory
|
||||
: public TestMetaFactoryBase<typename TestCase::ParamType> {
|
||||
public:
|
||||
typedef typename TestCase::ParamType ParamType;
|
||||
|
||||
TestMetaFactory() {}
|
||||
|
||||
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
|
||||
return new ParameterizedTestFactory<TestCase>(parameter);
|
||||
}
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
|
||||
};
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// ParameterizedTestCaseInfoBase is a generic interface
|
||||
// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
|
||||
// accumulates test information provided by TEST_P macro invocations
|
||||
// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
|
||||
// and uses that information to register all resulting test instances
|
||||
// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
|
||||
// a collection of pointers to the ParameterizedTestCaseInfo objects
|
||||
// and calls RegisterTests() on each of them when asked.
|
||||
class ParameterizedTestCaseInfoBase {
|
||||
public:
|
||||
virtual ~ParameterizedTestCaseInfoBase() {}
|
||||
|
||||
// Base part of test case name for display purposes.
|
||||
virtual const String& GetTestCaseName() const = 0;
|
||||
// Test case id to verify identity.
|
||||
virtual TypeId GetTestCaseTypeId() const = 0;
|
||||
// UnitTest class invokes this method to register tests in this
|
||||
// test case right before running them in RUN_ALL_TESTS macro.
|
||||
// This method should not be called more then once on any single
|
||||
// instance of a ParameterizedTestCaseInfoBase derived class.
|
||||
virtual void RegisterTests() = 0;
|
||||
|
||||
protected:
|
||||
ParameterizedTestCaseInfoBase() {}
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
|
||||
};
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
|
||||
// macro invocations for a particular test case and generators
|
||||
// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
|
||||
// test case. It registers tests with all values generated by all
|
||||
// generators when asked.
|
||||
template <class TestCase>
|
||||
class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
|
||||
public:
|
||||
// ParamType and GeneratorCreationFunc are private types but are required
|
||||
// for declarations of public methods AddTestPattern() and
|
||||
// AddTestCaseInstantiation().
|
||||
typedef typename TestCase::ParamType ParamType;
|
||||
// A function that returns an instance of appropriate generator type.
|
||||
typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
|
||||
|
||||
explicit ParameterizedTestCaseInfo(const char* name)
|
||||
: test_case_name_(name) {}
|
||||
|
||||
// Test case base name for display purposes.
|
||||
virtual const String& GetTestCaseName() const { return test_case_name_; }
|
||||
// Test case id to verify identity.
|
||||
virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
|
||||
// TEST_P macro uses AddTestPattern() to record information
|
||||
// about a single test in a LocalTestInfo structure.
|
||||
// test_case_name is the base name of the test case (without invocation
|
||||
// prefix). test_base_name is the name of an individual test without
|
||||
// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
|
||||
// test case base name and DoBar is test base name.
|
||||
void AddTestPattern(const char* test_case_name,
|
||||
const char* test_base_name,
|
||||
TestMetaFactoryBase<ParamType>* meta_factory) {
|
||||
tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
|
||||
test_base_name,
|
||||
meta_factory)));
|
||||
}
|
||||
// INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
|
||||
// about a generator.
|
||||
int AddTestCaseInstantiation(const char* instantiation_name,
|
||||
GeneratorCreationFunc* func,
|
||||
const char* file,
|
||||
int line) {
|
||||
instantiations_.push_back(::std::make_pair(instantiation_name, func));
|
||||
return 0; // Return value used only to run this method in namespace scope.
|
||||
}
|
||||
// UnitTest class invokes this method to register tests in this test case
|
||||
// test cases right before running tests in RUN_ALL_TESTS macro.
|
||||
// This method should not be called more then once on any single
|
||||
// instance of a ParameterizedTestCaseInfoBase derived class.
|
||||
// UnitTest has a guard to prevent from calling this method more then once.
|
||||
virtual void RegisterTests() {
|
||||
for (typename TestInfoContainer::iterator test_it = tests_.begin();
|
||||
test_it != tests_.end(); ++test_it) {
|
||||
linked_ptr<TestInfo> test_info = *test_it;
|
||||
for (typename InstantiationContainer::iterator gen_it =
|
||||
instantiations_.begin(); gen_it != instantiations_.end();
|
||||
++gen_it) {
|
||||
const String& instantiation_name = gen_it->first;
|
||||
ParamGenerator<ParamType> generator((*gen_it->second)());
|
||||
|
||||
Message test_case_name_stream;
|
||||
if ( !instantiation_name.empty() )
|
||||
test_case_name_stream << instantiation_name.c_str() << "/";
|
||||
test_case_name_stream << test_info->test_case_base_name.c_str();
|
||||
|
||||
int i = 0;
|
||||
for (typename ParamGenerator<ParamType>::iterator param_it =
|
||||
generator.begin();
|
||||
param_it != generator.end(); ++param_it, ++i) {
|
||||
Message test_name_stream;
|
||||
test_name_stream << test_info->test_base_name.c_str() << "/" << i;
|
||||
::testing::internal::MakeAndRegisterTestInfo(
|
||||
test_case_name_stream.GetString().c_str(),
|
||||
test_name_stream.GetString().c_str(),
|
||||
"", // test_case_comment
|
||||
"", // comment; TODO(vladl@google.com): provide parameter value
|
||||
// representation.
|
||||
GetTestCaseTypeId(),
|
||||
TestCase::SetUpTestCase,
|
||||
TestCase::TearDownTestCase,
|
||||
test_info->test_meta_factory->CreateTestFactory(*param_it));
|
||||
} // for param_it
|
||||
} // for gen_it
|
||||
} // for test_it
|
||||
} // RegisterTests
|
||||
|
||||
private:
|
||||
// LocalTestInfo structure keeps information about a single test registered
|
||||
// with TEST_P macro.
|
||||
struct TestInfo {
|
||||
TestInfo(const char* test_case_base_name,
|
||||
const char* test_base_name,
|
||||
TestMetaFactoryBase<ParamType>* test_meta_factory) :
|
||||
test_case_base_name(test_case_base_name),
|
||||
test_base_name(test_base_name),
|
||||
test_meta_factory(test_meta_factory) {}
|
||||
|
||||
const String test_case_base_name;
|
||||
const String test_base_name;
|
||||
const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
|
||||
};
|
||||
typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
|
||||
// Keeps pairs of <Instantiation name, Sequence generator creation function>
|
||||
// received from INSTANTIATE_TEST_CASE_P macros.
|
||||
typedef ::std::vector<std::pair<String, GeneratorCreationFunc*> >
|
||||
InstantiationContainer;
|
||||
|
||||
const String test_case_name_;
|
||||
TestInfoContainer tests_;
|
||||
InstantiationContainer instantiations_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
|
||||
}; // class ParameterizedTestCaseInfo
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||
//
|
||||
// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
|
||||
// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
|
||||
// macros use it to locate their corresponding ParameterizedTestCaseInfo
|
||||
// descriptors.
|
||||
class ParameterizedTestCaseRegistry {
|
||||
public:
|
||||
ParameterizedTestCaseRegistry() {}
|
||||
~ParameterizedTestCaseRegistry() {
|
||||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
|
||||
it != test_case_infos_.end(); ++it) {
|
||||
delete *it;
|
||||
}
|
||||
}
|
||||
|
||||
// Looks up or creates and returns a structure containing information about
|
||||
// tests and instantiations of a particular test case.
|
||||
template <class TestCase>
|
||||
ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
|
||||
const char* test_case_name,
|
||||
const char* file,
|
||||
int line) {
|
||||
ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
|
||||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
|
||||
it != test_case_infos_.end(); ++it) {
|
||||
if ((*it)->GetTestCaseName() == test_case_name) {
|
||||
if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
|
||||
// Complain about incorrect usage of Google Test facilities
|
||||
// and terminate the program since we cannot guaranty correct
|
||||
// test case setup and tear-down in this case.
|
||||
ReportInvalidTestCaseType(test_case_name, file, line);
|
||||
abort();
|
||||
} else {
|
||||
// At this point we are sure that the object we found is of the same
|
||||
// type we are looking for, so we downcast it to that type
|
||||
// without further checks.
|
||||
typed_test_info = CheckedDowncastToActualType<
|
||||
ParameterizedTestCaseInfo<TestCase> >(*it);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (typed_test_info == NULL) {
|
||||
typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
|
||||
test_case_infos_.push_back(typed_test_info);
|
||||
}
|
||||
return typed_test_info;
|
||||
}
|
||||
void RegisterTests() {
|
||||
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
|
||||
it != test_case_infos_.end(); ++it) {
|
||||
(*it)->RegisterTests();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
|
||||
|
||||
TestCaseInfoContainer test_case_infos_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
|
||||
@@ -37,79 +37,56 @@
|
||||
#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. If the user doesn't define a macro
|
||||
// in this list, Google Test will define it.
|
||||
// control Google Test's behavior:
|
||||
//
|
||||
// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
|
||||
// is/isn't available.
|
||||
// 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).
|
||||
// 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).
|
||||
// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
|
||||
// is/isn't available.
|
||||
// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
|
||||
// enabled.
|
||||
// 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).
|
||||
// GTEST_HAS_TR1_TUPLE 1 - Define it to 1/0 to indicate tr1::tuple
|
||||
// is/isn't available.
|
||||
// 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 current platform (defined to 1 if compiled on
|
||||
// the given platform; otherwise undefined):
|
||||
// GTEST_OS_CYGWIN - Cygwin
|
||||
// GTEST_OS_LINUX - Linux
|
||||
// GTEST_OS_MAC - Mac OS X
|
||||
// GTEST_OS_SOLARIS - Sun Solaris
|
||||
// GTEST_OS_SYMBIAN - Symbian
|
||||
// GTEST_OS_WINDOWS - Windows
|
||||
// GTEST_OS_ZOS - z/OS
|
||||
// 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.
|
||||
//
|
||||
// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
|
||||
// most stable support. Since core members of the Google Test project
|
||||
// don't have access to other platforms, support for them may be less
|
||||
// stable. If you notice any problems on your platform, please notify
|
||||
// googletestframework@googlegroups.com (patches for fixing them are
|
||||
// even more welcome!).
|
||||
// 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.
|
||||
//
|
||||
// Note that it is possible that none of the GTEST_OS_* macros are defined.
|
||||
//
|
||||
// Macros indicating available Google Test features (defined to 1 if
|
||||
// the corresponding feature is supported; otherwise undefined):
|
||||
// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
|
||||
// tests)
|
||||
// GTEST_HAS_DEATH_TEST - death tests
|
||||
// GTEST_HAS_PARAM_TEST - value-parameterized tests
|
||||
// GTEST_HAS_TYPED_TEST - typed tests
|
||||
// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
|
||||
// GTEST_USES_POSIX_RE - enhanced POSIX regex is used.
|
||||
// GTEST_USES_SIMPLE_RE - our own simple regex is used;
|
||||
// the above two are mutually exclusive.
|
||||
// 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.
|
||||
// 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.
|
||||
// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
|
||||
// synchronization primitives have real implementations
|
||||
// and Google Test is thread-safe; or 0 otherwise.
|
||||
//
|
||||
// Template meta programming:
|
||||
// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
|
||||
// is_pointer - as in TR1; needed on Symbian only.
|
||||
//
|
||||
// Smart pointers:
|
||||
// scoped_ptr - as in TR2.
|
||||
@@ -120,7 +97,7 @@
|
||||
// Windows.
|
||||
//
|
||||
// Logging:
|
||||
// GTEST_LOG_() - logs messages at the specified severity level.
|
||||
// GTEST_LOG() - logs messages at the specified severity level.
|
||||
// LogToStderr() - directs all log messages to stderr.
|
||||
// FlushInfoLog() - flushes informational log messages.
|
||||
//
|
||||
@@ -147,93 +124,50 @@
|
||||
// Int32FromGTestEnv() - parses an Int32 environment variable.
|
||||
// StringFromGTestEnv() - parses a string environment variable.
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <iostream> // Used for GTEST_CHECK_
|
||||
|
||||
#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
|
||||
#define GTEST_FLAG_PREFIX_ "gtest_"
|
||||
#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
|
||||
#define GTEST_NAME_ "Google Test"
|
||||
#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
|
||||
|
||||
// Determines the version of gcc that is used to compile this.
|
||||
#ifdef __GNUC__
|
||||
// 40302 means version 4.3.2.
|
||||
#define GTEST_GCC_VER_ \
|
||||
(__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
|
||||
#endif // __GNUC__
|
||||
#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 __CYGWIN__
|
||||
#define GTEST_OS_CYGWIN 1
|
||||
#elif __SYMBIAN32__
|
||||
#define GTEST_OS_SYMBIAN 1
|
||||
#elif defined _MSC_VER
|
||||
#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 1
|
||||
#define GTEST_OS_WINDOWS
|
||||
#elif defined __APPLE__
|
||||
#define GTEST_OS_MAC 1
|
||||
#define GTEST_OS_MAC
|
||||
#elif defined __linux__
|
||||
#define GTEST_OS_LINUX 1
|
||||
#elif defined __MVS__
|
||||
#define GTEST_OS_ZOS 1
|
||||
#elif defined(__sun) && defined(__SVR4)
|
||||
#define GTEST_OS_SOLARIS 1
|
||||
#endif // _MSC_VER
|
||||
|
||||
#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
|
||||
|
||||
// On some platforms, <regex.h> needs someone to define size_t, and
|
||||
// won't compile otherwise. We can #include it here as we already
|
||||
// included <stdlib.h>, which is guaranteed to define size_t through
|
||||
// <stddef.h>.
|
||||
#include <regex.h> // NOLINT
|
||||
#define GTEST_USES_POSIX_RE 1
|
||||
|
||||
#else
|
||||
|
||||
// <regex.h> may not be available on this platform. Use our own
|
||||
// simple regex implementation instead.
|
||||
#define GTEST_USES_SIMPLE_RE 1
|
||||
|
||||
#endif // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
|
||||
|
||||
// Defines GTEST_HAS_EXCEPTIONS to 1 if exceptions are enabled, or 0
|
||||
// otherwise.
|
||||
|
||||
#ifdef _MSC_VER // Compiled by MSVC?
|
||||
// Assumes that exceptions are enabled by default.
|
||||
#ifndef _HAS_EXCEPTIONS // MSVC uses this macro to enable exceptions.
|
||||
#define _HAS_EXCEPTIONS 1
|
||||
#endif // _HAS_EXCEPTIONS
|
||||
#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
|
||||
#else // The compiler is not MSVC.
|
||||
// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. For
|
||||
// other compilers, we assume exceptions are disabled to be
|
||||
// conservative.
|
||||
#if defined(__GNUC__) && __EXCEPTIONS
|
||||
#define GTEST_HAS_EXCEPTIONS 1
|
||||
#else
|
||||
#define GTEST_HAS_EXCEPTIONS 0
|
||||
#endif // defined(__GNUC__) && __EXCEPTIONS
|
||||
#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. The only environment that we know
|
||||
// ::std::string is not available is MSVC 7.1 or lower with exceptions
|
||||
// disabled.
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1400) && !GTEST_HAS_EXCEPTIONS
|
||||
#define GTEST_HAS_STD_STRING 0
|
||||
#else
|
||||
// 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
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#ifndef GTEST_HAS_GLOBAL_STRING
|
||||
@@ -250,22 +184,19 @@
|
||||
// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
|
||||
// is available.
|
||||
|
||||
#if GTEST_OS_CYGWIN || GTEST_OS_SOLARIS
|
||||
// Cygwin 1.5 and below doesn't support ::std::wstring.
|
||||
// Cygwin 1.7 might add wstring support; this should be updated when clear.
|
||||
// Solaris' libc++ doesn't support it either.
|
||||
#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 || GTEST_OS_SOLARIS
|
||||
#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_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
|
||||
#define GTEST_HAS_GLOBAL_WSTRING GTEST_HAS_GLOBAL_STRING
|
||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||
|
||||
#if GTEST_HAS_STD_STRING || GTEST_HAS_GLOBAL_STRING || \
|
||||
@@ -280,136 +211,17 @@
|
||||
#include <strstream> // NOLINT
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
// Determines whether RTTI is available.
|
||||
#ifndef GTEST_HAS_RTTI
|
||||
// The user didn't tell us whether RTTI is enabled, so we need to
|
||||
// figure it out.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
#ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
|
||||
#define GTEST_HAS_RTTI 1
|
||||
#else
|
||||
#define GTEST_HAS_RTTI 0
|
||||
#endif // _CPPRTTI
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
|
||||
#if GTEST_GCC_VER_ >= 40302
|
||||
#ifdef __GXX_RTTI
|
||||
#define GTEST_HAS_RTTI 1
|
||||
#else
|
||||
#define GTEST_HAS_RTTI 0
|
||||
#endif // __GXX_RTTI
|
||||
#else
|
||||
// For gcc versions smaller than 4.3.2, we assume RTTI is enabled.
|
||||
#define GTEST_HAS_RTTI 1
|
||||
#endif // GTEST_GCC_VER >= 40302
|
||||
|
||||
#else
|
||||
|
||||
// Unknown compiler - assume RTTI is enabled.
|
||||
#define GTEST_HAS_RTTI 1
|
||||
|
||||
#endif // _MSC_VER
|
||||
|
||||
#endif // GTEST_HAS_RTTI
|
||||
|
||||
// Determines whether <pthread.h> is available.
|
||||
#ifndef GTEST_HAS_PTHREAD
|
||||
// The user didn't tell us, so we need to figure it out.
|
||||
#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC)
|
||||
#endif // GTEST_HAS_PTHREAD
|
||||
|
||||
// Determines whether tr1/tuple is available. If you have tr1/tuple
|
||||
// on your platform, define GTEST_HAS_TR1_TUPLE=1 for both the Google
|
||||
// Test project and your tests. If you would like Google Test to detect
|
||||
// tr1/tuple on your platform automatically, please open an issue
|
||||
// ticket at http://code.google.com/p/googletest.
|
||||
#ifndef GTEST_HAS_TR1_TUPLE
|
||||
// The user didn't tell us, so we need to figure it out.
|
||||
|
||||
// GCC provides <tr1/tuple> since 4.0.0.
|
||||
#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
|
||||
#define GTEST_HAS_TR1_TUPLE 1
|
||||
#else
|
||||
#define GTEST_HAS_TR1_TUPLE 0
|
||||
#endif // __GNUC__
|
||||
#endif // GTEST_HAS_TR1_TUPLE
|
||||
|
||||
// To avoid conditional compilation everywhere, we make it
|
||||
// gtest-port.h's responsibility to #include the header implementing
|
||||
// tr1/tuple.
|
||||
#if GTEST_HAS_TR1_TUPLE
|
||||
#if defined(__GNUC__)
|
||||
// GCC implements tr1/tuple in the <tr1/tuple> header. This does not
|
||||
// conform to the TR1 spec, which requires the header to be <tuple>.
|
||||
#include <tr1/tuple>
|
||||
#else
|
||||
// If the compiler is not GCC, we assume the user is using a
|
||||
// spec-conforming TR1 implementation.
|
||||
#include <tuple>
|
||||
#endif // __GNUC__
|
||||
#endif // GTEST_HAS_TR1_TUPLE
|
||||
|
||||
// Determines whether clone(2) is supported.
|
||||
// Usually it will only be available on Linux, excluding
|
||||
// Linux on the Itanium architecture.
|
||||
// Also see http://linux.die.net/man/2/clone.
|
||||
#ifndef GTEST_HAS_CLONE
|
||||
// The user didn't tell us, so we need to figure it out.
|
||||
|
||||
#if GTEST_OS_LINUX && !defined(__ia64__)
|
||||
#define GTEST_HAS_CLONE 1
|
||||
#else
|
||||
#define GTEST_HAS_CLONE 0
|
||||
#endif // GTEST_OS_LINUX && !defined(__ia64__)
|
||||
|
||||
#endif // GTEST_HAS_CLONE
|
||||
|
||||
// Determines whether to support death tests.
|
||||
// Google Test does not support death tests for VC 7.1 and earlier for
|
||||
// these reasons:
|
||||
// 1. std::vector does not build in VC 7.1 when exceptions are disabled.
|
||||
// 2. std::string does not build in VC 7.1 when exceptions are disabled
|
||||
// (this is covered by GTEST_HAS_STD_STRING guard).
|
||||
// 3. abort() in a VC 7.1 application compiled as GUI in debug config
|
||||
// pops up a dialog window that cannot be suppressed programmatically.
|
||||
#if GTEST_HAS_STD_STRING && (GTEST_OS_LINUX || \
|
||||
GTEST_OS_MAC || \
|
||||
GTEST_OS_CYGWIN || \
|
||||
(GTEST_OS_WINDOWS && _MSC_VER >= 1400))
|
||||
#define GTEST_HAS_DEATH_TEST 1
|
||||
#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>
|
||||
#endif
|
||||
|
||||
// Determines whether to support value-parameterized tests.
|
||||
|
||||
#if defined(__GNUC__) || (_MSC_VER >= 1400)
|
||||
// TODO(vladl@google.com): get the implementation rid of vector and list
|
||||
// to compile on MSVC 7.1.
|
||||
#define GTEST_HAS_PARAM_TEST 1
|
||||
#endif // defined(__GNUC__) || (_MSC_VER >= 1400)
|
||||
|
||||
// Determines whether to support type-driven tests.
|
||||
|
||||
// Typed tests need <typeinfo> and variadic macros, which gcc and VC
|
||||
// 8.0+ support.
|
||||
#if defined(__GNUC__) || (_MSC_VER >= 1400)
|
||||
#define GTEST_HAS_TYPED_TEST 1
|
||||
#define GTEST_HAS_TYPED_TEST_P 1
|
||||
#endif // defined(__GNUC__) || (_MSC_VER >= 1400)
|
||||
|
||||
// Determines whether to support Combine(). This only makes sense when
|
||||
// value-parameterized tests are enabled.
|
||||
#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
|
||||
#define GTEST_HAS_COMBINE 1
|
||||
#endif // GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE
|
||||
|
||||
// Determines whether the system compiler uses UTF-16 for encoding wide strings.
|
||||
#define GTEST_WIDE_STRING_USES_UTF16_ \
|
||||
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN)
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#endif // GTEST_HAS_STD_STRING && defined(GTEST_OS_LINUX)
|
||||
|
||||
// Defines some utility macros.
|
||||
|
||||
@@ -422,9 +234,9 @@
|
||||
//
|
||||
// The "switch (0) case 0:" idiom is used to suppress this.
|
||||
#ifdef __INTEL_COMPILER
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER_
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER
|
||||
#else
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: // NOLINT
|
||||
#define GTEST_AMBIGUOUS_ELSE_BLOCKER switch (0) case 0: // NOLINT
|
||||
#endif
|
||||
|
||||
// Use this annotation at the end of a struct / class definition to
|
||||
@@ -434,16 +246,16 @@
|
||||
//
|
||||
// struct Foo {
|
||||
// Foo() { ... }
|
||||
// } GTEST_ATTRIBUTE_UNUSED_;
|
||||
#if defined(__GNUC__) && !defined(COMPILER_ICC)
|
||||
#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
|
||||
// } GTEST_ATTRIBUTE_UNUSED;
|
||||
#if defined(GTEST_OS_WINDOWS) || (defined(GTEST_OS_LINUX) && defined(SWIG))
|
||||
#define GTEST_ATTRIBUTE_UNUSED
|
||||
#else
|
||||
#define GTEST_ATTRIBUTE_UNUSED_
|
||||
#endif
|
||||
#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)\
|
||||
#define GTEST_DISALLOW_COPY_AND_ASSIGN(type)\
|
||||
type(const type &);\
|
||||
void operator=(const type &)
|
||||
|
||||
@@ -451,12 +263,14 @@
|
||||
// with this macro. The macro should be used on function declarations
|
||||
// following the argument list:
|
||||
//
|
||||
// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
|
||||
#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
|
||||
#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
|
||||
// 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__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
|
||||
#define GTEST_MUST_USE_RESULT
|
||||
#endif // (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
|
||||
namespace testing {
|
||||
|
||||
@@ -507,10 +321,12 @@ class scoped_ptr {
|
||||
private:
|
||||
T* ptr_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(scoped_ptr);
|
||||
};
|
||||
|
||||
// Defines RE.
|
||||
#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.
|
||||
@@ -531,32 +347,22 @@ class RE {
|
||||
// Returns the string representation of the regex.
|
||||
const char* pattern() const { return pattern_; }
|
||||
|
||||
// FullMatch(str, re) returns true iff regular expression re matches
|
||||
// the entire str.
|
||||
// PartialMatch(str, re) returns true iff regular expression re
|
||||
// matches a substring of str (including str itself).
|
||||
//
|
||||
// TODO(wan@google.com): make FullMatch() and PartialMatch() work
|
||||
// when str contains NUL characters.
|
||||
// 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 FullMatch(const ::std::string& str, const RE& re) {
|
||||
return FullMatch(str.c_str(), re);
|
||||
}
|
||||
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 FullMatch(const ::string& str, const RE& re) {
|
||||
return FullMatch(str.c_str(), re);
|
||||
}
|
||||
static bool PartialMatch(const ::string& str, const RE& re) {
|
||||
return PartialMatch(str.c_str(), re);
|
||||
}
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
static bool FullMatch(const char* str, const RE& re);
|
||||
static bool PartialMatch(const char* str, const RE& re);
|
||||
|
||||
private:
|
||||
@@ -567,19 +373,14 @@ class RE {
|
||||
// String type here, in order to simplify dependencies between the
|
||||
// files.
|
||||
const char* pattern_;
|
||||
regex_t regex_;
|
||||
bool is_valid_;
|
||||
#if GTEST_USES_POSIX_RE
|
||||
regex_t full_regex_; // For FullMatch().
|
||||
regex_t partial_regex_; // For PartialMatch().
|
||||
#else // GTEST_USES_SIMPLE_RE
|
||||
const char* full_pattern_; // For FullMatch();
|
||||
#endif
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(RE);
|
||||
};
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines logging utilities:
|
||||
// GTEST_LOG_() - logs messages at the specified severity level.
|
||||
// GTEST_LOG() - logs messages at the specified severity level.
|
||||
// LogToStderr() - directs all log messages to stderr.
|
||||
// FlushInfoLog() - flushes informational log messages.
|
||||
|
||||
@@ -593,7 +394,7 @@ enum GTestLogSeverity {
|
||||
void GTestLog(GTestLogSeverity severity, const char* file,
|
||||
int line, const char* msg);
|
||||
|
||||
#define GTEST_LOG_(severity, msg)\
|
||||
#define GTEST_LOG(severity, msg)\
|
||||
::testing::internal::GTestLog(\
|
||||
::testing::internal::GTEST_##severity, __FILE__, __LINE__, \
|
||||
(::testing::Message() << (msg)).GetString().c_str())
|
||||
@@ -605,17 +406,14 @@ inline void FlushInfoLog() { fflush(NULL); }
|
||||
// CaptureStderr - starts capturing stderr.
|
||||
// GetCapturedStderr - stops capturing stderr and returns the captured string.
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
void CaptureStderr();
|
||||
::std::string GetCapturedStderr();
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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
|
||||
@@ -630,7 +428,7 @@ const ::std::vector<String>& GetArgvs();
|
||||
class Mutex {
|
||||
public:
|
||||
Mutex() {}
|
||||
explicit Mutex(int /*unused*/) {}
|
||||
explicit Mutex(int unused) {}
|
||||
void AssertHeld() const {}
|
||||
enum { NO_CONSTRUCTOR_NEEDED_FOR_STATIC_MUTEX = 0 };
|
||||
};
|
||||
@@ -648,8 +446,6 @@ typedef GTestMutexLock MutexLock;
|
||||
template <typename T>
|
||||
class ThreadLocal {
|
||||
public:
|
||||
ThreadLocal() : value_() {}
|
||||
explicit ThreadLocal(const T& value) : value_(value) {}
|
||||
T* pointer() { return &value_; }
|
||||
const T* pointer() const { return &value_; }
|
||||
const T& get() const { return value_; }
|
||||
@@ -662,26 +458,13 @@ class ThreadLocal {
|
||||
// return 0 to indicate that we cannot detect it.
|
||||
inline size_t GetThreadCount() { return 0; }
|
||||
|
||||
// The above synchronization primitives have dummy implementations.
|
||||
// Therefore Google Test is not thread-safe.
|
||||
#define GTEST_IS_THREADSAFE 0
|
||||
// Defines tr1::is_pointer (only needed for Symbian).
|
||||
|
||||
#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
|
||||
#ifdef __SYMBIAN32__
|
||||
|
||||
// Passing non-POD classes through ellipsis (...) crashes the ARM
|
||||
// compiler. The Nokia Symbian and the IBM XL C/C++ compiler try to
|
||||
// instantiate a copy constructor for objects passed through ellipsis
|
||||
// (...), failing for uncopyable objects. We define this to indicate
|
||||
// the fact.
|
||||
#define GTEST_ELLIPSIS_NEEDS_COPY_ 1
|
||||
|
||||
// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
|
||||
// const T& and const T* in a function template. These compilers
|
||||
// _can_ decide between class template specializations for T and T*,
|
||||
// so a tr1::type_traits-like is_pointer works.
|
||||
#define GTEST_NEEDS_IS_POINTER_ 1
|
||||
|
||||
#endif // defined(__SYMBIAN32__) || defined(__IBMCPP__)
|
||||
// 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 {
|
||||
@@ -699,15 +482,12 @@ struct is_pointer : public false_type {};
|
||||
template <typename T>
|
||||
struct is_pointer<T*> : public true_type {};
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#define GTEST_PATH_SEP_ "\\"
|
||||
#else
|
||||
#define GTEST_PATH_SEP_ "/"
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
#endif // __SYMBIAN32__
|
||||
|
||||
// Defines BiggestInt as the biggest signed integer type the compiler
|
||||
// supports.
|
||||
#if GTEST_OS_WINDOWS
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
typedef __int64 BiggestInt;
|
||||
#else
|
||||
typedef long long BiggestInt; // NOLINT
|
||||
@@ -765,7 +545,7 @@ class TypeWithSize<4> {
|
||||
template <>
|
||||
class TypeWithSize<8> {
|
||||
public:
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
typedef __int64 Int;
|
||||
typedef unsigned __int64 UInt;
|
||||
#else
|
||||
@@ -788,7 +568,7 @@ inline const char* GetEnv(const char* name) {
|
||||
#ifdef _WIN32_WCE // We are on Windows CE.
|
||||
// CE has no environment variables.
|
||||
return NULL;
|
||||
#elif GTEST_OS_WINDOWS // We are on Windows proper.
|
||||
#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.
|
||||
@@ -800,78 +580,22 @@ inline const char* GetEnv(const char* name) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#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.
|
||||
void abort();
|
||||
#else
|
||||
inline void abort() { ::abort(); }
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
// INTERNAL IMPLEMENTATION - DO NOT USE.
|
||||
//
|
||||
// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
|
||||
// is not satisfied.
|
||||
// Synopsys:
|
||||
// GTEST_CHECK_(boolean_condition);
|
||||
// or
|
||||
// GTEST_CHECK_(boolean_condition) << "Additional message";
|
||||
//
|
||||
// This checks the condition and if the condition is not satisfied
|
||||
// it prints message about the condition violation, including the
|
||||
// condition itself, plus additional message streamed into it, if any,
|
||||
// and then it aborts the program. It aborts the program irrespective of
|
||||
// whether it is built in the debug mode or not.
|
||||
class GTestCheckProvider {
|
||||
public:
|
||||
GTestCheckProvider(const char* condition, const char* file, int line) {
|
||||
FormatFileLocation(file, line);
|
||||
::std::cerr << " ERROR: Condition " << condition << " failed. ";
|
||||
}
|
||||
~GTestCheckProvider() {
|
||||
::std::cerr << ::std::endl;
|
||||
abort();
|
||||
}
|
||||
void FormatFileLocation(const char* file, int line) {
|
||||
if (file == NULL)
|
||||
file = "unknown file";
|
||||
if (line < 0) {
|
||||
::std::cerr << file << ":";
|
||||
} else {
|
||||
#if _MSC_VER
|
||||
::std::cerr << file << "(" << line << "):";
|
||||
#else
|
||||
::std::cerr << file << ":" << line << ":";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
::std::ostream& GetStream() { return ::std::cerr; }
|
||||
};
|
||||
#define GTEST_CHECK_(condition) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (condition) \
|
||||
; \
|
||||
else \
|
||||
::testing::internal::GTestCheckProvider(\
|
||||
#condition, __FILE__, __LINE__).GetStream()
|
||||
|
||||
// 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) \
|
||||
#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) \
|
||||
#define GTEST_DECLARE_string(name) \
|
||||
extern ::testing::internal::String GTEST_FLAG(name)
|
||||
|
||||
// Macros for defining flags.
|
||||
#define GTEST_DEFINE_bool_(name, default_val, doc) \
|
||||
#define GTEST_DEFINE_bool(name, default_val, doc) \
|
||||
bool GTEST_FLAG(name) = (default_val)
|
||||
#define GTEST_DEFINE_int32_(name, default_val, doc) \
|
||||
#define GTEST_DEFINE_int32(name, default_val, doc) \
|
||||
::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
|
||||
#define GTEST_DEFINE_string_(name, default_val, doc) \
|
||||
#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
|
||||
|
||||
@@ -35,18 +35,26 @@
|
||||
// Google Test. They are subject to change without notice. They should not used
|
||||
// by code external to Google Test.
|
||||
//
|
||||
// This header file is #included by <gtest/internal/gtest-internal.h>.
|
||||
// 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>
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING || GTEST_HAS_STD_STRING
|
||||
#include <string>
|
||||
#endif // GTEST_HAS_GLOBAL_STRING || GTEST_HAS_STD_STRING
|
||||
#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 {
|
||||
@@ -111,32 +119,6 @@ class String {
|
||||
// memory using malloc().
|
||||
static const char* CloneCString(const char* c_str);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
|
||||
// able to pass strings to Win32 APIs on CE we need to convert them
|
||||
// to 'Unicode', UTF-16.
|
||||
|
||||
// Creates a UTF-16 wide string from the given ANSI string, allocating
|
||||
// memory using new. The caller is responsible for deleting the return
|
||||
// value using delete[]. Returns the wide string, or NULL if the
|
||||
// input is NULL.
|
||||
//
|
||||
// The wide string is created using the ANSI codepage (CP_ACP) to
|
||||
// match the behaviour of the ANSI versions of Win32 calls and the
|
||||
// C runtime.
|
||||
static LPCWSTR AnsiToUtf16(const char* c_str);
|
||||
|
||||
// Creates an ANSI string from the given wide string, allocating
|
||||
// memory using new. The caller is responsible for deleting the return
|
||||
// value using delete[]. Returns the ANSI string, or NULL if the
|
||||
// input is NULL.
|
||||
//
|
||||
// The returned string is created using the ANSI codepage (CP_ACP) to
|
||||
// match the behaviour of the ANSI versions of Win32 calls and the
|
||||
// C runtime.
|
||||
static const char* Utf16ToAnsi(LPCWSTR utf16_str);
|
||||
#endif
|
||||
|
||||
// Compares two C strings. Returns true iff they have the same content.
|
||||
//
|
||||
// Unlike strcmp(), this function can handle NULL argument(s). A
|
||||
@@ -171,21 +153,6 @@ class String {
|
||||
static bool CaseInsensitiveCStringEquals(const char* lhs,
|
||||
const char* rhs);
|
||||
|
||||
// Compares two wide C strings, ignoring case. Returns true iff they
|
||||
// have the same content.
|
||||
//
|
||||
// Unlike wcscasecmp(), this function can handle NULL argument(s).
|
||||
// A NULL C string is considered different to any non-NULL wide C string,
|
||||
// including the empty string.
|
||||
// NB: The implementations on different platforms slightly differ.
|
||||
// On windows, this method uses _wcsicmp which compares according to LC_CTYPE
|
||||
// environment variable. On GNU platform this method uses wcscasecmp
|
||||
// which compares according to LC_CTYPE category of the current locale.
|
||||
// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
|
||||
// current locale.
|
||||
static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
|
||||
const wchar_t* rhs);
|
||||
|
||||
// Formats a list of arguments to a String, using the same format
|
||||
// spec string as for printf.
|
||||
//
|
||||
@@ -221,24 +188,6 @@ class String {
|
||||
// doesn't need to be virtual.
|
||||
~String() { delete[] c_str_; }
|
||||
|
||||
// Allows a String to be implicitly converted to an ::std::string or
|
||||
// ::string, and vice versa. Converting a String containing a NULL
|
||||
// pointer to ::std::string or ::string is undefined behavior.
|
||||
// Converting a ::std::string or ::string containing an embedded NUL
|
||||
// character to a String will result in the prefix up to the first
|
||||
// NUL character.
|
||||
#if GTEST_HAS_STD_STRING
|
||||
String(const ::std::string& str) : c_str_(NULL) { *this = str.c_str(); }
|
||||
|
||||
operator ::std::string() const { return ::std::string(c_str_); }
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
String(const ::string& str) : c_str_(NULL) { *this = str.c_str(); }
|
||||
|
||||
operator ::string() const { return ::string(c_str_); }
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
|
||||
// Returns true iff this is an empty string (i.e. "").
|
||||
bool empty() const {
|
||||
return (c_str_ != NULL) && (*c_str_ == '\0');
|
||||
@@ -255,10 +204,6 @@ class String {
|
||||
return CStringEquals(c_str_, c_str);
|
||||
}
|
||||
|
||||
// Returns true iff this String is less than the given C string. A NULL
|
||||
// string is considered less than "".
|
||||
bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
|
||||
|
||||
// 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 {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,287 +0,0 @@
|
||||
$$ -*- mode: c++; -*-
|
||||
$var n = 50 $$ Maximum length of type lists we want to support.
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Type utilities needed for implementing typed and type-parameterized
|
||||
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
||||
//
|
||||
// Currently we support at most $n types in a list, and at most $n
|
||||
// type-parameterized tests in one type-parameterized test case.
|
||||
// Please contact googletestframework@googlegroups.com if you need
|
||||
// more.
|
||||
|
||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include <cxxabi.h>
|
||||
#endif // __GNUC__
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
|
||||
// type. This can be used as a compile-time assertion to ensure that
|
||||
// two types are equal.
|
||||
|
||||
template <typename T1, typename T2>
|
||||
struct AssertTypeEq;
|
||||
|
||||
template <typename T>
|
||||
struct AssertTypeEq<T, T> {
|
||||
typedef bool type;
|
||||
};
|
||||
|
||||
// GetTypeName<T>() returns a human-readable name of type T.
|
||||
template <typename T>
|
||||
String GetTypeName() {
|
||||
#if GTEST_HAS_RTTI
|
||||
|
||||
const char* const name = typeid(T).name();
|
||||
#ifdef __GNUC__
|
||||
int status = 0;
|
||||
// gcc's implementation of typeid(T).name() mangles the type name,
|
||||
// so we have to demangle it.
|
||||
char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);
|
||||
const String name_str(status == 0 ? readable_name : name);
|
||||
free(readable_name);
|
||||
return name_str;
|
||||
#else
|
||||
return name;
|
||||
#endif // __GNUC__
|
||||
|
||||
#else
|
||||
return "<type>";
|
||||
#endif // GTEST_HAS_RTTI
|
||||
}
|
||||
|
||||
// A unique type used as the default value for the arguments of class
|
||||
// template Types. This allows us to simulate variadic templates
|
||||
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
|
||||
// support directly.
|
||||
struct None {};
|
||||
|
||||
// The following family of struct and struct templates are used to
|
||||
// represent type lists. In particular, TypesN<T1, T2, ..., TN>
|
||||
// represents a type list with N types (T1, T2, ..., and TN) in it.
|
||||
// Except for Types0, every struct in the family has two member types:
|
||||
// Head for the first type in the list, and Tail for the rest of the
|
||||
// list.
|
||||
|
||||
// The empty type list.
|
||||
struct Types0 {};
|
||||
|
||||
// Type lists of length 1, 2, 3, and so on.
|
||||
|
||||
template <typename T1>
|
||||
struct Types1 {
|
||||
typedef T1 Head;
|
||||
typedef Types0 Tail;
|
||||
};
|
||||
|
||||
$range i 2..n
|
||||
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
$range k 2..i
|
||||
template <$for j, [[typename T$j]]>
|
||||
struct Types$i {
|
||||
typedef T1 Head;
|
||||
typedef Types$(i-1)<$for k, [[T$k]]> Tail;
|
||||
};
|
||||
|
||||
|
||||
]]
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// We don't want to require the users to write TypesN<...> directly,
|
||||
// as that would require them to count the length. Types<...> is much
|
||||
// easier to write, but generates horrible messages when there is a
|
||||
// compiler error, as gcc insists on printing out each template
|
||||
// argument, even if it has the default value (this means Types<int>
|
||||
// will appear as Types<int, None, None, ..., None> in the compiler
|
||||
// errors).
|
||||
//
|
||||
// Our solution is to combine the best part of the two approaches: a
|
||||
// user would write Types<T1, ..., TN>, and Google Test will translate
|
||||
// that to TypesN<T1, ..., TN> internally to make error messages
|
||||
// readable. The translation is done by the 'type' member of the
|
||||
// Types template.
|
||||
|
||||
$range i 1..n
|
||||
template <$for i, [[typename T$i = internal::None]]>
|
||||
struct Types {
|
||||
typedef internal::Types$n<$for i, [[T$i]]> type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Types<$for i, [[internal::None]]> {
|
||||
typedef internal::Types0 type;
|
||||
};
|
||||
|
||||
$range i 1..n-1
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
$range k i+1..n
|
||||
template <$for j, [[typename T$j]]>
|
||||
struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
|
||||
typedef internal::Types$i<$for j, [[T$j]]> type;
|
||||
};
|
||||
|
||||
]]
|
||||
|
||||
namespace internal {
|
||||
|
||||
#define GTEST_TEMPLATE_ template <typename T> class
|
||||
|
||||
// The template "selector" struct TemplateSel<Tmpl> is used to
|
||||
// represent Tmpl, which must be a class template with one type
|
||||
// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
|
||||
// as the type Tmpl<T>. This allows us to actually instantiate the
|
||||
// template "selected" by TemplateSel<Tmpl>.
|
||||
//
|
||||
// This trick is necessary for simulating typedef for class templates,
|
||||
// which C++ doesn't support directly.
|
||||
template <GTEST_TEMPLATE_ Tmpl>
|
||||
struct TemplateSel {
|
||||
template <typename T>
|
||||
struct Bind {
|
||||
typedef Tmpl<T> type;
|
||||
};
|
||||
};
|
||||
|
||||
#define GTEST_BIND_(TmplSel, T) \
|
||||
TmplSel::template Bind<T>::type
|
||||
|
||||
// A unique struct template used as the default value for the
|
||||
// arguments of class template Templates. This allows us to simulate
|
||||
// variadic templates (e.g. Templates<int>, Templates<int, double>,
|
||||
// and etc), which C++ doesn't support directly.
|
||||
template <typename T>
|
||||
struct NoneT {};
|
||||
|
||||
// The following family of struct and struct templates are used to
|
||||
// represent template lists. In particular, TemplatesN<T1, T2, ...,
|
||||
// TN> represents a list of N templates (T1, T2, ..., and TN). Except
|
||||
// for Templates0, every struct in the family has two member types:
|
||||
// Head for the selector of the first template in the list, and Tail
|
||||
// for the rest of the list.
|
||||
|
||||
// The empty template list.
|
||||
struct Templates0 {};
|
||||
|
||||
// Template lists of length 1, 2, 3, and so on.
|
||||
|
||||
template <GTEST_TEMPLATE_ T1>
|
||||
struct Templates1 {
|
||||
typedef TemplateSel<T1> Head;
|
||||
typedef Templates0 Tail;
|
||||
};
|
||||
|
||||
$range i 2..n
|
||||
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
$range k 2..i
|
||||
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
|
||||
struct Templates$i {
|
||||
typedef TemplateSel<T1> Head;
|
||||
typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
|
||||
};
|
||||
|
||||
|
||||
]]
|
||||
|
||||
// We don't want to require the users to write TemplatesN<...> directly,
|
||||
// as that would require them to count the length. Templates<...> is much
|
||||
// easier to write, but generates horrible messages when there is a
|
||||
// compiler error, as gcc insists on printing out each template
|
||||
// argument, even if it has the default value (this means Templates<list>
|
||||
// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
|
||||
// errors).
|
||||
//
|
||||
// Our solution is to combine the best part of the two approaches: a
|
||||
// user would write Templates<T1, ..., TN>, and Google Test will translate
|
||||
// that to TemplatesN<T1, ..., TN> internally to make error messages
|
||||
// readable. The translation is done by the 'type' member of the
|
||||
// Templates template.
|
||||
|
||||
$range i 1..n
|
||||
template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
|
||||
struct Templates {
|
||||
typedef Templates$n<$for i, [[T$i]]> type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Templates<$for i, [[NoneT]]> {
|
||||
typedef Templates0 type;
|
||||
};
|
||||
|
||||
$range i 1..n-1
|
||||
$for i [[
|
||||
$range j 1..i
|
||||
$range k i+1..n
|
||||
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
|
||||
struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
|
||||
typedef Templates$i<$for j, [[T$j]]> type;
|
||||
};
|
||||
|
||||
]]
|
||||
|
||||
// The TypeList template makes it possible to use either a single type
|
||||
// or a Types<...> list in TYPED_TEST_CASE() and
|
||||
// INSTANTIATE_TYPED_TEST_CASE_P().
|
||||
|
||||
template <typename T>
|
||||
struct TypeList { typedef Types1<T> type; };
|
||||
|
||||
|
||||
$range i 1..n
|
||||
template <$for i, [[typename T$i]]>
|
||||
struct TypeList<Types<$for i, [[T$i]]> > {
|
||||
typedef typename Types<$for i, [[T$i]]>::type type;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
||||
63
m4/gtest.m4
63
m4/gtest.m4
@@ -12,10 +12,10 @@ 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 tests using the Google C++ Testing Framework.]
|
||||
[(Default is enabled.)])],
|
||||
[],
|
||||
[enable_gtest=])
|
||||
[enable_gtest=check])
|
||||
AC_ARG_VAR([GTEST_CONFIG],
|
||||
[The exact path of Google Test's 'gtest-config' script.])
|
||||
AC_ARG_VAR([GTEST_CPPFLAGS],
|
||||
@@ -29,46 +29,33 @@ AC_ARG_VAR([GTEST_LIBS],
|
||||
AC_ARG_VAR([GTEST_VERSION],
|
||||
[The version of Google Test available.])
|
||||
HAVE_GTEST="no"
|
||||
AS_IF([test "x${enable_gtest}" != "xno"],
|
||||
[AC_MSG_CHECKING([for 'gtest-config'])
|
||||
AS_IF([test "x${enable_gtest}" != "xyes"],
|
||||
[AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
|
||||
[GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
|
||||
[GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
|
||||
AS_IF([test -x "${GTEST_CONFIG}"], [],
|
||||
[AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([dnl
|
||||
Unable to locate either a built or installed Google Test.
|
||||
The specific location '${enable_gtest}' was provided for a built or installed
|
||||
Google Test, but no 'gtest-config' script could be found at this location.])
|
||||
])],
|
||||
[AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
|
||||
AS_IF([test -x "${GTEST_CONFIG}"],
|
||||
[AC_MSG_RESULT([${GTEST_CONFIG}])
|
||||
m4_ifval([$1],
|
||||
[_gtest_min_version="--min-version=$1"
|
||||
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])],
|
||||
[_gtest_min_version="--min-version=0"
|
||||
[_min_version="--min-version=0"
|
||||
AC_MSG_CHECKING([for Google Test])])
|
||||
AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
|
||||
AS_IF([$GTEST_CONFIG $_min_version],
|
||||
[AC_MSG_RESULT([yes])
|
||||
HAVE_GTEST='yes'],
|
||||
[AC_MSG_RESULT([no])])],
|
||||
[AC_MSG_RESULT([no])])
|
||||
AS_IF([test "x${HAVE_GTEST}" = "xyes"],
|
||||
[GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
|
||||
GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
|
||||
GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
|
||||
GTEST_LIBS=`${GTEST_CONFIG} --libs`
|
||||
GTEST_VERSION=`${GTEST_CONFIG} --version`
|
||||
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([dnl
|
||||
Google Test was enabled, but no viable version could be found.])
|
||||
])])])
|
||||
[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"],
|
||||
[m4_ifval([$2], [$2])],
|
||||
[m4_ifval([$3], [$3])])
|
||||
[AS_IF([test "x$2" != "x"],[$2],[:])],
|
||||
[AS_IF([test "x$3" != "x"],[$3],[:])])
|
||||
])
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
# A sample Makefile for building Google Test and using it in user
|
||||
# tests. Please tweak it to suit your environment and project. You
|
||||
# may want to move it to your project's root directory.
|
||||
#
|
||||
# SYNOPSIS:
|
||||
#
|
||||
# make [all] - makes everything.
|
||||
# make TARGET - makes the given target.
|
||||
# make clean - removes all files generated by make.
|
||||
|
||||
# Please tweak the following variable definitions as needed by your
|
||||
# project, except GTEST_HEADERS, which you can use in your own targets
|
||||
# but shouldn't modify.
|
||||
|
||||
# Points to the root of Google Test, relative to where this file is.
|
||||
# Remember to tweak this if you move this file.
|
||||
GTEST_DIR = ..
|
||||
|
||||
# Where to find user code.
|
||||
USER_DIR = ../samples
|
||||
|
||||
# Flags passed to the preprocessor.
|
||||
CPPFLAGS += -I$(GTEST_DIR) -I$(GTEST_DIR)/include
|
||||
|
||||
# Flags passed to the C++ compiler.
|
||||
CXXFLAGS += -g
|
||||
|
||||
# All tests produced by this Makefile. Remember to add new tests you
|
||||
# created to the list.
|
||||
TESTS = sample1_unittest
|
||||
|
||||
# All Google Test headers. Usually you shouldn't change this
|
||||
# definition.
|
||||
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
|
||||
$(GTEST_DIR)/include/gtest/internal/*.h
|
||||
|
||||
# House-keeping build targets.
|
||||
|
||||
all : $(TESTS)
|
||||
|
||||
clean :
|
||||
rm -f $(TESTS) gtest.a gtest_main.a *.o
|
||||
|
||||
# Builds gtest.a and gtest_main.a.
|
||||
|
||||
# Usually you shouldn't tweak such internal variables, indicated by a
|
||||
# trailing _.
|
||||
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
|
||||
|
||||
# For simplicity and to avoid depending on Google Test's
|
||||
# implementation details, the dependencies specified below are
|
||||
# conservative and not optimized. This is fine as Google Test
|
||||
# compiles fast and for ordinary users its source rarely changes.
|
||||
gtest-all.o : $(GTEST_SRCS_)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest-all.cc
|
||||
|
||||
gtest_main.o : $(GTEST_SRCS_)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest_main.cc
|
||||
|
||||
gtest.a : gtest-all.o
|
||||
$(AR) $(ARFLAGS) $@ $^
|
||||
|
||||
gtest_main.a : gtest-all.o gtest_main.o
|
||||
$(AR) $(ARFLAGS) $@ $^
|
||||
|
||||
# Builds a sample test. A test should link with either gtest.a or
|
||||
# gtest_main.a, depending on whether it defines its own main()
|
||||
# function.
|
||||
|
||||
sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc
|
||||
|
||||
sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
|
||||
$(USER_DIR)/sample1.h $(GTEST_HEADERS)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc
|
||||
|
||||
sample1_unittest : sample1.o sample1_unittest.o gtest_main.a
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
|
||||
@@ -1,85 +0,0 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_environment_test", "gtest_environment_test.vcproj", "{DF5FA93D-DC03-41A6-A18C-079198633450}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_color_test_", "gtest_color_test_.vcproj", "{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_env_var_test_", "gtest_env_var_test_.vcproj", "{569C6F70-F41C-47F3-A622-8A88DC43D452}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_output_test_", "gtest_output_test_.vcproj", "{A4903F73-ED6C-4972-863E-F7355EB0145E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_uninitialized_test_", "gtest_uninitialized_test_.vcproj", "{42B8A077-E162-4540-A688-246296ACAC1D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32
|
||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32
|
||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32
|
||||
{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32
|
||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32
|
||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32
|
||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32
|
||||
{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32
|
||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32
|
||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32
|
||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32
|
||||
{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32
|
||||
{DF5FA93D-DC03-41A6-A18C-079198633450}.Debug.ActiveCfg = Debug|Win32
|
||||
{DF5FA93D-DC03-41A6-A18C-079198633450}.Debug.Build.0 = Debug|Win32
|
||||
{DF5FA93D-DC03-41A6-A18C-079198633450}.Release.ActiveCfg = Release|Win32
|
||||
{DF5FA93D-DC03-41A6-A18C-079198633450}.Release.Build.0 = Release|Win32
|
||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32
|
||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32
|
||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32
|
||||
{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32
|
||||
{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}.Debug.ActiveCfg = Debug|Win32
|
||||
{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}.Debug.Build.0 = Debug|Win32
|
||||
{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}.Release.ActiveCfg = Release|Win32
|
||||
{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}.Release.Build.0 = Release|Win32
|
||||
{569C6F70-F41C-47F3-A622-8A88DC43D452}.Debug.ActiveCfg = Debug|Win32
|
||||
{569C6F70-F41C-47F3-A622-8A88DC43D452}.Debug.Build.0 = Debug|Win32
|
||||
{569C6F70-F41C-47F3-A622-8A88DC43D452}.Release.ActiveCfg = Release|Win32
|
||||
{569C6F70-F41C-47F3-A622-8A88DC43D452}.Release.Build.0 = Release|Win32
|
||||
{A4903F73-ED6C-4972-863E-F7355EB0145E}.Debug.ActiveCfg = Debug|Win32
|
||||
{A4903F73-ED6C-4972-863E-F7355EB0145E}.Debug.Build.0 = Debug|Win32
|
||||
{A4903F73-ED6C-4972-863E-F7355EB0145E}.Release.ActiveCfg = Release|Win32
|
||||
{A4903F73-ED6C-4972-863E-F7355EB0145E}.Release.Build.0 = Release|Win32
|
||||
{42B8A077-E162-4540-A688-246296ACAC1D}.Debug.ActiveCfg = Debug|Win32
|
||||
{42B8A077-E162-4540-A688-246296ACAC1D}.Debug.Build.0 = Debug|Win32
|
||||
{42B8A077-E162-4540-A688-246296ACAC1D}.Release.ActiveCfg = Release|Win32
|
||||
{42B8A077-E162-4540-A688-246296ACAC1D}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,237 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest"
|
||||
ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="2"
|
||||
ReferencesPath="">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="$(OutDir)/gtestd.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="2"
|
||||
ReferencesPath=""..\include";".."">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="$(OutDir)/gtest.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\src\gtest-death-test.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-filepath.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-test-part.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-port.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-typed-test.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-death-test-internal.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-death-test.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-filepath.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-internal-inl.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-internal.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-message.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-port.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-spi.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-string.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest_pred_impl.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest_prod.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,144 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_color_test_"
|
||||
ProjectGUID="{ABC5A7E8-072C-4A2D-B186-19EA5394B9C6}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_color_test_.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_color_test_.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_color_test_.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_color_test_.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,144 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_env_var_test_"
|
||||
ProjectGUID="{569C6F70-F41C-47F3-A622-8A88DC43D452}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_env_var_test_.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_env_var_test_.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_env_var_test_.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_env_var_test_.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,144 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_environment_test"
|
||||
ProjectGUID="{DF5FA93D-DC03-41A6-A18C-079198633450}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_environment_test.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_environment_test.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_environment_test.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,165 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_main"
|
||||
ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="2"
|
||||
ReferencesPath="">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="2"
|
||||
ReferencesPath=""..\include";".."">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="$(OutDir)/$(ProjectName).lib"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\src\gtest_main.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-death-test-internal.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-death-test.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-filepath.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\gtest-internal-inl.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-internal.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-message.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-port.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest-spi.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\internal\gtest-string.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest_pred_impl.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\include\gtest\gtest_prod.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,147 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_output_test_"
|
||||
ProjectGUID="{A4903F73-ED6C-4972-863E-F7355EB0145E}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_output_test_.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_output_test_.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_output_test_.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_output_test_.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
BasicRuntimeChecks="0"
|
||||
UsePrecompiledHeader="0"
|
||||
DebugInformationFormat="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,164 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_prod_test"
|
||||
ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_prod_test.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
||||
Name="gtest_main"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_prod_test.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\test\production.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
<File
|
||||
RelativePath="..\test\production.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,144 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_uninitialized_test_"
|
||||
ProjectGUID="{42B8A077-E162-4540-A688-246296ACAC1D}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_uninitialized_test_.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_uninitialized_test_.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_uninitialized_test_.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
|
||||
Name="gtest"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_uninitialized_test_.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,147 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="gtest_unittest"
|
||||
ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="4"
|
||||
UsePrecompiledHeader="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/gtest_unittest.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
<ProjectReference
|
||||
ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
|
||||
Name="gtest_main"/>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\test\gtest_unittest.cc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
BasicRuntimeChecks="0"
|
||||
UsePrecompiledHeader="0"
|
||||
DebugInformationFormat="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""..";"..\include""
|
||||
UsePrecompiledHeader="0"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,120 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
|
||||
// This provides interface PrimeTable that determines whether a number is a
|
||||
// prime and determines a next prime number. This interface is used
|
||||
// in Google Test samples demonstrating use of parameterized tests.
|
||||
|
||||
#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
|
||||
#define GTEST_SAMPLES_PRIME_TABLES_H_
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
// The prime table interface.
|
||||
class PrimeTable {
|
||||
public:
|
||||
virtual ~PrimeTable() {}
|
||||
|
||||
// Returns true iff n is a prime number.
|
||||
virtual bool IsPrime(int n) const = 0;
|
||||
|
||||
// Returns the smallest prime number greater than p; or returns -1
|
||||
// if the next prime is beyond the capacity of the table.
|
||||
virtual int GetNextPrime(int p) const = 0;
|
||||
};
|
||||
|
||||
// Implementation #1 calculates the primes on-the-fly.
|
||||
class OnTheFlyPrimeTable : public PrimeTable {
|
||||
public:
|
||||
virtual bool IsPrime(int n) const {
|
||||
if (n <= 1) return false;
|
||||
|
||||
for (int i = 2; i*i <= n; i++) {
|
||||
// n is divisible by an integer other than 1 and itself.
|
||||
if ((n % i) == 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual int GetNextPrime(int p) const {
|
||||
for (int n = p + 1; n > 0; n++) {
|
||||
if (IsPrime(n)) return n;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
// Implementation #2 pre-calculates the primes and stores the result
|
||||
// in an array.
|
||||
class PreCalculatedPrimeTable : public PrimeTable {
|
||||
public:
|
||||
// 'max' specifies the maximum number the prime table holds.
|
||||
explicit PreCalculatedPrimeTable(int max)
|
||||
: is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
|
||||
CalculatePrimesUpTo(max);
|
||||
}
|
||||
virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
|
||||
|
||||
virtual bool IsPrime(int n) const {
|
||||
return 0 <= n && n < is_prime_size_ && is_prime_[n];
|
||||
}
|
||||
|
||||
virtual int GetNextPrime(int p) const {
|
||||
for (int n = p + 1; n < is_prime_size_; n++) {
|
||||
if (is_prime_[n]) return n;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private:
|
||||
void CalculatePrimesUpTo(int max) {
|
||||
::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
|
||||
is_prime_[0] = is_prime_[1] = false;
|
||||
|
||||
for (int i = 2; i <= max; i++) {
|
||||
if (!is_prime_[i]) continue;
|
||||
|
||||
// Marks all multiples of i (except i itself) as non-prime.
|
||||
for (int j = 2*i; j <= max; j += i) {
|
||||
is_prime_[j] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const int is_prime_size_;
|
||||
bool* const is_prime_;
|
||||
};
|
||||
|
||||
#endif // GTEST_SAMPLES_PRIME_TABLES_H_
|
||||
@@ -33,15 +33,13 @@
|
||||
|
||||
#include "sample2.h"
|
||||
|
||||
#include <string.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 ];
|
||||
memcpy(clone, c_string, len + 1);
|
||||
strcpy(clone, c_string);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
@@ -1,224 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// This sample shows how to test common properties of multiple
|
||||
// implementations of the same interface (aka interface tests).
|
||||
|
||||
// The interface and its implementations are in this header.
|
||||
#include "prime_tables.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// First, we define some factory functions for creating instances of
|
||||
// the implementations. You may be able to skip this step if all your
|
||||
// implementations can be constructed the same way.
|
||||
|
||||
template <class T>
|
||||
PrimeTable* CreatePrimeTable();
|
||||
|
||||
template <>
|
||||
PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
|
||||
return new OnTheFlyPrimeTable;
|
||||
}
|
||||
|
||||
template <>
|
||||
PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
|
||||
return new PreCalculatedPrimeTable(10000);
|
||||
}
|
||||
|
||||
// Then we define a test fixture class template.
|
||||
template <class T>
|
||||
class PrimeTableTest : public testing::Test {
|
||||
protected:
|
||||
// The ctor calls the factory function to create a prime table
|
||||
// implemented by T.
|
||||
PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
|
||||
|
||||
virtual ~PrimeTableTest() { delete table_; }
|
||||
|
||||
// Note that we test an implementation via the base interface
|
||||
// instead of the actual implementation class. This is important
|
||||
// for keeping the tests close to the real world scenario, where the
|
||||
// implementation is invoked via the base interface. It avoids
|
||||
// got-yas where the implementation class has a method that shadows
|
||||
// a method with the same name (but slightly different argument
|
||||
// types) in the base interface, for example.
|
||||
PrimeTable* const table_;
|
||||
};
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
|
||||
using testing::Types;
|
||||
|
||||
// Google Test offers two ways for reusing tests for different types.
|
||||
// The first is called "typed tests". You should use it if you
|
||||
// already know *all* the types you are gonna exercise when you write
|
||||
// the tests.
|
||||
|
||||
// To write a typed test case, first use
|
||||
//
|
||||
// TYPED_TEST_CASE(TestCaseName, TypeList);
|
||||
//
|
||||
// to declare it and specify the type parameters. As with TEST_F,
|
||||
// TestCaseName must match the test fixture name.
|
||||
|
||||
// The list of types we want to test.
|
||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
|
||||
|
||||
TYPED_TEST_CASE(PrimeTableTest, Implementations);
|
||||
|
||||
// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
|
||||
// similar to TEST_F.
|
||||
TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
||||
// Inside the test body, you can refer to the type parameter by
|
||||
// TypeParam, and refer to the fixture class by TestFixture. We
|
||||
// don't need them in this example.
|
||||
|
||||
// Since we are in the template world, C++ requires explicitly
|
||||
// writing 'this->' when referring to members of the fixture class.
|
||||
// This is something you have to learn to live with.
|
||||
EXPECT_FALSE(this->table_->IsPrime(-5));
|
||||
EXPECT_FALSE(this->table_->IsPrime(0));
|
||||
EXPECT_FALSE(this->table_->IsPrime(1));
|
||||
EXPECT_FALSE(this->table_->IsPrime(4));
|
||||
EXPECT_FALSE(this->table_->IsPrime(6));
|
||||
EXPECT_FALSE(this->table_->IsPrime(100));
|
||||
}
|
||||
|
||||
TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
|
||||
EXPECT_TRUE(this->table_->IsPrime(2));
|
||||
EXPECT_TRUE(this->table_->IsPrime(3));
|
||||
EXPECT_TRUE(this->table_->IsPrime(5));
|
||||
EXPECT_TRUE(this->table_->IsPrime(7));
|
||||
EXPECT_TRUE(this->table_->IsPrime(11));
|
||||
EXPECT_TRUE(this->table_->IsPrime(131));
|
||||
}
|
||||
|
||||
TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
|
||||
EXPECT_EQ(2, this->table_->GetNextPrime(0));
|
||||
EXPECT_EQ(3, this->table_->GetNextPrime(2));
|
||||
EXPECT_EQ(5, this->table_->GetNextPrime(3));
|
||||
EXPECT_EQ(7, this->table_->GetNextPrime(5));
|
||||
EXPECT_EQ(11, this->table_->GetNextPrime(7));
|
||||
EXPECT_EQ(131, this->table_->GetNextPrime(128));
|
||||
}
|
||||
|
||||
// That's it! Google Test will repeat each TYPED_TEST for each type
|
||||
// in the type list specified in TYPED_TEST_CASE. Sit back and be
|
||||
// happy that you don't have to define them multiple times.
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
using testing::Types;
|
||||
|
||||
// Sometimes, however, you don't yet know all the types that you want
|
||||
// to test when you write the tests. For example, if you are the
|
||||
// author of an interface and expect other people to implement it, you
|
||||
// might want to write a set of tests to make sure each implementation
|
||||
// conforms to some basic requirements, but you don't know what
|
||||
// implementations will be written in the future.
|
||||
//
|
||||
// How can you write the tests without committing to the type
|
||||
// parameters? That's what "type-parameterized tests" can do for you.
|
||||
// It is a bit more involved than typed tests, but in return you get a
|
||||
// test pattern that can be reused in many contexts, which is a big
|
||||
// win. Here's how you do it:
|
||||
|
||||
// First, define a test fixture class template. Here we just reuse
|
||||
// the PrimeTableTest fixture defined earlier:
|
||||
|
||||
template <class T>
|
||||
class PrimeTableTest2 : public PrimeTableTest<T> {
|
||||
};
|
||||
|
||||
// Then, declare the test case. The argument is the name of the test
|
||||
// fixture, and also the name of the test case (as usual). The _P
|
||||
// suffix is for "parameterized" or "pattern".
|
||||
TYPED_TEST_CASE_P(PrimeTableTest2);
|
||||
|
||||
// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
|
||||
// similar to what you do with TEST_F.
|
||||
TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
|
||||
EXPECT_FALSE(this->table_->IsPrime(-5));
|
||||
EXPECT_FALSE(this->table_->IsPrime(0));
|
||||
EXPECT_FALSE(this->table_->IsPrime(1));
|
||||
EXPECT_FALSE(this->table_->IsPrime(4));
|
||||
EXPECT_FALSE(this->table_->IsPrime(6));
|
||||
EXPECT_FALSE(this->table_->IsPrime(100));
|
||||
}
|
||||
|
||||
TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
|
||||
EXPECT_TRUE(this->table_->IsPrime(2));
|
||||
EXPECT_TRUE(this->table_->IsPrime(3));
|
||||
EXPECT_TRUE(this->table_->IsPrime(5));
|
||||
EXPECT_TRUE(this->table_->IsPrime(7));
|
||||
EXPECT_TRUE(this->table_->IsPrime(11));
|
||||
EXPECT_TRUE(this->table_->IsPrime(131));
|
||||
}
|
||||
|
||||
TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
|
||||
EXPECT_EQ(2, this->table_->GetNextPrime(0));
|
||||
EXPECT_EQ(3, this->table_->GetNextPrime(2));
|
||||
EXPECT_EQ(5, this->table_->GetNextPrime(3));
|
||||
EXPECT_EQ(7, this->table_->GetNextPrime(5));
|
||||
EXPECT_EQ(11, this->table_->GetNextPrime(7));
|
||||
EXPECT_EQ(131, this->table_->GetNextPrime(128));
|
||||
}
|
||||
|
||||
// Type-parameterized tests involve one extra step: you have to
|
||||
// enumerate the tests you defined:
|
||||
REGISTER_TYPED_TEST_CASE_P(
|
||||
PrimeTableTest2, // The first argument is the test case name.
|
||||
// The rest of the arguments are the test names.
|
||||
ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
|
||||
|
||||
// At this point the test pattern is done. However, you don't have
|
||||
// any real test yet as you haven't said which types you want to run
|
||||
// the tests with.
|
||||
|
||||
// To turn the abstract test pattern into real tests, you instantiate
|
||||
// it with a list of types. Usually the test pattern will be defined
|
||||
// in a .h file, and anyone can #include and instantiate it. You can
|
||||
// even instantiate it more than once in the same program. To tell
|
||||
// different instances apart, you give each of them a name, which will
|
||||
// become part of the test case name and can be used in test filters.
|
||||
|
||||
// The list of types we want to test. Note that it doesn't have to be
|
||||
// defined at the time we write the TYPED_TEST_P()s.
|
||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
|
||||
PrimeTableImplementations;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated, // Instance name
|
||||
PrimeTableTest2, // Test case name
|
||||
PrimeTableImplementations); // Type list
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
@@ -1,132 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
|
||||
// This sample shows how to test common properties of multiple
|
||||
// implementations of an interface (aka interface tests) using
|
||||
// value-parameterized tests. Each test in the test case has
|
||||
// a parameter that is an interface pointer to an implementation
|
||||
// tested.
|
||||
|
||||
// The interface and its implementations are in this header.
|
||||
#include "prime_tables.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
using ::testing::TestWithParam;
|
||||
using ::testing::Values;
|
||||
|
||||
// As a general rule, tested objects should not be reused between tests.
|
||||
// Also, their constructors and destructors of tested objects can have
|
||||
// side effects. Thus you should create and destroy them for each test.
|
||||
// In this sample we will define a simple factory function for PrimeTable
|
||||
// objects. We will instantiate objects in test's SetUp() method and
|
||||
// delete them in TearDown() method.
|
||||
typedef PrimeTable* CreatePrimeTableFunc();
|
||||
|
||||
PrimeTable* CreateOnTheFlyPrimeTable() {
|
||||
return new OnTheFlyPrimeTable();
|
||||
}
|
||||
|
||||
template <size_t max_precalculated>
|
||||
PrimeTable* CreatePreCalculatedPrimeTable() {
|
||||
return new PreCalculatedPrimeTable(max_precalculated);
|
||||
}
|
||||
|
||||
// Inside the test body, fixture constructor, SetUp(), and TearDown()
|
||||
// you can refer to the test parameter by GetParam().
|
||||
// In this case, the test parameter is a PrimeTableFactory interface pointer
|
||||
// which we use in fixture's SetUp() to create and store an instance of
|
||||
// PrimeTable.
|
||||
class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
|
||||
public:
|
||||
virtual ~PrimeTableTest() { delete table_; }
|
||||
virtual void SetUp() { table_ = (*GetParam())(); }
|
||||
virtual void TearDown() {
|
||||
delete table_;
|
||||
table_ = NULL;
|
||||
}
|
||||
|
||||
protected:
|
||||
PrimeTable* table_;
|
||||
};
|
||||
|
||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
||||
EXPECT_FALSE(table_->IsPrime(-5));
|
||||
EXPECT_FALSE(table_->IsPrime(0));
|
||||
EXPECT_FALSE(table_->IsPrime(1));
|
||||
EXPECT_FALSE(table_->IsPrime(4));
|
||||
EXPECT_FALSE(table_->IsPrime(6));
|
||||
EXPECT_FALSE(table_->IsPrime(100));
|
||||
}
|
||||
|
||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
|
||||
EXPECT_TRUE(table_->IsPrime(2));
|
||||
EXPECT_TRUE(table_->IsPrime(3));
|
||||
EXPECT_TRUE(table_->IsPrime(5));
|
||||
EXPECT_TRUE(table_->IsPrime(7));
|
||||
EXPECT_TRUE(table_->IsPrime(11));
|
||||
EXPECT_TRUE(table_->IsPrime(131));
|
||||
}
|
||||
|
||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
|
||||
EXPECT_EQ(2, table_->GetNextPrime(0));
|
||||
EXPECT_EQ(3, table_->GetNextPrime(2));
|
||||
EXPECT_EQ(5, table_->GetNextPrime(3));
|
||||
EXPECT_EQ(7, table_->GetNextPrime(5));
|
||||
EXPECT_EQ(11, table_->GetNextPrime(7));
|
||||
EXPECT_EQ(131, table_->GetNextPrime(128));
|
||||
}
|
||||
|
||||
// In order to run value-parameterized tests, you need to instantiate them,
|
||||
// or bind them to a list of values which will be used as test parameters.
|
||||
// You can instantiate them in a different translation module, or even
|
||||
// instantiate them several times.
|
||||
//
|
||||
// Here, we instantiate our tests with a list of two PrimeTable object
|
||||
// factory functions:
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
OnTheFlyAndPreCalculated,
|
||||
PrimeTableTest,
|
||||
Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
|
||||
|
||||
#else
|
||||
|
||||
// Google Test doesn't support value-parameterized tests on some platforms
|
||||
// and compilers, such as MSVC 7.1. If we use conditional compilation to
|
||||
// compile out all code referring to the gtest_main library, MSVC linker
|
||||
// will not link that library at all and consequently complain about
|
||||
// missing entry point defined in that library (fatal error LNK1561:
|
||||
// entry point must be defined). This dummy test keeps gtest_main linked in.
|
||||
TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
@@ -1,173 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
|
||||
// This sample shows how to test code relying on some global flag variables.
|
||||
// Combine() helps with generating all possible combinations of such flags,
|
||||
// and each test is given one combination as a parameter.
|
||||
|
||||
// Use class definitions to test from this header.
|
||||
#include "prime_tables.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_COMBINE
|
||||
|
||||
// Suppose we want to introduce a new, improved implementation of PrimeTable
|
||||
// which combines speed of PrecalcPrimeTable and versatility of
|
||||
// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
|
||||
// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
|
||||
// appropriate under the circumstances. But in low memory conditions, it can be
|
||||
// told to instantiate without PrecalcPrimeTable instance at all and use only
|
||||
// OnTheFlyPrimeTable.
|
||||
class HybridPrimeTable : public PrimeTable {
|
||||
public:
|
||||
HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
|
||||
: on_the_fly_impl_(new OnTheFlyPrimeTable),
|
||||
precalc_impl_(force_on_the_fly ? NULL :
|
||||
new PreCalculatedPrimeTable(max_precalculated)),
|
||||
max_precalculated_(max_precalculated) {}
|
||||
virtual ~HybridPrimeTable() {
|
||||
delete on_the_fly_impl_;
|
||||
delete precalc_impl_;
|
||||
}
|
||||
|
||||
virtual bool IsPrime(int n) const {
|
||||
if (precalc_impl_ != NULL && n < max_precalculated_)
|
||||
return precalc_impl_->IsPrime(n);
|
||||
else
|
||||
return on_the_fly_impl_->IsPrime(n);
|
||||
}
|
||||
|
||||
virtual int GetNextPrime(int p) const {
|
||||
int next_prime = -1;
|
||||
if (precalc_impl_ != NULL && p < max_precalculated_)
|
||||
next_prime = precalc_impl_->GetNextPrime(p);
|
||||
|
||||
return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
|
||||
}
|
||||
|
||||
private:
|
||||
OnTheFlyPrimeTable* on_the_fly_impl_;
|
||||
PreCalculatedPrimeTable* precalc_impl_;
|
||||
int max_precalculated_;
|
||||
};
|
||||
|
||||
using ::testing::TestWithParam;
|
||||
using ::testing::Bool;
|
||||
using ::testing::Values;
|
||||
using ::testing::Combine;
|
||||
|
||||
// To test all code paths for HybridPrimeTable we must test it with numbers
|
||||
// both within and outside PreCalculatedPrimeTable's capacity and also with
|
||||
// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
|
||||
// accept different combinations of parameters for instantiating a
|
||||
// HybridPrimeTable instance.
|
||||
class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
// This can be written as
|
||||
//
|
||||
// bool force_on_the_fly;
|
||||
// int max_precalculated;
|
||||
// tie(force_on_the_fly, max_precalculated) = GetParam();
|
||||
//
|
||||
// once the Google C++ Style Guide allows use of ::std::tr1::tie.
|
||||
//
|
||||
bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
|
||||
int max_precalculated = ::std::tr1::get<1>(GetParam());
|
||||
table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
|
||||
}
|
||||
virtual void TearDown() {
|
||||
delete table_;
|
||||
table_ = NULL;
|
||||
}
|
||||
HybridPrimeTable* table_;
|
||||
};
|
||||
|
||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
|
||||
// Inside the test body, you can refer to the test parameter by GetParam().
|
||||
// In this case, the test parameter is a PrimeTable interface pointer which
|
||||
// we can use directly.
|
||||
// Please note that you can also save it in the fixture's SetUp() method
|
||||
// or constructor and use saved copy in the tests.
|
||||
|
||||
EXPECT_FALSE(table_->IsPrime(-5));
|
||||
EXPECT_FALSE(table_->IsPrime(0));
|
||||
EXPECT_FALSE(table_->IsPrime(1));
|
||||
EXPECT_FALSE(table_->IsPrime(4));
|
||||
EXPECT_FALSE(table_->IsPrime(6));
|
||||
EXPECT_FALSE(table_->IsPrime(100));
|
||||
}
|
||||
|
||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
|
||||
EXPECT_TRUE(table_->IsPrime(2));
|
||||
EXPECT_TRUE(table_->IsPrime(3));
|
||||
EXPECT_TRUE(table_->IsPrime(5));
|
||||
EXPECT_TRUE(table_->IsPrime(7));
|
||||
EXPECT_TRUE(table_->IsPrime(11));
|
||||
EXPECT_TRUE(table_->IsPrime(131));
|
||||
}
|
||||
|
||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
|
||||
EXPECT_EQ(2, table_->GetNextPrime(0));
|
||||
EXPECT_EQ(3, table_->GetNextPrime(2));
|
||||
EXPECT_EQ(5, table_->GetNextPrime(3));
|
||||
EXPECT_EQ(7, table_->GetNextPrime(5));
|
||||
EXPECT_EQ(11, table_->GetNextPrime(7));
|
||||
EXPECT_EQ(131, table_->GetNextPrime(128));
|
||||
}
|
||||
|
||||
// In order to run value-parameterized tests, you need to instantiate them,
|
||||
// or bind them to a list of values which will be used as test parameters.
|
||||
// You can instantiate them in a different translation module, or even
|
||||
// instantiate them several times.
|
||||
//
|
||||
// Here, we instantiate our tests with a list of parameters. We must combine
|
||||
// all variations of the boolean flag suppressing PrecalcPrimeTable and some
|
||||
// meaningful values for tests. We choose a small value (1), and a value that
|
||||
// will put some of the tested numbers beyond the capability of the
|
||||
// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
|
||||
// possible combinations.
|
||||
INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
|
||||
PrimeTableTest,
|
||||
Combine(Bool(), Values(1, 10)));
|
||||
|
||||
#else
|
||||
|
||||
// Google Test doesn't support Combine() on some platforms and compilers,
|
||||
// such as MSVC 7.1. If we use conditional compilation to compile out
|
||||
// all code referring to the gtest_main library, MSVC linker will not
|
||||
// link that library at all and consequently complain about missing entry
|
||||
// point defined in that library (fatal error LNK1561: entry point must
|
||||
// be defined). This dummy test keeps gtest_main linked in.
|
||||
TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
|
||||
|
||||
#endif // GTEST_HAS_COMBINE
|
||||
268
scons/SConscript
268
scons/SConscript
@@ -1,268 +0,0 @@
|
||||
#!/usr/bin/python2.4
|
||||
#
|
||||
# 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.
|
||||
|
||||
|
||||
"""Builds the Google Test (gtest) lib; this is for Windows projects
|
||||
using SCons and can probably be easily extended for cross-platform
|
||||
SCons builds. The compilation settings from your project will be used,
|
||||
with some specific flags required for gtest added.
|
||||
|
||||
You should be able to call this file from more or less any SConscript
|
||||
file.
|
||||
|
||||
You can optionally set a variable on the construction environment to
|
||||
have the unit test executables copied to your output directory. The
|
||||
variable should be env['EXE_OUTPUT'].
|
||||
|
||||
Another optional variable is env['LIB_OUTPUT']. If set, the generated
|
||||
libraries are copied to the folder indicated by the variable.
|
||||
|
||||
If you place the gtest sources within your own project's source
|
||||
directory, you should be able to call this SConscript file simply as
|
||||
follows:
|
||||
|
||||
# -- cut here --
|
||||
# Build gtest library; first tell it where to copy executables.
|
||||
env['EXE_OUTPUT'] = '#/mybuilddir/mybuildmode' # example, optional
|
||||
env['LIB_OUTPUT'] = '#/mybuilddir/mybuildmode/lib'
|
||||
env.SConscript('whateverpath/gtest/scons/SConscript')
|
||||
# -- cut here --
|
||||
|
||||
If on the other hand you place the gtest sources in a directory
|
||||
outside of your project's source tree, you would use a snippet similar
|
||||
to the following:
|
||||
|
||||
# -- cut here --
|
||||
|
||||
# The following assumes that $BUILD_DIR refers to the root of the
|
||||
# directory for your current build mode, e.g. "#/mybuilddir/mybuildmode"
|
||||
|
||||
# Build gtest library; as it is outside of our source root, we need to
|
||||
# tell SCons that the directory it will refer to as
|
||||
# e.g. $BUILD_DIR/gtest is actually on disk in original form as
|
||||
# ../../gtest (relative to your project root directory). Recall that
|
||||
# SCons by default copies all source files into the build directory
|
||||
# before building.
|
||||
gtest_dir = env.Dir('$BUILD_DIR/gtest')
|
||||
|
||||
# Modify this part to point to gtest relative to the current
|
||||
# SConscript or SConstruct file's directory. The ../.. path would
|
||||
# be different per project, to locate the base directory for gtest.
|
||||
gtest_dir.addRepository(env.Dir('../../gtest'))
|
||||
|
||||
# Tell the gtest SCons file where to copy executables.
|
||||
env['EXE_OUTPUT'] = '$BUILD_DIR' # example, optional
|
||||
|
||||
# Call the gtest SConscript to build gtest.lib and unit tests. The
|
||||
# location of the library should end up as
|
||||
# '$BUILD_DIR/gtest/scons/gtest.lib'
|
||||
env.SConscript(env.File('scons/SConscript', gtest_dir))
|
||||
|
||||
# -- cut here --
|
||||
"""
|
||||
|
||||
|
||||
__author__ = 'joi@google.com (Joi Sigurdsson)'
|
||||
|
||||
|
||||
Import('env')
|
||||
env = env.Clone()
|
||||
|
||||
# Include paths to gtest headers are relative to either the gtest
|
||||
# directory or the 'include' subdirectory of it, and this SConscript
|
||||
# file is one directory deeper than the gtest directory.
|
||||
env.Prepend(CPPPATH = ['..',
|
||||
'../include'])
|
||||
|
||||
# Sources used by base library and library that includes main.
|
||||
gtest_source = '../src/gtest-all.cc'
|
||||
gtest_main_source = '../src/gtest_main.cc'
|
||||
|
||||
# gtest.lib to be used by most apps (if you have your own main
|
||||
# function)
|
||||
gtest = env.StaticLibrary(target='gtest',
|
||||
source=[gtest_source])
|
||||
|
||||
# gtest_main.lib can be used if you just want a basic main function;
|
||||
# it is also used by the tests for Google Test itself.
|
||||
gtest_main = env.StaticLibrary(target='gtest_main',
|
||||
source=[gtest_source, gtest_main_source])
|
||||
|
||||
env_with_exceptions = env.Clone()
|
||||
platform = env_with_exceptions['PLATFORM']
|
||||
if platform == 'win32':
|
||||
env_with_exceptions.Append(CCFLAGS = ['/EHsc'])
|
||||
env_with_exceptions.Append(CPPDEFINES = '_HAS_EXCEPTIONS=1')
|
||||
|
||||
gtest_ex_obj = env_with_exceptions.Object(target='gtest_ex',
|
||||
source=gtest_source)
|
||||
gtest_main_ex_obj = env_with_exceptions.Object(target='gtest_main_ex',
|
||||
source=gtest_main_source)
|
||||
|
||||
gtest_ex_main = env_with_exceptions.StaticLibrary(
|
||||
target='gtest_ex_main',
|
||||
source=gtest_ex_obj + gtest_main_ex_obj)
|
||||
|
||||
# Install the libraries if needed.
|
||||
if 'LIB_OUTPUT' in env.Dictionary():
|
||||
env.Install('$LIB_OUTPUT', source=[gtest, gtest_main, gtest_ex_main])
|
||||
|
||||
|
||||
def ConstructSourceList(target, dir_prefix, additional_sources=None):
|
||||
"""Helper to create source file list for gtest binaries.
|
||||
|
||||
Args:
|
||||
target: The basename of the target's main source file.
|
||||
dir_prefix: The path to prefix the main source file.
|
||||
gtest_lib: The gtest lib to use.
|
||||
additional_sources: A list of additional source files in the target.
|
||||
"""
|
||||
source = [env.File('%s.cc' % target, env.Dir(dir_prefix))]
|
||||
if additional_sources:
|
||||
source += additional_sources
|
||||
return source
|
||||
|
||||
def GtestBinary(env, target, gtest_lib, sources):
|
||||
"""Helper to create gtest binaries: tests, samples, etc.
|
||||
|
||||
Args:
|
||||
env: The SCons construction environment to use to build.
|
||||
target: The basename of the target's main source file, also used as target
|
||||
name.
|
||||
gtest_lib: The gtest lib to use.
|
||||
sources: A list of source files in the target.
|
||||
"""
|
||||
unit_test = env.Program(target=target, source=sources, LIBS=[gtest_lib])
|
||||
if 'EXE_OUTPUT' in env.Dictionary():
|
||||
env.Install('$EXE_OUTPUT', source=[unit_test])
|
||||
|
||||
def GtestUnitTest(env, target, gtest_lib, additional_sources=None):
|
||||
"""Helper to create gtest unit tests.
|
||||
|
||||
Args:
|
||||
env: The SCons construction environment to use to build.
|
||||
target: The basename of the target unit test .cc file.
|
||||
gtest_lib: The gtest lib to use.
|
||||
additional_sources: A list of additional source files in the target.
|
||||
"""
|
||||
GtestBinary(env,
|
||||
target,
|
||||
gtest_lib,
|
||||
ConstructSourceList(target, "../test",
|
||||
additional_sources=additional_sources))
|
||||
|
||||
GtestUnitTest(env, 'gtest-filepath_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-message_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-options_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest_environment_test', gtest)
|
||||
GtestUnitTest(env, 'gtest_main_unittest', gtest_main)
|
||||
GtestUnitTest(env, 'gtest_no_test_unittest', gtest)
|
||||
GtestUnitTest(env, 'gtest_pred_impl_unittest', gtest_main)
|
||||
GtestUnitTest(env, 'gtest_prod_test', gtest_main,
|
||||
additional_sources=['../test/production.cc'])
|
||||
GtestUnitTest(env, 'gtest_repeat_test', gtest)
|
||||
GtestUnitTest(env, 'gtest_sole_header_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-test-part_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-typed-test_test', gtest_main,
|
||||
additional_sources=['../test/gtest-typed-test2_test.cc'])
|
||||
GtestUnitTest(env, 'gtest-param-test_test', gtest,
|
||||
additional_sources=['../test/gtest-param-test2_test.cc'])
|
||||
GtestUnitTest(env, 'gtest_unittest', gtest_main)
|
||||
GtestUnitTest(env, 'gtest_output_test_', gtest)
|
||||
GtestUnitTest(env, 'gtest_color_test_', gtest)
|
||||
GtestUnitTest(env, 'gtest-linked_ptr_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-port_test', gtest_main)
|
||||
GtestUnitTest(env, 'gtest-death-test_test', gtest_main)
|
||||
|
||||
gtest_unittest_ex_obj = env_with_exceptions.Object(
|
||||
target='gtest_unittest_ex',
|
||||
source='../test/gtest_unittest.cc')
|
||||
GtestBinary(env_with_exceptions,
|
||||
'gtest_ex_unittest',
|
||||
gtest_ex_main,
|
||||
gtest_unittest_ex_obj)
|
||||
|
||||
# TODO(wan@google.com) Add these unit tests:
|
||||
# - gtest_break_on_failure_unittest_
|
||||
# - gtest_filter_unittest_
|
||||
# - gtest_help_test_
|
||||
# - gtest_list_tests_unittest_
|
||||
# - gtest_throw_on_failure_ex_test
|
||||
# - gtest_throw_on_failure_test_
|
||||
# - gtest_xml_outfile1_test_
|
||||
# - gtest_xml_outfile2_test_
|
||||
# - gtest_xml_output_unittest_
|
||||
|
||||
# We need to disable some optimization flags for a couple of tests,
|
||||
# otherwise the redirection of stdout does not work (apparently
|
||||
# because of a compiler bug).
|
||||
special_env = env.Clone()
|
||||
linker_flags = special_env['LINKFLAGS']
|
||||
for flag in ["/O1", "/Os", "/Og", "/Oy"]:
|
||||
if flag in linker_flags:
|
||||
linker_flags.remove(flag)
|
||||
GtestUnitTest(special_env, 'gtest_env_var_test_', gtest)
|
||||
GtestUnitTest(special_env, 'gtest_uninitialized_test_', gtest)
|
||||
|
||||
def GtestSample(env, target, gtest_lib, additional_sources=None):
|
||||
"""Helper to create gtest samples.
|
||||
|
||||
Args:
|
||||
env: The SCons construction environment to use to build.
|
||||
target: The basename of the target unit test .cc file.
|
||||
gtest_lib: The gtest lib to use.
|
||||
additional_sources: A list of additional source files in the target.
|
||||
"""
|
||||
GtestBinary(env,
|
||||
target,
|
||||
gtest_lib,
|
||||
ConstructSourceList(target, "../samples",
|
||||
additional_sources=additional_sources))
|
||||
|
||||
# Use the GTEST_BUILD_SAMPLES build variable to control building of samples.
|
||||
# In your SConstruct file, add
|
||||
# vars = Variables()
|
||||
# vars.Add(BoolVariable('GTEST_BUILD_SAMPLES', 'Build samples', True))
|
||||
# my_environment = Environment(variables = vars, ...)
|
||||
# Then, in the command line use GTEST_BUILD_SAMPLES=true to enable them.
|
||||
#
|
||||
if env.get('GTEST_BUILD_SAMPLES', False):
|
||||
sample1_obj = env.Object('../samples/sample1.cc')
|
||||
GtestSample(env, 'sample1_unittest', gtest_main,
|
||||
additional_sources=[sample1_obj])
|
||||
GtestSample(env, 'sample2_unittest', gtest_main,
|
||||
additional_sources=['../samples/sample2.cc'])
|
||||
GtestSample(env, 'sample3_unittest', gtest_main)
|
||||
GtestSample(env, 'sample5_unittest', gtest_main,
|
||||
additional_sources=[sample1_obj])
|
||||
GtestSample(env, 'sample6_unittest', gtest_main)
|
||||
GtestSample(env, 'sample7_unittest', gtest_main)
|
||||
GtestSample(env, 'sample8_unittest', gtest_main)
|
||||
@@ -1,247 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2009, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""fuse_gtest_files.py v0.1.0
|
||||
Fuses Google Test source code into a .h file and a .cc file.
|
||||
|
||||
SYNOPSIS
|
||||
fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
|
||||
|
||||
Scans GTEST_ROOT_DIR for Google Test source code, and generates
|
||||
two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
|
||||
Then you can build your tests by adding OUTPUT_DIR to the include
|
||||
search path and linking with OUTPUT_DIR/gtest/gtest-all.cc. These
|
||||
two files contain everything you need to use Google Test. Hence
|
||||
you can "install" Google Test by copying them to wherever you want.
|
||||
|
||||
GTEST_ROOT_DIR can be omitted and defaults to the parent directory
|
||||
of the directory holding the fuse_gtest_files.py script.
|
||||
|
||||
EXAMPLES
|
||||
./fuse_gtest_files.py fused_gtest
|
||||
./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
|
||||
|
||||
This tool is experimental. In particular, it assumes that there is no
|
||||
conditional inclusion of Google Test headers. Please report any
|
||||
problems to googletestframework@googlegroups.com. You can read
|
||||
http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
|
||||
more information.
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import os
|
||||
import re
|
||||
import sets
|
||||
import sys
|
||||
|
||||
# Regex for matching '#include <gtest/...>'.
|
||||
INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*<(gtest/.+)>')
|
||||
|
||||
# Regex for matching '#include "src/..."'.
|
||||
INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
|
||||
|
||||
# Where to find the source files.
|
||||
GTEST_H_SEED = 'include/gtest/gtest.h'
|
||||
GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
|
||||
GTEST_ALL_CC_SEED = 'src/gtest-all.cc'
|
||||
|
||||
# Where to put the generated files.
|
||||
GTEST_H_OUTPUT = 'gtest/gtest.h'
|
||||
GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
|
||||
|
||||
|
||||
def GetGTestRootDir():
|
||||
"""Returns the absolute path to the Google Test root directory.
|
||||
|
||||
We assume that this script is in a sub-directory of the Google Test root.
|
||||
"""
|
||||
|
||||
my_path = sys.argv[0] # Path to this script.
|
||||
my_dir = os.path.dirname(my_path)
|
||||
if not my_dir:
|
||||
my_dir = '.'
|
||||
|
||||
return os.path.abspath(os.path.join(my_dir, '..'))
|
||||
|
||||
|
||||
def ValidateGTestRootDir(gtest_root):
|
||||
"""Makes sure gtest_root points to a valid gtest root directory.
|
||||
|
||||
The function aborts the program on failure.
|
||||
"""
|
||||
|
||||
def VerifyFileExists(relative_path):
|
||||
"""Verifies that the given file exists; aborts on failure.
|
||||
|
||||
relative_path is the file path relative to the gtest root.
|
||||
"""
|
||||
|
||||
if not os.path.isfile(os.path.join(gtest_root, relative_path)):
|
||||
print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
|
||||
gtest_root)
|
||||
print ('Please either specify a valid Google Test root directory '
|
||||
'or omit it on the command line.')
|
||||
sys.exit(1)
|
||||
|
||||
VerifyFileExists(GTEST_H_SEED)
|
||||
VerifyFileExists(GTEST_ALL_CC_SEED)
|
||||
|
||||
|
||||
def ValidateOutputDir(output_dir):
|
||||
"""Makes sure output_dir points to a valid output directory.
|
||||
|
||||
The function aborts the program on failure.
|
||||
"""
|
||||
|
||||
def VerifyOutputFile(relative_path):
|
||||
"""Verifies that the given output file path is valid.
|
||||
|
||||
relative_path is relative to the output_dir directory.
|
||||
"""
|
||||
|
||||
# Makes sure the output file either doesn't exist or can be overwritten.
|
||||
output_file = os.path.join(output_dir, relative_path)
|
||||
if os.path.exists(output_file):
|
||||
print ('%s already exists in directory %s - overwrite it? (y/N) ' %
|
||||
(relative_path, output_dir))
|
||||
answer = sys.stdin.readline().strip()
|
||||
if answer not in ['y', 'Y']:
|
||||
print 'ABORTED.'
|
||||
sys.exit(1)
|
||||
|
||||
# Makes sure the directory holding the output file exists; creates
|
||||
# it and all its ancestors if necessary.
|
||||
parent_directory = os.path.dirname(output_file)
|
||||
if not os.path.isdir(parent_directory):
|
||||
os.makedirs(parent_directory)
|
||||
|
||||
VerifyOutputFile(GTEST_H_OUTPUT)
|
||||
VerifyOutputFile(GTEST_ALL_CC_OUTPUT)
|
||||
|
||||
|
||||
def FuseGTestH(gtest_root, output_dir):
|
||||
"""Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
|
||||
|
||||
output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
|
||||
processed_files = sets.Set() # Holds all gtest headers we've processed.
|
||||
|
||||
def ProcessFile(gtest_header_path):
|
||||
"""Processes the given gtest header file."""
|
||||
|
||||
# We don't process the same header twice.
|
||||
if gtest_header_path in processed_files:
|
||||
return
|
||||
|
||||
processed_files.add(gtest_header_path)
|
||||
|
||||
# Reads each line in the given gtest header.
|
||||
for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
|
||||
m = INCLUDE_GTEST_FILE_REGEX.match(line)
|
||||
if m:
|
||||
# It's '#include <gtest/...>' - let's process it recursively.
|
||||
ProcessFile('include/' + m.group(1))
|
||||
else:
|
||||
# Otherwise we copy the line unchanged to the output file.
|
||||
output_file.write(line)
|
||||
|
||||
ProcessFile(GTEST_H_SEED)
|
||||
output_file.close()
|
||||
|
||||
|
||||
def FuseGTestAllCc(gtest_root, output_dir):
|
||||
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
|
||||
|
||||
output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
|
||||
processed_files = sets.Set()
|
||||
|
||||
def ProcessFile(gtest_source_file):
|
||||
"""Processes the given gtest source file."""
|
||||
|
||||
# We don't process the same #included file twice.
|
||||
if gtest_source_file in processed_files:
|
||||
return
|
||||
|
||||
processed_files.add(gtest_source_file)
|
||||
|
||||
# Reads each line in the given gtest source file.
|
||||
for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
|
||||
m = INCLUDE_GTEST_FILE_REGEX.match(line)
|
||||
if m:
|
||||
if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
|
||||
# It's '#include <gtest/gtest-spi.h>'. This file is not
|
||||
# #included by <gtest/gtest.h>, so we need to process it.
|
||||
ProcessFile(GTEST_SPI_H_SEED)
|
||||
else:
|
||||
# It's '#include <gtest/foo.h>' where foo is not gtest-spi.
|
||||
# We treat it as '#include <gtest/gtest.h>', as all other
|
||||
# gtest headers are being fused into gtest.h and cannot be
|
||||
# #included directly.
|
||||
|
||||
# There is no need to #include <gtest/gtest.h> more than once.
|
||||
if not GTEST_H_SEED in processed_files:
|
||||
processed_files.add(GTEST_H_SEED)
|
||||
output_file.write('#include <%s>\n' % (GTEST_H_OUTPUT,))
|
||||
else:
|
||||
m = INCLUDE_SRC_FILE_REGEX.match(line)
|
||||
if m:
|
||||
# It's '#include "src/foo"' - let's process it recursively.
|
||||
ProcessFile(m.group(1))
|
||||
else:
|
||||
output_file.write(line)
|
||||
|
||||
ProcessFile(GTEST_ALL_CC_SEED)
|
||||
output_file.close()
|
||||
|
||||
|
||||
def FuseGTest(gtest_root, output_dir):
|
||||
ValidateGTestRootDir(gtest_root)
|
||||
ValidateOutputDir(output_dir)
|
||||
|
||||
FuseGTestH(gtest_root, output_dir)
|
||||
FuseGTestAllCc(gtest_root, output_dir)
|
||||
|
||||
|
||||
def main():
|
||||
argc = len(sys.argv)
|
||||
if argc == 2:
|
||||
# fuse_gtest_files.py OUTPUT_DIR
|
||||
FuseGTest(GetGTestRootDir(), sys.argv[1])
|
||||
elif argc == 3:
|
||||
# fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
|
||||
FuseGTest(sys.argv[1], sys.argv[2])
|
||||
else:
|
||||
print __doc__
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -149,11 +149,11 @@ def HeaderPreamble(n):
|
||||
// Please email googletestframework@googlegroups.com if you need
|
||||
// support for higher arities.
|
||||
|
||||
// GTEST_ASSERT_ is the basic statement to which all of the assertions
|
||||
// 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_ \\
|
||||
#define GTEST_ASSERT(expression, on_failure) \\
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER \\
|
||||
if (const ::testing::AssertionResult gtest_ar = (expression)) \\
|
||||
; \\
|
||||
else \\
|
||||
@@ -257,35 +257,35 @@ AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
|
||||
|
||||
// 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)
|
||||
#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
|
||||
#define GTEST_PRED%(n)s(pred, %(vs)s, on_failure)\\
|
||||
GTEST_ASSERT(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
|
||||
|
||||
impl += Iter(n, """, \\
|
||||
#v%s""")
|
||||
#v%s""")
|
||||
|
||||
impl += """, \\
|
||||
pred"""
|
||||
pred"""
|
||||
|
||||
impl += Iter(n, """, \\
|
||||
v%s""")
|
||||
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_)
|
||||
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_)
|
||||
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_)
|
||||
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_)
|
||||
GTEST_PRED%(n)s(pred, %(vs)s, GTEST_FATAL_FAILURE)
|
||||
|
||||
""" % DEFS
|
||||
|
||||
|
||||
@@ -1,61 +1,56 @@
|
||||
#!/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()
|
||||
{
|
||||
echo "Usage: gtest-config [OPTIONS...]"
|
||||
cat <<EOF
|
||||
Usage: gtest-config [OPTIONS...]
|
||||
EOF
|
||||
}
|
||||
|
||||
show_help()
|
||||
{
|
||||
show_usage
|
||||
cat <<\EOF
|
||||
cat <<EOF
|
||||
|
||||
The `gtest-config' script provides access to the necessary compile and linking
|
||||
flags to connect with Google C++ Testing Framework, both in a build prior to
|
||||
installation, and on the system proper after installation. The installation
|
||||
overrides may be issued in combination with any other queries, but will only
|
||||
affect installation queries if called on a built but not installed gtest. The
|
||||
installation queries may not be issued with any other types of queries, and
|
||||
only one installation query may be made at a time. The version queries and
|
||||
compiler flag queries may be combined as desired but not mixed. Different
|
||||
version queries are always combined with logical "and" semantics, and only the
|
||||
last of any particular query is used while all previous ones ignored. All
|
||||
versions must be specified as a sequence of numbers separated by periods.
|
||||
Compiler flag queries output the union of the sets of flags when combined.
|
||||
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."
|
||||
|
||||
g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
|
||||
g++ $(gtest-config --ldflags --libs) -o foo foo.o
|
||||
|
||||
# When using a built but not installed Google Test:
|
||||
g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
|
||||
|
||||
# When using an installed Google Test, but with installation overrides:
|
||||
export GTEST_PREFIX="/opt"
|
||||
g++ $(gtest-config --libdir="/opt/lib64" ...) ...
|
||||
|
||||
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 Overrides:
|
||||
--prefix=<dir> overrides the installation prefix
|
||||
--exec-prefix=<dir> overrides the executable installation prefix
|
||||
--libdir=<dir> overrides the library installation prefix
|
||||
--includedir=<dir> overrides the header file installation prefix
|
||||
|
||||
Installation Queries:
|
||||
--prefix installation prefix
|
||||
--exec-prefix executable installation prefix
|
||||
--libdir library installation directory
|
||||
--includedir header file installation directory
|
||||
--version the version of the Google Test installation
|
||||
--version the version of the INC installation
|
||||
|
||||
Version Queries:
|
||||
--min-version=VERSION return 0 if the version is at least VERSION
|
||||
@@ -73,13 +68,11 @@ EOF
|
||||
|
||||
# This function bounds our version with a min and a max. It uses some clever
|
||||
# POSIX-compliant variable expansion to portably do all the work in the shell
|
||||
# and avoid any dependency on a particular "sed" or "awk" implementation.
|
||||
# Notable is that it will only ever compare the first 3 components of versions.
|
||||
# Further components will be cleanly stripped off. All versions must be
|
||||
# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
|
||||
# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should
|
||||
# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
|
||||
# continuing to maintain our own shell version.
|
||||
# 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%%.*}
|
||||
@@ -147,25 +140,13 @@ fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--usage) show_usage; exit 0;;
|
||||
--help) show_help; exit 0;;
|
||||
|
||||
# Installation overrides
|
||||
--prefix=*) GTEST_PREFIX=${1#--prefix=};;
|
||||
--exec-prefix=*) GTEST_EXEC_PREFIX=${1#--exec-prefix=};;
|
||||
--libdir=*) GTEST_LIBDIR=${1#--libdir=};;
|
||||
--includedir=*) GTEST_INCLUDEDIR=${1#--includedir=};;
|
||||
|
||||
# Installation queries
|
||||
--prefix|--exec-prefix|--libdir|--includedir|--version)
|
||||
if test -n "${do_query}"; then
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
do_query=${1#--}
|
||||
;;
|
||||
|
||||
# Version checking
|
||||
--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=}
|
||||
@@ -178,73 +159,17 @@ while test $# -gt 0; do
|
||||
do_check_versions=yes
|
||||
exact_version=${1#--exact-version=}
|
||||
;;
|
||||
|
||||
# Compiler flag output
|
||||
--cppflags) echo_cppflags=yes;;
|
||||
--cxxflags) echo_cxxflags=yes;;
|
||||
--ldflags) echo_ldflags=yes;;
|
||||
--libs) echo_libs=yes;;
|
||||
--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;;
|
||||
*) show_usage; exit 1;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# These have defaults filled in by the configure script but can also be
|
||||
# overridden by environment variables or command line parameters.
|
||||
prefix="${GTEST_PREFIX:-@prefix@}"
|
||||
exec_prefix="${GTEST_EXEC_PREFIX:-@exec_prefix@}"
|
||||
libdir="${GTEST_LIBDIR:-@libdir@}"
|
||||
includedir="${GTEST_INCLUDEDIR:-@includedir@}"
|
||||
|
||||
# We try and detect if our binary is not located at its installed location. If
|
||||
# it's not, we provide variables pointing to the source and build tree rather
|
||||
# than to the install tree. This allows building against a just-built gtest
|
||||
# rather than an installed gtest.
|
||||
bindir="@bindir@"
|
||||
this_relative_bindir=`dirname $0`
|
||||
this_bindir=`cd ${this_relative_bindir}; pwd -P`
|
||||
if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
|
||||
# The path to the script doesn't end in the bindir sequence from Autoconf,
|
||||
# assume that we are in a build tree.
|
||||
build_dir=`dirname ${this_bindir}`
|
||||
src_dir=`cd ${this_bindir}/@top_srcdir@; pwd -P`
|
||||
|
||||
# TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we
|
||||
# should work to remove it, and/or remove libtool altogether, replacing it
|
||||
# with direct references to the library and a link path.
|
||||
gtest_libs="${build_dir}/lib/libgtest.la"
|
||||
gtest_ldflags=""
|
||||
|
||||
# We provide hooks to include from either the source or build dir, where the
|
||||
# build dir is always preferred. This will potentially allow us to write
|
||||
# build rules for generated headers and have them automatically be preferred
|
||||
# over provided versions.
|
||||
gtest_cppflags="-I${build_dir}/include -I${src_dir}/include"
|
||||
gtest_cxxflags=""
|
||||
else
|
||||
# We're using an installed gtest, although it may be staged under some
|
||||
# prefix. Assume (as our own libraries do) that we can resolve the prefix,
|
||||
# and are present in the dynamic link paths.
|
||||
gtest_ldflags="-L${libdir}"
|
||||
gtest_libs="-l${name}"
|
||||
gtest_cppflags="-I${includedir}"
|
||||
gtest_cxxflags=""
|
||||
fi
|
||||
|
||||
# Do an installation query if requested.
|
||||
if test -n "$do_query"; then
|
||||
case $do_query in
|
||||
prefix) echo $prefix; exit 0;;
|
||||
exec-prefix) echo $exec_prefix; exit 0;;
|
||||
libdir) echo $libdir; exit 0;;
|
||||
includedir) echo $includedir; exit 0;;
|
||||
version) echo $version; exit 0;;
|
||||
*) show_usage; exit 1;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Do a version check if requested.
|
||||
if test "$do_check_versions" = "yes"; then
|
||||
# Make sure we didn't receive a bad combination of parameters.
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
# A Makefile for fusing Google Test and building a sample test against it.
|
||||
#
|
||||
# SYNOPSIS:
|
||||
#
|
||||
# make [all] - makes everything.
|
||||
# make TARGET - makes the given target.
|
||||
# make check - makes everything and runs the built sample test.
|
||||
# make clean - removes all files generated by make.
|
||||
|
||||
# Points to the root of fused Google Test, relative to where this file is.
|
||||
FUSED_GTEST_DIR = output
|
||||
|
||||
# Paths to the fused gtest files.
|
||||
FUSED_GTEST_H = $(FUSED_GTEST_DIR)/gtest/gtest.h
|
||||
FUSED_GTEST_ALL_CC = $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
|
||||
|
||||
# Where to find the sample test.
|
||||
SAMPLE_DIR = ../../samples
|
||||
|
||||
# Where to find gtest_main.cc.
|
||||
GTEST_MAIN_CC = ../../src/gtest_main.cc
|
||||
|
||||
# Flags passed to the preprocessor.
|
||||
CPPFLAGS += -I$(FUSED_GTEST_DIR)
|
||||
|
||||
# Flags passed to the C++ compiler.
|
||||
CXXFLAGS += -g
|
||||
|
||||
all : sample1_unittest
|
||||
|
||||
check : all
|
||||
./sample1_unittest
|
||||
|
||||
clean :
|
||||
rm -rf $(FUSED_GTEST_DIR) sample1_unittest *.o
|
||||
|
||||
$(FUSED_GTEST_H) :
|
||||
../fuse_gtest_files.py $(FUSED_GTEST_DIR)
|
||||
|
||||
$(FUSED_GTEST_ALL_CC) :
|
||||
../fuse_gtest_files.py $(FUSED_GTEST_DIR)
|
||||
|
||||
gtest-all.o : $(FUSED_GTEST_H) $(FUSED_GTEST_ALL_CC)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
|
||||
|
||||
gtest_main.o : $(FUSED_GTEST_H) $(GTEST_MAIN_CC)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_MAIN_CC)
|
||||
|
||||
sample1.o : $(SAMPLE_DIR)/sample1.cc $(SAMPLE_DIR)/sample1.h
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1.cc
|
||||
|
||||
sample1_unittest.o : $(SAMPLE_DIR)/sample1_unittest.cc \
|
||||
$(SAMPLE_DIR)/sample1.h $(FUSED_GTEST_H)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1_unittest.cc
|
||||
|
||||
sample1_unittest : sample1.o sample1_unittest.o gtest-all.o gtest_main.o
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
|
||||
1387
scripts/upload.py
1387
scripts/upload.py
File diff suppressed because it is too large
Load Diff
@@ -1,78 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2009, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""upload_gtest.py v0.1.0 -- uploads a Google Test patch for review.
|
||||
|
||||
This simple wrapper passes all command line flags and
|
||||
--cc=googletestframework@googlegroups.com to upload.py.
|
||||
|
||||
USAGE: upload_gtest.py [options for upload.py]
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
CC_FLAG = '--cc='
|
||||
GTEST_GROUP = 'googletestframework@googlegroups.com'
|
||||
|
||||
|
||||
def main():
|
||||
# Finds the path to upload.py, assuming it is in the same directory
|
||||
# as this file.
|
||||
my_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
upload_py_path = os.path.join(my_dir, 'upload.py')
|
||||
|
||||
# Adds Google Test discussion group to the cc line if it's not there
|
||||
# already.
|
||||
upload_py_argv = [upload_py_path]
|
||||
found_cc_flag = False
|
||||
for arg in sys.argv[1:]:
|
||||
if arg.startswith(CC_FLAG):
|
||||
found_cc_flag = True
|
||||
cc_line = arg[len(CC_FLAG):]
|
||||
cc_list = [addr for addr in cc_line.split(',') if addr]
|
||||
if GTEST_GROUP not in cc_list:
|
||||
cc_list.append(GTEST_GROUP)
|
||||
upload_py_argv.append(CC_FLAG + ','.join(cc_list))
|
||||
else:
|
||||
upload_py_argv.append(arg)
|
||||
|
||||
if not found_cc_flag:
|
||||
upload_py_argv.append(CC_FLAG + GTEST_GROUP)
|
||||
|
||||
# Invokes upload.py with the modified command line flags.
|
||||
os.execv(upload_py_path, upload_py_argv)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: mheule@google.com (Markus Heule)
|
||||
//
|
||||
// Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// Sometimes it's desirable to build Google Test by compiling a single file.
|
||||
// This file serves this purpose.
|
||||
#include "src/gtest.cc"
|
||||
#include "src/gtest-death-test.cc"
|
||||
#include "src/gtest-filepath.cc"
|
||||
#include "src/gtest-port.cc"
|
||||
#include "src/gtest-test-part.cc"
|
||||
#include "src/gtest-typed-test.cc"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -32,74 +32,28 @@
|
||||
#include <gtest/internal/gtest-filepath.h>
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include <windows.h>
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#ifdef _WIN32
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <sys/stat.h>
|
||||
#elif GTEST_OS_SYMBIAN
|
||||
// Symbian OpenC has PATH_MAX in sys/syslimits.h
|
||||
#include <sys/syslimits.h>
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <limits.h>
|
||||
#include <sys/stat.h> // NOLINT
|
||||
#include <unistd.h> // NOLINT
|
||||
#include <climits> // Some Linux distributions define PATH_MAX here.
|
||||
#endif // _WIN32_WCE or _WIN32
|
||||
#endif // _WIN32
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#define GTEST_PATH_MAX_ _MAX_PATH
|
||||
#elif defined(PATH_MAX)
|
||||
#define GTEST_PATH_MAX_ PATH_MAX
|
||||
#elif defined(_XOPEN_PATH_MAX)
|
||||
#define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
|
||||
#else
|
||||
#define GTEST_PATH_MAX_ _POSIX_PATH_MAX
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <gtest/internal/gtest-string.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
const char kPathSeparator = '\\';
|
||||
const char kPathSeparatorString[] = "\\";
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE doesn't have a current directory. You should not use
|
||||
// the current directory in tests on Windows CE, but this at least
|
||||
// provides a reasonable fallback.
|
||||
const char kCurrentDirectoryString[] = "\\";
|
||||
// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
|
||||
const DWORD kInvalidFileAttributes = 0xffffffff;
|
||||
#else
|
||||
const char kCurrentDirectoryString[] = ".\\";
|
||||
#endif // _WIN32_WCE
|
||||
#else
|
||||
const char kPathSeparator = '/';
|
||||
const char kPathSeparatorString[] = "/";
|
||||
const char kCurrentDirectoryString[] = "./";
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Returns the current working directory, or "" if unsuccessful.
|
||||
FilePath FilePath::GetCurrentDir() {
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE doesn't have a current directory, so we just return
|
||||
// something reasonable.
|
||||
return FilePath(kCurrentDirectoryString);
|
||||
#elif GTEST_OS_WINDOWS
|
||||
char cwd[GTEST_PATH_MAX_ + 1] = {};
|
||||
return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
|
||||
#else
|
||||
char cwd[GTEST_PATH_MAX_ + 1] = {};
|
||||
return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
|
||||
#endif
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -145,37 +99,21 @@ FilePath FilePath::MakeFileName(const FilePath& directory,
|
||||
const FilePath& base_name,
|
||||
int number,
|
||||
const char* extension) {
|
||||
const FilePath file_name(
|
||||
(number == 0) ?
|
||||
String::Format("%s.%s", base_name.c_str(), extension) :
|
||||
String::Format("%s_%d.%s", base_name.c_str(), number, extension));
|
||||
return ConcatPaths(directory, file_name);
|
||||
}
|
||||
|
||||
// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
|
||||
// On Windows, uses \ as the separator rather than /.
|
||||
FilePath FilePath::ConcatPaths(const FilePath& directory,
|
||||
const FilePath& relative_path) {
|
||||
if (directory.IsEmpty())
|
||||
return relative_path;
|
||||
const FilePath dir(directory.RemoveTrailingPathSeparator());
|
||||
return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
|
||||
relative_path.c_str()));
|
||||
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 {
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef _WIN32_WCE
|
||||
LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
|
||||
const DWORD attributes = GetFileAttributes(unicode);
|
||||
delete [] unicode;
|
||||
return attributes != kInvalidFileAttributes;
|
||||
#else
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
struct _stat file_stat = {};
|
||||
return _stat(pathname_.c_str(), &file_stat) == 0;
|
||||
#endif // _WIN32_WCE
|
||||
#else
|
||||
struct stat file_stat = {};
|
||||
return stat(pathname_.c_str(), &file_stat) == 0;
|
||||
@@ -186,59 +124,19 @@ bool FilePath::FileOrDirectoryExists() const {
|
||||
// that exists.
|
||||
bool FilePath::DirectoryExists() const {
|
||||
bool result = false;
|
||||
#if GTEST_OS_WINDOWS
|
||||
// Don't strip off trailing separator if path is a root directory on
|
||||
// Windows (like "C:\\").
|
||||
const FilePath& path(IsRootDirectory() ? *this :
|
||||
RemoveTrailingPathSeparator());
|
||||
#ifdef _WIN32_WCE
|
||||
LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
|
||||
const DWORD attributes = GetFileAttributes(unicode);
|
||||
delete [] unicode;
|
||||
if ((attributes != kInvalidFileAttributes) &&
|
||||
(attributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||
result = true;
|
||||
}
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
FilePath removed_sep(this->RemoveTrailingPathSeparator());
|
||||
struct _stat file_stat = {};
|
||||
result = _stat(path.c_str(), &file_stat) == 0 &&
|
||||
result = _stat(removed_sep.c_str(), &file_stat) == 0 &&
|
||||
(_S_IFDIR & file_stat.st_mode) != 0;
|
||||
#endif // _WIN32_WCE
|
||||
#else
|
||||
struct stat file_stat = {};
|
||||
result = stat(pathname_.c_str(), &file_stat) == 0 &&
|
||||
S_ISDIR(file_stat.st_mode);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
#endif // _WIN32
|
||||
return result;
|
||||
}
|
||||
|
||||
// Returns true if pathname describes a root directory. (Windows has one
|
||||
// root directory per disk drive.)
|
||||
bool FilePath::IsRootDirectory() const {
|
||||
#if GTEST_OS_WINDOWS
|
||||
// TODO(wan@google.com): on Windows a network share like
|
||||
// \\server\share can be a root directory, although it cannot be the
|
||||
// current directory. Handle this properly.
|
||||
return pathname_.GetLength() == 3 && IsAbsolutePath();
|
||||
#else
|
||||
return pathname_ == kPathSeparatorString;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns true if pathname describes an absolute path.
|
||||
bool FilePath::IsAbsolutePath() const {
|
||||
const char* const name = pathname_.c_str();
|
||||
#if GTEST_OS_WINDOWS
|
||||
return pathname_.GetLength() >= 3 &&
|
||||
((name[0] >= 'a' && name[0] <= 'z') ||
|
||||
(name[0] >= 'A' && name[0] <= 'Z')) &&
|
||||
name[1] == ':' &&
|
||||
name[2] == kPathSeparator;
|
||||
#else
|
||||
return name[0] == kPathSeparator;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns a pathname for a file that does not currently exist. The pathname
|
||||
// will be directory/base_name.extension or
|
||||
// directory/base_name_<number>.extension if directory/base_name.extension
|
||||
@@ -286,15 +184,8 @@ bool FilePath::CreateDirectoriesRecursively() const {
|
||||
// directory for any reason, including if the parent directory does not
|
||||
// exist. Not named "CreateDirectory" because that's a macro on Windows.
|
||||
bool FilePath::CreateFolder() const {
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef _WIN32_WCE
|
||||
FilePath removed_sep(this->RemoveTrailingPathSeparator());
|
||||
LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
|
||||
int result = CreateDirectory(unicode, NULL) ? 0 : -1;
|
||||
delete [] unicode;
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
int result = _mkdir(pathname_.c_str());
|
||||
#endif // !WIN32_WCE
|
||||
#else
|
||||
int result = mkdir(pathname_.c_str(), 0777);
|
||||
#endif // _WIN32
|
||||
@@ -313,31 +204,5 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {
|
||||
: *this;
|
||||
}
|
||||
|
||||
// Normalize removes any redundant separators that might be in the pathname.
|
||||
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
|
||||
// redundancies that might be in a pathname involving "." or "..".
|
||||
void FilePath::Normalize() {
|
||||
if (pathname_.c_str() == NULL) {
|
||||
pathname_ = "";
|
||||
return;
|
||||
}
|
||||
const char* src = pathname_.c_str();
|
||||
char* const dest = new char[pathname_.GetLength() + 1];
|
||||
char* dest_ptr = dest;
|
||||
memset(dest_ptr, 0, pathname_.GetLength() + 1);
|
||||
|
||||
while (*src != '\0') {
|
||||
*dest_ptr++ = *src;
|
||||
if (*src != kPathSeparator)
|
||||
src++;
|
||||
else
|
||||
while (*src == kPathSeparator)
|
||||
src++;
|
||||
}
|
||||
*dest_ptr = '\0';
|
||||
pathname_ = dest;
|
||||
delete[] dest;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
@@ -37,26 +37,23 @@
|
||||
#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
|
||||
#define GTEST_SRC_GTEST_INTERNAL_INL_H_
|
||||
|
||||
// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
|
||||
// part of Google Test's implementation; otherwise it's undefined.
|
||||
#if !GTEST_IMPLEMENTATION_
|
||||
// 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_
|
||||
#endif // GTEST_IMPLEMENTATION
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h> // For strtoll/_strtoul64.
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#include <windows.h> // For DWORD.
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <windows.h> // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#include <ostream> // NOLINT
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
@@ -64,28 +61,29 @@ namespace testing {
|
||||
|
||||
// Declares the flags.
|
||||
//
|
||||
// We don't want the users to modify this flag in the code, but want
|
||||
// Google Test's own unit tests to be able to access it. Therefore we
|
||||
// declare it here as opposed to in gtest.h.
|
||||
GTEST_DECLARE_bool_(death_test_use_fork);
|
||||
// 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 {
|
||||
|
||||
// The value of GetTestTypeId() as seen from within the Google Test
|
||||
// library. This is solely for testing GetTestTypeId().
|
||||
extern const TypeId kTestTypeIdInGoogleTest;
|
||||
|
||||
// Names of the flags (needed for parsing Google Test flags).
|
||||
const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
|
||||
const char kBreakOnFailureFlag[] = "break_on_failure";
|
||||
const char kCatchExceptionsFlag[] = "catch_exceptions";
|
||||
const char kColorFlag[] = "color";
|
||||
const char kFilterFlag[] = "filter";
|
||||
const char kListTestsFlag[] = "list_tests";
|
||||
const char kOutputFlag[] = "output";
|
||||
const char kPrintTimeFlag[] = "print_time";
|
||||
const char kColorFlag[] = "color";
|
||||
const char kRepeatFlag[] = "repeat";
|
||||
const char kThrowOnFailureFlag[] = "throw_on_failure";
|
||||
|
||||
// This class saves the values of all Google Test flags in its c'tor, and
|
||||
// restores them in its d'tor.
|
||||
@@ -93,109 +91,49 @@ class GTestFlagSaver {
|
||||
public:
|
||||
// The c'tor.
|
||||
GTestFlagSaver() {
|
||||
also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
|
||||
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);
|
||||
death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
|
||||
filter_ = GTEST_FLAG(filter);
|
||||
internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
|
||||
list_tests_ = GTEST_FLAG(list_tests);
|
||||
output_ = GTEST_FLAG(output);
|
||||
print_time_ = GTEST_FLAG(print_time);
|
||||
repeat_ = GTEST_FLAG(repeat);
|
||||
throw_on_failure_ = GTEST_FLAG(throw_on_failure);
|
||||
}
|
||||
|
||||
// The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
|
||||
~GTestFlagSaver() {
|
||||
GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
|
||||
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(death_test_use_fork) = death_test_use_fork_;
|
||||
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(print_time) = print_time_;
|
||||
GTEST_FLAG(repeat) = repeat_;
|
||||
GTEST_FLAG(throw_on_failure) = throw_on_failure_;
|
||||
}
|
||||
private:
|
||||
// Fields for saving the original values of flags.
|
||||
bool also_run_disabled_tests_;
|
||||
bool break_on_failure_;
|
||||
bool catch_exceptions_;
|
||||
String color_;
|
||||
String death_test_style_;
|
||||
bool death_test_use_fork_;
|
||||
String filter_;
|
||||
String internal_run_death_test_;
|
||||
bool list_tests_;
|
||||
String output_;
|
||||
bool print_time_;
|
||||
bool pretty_;
|
||||
internal::Int32 repeat_;
|
||||
bool throw_on_failure_;
|
||||
} GTEST_ATTRIBUTE_UNUSED_;
|
||||
} GTEST_ATTRIBUTE_UNUSED;
|
||||
|
||||
// Converts a Unicode code point to a narrow string in UTF-8 encoding.
|
||||
// code_point parameter is of type UInt32 because wchar_t may not be
|
||||
// wide enough to contain a code point.
|
||||
// The output buffer str must containt at least 32 characters.
|
||||
// The function returns the address of the output buffer.
|
||||
// If the code_point is not a valid Unicode code point
|
||||
// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
|
||||
// as '(Invalid Unicode 0xXXXXXXXX)'.
|
||||
char* CodePointToUtf8(UInt32 code_point, char* str);
|
||||
|
||||
// Converts a wide string to a narrow string in UTF-8 encoding.
|
||||
// The wide string is assumed to have the following encoding:
|
||||
// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
|
||||
// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
|
||||
// Parameter str points to a null-terminated wide string.
|
||||
// Parameter num_chars may additionally limit the number
|
||||
// of wchar_t characters processed. -1 is used when the entire string
|
||||
// should be processed.
|
||||
// If the string contains code points that are not valid Unicode code points
|
||||
// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
|
||||
// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
|
||||
// and contains invalid UTF-16 surrogate pairs, values in those pairs
|
||||
// will be encoded as individual Unicode characters from Basic Normal Plane.
|
||||
String WideStringToUtf8(const wchar_t* str, int num_chars);
|
||||
// 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();
|
||||
|
||||
// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
|
||||
// if the variable is present. If a file already exists at this location, this
|
||||
// function will write over it. If the variable is present, but the file cannot
|
||||
// be created, prints an error and exits.
|
||||
void WriteToShardStatusFileIfNeeded();
|
||||
|
||||
// Checks whether sharding is enabled by examining the relevant
|
||||
// environment variable values. If the variables are present,
|
||||
// but inconsistent (e.g., shard_index >= total_shards), prints
|
||||
// an error and exits. If in_subprocess_for_death_test, sharding is
|
||||
// disabled because it must only be applied to the original test
|
||||
// process. Otherwise, we could filter out death tests we intended to execute.
|
||||
bool ShouldShard(const char* total_shards_str, const char* shard_index_str,
|
||||
bool in_subprocess_for_death_test);
|
||||
|
||||
// Parses the environment variable var as an Int32. If it is unset,
|
||||
// returns default_val. If it is not an Int32, prints an error and
|
||||
// and aborts.
|
||||
Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
|
||||
|
||||
// Given the total number of shards, the shard index, and the test id,
|
||||
// returns true iff the test should be run on this shard. The test id is
|
||||
// some arbitrary but unique non-negative integer assigned to each test
|
||||
// method. Assumes that 0 <= shard_index < total_shards.
|
||||
bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id);
|
||||
|
||||
// List is a simple singly-linked list container.
|
||||
//
|
||||
// We cannot use std::list as Microsoft's implementation of STL has
|
||||
@@ -235,7 +173,7 @@ class ListNode {
|
||||
explicit ListNode(const E & element) : element_(element), next_(NULL) {}
|
||||
|
||||
// We disallow copying ListNode
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ListNode);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(ListNode);
|
||||
|
||||
public:
|
||||
|
||||
@@ -434,7 +372,7 @@ class List {
|
||||
int size_; // The number of elements in the list.
|
||||
|
||||
// We disallow copying List.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(List);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(List);
|
||||
};
|
||||
|
||||
// The virtual destructor of List.
|
||||
@@ -592,15 +530,14 @@ class TestResult {
|
||||
TimeInMillis elapsed_time_;
|
||||
|
||||
// We disallow copying TestResult.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestResult);
|
||||
}; // class TestResult
|
||||
|
||||
class TestInfoImpl {
|
||||
public:
|
||||
TestInfoImpl(TestInfo* parent, const char* test_case_name,
|
||||
const char* name, const char* test_case_comment,
|
||||
const char* comment, TypeId fixture_class_id,
|
||||
internal::TestFactoryBase* factory);
|
||||
const char* name, TypeId fixture_class_id,
|
||||
TestMaker maker);
|
||||
~TestInfoImpl();
|
||||
|
||||
// Returns true if this test should run.
|
||||
@@ -621,12 +558,6 @@ class TestInfoImpl {
|
||||
// Returns the test name.
|
||||
const char* name() const { return name_.c_str(); }
|
||||
|
||||
// Returns the test case comment.
|
||||
const char* test_case_comment() const { return test_case_comment_.c_str(); }
|
||||
|
||||
// Returns the test comment.
|
||||
const char* comment() const { return comment_.c_str(); }
|
||||
|
||||
// Returns the ID of the test fixture class.
|
||||
TypeId fixture_class_id() const { return fixture_class_id_; }
|
||||
|
||||
@@ -653,22 +584,19 @@ class TestInfoImpl {
|
||||
|
||||
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 String test_case_comment_; // Test case comment
|
||||
const String comment_; // Test comment
|
||||
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
|
||||
internal::TestFactoryBase* const factory_; // The factory that creates
|
||||
// the test object
|
||||
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);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestInfoImpl);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
@@ -688,7 +616,7 @@ class TestCase {
|
||||
// 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, const char* comment,
|
||||
TestCase(const char* name,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc);
|
||||
|
||||
@@ -698,9 +626,6 @@ class TestCase {
|
||||
// Gets the name of the TestCase.
|
||||
const char* name() const { return name_.c_str(); }
|
||||
|
||||
// Returns the test case comment.
|
||||
const char* comment() const { return comment_.c_str(); }
|
||||
|
||||
// Returns true if any test in this test case should run.
|
||||
bool should_run() const { return should_run_; }
|
||||
|
||||
@@ -786,8 +711,6 @@ class TestCase {
|
||||
private:
|
||||
// Name of the test case.
|
||||
internal::String name_;
|
||||
// Comment on the test case.
|
||||
internal::String comment_;
|
||||
// List of TestInfos.
|
||||
internal::List<TestInfo*>* test_info_list_;
|
||||
// Pointer to the function that sets up the test case.
|
||||
@@ -800,7 +723,7 @@ class TestCase {
|
||||
internal::TimeInMillis elapsed_time_;
|
||||
|
||||
// We disallow copying TestCases.
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(TestCase);
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
@@ -822,10 +745,9 @@ class UnitTestOptions {
|
||||
// Returns the output format, or "" for normal printed output.
|
||||
static String GetOutputFormat();
|
||||
|
||||
// Returns the absolute path of the requested output file, or the
|
||||
// default (test_detail.xml in the original working directory) if
|
||||
// none was explicitly specified.
|
||||
static String GetAbsolutePathToOutputFile();
|
||||
// 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.
|
||||
|
||||
@@ -841,7 +763,7 @@ class UnitTestOptions {
|
||||
static bool FilterMatchesTest(const String &test_case_name,
|
||||
const String &test_name);
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Function for supporting the gtest_catch_exception flag.
|
||||
|
||||
// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
|
||||
@@ -849,7 +771,7 @@ class UnitTestOptions {
|
||||
// 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);
|
||||
@@ -879,10 +801,10 @@ class OsStackTraceGetterInterface {
|
||||
virtual void UponLeavingGTest() = 0;
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(OsStackTraceGetterInterface);
|
||||
};
|
||||
|
||||
// A working implementation of the OsStackTraceGetterInterface interface.
|
||||
// A working implemenation of the OsStackTraceGetterInterface interface.
|
||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetter() {}
|
||||
@@ -902,7 +824,7 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||
// and any calls to CurrentStackTrace() from within the user code.
|
||||
void* caller_frame_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(OsStackTraceGetter);
|
||||
};
|
||||
|
||||
// Information about a Google Test trace point.
|
||||
@@ -912,67 +834,24 @@ struct TraceInfo {
|
||||
String message;
|
||||
};
|
||||
|
||||
// This is the default global test part result reporter used in UnitTestImpl.
|
||||
// This class should only be used by UnitTestImpl.
|
||||
class DefaultGlobalTestPartResultReporter
|
||||
: public TestPartResultReporterInterface {
|
||||
public:
|
||||
explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
|
||||
// Implements the TestPartResultReporterInterface. Reports the test part
|
||||
// result in the current test.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
|
||||
private:
|
||||
UnitTestImpl* const unit_test_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
|
||||
};
|
||||
|
||||
// This is the default per thread test part result reporter used in
|
||||
// UnitTestImpl. This class should only be used by UnitTestImpl.
|
||||
class DefaultPerThreadTestPartResultReporter
|
||||
: public TestPartResultReporterInterface {
|
||||
public:
|
||||
explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
|
||||
// Implements the TestPartResultReporterInterface. The implementation just
|
||||
// delegates to the current global test part result reporter of *unit_test_.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
|
||||
private:
|
||||
UnitTestImpl* const unit_test_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
|
||||
};
|
||||
|
||||
// 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 {
|
||||
class UnitTestImpl : public TestPartResultReporterInterface {
|
||||
public:
|
||||
explicit UnitTestImpl(UnitTest* parent);
|
||||
virtual ~UnitTestImpl();
|
||||
|
||||
// There are two different ways to register your own TestPartResultReporter.
|
||||
// You can register your own repoter to listen either only for test results
|
||||
// from the current thread or for results from all threads.
|
||||
// By default, each per-thread test result repoter just passes a new
|
||||
// TestPartResult to the global test result reporter, which registers the
|
||||
// test part result for the currently running test.
|
||||
// Reports a test part result. This method is from the
|
||||
// TestPartResultReporterInterface interface.
|
||||
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||
|
||||
// Returns the global test part result reporter.
|
||||
TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
|
||||
// Returns the current test part result reporter.
|
||||
TestPartResultReporterInterface* test_part_result_reporter();
|
||||
|
||||
// Sets the global test part result reporter.
|
||||
void SetGlobalTestPartResultReporter(
|
||||
TestPartResultReporterInterface* reporter);
|
||||
|
||||
// Returns the test part result reporter for the current thread.
|
||||
TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
|
||||
|
||||
// Sets the test part result reporter for the current thread.
|
||||
void SetTestPartResultReporterForCurrentThread(
|
||||
TestPartResultReporterInterface* 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;
|
||||
@@ -1068,7 +947,6 @@ class UnitTestImpl {
|
||||
// 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,
|
||||
const char* comment,
|
||||
Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc);
|
||||
|
||||
@@ -1082,35 +960,11 @@ class UnitTestImpl {
|
||||
void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
|
||||
Test::TearDownTestCaseFunc tear_down_tc,
|
||||
TestInfo * test_info) {
|
||||
// In order to support thread-safe death tests, we need to
|
||||
// remember the original working directory when the test program
|
||||
// was first invoked. We cannot do this in RUN_ALL_TESTS(), as
|
||||
// the user may have changed the current directory before calling
|
||||
// RUN_ALL_TESTS(). Therefore we capture the current directory in
|
||||
// AddTestInfo(), which is called to register a TEST or TEST_F
|
||||
// before main() is reached.
|
||||
if (original_working_dir_.IsEmpty()) {
|
||||
original_working_dir_.Set(FilePath::GetCurrentDir());
|
||||
if (original_working_dir_.IsEmpty()) {
|
||||
printf("%s\n", "Failed to get the current working directory.");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
GetTestCase(test_info->test_case_name(),
|
||||
test_info->test_case_comment(),
|
||||
set_up_tc,
|
||||
tear_down_tc)->AddTestInfo(test_info);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
||||
// value-parameterized tests and instantiate and register them.
|
||||
internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
|
||||
return parameterized_test_registry_;
|
||||
}
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
// 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;
|
||||
@@ -1123,14 +977,6 @@ class UnitTestImpl {
|
||||
current_test_info_ = current_test_info;
|
||||
}
|
||||
|
||||
// Registers all parameterized tests defined using TEST_P and
|
||||
// INSTANTIATE_TEST_P, creating regular tests for each test/parameter
|
||||
// combination. This method can be called more then once; it has
|
||||
// guards protecting from registering the tests more then once.
|
||||
// If value-parameterized tests are disabled, RegisterParameterizedTests
|
||||
// is present but does nothing.
|
||||
void RegisterParameterizedTests();
|
||||
|
||||
// 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
|
||||
@@ -1145,18 +991,11 @@ class UnitTestImpl {
|
||||
ad_hoc_test_result_.Clear();
|
||||
}
|
||||
|
||||
enum ReactionToSharding {
|
||||
HONOR_SHARDING_PROTOCOL,
|
||||
IGNORE_SHARDING_PROTOCOL
|
||||
};
|
||||
|
||||
// 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.
|
||||
// If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
|
||||
// based on sharding variables in the environment.
|
||||
// Returns the number of tests that should run.
|
||||
int FilterTests(ReactionToSharding shard_tests);
|
||||
int FilterTests();
|
||||
|
||||
// Lists all the tests by name.
|
||||
void ListAllTests();
|
||||
@@ -1183,7 +1022,7 @@ class UnitTestImpl {
|
||||
return gtest_trace_stack_.pointer();
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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.
|
||||
@@ -1200,29 +1039,11 @@ class UnitTestImpl {
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
private:
|
||||
friend class ::testing::UnitTest;
|
||||
|
||||
// The UnitTest object that owns this implementation object.
|
||||
UnitTest* const parent_;
|
||||
|
||||
// The working directory when the first TEST() or TEST_F() was
|
||||
// executed.
|
||||
internal::FilePath original_working_dir_;
|
||||
|
||||
// The default test part result reporters.
|
||||
DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
|
||||
DefaultPerThreadTestPartResultReporter
|
||||
default_per_thread_test_part_result_reporter_;
|
||||
|
||||
// Points to (but doesn't own) the global test part result reporter.
|
||||
TestPartResultReporterInterface* global_test_part_result_repoter_;
|
||||
|
||||
// Protects read and write access to global_test_part_result_reporter_.
|
||||
internal::Mutex global_test_part_result_reporter_mutex_;
|
||||
|
||||
// Points to (but doesn't own) the per-thread test part result reporter.
|
||||
internal::ThreadLocal<TestPartResultReporterInterface*>
|
||||
per_thread_test_part_result_reporter_;
|
||||
// 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_
|
||||
@@ -1232,15 +1053,6 @@ class UnitTestImpl {
|
||||
|
||||
internal::List<TestCase*> test_cases_; // The list of TestCases.
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
// ParameterizedTestRegistry object used to register value-parameterized
|
||||
// tests.
|
||||
internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
|
||||
|
||||
// Indicates whether RegisterParameterizedTests() has been called already.
|
||||
bool parameterized_tests_registered_;
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
// Points to the last death test case registered. Initially NULL.
|
||||
internal::ListNode<TestCase*>* last_death_test_case_;
|
||||
|
||||
@@ -1281,7 +1093,7 @@ class UnitTestImpl {
|
||||
// How long the test took to run, in milliseconds.
|
||||
TimeInMillis elapsed_time_;
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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_;
|
||||
@@ -1291,7 +1103,7 @@ class UnitTestImpl {
|
||||
// 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);
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTestImpl);
|
||||
}; // class UnitTestImpl
|
||||
|
||||
// Convenience function for accessing the global UnitTest
|
||||
@@ -1300,98 +1112,6 @@ inline UnitTestImpl* GetUnitTestImpl() {
|
||||
return UnitTest::GetInstance()->impl();
|
||||
}
|
||||
|
||||
// Internal helper functions for implementing the simple regular
|
||||
// expression matcher.
|
||||
bool IsInSet(char ch, const char* str);
|
||||
bool IsDigit(char ch);
|
||||
bool IsPunct(char ch);
|
||||
bool IsRepeat(char ch);
|
||||
bool IsWhiteSpace(char ch);
|
||||
bool IsWordChar(char ch);
|
||||
bool IsValidEscape(char ch);
|
||||
bool AtomMatchesChar(bool escaped, char pattern, char ch);
|
||||
bool ValidateRegex(const char* regex);
|
||||
bool MatchRegexAtHead(const char* regex, const char* str);
|
||||
bool MatchRepetitionAndRegexAtHead(
|
||||
bool escaped, char ch, char repeat, const char* regex, const char* str);
|
||||
bool MatchRegexAnywhere(const char* regex, const char* str);
|
||||
|
||||
// Parses the command line for Google Test flags, without initializing
|
||||
// other parts of Google Test.
|
||||
void ParseGoogleTestFlagsOnly(int* argc, char** argv);
|
||||
void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Returns the message describing the last system error, regardless of the
|
||||
// platform.
|
||||
String GetLastSystemErrorMessage();
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
// Provides leak-safe Windows kernel handle ownership.
|
||||
class AutoHandle {
|
||||
public:
|
||||
AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
|
||||
explicit AutoHandle(HANDLE handle) : handle_(handle) {}
|
||||
|
||||
~AutoHandle() { Reset(); }
|
||||
|
||||
HANDLE Get() const { return handle_; }
|
||||
void Reset() { Reset(INVALID_HANDLE_VALUE); }
|
||||
void Reset(HANDLE handle) {
|
||||
if (handle != handle_) {
|
||||
if (handle_ != INVALID_HANDLE_VALUE)
|
||||
::CloseHandle(handle_);
|
||||
handle_ = handle;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
HANDLE handle_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
|
||||
};
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Attempts to parse a string into a positive integer pointed to by the
|
||||
// number parameter. Returns true if that is possible.
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
|
||||
// it here.
|
||||
template <typename Integer>
|
||||
bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
|
||||
// Fail fast if the given string does not begin with a digit;
|
||||
// this bypasses strtoXXX's "optional leading whitespace and plus
|
||||
// or minus sign" semantics, which are undesirable here.
|
||||
if (str.empty() || !isdigit(str[0])) {
|
||||
return false;
|
||||
}
|
||||
errno = 0;
|
||||
|
||||
char* end;
|
||||
// BiggestConvertible is the largest integer type that system-provided
|
||||
// string-to-number conversion routines can return.
|
||||
#if GTEST_OS_WINDOWS
|
||||
typedef unsigned __int64 BiggestConvertible;
|
||||
const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
|
||||
#else
|
||||
typedef unsigned long long BiggestConvertible; // NOLINT
|
||||
const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
const bool parse_success = *end == '\0' && errno == 0;
|
||||
|
||||
// TODO(vladl@google.com): Convert this to compile time assertion when it is
|
||||
// available.
|
||||
GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
|
||||
|
||||
const Integer result = static_cast<Integer>(parsed);
|
||||
if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
|
||||
*number = result;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
|
||||
@@ -32,359 +32,46 @@
|
||||
#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>
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#include <io.h>
|
||||
#include <sys/stat.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_USES_SIMPLE_RE
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include <windows.h> // For TerminateProcess()
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
#include <gtest/gtest-spi.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_ 1
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
// Microsoft does not provide a definition of STDERR_FILENO.
|
||||
const int kStdErrFileno = 2;
|
||||
#else
|
||||
const int kStdErrFileno = STDERR_FILENO;
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_USES_POSIX_RE
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Implements RE. Currently only needed for death tests.
|
||||
|
||||
RE::~RE() {
|
||||
regfree(&partial_regex_);
|
||||
regfree(&full_regex_);
|
||||
regfree(®ex_);
|
||||
free(const_cast<char*>(pattern_));
|
||||
}
|
||||
|
||||
// Returns true iff regular expression re matches the entire str.
|
||||
bool RE::FullMatch(const char* str, const RE& re) {
|
||||
if (!re.is_valid_) return false;
|
||||
|
||||
regmatch_t match;
|
||||
return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
|
||||
}
|
||||
|
||||
// Returns true iff regular expression re matches a substring of str
|
||||
// (including str itself).
|
||||
// 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.partial_regex_, str, 1, &match, 0) == 0;
|
||||
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);
|
||||
|
||||
// Reserves enough bytes to hold the regular expression used for a
|
||||
// full match.
|
||||
const size_t full_regex_len = strlen(regex) + 10;
|
||||
char* const full_pattern = new char[full_regex_len];
|
||||
|
||||
snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
|
||||
is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
|
||||
// We want to call regcomp(&partial_regex_, ...) even if the
|
||||
// previous expression returns false. Otherwise partial_regex_ may
|
||||
// not be properly initialized can may cause trouble when it's
|
||||
// freed.
|
||||
//
|
||||
// Some implementation of POSIX regex (e.g. on at least some
|
||||
// versions of Cygwin) doesn't accept the empty string as a valid
|
||||
// regex. We change it to an equivalent form "()" to be safe.
|
||||
const char* const partial_regex = (*regex == '\0') ? "()" : regex;
|
||||
is_valid_ = (regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0)
|
||||
&& is_valid_;
|
||||
is_valid_ = regcomp(®ex_, regex, REG_EXTENDED) == 0;
|
||||
EXPECT_TRUE(is_valid_)
|
||||
<< "Regular expression \"" << regex
|
||||
<< "\" is not a valid POSIX Extended regular expression.";
|
||||
|
||||
delete[] full_pattern;
|
||||
}
|
||||
|
||||
#elif GTEST_USES_SIMPLE_RE
|
||||
|
||||
// Returns true iff ch appears anywhere in str (excluding the
|
||||
// terminating '\0' character).
|
||||
bool IsInSet(char ch, const char* str) {
|
||||
return ch != '\0' && strchr(str, ch) != NULL;
|
||||
}
|
||||
|
||||
// Returns true iff ch belongs to the given classification. Unlike
|
||||
// similar functions in <ctype.h>, these aren't affected by the
|
||||
// current locale.
|
||||
bool IsDigit(char ch) { return '0' <= ch && ch <= '9'; }
|
||||
bool IsPunct(char ch) {
|
||||
return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
|
||||
}
|
||||
bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
|
||||
bool IsWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
|
||||
bool IsWordChar(char ch) {
|
||||
return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
|
||||
('0' <= ch && ch <= '9') || ch == '_';
|
||||
}
|
||||
|
||||
// Returns true iff "\\c" is a supported escape sequence.
|
||||
bool IsValidEscape(char c) {
|
||||
return (IsPunct(c) || IsInSet(c, "dDfnrsStvwW"));
|
||||
}
|
||||
|
||||
// Returns true iff the given atom (specified by escaped and pattern)
|
||||
// matches ch. The result is undefined if the atom is invalid.
|
||||
bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
|
||||
if (escaped) { // "\\p" where p is pattern_char.
|
||||
switch (pattern_char) {
|
||||
case 'd': return IsDigit(ch);
|
||||
case 'D': return !IsDigit(ch);
|
||||
case 'f': return ch == '\f';
|
||||
case 'n': return ch == '\n';
|
||||
case 'r': return ch == '\r';
|
||||
case 's': return IsWhiteSpace(ch);
|
||||
case 'S': return !IsWhiteSpace(ch);
|
||||
case 't': return ch == '\t';
|
||||
case 'v': return ch == '\v';
|
||||
case 'w': return IsWordChar(ch);
|
||||
case 'W': return !IsWordChar(ch);
|
||||
}
|
||||
return IsPunct(pattern_char) && pattern_char == ch;
|
||||
}
|
||||
|
||||
return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
|
||||
}
|
||||
|
||||
// Helper function used by ValidateRegex() to format error messages.
|
||||
String FormatRegexSyntaxError(const char* regex, int index) {
|
||||
return (Message() << "Syntax error at index " << index
|
||||
<< " in simple regular expression \"" << regex << "\": ").GetString();
|
||||
}
|
||||
|
||||
// Generates non-fatal failures and returns false if regex is invalid;
|
||||
// otherwise returns true.
|
||||
bool ValidateRegex(const char* regex) {
|
||||
if (regex == NULL) {
|
||||
// TODO(wan@google.com): fix the source file location in the
|
||||
// assertion failures to match where the regex is used in user
|
||||
// code.
|
||||
ADD_FAILURE() << "NULL is not a valid simple regular expression.";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_valid = true;
|
||||
|
||||
// True iff ?, *, or + can follow the previous atom.
|
||||
bool prev_repeatable = false;
|
||||
for (int i = 0; regex[i]; i++) {
|
||||
if (regex[i] == '\\') { // An escape sequence
|
||||
i++;
|
||||
if (regex[i] == '\0') {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
|
||||
<< "'\\' cannot appear at the end.";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!IsValidEscape(regex[i])) {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
|
||||
<< "invalid escape sequence \"\\" << regex[i] << "\".";
|
||||
is_valid = false;
|
||||
}
|
||||
prev_repeatable = true;
|
||||
} else { // Not an escape sequence.
|
||||
const char ch = regex[i];
|
||||
|
||||
if (ch == '^' && i > 0) {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
|
||||
<< "'^' can only appear at the beginning.";
|
||||
is_valid = false;
|
||||
} else if (ch == '$' && regex[i + 1] != '\0') {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
|
||||
<< "'$' can only appear at the end.";
|
||||
is_valid = false;
|
||||
} else if (IsInSet(ch, "()[]{}|")) {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
|
||||
<< "'" << ch << "' is unsupported.";
|
||||
is_valid = false;
|
||||
} else if (IsRepeat(ch) && !prev_repeatable) {
|
||||
ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
|
||||
<< "'" << ch << "' can only follow a repeatable token.";
|
||||
is_valid = false;
|
||||
}
|
||||
|
||||
prev_repeatable = !IsInSet(ch, "^$?*+");
|
||||
}
|
||||
}
|
||||
|
||||
return is_valid;
|
||||
}
|
||||
|
||||
// Matches a repeated regex atom followed by a valid simple regular
|
||||
// expression. The regex atom is defined as c if escaped is false,
|
||||
// or \c otherwise. repeat is the repetition meta character (?, *,
|
||||
// or +). The behavior is undefined if str contains too many
|
||||
// characters to be indexable by size_t, in which case the test will
|
||||
// probably time out anyway. We are fine with this limitation as
|
||||
// std::string has it too.
|
||||
bool MatchRepetitionAndRegexAtHead(
|
||||
bool escaped, char c, char repeat, const char* regex,
|
||||
const char* str) {
|
||||
const size_t min_count = (repeat == '+') ? 1 : 0;
|
||||
const size_t max_count = (repeat == '?') ? 1 :
|
||||
static_cast<size_t>(-1) - 1;
|
||||
// We cannot call numeric_limits::max() as it conflicts with the
|
||||
// max() macro on Windows.
|
||||
|
||||
for (size_t i = 0; i <= max_count; ++i) {
|
||||
// We know that the atom matches each of the first i characters in str.
|
||||
if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
|
||||
// We have enough matches at the head, and the tail matches too.
|
||||
// Since we only care about *whether* the pattern matches str
|
||||
// (as opposed to *how* it matches), there is no need to find a
|
||||
// greedy match.
|
||||
return true;
|
||||
}
|
||||
if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Returns true iff regex matches a prefix of str. regex must be a
|
||||
// valid simple regular expression and not start with "^", or the
|
||||
// result is undefined.
|
||||
bool MatchRegexAtHead(const char* regex, const char* str) {
|
||||
if (*regex == '\0') // An empty regex matches a prefix of anything.
|
||||
return true;
|
||||
|
||||
// "$" only matches the end of a string. Note that regex being
|
||||
// valid guarantees that there's nothing after "$" in it.
|
||||
if (*regex == '$')
|
||||
return *str == '\0';
|
||||
|
||||
// Is the first thing in regex an escape sequence?
|
||||
const bool escaped = *regex == '\\';
|
||||
if (escaped)
|
||||
++regex;
|
||||
if (IsRepeat(regex[1])) {
|
||||
// MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
|
||||
// here's an indirect recursion. It terminates as the regex gets
|
||||
// shorter in each recursion.
|
||||
return MatchRepetitionAndRegexAtHead(
|
||||
escaped, regex[0], regex[1], regex + 2, str);
|
||||
} else {
|
||||
// regex isn't empty, isn't "$", and doesn't start with a
|
||||
// repetition. We match the first atom of regex with the first
|
||||
// character of str and recurse.
|
||||
return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
|
||||
MatchRegexAtHead(regex + 1, str + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Returns true iff regex matches any substring of str. regex must be
|
||||
// a valid simple regular expression, or the result is undefined.
|
||||
//
|
||||
// The algorithm is recursive, but the recursion depth doesn't exceed
|
||||
// the regex length, so we won't need to worry about running out of
|
||||
// stack space normally. In rare cases the time complexity can be
|
||||
// exponential with respect to the regex length + the string length,
|
||||
// but usually it's must faster (often close to linear).
|
||||
bool MatchRegexAnywhere(const char* regex, const char* str) {
|
||||
if (regex == NULL || str == NULL)
|
||||
return false;
|
||||
|
||||
if (*regex == '^')
|
||||
return MatchRegexAtHead(regex + 1, str);
|
||||
|
||||
// A successful match can be anywhere in str.
|
||||
do {
|
||||
if (MatchRegexAtHead(regex, str))
|
||||
return true;
|
||||
} while (*str++ != '\0');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Implements the RE class.
|
||||
|
||||
RE::~RE() {
|
||||
free(const_cast<char*>(pattern_));
|
||||
free(const_cast<char*>(full_pattern_));
|
||||
}
|
||||
|
||||
// Returns true iff regular expression re matches the entire str.
|
||||
bool RE::FullMatch(const char* str, const RE& re) {
|
||||
return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
|
||||
}
|
||||
|
||||
// Returns true iff regular expression re matches a substring of str
|
||||
// (including str itself).
|
||||
bool RE::PartialMatch(const char* str, const RE& re) {
|
||||
return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
|
||||
}
|
||||
|
||||
// Initializes an RE from its string representation.
|
||||
void RE::Init(const char* regex) {
|
||||
pattern_ = full_pattern_ = NULL;
|
||||
if (regex != NULL) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
pattern_ = _strdup(regex);
|
||||
#else
|
||||
pattern_ = strdup(regex);
|
||||
#endif
|
||||
}
|
||||
|
||||
is_valid_ = ValidateRegex(regex);
|
||||
if (!is_valid_) {
|
||||
// No need to calculate the full pattern when the regex is invalid.
|
||||
return;
|
||||
}
|
||||
|
||||
const size_t len = strlen(regex);
|
||||
// Reserves enough bytes to hold the regular expression used for a
|
||||
// full match: we need space to prepend a '^', append a '$', and
|
||||
// terminate the string with '\0'.
|
||||
char* buffer = static_cast<char*>(malloc(len + 3));
|
||||
full_pattern_ = buffer;
|
||||
|
||||
if (*regex != '^')
|
||||
*buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
|
||||
|
||||
// We don't use snprintf or strncpy, as they trigger a warning when
|
||||
// compiled with VC++ 8.0.
|
||||
memcpy(buffer, regex, len);
|
||||
buffer += len;
|
||||
|
||||
if (len == 0 || regex[len - 1] != '$')
|
||||
*buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
|
||||
|
||||
*buffer = '\0';
|
||||
}
|
||||
|
||||
#endif // GTEST_USES_POSIX_RE
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Logs a message at the given severity level.
|
||||
void GTestLog(GTestLogSeverity severity, const char* file,
|
||||
@@ -395,19 +82,11 @@ void GTestLog(GTestLogSeverity severity, const char* file,
|
||||
severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
|
||||
fprintf(stderr, "\n%s %s:%d: %s\n", marker, file, line, msg);
|
||||
if (severity == GTEST_FATAL) {
|
||||
fflush(NULL); // abort() is not guaranteed to flush open file streams.
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
|
||||
// Disable Microsoft deprecation warnings for POSIX functions called from
|
||||
// this class (creat, dup, dup2, and close)
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4996)
|
||||
#endif // _MSC_VER
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines the stderr capturer.
|
||||
|
||||
@@ -415,26 +94,13 @@ class CapturedStderr {
|
||||
public:
|
||||
// The ctor redirects stderr to a temporary file.
|
||||
CapturedStderr() {
|
||||
uncaptured_fd_ = dup(kStdErrFileno);
|
||||
uncaptured_fd_ = dup(STDERR_FILENO);
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
||||
char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
||||
|
||||
::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
|
||||
::GetTempFileNameA(temp_dir_path, "gtest_redir", 0, temp_file_path);
|
||||
const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
|
||||
filename_ = temp_file_path;
|
||||
#else
|
||||
// There's no guarantee that a test has write access to the
|
||||
// current directory, so we create the temporary file in the /tmp
|
||||
// directory instead.
|
||||
char name_template[] = "/tmp/captured_stderr.XXXXXX";
|
||||
char name_template[] = "captured_stderr.XXXXXX";
|
||||
const int captured_fd = mkstemp(name_template);
|
||||
filename_ = name_template;
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
fflush(NULL);
|
||||
dup2(captured_fd, kStdErrFileno);
|
||||
dup2(captured_fd, STDERR_FILENO);
|
||||
close(captured_fd);
|
||||
}
|
||||
|
||||
@@ -446,7 +112,7 @@ class CapturedStderr {
|
||||
void StopCapture() {
|
||||
// Restores the original stream.
|
||||
fflush(NULL);
|
||||
dup2(uncaptured_fd_, kStdErrFileno);
|
||||
dup2(uncaptured_fd_, STDERR_FILENO);
|
||||
close(uncaptured_fd_);
|
||||
uncaptured_fd_ = -1;
|
||||
}
|
||||
@@ -461,10 +127,6 @@ class CapturedStderr {
|
||||
::std::string filename_;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif // _MSC_VER
|
||||
|
||||
static CapturedStderr* g_captured_stderr = NULL;
|
||||
|
||||
// Returns the size (in bytes) of a file.
|
||||
@@ -474,6 +136,8 @@ static size_t GetFileSize(FILE * 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];
|
||||
@@ -499,7 +163,7 @@ static ::std::string ReadEntireFile(FILE * file) {
|
||||
// Starts capturing stderr.
|
||||
void CaptureStderr() {
|
||||
if (g_captured_stderr != NULL) {
|
||||
GTEST_LOG_(FATAL, "Only one stderr capturer can exist at one time.");
|
||||
GTEST_LOG(FATAL, "Only one stderr capturer can exist at one time.");
|
||||
}
|
||||
g_captured_stderr = new CapturedStderr;
|
||||
}
|
||||
@@ -509,18 +173,9 @@ void CaptureStderr() {
|
||||
// use it here.
|
||||
::std::string GetCapturedStderr() {
|
||||
g_captured_stderr->StopCapture();
|
||||
|
||||
// Disables Microsoft deprecation warning for fopen and fclose.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4996)
|
||||
#endif // _MSC_VER
|
||||
FILE* const file = fopen(g_captured_stderr->filename().c_str(), "r");
|
||||
const ::std::string content = ReadEntireFile(file);
|
||||
fclose(file);
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif // _MSC_VER
|
||||
|
||||
delete g_captured_stderr;
|
||||
g_captured_stderr = NULL;
|
||||
@@ -528,10 +183,6 @@ void CaptureStderr() {
|
||||
return content;
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||
::std::vector<String> g_argvs;
|
||||
|
||||
@@ -540,19 +191,11 @@ const ::std::vector<String>& GetArgvs() { return g_argvs; }
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
void abort() {
|
||||
DebugBreak();
|
||||
TerminateProcess(GetCurrentProcess(), 1);
|
||||
}
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
// 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();
|
||||
const String full_flag = (Message() << GTEST_FLAG_PREFIX << flag).GetString();
|
||||
|
||||
Message env_var;
|
||||
for (int i = 0; i != full_flag.GetLength(); i++) {
|
||||
@@ -562,6 +205,17 @@ static String FlagToEnvVar(const char* flag) {
|
||||
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.
|
||||
@@ -603,17 +257,6 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reads and returns the Boolean environment variable corresponding to
|
||||
// the given flag; if it's not set, returns default_value.
|
||||
//
|
||||
// The value is considered true iff it's not "0".
|
||||
bool BoolFromGTestEnv(const char* flag, bool default_value) {
|
||||
const 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;
|
||||
}
|
||||
|
||||
// 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.
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: mheule@google.com (Markus Heule)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
|
||||
#include <gtest/gtest-test-part.h>
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
namespace testing {
|
||||
|
||||
// Gets the summary of the failure message by omitting the stack trace
|
||||
// in it.
|
||||
internal::String TestPartResult::ExtractSummary(const char* message) {
|
||||
const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
|
||||
return stack_trace == NULL ? internal::String(message) :
|
||||
internal::String(message, stack_trace - message);
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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);
|
||||
internal::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();
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
HasNewFatalFailureHelper::HasNewFatalFailureHelper()
|
||||
: has_new_fatal_failure_(false),
|
||||
original_reporter_(UnitTest::GetInstance()->impl()->
|
||||
GetTestPartResultReporterForCurrentThread()) {
|
||||
UnitTest::GetInstance()->impl()->SetTestPartResultReporterForCurrentThread(
|
||||
this);
|
||||
}
|
||||
|
||||
HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
|
||||
UnitTest::GetInstance()->impl()->SetTestPartResultReporterForCurrentThread(
|
||||
original_reporter_);
|
||||
}
|
||||
|
||||
void HasNewFatalFailureHelper::ReportTestPartResult(
|
||||
const TestPartResult& result) {
|
||||
if (result.fatally_failed())
|
||||
has_new_fatal_failure_ = true;
|
||||
original_reporter_->ReportTestPartResult(result);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
@@ -1,98 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <gtest/gtest-typed-test.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
// Verifies that registered_tests match the test names in
|
||||
// defined_test_names_; returns registered_tests if successful, or
|
||||
// aborts the program otherwise.
|
||||
const char* TypedTestCasePState::VerifyRegisteredTestNames(
|
||||
const char* file, int line, const char* registered_tests) {
|
||||
typedef ::std::set<const char*>::const_iterator DefinedTestIter;
|
||||
registered_ = true;
|
||||
|
||||
Message errors;
|
||||
::std::set<String> tests;
|
||||
for (const char* names = registered_tests; names != NULL;
|
||||
names = SkipComma(names)) {
|
||||
const String name = GetPrefixUntilComma(names);
|
||||
if (tests.count(name) != 0) {
|
||||
errors << "Test " << name << " is listed more than once.\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
bool found = false;
|
||||
for (DefinedTestIter it = defined_test_names_.begin();
|
||||
it != defined_test_names_.end();
|
||||
++it) {
|
||||
if (name == *it) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
tests.insert(name);
|
||||
} else {
|
||||
errors << "No test named " << name
|
||||
<< " can be found in this test case.\n";
|
||||
}
|
||||
}
|
||||
|
||||
for (DefinedTestIter it = defined_test_names_.begin();
|
||||
it != defined_test_names_.end();
|
||||
++it) {
|
||||
if (tests.count(*it) == 0) {
|
||||
errors << "You forgot to list test " << *it << ".\n";
|
||||
}
|
||||
}
|
||||
|
||||
const String& errors_str = errors.GetString();
|
||||
if (errors_str != "") {
|
||||
fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
|
||||
errors_str.c_str());
|
||||
fflush(stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
return registered_tests;
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
1391
src/gtest.cc
1391
src/gtest.cc
File diff suppressed because it is too large
Load Diff
@@ -33,21 +33,8 @@
|
||||
|
||||
#include <gtest/gtest-death-test.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <gtest/internal/gtest-filepath.h>
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#include <direct.h> // For chdir().
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h> // For waitpid.
|
||||
#include <limits> // For std::numeric_limits.
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
#include <gtest/gtest-spi.h>
|
||||
|
||||
@@ -56,18 +43,12 @@
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
using testing::Message;
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
using testing::internal::DeathTest;
|
||||
using testing::internal::DeathTestFactory;
|
||||
using testing::internal::FilePath;
|
||||
using testing::internal::GetLastSystemErrorMessage;
|
||||
using testing::internal::ParseNaturalNumber;
|
||||
using testing::internal::String;
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
@@ -102,39 +83,20 @@ class ReplaceDeathTestFactory {
|
||||
|
||||
class TestForDeathTest : public testing::Test {
|
||||
protected:
|
||||
TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}
|
||||
|
||||
virtual ~TestForDeathTest() {
|
||||
#if GTEST_OS_WINDOWS
|
||||
_chdir(original_dir_.c_str());
|
||||
#else
|
||||
chdir(original_dir_.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
// A static member function that's expected to die.
|
||||
static void StaticMemberFunction() {
|
||||
fprintf(stderr, "%s", "death inside StaticMemberFunction().");
|
||||
fflush(stderr);
|
||||
// We call _exit() instead of exit(), as the former is a direct
|
||||
// system call and thus safer in the presence of threads. exit()
|
||||
// will invoke user-defined exit-hooks, which may do dangerous
|
||||
// things that conflict with death tests.
|
||||
_exit(1);
|
||||
GTEST_LOG(FATAL, "death inside StaticMemberFunction().");
|
||||
}
|
||||
|
||||
// A method of the test fixture that may die.
|
||||
void MemberFunction() {
|
||||
if (should_die_) {
|
||||
fprintf(stderr, "%s", "death inside MemberFunction().");
|
||||
fflush(stderr);
|
||||
_exit(1);
|
||||
GTEST_LOG(FATAL, "death inside MemberFunction().");
|
||||
}
|
||||
}
|
||||
|
||||
// True iff MemberFunction() should die.
|
||||
bool should_die_;
|
||||
const FilePath original_dir_;
|
||||
};
|
||||
|
||||
// A class with a member function that may die.
|
||||
@@ -145,7 +107,7 @@ class MayDie {
|
||||
// A member function that may die.
|
||||
void MemberFunction() const {
|
||||
if (should_die_) {
|
||||
GTEST_LOG_(FATAL, "death inside MayDie::MemberFunction().");
|
||||
GTEST_LOG(FATAL, "death inside MayDie::MemberFunction().");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,26 +118,26 @@ class MayDie {
|
||||
|
||||
// A global function that's expected to die.
|
||||
void GlobalFunction() {
|
||||
GTEST_LOG_(FATAL, "death inside GlobalFunction().");
|
||||
GTEST_LOG(FATAL, "death inside GlobalFunction().");
|
||||
}
|
||||
|
||||
// A non-void function that's expected to die.
|
||||
int NonVoidFunction() {
|
||||
GTEST_LOG_(FATAL, "death inside 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().");
|
||||
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().");
|
||||
GTEST_LOG(FATAL, "death inside DieIfLessThan().");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -190,33 +152,18 @@ void DeathTestSubroutine() {
|
||||
int DieInDebugElse12(int* sideeffect) {
|
||||
if (sideeffect) *sideeffect = 12;
|
||||
#ifndef NDEBUG
|
||||
GTEST_LOG_(FATAL, "debug death inside DieInDebugElse12()");
|
||||
GTEST_LOG(FATAL, "debug death inside DieInDebugElse12()");
|
||||
#endif // NDEBUG
|
||||
return 12;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
|
||||
// Tests the ExitedWithCode predicate.
|
||||
TEST(ExitStatusPredicateTest, ExitedWithCode) {
|
||||
// On Windows, the process's exit code is the same as its exit status,
|
||||
// so the predicate just compares the its input with its parameter.
|
||||
EXPECT_TRUE(testing::ExitedWithCode(0)(0));
|
||||
EXPECT_TRUE(testing::ExitedWithCode(1)(1));
|
||||
EXPECT_TRUE(testing::ExitedWithCode(42)(42));
|
||||
EXPECT_FALSE(testing::ExitedWithCode(0)(1));
|
||||
EXPECT_FALSE(testing::ExitedWithCode(1)(0));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// Returns the exit status of a process that calls _exit(2) with a
|
||||
// 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);
|
||||
exit(exit_code);
|
||||
}
|
||||
int status;
|
||||
waitpid(child_pid, &status, 0);
|
||||
@@ -232,7 +179,7 @@ static int KilledExitStatus(int signum) {
|
||||
pid_t child_pid = fork();
|
||||
if (child_pid == 0) {
|
||||
raise(signum);
|
||||
_exit(1);
|
||||
exit(1);
|
||||
}
|
||||
int status;
|
||||
waitpid(child_pid, &status, 0);
|
||||
@@ -267,8 +214,6 @@ TEST(ExitStatusPredicateTest, KilledBySignal) {
|
||||
EXPECT_FALSE(pred_kill(status_segv));
|
||||
}
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// 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.
|
||||
@@ -278,7 +223,7 @@ TEST_F(TestForDeathTest, SingleStatement) {
|
||||
ASSERT_DEATH(return, "");
|
||||
|
||||
if (true)
|
||||
EXPECT_DEATH(_exit(1), "");
|
||||
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"
|
||||
@@ -290,84 +235,46 @@ TEST_F(TestForDeathTest, SingleStatement) {
|
||||
if (false)
|
||||
;
|
||||
else
|
||||
EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3;
|
||||
EXPECT_DEATH(exit(1), "") << 1 << 2 << 3;
|
||||
}
|
||||
|
||||
void DieWithEmbeddedNul() {
|
||||
fprintf(stderr, "Hello%cworld.\n", '\0');
|
||||
fflush(stderr);
|
||||
_exit(1);
|
||||
abort();
|
||||
}
|
||||
|
||||
#if GTEST_USES_PCRE
|
||||
// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
|
||||
// message has a NUL character in it.
|
||||
TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
|
||||
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");
|
||||
}
|
||||
#endif // GTEST_USES_PCRE
|
||||
|
||||
// Tests that death test macros expand to code which interacts well with switch
|
||||
// statements.
|
||||
TEST_F(TestForDeathTest, SwitchStatement) {
|
||||
// Microsoft compiler usually complains about switch statements without
|
||||
// case labels. We suppress that warning for this test.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4065)
|
||||
#endif // _MSC_VER
|
||||
|
||||
switch (0)
|
||||
default:
|
||||
ASSERT_DEATH(_exit(1), "") << "exit in default switch handler";
|
||||
ASSERT_DEATH(exit(1), "") << "exit in default switch handler";
|
||||
|
||||
switch (0)
|
||||
case 0:
|
||||
EXPECT_DEATH(_exit(1), "") << "exit in switch case";
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif // _MSC_VER
|
||||
EXPECT_DEATH(exit(1), "") << "exit in switch case";
|
||||
}
|
||||
|
||||
// Tests that a static member function can be used in a "fast" style
|
||||
// death test.
|
||||
TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {
|
||||
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||
// 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 "fast"
|
||||
// style death test.
|
||||
TEST_F(TestForDeathTest, MemberFunctionFastStyle) {
|
||||
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||
// 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");
|
||||
}
|
||||
|
||||
void ChangeToRootDir() {
|
||||
#if GTEST_OS_WINDOWS
|
||||
_chdir("\\");
|
||||
#else
|
||||
chdir("/");
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
// Tests that death tests work even if the current directory has been
|
||||
// changed.
|
||||
TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
|
||||
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||
|
||||
ChangeToRootDir();
|
||||
EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
|
||||
|
||||
ChangeToRootDir();
|
||||
ASSERT_DEATH(_exit(1), "");
|
||||
}
|
||||
|
||||
// Repeats a representative sample of death tests in the "threadsafe" style:
|
||||
|
||||
TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
|
||||
@@ -385,24 +292,14 @@ 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, ThreadsafeDeathTestInChangedDir) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
|
||||
ChangeToRootDir();
|
||||
EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
|
||||
|
||||
ChangeToRootDir();
|
||||
ASSERT_DEATH(_exit(1), "");
|
||||
EXPECT_EXIT(exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, MixedStyles) {
|
||||
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
EXPECT_DEATH(_exit(1), "");
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||
EXPECT_DEATH(_exit(1), "");
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
}
|
||||
|
||||
namespace {
|
||||
@@ -415,20 +312,14 @@ void SetPthreadFlag() {
|
||||
|
||||
} // namespace
|
||||
|
||||
#if GTEST_HAS_CLONE
|
||||
|
||||
TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
|
||||
if (!testing::GTEST_FLAG(death_test_use_fork)) {
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_CLONE
|
||||
|
||||
// Tests that a method of another class can be used in a death test.
|
||||
TEST_F(TestForDeathTest, MethodOfAnotherClass) {
|
||||
const MayDie x(true);
|
||||
@@ -576,6 +467,31 @@ TEST_F(TestForDeathTest, TestExpectDebugDeath) {
|
||||
#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.
|
||||
@@ -583,7 +499,7 @@ TEST_F(TestForDeathTest, TestExpectDebugDeath) {
|
||||
//
|
||||
// In opt mode:
|
||||
// 1. Has side effects and returns the expected value (12).
|
||||
TEST_F(TestForDeathTest, TestAssertDebugDeath) {
|
||||
TEST_F(TestForDeathTest, TestAssertDebugDeathM) {
|
||||
int sideeffect = 0;
|
||||
|
||||
ASSERT_DEBUG_DEATH({ // NOLINT
|
||||
@@ -591,7 +507,7 @@ TEST_F(TestForDeathTest, TestAssertDebugDeath) {
|
||||
EXPECT_EQ(12, DieInDebugElse12(&sideeffect));
|
||||
// Tests that the side effect occurred in opt mode.
|
||||
EXPECT_EQ(12, sideeffect);
|
||||
}, "death.*DieInDebugElse12");
|
||||
}, "death.*DieInDebugElse12") << "In AssertDebugDeathM";
|
||||
|
||||
#ifdef NDEBUG
|
||||
// Checks that the assignment occurs in opt mode (sideeffect).
|
||||
@@ -610,30 +526,6 @@ void ExpectDebugDeathHelper(bool* aborted) {
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
|
||||
printf("This test should be considered failing if it shows "
|
||||
"any pop-up dialogs.\n");
|
||||
fflush(stdout);
|
||||
|
||||
EXPECT_DEATH({
|
||||
testing::GTEST_FLAG(catch_exceptions) = false;
|
||||
abort();
|
||||
}, "");
|
||||
}
|
||||
|
||||
TEST(PopUpDeathTest, DoesNotShowPopUpOnThrow) {
|
||||
printf("This test should be considered failing if it shows "
|
||||
"any pop-up dialogs.\n");
|
||||
fflush(stdout);
|
||||
|
||||
EXPECT_DEATH({
|
||||
testing::GTEST_FLAG(catch_exceptions) = false;
|
||||
throw 1;
|
||||
}, "");
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
|
||||
// the function.
|
||||
TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
|
||||
@@ -660,56 +552,27 @@ TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
|
||||
#endif // _NDEBUG
|
||||
|
||||
// Tests the *_EXIT family of macros, using a variety of predicates.
|
||||
static void TestExitMacros() {
|
||||
EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
|
||||
ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
EXPECT_EXIT({
|
||||
testing::GTEST_FLAG(catch_exceptions) = false;
|
||||
*static_cast<int*>(NULL) = 1;
|
||||
}, testing::ExitedWithCode(0xC0000005), "") << "foo";
|
||||
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_EXIT({
|
||||
testing::GTEST_FLAG(catch_exceptions) = false;
|
||||
*static_cast<int*>(NULL) = 1;
|
||||
}, testing::ExitedWithCode(0), "") << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
|
||||
// Of all signals effects on the process exit code, only those of SIGABRT
|
||||
// are documented on Windows.
|
||||
// See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
|
||||
EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "");
|
||||
#else
|
||||
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_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "")
|
||||
<< "This failure is expected, too.";
|
||||
}, "This failure is expected, too.");
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
|
||||
<< "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, ExitMacros) {
|
||||
TestExitMacros();
|
||||
}
|
||||
|
||||
TEST_F(TestForDeathTest, ExitMacrosUsingFork) {
|
||||
testing::GTEST_FLAG(death_test_use_fork) = true;
|
||||
TestExitMacros();
|
||||
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.";
|
||||
EXPECT_DEATH(exit(0), "") << "This failure is expected.";
|
||||
}, "This failure is expected.");
|
||||
}
|
||||
|
||||
@@ -845,7 +708,7 @@ bool MockDeathTestFactory::Create(const char* statement,
|
||||
return true;
|
||||
}
|
||||
|
||||
// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.
|
||||
// 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 {
|
||||
@@ -956,7 +819,7 @@ TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
|
||||
// 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
|
||||
// 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,
|
||||
@@ -975,171 +838,21 @@ static size_t GetSuccessfulTestPartCount() {
|
||||
// Tests that a successful death test does not register a successful
|
||||
// test part.
|
||||
TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
|
||||
EXPECT_DEATH(_exit(1), "");
|
||||
EXPECT_DEATH(exit(1), "");
|
||||
EXPECT_EQ(0u, GetSuccessfulTestPartCount());
|
||||
}
|
||||
|
||||
TEST(StreamingAssertionsDeathTest, DeathTest) {
|
||||
EXPECT_DEATH(_exit(1), "") << "unexpected failure";
|
||||
ASSERT_DEATH(_exit(1), "") << "unexpected failure";
|
||||
EXPECT_DEATH(exit(1), "") << "unexpected failure";
|
||||
ASSERT_DEATH(exit(1), "") << "unexpected failure";
|
||||
EXPECT_NONFATAL_FAILURE({ // NOLINT
|
||||
EXPECT_DEATH(_exit(0), "") << "expected failure";
|
||||
EXPECT_DEATH(exit(0), "") << "expected failure";
|
||||
}, "expected failure");
|
||||
EXPECT_FATAL_FAILURE({ // NOLINT
|
||||
ASSERT_DEATH(_exit(0), "") << "expected failure";
|
||||
ASSERT_DEATH(exit(0), "") << "expected failure";
|
||||
}, "expected failure");
|
||||
}
|
||||
|
||||
// Tests that GetLastSystemErrorMessage returns an empty string when the
|
||||
// last error is 0 and non-empty string when it is non-zero.
|
||||
TEST(GetLastSystemErrorMessageTest, GetLastSystemErrorMessageWorks) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
::SetLastError(ERROR_FILE_NOT_FOUND);
|
||||
EXPECT_STRNE("", GetLastSystemErrorMessage().c_str());
|
||||
::SetLastError(0);
|
||||
EXPECT_STREQ("", GetLastSystemErrorMessage().c_str());
|
||||
#else
|
||||
errno = ENOENT;
|
||||
EXPECT_STRNE("", GetLastSystemErrorMessage().c_str());
|
||||
errno = 0;
|
||||
EXPECT_STREQ("", GetLastSystemErrorMessage().c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
TEST(AutoHandleTest, AutoHandleWorks) {
|
||||
HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
ASSERT_NE(INVALID_HANDLE_VALUE, handle);
|
||||
|
||||
// Tests that the AutoHandle is correctly initialized with a handle.
|
||||
testing::internal::AutoHandle auto_handle(handle);
|
||||
EXPECT_EQ(handle, auto_handle.Get());
|
||||
|
||||
// Tests that Reset assigns INVALID_HANDLE_VALUE.
|
||||
// Note that this cannot verify whether the original handle is closed.
|
||||
auto_handle.Reset();
|
||||
EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());
|
||||
|
||||
// Tests that Reset assigns the new handle.
|
||||
// Note that this cannot verify whether the original handle is closed.
|
||||
handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
ASSERT_NE(INVALID_HANDLE_VALUE, handle);
|
||||
auto_handle.Reset(handle);
|
||||
EXPECT_EQ(handle, auto_handle.Get());
|
||||
|
||||
// Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.
|
||||
testing::internal::AutoHandle auto_handle2;
|
||||
EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
typedef unsigned __int64 BiggestParsable;
|
||||
typedef signed __int64 BiggestSignedParsable;
|
||||
const BiggestParsable kBiggestParsableMax = ULLONG_MAX;
|
||||
const BiggestParsable kBiggestSignedParsableMax = LLONG_MAX;
|
||||
#else
|
||||
typedef unsigned long long BiggestParsable;
|
||||
typedef signed long long BiggestSignedParsable;
|
||||
const BiggestParsable kBiggestParsableMax =
|
||||
::std::numeric_limits<BiggestParsable>::max();
|
||||
const BiggestSignedParsable kBiggestSignedParsableMax =
|
||||
::std::numeric_limits<BiggestSignedParsable>::max();
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
TEST(ParseNaturalNumberTest, RejectsInvalidFormat) {
|
||||
BiggestParsable result = 0;
|
||||
|
||||
// Rejects non-numbers.
|
||||
EXPECT_FALSE(ParseNaturalNumber(String("non-number string"), &result));
|
||||
|
||||
// Rejects numbers with whitespace prefix.
|
||||
EXPECT_FALSE(ParseNaturalNumber(String(" 123"), &result));
|
||||
|
||||
// Rejects negative numbers.
|
||||
EXPECT_FALSE(ParseNaturalNumber(String("-123"), &result));
|
||||
|
||||
// Rejects numbers starting with a plus sign.
|
||||
EXPECT_FALSE(ParseNaturalNumber(String("+123"), &result));
|
||||
errno = 0;
|
||||
}
|
||||
|
||||
TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {
|
||||
BiggestParsable result = 0;
|
||||
|
||||
EXPECT_FALSE(ParseNaturalNumber(String("99999999999999999999999"), &result));
|
||||
|
||||
signed char char_result = 0;
|
||||
EXPECT_FALSE(ParseNaturalNumber(String("200"), &char_result));
|
||||
errno = 0;
|
||||
}
|
||||
|
||||
TEST(ParseNaturalNumberTest, AcceptsValidNumbers) {
|
||||
BiggestParsable result = 0;
|
||||
|
||||
result = 0;
|
||||
ASSERT_TRUE(ParseNaturalNumber(String("123"), &result));
|
||||
EXPECT_EQ(123, result);
|
||||
|
||||
// Check 0 as an edge case.
|
||||
result = 1;
|
||||
ASSERT_TRUE(ParseNaturalNumber(String("0"), &result));
|
||||
EXPECT_EQ(0, result);
|
||||
|
||||
result = 1;
|
||||
ASSERT_TRUE(ParseNaturalNumber(String("00000"), &result));
|
||||
EXPECT_EQ(0, result);
|
||||
}
|
||||
|
||||
TEST(ParseNaturalNumberTest, AcceptsTypeLimits) {
|
||||
Message msg;
|
||||
msg << kBiggestParsableMax;
|
||||
|
||||
BiggestParsable result = 0;
|
||||
EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));
|
||||
EXPECT_EQ(kBiggestParsableMax, result);
|
||||
|
||||
Message msg2;
|
||||
msg2 << kBiggestSignedParsableMax;
|
||||
|
||||
BiggestSignedParsable signed_result = 0;
|
||||
EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));
|
||||
EXPECT_EQ(kBiggestSignedParsableMax, signed_result);
|
||||
|
||||
Message msg3;
|
||||
msg3 << INT_MAX;
|
||||
|
||||
int int_result = 0;
|
||||
EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));
|
||||
EXPECT_EQ(INT_MAX, int_result);
|
||||
|
||||
Message msg4;
|
||||
msg4 << UINT_MAX;
|
||||
|
||||
unsigned int uint_result = 0;
|
||||
EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));
|
||||
EXPECT_EQ(UINT_MAX, uint_result);
|
||||
}
|
||||
|
||||
TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
|
||||
short short_result = 0;
|
||||
ASSERT_TRUE(ParseNaturalNumber(String("123"), &short_result));
|
||||
EXPECT_EQ(123, short_result);
|
||||
|
||||
signed char char_result = 0;
|
||||
ASSERT_TRUE(ParseNaturalNumber(String("123"), &char_result));
|
||||
EXPECT_EQ(123, char_result);
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
TEST(EnvironmentTest, HandleFitsIntoSizeT) {
|
||||
// TODO(vladl@google.com): Remove this test after this condition is verified
|
||||
// in a static assertion in gtest-death-test.cc in the function
|
||||
// GetStatusFileDescriptor.
|
||||
ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Tests that a test case whose name ends with "DeathTest" works fine
|
||||
|
||||
@@ -46,74 +46,22 @@
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include <windows.h> // NOLINT
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#include <direct.h> // NOLINT
|
||||
#endif // _WIN32_WCE
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <direct.h>
|
||||
#define PATH_SEP "\\"
|
||||
#else
|
||||
#define PATH_SEP "/"
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
namespace {
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// Windows CE doesn't have the remove C function.
|
||||
int remove(const char* path) {
|
||||
LPCWSTR wpath = String::AnsiToUtf16(path);
|
||||
int ret = DeleteFile(wpath) ? 0 : -1;
|
||||
delete [] wpath;
|
||||
return ret;
|
||||
}
|
||||
// Windows CE doesn't have the _rmdir C function.
|
||||
int _rmdir(const char* path) {
|
||||
FilePath filepath(path);
|
||||
LPCWSTR wpath = String::AnsiToUtf16(
|
||||
filepath.RemoveTrailingPathSeparator().c_str());
|
||||
int ret = RemoveDirectory(wpath) ? 0 : -1;
|
||||
delete [] wpath;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
|
||||
TEST(GetCurrentDirTest, ReturnsCurrentDir) {
|
||||
const FilePath original_dir = FilePath::GetCurrentDir();
|
||||
EXPECT_FALSE(original_dir.IsEmpty());
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
_chdir(GTEST_PATH_SEP_);
|
||||
const FilePath cwd = FilePath::GetCurrentDir();
|
||||
_chdir(original_dir.c_str());
|
||||
// Skips the ":".
|
||||
const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
|
||||
ASSERT_TRUE(cwd_without_drive != NULL);
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
|
||||
#else
|
||||
chdir(GTEST_PATH_SEP_);
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_, FilePath::GetCurrentDir().c_str());
|
||||
chdir(original_dir.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
|
||||
EXPECT_TRUE(FilePath("").IsEmpty());
|
||||
EXPECT_TRUE(FilePath(NULL).IsEmpty());
|
||||
}
|
||||
|
||||
TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
|
||||
EXPECT_FALSE(FilePath("a").IsEmpty());
|
||||
EXPECT_FALSE(FilePath(".").IsEmpty());
|
||||
EXPECT_FALSE(FilePath("a/b").IsEmpty());
|
||||
EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
|
||||
}
|
||||
// FilePath's functions used by UnitTestOptions::GetOutputFile.
|
||||
|
||||
// RemoveDirectoryName "" -> ""
|
||||
TEST(RemoveDirectoryNameTest, WhenEmptyName) {
|
||||
@@ -129,154 +77,86 @@ TEST(RemoveDirectoryNameTest, ButNoDirectory) {
|
||||
// RemoveDirectoryName "/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
|
||||
FilePath(PATH_SEP "afile").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/" -> ""
|
||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
|
||||
EXPECT_STREQ("",
|
||||
FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().c_str());
|
||||
FilePath("adir" PATH_SEP).RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str());
|
||||
FilePath("adir" PATH_SEP "afile").RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
// RemoveDirectoryName "adir/subdir/afile" -> "afile"
|
||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
|
||||
EXPECT_STREQ("afile",
|
||||
FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
|
||||
FilePath("adir" PATH_SEP "subdir" PATH_SEP "afile")
|
||||
.RemoveDirectoryName().c_str());
|
||||
}
|
||||
|
||||
|
||||
// RemoveFileName "" -> "./"
|
||||
TEST(RemoveFileNameTest, EmptyName) {
|
||||
#ifdef _WIN32_WCE
|
||||
// On Windows CE, we use the root as the current directory.
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_,
|
||||
EXPECT_STREQ("." PATH_SEP,
|
||||
FilePath("").RemoveFileName().c_str());
|
||||
#else
|
||||
EXPECT_STREQ("." GTEST_PATH_SEP_,
|
||||
FilePath("").RemoveFileName().c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
// RemoveFileName "adir/" -> "adir/"
|
||||
TEST(RemoveFileNameTest, ButNoFile) {
|
||||
EXPECT_STREQ("adir" GTEST_PATH_SEP_,
|
||||
FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().c_str());
|
||||
EXPECT_STREQ("adir" PATH_SEP,
|
||||
FilePath("adir" PATH_SEP).RemoveFileName().c_str());
|
||||
}
|
||||
|
||||
// RemoveFileName "adir/afile" -> "adir/"
|
||||
TEST(RemoveFileNameTest, GivesDirName) {
|
||||
EXPECT_STREQ("adir" GTEST_PATH_SEP_,
|
||||
FilePath("adir" GTEST_PATH_SEP_ "afile")
|
||||
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" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
|
||||
FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
|
||||
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(GTEST_PATH_SEP_,
|
||||
FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().c_str());
|
||||
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" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
|
||||
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" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar_12.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" PATH_SEP),
|
||||
FilePath("bar"), 0, "xml");
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
|
||||
FilePath actual = FilePath::MakeFileName(FilePath("foo" PATH_SEP),
|
||||
FilePath("bar"), 12, "xml");
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str());
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar_12.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
|
||||
0, "xml");
|
||||
EXPECT_STREQ("bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
|
||||
FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
|
||||
14, "xml");
|
||||
EXPECT_STREQ("bar_14.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
|
||||
FilePath("bar.xml"));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
|
||||
FilePath("bar.xml"));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, Path1BeingEmpty) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath(""),
|
||||
FilePath("bar.xml"));
|
||||
EXPECT_STREQ("bar.xml", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, Path2BeingEmpty) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
|
||||
FilePath(""));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_, actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, BothPathBeingEmpty) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath(""),
|
||||
FilePath(""));
|
||||
EXPECT_STREQ("", actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, Path1ContainsPathSep) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
|
||||
FilePath("foobar.xml"));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
|
||||
actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, Path2ContainsPathSep) {
|
||||
FilePath actual = FilePath::ConcatPaths(
|
||||
FilePath("foo" GTEST_PATH_SEP_),
|
||||
FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
|
||||
actual.c_str());
|
||||
}
|
||||
|
||||
TEST(ConcatPathsTest, Path2EndsWithPathSep) {
|
||||
FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
|
||||
FilePath("bar" GTEST_PATH_SEP_));
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "" -> ""
|
||||
TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
|
||||
@@ -292,140 +172,30 @@ TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
|
||||
|
||||
// RemoveTrailingPathSeparator "foo/" -> "foo"
|
||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
|
||||
EXPECT_STREQ(
|
||||
"foo",
|
||||
FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().c_str());
|
||||
EXPECT_STREQ("foo",
|
||||
FilePath("foo" PATH_SEP).RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
|
||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
|
||||
FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
|
||||
.RemoveTrailingPathSeparator().c_str());
|
||||
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" GTEST_PATH_SEP_ "bar",
|
||||
FilePath("foo" GTEST_PATH_SEP_ "bar")
|
||||
.RemoveTrailingPathSeparator().c_str());
|
||||
EXPECT_STREQ("foo" PATH_SEP "bar",
|
||||
FilePath("foo" PATH_SEP "bar").RemoveTrailingPathSeparator().c_str());
|
||||
}
|
||||
|
||||
TEST(DirectoryTest, RootDirectoryExists) {
|
||||
#if GTEST_OS_WINDOWS // We are on Windows.
|
||||
char current_drive[_MAX_PATH]; // NOLINT
|
||||
current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
|
||||
current_drive[1] = ':';
|
||||
current_drive[2] = '\\';
|
||||
current_drive[3] = '\0';
|
||||
EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
|
||||
#else
|
||||
EXPECT_TRUE(FilePath("/").DirectoryExists());
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
|
||||
const int saved_drive_ = _getdrive();
|
||||
// Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
|
||||
for (char drive = 'Z'; drive >= 'A'; drive--)
|
||||
if (_chdrive(drive - 'A' + 1) == -1) {
|
||||
char non_drive[_MAX_PATH]; // NOLINT
|
||||
non_drive[0] = drive;
|
||||
non_drive[1] = ':';
|
||||
non_drive[2] = '\\';
|
||||
non_drive[3] = '\0';
|
||||
EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
|
||||
break;
|
||||
}
|
||||
_chdrive(saved_drive_);
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
// Windows CE _does_ consider an empty directory to exist.
|
||||
TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
|
||||
EXPECT_FALSE(FilePath("").DirectoryExists());
|
||||
}
|
||||
#endif // ! _WIN32_WCE
|
||||
|
||||
TEST(DirectoryTest, CurrentDirectoryExists) {
|
||||
#if GTEST_OS_WINDOWS // We are on Windows.
|
||||
#ifndef _WIN32_CE // Windows CE doesn't have a current directory.
|
||||
EXPECT_TRUE(FilePath(".").DirectoryExists());
|
||||
EXPECT_TRUE(FilePath(".\\").DirectoryExists());
|
||||
#endif // _WIN32_CE
|
||||
#else
|
||||
EXPECT_TRUE(FilePath(".").DirectoryExists());
|
||||
EXPECT_TRUE(FilePath("./").DirectoryExists());
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
}
|
||||
|
||||
TEST(NormalizeTest, NullStringsEqualEmptyDirectory) {
|
||||
EXPECT_STREQ("", FilePath(NULL).c_str());
|
||||
EXPECT_STREQ("", FilePath(String(NULL)).c_str());
|
||||
}
|
||||
|
||||
// "foo/bar" == foo//bar" == "foo///bar"
|
||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
|
||||
FilePath("foo" GTEST_PATH_SEP_ "bar").c_str());
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
|
||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar",
|
||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
|
||||
GTEST_PATH_SEP_ "bar").c_str());
|
||||
}
|
||||
|
||||
// "/bar" == //bar" == "///bar"
|
||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
|
||||
FilePath(GTEST_PATH_SEP_ "bar").c_str());
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
|
||||
FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
|
||||
EXPECT_STREQ(GTEST_PATH_SEP_ "bar",
|
||||
FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str());
|
||||
}
|
||||
|
||||
// "foo/" == foo//" == "foo///"
|
||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_,
|
||||
FilePath("foo" GTEST_PATH_SEP_).c_str());
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_,
|
||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
|
||||
EXPECT_STREQ("foo" GTEST_PATH_SEP_,
|
||||
FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());
|
||||
}
|
||||
|
||||
TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
|
||||
FilePath default_path;
|
||||
FilePath non_default_path("path");
|
||||
non_default_path = default_path;
|
||||
EXPECT_STREQ("", non_default_path.c_str());
|
||||
EXPECT_STREQ("", default_path.c_str()); // RHS var is unchanged.
|
||||
}
|
||||
|
||||
TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
|
||||
FilePath non_default_path("path");
|
||||
FilePath default_path;
|
||||
default_path = non_default_path;
|
||||
EXPECT_STREQ("path", default_path.c_str());
|
||||
EXPECT_STREQ("path", non_default_path.c_str()); // RHS var is unchanged.
|
||||
}
|
||||
|
||||
TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
|
||||
const FilePath const_default_path("const_path");
|
||||
FilePath non_default_path("path");
|
||||
non_default_path = const_default_path;
|
||||
EXPECT_STREQ("const_path", non_default_path.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" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_)));
|
||||
"_directory_creation" PATH_SEP "test" PATH_SEP)));
|
||||
testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
|
||||
|
||||
unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
|
||||
@@ -436,7 +206,7 @@ class DirectoryCreationTest : public Test {
|
||||
remove(testdata_file_.c_str());
|
||||
remove(unique_file0_.c_str());
|
||||
remove(unique_file1_.c_str());
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
_rmdir(testdata_path_.c_str());
|
||||
#else
|
||||
rmdir(testdata_path_.c_str());
|
||||
@@ -447,7 +217,7 @@ class DirectoryCreationTest : public Test {
|
||||
remove(testdata_file_.c_str());
|
||||
remove(unique_file0_.c_str());
|
||||
remove(unique_file1_.c_str());
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
_rmdir(testdata_path_.c_str());
|
||||
#else
|
||||
rmdir(testdata_path_.c_str());
|
||||
@@ -458,7 +228,7 @@ class DirectoryCreationTest : public Test {
|
||||
#ifdef _WIN32_WCE
|
||||
return String("\\temp\\");
|
||||
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#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.
|
||||
@@ -478,7 +248,7 @@ class DirectoryCreationTest : public Test {
|
||||
}
|
||||
|
||||
void CreateTextFile(const char* filename) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
#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.
|
||||
@@ -589,24 +359,11 @@ TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
|
||||
|
||||
TEST(FilePathTest, IsDirectory) {
|
||||
EXPECT_FALSE(FilePath("cola").IsDirectory());
|
||||
EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
|
||||
}
|
||||
|
||||
TEST(FilePathTest, IsAbsolutePath) {
|
||||
EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
|
||||
EXPECT_FALSE(FilePath("").IsAbsolutePath());
|
||||
#if GTEST_OS_WINDOWS
|
||||
EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
|
||||
GTEST_PATH_SEP_ "relative").IsAbsolutePath());
|
||||
EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
|
||||
#else
|
||||
EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
|
||||
.IsAbsolutePath());
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
EXPECT_TRUE(FilePath("koala" PATH_SEP).IsDirectory());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
#undef GTEST_PATH_SEP_
|
||||
#undef PATH_SEP
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
// Copyright 2003, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: Dan Egnor (egnor@google.com)
|
||||
// Ported to Windows: Vadim Berman (vadimb@google.com)
|
||||
|
||||
#include <gtest/internal/gtest-linked_ptr.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace {
|
||||
|
||||
using testing::Message;
|
||||
using testing::internal::linked_ptr;
|
||||
|
||||
int num;
|
||||
Message* history = NULL;
|
||||
|
||||
// Class which tracks allocation/deallocation
|
||||
class A {
|
||||
public:
|
||||
A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
|
||||
virtual ~A() { *history << "A" << mynum << " dtor\n"; }
|
||||
virtual void Use() { *history << "A" << mynum << " use\n"; }
|
||||
protected:
|
||||
int mynum;
|
||||
};
|
||||
|
||||
// Subclass
|
||||
class B : public A {
|
||||
public:
|
||||
B() { *history << "B" << mynum << " ctor\n"; }
|
||||
~B() { *history << "B" << mynum << " dtor\n"; }
|
||||
virtual void Use() { *history << "B" << mynum << " use\n"; }
|
||||
};
|
||||
|
||||
class LinkedPtrTest : public testing::Test {
|
||||
public:
|
||||
LinkedPtrTest() {
|
||||
num = 0;
|
||||
history = new Message;
|
||||
}
|
||||
|
||||
virtual ~LinkedPtrTest() {
|
||||
delete history;
|
||||
history = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LinkedPtrTest, GeneralTest) {
|
||||
{
|
||||
linked_ptr<A> a0, a1, a2;
|
||||
a0 = a0;
|
||||
a1 = a2;
|
||||
ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
|
||||
ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
|
||||
ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
|
||||
ASSERT_TRUE(a0 == NULL);
|
||||
ASSERT_TRUE(a1 == NULL);
|
||||
ASSERT_TRUE(a2 == NULL);
|
||||
|
||||
{
|
||||
linked_ptr<A> a3(new A);
|
||||
a0 = a3;
|
||||
ASSERT_TRUE(a0 == a3);
|
||||
ASSERT_TRUE(a0 != NULL);
|
||||
ASSERT_TRUE(a0.get() == a3);
|
||||
ASSERT_TRUE(a0 == a3.get());
|
||||
linked_ptr<A> a4(a0);
|
||||
a1 = a4;
|
||||
linked_ptr<A> a5(new A);
|
||||
ASSERT_TRUE(a5.get() != a3);
|
||||
ASSERT_TRUE(a5 != a3.get());
|
||||
a2 = a5;
|
||||
linked_ptr<B> b0(new B);
|
||||
linked_ptr<A> a6(b0);
|
||||
ASSERT_TRUE(b0 == a6);
|
||||
ASSERT_TRUE(a6 == b0);
|
||||
ASSERT_TRUE(b0 != NULL);
|
||||
a5 = b0;
|
||||
a5 = b0;
|
||||
a3->Use();
|
||||
a4->Use();
|
||||
a5->Use();
|
||||
a6->Use();
|
||||
b0->Use();
|
||||
(*b0).Use();
|
||||
b0.get()->Use();
|
||||
}
|
||||
|
||||
a0->Use();
|
||||
a1->Use();
|
||||
a2->Use();
|
||||
|
||||
a1 = a2;
|
||||
a2.reset(new A);
|
||||
a0.reset();
|
||||
|
||||
linked_ptr<A> a7;
|
||||
}
|
||||
|
||||
ASSERT_STREQ(
|
||||
"A0 ctor\n"
|
||||
"A1 ctor\n"
|
||||
"A2 ctor\n"
|
||||
"B2 ctor\n"
|
||||
"A0 use\n"
|
||||
"A0 use\n"
|
||||
"B2 use\n"
|
||||
"B2 use\n"
|
||||
"B2 use\n"
|
||||
"B2 use\n"
|
||||
"B2 use\n"
|
||||
"B2 dtor\n"
|
||||
"A2 dtor\n"
|
||||
"A0 use\n"
|
||||
"A0 use\n"
|
||||
"A1 use\n"
|
||||
"A3 ctor\n"
|
||||
"A0 dtor\n"
|
||||
"A3 dtor\n"
|
||||
"A1 dtor\n",
|
||||
history->GetString().c_str()
|
||||
);
|
||||
}
|
||||
|
||||
} // Unnamed namespace
|
||||
@@ -40,30 +40,20 @@
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include <windows.h>
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#include <direct.h>
|
||||
#endif // _WIN32_WCE
|
||||
|
||||
// Indicates that this translation unit is part of Google Test's
|
||||
// implementation. It must come before gtest-internal-inl.h is
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
|
||||
namespace internal {
|
||||
namespace {
|
||||
|
||||
// Turns the given relative path into an absolute path.
|
||||
FilePath GetAbsolutePathOf(const FilePath& relative_path) {
|
||||
return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
|
||||
}
|
||||
|
||||
// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFormatDefault) {
|
||||
@@ -78,198 +68,55 @@ TEST(XmlOutputTest, GetOutputFormat) {
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileDefault) {
|
||||
GTEST_FLAG(output) = "";
|
||||
EXPECT_STREQ(GetAbsolutePathOf(FilePath("test_detail.xml")).c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
EXPECT_STREQ("test_detail.xml",
|
||||
UnitTestOptions::GetOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileSingleFile) {
|
||||
GTEST_FLAG(output) = "xml:filename.abc";
|
||||
EXPECT_STREQ(GetAbsolutePathOf(FilePath("filename.abc")).c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
EXPECT_STREQ("filename.abc",
|
||||
UnitTestOptions::GetOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
GTEST_FLAG(output) = "xml:path\\";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
EXPECT_TRUE(
|
||||
_strcmpi(output_file.c_str(),
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path\\gtest-options_test.xml")).c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path\\gtest-options-ex_test.xml")).c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path\\gtest_all_test.xml")).c_str()) == 0)
|
||||
<< " output_file = " << output_file;
|
||||
#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:path/";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
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 ==
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path/gtest-options_test.xml")).c_str() ||
|
||||
output_file ==
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path/lt-gtest-options_test.xml")).c_str() ||
|
||||
output_file ==
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path/gtest_all_test.xml")).c_str() ||
|
||||
output_file ==
|
||||
GetAbsolutePathOf(
|
||||
FilePath("path/lt-gtest_all_test.xml")).c_str())
|
||||
<< " output_file = " << output_file;
|
||||
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) || GTEST_OS_WINDOWS
|
||||
#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 ||
|
||||
_strcmpi("gtest_all_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" ||
|
||||
String(exe_str) == "gtest_all_test" ||
|
||||
String(exe_str) == "lt-gtest_all_test")
|
||||
String(exe_str) == "lt-gtest-options_test")
|
||||
<< "GetCurrentExecutableName() returns " << exe_str;
|
||||
#endif
|
||||
}
|
||||
|
||||
class XmlOutputChangeDirTest : public Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
original_working_dir_ = FilePath::GetCurrentDir();
|
||||
ChDir("..");
|
||||
// This will make the test fail if run from the root directory.
|
||||
EXPECT_STRNE(original_working_dir_.c_str(),
|
||||
FilePath::GetCurrentDir().c_str());
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
ChDir(original_working_dir_.c_str());
|
||||
}
|
||||
|
||||
void ChDir(const char* dir) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
_chdir(dir);
|
||||
#else
|
||||
chdir(dir);
|
||||
#endif
|
||||
}
|
||||
|
||||
FilePath original_working_dir_;
|
||||
};
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
|
||||
GTEST_FLAG(output) = "";
|
||||
EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("test_detail.xml")).c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
|
||||
GTEST_FLAG(output) = "xml";
|
||||
EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("test_detail.xml")).c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
|
||||
GTEST_FLAG(output) = "xml:filename.abc";
|
||||
EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("filename.abc")).c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
}
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
GTEST_FLAG(output) = "xml:path\\";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
EXPECT_TRUE(
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath::ConcatPaths(
|
||||
original_working_dir_,
|
||||
FilePath("path\\gtest-options_test.xml")).c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath::ConcatPaths(
|
||||
original_working_dir_,
|
||||
FilePath("path\\gtest-options-ex_test.xml")).c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath::ConcatPaths(
|
||||
original_working_dir_,
|
||||
FilePath("path\\gtest_all_test.xml")).c_str()) == 0)
|
||||
<< " output_file = " << output_file;
|
||||
#else
|
||||
GTEST_FLAG(output) = "xml:path/";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
// 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 == FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("path/gtest-options_test.xml")).c_str() ||
|
||||
output_file == FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("path/lt-gtest-options_test.xml")).c_str() ||
|
||||
output_file == FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("path/gtest_all_test.xml")).c_str() ||
|
||||
output_file == FilePath::ConcatPaths(original_working_dir_,
|
||||
FilePath("path/lt-gtest_all_test.xml")).c_str())
|
||||
<< " output_file = " << output_file;
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
|
||||
EXPECT_STREQ(FilePath("c:\\tmp\\filename.abc").c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
#else
|
||||
GTEST_FLAG(output) ="xml:/tmp/filename.abc";
|
||||
EXPECT_STREQ(FilePath("/tmp/filename.abc").c_str(),
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
GTEST_FLAG(output) = "xml:c:\\tmp\\";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
EXPECT_TRUE(
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath("c:\\tmp\\gtest-options_test.xml").c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath("c:\\tmp\\gtest-options-ex_test.xml").c_str()) == 0 ||
|
||||
_strcmpi(output_file.c_str(),
|
||||
FilePath("c:\\tmp\\gtest_all_test.xml").c_str()) == 0)
|
||||
<< " output_file = " << output_file;
|
||||
#else
|
||||
GTEST_FLAG(output) = "xml:/tmp/";
|
||||
const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();
|
||||
// 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 == "/tmp/gtest-options_test.xml" ||
|
||||
output_file == "/tmp/lt-gtest-options_test.xml" ||
|
||||
output_file == "/tmp/gtest_all_test.xml" ||
|
||||
output_file == "/tmp/lt-gtest_all_test.xml")
|
||||
<< " output_file = " << output_file;
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
//
|
||||
// Tests for Google Test itself. This verifies that the basic constructs of
|
||||
// Google Test work.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "test/gtest-param-test_test.h"
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
using ::testing::Values;
|
||||
using ::testing::internal::ParamGenerator;
|
||||
|
||||
// Tests that generators defined in a different translation unit
|
||||
// are functional. The test using extern_gen is defined
|
||||
// in gtest-param-test_test.cc.
|
||||
ParamGenerator<int> extern_gen = Values(33);
|
||||
|
||||
// Tests that a parameterized test case can be defined in one translation unit
|
||||
// and instantiated in another. The test is defined in gtest-param-test_test.cc
|
||||
// and ExternalInstantiationTest fixture class is defined in
|
||||
// gtest-param-test_test.h.
|
||||
INSTANTIATE_TEST_CASE_P(MultiplesOf33,
|
||||
ExternalInstantiationTest,
|
||||
Values(33, 66));
|
||||
|
||||
// Tests that a parameterized test case can be instantiated
|
||||
// in multiple translation units. Another instantiation is defined
|
||||
// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
|
||||
// fixture is defined in gtest-param-test_test.h
|
||||
INSTANTIATE_TEST_CASE_P(Sequence2,
|
||||
InstantiationInMultipleTranslaionUnitsTest,
|
||||
Values(42*3, 42*4, 42*5));
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
@@ -1,792 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: vladl@google.com (Vlad Losev)
|
||||
//
|
||||
// Tests for Google Test itself. This file verifies that the parameter
|
||||
// generators objects produce correct parameter sequences and that
|
||||
// Google Test runtime instantiates correct tests from those sequences.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
// To include gtest-internal-inl.h.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#include "src/gtest-internal-inl.h" // for UnitTestOptions
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
#include "test/gtest-param-test_test.h"
|
||||
|
||||
using ::std::vector;
|
||||
using ::std::sort;
|
||||
|
||||
using ::testing::AddGlobalTestEnvironment;
|
||||
using ::testing::Bool;
|
||||
using ::testing::Message;
|
||||
using ::testing::Range;
|
||||
using ::testing::TestWithParam;
|
||||
using ::testing::Values;
|
||||
using ::testing::ValuesIn;
|
||||
|
||||
#if GTEST_HAS_COMBINE
|
||||
using ::testing::Combine;
|
||||
using ::std::tr1::get;
|
||||
using ::std::tr1::make_tuple;
|
||||
using ::std::tr1::tuple;
|
||||
#endif // GTEST_HAS_COMBINE
|
||||
|
||||
using ::testing::internal::ParamGenerator;
|
||||
using ::testing::internal::UnitTestOptions;
|
||||
|
||||
// Verifies that a sequence generated by the generator and accessed
|
||||
// via the iterator object matches the expected one using Google Test
|
||||
// assertions.
|
||||
template <typename T, size_t N>
|
||||
void VerifyGenerator(const ParamGenerator<T>& generator,
|
||||
const T (&expected_values)[N]) {
|
||||
typename ParamGenerator<T>::iterator it = generator.begin();
|
||||
for (size_t i = 0; i < N; ++i) {
|
||||
ASSERT_FALSE(it == generator.end())
|
||||
<< "At element " << i << " when accessing via an iterator "
|
||||
<< "created with the copy constructor." << std::endl;
|
||||
EXPECT_EQ(expected_values[i], *it)
|
||||
<< "At element " << i << " when accessing via an iterator "
|
||||
<< "created with the copy constructor." << std::endl;
|
||||
it++;
|
||||
}
|
||||
EXPECT_TRUE(it == generator.end())
|
||||
<< "At the presumed end of sequence when accessing via an iterator "
|
||||
<< "created with the copy constructor." << std::endl;
|
||||
|
||||
// Test the iterator assignment. The following lines verify that
|
||||
// the sequence accessed via an iterator initialized via the
|
||||
// assignment operator (as opposed to a copy constructor) matches
|
||||
// just the same.
|
||||
it = generator.begin();
|
||||
for (size_t i = 0; i < N; ++i) {
|
||||
ASSERT_FALSE(it == generator.end())
|
||||
<< "At element " << i << " when accessing via an iterator "
|
||||
<< "created with the assignment operator." << std::endl;
|
||||
EXPECT_EQ(expected_values[i], *it)
|
||||
<< "At element " << i << " when accessing via an iterator "
|
||||
<< "created with the assignment operator." << std::endl;
|
||||
it++;
|
||||
}
|
||||
EXPECT_TRUE(it == generator.end())
|
||||
<< "At the presumed end of sequence when accessing via an iterator "
|
||||
<< "created with the assignment operator." << std::endl;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
|
||||
typename ParamGenerator<T>::iterator it = generator.begin();
|
||||
EXPECT_TRUE(it == generator.end());
|
||||
|
||||
it = generator.begin();
|
||||
EXPECT_TRUE(it == generator.end());
|
||||
}
|
||||
|
||||
// Generator tests. They test that each of the provided generator functions
|
||||
// generates an expected sequence of values. The general test pattern
|
||||
// instantiates a generator using one of the generator functions,
|
||||
// checks the sequence produced by the generator using its iterator API,
|
||||
// and then resets the iterator back to the beginning of the sequence
|
||||
// and checks the sequence again.
|
||||
|
||||
// Tests that iterators produced by generator functions conform to the
|
||||
// ForwardIterator concept.
|
||||
TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
|
||||
const ParamGenerator<int> gen = Range(0, 10);
|
||||
ParamGenerator<int>::iterator it = gen.begin();
|
||||
|
||||
// Verifies that iterator initialization works as expected.
|
||||
ParamGenerator<int>::iterator it2 = it;
|
||||
EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
|
||||
<< "element same as its source points to";
|
||||
|
||||
// Verifies that iterator assignment works as expected.
|
||||
it++;
|
||||
EXPECT_FALSE(*it == *it2);
|
||||
it2 = it;
|
||||
EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
|
||||
<< "element same as its source points to";
|
||||
|
||||
// Verifies that prefix operator++() returns *this.
|
||||
EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
|
||||
<< "refer to the original object";
|
||||
|
||||
// Verifies that the result of the postfix operator++ points to the value
|
||||
// pointed to by the original iterator.
|
||||
int original_value = *it; // Have to compute it outside of macro call to be
|
||||
// unaffected by the parameter evaluation order.
|
||||
EXPECT_EQ(original_value, *(it++));
|
||||
|
||||
// Verifies that prefix and postfix operator++() advance an iterator
|
||||
// all the same.
|
||||
it2 = it;
|
||||
it++;
|
||||
++it2;
|
||||
EXPECT_TRUE(*it == *it2);
|
||||
}
|
||||
|
||||
// Tests that Range() generates the expected sequence.
|
||||
TEST(RangeTest, IntRangeWithDefaultStep) {
|
||||
const ParamGenerator<int> gen = Range(0, 3);
|
||||
const int expected_values[] = {0, 1, 2};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Edge case. Tests that Range() generates the single element sequence
|
||||
// as expected when provided with range limits that are equal.
|
||||
TEST(RangeTest, IntRangeSingleValue) {
|
||||
const ParamGenerator<int> gen = Range(0, 1);
|
||||
const int expected_values[] = {0};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Edge case. Tests that Range() with generates empty sequence when
|
||||
// supplied with an empty range.
|
||||
TEST(RangeTest, IntRangeEmpty) {
|
||||
const ParamGenerator<int> gen = Range(0, 0);
|
||||
VerifyGeneratorIsEmpty(gen);
|
||||
}
|
||||
|
||||
// Tests that Range() with custom step (greater then one) generates
|
||||
// the expected sequence.
|
||||
TEST(RangeTest, IntRangeWithCustomStep) {
|
||||
const ParamGenerator<int> gen = Range(0, 9, 3);
|
||||
const int expected_values[] = {0, 3, 6};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that Range() with custom step (greater then one) generates
|
||||
// the expected sequence when the last element does not fall on the
|
||||
// upper range limit. Sequences generated by Range() must not have
|
||||
// elements beyond the range limits.
|
||||
TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
|
||||
const ParamGenerator<int> gen = Range(0, 4, 3);
|
||||
const int expected_values[] = {0, 3};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Verifies that Range works with user-defined types that define
|
||||
// copy constructor, operator=(), operator+(), and operator<().
|
||||
class DogAdder {
|
||||
public:
|
||||
explicit DogAdder(const char* value) : value_(value) {}
|
||||
DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
|
||||
|
||||
DogAdder operator=(const DogAdder& other) {
|
||||
if (this != &other)
|
||||
value_ = other.value_;
|
||||
return *this;
|
||||
}
|
||||
DogAdder operator+(const DogAdder& other) const {
|
||||
Message msg;
|
||||
msg << value_.c_str() << other.value_.c_str();
|
||||
return DogAdder(msg.GetString().c_str());
|
||||
}
|
||||
bool operator<(const DogAdder& other) const {
|
||||
return value_ < other.value_;
|
||||
}
|
||||
const ::testing::internal::String& value() const { return value_; }
|
||||
|
||||
private:
|
||||
::testing::internal::String value_;
|
||||
};
|
||||
|
||||
TEST(RangeTest, WorksWithACustomType) {
|
||||
const ParamGenerator<DogAdder> gen =
|
||||
Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
|
||||
ParamGenerator<DogAdder>::iterator it = gen.begin();
|
||||
|
||||
ASSERT_FALSE(it == gen.end());
|
||||
EXPECT_STREQ("cat", it->value().c_str());
|
||||
|
||||
ASSERT_FALSE(++it == gen.end());
|
||||
EXPECT_STREQ("catdog", it->value().c_str());
|
||||
|
||||
EXPECT_TRUE(++it == gen.end());
|
||||
}
|
||||
|
||||
class IntWrapper {
|
||||
public:
|
||||
explicit IntWrapper(int value) : value_(value) {}
|
||||
IntWrapper(const IntWrapper& other) : value_(other.value_) {}
|
||||
|
||||
IntWrapper operator=(const IntWrapper& other) {
|
||||
value_ = other.value_;
|
||||
return *this;
|
||||
}
|
||||
// operator+() adds a different type.
|
||||
IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
|
||||
bool operator<(const IntWrapper& other) const {
|
||||
return value_ < other.value_;
|
||||
}
|
||||
int value() const { return value_; }
|
||||
|
||||
private:
|
||||
int value_;
|
||||
};
|
||||
|
||||
TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
|
||||
const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
|
||||
ParamGenerator<IntWrapper>::iterator it = gen.begin();
|
||||
|
||||
ASSERT_FALSE(it == gen.end());
|
||||
EXPECT_EQ(0, it->value());
|
||||
|
||||
ASSERT_FALSE(++it == gen.end());
|
||||
EXPECT_EQ(1, it->value());
|
||||
|
||||
EXPECT_TRUE(++it == gen.end());
|
||||
}
|
||||
|
||||
// Tests that ValuesIn() with an array parameter generates
|
||||
// the expected sequence.
|
||||
TEST(ValuesInTest, ValuesInArray) {
|
||||
int array[] = {3, 5, 8};
|
||||
const ParamGenerator<int> gen = ValuesIn(array);
|
||||
VerifyGenerator(gen, array);
|
||||
}
|
||||
|
||||
// Tests that ValuesIn() with a const array parameter generates
|
||||
// the expected sequence.
|
||||
TEST(ValuesInTest, ValuesInConstArray) {
|
||||
const int array[] = {3, 5, 8};
|
||||
const ParamGenerator<int> gen = ValuesIn(array);
|
||||
VerifyGenerator(gen, array);
|
||||
}
|
||||
|
||||
// Edge case. Tests that ValuesIn() with an array parameter containing a
|
||||
// single element generates the single element sequence.
|
||||
TEST(ValuesInTest, ValuesInSingleElementArray) {
|
||||
int array[] = {42};
|
||||
const ParamGenerator<int> gen = ValuesIn(array);
|
||||
VerifyGenerator(gen, array);
|
||||
}
|
||||
|
||||
// Tests that ValuesIn() generates the expected sequence for an STL
|
||||
// container (vector).
|
||||
TEST(ValuesInTest, ValuesInVector) {
|
||||
typedef ::std::vector<int> ContainerType;
|
||||
ContainerType values;
|
||||
values.push_back(3);
|
||||
values.push_back(5);
|
||||
values.push_back(8);
|
||||
const ParamGenerator<int> gen = ValuesIn(values);
|
||||
|
||||
const int expected_values[] = {3, 5, 8};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that ValuesIn() generates the expected sequence.
|
||||
TEST(ValuesInTest, ValuesInIteratorRange) {
|
||||
typedef ::std::vector<int> ContainerType;
|
||||
ContainerType values;
|
||||
values.push_back(3);
|
||||
values.push_back(5);
|
||||
values.push_back(8);
|
||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
||||
|
||||
const int expected_values[] = {3, 5, 8};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
|
||||
// single value generates a single-element sequence.
|
||||
TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
|
||||
typedef ::std::vector<int> ContainerType;
|
||||
ContainerType values;
|
||||
values.push_back(42);
|
||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
||||
|
||||
const int expected_values[] = {42};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Edge case. Tests that ValuesIn() provided with an empty iterator range
|
||||
// generates an empty sequence.
|
||||
TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
|
||||
typedef ::std::vector<int> ContainerType;
|
||||
ContainerType values;
|
||||
const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
|
||||
|
||||
VerifyGeneratorIsEmpty(gen);
|
||||
}
|
||||
|
||||
// Tests that the Values() generates the expected sequence.
|
||||
TEST(ValuesTest, ValuesWorks) {
|
||||
const ParamGenerator<int> gen = Values(3, 5, 8);
|
||||
|
||||
const int expected_values[] = {3, 5, 8};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that Values() generates the expected sequences from elements of
|
||||
// different types convertible to ParamGenerator's parameter type.
|
||||
TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
|
||||
const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
|
||||
|
||||
const double expected_values[] = {3.0, 5.0, 8.0};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
TEST(ValuesTest, ValuesWorksForMaxLengthList) {
|
||||
const ParamGenerator<int> gen = Values(
|
||||
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
||||
110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
|
||||
210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
|
||||
310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
|
||||
410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
|
||||
|
||||
const int expected_values[] = {
|
||||
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
||||
110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
|
||||
210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
|
||||
310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
|
||||
410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Edge case test. Tests that single-parameter Values() generates the sequence
|
||||
// with the single value.
|
||||
TEST(ValuesTest, ValuesWithSingleParameter) {
|
||||
const ParamGenerator<int> gen = Values(42);
|
||||
|
||||
const int expected_values[] = {42};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that Bool() generates sequence (false, true).
|
||||
TEST(BoolTest, BoolWorks) {
|
||||
const ParamGenerator<bool> gen = Bool();
|
||||
|
||||
const bool expected_values[] = {false, true};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_COMBINE
|
||||
|
||||
template <typename T1, typename T2>
|
||||
::std::ostream& operator<<(::std::ostream& stream, const tuple<T1, T2>& value) {
|
||||
stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
|
||||
return stream;
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3>
|
||||
::std::ostream& operator<<(::std::ostream& stream,
|
||||
const tuple<T1, T2, T3>& value) {
|
||||
stream << "(" << get<0>(value) << ", " << get<1>(value)
|
||||
<< ", "<< get<2>(value) << ")";
|
||||
return stream;
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||
typename T6, typename T7, typename T8, typename T9, typename T10>
|
||||
::std::ostream& operator<<(
|
||||
::std::ostream& stream,
|
||||
const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
|
||||
stream << "(" << get<0>(value) << ", " << get<1>(value)
|
||||
<< ", "<< get<2>(value) << ", " << get<3>(value)
|
||||
<< ", "<< get<4>(value) << ", " << get<5>(value)
|
||||
<< ", "<< get<6>(value) << ", " << get<7>(value)
|
||||
<< ", "<< get<8>(value) << ", " << get<9>(value) << ")";
|
||||
return stream;
|
||||
}
|
||||
|
||||
// Tests that Combine() with two parameters generates the expected sequence.
|
||||
TEST(CombineTest, CombineWithTwoParameters) {
|
||||
const char* foo = "foo";
|
||||
const char* bar = "bar";
|
||||
const ParamGenerator<tuple<const char*, int> > gen =
|
||||
Combine(Values(foo, bar), Values(3, 4));
|
||||
|
||||
tuple<const char*, int> expected_values[] = {
|
||||
make_tuple(foo, 3), make_tuple(foo, 4),
|
||||
make_tuple(bar, 3), make_tuple(bar, 4)};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that Combine() with three parameters generates the expected sequence.
|
||||
TEST(CombineTest, CombineWithThreeParameters) {
|
||||
const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
|
||||
Values(3, 4),
|
||||
Values(5, 6));
|
||||
tuple<int, int, int> expected_values[] = {
|
||||
make_tuple(0, 3, 5), make_tuple(0, 3, 6),
|
||||
make_tuple(0, 4, 5), make_tuple(0, 4, 6),
|
||||
make_tuple(1, 3, 5), make_tuple(1, 3, 6),
|
||||
make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that the Combine() with the first parameter generating a single value
|
||||
// sequence generates a sequence with the number of elements equal to the
|
||||
// number of elements in the sequence generated by the second parameter.
|
||||
TEST(CombineTest, CombineWithFirstParameterSingleValue) {
|
||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
|
||||
Values(0, 1));
|
||||
|
||||
tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that the Combine() with the second parameter generating a single value
|
||||
// sequence generates a sequence with the number of elements equal to the
|
||||
// number of elements in the sequence generated by the first parameter.
|
||||
TEST(CombineTest, CombineWithSecondParameterSingleValue) {
|
||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
|
||||
Values(42));
|
||||
|
||||
tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// Tests that when the first parameter produces an empty sequence,
|
||||
// Combine() produces an empty sequence, too.
|
||||
TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
|
||||
const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
|
||||
Values(0, 1));
|
||||
VerifyGeneratorIsEmpty(gen);
|
||||
}
|
||||
|
||||
// Tests that when the second parameter produces an empty sequence,
|
||||
// Combine() produces an empty sequence, too.
|
||||
TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
|
||||
const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
|
||||
Range(1, 1));
|
||||
VerifyGeneratorIsEmpty(gen);
|
||||
}
|
||||
|
||||
// Edge case. Tests that combine works with the maximum number
|
||||
// of parameters supported by Google Test (currently 10).
|
||||
TEST(CombineTest, CombineWithMaxNumberOfParameters) {
|
||||
const char* foo = "foo";
|
||||
const char* bar = "bar";
|
||||
const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
|
||||
int, int> > gen = Combine(Values(foo, bar),
|
||||
Values(1), Values(2),
|
||||
Values(3), Values(4),
|
||||
Values(5), Values(6),
|
||||
Values(7), Values(8),
|
||||
Values(9));
|
||||
|
||||
tuple<const char*, int, int, int, int, int, int, int, int, int>
|
||||
expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
|
||||
make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_COMBINE
|
||||
|
||||
// Tests that an generator produces correct sequence after being
|
||||
// assigned from another generator.
|
||||
TEST(ParamGeneratorTest, AssignmentWorks) {
|
||||
ParamGenerator<int> gen = Values(1, 2);
|
||||
const ParamGenerator<int> gen2 = Values(3, 4);
|
||||
gen = gen2;
|
||||
|
||||
const int expected_values[] = {3, 4};
|
||||
VerifyGenerator(gen, expected_values);
|
||||
}
|
||||
|
||||
// This test verifies that the tests are expanded and run as specified:
|
||||
// one test per element from the sequence produced by the generator
|
||||
// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
|
||||
// fixture constructor, SetUp(), and TearDown() have run and have been
|
||||
// supplied with the correct parameters.
|
||||
|
||||
// The use of environment object allows detection of the case where no test
|
||||
// case functionality is run at all. In this case TestCaseTearDown will not
|
||||
// be able to detect missing tests, naturally.
|
||||
template <int kExpectedCalls>
|
||||
class TestGenerationEnvironment : public ::testing::Environment {
|
||||
public:
|
||||
static TestGenerationEnvironment* Instance() {
|
||||
static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
|
||||
return instance;
|
||||
}
|
||||
|
||||
void FixtureConstructorExecuted() { fixture_constructor_count_++; }
|
||||
void SetUpExecuted() { set_up_count_++; }
|
||||
void TearDownExecuted() { tear_down_count_++; }
|
||||
void TestBodyExecuted() { test_body_count_++; }
|
||||
|
||||
virtual void TearDown() {
|
||||
// If all MultipleTestGenerationTest tests have been de-selected
|
||||
// by the filter flag, the following checks make no sense.
|
||||
bool perform_check = false;
|
||||
|
||||
for (int i = 0; i < kExpectedCalls; ++i) {
|
||||
Message msg;
|
||||
msg << "TestsExpandedAndRun/" << i;
|
||||
if (UnitTestOptions::FilterMatchesTest(
|
||||
"TestExpansionModule/MultipleTestGenerationTest",
|
||||
msg.GetString().c_str())) {
|
||||
perform_check = true;
|
||||
}
|
||||
}
|
||||
if (perform_check) {
|
||||
EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
|
||||
<< "Fixture constructor of ParamTestGenerationTest test case "
|
||||
<< "has not been run as expected.";
|
||||
EXPECT_EQ(kExpectedCalls, set_up_count_)
|
||||
<< "Fixture SetUp method of ParamTestGenerationTest test case "
|
||||
<< "has not been run as expected.";
|
||||
EXPECT_EQ(kExpectedCalls, tear_down_count_)
|
||||
<< "Fixture TearDown method of ParamTestGenerationTest test case "
|
||||
<< "has not been run as expected.";
|
||||
EXPECT_EQ(kExpectedCalls, test_body_count_)
|
||||
<< "Test in ParamTestGenerationTest test case "
|
||||
<< "has not been run as expected.";
|
||||
}
|
||||
}
|
||||
private:
|
||||
TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
|
||||
tear_down_count_(0), test_body_count_(0) {}
|
||||
|
||||
int fixture_constructor_count_;
|
||||
int set_up_count_;
|
||||
int tear_down_count_;
|
||||
int test_body_count_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
|
||||
};
|
||||
|
||||
const int test_generation_params[] = {36, 42, 72};
|
||||
|
||||
class TestGenerationTest : public TestWithParam<int> {
|
||||
public:
|
||||
enum {
|
||||
PARAMETER_COUNT =
|
||||
sizeof(test_generation_params)/sizeof(test_generation_params[0])
|
||||
};
|
||||
|
||||
typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
|
||||
|
||||
TestGenerationTest() {
|
||||
Environment::Instance()->FixtureConstructorExecuted();
|
||||
current_parameter_ = GetParam();
|
||||
}
|
||||
virtual void SetUp() {
|
||||
Environment::Instance()->SetUpExecuted();
|
||||
EXPECT_EQ(current_parameter_, GetParam());
|
||||
}
|
||||
virtual void TearDown() {
|
||||
Environment::Instance()->TearDownExecuted();
|
||||
EXPECT_EQ(current_parameter_, GetParam());
|
||||
}
|
||||
|
||||
static void SetUpTestCase() {
|
||||
bool all_tests_in_test_case_selected = true;
|
||||
|
||||
for (int i = 0; i < PARAMETER_COUNT; ++i) {
|
||||
Message test_name;
|
||||
test_name << "TestsExpandedAndRun/" << i;
|
||||
if ( !UnitTestOptions::FilterMatchesTest(
|
||||
"TestExpansionModule/MultipleTestGenerationTest",
|
||||
test_name.GetString())) {
|
||||
all_tests_in_test_case_selected = false;
|
||||
}
|
||||
}
|
||||
EXPECT_TRUE(all_tests_in_test_case_selected)
|
||||
<< "When running the TestGenerationTest test case all of its tests\n"
|
||||
<< "must be selected by the filter flag for the test case to pass.\n"
|
||||
<< "If not all of them are enabled, we can't reliably conclude\n"
|
||||
<< "that the correct number of tests have been generated.";
|
||||
|
||||
collected_parameters_.clear();
|
||||
}
|
||||
|
||||
static void TearDownTestCase() {
|
||||
vector<int> expected_values(test_generation_params,
|
||||
test_generation_params + PARAMETER_COUNT);
|
||||
// Test execution order is not guaranteed by Google Test,
|
||||
// so the order of values in collected_parameters_ can be
|
||||
// different and we have to sort to compare.
|
||||
sort(expected_values.begin(), expected_values.end());
|
||||
sort(collected_parameters_.begin(), collected_parameters_.end());
|
||||
|
||||
EXPECT_TRUE(collected_parameters_ == expected_values);
|
||||
}
|
||||
protected:
|
||||
int current_parameter_;
|
||||
static vector<int> collected_parameters_;
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
|
||||
};
|
||||
vector<int> TestGenerationTest::collected_parameters_;
|
||||
|
||||
TEST_P(TestGenerationTest, TestsExpandedAndRun) {
|
||||
Environment::Instance()->TestBodyExecuted();
|
||||
EXPECT_EQ(current_parameter_, GetParam());
|
||||
collected_parameters_.push_back(GetParam());
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
|
||||
ValuesIn(test_generation_params));
|
||||
|
||||
// This test verifies that the element sequence (third parameter of
|
||||
// INSTANTIATE_TEST_CASE_P) is evaluated in RUN_ALL_TESTS and not at the call
|
||||
// site of INSTANTIATE_TEST_CASE_P.
|
||||
// For that, we declare param_value_ to be a static member of
|
||||
// GeneratorEvaluationTest and initialize it to 0. We set it to 1 in main(),
|
||||
// just before invocation of RUN_ALL_TESTS. If the sequence is evaluated
|
||||
// before that moment, INSTANTIATE_TEST_CASE_P will create a test with
|
||||
// parameter 0, and the test body will fail the assertion.
|
||||
class GeneratorEvaluationTest : public TestWithParam<int> {
|
||||
public:
|
||||
static int param_value() { return param_value_; }
|
||||
static void set_param_value(int param_value) { param_value_ = param_value; }
|
||||
|
||||
private:
|
||||
static int param_value_;
|
||||
};
|
||||
int GeneratorEvaluationTest::param_value_ = 0;
|
||||
|
||||
TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
|
||||
EXPECT_EQ(1, GetParam());
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(GenEvalModule,
|
||||
GeneratorEvaluationTest,
|
||||
Values(GeneratorEvaluationTest::param_value()));
|
||||
|
||||
// Tests that generators defined in a different translation unit are
|
||||
// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
|
||||
extern ParamGenerator<int> extern_gen;
|
||||
class ExternalGeneratorTest : public TestWithParam<int> {};
|
||||
TEST_P(ExternalGeneratorTest, ExternalGenerator) {
|
||||
// Sequence produced by extern_gen contains only a single value
|
||||
// which we verify here.
|
||||
EXPECT_EQ(GetParam(), 33);
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
|
||||
ExternalGeneratorTest,
|
||||
extern_gen);
|
||||
|
||||
// Tests that a parameterized test case can be defined in one translation
|
||||
// unit and instantiated in another. This test will be instantiated in
|
||||
// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
|
||||
// defined in gtest-param-test_test.h.
|
||||
TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
|
||||
EXPECT_EQ(0, GetParam() % 33);
|
||||
}
|
||||
|
||||
// Tests that a parameterized test case can be instantiated with multiple
|
||||
// generators.
|
||||
class MultipleInstantiationTest : public TestWithParam<int> {};
|
||||
TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
|
||||
INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
|
||||
|
||||
// Tests that a parameterized test case can be instantiated
|
||||
// in multiple translation units. This test will be instantiated
|
||||
// here and in gtest-param-test_test2.cc.
|
||||
// InstantiationInMultipleTranslationUnitsTest fixture class
|
||||
// is defined in gtest-param-test_test.h.
|
||||
TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
|
||||
EXPECT_EQ(0, GetParam() % 42);
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(Sequence1,
|
||||
InstantiationInMultipleTranslaionUnitsTest,
|
||||
Values(42, 42*2));
|
||||
|
||||
// Tests that each iteration of parameterized test runs in a separate test
|
||||
// object.
|
||||
class SeparateInstanceTest : public TestWithParam<int> {
|
||||
public:
|
||||
SeparateInstanceTest() : count_(0) {}
|
||||
|
||||
static void TearDownTestCase() {
|
||||
EXPECT_GE(global_count_, 2)
|
||||
<< "If some (but not all) SeparateInstanceTest tests have been "
|
||||
<< "filtered out this test will fail. Make sure that all "
|
||||
<< "GeneratorEvaluationTest are selected or de-selected together "
|
||||
<< "by the test filter.";
|
||||
}
|
||||
|
||||
protected:
|
||||
int count_;
|
||||
static int global_count_;
|
||||
};
|
||||
int SeparateInstanceTest::global_count_ = 0;
|
||||
|
||||
TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
|
||||
EXPECT_EQ(0, count_++);
|
||||
global_count_++;
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
|
||||
|
||||
// Tests that all instantiations of a test have named appropriately. Test
|
||||
// defined with TEST_P(TestCaseName, TestName) and instantiated with
|
||||
// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
|
||||
// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
|
||||
// sequence element used to instantiate the test.
|
||||
class NamingTest : public TestWithParam<int> {};
|
||||
|
||||
TEST_P(NamingTest, TestsAreNamedAppropriately) {
|
||||
const ::testing::TestInfo* const test_info =
|
||||
::testing::UnitTest::GetInstance()->current_test_info();
|
||||
|
||||
EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
|
||||
|
||||
Message msg;
|
||||
msg << "TestsAreNamedAppropriately/" << GetParam();
|
||||
EXPECT_STREQ(msg.GetString().c_str(), test_info->name());
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
|
||||
#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
|
||||
FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
// Used in TestGenerationTest test case.
|
||||
AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
|
||||
// Used in GeneratorEvaluationTest test case.
|
||||
GeneratorEvaluationTest::set_param_value(1);
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: vladl@google.com (Vlad Losev)
|
||||
//
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// This header file provides classes and functions used internally
|
||||
// for testing Google Test itself.
|
||||
|
||||
#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
|
||||
#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
|
||||
// Test fixture for testing definition and instantiation of a test
|
||||
// in separate translation units.
|
||||
class ExternalInstantiationTest : public ::testing::TestWithParam<int> {};
|
||||
|
||||
// Test fixture for testing instantiation of a test in multiple
|
||||
// translation units.
|
||||
class InstantiationInMultipleTranslaionUnitsTest
|
||||
: public ::testing::TestWithParam<int> {};
|
||||
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
#endif // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
|
||||
@@ -1,645 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Authors: vladl@google.com (Vlad Losev), wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// This file tests the internal cross-platform support utilities.
|
||||
|
||||
#include <gtest/internal/gtest-port.h>
|
||||
#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_ 1
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
|
||||
if (false)
|
||||
GTEST_CHECK_(false) << "This should never be executed; "
|
||||
"It's a compilation test only.";
|
||||
|
||||
if (true)
|
||||
GTEST_CHECK_(true);
|
||||
else
|
||||
; // NOLINT
|
||||
|
||||
if (false)
|
||||
; // NOLINT
|
||||
else
|
||||
GTEST_CHECK_(true) << "";
|
||||
}
|
||||
|
||||
TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
|
||||
switch (0) {
|
||||
case 1:
|
||||
break;
|
||||
default:
|
||||
GTEST_CHECK_(true);
|
||||
}
|
||||
|
||||
switch(0)
|
||||
case 0:
|
||||
GTEST_CHECK_(true) << "Check failed in switch case";
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
|
||||
const bool a_false_condition = false;
|
||||
const char regex[] =
|
||||
#ifdef _MSC_VER
|
||||
"gtest-port_test\\.cc\\(\\d+\\):"
|
||||
#else
|
||||
"gtest-port_test\\.cc:[0-9]+"
|
||||
#endif // _MSC_VER
|
||||
".*a_false_condition.*Extra info.*";
|
||||
|
||||
EXPECT_DEATH(GTEST_CHECK_(a_false_condition) << "Extra info", regex);
|
||||
}
|
||||
|
||||
TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
|
||||
EXPECT_EXIT({
|
||||
GTEST_CHECK_(true) << "Extra info";
|
||||
::std::cerr << "Success\n";
|
||||
exit(0); },
|
||||
::testing::ExitedWithCode(0), "Success");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_USES_POSIX_RE
|
||||
|
||||
template <typename Str>
|
||||
class RETest : public ::testing::Test {};
|
||||
|
||||
// Defines StringTypes as the list of all string types that class RE
|
||||
// supports.
|
||||
typedef testing::Types<
|
||||
#if GTEST_HAS_STD_STRING
|
||||
::std::string,
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
#if GTEST_HAS_GLOBAL_STRING
|
||||
::string,
|
||||
#endif // GTEST_HAS_GLOBAL_STRING
|
||||
const char*> StringTypes;
|
||||
|
||||
TYPED_TEST_CASE(RETest, StringTypes);
|
||||
|
||||
// Tests RE's implicit constructors.
|
||||
TYPED_TEST(RETest, ImplicitConstructorWorks) {
|
||||
const RE empty(TypeParam(""));
|
||||
EXPECT_STREQ("", empty.pattern());
|
||||
|
||||
const RE simple(TypeParam("hello"));
|
||||
EXPECT_STREQ("hello", simple.pattern());
|
||||
|
||||
const RE normal(TypeParam(".*(\\w+)"));
|
||||
EXPECT_STREQ(".*(\\w+)", normal.pattern());
|
||||
}
|
||||
|
||||
// Tests that RE's constructors reject invalid regular expressions.
|
||||
TYPED_TEST(RETest, RejectsInvalidRegex) {
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
const RE invalid(TypeParam("?"));
|
||||
}, "\"?\" is not a valid POSIX Extended regular expression.");
|
||||
}
|
||||
|
||||
// Tests RE::FullMatch().
|
||||
TYPED_TEST(RETest, FullMatchWorks) {
|
||||
const RE empty(TypeParam(""));
|
||||
EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
|
||||
EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
|
||||
|
||||
const RE re(TypeParam("a.*z"));
|
||||
EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
|
||||
EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
|
||||
EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
|
||||
EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
|
||||
}
|
||||
|
||||
// Tests RE::PartialMatch().
|
||||
TYPED_TEST(RETest, PartialMatchWorks) {
|
||||
const RE empty(TypeParam(""));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
|
||||
|
||||
const RE re(TypeParam("a.*z"));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
|
||||
EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
|
||||
EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
|
||||
}
|
||||
|
||||
#elif GTEST_USES_SIMPLE_RE
|
||||
|
||||
TEST(IsInSetTest, NulCharIsNotInAnySet) {
|
||||
EXPECT_FALSE(IsInSet('\0', ""));
|
||||
EXPECT_FALSE(IsInSet('\0', "\0"));
|
||||
EXPECT_FALSE(IsInSet('\0', "a"));
|
||||
}
|
||||
|
||||
TEST(IsInSetTest, WorksForNonNulChars) {
|
||||
EXPECT_FALSE(IsInSet('a', "Ab"));
|
||||
EXPECT_FALSE(IsInSet('c', ""));
|
||||
|
||||
EXPECT_TRUE(IsInSet('b', "bcd"));
|
||||
EXPECT_TRUE(IsInSet('b', "ab"));
|
||||
}
|
||||
|
||||
TEST(IsDigitTest, IsFalseForNonDigit) {
|
||||
EXPECT_FALSE(IsDigit('\0'));
|
||||
EXPECT_FALSE(IsDigit(' '));
|
||||
EXPECT_FALSE(IsDigit('+'));
|
||||
EXPECT_FALSE(IsDigit('-'));
|
||||
EXPECT_FALSE(IsDigit('.'));
|
||||
EXPECT_FALSE(IsDigit('a'));
|
||||
}
|
||||
|
||||
TEST(IsDigitTest, IsTrueForDigit) {
|
||||
EXPECT_TRUE(IsDigit('0'));
|
||||
EXPECT_TRUE(IsDigit('1'));
|
||||
EXPECT_TRUE(IsDigit('5'));
|
||||
EXPECT_TRUE(IsDigit('9'));
|
||||
}
|
||||
|
||||
TEST(IsPunctTest, IsFalseForNonPunct) {
|
||||
EXPECT_FALSE(IsPunct('\0'));
|
||||
EXPECT_FALSE(IsPunct(' '));
|
||||
EXPECT_FALSE(IsPunct('\n'));
|
||||
EXPECT_FALSE(IsPunct('a'));
|
||||
EXPECT_FALSE(IsPunct('0'));
|
||||
}
|
||||
|
||||
TEST(IsPunctTest, IsTrueForPunct) {
|
||||
for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
|
||||
EXPECT_PRED1(IsPunct, *p);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
|
||||
EXPECT_FALSE(IsRepeat('\0'));
|
||||
EXPECT_FALSE(IsRepeat(' '));
|
||||
EXPECT_FALSE(IsRepeat('a'));
|
||||
EXPECT_FALSE(IsRepeat('1'));
|
||||
EXPECT_FALSE(IsRepeat('-'));
|
||||
}
|
||||
|
||||
TEST(IsRepeatTest, IsTrueForRepeatChar) {
|
||||
EXPECT_TRUE(IsRepeat('?'));
|
||||
EXPECT_TRUE(IsRepeat('*'));
|
||||
EXPECT_TRUE(IsRepeat('+'));
|
||||
}
|
||||
|
||||
TEST(IsWhiteSpaceTest, IsFalseForNonWhiteSpace) {
|
||||
EXPECT_FALSE(IsWhiteSpace('\0'));
|
||||
EXPECT_FALSE(IsWhiteSpace('a'));
|
||||
EXPECT_FALSE(IsWhiteSpace('1'));
|
||||
EXPECT_FALSE(IsWhiteSpace('+'));
|
||||
EXPECT_FALSE(IsWhiteSpace('_'));
|
||||
}
|
||||
|
||||
TEST(IsWhiteSpaceTest, IsTrueForWhiteSpace) {
|
||||
EXPECT_TRUE(IsWhiteSpace(' '));
|
||||
EXPECT_TRUE(IsWhiteSpace('\n'));
|
||||
EXPECT_TRUE(IsWhiteSpace('\r'));
|
||||
EXPECT_TRUE(IsWhiteSpace('\t'));
|
||||
EXPECT_TRUE(IsWhiteSpace('\v'));
|
||||
EXPECT_TRUE(IsWhiteSpace('\f'));
|
||||
}
|
||||
|
||||
TEST(IsWordCharTest, IsFalseForNonWordChar) {
|
||||
EXPECT_FALSE(IsWordChar('\0'));
|
||||
EXPECT_FALSE(IsWordChar('+'));
|
||||
EXPECT_FALSE(IsWordChar('.'));
|
||||
EXPECT_FALSE(IsWordChar(' '));
|
||||
EXPECT_FALSE(IsWordChar('\n'));
|
||||
}
|
||||
|
||||
TEST(IsWordCharTest, IsTrueForLetter) {
|
||||
EXPECT_TRUE(IsWordChar('a'));
|
||||
EXPECT_TRUE(IsWordChar('b'));
|
||||
EXPECT_TRUE(IsWordChar('A'));
|
||||
EXPECT_TRUE(IsWordChar('Z'));
|
||||
}
|
||||
|
||||
TEST(IsWordCharTest, IsTrueForDigit) {
|
||||
EXPECT_TRUE(IsWordChar('0'));
|
||||
EXPECT_TRUE(IsWordChar('1'));
|
||||
EXPECT_TRUE(IsWordChar('7'));
|
||||
EXPECT_TRUE(IsWordChar('9'));
|
||||
}
|
||||
|
||||
TEST(IsWordCharTest, IsTrueForUnderscore) {
|
||||
EXPECT_TRUE(IsWordChar('_'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
|
||||
EXPECT_FALSE(IsValidEscape('\0'));
|
||||
EXPECT_FALSE(IsValidEscape('\007'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsFalseForDigit) {
|
||||
EXPECT_FALSE(IsValidEscape('0'));
|
||||
EXPECT_FALSE(IsValidEscape('9'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
|
||||
EXPECT_FALSE(IsValidEscape(' '));
|
||||
EXPECT_FALSE(IsValidEscape('\n'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
|
||||
EXPECT_FALSE(IsValidEscape('a'));
|
||||
EXPECT_FALSE(IsValidEscape('Z'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsTrueForPunct) {
|
||||
EXPECT_TRUE(IsValidEscape('.'));
|
||||
EXPECT_TRUE(IsValidEscape('-'));
|
||||
EXPECT_TRUE(IsValidEscape('^'));
|
||||
EXPECT_TRUE(IsValidEscape('$'));
|
||||
EXPECT_TRUE(IsValidEscape('('));
|
||||
EXPECT_TRUE(IsValidEscape(']'));
|
||||
EXPECT_TRUE(IsValidEscape('{'));
|
||||
EXPECT_TRUE(IsValidEscape('|'));
|
||||
}
|
||||
|
||||
TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
|
||||
EXPECT_TRUE(IsValidEscape('d'));
|
||||
EXPECT_TRUE(IsValidEscape('D'));
|
||||
EXPECT_TRUE(IsValidEscape('s'));
|
||||
EXPECT_TRUE(IsValidEscape('S'));
|
||||
EXPECT_TRUE(IsValidEscape('w'));
|
||||
EXPECT_TRUE(IsValidEscape('W'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, EscapedPunct) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_d) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_D) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_s) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_S) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_w) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, Escaped_W) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
|
||||
EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, UnescapedDot) {
|
||||
EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
|
||||
}
|
||||
|
||||
TEST(AtomMatchesCharTest, UnescapedChar) {
|
||||
EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
|
||||
EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
|
||||
EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
|
||||
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
|
||||
EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
|
||||
EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
|
||||
}
|
||||
|
||||
TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
|
||||
"NULL is not a valid simple regular expression");
|
||||
EXPECT_NONFATAL_FAILURE(
|
||||
ASSERT_FALSE(ValidateRegex("a\\")),
|
||||
"Syntax error at index 1 in simple regular expression \"a\\\": ");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
|
||||
"'\\' cannot appear at the end");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
|
||||
"'\\' cannot appear at the end");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
|
||||
"invalid escape sequence \"\\h\"");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
|
||||
"'^' can only appear at the beginning");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
|
||||
"'^' can only appear at the beginning");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
|
||||
"'$' can only appear at the end");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
|
||||
"'$' can only appear at the end");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
|
||||
"'(' is unsupported");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
|
||||
"')' is unsupported");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
|
||||
"'[' is unsupported");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
|
||||
"'{' is unsupported");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
|
||||
"'?' can only follow a repeatable token");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
|
||||
"'*' can only follow a repeatable token");
|
||||
EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
|
||||
"'+' can only follow a repeatable token");
|
||||
}
|
||||
|
||||
TEST(ValidateRegexTest, ReturnsTrueForValid) {
|
||||
EXPECT_TRUE(ValidateRegex(""));
|
||||
EXPECT_TRUE(ValidateRegex("a"));
|
||||
EXPECT_TRUE(ValidateRegex(".*"));
|
||||
EXPECT_TRUE(ValidateRegex("^a_+"));
|
||||
EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
|
||||
EXPECT_TRUE(ValidateRegex("09*$"));
|
||||
EXPECT_TRUE(ValidateRegex("^Z$"));
|
||||
EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
|
||||
}
|
||||
|
||||
TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
|
||||
EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
|
||||
// Repeating more than once.
|
||||
EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
|
||||
|
||||
// Repeating zero times.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
|
||||
// Repeating once.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
|
||||
}
|
||||
|
||||
TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
|
||||
EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
|
||||
|
||||
// Repeating zero times.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
|
||||
// Repeating once.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
|
||||
// Repeating more than once.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
|
||||
}
|
||||
|
||||
TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
|
||||
EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
|
||||
// Repeating zero times.
|
||||
EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
|
||||
|
||||
// Repeating once.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
|
||||
// Repeating more than once.
|
||||
EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
|
||||
EXPECT_TRUE(MatchRegexAtHead("", ""));
|
||||
EXPECT_TRUE(MatchRegexAtHead("", "ab"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
|
||||
EXPECT_FALSE(MatchRegexAtHead("$", "a"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAtHead("$", ""));
|
||||
EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
|
||||
EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
|
||||
EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
|
||||
EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
|
||||
EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest,
|
||||
WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
|
||||
EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
|
||||
EXPECT_FALSE(MatchRegexAtHead("\\s?b", " b"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
|
||||
EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAtHeadTest, MatchesSequentially) {
|
||||
EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
|
||||
EXPECT_FALSE(MatchRegexAnywhere("", NULL));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
|
||||
EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
|
||||
EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
|
||||
|
||||
EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
|
||||
EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
|
||||
EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
|
||||
EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
|
||||
EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
|
||||
EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
|
||||
EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
|
||||
EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
|
||||
}
|
||||
|
||||
TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
|
||||
EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
|
||||
EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "= ...="));
|
||||
}
|
||||
|
||||
// Tests RE's implicit constructors.
|
||||
TEST(RETest, ImplicitConstructorWorks) {
|
||||
const RE empty("");
|
||||
EXPECT_STREQ("", empty.pattern());
|
||||
|
||||
const RE simple("hello");
|
||||
EXPECT_STREQ("hello", simple.pattern());
|
||||
}
|
||||
|
||||
// Tests that RE's constructors reject invalid regular expressions.
|
||||
TEST(RETest, RejectsInvalidRegex) {
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
const RE normal(NULL);
|
||||
}, "NULL is not a valid simple regular expression");
|
||||
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
const RE normal(".*(\\w+");
|
||||
}, "'(' is unsupported");
|
||||
|
||||
EXPECT_NONFATAL_FAILURE({
|
||||
const RE invalid("^?");
|
||||
}, "'?' can only follow a repeatable token");
|
||||
}
|
||||
|
||||
// Tests RE::FullMatch().
|
||||
TEST(RETest, FullMatchWorks) {
|
||||
const RE empty("");
|
||||
EXPECT_TRUE(RE::FullMatch("", empty));
|
||||
EXPECT_FALSE(RE::FullMatch("a", empty));
|
||||
|
||||
const RE re1("a");
|
||||
EXPECT_TRUE(RE::FullMatch("a", re1));
|
||||
|
||||
const RE re("a.*z");
|
||||
EXPECT_TRUE(RE::FullMatch("az", re));
|
||||
EXPECT_TRUE(RE::FullMatch("axyz", re));
|
||||
EXPECT_FALSE(RE::FullMatch("baz", re));
|
||||
EXPECT_FALSE(RE::FullMatch("azy", re));
|
||||
}
|
||||
|
||||
// Tests RE::PartialMatch().
|
||||
TEST(RETest, PartialMatchWorks) {
|
||||
const RE empty("");
|
||||
EXPECT_TRUE(RE::PartialMatch("", empty));
|
||||
EXPECT_TRUE(RE::PartialMatch("a", empty));
|
||||
|
||||
const RE re("a.*z");
|
||||
EXPECT_TRUE(RE::PartialMatch("az", re));
|
||||
EXPECT_TRUE(RE::PartialMatch("axyz", re));
|
||||
EXPECT_TRUE(RE::PartialMatch("baz", re));
|
||||
EXPECT_TRUE(RE::PartialMatch("azy", re));
|
||||
EXPECT_FALSE(RE::PartialMatch("zza", re));
|
||||
}
|
||||
|
||||
#endif // GTEST_USES_POSIX_RE
|
||||
|
||||
#if GTEST_HAS_STD_STRING
|
||||
|
||||
TEST(CaptureStderrTest, CapturesStdErr) {
|
||||
CaptureStderr();
|
||||
fprintf(stderr, "abc");
|
||||
ASSERT_EQ("abc", GetCapturedStderr());
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_STD_STRING
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
@@ -1,138 +0,0 @@
|
||||
// Copyright 2008 Google Inc. All Rights Reserved.
|
||||
// Author: mheule@google.com (Markus Heule)
|
||||
|
||||
#include <gtest/gtest-test-part.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using testing::Test;
|
||||
using testing::TestPartResult;
|
||||
using testing::TestPartResultArray;
|
||||
|
||||
using testing::TPRT_FATAL_FAILURE;
|
||||
using testing::TPRT_NONFATAL_FAILURE;
|
||||
using testing::TPRT_SUCCESS;
|
||||
|
||||
namespace {
|
||||
|
||||
// Tests the TestPartResult class.
|
||||
|
||||
// The test fixture for testing TestPartResult.
|
||||
class TestPartResultTest : public Test {
|
||||
protected:
|
||||
TestPartResultTest()
|
||||
: r1_(TPRT_SUCCESS, "foo/bar.cc", 10, "Success!"),
|
||||
r2_(TPRT_NONFATAL_FAILURE, "foo/bar.cc", -1, "Failure!"),
|
||||
r3_(TPRT_FATAL_FAILURE, NULL, -1, "Failure!") {}
|
||||
|
||||
TestPartResult r1_, r2_, r3_;
|
||||
};
|
||||
|
||||
// Tests TestPartResult::type().
|
||||
TEST_F(TestPartResultTest, type) {
|
||||
EXPECT_EQ(TPRT_SUCCESS, r1_.type());
|
||||
EXPECT_EQ(TPRT_NONFATAL_FAILURE, r2_.type());
|
||||
EXPECT_EQ(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 Test {
|
||||
protected:
|
||||
TestPartResultArrayTest()
|
||||
: r1_(TPRT_NONFATAL_FAILURE, "foo/bar.cc", -1, "Failure 1"),
|
||||
r2_(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());
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
typedef TestPartResultArrayTest TestPartResultArrayDeathTest;
|
||||
|
||||
// Tests that the program dies when GetTestPartResult() is called with
|
||||
// an invalid index.
|
||||
TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {
|
||||
TestPartResultArray results;
|
||||
results.Append(r1_);
|
||||
|
||||
EXPECT_DEATH(results.GetTestPartResult(-1), "");
|
||||
EXPECT_DEATH(results.GetTestPartResult(1), "");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// TODO(mheule@google.com): Add a test for the class HasNewFatalFailureHelper.
|
||||
|
||||
} // namespace
|
||||
@@ -1,45 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "test/gtest-typed-test_test.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
// Tests that the same type-parameterized test case can be
|
||||
// instantiated in different translation units linked together.
|
||||
// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,
|
||||
testing::Types<std::vector<int> >);
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
@@ -1,362 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#include <list>
|
||||
#include <set>
|
||||
|
||||
#include "test/gtest-typed-test_test.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using testing::Test;
|
||||
|
||||
// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
|
||||
// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
|
||||
// type-parameterized test.
|
||||
template <typename T>
|
||||
class CommonTest : public Test {
|
||||
// For some technical reason, SetUpTestCase() and TearDownTestCase()
|
||||
// must be public.
|
||||
public:
|
||||
static void SetUpTestCase() {
|
||||
shared_ = new T(5);
|
||||
}
|
||||
|
||||
static void TearDownTestCase() {
|
||||
delete shared_;
|
||||
shared_ = NULL;
|
||||
}
|
||||
|
||||
// This 'protected:' is optional. There's no harm in making all
|
||||
// members of this fixture class template public.
|
||||
protected:
|
||||
typedef std::list<T> List;
|
||||
typedef std::set<int> IntSet;
|
||||
|
||||
CommonTest() : value_(1) {}
|
||||
|
||||
virtual ~CommonTest() { EXPECT_EQ(3, value_); }
|
||||
|
||||
virtual void SetUp() {
|
||||
EXPECT_EQ(1, value_);
|
||||
value_++;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
EXPECT_EQ(2, value_);
|
||||
value_++;
|
||||
}
|
||||
|
||||
T value_;
|
||||
static T* shared_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
T* CommonTest<T>::shared_ = NULL;
|
||||
|
||||
// This #ifdef block tests typed tests.
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
|
||||
using testing::Types;
|
||||
|
||||
// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
|
||||
// and SetUp()/TearDown() work correctly in typed tests
|
||||
|
||||
typedef Types<char, int> TwoTypes;
|
||||
TYPED_TEST_CASE(CommonTest, TwoTypes);
|
||||
|
||||
TYPED_TEST(CommonTest, ValuesAreCorrect) {
|
||||
// Static members of the fixture class template can be visited via
|
||||
// the TestFixture:: prefix.
|
||||
EXPECT_EQ(5, *TestFixture::shared_);
|
||||
|
||||
// Typedefs in the fixture class template can be visited via the
|
||||
// "typename TestFixture::" prefix.
|
||||
typename TestFixture::List empty;
|
||||
EXPECT_EQ(0, empty.size());
|
||||
|
||||
typename TestFixture::IntSet empty2;
|
||||
EXPECT_EQ(0, empty2.size());
|
||||
|
||||
// Non-static members of the fixture class must be visited via
|
||||
// 'this', as required by C++ for class templates.
|
||||
EXPECT_EQ(2, this->value_);
|
||||
}
|
||||
|
||||
// The second test makes sure shared_ is not deleted after the first
|
||||
// test.
|
||||
TYPED_TEST(CommonTest, ValuesAreStillCorrect) {
|
||||
// Static members of the fixture class template can also be visited
|
||||
// via 'this'.
|
||||
ASSERT_TRUE(this->shared_ != NULL);
|
||||
EXPECT_EQ(5, *this->shared_);
|
||||
|
||||
// TypeParam can be used to refer to the type parameter.
|
||||
EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
|
||||
}
|
||||
|
||||
// Tests that multiple TYPED_TEST_CASE's can be defined in the same
|
||||
// translation unit.
|
||||
|
||||
template <typename T>
|
||||
class TypedTest1 : public Test {
|
||||
};
|
||||
|
||||
// Verifies that the second argument of TYPED_TEST_CASE can be a
|
||||
// single type.
|
||||
TYPED_TEST_CASE(TypedTest1, int);
|
||||
TYPED_TEST(TypedTest1, A) {}
|
||||
|
||||
template <typename T>
|
||||
class TypedTest2 : public Test {
|
||||
};
|
||||
|
||||
// Verifies that the second argument of TYPED_TEST_CASE can be a
|
||||
// Types<...> type list.
|
||||
TYPED_TEST_CASE(TypedTest2, Types<int>);
|
||||
|
||||
// This also verifies that tests from different typed test cases can
|
||||
// share the same name.
|
||||
TYPED_TEST(TypedTest2, A) {}
|
||||
|
||||
// Tests that a typed test case can be defined in a namespace.
|
||||
|
||||
namespace library1 {
|
||||
|
||||
template <typename T>
|
||||
class NumericTest : public Test {
|
||||
};
|
||||
|
||||
typedef Types<int, long> NumericTypes;
|
||||
TYPED_TEST_CASE(NumericTest, NumericTypes);
|
||||
|
||||
TYPED_TEST(NumericTest, DefaultIsZero) {
|
||||
EXPECT_EQ(0, TypeParam());
|
||||
}
|
||||
|
||||
} // namespace library1
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST
|
||||
|
||||
// This #ifdef block tests type-parameterized tests.
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
using testing::Types;
|
||||
using testing::internal::TypedTestCasePState;
|
||||
|
||||
// Tests TypedTestCasePState.
|
||||
|
||||
class TypedTestCasePStateTest : public Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
state_.AddTestName("foo.cc", 0, "FooTest", "A");
|
||||
state_.AddTestName("foo.cc", 0, "FooTest", "B");
|
||||
state_.AddTestName("foo.cc", 0, "FooTest", "C");
|
||||
}
|
||||
|
||||
TypedTestCasePState state_;
|
||||
};
|
||||
|
||||
TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
|
||||
const char* tests = "A, B, C";
|
||||
EXPECT_EQ(tests,
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
|
||||
}
|
||||
|
||||
// Makes sure that the order of the tests and spaces around the names
|
||||
// don't matter.
|
||||
TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
|
||||
const char* tests = "A,C, B";
|
||||
EXPECT_EQ(tests,
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
|
||||
|
||||
TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
|
||||
EXPECT_DEATH(
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
|
||||
"foo\\.cc.1.?: Test A is listed more than once\\.");
|
||||
}
|
||||
|
||||
TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
|
||||
EXPECT_DEATH(
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
|
||||
"foo\\.cc.1.?: No test named D can be found in this test case\\.");
|
||||
}
|
||||
|
||||
TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
|
||||
EXPECT_DEATH(
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
|
||||
"foo\\.cc.1.?: You forgot to list test B\\.");
|
||||
}
|
||||
|
||||
// Tests that defining a test for a parameterized test case generates
|
||||
// a run-time error if the test case has been registered.
|
||||
TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
|
||||
state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
|
||||
EXPECT_DEATH(
|
||||
state_.AddTestName("foo.cc", 2, "FooTest", "D"),
|
||||
"foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
|
||||
"\\(FooTest, \\.\\.\\.\\)\\.");
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
|
||||
// and SetUp()/TearDown() work correctly in type-parameterized tests.
|
||||
|
||||
template <typename T>
|
||||
class DerivedTest : public CommonTest<T> {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(DerivedTest);
|
||||
|
||||
TYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
|
||||
// Static members of the fixture class template can be visited via
|
||||
// the TestFixture:: prefix.
|
||||
EXPECT_EQ(5, *TestFixture::shared_);
|
||||
|
||||
// Non-static members of the fixture class must be visited via
|
||||
// 'this', as required by C++ for class templates.
|
||||
EXPECT_EQ(2, this->value_);
|
||||
}
|
||||
|
||||
// The second test makes sure shared_ is not deleted after the first
|
||||
// test.
|
||||
TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
|
||||
// Static members of the fixture class template can also be visited
|
||||
// via 'this'.
|
||||
ASSERT_TRUE(this->shared_ != NULL);
|
||||
EXPECT_EQ(5, *this->shared_);
|
||||
EXPECT_EQ(2, this->value_);
|
||||
}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(DerivedTest,
|
||||
ValuesAreCorrect, ValuesAreStillCorrect);
|
||||
|
||||
typedef Types<short, long> MyTwoTypes;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
|
||||
|
||||
// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
|
||||
// translation unit.
|
||||
|
||||
template <typename T>
|
||||
class TypedTestP1 : public Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(TypedTestP1);
|
||||
|
||||
// For testing that the code between TYPED_TEST_CASE_P() and
|
||||
// TYPED_TEST_P() is not enclosed in a namespace.
|
||||
typedef int IntAfterTypedTestCaseP;
|
||||
|
||||
TYPED_TEST_P(TypedTestP1, A) {}
|
||||
TYPED_TEST_P(TypedTestP1, B) {}
|
||||
|
||||
// For testing that the code between TYPED_TEST_P() and
|
||||
// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
|
||||
typedef int IntBeforeRegisterTypedTestCaseP;
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
|
||||
|
||||
template <typename T>
|
||||
class TypedTestP2 : public Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(TypedTestP2);
|
||||
|
||||
// This also verifies that tests from different type-parameterized
|
||||
// test cases can share the same name.
|
||||
TYPED_TEST_P(TypedTestP2, A) {}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
|
||||
|
||||
// Verifies that the code between TYPED_TEST_CASE_P() and
|
||||
// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
|
||||
IntAfterTypedTestCaseP after = 0;
|
||||
IntBeforeRegisterTypedTestCaseP before = 0;
|
||||
|
||||
// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
|
||||
// can be either a single type or a Types<...> type list.
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
|
||||
|
||||
// Tests that the same type-parameterized test case can be
|
||||
// instantiated more than once in the same translation unit.
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
|
||||
|
||||
// Tests that the same type-parameterized test case can be
|
||||
// instantiated in different translation units linked together.
|
||||
// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
|
||||
typedef Types<std::list<double>, std::set<char> > MyContainers;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
|
||||
|
||||
// Tests that a type-parameterized test case can be defined and
|
||||
// instantiated in a namespace.
|
||||
|
||||
namespace library2 {
|
||||
|
||||
template <typename T>
|
||||
class NumericTest : public Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(NumericTest);
|
||||
|
||||
TYPED_TEST_P(NumericTest, DefaultIsZero) {
|
||||
EXPECT_EQ(0, TypeParam());
|
||||
}
|
||||
|
||||
TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
|
||||
EXPECT_LT(TypeParam(0), TypeParam(1));
|
||||
}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(NumericTest,
|
||||
DefaultIsZero, ZeroIsLessThanOne);
|
||||
typedef Types<int, double> NumericTypes;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
|
||||
|
||||
} // namespace library2
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
|
||||
|
||||
// Google Test doesn't support type-parameterized tests on some platforms
|
||||
// and compilers, such as MSVC 7.1. If we use conditional compilation to
|
||||
// compile out all code referring to the gtest_main library, MSVC linker
|
||||
// will not link that library at all and consequently complain about
|
||||
// missing entry point defined in that library (fatal error LNK1561:
|
||||
// entry point must be defined). This dummy test keeps gtest_main linked in.
|
||||
TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
|
||||
|
||||
#endif // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
|
||||
@@ -1,66 +0,0 @@
|
||||
// Copyright 2008 Google Inc.
|
||||
// All Rights Reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
|
||||
#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
using testing::Test;
|
||||
|
||||
// For testing that the same type-parameterized test case can be
|
||||
// instantiated in different translation units linked together.
|
||||
// ContainerTest will be instantiated in both gtest-typed-test_test.cc
|
||||
// and gtest-typed-test2_test.cc.
|
||||
|
||||
template <typename T>
|
||||
class ContainerTest : public Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(ContainerTest);
|
||||
|
||||
TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {
|
||||
TypeParam container;
|
||||
}
|
||||
|
||||
TYPED_TEST_P(ContainerTest, InitialSizeIsZero) {
|
||||
TypeParam container;
|
||||
EXPECT_EQ(0, container.size());
|
||||
}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(ContainerTest,
|
||||
CanBeDefaultConstructed, InitialSizeIsZero);
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#endif // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
|
||||
@@ -1,47 +0,0 @@
|
||||
// Copyright 2009, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
//
|
||||
// Tests for Google C++ Testing Framework (Google Test)
|
||||
//
|
||||
// Sometimes it's desirable to build most of Google Test's own tests
|
||||
// by compiling a single file. This file serves this purpose.
|
||||
#include "test/gtest-filepath_test.cc"
|
||||
#include "test/gtest-linked_ptr_test.cc"
|
||||
#include "test/gtest-message_test.cc"
|
||||
#include "test/gtest-options_test.cc"
|
||||
#include "test/gtest-port_test.cc"
|
||||
#include "test/gtest_pred_impl_unittest.cc"
|
||||
#include "test/gtest_prod_test.cc"
|
||||
#include "test/gtest-test-part_test.cc"
|
||||
#include "test/gtest-typed-test_test.cc"
|
||||
#include "test/gtest-typed-test2_test.cc"
|
||||
#include "test/gtest_unittest.cc"
|
||||
#include "test/production.cc"
|
||||
@@ -42,6 +42,7 @@ __author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
@@ -54,17 +55,13 @@ 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'
|
||||
|
||||
# The environment variable for enabling/disabling the throw-on-failure mode.
|
||||
THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_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_')
|
||||
'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.
|
||||
@@ -77,17 +74,13 @@ def SetEnvVar(env_var, value):
|
||||
|
||||
|
||||
def Run(command):
|
||||
"""Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
|
||||
"""Runs a command; returns 1 if it has a segmentation fault, or 0 otherwise.
|
||||
"""
|
||||
|
||||
p = gtest_test_utils.Subprocess(command)
|
||||
if p.terminated_by_signal:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
return os.system(command) == signal.SIGSEGV
|
||||
|
||||
|
||||
# The tests.
|
||||
|
||||
# The unit test.
|
||||
|
||||
class GTestBreakOnFailureUnitTest(unittest.TestCase):
|
||||
"""Tests using the GTEST_BREAK_ON_FAILURE environment variable or
|
||||
@@ -118,13 +111,11 @@ class GTestBreakOnFailureUnitTest(unittest.TestCase):
|
||||
if flag_value is None:
|
||||
flag = ''
|
||||
elif flag_value == '0':
|
||||
flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
|
||||
flag = ' --%s=0' % BREAK_ON_FAILURE_FLAG
|
||||
else:
|
||||
flag = '--%s' % BREAK_ON_FAILURE_FLAG
|
||||
flag = ' --%s' % BREAK_ON_FAILURE_FLAG
|
||||
|
||||
command = [EXE_PATH]
|
||||
if flag:
|
||||
command.append(flag)
|
||||
command = EXE_PATH + flag
|
||||
|
||||
if expect_seg_fault:
|
||||
should_or_not = 'should'
|
||||
@@ -136,8 +127,7 @@ class GTestBreakOnFailureUnitTest(unittest.TestCase):
|
||||
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, ' '.join(command),
|
||||
should_or_not))
|
||||
(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):
|
||||
@@ -183,16 +173,6 @@ class GTestBreakOnFailureUnitTest(unittest.TestCase):
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
|
||||
def testBreakOnFailureOverridesThrowOnFailure(self):
|
||||
"""Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
|
||||
|
||||
SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
|
||||
try:
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
finally:
|
||||
SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
|
||||
@@ -41,9 +41,6 @@
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -54,12 +51,8 @@ TEST(Foo, Bar) {
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
// Suppresses display of the Windows error dialog upon encountering
|
||||
// a general protection fault (segment violation).
|
||||
SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
|
||||
#endif
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
|
||||
@@ -62,7 +62,7 @@ def UsesColor(term, color_env_var, color_flag):
|
||||
cmd = COMMAND
|
||||
if color_flag is not None:
|
||||
cmd += ' --%s=%s' % (COLOR_FLAG, color_flag)
|
||||
return gtest_test_utils.GetExitStatus(os.system(cmd))
|
||||
return os.system(cmd)
|
||||
|
||||
|
||||
class GTestColorTest(unittest.TestCase):
|
||||
|
||||
@@ -101,16 +101,13 @@ def TestEnvVarAffectsFlag(command):
|
||||
TestFlag(command, 'color', 'yes', 'auto')
|
||||
TestFlag(command, 'filter', 'FooTest.Bar', '*')
|
||||
TestFlag(command, 'output', 'tmp/foo.xml', '')
|
||||
TestFlag(command, 'print_time', '1', '0')
|
||||
TestFlag(command, 'repeat', '999', '1')
|
||||
TestFlag(command, 'throw_on_failure', '1', '0')
|
||||
|
||||
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')
|
||||
TestFlag(command, 'death_test_use_fork', '1', '0')
|
||||
|
||||
|
||||
if IS_WINDOWS:
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
using ::std::cout;
|
||||
|
||||
@@ -71,11 +71,6 @@ void PrintFlag(const char* flag) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "death_test_use_fork") == 0) {
|
||||
cout << GTEST_FLAG(death_test_use_fork);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "filter") == 0) {
|
||||
cout << GTEST_FLAG(filter);
|
||||
return;
|
||||
@@ -86,11 +81,6 @@ void PrintFlag(const char* flag) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "print_time") == 0) {
|
||||
cout << GTEST_FLAG(print_time);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "repeat") == 0) {
|
||||
cout << GTEST_FLAG(repeat);
|
||||
return;
|
||||
@@ -101,11 +91,6 @@ void PrintFlag(const char* flag) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(flag, "throw_on_failure") == 0) {
|
||||
cout << GTEST_FLAG(throw_on_failure);
|
||||
return;
|
||||
}
|
||||
|
||||
cout << "Invalid flag name " << flag
|
||||
<< ". Valid names are break_on_failure, color, filter, etc.\n";
|
||||
exit(1);
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace testing {
|
||||
GTEST_DECLARE_string_(filter);
|
||||
GTEST_DECLARE_string(filter);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -36,88 +36,48 @@ 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.
|
||||
|
||||
Note that test sharding may also influence which tests are filtered. Therefore,
|
||||
we test that here also.
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import re
|
||||
import sets
|
||||
import tempfile
|
||||
import sys
|
||||
import unittest
|
||||
import gtest_test_utils
|
||||
|
||||
# Constants.
|
||||
|
||||
# The environment variable for specifying the test filters.
|
||||
FILTER_ENV_VAR = 'GTEST_FILTER'
|
||||
|
||||
# The environment variables for test sharding.
|
||||
TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
|
||||
SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
|
||||
SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
|
||||
|
||||
# The command line flag for specifying the test filters.
|
||||
FILTER_FLAG = 'gtest_filter'
|
||||
|
||||
# The command line flag for including disabled tests.
|
||||
ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
|
||||
|
||||
# Command to run the gtest_filter_unittest_ program.
|
||||
COMMAND = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_filter_unittest_')
|
||||
|
||||
# Regex for determining whether parameterized tests are enabled in the binary.
|
||||
PARAM_TEST_REGEX = re.compile(r'/ParamTest')
|
||||
|
||||
# Regex for parsing test case names from Google Test's output.
|
||||
TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
|
||||
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+(/\w+)?)')
|
||||
TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+)')
|
||||
|
||||
# Full names of all tests in gtest_filter_unittests_.
|
||||
PARAM_TESTS = [
|
||||
'SeqP/ParamTest.TestX/0',
|
||||
'SeqP/ParamTest.TestX/1',
|
||||
'SeqP/ParamTest.TestY/0',
|
||||
'SeqP/ParamTest.TestY/1',
|
||||
'SeqQ/ParamTest.TestX/0',
|
||||
'SeqQ/ParamTest.TestX/1',
|
||||
'SeqQ/ParamTest.TestY/0',
|
||||
'SeqQ/ParamTest.TestY/1',
|
||||
]
|
||||
|
||||
DISABLED_TESTS = [
|
||||
'BarTest.DISABLED_TestFour',
|
||||
'BarTest.DISABLED_TestFive',
|
||||
'BazTest.DISABLED_TestC',
|
||||
'DISABLED_FoobarTest.Test1',
|
||||
'DISABLED_FoobarTest.DISABLED_Test2',
|
||||
'DISABLED_FoobarbazTest.TestA',
|
||||
]
|
||||
|
||||
# All the non-disabled tests.
|
||||
ACTIVE_TESTS = [
|
||||
ALL_TESTS = [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.TestOne',
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
]
|
||||
|
||||
'HasDeathTest.Test1',
|
||||
'HasDeathTest.Test2',
|
||||
] + PARAM_TESTS
|
||||
|
||||
param_tests_present = None
|
||||
|
||||
# Utilities.
|
||||
|
||||
@@ -133,7 +93,7 @@ def SetEnvVar(env_var, value):
|
||||
|
||||
def Run(command):
|
||||
"""Runs a Google Test program and returns a list of full names of the
|
||||
tests that were run along with the test exit code.
|
||||
tests that were run.
|
||||
"""
|
||||
|
||||
stdout_file = os.popen(command, 'r')
|
||||
@@ -149,33 +109,10 @@ def Run(command):
|
||||
if match is not None:
|
||||
test = match.group(1)
|
||||
tests_run += [test_case + '.' + test]
|
||||
exit_code = stdout_file.close()
|
||||
return (tests_run, exit_code)
|
||||
stdout_file.close()
|
||||
return tests_run
|
||||
|
||||
|
||||
def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
|
||||
"""Runs the given function and arguments in a modified environment."""
|
||||
try:
|
||||
original_env = os.environ.copy()
|
||||
os.environ.update(extra_env)
|
||||
return function(*args, **kwargs)
|
||||
finally:
|
||||
for key in extra_env.iterkeys():
|
||||
if key in original_env:
|
||||
os.environ[key] = original_env[key]
|
||||
else:
|
||||
del os.environ[key]
|
||||
|
||||
|
||||
def RunWithSharding(total_shards, shard_index, command):
|
||||
"""Runs the Google Test program shard and returns a list of full names of the
|
||||
tests that were run along with the exit code.
|
||||
"""
|
||||
|
||||
extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
|
||||
TOTAL_SHARDS_ENV_VAR: str(total_shards)}
|
||||
return InvokeWithModifiedEnv(extra_env, Run, command)
|
||||
|
||||
# The unit test.
|
||||
|
||||
|
||||
@@ -195,29 +132,15 @@ class GTestFilterUnitTest(unittest.TestCase):
|
||||
for elem in rhs:
|
||||
self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
|
||||
|
||||
def AssertPartitionIsValid(self, set_var, list_of_sets):
|
||||
"""Asserts that list_of_sets is a valid partition of set_var."""
|
||||
|
||||
full_partition = []
|
||||
for slice_var in list_of_sets:
|
||||
full_partition.extend(slice_var)
|
||||
self.assertEqual(len(set_var), len(full_partition))
|
||||
self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
|
||||
|
||||
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.
|
||||
"""
|
||||
# Adjust tests_to_run in case value parameterized tests are disabled
|
||||
# in the binary.
|
||||
global param_tests_present
|
||||
if not param_tests_present:
|
||||
tests_to_run = list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
|
||||
|
||||
# First, tests using GTEST_FILTER.
|
||||
|
||||
SetEnvVar(FILTER_ENV_VAR, gtest_filter)
|
||||
tests_run = Run(COMMAND)[0]
|
||||
tests_run = Run(COMMAND)
|
||||
SetEnvVar(FILTER_ENV_VAR, None)
|
||||
|
||||
self.AssertSetEqual(tests_run, tests_to_run)
|
||||
@@ -229,146 +152,57 @@ class GTestFilterUnitTest(unittest.TestCase):
|
||||
else:
|
||||
command = '%s --%s=%s' % (COMMAND, FILTER_FLAG, gtest_filter)
|
||||
|
||||
tests_run = Run(command)[0]
|
||||
tests_run = Run(command)
|
||||
self.AssertSetEqual(tests_run, tests_to_run)
|
||||
|
||||
def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
|
||||
command=COMMAND, check_exit_0=False):
|
||||
"""Runs all shards of gtest_flag_unittest_ with the given filter, and
|
||||
verifies that the right set of tests were run. The union of tests run
|
||||
on each shard should be identical to tests_to_run, without duplicates.
|
||||
If check_exit_0, make sure that all shards returned 0.
|
||||
"""
|
||||
SetEnvVar(FILTER_ENV_VAR, gtest_filter)
|
||||
partition = []
|
||||
for i in range(0, total_shards):
|
||||
(tests_run, exit_code) = RunWithSharding(total_shards, i, command)
|
||||
if check_exit_0:
|
||||
self.assert_(exit_code is None)
|
||||
partition.append(tests_run)
|
||||
|
||||
self.AssertPartitionIsValid(tests_to_run, partition)
|
||||
SetEnvVar(FILTER_ENV_VAR, None)
|
||||
|
||||
def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
|
||||
"""Runs gtest_flag_unittest_ with the given filter, and enables
|
||||
disabled tests. Verifies that the right set of tests were run.
|
||||
"""
|
||||
# Construct the command line.
|
||||
command = '%s --%s' % (COMMAND, ALSO_RUN_DISABED_TESTS_FLAG)
|
||||
if gtest_filter is not None:
|
||||
command = '%s --%s=%s' % (command, FILTER_FLAG, gtest_filter)
|
||||
|
||||
tests_run = Run(command)[0]
|
||||
self.AssertSetEqual(tests_run, tests_to_run)
|
||||
|
||||
def setUp(self):
|
||||
"""Sets up test case. Determines whether value-parameterized tests are
|
||||
enabled in the binary and sets flags accordingly.
|
||||
"""
|
||||
global param_tests_present
|
||||
if param_tests_present is None:
|
||||
param_tests_present = PARAM_TEST_REGEX.search(
|
||||
'\n'.join(os.popen(COMMAND, 'r').readlines())) is not None
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of not specifying the filter."""
|
||||
|
||||
self.RunAndVerify(None, ACTIVE_TESTS)
|
||||
|
||||
def testDefaultBehaviorWithShards(self):
|
||||
"""Tests the behavior of not specifying the filter, with sharding
|
||||
enabled.
|
||||
"""
|
||||
self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
|
||||
self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
|
||||
self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
|
||||
self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
|
||||
self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
|
||||
self.RunAndVerify(None, ALL_TESTS)
|
||||
|
||||
def testEmptyFilter(self):
|
||||
"""Tests an empty filter."""
|
||||
|
||||
self.RunAndVerify('', [])
|
||||
self.RunAndVerifyWithSharding('', 1, [])
|
||||
self.RunAndVerifyWithSharding('', 2, [])
|
||||
|
||||
def testBadFilter(self):
|
||||
"""Tests a filter that matches nothing."""
|
||||
|
||||
self.RunAndVerify('BadFilter', [])
|
||||
self.RunAndVerifyAllowingDisabled('BadFilter', [])
|
||||
|
||||
def testFullName(self):
|
||||
"""Tests filtering by full name."""
|
||||
|
||||
self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
|
||||
self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
|
||||
self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
|
||||
|
||||
def testUniversalFilters(self):
|
||||
"""Tests filters that match everything."""
|
||||
|
||||
self.RunAndVerify('*', ACTIVE_TESTS)
|
||||
self.RunAndVerify('*.*', ACTIVE_TESTS)
|
||||
self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
|
||||
self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
|
||||
self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
|
||||
self.RunAndVerify('*', ALL_TESTS)
|
||||
self.RunAndVerify('*.*', ALL_TESTS)
|
||||
|
||||
def testFilterByTestCase(self):
|
||||
"""Tests filtering by test case name."""
|
||||
|
||||
self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
|
||||
|
||||
BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
|
||||
self.RunAndVerify('BazTest.*', BAZ_TESTS)
|
||||
self.RunAndVerifyAllowingDisabled('BazTest.*',
|
||||
BAZ_TESTS + ['BazTest.DISABLED_TestC'])
|
||||
|
||||
def testFilterByTest(self):
|
||||
"""Tests filtering by test name."""
|
||||
|
||||
self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
|
||||
|
||||
def testFilterDisabledTests(self):
|
||||
"""Select only the disabled tests to run."""
|
||||
|
||||
self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
|
||||
self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
|
||||
['DISABLED_FoobarTest.Test1'])
|
||||
|
||||
self.RunAndVerify('*DISABLED_*', [])
|
||||
self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
|
||||
|
||||
self.RunAndVerify('*.DISABLED_*', [])
|
||||
self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
|
||||
'BarTest.DISABLED_TestFour',
|
||||
'BarTest.DISABLED_TestFive',
|
||||
'BazTest.DISABLED_TestC',
|
||||
'DISABLED_FoobarTest.DISABLED_Test2',
|
||||
])
|
||||
|
||||
self.RunAndVerify('DISABLED_*', [])
|
||||
self.RunAndVerifyAllowingDisabled('DISABLED_*', [
|
||||
'DISABLED_FoobarTest.Test1',
|
||||
'DISABLED_FoobarTest.DISABLED_Test2',
|
||||
'DISABLED_FoobarbazTest.TestA',
|
||||
])
|
||||
self.RunAndVerify('*.Test1', ['BarTest.Test1', 'BazTest.Test1'])
|
||||
|
||||
def testWildcardInTestCaseName(self):
|
||||
"""Tests using wildcard in the test case name."""
|
||||
|
||||
self.RunAndVerify('*a*.*', [
|
||||
'BarTest.TestOne',
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
|
||||
'HasDeathTest.Test1',
|
||||
'HasDeathTest.Test2', ] + PARAM_TESTS)
|
||||
])
|
||||
|
||||
def testWildcardInTestName(self):
|
||||
"""Tests using wildcard in the test name."""
|
||||
@@ -381,7 +215,7 @@ class GTestFilterUnitTest(unittest.TestCase):
|
||||
self.RunAndVerify('*z*', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
@@ -402,24 +236,24 @@ class GTestFilterUnitTest(unittest.TestCase):
|
||||
def testThreePatterns(self):
|
||||
"""Tests filters that consist of three patterns."""
|
||||
|
||||
self.RunAndVerify('*oo*:*A*:*One', [
|
||||
self.RunAndVerify('*oo*:*A*:*1', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.TestOne',
|
||||
'BarTest.Test1',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
])
|
||||
|
||||
# The 2nd pattern is empty.
|
||||
self.RunAndVerify('*oo*::*One', [
|
||||
self.RunAndVerify('*oo*::*1', [
|
||||
'FooTest.Abc',
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.TestOne',
|
||||
'BarTest.Test1',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
])
|
||||
|
||||
# The last 2 patterns are empty.
|
||||
@@ -429,134 +263,53 @@ class GTestFilterUnitTest(unittest.TestCase):
|
||||
])
|
||||
|
||||
def testNegativeFilters(self):
|
||||
self.RunAndVerify('*-HasDeathTest.Test1', [
|
||||
'FooTest.Abc',
|
||||
self.RunAndVerify('*-FooTest.Abc', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.TestOne',
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
])
|
||||
|
||||
'HasDeathTest.Test2',
|
||||
] + PARAM_TESTS)
|
||||
|
||||
self.RunAndVerify('*-FooTest.Abc:HasDeathTest.*', [
|
||||
self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
|
||||
'FooTest.Xyz',
|
||||
|
||||
'BarTest.TestOne',
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
])
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
] + PARAM_TESTS)
|
||||
|
||||
self.RunAndVerify('BarTest.*-BarTest.TestOne', [
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
self.RunAndVerify('BarTest.*-BarTest.Test1', [
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
])
|
||||
|
||||
# Tests without leading '*'.
|
||||
self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:HasDeathTest.*', [
|
||||
'BarTest.TestOne',
|
||||
'BarTest.TestTwo',
|
||||
'BarTest.TestThree',
|
||||
self.RunAndVerify('-FooTest.Abc:FooTest.Xyz', [
|
||||
'BarTest.Test1',
|
||||
'BarTest.Test2',
|
||||
'BarTest.Test3',
|
||||
|
||||
'BazTest.TestOne',
|
||||
'BazTest.Test1',
|
||||
'BazTest.TestA',
|
||||
'BazTest.TestB',
|
||||
] + PARAM_TESTS)
|
||||
|
||||
# Value parameterized tests.
|
||||
self.RunAndVerify('*/*', PARAM_TESTS)
|
||||
|
||||
# Value parameterized tests filtering by the sequence name.
|
||||
self.RunAndVerify('SeqP/*', [
|
||||
'SeqP/ParamTest.TestX/0',
|
||||
'SeqP/ParamTest.TestX/1',
|
||||
'SeqP/ParamTest.TestY/0',
|
||||
'SeqP/ParamTest.TestY/1',
|
||||
])
|
||||
|
||||
# Value parameterized tests filtering by the test name.
|
||||
self.RunAndVerify('*/0', [
|
||||
'SeqP/ParamTest.TestX/0',
|
||||
'SeqP/ParamTest.TestY/0',
|
||||
'SeqQ/ParamTest.TestX/0',
|
||||
'SeqQ/ParamTest.TestY/0',
|
||||
])
|
||||
|
||||
def testFlagOverridesEnvVar(self):
|
||||
"""Tests that the --gtest_filter flag overrides the GTEST_FILTER
|
||||
environment variable.
|
||||
"""
|
||||
environment variable."""
|
||||
|
||||
SetEnvVar(FILTER_ENV_VAR, 'Foo*')
|
||||
command = '%s --%s=%s' % (COMMAND, FILTER_FLAG, '*One')
|
||||
tests_run = Run(command)[0]
|
||||
command = '%s --%s=%s' % (COMMAND, FILTER_FLAG, '*1')
|
||||
tests_run = Run(command)
|
||||
SetEnvVar(FILTER_ENV_VAR, None)
|
||||
|
||||
self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
|
||||
self.AssertSetEqual(tests_run, ['BarTest.Test1', 'BazTest.Test1'])
|
||||
|
||||
def testShardStatusFileIsCreated(self):
|
||||
"""Tests that the shard file is created if specified in the environment."""
|
||||
|
||||
test_tmpdir = tempfile.mkdtemp()
|
||||
shard_status_file = os.path.join(test_tmpdir, 'shard_status_file')
|
||||
self.assert_(not os.path.exists(shard_status_file))
|
||||
|
||||
extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
|
||||
stdout_file = InvokeWithModifiedEnv(extra_env, os.popen, COMMAND, 'r')
|
||||
try:
|
||||
stdout_file.readlines()
|
||||
finally:
|
||||
stdout_file.close()
|
||||
self.assert_(os.path.exists(shard_status_file))
|
||||
os.remove(shard_status_file)
|
||||
os.removedirs(test_tmpdir)
|
||||
|
||||
def testShardStatusFileIsCreatedWithListTests(self):
|
||||
"""Tests that the shard file is created with --gtest_list_tests."""
|
||||
|
||||
test_tmpdir = tempfile.mkdtemp()
|
||||
shard_status_file = os.path.join(test_tmpdir, 'shard_status_file2')
|
||||
self.assert_(not os.path.exists(shard_status_file))
|
||||
|
||||
extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
|
||||
stdout_file = InvokeWithModifiedEnv(extra_env, os.popen,
|
||||
'%s --gtest_list_tests' % COMMAND, 'r')
|
||||
try:
|
||||
stdout_file.readlines()
|
||||
finally:
|
||||
stdout_file.close()
|
||||
self.assert_(os.path.exists(shard_status_file))
|
||||
os.remove(shard_status_file)
|
||||
os.removedirs(test_tmpdir)
|
||||
|
||||
def testShardingWorksWithDeathTests(self):
|
||||
"""Tests integration with death tests and sharding."""
|
||||
gtest_filter = 'HasDeathTest.*:SeqP/*'
|
||||
expected_tests = [
|
||||
'HasDeathTest.Test1',
|
||||
'HasDeathTest.Test2',
|
||||
|
||||
'SeqP/ParamTest.TestX/0',
|
||||
'SeqP/ParamTest.TestX/1',
|
||||
'SeqP/ParamTest.TestY/0',
|
||||
'SeqP/ParamTest.TestY/1',
|
||||
]
|
||||
|
||||
for command in (COMMAND + ' --gtest_death_test_style=threadsafe',
|
||||
COMMAND + ' --gtest_death_test_style=fast'):
|
||||
self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
|
||||
check_exit_0=True, command=command)
|
||||
self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
|
||||
check_exit_0=True, command=command)
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
|
||||
@@ -58,26 +58,19 @@ TEST_F(FooTest, Xyz) {
|
||||
|
||||
// Test case BarTest.
|
||||
|
||||
TEST(BarTest, TestOne) {
|
||||
TEST(BarTest, Test1) {
|
||||
}
|
||||
|
||||
TEST(BarTest, TestTwo) {
|
||||
TEST(BarTest, Test2) {
|
||||
}
|
||||
|
||||
TEST(BarTest, TestThree) {
|
||||
TEST(BarTest, Test3) {
|
||||
}
|
||||
|
||||
TEST(BarTest, DISABLED_TestFour) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
TEST(BarTest, DISABLED_TestFive) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
// Test case BazTest.
|
||||
|
||||
TEST(BazTest, TestOne) {
|
||||
TEST(BazTest, Test1) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
@@ -87,59 +80,6 @@ TEST(BazTest, TestA) {
|
||||
TEST(BazTest, TestB) {
|
||||
}
|
||||
|
||||
TEST(BazTest, DISABLED_TestC) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
// Test case HasDeathTest
|
||||
|
||||
TEST(HasDeathTest, Test1) {
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
EXPECT_DEATH({exit(1);},
|
||||
".*");
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
}
|
||||
|
||||
// We need at least two death tests to make sure that the all death tests
|
||||
// aren't on the first shard.
|
||||
TEST(HasDeathTest, Test2) {
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
EXPECT_DEATH({exit(1);},
|
||||
".*");
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
}
|
||||
|
||||
|
||||
// Test case FoobarTest
|
||||
|
||||
TEST(DISABLED_FoobarTest, Test1) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
TEST(DISABLED_FoobarTest, DISABLED_Test2) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
// Test case FoobarbazTest
|
||||
|
||||
TEST(DISABLED_FoobarbazTest, TestA) {
|
||||
FAIL() << "Expected failure.";
|
||||
}
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
class ParamTest : public testing::TestWithParam<int> {
|
||||
};
|
||||
|
||||
TEST_P(ParamTest, TestX) {
|
||||
}
|
||||
|
||||
TEST_P(ParamTest, TestY) {
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));
|
||||
INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2009, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Tests the --help flag of Google C++ Testing Framework.
|
||||
|
||||
SYNOPSIS
|
||||
gtest_help_test.py --gtest_build_dir=BUILD/DIR
|
||||
# where BUILD/DIR contains the built gtest_help_test_ file.
|
||||
gtest_help_test.py
|
||||
"""
|
||||
|
||||
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||
|
||||
import gtest_test_utils
|
||||
import os
|
||||
import re
|
||||
import unittest
|
||||
|
||||
|
||||
IS_WINDOWS = os.name == 'nt'
|
||||
|
||||
if IS_WINDOWS:
|
||||
PROGRAM = 'gtest_help_test_.exe'
|
||||
else:
|
||||
PROGRAM = 'gtest_help_test_'
|
||||
|
||||
PROGRAM_PATH = os.path.join(gtest_test_utils.GetBuildDir(), PROGRAM)
|
||||
FLAG_PREFIX = '--gtest_'
|
||||
CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions'
|
||||
|
||||
# The help message must match this regex.
|
||||
HELP_REGEX = re.compile(
|
||||
FLAG_PREFIX + r'list_tests.*' +
|
||||
FLAG_PREFIX + r'filter=.*' +
|
||||
FLAG_PREFIX + r'also_run_disabled_tests.*' +
|
||||
FLAG_PREFIX + r'repeat=.*' +
|
||||
FLAG_PREFIX + r'color=.*' +
|
||||
FLAG_PREFIX + r'print_time.*' +
|
||||
FLAG_PREFIX + r'output=.*' +
|
||||
FLAG_PREFIX + r'break_on_failure.*' +
|
||||
FLAG_PREFIX + r'throw_on_failure.*',
|
||||
re.DOTALL)
|
||||
|
||||
|
||||
def RunWithFlag(flag):
|
||||
"""Runs gtest_help_test_ with the given flag.
|
||||
|
||||
Returns:
|
||||
the exit code and the text output as a tuple.
|
||||
Args:
|
||||
flag: the command-line flag to pass to gtest_help_test_, or None.
|
||||
"""
|
||||
|
||||
if flag is None:
|
||||
command = [PROGRAM_PATH]
|
||||
else:
|
||||
command = [PROGRAM_PATH, flag]
|
||||
child = gtest_test_utils.Subprocess(command)
|
||||
return child.exit_code, child.output
|
||||
|
||||
|
||||
class GTestHelpTest(unittest.TestCase):
|
||||
"""Tests the --help flag and its equivalent forms."""
|
||||
|
||||
def TestHelpFlag(self, flag):
|
||||
"""Verifies that the right message is printed and the tests are
|
||||
skipped when the given flag is specified."""
|
||||
|
||||
exit_code, output = RunWithFlag(flag)
|
||||
self.assertEquals(0, exit_code)
|
||||
self.assert_(HELP_REGEX.search(output), output)
|
||||
if IS_WINDOWS:
|
||||
self.assert_(CATCH_EXCEPTIONS_FLAG in output, output)
|
||||
else:
|
||||
self.assert_(CATCH_EXCEPTIONS_FLAG not in output, output)
|
||||
|
||||
def testPrintsHelpWithFullFlag(self):
|
||||
self.TestHelpFlag('--help')
|
||||
|
||||
def testPrintsHelpWithShortFlag(self):
|
||||
self.TestHelpFlag('-h')
|
||||
|
||||
def testPrintsHelpWithQuestionFlag(self):
|
||||
self.TestHelpFlag('-?')
|
||||
|
||||
def testPrintsHelpWithWindowsStyleQuestionFlag(self):
|
||||
self.TestHelpFlag('/?')
|
||||
|
||||
def testRunsTestsWithoutHelpFlag(self):
|
||||
"""Verifies that when no help flag is specified, the tests are run
|
||||
and the help message is not printed."""
|
||||
|
||||
exit_code, output = RunWithFlag(None)
|
||||
self.assert_(exit_code != 0)
|
||||
self.assert_(not HELP_REGEX.search(output), output)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -1,42 +0,0 @@
|
||||
// Copyright 2009, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// This program is meant to be run by gtest_help_test.py. Do not run
|
||||
// it directly.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// When a help flag is specified, this program should skip the tests
|
||||
// and exit with 0; otherwise the following test will be executed,
|
||||
// causing this program to exit with a non-zero code.
|
||||
TEST(HelpFlagTest, ShouldNotBeRun) {
|
||||
ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified.";
|
||||
}
|
||||
119
test/gtest_nc.cc
119
test/gtest_nc.cc
@@ -103,125 +103,6 @@ class MyEnvironment : public testing::Environment {
|
||||
}
|
||||
};
|
||||
|
||||
#elif defined(TEST_CATCHES_WRONG_CASE_IN_TYPED_TEST_P)
|
||||
// Tests that the compiler catches using the wrong test case name in
|
||||
// TYPED_TEST_P.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class BarTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(FooTest);
|
||||
TYPED_TEST_P(BarTest, A) {} // Wrong test case name.
|
||||
REGISTER_TYPED_TEST_CASE_P(FooTest, A);
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);
|
||||
|
||||
#elif defined(TEST_CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P)
|
||||
// Tests that the compiler catches using the wrong test case name in
|
||||
// REGISTER_TYPED_TEST_CASE_P.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class BarTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(FooTest);
|
||||
TYPED_TEST_P(FooTest, A) {}
|
||||
REGISTER_TYPED_TEST_CASE_P(BarTest, A); // Wrong test case name.
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);
|
||||
|
||||
#elif defined(TEST_CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P)
|
||||
// Tests that the compiler catches using the wrong test case name in
|
||||
// INSTANTIATE_TYPED_TEST_CASE_P.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class BarTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(FooTest);
|
||||
TYPED_TEST_P(FooTest, A) {}
|
||||
REGISTER_TYPED_TEST_CASE_P(FooTest, A);
|
||||
|
||||
// Wrong test case name.
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, BarTest, testing::Types<int>);
|
||||
|
||||
#elif defined(TEST_CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX)
|
||||
// Tests that the compiler catches instantiating TYPED_TEST_CASE_P
|
||||
// twice with the same name prefix.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
template <typename T>
|
||||
class FooTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(FooTest);
|
||||
TYPED_TEST_P(FooTest, A) {}
|
||||
REGISTER_TYPED_TEST_CASE_P(FooTest, A);
|
||||
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);
|
||||
|
||||
// Wrong name prefix: "My" has been used.
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<double>);
|
||||
|
||||
#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Tests that StaticAssertTypeEq<T1, T2> cannot be used as a type.
|
||||
testing::StaticAssertTypeEq<int, int> dummy;
|
||||
|
||||
#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// Tests that StaticAssertTypeEq<T1, T2> works in a namespace scope.
|
||||
static bool dummy = testing::StaticAssertTypeEq<int, const int>();
|
||||
|
||||
#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
template <typename T>
|
||||
class Helper {
|
||||
public:
|
||||
// Tests that StaticAssertTypeEq<T1, T2> works in a class.
|
||||
Helper() { testing::StaticAssertTypeEq<int, T>(); }
|
||||
|
||||
void DoSomething() {}
|
||||
};
|
||||
|
||||
void Test() {
|
||||
Helper<bool> h;
|
||||
h.DoSomething(); // To avoid the "unused variable" warning.
|
||||
}
|
||||
|
||||
#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION)
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
void Test() {
|
||||
// Tests that StaticAssertTypeEq<T1, T2> works inside a function.
|
||||
testing::StaticAssertTypeEq<const int, int>();
|
||||
}
|
||||
|
||||
#else
|
||||
// A sanity test. This should compile.
|
||||
|
||||
|
||||
@@ -66,30 +66,6 @@ class GTestNCTest(unittest.TestCase):
|
||||
('CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO',
|
||||
[r'Setup_should_be_spelled_SetUp']),
|
||||
|
||||
('CATCHES_WRONG_CASE_IN_TYPED_TEST_P',
|
||||
[r'BarTest.*was not declared']),
|
||||
|
||||
('CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P',
|
||||
[r'BarTest.*was not declared']),
|
||||
|
||||
('CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P',
|
||||
[r'BarTest.*not declared']),
|
||||
|
||||
('CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX',
|
||||
[r'redefinition of.*My.*FooTest']),
|
||||
|
||||
('STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE',
|
||||
[r'StaticAssertTypeEq.* does not name a type']),
|
||||
|
||||
('STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE',
|
||||
[r'StaticAssertTypeEq.*int.*const int']),
|
||||
|
||||
('STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS',
|
||||
[r'StaticAssertTypeEq.*int.*bool']),
|
||||
|
||||
('STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION',
|
||||
[r'StaticAssertTypeEq.*const int.*int']),
|
||||
|
||||
('SANITY',
|
||||
None)
|
||||
]
|
||||
|
||||
@@ -32,20 +32,18 @@
|
||||
"""Tests the text output of Google C++ Testing Framework.
|
||||
|
||||
SYNOPSIS
|
||||
gtest_output_test.py --gtest_build_dir=BUILD/DIR --gengolden
|
||||
# where BUILD/DIR contains the built gtest_output_test_ file.
|
||||
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
|
||||
import gtest_test_utils
|
||||
|
||||
|
||||
# The flag for generating the golden file
|
||||
@@ -60,26 +58,12 @@ else:
|
||||
PROGRAM = 'gtest_output_test_'
|
||||
GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
|
||||
|
||||
PROGRAM_PATH = os.path.join(gtest_test_utils.GetBuildDir(), PROGRAM)
|
||||
|
||||
# At least one command we exercise must not have the
|
||||
# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
|
||||
COMMAND_WITH_COLOR = ({}, PROGRAM_PATH + ' --gtest_color=yes')
|
||||
COMMAND_WITH_TIME = ({}, PROGRAM_PATH + ' --gtest_print_time '
|
||||
'--gtest_internal_skip_environment_and_ad_hoc_tests '
|
||||
'--gtest_filter="FatalFailureTest.*:LoggingTest.*"')
|
||||
COMMAND_WITH_DISABLED = ({}, PROGRAM_PATH + ' --gtest_also_run_disabled_tests '
|
||||
'--gtest_internal_skip_environment_and_ad_hoc_tests '
|
||||
'--gtest_filter="*DISABLED_*"')
|
||||
COMMAND_WITH_SHARDING = ({'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},
|
||||
PROGRAM_PATH +
|
||||
' --gtest_internal_skip_environment_and_ad_hoc_tests '
|
||||
' --gtest_filter="PassingTest.*"')
|
||||
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."""
|
||||
|
||||
@@ -94,12 +78,11 @@ def RemoveLocations(output):
|
||||
|
||||
Returns:
|
||||
output with all file location info (in the form of
|
||||
'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
|
||||
'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
|
||||
'DIRECTORY/FILE_NAME:LINE_NUMBER: ') replaced by
|
||||
'FILE_NAME:#: '.
|
||||
"""
|
||||
|
||||
return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', output)
|
||||
return re.sub(r'.*[/\\](.+)\:\d+\: ', r'\1:#: ', output)
|
||||
|
||||
|
||||
def RemoveStackTraces(output):
|
||||
@@ -110,56 +93,28 @@ def RemoveStackTraces(output):
|
||||
'Stack trace: (omitted)\n\n', output)
|
||||
|
||||
|
||||
def RemoveTime(output):
|
||||
"""Removes all time information from a Google Test program's output."""
|
||||
|
||||
return re.sub(r'\(\d+ ms', '(? ms', output)
|
||||
|
||||
|
||||
def RemoveTestCounts(output):
|
||||
"""Removes test counts from a Google Test program's output."""
|
||||
|
||||
output = re.sub(r'\d+ tests from \d+ test cases',
|
||||
'? tests from ? test cases', output)
|
||||
return re.sub(r'\d+ tests\.', '? tests.', output)
|
||||
|
||||
|
||||
def RemoveDeathTests(output):
|
||||
"""Removes death test information from a Google Test program's output."""
|
||||
|
||||
return re.sub(r'\n.*DeathTest.*', '', output)
|
||||
|
||||
|
||||
def NormalizeOutput(output):
|
||||
"""Normalizes output (the output of gtest_output_test_.exe)."""
|
||||
|
||||
output = ToUnixLineEnding(output)
|
||||
output = RemoveLocations(output)
|
||||
output = RemoveStackTraces(output)
|
||||
output = RemoveTime(output)
|
||||
return output
|
||||
|
||||
|
||||
def IterShellCommandOutput(env_cmd, stdin_string=None):
|
||||
def IterShellCommandOutput(cmd, stdin_string=None):
|
||||
"""Runs a command in a sub-process, and iterates the lines in its STDOUT.
|
||||
|
||||
Args:
|
||||
|
||||
env_cmd: The shell command. A 2-tuple where element 0 is a dict
|
||||
of extra environment variables to set, and element 1
|
||||
is a string with the command and any flags.
|
||||
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.
|
||||
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.
|
||||
# Set and save the environment properly.
|
||||
old_env_vars = dict(os.environ)
|
||||
os.environ.update(env_cmd[0])
|
||||
stdin_file, stdout_file = os.popen2(env_cmd[1], 'b')
|
||||
os.environ.clear()
|
||||
os.environ.update(old_env_vars)
|
||||
stdin_file, stdout_file = os.popen2(cmd, 'b')
|
||||
|
||||
# If the caller didn't specify a string for STDIN, gets it from the
|
||||
# parent process.
|
||||
@@ -179,64 +134,48 @@ def IterShellCommandOutput(env_cmd, stdin_string=None):
|
||||
yield line
|
||||
|
||||
|
||||
def GetShellCommandOutput(env_cmd, stdin_string=None):
|
||||
def GetShellCommandOutput(cmd, stdin_string=None):
|
||||
"""Runs a command in a sub-process, and returns its STDOUT in a string.
|
||||
|
||||
Args:
|
||||
|
||||
env_cmd: The shell command. A 2-tuple where element 0 is a dict
|
||||
of extra environment variables to set, and element 1
|
||||
is a string with the command and any flags.
|
||||
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.
|
||||
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(env_cmd, stdin_string))
|
||||
lines = list(IterShellCommandOutput(cmd, stdin_string))
|
||||
return string.join(lines, '')
|
||||
|
||||
|
||||
def GetCommandOutput(env_cmd):
|
||||
def GetCommandOutput(cmd):
|
||||
"""Runs a command and returns its output with all file location
|
||||
info stripped off.
|
||||
|
||||
Args:
|
||||
env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
|
||||
environment variables to set, and element 1 is a string with
|
||||
the command and any flags.
|
||||
cmd: the shell command.
|
||||
"""
|
||||
|
||||
# Disables exception pop-ups on Windows.
|
||||
os.environ['GTEST_CATCH_EXCEPTIONS'] = '1'
|
||||
return NormalizeOutput(GetShellCommandOutput(env_cmd, ''))
|
||||
|
||||
|
||||
def GetOutputOfAllCommands():
|
||||
"""Returns concatenated output from several representative commands."""
|
||||
|
||||
return (GetCommandOutput(COMMAND_WITH_COLOR) +
|
||||
GetCommandOutput(COMMAND_WITH_TIME) +
|
||||
GetCommandOutput(COMMAND_WITH_DISABLED) +
|
||||
GetCommandOutput(COMMAND_WITH_SHARDING))
|
||||
os.environ['GUNIT_CATCH_EXCEPTIONS'] = '1'
|
||||
return NormalizeOutput(GetShellCommandOutput(cmd, ''))
|
||||
|
||||
|
||||
class GTestOutputTest(unittest.TestCase):
|
||||
def testOutput(self):
|
||||
output = GetOutputOfAllCommands()
|
||||
output = GetCommandOutput(COMMAND)
|
||||
|
||||
golden_file = open(GOLDEN_PATH, 'rb')
|
||||
golden = golden_file.read()
|
||||
golden_file.close()
|
||||
|
||||
# We want the test to pass regardless of death tests being
|
||||
# supported or not.
|
||||
self.assert_(output == golden or
|
||||
RemoveTestCounts(output) ==
|
||||
RemoveTestCounts(RemoveDeathTests(golden)))
|
||||
self.assertEquals(golden, output)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if sys.argv[1:] == [GENGOLDEN_FLAG]:
|
||||
output = GetOutputOfAllCommands()
|
||||
output = GetCommandOutput(COMMAND)
|
||||
golden_file = open(GOLDEN_PATH, 'wb')
|
||||
golden_file.write(output)
|
||||
golden_file.close()
|
||||
|
||||
@@ -40,28 +40,20 @@
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#if GTEST_HAS_PTHREAD
|
||||
#include <pthread.h>
|
||||
#endif // GTEST_HAS_PTHREAD
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
using testing::ScopedFakeTestPartResultReporter;
|
||||
using testing::TestPartResultArray;
|
||||
|
||||
using testing::internal::String;
|
||||
|
||||
// Tests catching fatal failures.
|
||||
|
||||
// A subroutine used by the following test.
|
||||
@@ -85,12 +77,6 @@ void TryTestSubroutine() {
|
||||
FAIL() << "This should never be reached.";
|
||||
}
|
||||
|
||||
TEST(PassingTest, PassingTest1) {
|
||||
}
|
||||
|
||||
TEST(PassingTest, PassingTest2) {
|
||||
}
|
||||
|
||||
// Tests catching a fatal failure in a subroutine.
|
||||
TEST(FatalFailureTest, FatalFailureInSubroutine) {
|
||||
printf("(expecting a failure that x should be 1)\n");
|
||||
@@ -220,14 +206,6 @@ TEST(SCOPED_TRACETest, CanBeRepeated) {
|
||||
<< "trace point A, B, and D.";
|
||||
}
|
||||
|
||||
TEST(DisabledTestsWarningTest,
|
||||
DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
|
||||
// This test body is intentionally empty. Its sole purpose is for
|
||||
// verifying that the --gtest_also_run_disabled_tests flag
|
||||
// suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
|
||||
// the test output.
|
||||
}
|
||||
|
||||
// Tests using assertions outside of TEST and TEST_F.
|
||||
//
|
||||
// This function creates two failures intentionally.
|
||||
@@ -355,7 +333,7 @@ TEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
|
||||
<< "We should never get here, as SetUp() failed.";
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// This group of tests verifies that Google Test handles SEH and C++
|
||||
// exceptions correctly.
|
||||
@@ -721,225 +699,6 @@ TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
|
||||
|
||||
#endif // GTEST_HAS_EXCEPTIONS
|
||||
|
||||
// This #ifdef block tests the output of typed tests.
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
|
||||
template <typename T>
|
||||
class TypedTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE(TypedTest, testing::Types<int>);
|
||||
|
||||
TYPED_TEST(TypedTest, Success) {
|
||||
EXPECT_EQ(0, TypeParam());
|
||||
}
|
||||
|
||||
TYPED_TEST(TypedTest, Failure) {
|
||||
EXPECT_EQ(1, TypeParam()) << "Expected failure";
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST
|
||||
|
||||
// This #ifdef block tests the output of type-parameterized tests.
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
template <typename T>
|
||||
class TypedTestP : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(TypedTestP);
|
||||
|
||||
TYPED_TEST_P(TypedTestP, Success) {
|
||||
EXPECT_EQ(0, TypeParam());
|
||||
}
|
||||
|
||||
TYPED_TEST_P(TypedTestP, Failure) {
|
||||
EXPECT_EQ(1, TypeParam()) << "Expected failure";
|
||||
}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
|
||||
|
||||
typedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
|
||||
// We rely on the golden file to verify that tests whose test case
|
||||
// name ends with DeathTest are run first.
|
||||
|
||||
TEST(ADeathTest, ShouldRunFirst) {
|
||||
}
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
|
||||
// We rely on the golden file to verify that typed tests whose test
|
||||
// case name ends with DeathTest are run first.
|
||||
|
||||
template <typename T>
|
||||
class ATypedDeathTest : public testing::Test {
|
||||
};
|
||||
|
||||
typedef testing::Types<int, double> NumericTypes;
|
||||
TYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
|
||||
|
||||
TYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
|
||||
// We rely on the golden file to verify that type-parameterized tests
|
||||
// whose test case name ends with DeathTest are run first.
|
||||
|
||||
template <typename T>
|
||||
class ATypeParamDeathTest : public testing::Test {
|
||||
};
|
||||
|
||||
TYPED_TEST_CASE_P(ATypeParamDeathTest);
|
||||
|
||||
TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
|
||||
}
|
||||
|
||||
REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
|
||||
|
||||
INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
|
||||
|
||||
#endif // GTEST_HAS_TYPED_TEST_P
|
||||
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Tests various failure conditions of
|
||||
// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
|
||||
class ExpectFailureTest : public testing::Test {
|
||||
protected:
|
||||
enum FailureMode {
|
||||
FATAL_FAILURE,
|
||||
NONFATAL_FAILURE
|
||||
};
|
||||
static void AddFailure(FailureMode failure) {
|
||||
if (failure == FATAL_FAILURE) {
|
||||
FAIL() << "Expected fatal failure.";
|
||||
} else {
|
||||
ADD_FAILURE() << "Expected non-fatal failure.";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExpectFailureTest, ExpectFatalFailure) {
|
||||
// Expected fatal failure, but succeeds.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
|
||||
// Expected fatal failure, but got a non-fatal failure.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
|
||||
"failure.");
|
||||
// Wrong message.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
|
||||
"expected.");
|
||||
}
|
||||
|
||||
TEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
|
||||
// Expected non-fatal failure, but succeeds.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
|
||||
// Expected non-fatal failure, but got a fatal failure.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
|
||||
// Wrong message.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
|
||||
"failure.");
|
||||
}
|
||||
|
||||
#if GTEST_IS_THREADSAFE && GTEST_HAS_PTHREAD
|
||||
|
||||
class ExpectFailureWithThreadsTest : public ExpectFailureTest {
|
||||
protected:
|
||||
static void AddFailureInOtherThread(FailureMode failure) {
|
||||
pthread_t tid;
|
||||
pthread_create(&tid,
|
||||
NULL,
|
||||
ExpectFailureWithThreadsTest::FailureThread,
|
||||
&failure);
|
||||
pthread_join(tid, NULL);
|
||||
}
|
||||
private:
|
||||
static void* FailureThread(void* attr) {
|
||||
FailureMode* failure = static_cast<FailureMode*>(attr);
|
||||
AddFailure(*failure);
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
|
||||
// We only intercept the current thread.
|
||||
printf("(expecting 2 failures)\n");
|
||||
EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
|
||||
"Expected fatal failure.");
|
||||
}
|
||||
|
||||
TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
|
||||
// We only intercept the current thread.
|
||||
printf("(expecting 2 failures)\n");
|
||||
EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
|
||||
"Expected non-fatal failure.");
|
||||
}
|
||||
|
||||
typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
|
||||
|
||||
// Tests that the ScopedFakeTestPartResultReporter only catches failures from
|
||||
// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
|
||||
TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
|
||||
printf("(expecting 2 failures)\n");
|
||||
TestPartResultArray results;
|
||||
{
|
||||
ScopedFakeTestPartResultReporter reporter(
|
||||
ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
|
||||
&results);
|
||||
AddFailureInOtherThread(FATAL_FAILURE);
|
||||
AddFailureInOtherThread(NONFATAL_FAILURE);
|
||||
}
|
||||
// The two failures should not have been intercepted.
|
||||
EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
|
||||
}
|
||||
|
||||
#endif // GTEST_IS_THREADSAFE && GTEST_HAS_PTHREAD
|
||||
|
||||
TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
|
||||
// Expected fatal failure, but succeeds.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
|
||||
// Expected fatal failure, but got a non-fatal failure.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
|
||||
"Expected non-fatal failure.");
|
||||
// Wrong message.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
|
||||
"Some other fatal failure expected.");
|
||||
}
|
||||
|
||||
TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
|
||||
// Expected non-fatal failure, but succeeds.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
|
||||
"failure.");
|
||||
// Expected non-fatal failure, but got a fatal failure.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
|
||||
"Expected fatal failure.");
|
||||
// Wrong message.
|
||||
printf("(expecting 1 failure)\n");
|
||||
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
|
||||
"Some other non-fatal failure.");
|
||||
}
|
||||
|
||||
|
||||
// Two test environments for testing testing::AddGlobalTestEnvironment().
|
||||
|
||||
class FooEnvironment : public testing::Environment {
|
||||
@@ -966,10 +725,6 @@ class BarEnvironment : public testing::Environment {
|
||||
}
|
||||
};
|
||||
|
||||
GTEST_DEFINE_bool_(internal_skip_environment_and_ad_hoc_tests, false,
|
||||
"This flag causes the program to skip test environment "
|
||||
"tests and ad hoc tests.");
|
||||
|
||||
// The main function.
|
||||
//
|
||||
// The idea is to use Google Test to run all the tests we have defined (some
|
||||
@@ -980,33 +735,16 @@ int main(int argc, char **argv) {
|
||||
// We will use a separate Python script to compare the output of
|
||||
// this program with the golden file.
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
if (argc >= 2 &&
|
||||
String(argv[1]) == "--gtest_internal_skip_environment_and_ad_hoc_tests")
|
||||
GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#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.
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4996)
|
||||
#endif // _MSC_VER
|
||||
freopen("nul:", "w", stdout);
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif // _MSC_VER
|
||||
#else
|
||||
freopen("/dev/null", "w", stdout);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
|
||||
return RUN_ALL_TESTS();
|
||||
|
||||
// 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.
|
||||
|
||||
@@ -7,30 +7,10 @@ Expected: true
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: 3
|
||||
Expected: 2
|
||||
[0;32m[==========] [mRunning 56 tests from 23 test cases.
|
||||
[0;32m[==========] [mRunning 37 tests from 13 test cases.
|
||||
[0;32m[----------] [mGlobal test environment set-up.
|
||||
FooEnvironment::SetUp() called.
|
||||
BarEnvironment::SetUp() called.
|
||||
[0;32m[----------] [m1 test from ADeathTest
|
||||
[0;32m[ RUN ] [mADeathTest.ShouldRunFirst
|
||||
[0;32m[ OK ] [mADeathTest.ShouldRunFirst
|
||||
[0;32m[----------] [m1 test from ATypedDeathTest/0, where TypeParam = int
|
||||
[0;32m[ RUN ] [mATypedDeathTest/0.ShouldRunFirst
|
||||
[0;32m[ OK ] [mATypedDeathTest/0.ShouldRunFirst
|
||||
[0;32m[----------] [m1 test from ATypedDeathTest/1, where TypeParam = double
|
||||
[0;32m[ RUN ] [mATypedDeathTest/1.ShouldRunFirst
|
||||
[0;32m[ OK ] [mATypedDeathTest/1.ShouldRunFirst
|
||||
[0;32m[----------] [m1 test from My/ATypeParamDeathTest/0, where TypeParam = int
|
||||
[0;32m[ RUN ] [mMy/ATypeParamDeathTest/0.ShouldRunFirst
|
||||
[0;32m[ OK ] [mMy/ATypeParamDeathTest/0.ShouldRunFirst
|
||||
[0;32m[----------] [m1 test from My/ATypeParamDeathTest/1, where TypeParam = double
|
||||
[0;32m[ RUN ] [mMy/ATypeParamDeathTest/1.ShouldRunFirst
|
||||
[0;32m[ OK ] [mMy/ATypeParamDeathTest/1.ShouldRunFirst
|
||||
[0;32m[----------] [m2 tests from PassingTest
|
||||
[0;32m[ RUN ] [mPassingTest.PassingTest1
|
||||
[0;32m[ OK ] [mPassingTest.PassingTest1
|
||||
[0;32m[ RUN ] [mPassingTest.PassingTest2
|
||||
[0;32m[ OK ] [mPassingTest.PassingTest2
|
||||
[0;32m[----------] [m3 tests from FatalFailureTest
|
||||
[0;32m[ RUN ] [mFatalFailureTest.FatalFailureInSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
@@ -275,7 +255,7 @@ 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[----------] [m8 tests from ExpectNonfatalFailureTest
|
||||
[0;32m[----------] [m7 tests from ExpectNonfatalFailureTest
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ OK ] [mExpectNonfatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.CanReferenceLocalVariables
|
||||
@@ -318,13 +298,7 @@ gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[0;32m[ RUN ] [mExpectNonfatalFailureTest.FailsWhenStatementThrows
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementThrows
|
||||
[0;32m[----------] [m8 tests from ExpectFatalFailureTest
|
||||
[0;32m[----------] [m7 tests from ExpectFatalFailureTest
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ OK ] [mExpectFatalFailureTest.CanReferenceGlobalVariables
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.CanReferenceLocalStaticVariables
|
||||
@@ -367,143 +341,6 @@ gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[0;32m[ RUN ] [mExpectFatalFailureTest.FailsWhenStatementThrows
|
||||
(expecting a failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementThrows
|
||||
[0;32m[----------] [m2 tests from TypedTest/0, where TypeParam = int
|
||||
[0;32m[ RUN ] [mTypedTest/0.Success
|
||||
[0;32m[ OK ] [mTypedTest/0.Success
|
||||
[0;32m[ RUN ] [mTypedTest/0.Failure
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: TypeParam()
|
||||
Actual: 0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[0;31m[ FAILED ] [mTypedTest/0.Failure
|
||||
[0;32m[----------] [m2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char
|
||||
[0;32m[ RUN ] [mUnsigned/TypedTestP/0.Success
|
||||
[0;32m[ OK ] [mUnsigned/TypedTestP/0.Success
|
||||
[0;32m[ RUN ] [mUnsigned/TypedTestP/0.Failure
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: TypeParam()
|
||||
Actual: \0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[0;31m[ FAILED ] [mUnsigned/TypedTestP/0.Failure
|
||||
[0;32m[----------] [m2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int
|
||||
[0;32m[ RUN ] [mUnsigned/TypedTestP/1.Success
|
||||
[0;32m[ OK ] [mUnsigned/TypedTestP/1.Success
|
||||
[0;32m[ RUN ] [mUnsigned/TypedTestP/1.Failure
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: TypeParam()
|
||||
Actual: 0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[0;31m[ FAILED ] [mUnsigned/TypedTestP/1.Failure
|
||||
[0;32m[----------] [m4 tests from ExpectFailureTest
|
||||
[0;32m[ RUN ] [mExpectFailureTest.ExpectFatalFailure
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure containing "Some other fatal failure expected."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectFatalFailure
|
||||
[0;32m[ RUN ] [mExpectFailureTest.ExpectNonFatalFailure
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure containing "Some other non-fatal failure."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectNonFatalFailure
|
||||
[0;32m[ RUN ] [mExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure containing "Some other fatal failure expected."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
[0;32m[ RUN ] [mExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure containing "Some other non-fatal failure."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
[0;32m[----------] [mGlobal test environment tear-down
|
||||
BarEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
@@ -513,9 +350,9 @@ FooEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
[0;32m[==========] [m56 tests from 23 test cases ran.
|
||||
[0;32m[ PASSED ] [m21 tests.
|
||||
[0;31m[ FAILED ] [m35 tests, listed below:
|
||||
[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
|
||||
@@ -538,95 +375,9 @@ Expected fatal failure.
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[0;31m[ FAILED ] [mExpectNonfatalFailureTest.FailsWhenStatementThrows
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[0;31m[ FAILED ] [mExpectFatalFailureTest.FailsWhenStatementThrows
|
||||
[0;31m[ FAILED ] [mTypedTest/0.Failure, where TypeParam = int
|
||||
[0;31m[ FAILED ] [mUnsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
|
||||
[0;31m[ FAILED ] [mUnsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectNonFatalFailure
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
[0;31m[ FAILED ] [mExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
|
||||
35 FAILED TESTS
|
||||
[0;33m YOU HAVE 1 DISABLED TEST
|
||||
|
||||
[mNote: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
||||
[==========] Running 4 tests from 2 test cases.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 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 (? ms)
|
||||
[ 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 (? ms)
|
||||
[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
(expecting a failure on false)
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)
|
||||
[----------] 3 tests from FatalFailureTest (? ms total)
|
||||
|
||||
[----------] 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 (? ms)
|
||||
[----------] 1 test from LoggingTest (? ms total)
|
||||
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 4 tests from 2 test cases ran. (? ms total)
|
||||
[ PASSED ] 0 tests.
|
||||
[ FAILED ] 4 tests, listed below:
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
|
||||
4 FAILED TESTS
|
||||
YOU HAVE 1 DISABLED TEST
|
||||
|
||||
Note: Google Test filter = *DISABLED_*
|
||||
[==========] Running 1 test from 1 test case.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 1 test from DisabledTestsWarningTest
|
||||
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 1 test from 1 test case ran.
|
||||
[ PASSED ] 1 test.
|
||||
Note: Google Test filter = PassingTest.*
|
||||
Note: This is test shard 1 of 2.
|
||||
[==========] Running 1 test from 1 test case.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 1 test from PassingTest
|
||||
[ RUN ] PassingTest.PassingTest2
|
||||
[ OK ] PassingTest.PassingTest2
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 1 test from 1 test case ran.
|
||||
[ PASSED ] 1 test.
|
||||
|
||||
YOU HAVE 1 DISABLED TEST
|
||||
|
||||
26 FAILED TESTS
|
||||
|
||||
@@ -1,50 +1,35 @@
|
||||
The non-test part of the code is expected to have 2 failures.
|
||||
|
||||
gtest_output_test_.cc:#: error: Value of: false
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
gtest_output_test_.cc:#: error: Value of: 3
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: 3
|
||||
Expected: 2
|
||||
[==========] Running 57 tests from 26 test cases.
|
||||
[==========] Running 40 tests from 16 test cases.
|
||||
[----------] Global test environment set-up.
|
||||
FooEnvironment::SetUp() called.
|
||||
BarEnvironment::SetUp() called.
|
||||
[----------] 1 test from ADeathTest
|
||||
[ RUN ] ADeathTest.ShouldRunFirst
|
||||
[ OK ] ADeathTest.ShouldRunFirst
|
||||
[----------] 1 test from ATypedDeathTest/0, where TypeParam = int
|
||||
[ RUN ] ATypedDeathTest/0.ShouldRunFirst
|
||||
[ OK ] ATypedDeathTest/0.ShouldRunFirst
|
||||
[----------] 1 test from ATypedDeathTest/1, where TypeParam = double
|
||||
[ RUN ] ATypedDeathTest/1.ShouldRunFirst
|
||||
[ OK ] ATypedDeathTest/1.ShouldRunFirst
|
||||
[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int
|
||||
[ RUN ] My/ATypeParamDeathTest/0.ShouldRunFirst
|
||||
[ OK ] My/ATypeParamDeathTest/0.ShouldRunFirst
|
||||
[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double
|
||||
[ RUN ] My/ATypeParamDeathTest/1.ShouldRunFirst
|
||||
[ OK ] My/ATypeParamDeathTest/1.ShouldRunFirst
|
||||
[----------] 2 tests from PassingTest
|
||||
[ RUN ] PassingTest.PassingTest1
|
||||
[ OK ] PassingTest.PassingTest1
|
||||
[ RUN ] PassingTest.PassingTest2
|
||||
[ OK ] PassingTest.PassingTest2
|
||||
[----------] 3 tests from FatalFailureTest
|
||||
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: error: Value of: x
|
||||
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:#: error: Value of: x
|
||||
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:#: error: Value of: false
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
@@ -53,78 +38,92 @@ Expected: true
|
||||
(expecting 2 failures on (3) >= (a[i]))
|
||||
i == 0
|
||||
i == 1
|
||||
gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Expected: (3) >= (a[i]), actual: 3 vs 9
|
||||
i == 2
|
||||
i == 3
|
||||
gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and shouldn't have a trace.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should have a trace.
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: Expected trace
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Value of: n
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: i = 1
|
||||
gtest_output_test_.cc:#: error: Value of: n
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: i = 2
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInLoop
|
||||
[ RUN ] SCOPED_TRACETest.WorksInSubroutine
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: error: Value of: n
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 1
|
||||
Expected: 2
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: n = 1
|
||||
gtest_output_test_.cc:#: error: Value of: n
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: n = 2
|
||||
[ FAILED ] SCOPED_TRACETest.WorksInSubroutine
|
||||
[ RUN ] SCOPED_TRACETest.CanBeNested
|
||||
(expected to fail)
|
||||
gtest_output_test_.cc:#: error: Value of: n
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Value of: n
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
Google Test trace:
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A.
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A and B.
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and C.
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: C
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
This failure is expected, and should contain trace point A, B, and D.
|
||||
Google Test trace:
|
||||
gUnit trace:
|
||||
gtest_output_test_.cc:#: D
|
||||
gtest_output_test_.cc:#: B
|
||||
gtest_output_test_.cc:#: A
|
||||
@@ -132,67 +131,88 @@ gtest_output_test_.cc:#: A
|
||||
[----------] 1 test from NonFatalFailureInFixtureConstructorTest
|
||||
[ RUN ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
|
||||
(expecting 5 failures)
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in SetUp().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test body.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #4, in TearDown.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in the test fixture c'tor.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in the test function.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in TearDown().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #1, in SetUp().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #2, in TearDown().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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: error: Exception thrown with code 0xc0000005 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: error: Exception thrown with code 0xc0000005 in SetUp().
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Failed
|
||||
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: error: Exception thrown with code 0xc0000005 in the test body.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
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:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected failure #3, in the test fixture d'tor.
|
||||
[ FAILED ] ExceptionInTestFunctionTest.SEH
|
||||
[----------] 4 tests from MixedUpTestCaseTest
|
||||
@@ -201,7 +221,8 @@ Expected failure #3, in the test fixture d'tor.
|
||||
[ RUN ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[ OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
|
||||
[ RUN ] MixedUpTestCaseTest.ThisShouldFail
|
||||
gtest.cc:#: error: Failed
|
||||
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
|
||||
@@ -211,7 +232,8 @@ 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:#: error: Failed
|
||||
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
|
||||
@@ -224,7 +246,8 @@ of the classes to put the tests into different test cases.
|
||||
[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[ OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
|
||||
gtest.cc:#: error: Failed
|
||||
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
|
||||
@@ -237,7 +260,8 @@ of the classes to put the tests into different test cases.
|
||||
[ 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:#: error: Failed
|
||||
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,
|
||||
@@ -250,7 +274,8 @@ 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:#: error: Failed
|
||||
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,
|
||||
@@ -268,12 +293,14 @@ case.
|
||||
[ OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
@@ -286,7 +313,8 @@ Expected non-fatal failure 2.
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
@@ -295,7 +323,8 @@ Expected fatal failure.
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
|
||||
[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 non-fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
|
||||
[----------] 7 tests from ExpectFatalFailureTest
|
||||
@@ -307,12 +336,14 @@ gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
[ OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 2 failures
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
@@ -325,7 +356,8 @@ Expected fatal failure.
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
@@ -334,135 +366,22 @@ Expected non-fatal failure.
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[ RUN ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
(expecting a failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
gtest.cc:#: Failure
|
||||
Expected: 1 fatal failure
|
||||
Actual: 0 failures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[----------] 2 tests from TypedTest/0, where TypeParam = int
|
||||
[ RUN ] TypedTest/0.Success
|
||||
[ OK ] TypedTest/0.Success
|
||||
[ RUN ] TypedTest/0.Failure
|
||||
gtest_output_test_.cc:#: error: Value of: TypeParam()
|
||||
Actual: 0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[ FAILED ] TypedTest/0.Failure
|
||||
[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char
|
||||
[ RUN ] Unsigned/TypedTestP/0.Success
|
||||
[ OK ] Unsigned/TypedTestP/0.Success
|
||||
[ RUN ] Unsigned/TypedTestP/0.Failure
|
||||
gtest_output_test_.cc:#: error: Value of: TypeParam()
|
||||
Actual: \0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[ FAILED ] Unsigned/TypedTestP/0.Failure
|
||||
[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int
|
||||
[ RUN ] Unsigned/TypedTestP/1.Success
|
||||
[ OK ] Unsigned/TypedTestP/1.Success
|
||||
[ RUN ] Unsigned/TypedTestP/1.Failure
|
||||
gtest_output_test_.cc:#: error: Value of: TypeParam()
|
||||
Actual: 0
|
||||
Expected: 1
|
||||
Expected failure
|
||||
[ FAILED ] Unsigned/TypedTestP/1.Failure
|
||||
[----------] 4 tests from ExpectFailureTest
|
||||
[ RUN ] ExpectFailureTest.ExpectFatalFailure
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure containing "Some other fatal failure expected."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFailureTest.ExpectFatalFailure
|
||||
[ RUN ] ExpectFailureTest.ExpectNonFatalFailure
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure containing "Some other non-fatal failure."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure
|
||||
[ RUN ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 fatal failure containing "Some other fatal failure expected."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
[ RUN ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Success:
|
||||
Succeeded
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Fatal failure:
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
|
||||
(expecting 1 failure)
|
||||
gtest.cc:#: error: Expected: 1 non-fatal failure containing "Some other non-fatal failure."
|
||||
Actual:
|
||||
gtest_output_test_.cc:#: Non-fatal failure:
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
|
||||
[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
[----------] Global test environment tear-down
|
||||
BarEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected non-fatal failure.
|
||||
FooEnvironment::TearDown() called.
|
||||
gtest_output_test_.cc:#: error: Failed
|
||||
gtest_output_test_.cc:#: Failure
|
||||
Failed
|
||||
Expected fatal failure.
|
||||
[==========] 57 tests from 26 test cases ran.
|
||||
[ PASSED ] 21 tests.
|
||||
[ FAILED ] 36 tests, listed below:
|
||||
[==========] 40 tests from 16 test cases ran.
|
||||
[ PASSED ] 11 tests.
|
||||
[ FAILED ] 29 tests, listed below:
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
@@ -492,84 +411,5 @@ Expected fatal failure.
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
|
||||
[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns
|
||||
[ FAILED ] TypedTest/0.Failure, where TypeParam = int
|
||||
[ FAILED ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
|
||||
[ FAILED ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
|
||||
[ FAILED ] ExpectFailureTest.ExpectFatalFailure
|
||||
[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure
|
||||
[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
|
||||
[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
|
||||
|
||||
36 FAILED TESTS
|
||||
YOU HAVE 1 DISABLED TEST
|
||||
|
||||
Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
||||
[==========] Running 4 tests from 2 test cases.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 3 tests from FatalFailureTest
|
||||
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: error: Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine (? ms)
|
||||
[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
(expecting a failure that x should be 1)
|
||||
gtest_output_test_.cc:#: error: Value of: x
|
||||
Actual: 2
|
||||
Expected: 1
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)
|
||||
[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
(expecting a failure on false)
|
||||
gtest_output_test_.cc:#: error: Value of: false
|
||||
Actual: false
|
||||
Expected: true
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)
|
||||
[----------] 3 tests from FatalFailureTest (? ms total)
|
||||
|
||||
[----------] 1 test from LoggingTest
|
||||
[ RUN ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
(expecting 2 failures on (3) >= (a[i]))
|
||||
i == 0
|
||||
i == 1
|
||||
gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9
|
||||
i == 2
|
||||
i == 3
|
||||
gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6
|
||||
[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions (? ms)
|
||||
[----------] 1 test from LoggingTest (? ms total)
|
||||
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 4 tests from 2 test cases ran. (? ms total)
|
||||
[ PASSED ] 0 tests.
|
||||
[ FAILED ] 4 tests, listed below:
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInSubroutine
|
||||
[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine
|
||||
[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine
|
||||
[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions
|
||||
|
||||
4 FAILED TESTS
|
||||
YOU HAVE 1 DISABLED TEST
|
||||
|
||||
Note: Google Test filter = *DISABLED_*
|
||||
[==========] Running 1 test from 1 test case.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 1 test from DisabledTestsWarningTest
|
||||
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 1 test from 1 test case ran.
|
||||
[ PASSED ] 1 test.
|
||||
Note: Google Test filter = PassingTest.*
|
||||
Note: This is test shard 1 of 2.
|
||||
[==========] Running 1 test from 1 test case.
|
||||
[----------] Global test environment set-up.
|
||||
[----------] 1 test from PassingTest
|
||||
[ RUN ] PassingTest.PassingTest2
|
||||
[ OK ] PassingTest.PassingTest2
|
||||
[----------] Global test environment tear-down
|
||||
[==========] 1 test from 1 test case ran.
|
||||
[ PASSED ] 1 test.
|
||||
|
||||
YOU HAVE 1 DISABLED TEST
|
||||
|
||||
29 FAILED TESTS
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command
|
||||
// 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
|
||||
|
||||
@@ -40,15 +40,15 @@
|
||||
// included, or there will be a compiler error. This trick is to
|
||||
// prevent a user from accidentally including gtest-internal-inl.h in
|
||||
// his code.
|
||||
#define GTEST_IMPLEMENTATION_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
|
||||
GTEST_DECLARE_string_(death_test_style);
|
||||
GTEST_DECLARE_string_(filter);
|
||||
GTEST_DECLARE_int32_(repeat);
|
||||
GTEST_DECLARE_string(death_test_style);
|
||||
GTEST_DECLARE_string(filter);
|
||||
GTEST_DECLARE_int32(repeat);
|
||||
|
||||
} // namespace testing
|
||||
|
||||
@@ -58,8 +58,6 @@ using testing::GTEST_FLAG(repeat);
|
||||
|
||||
namespace {
|
||||
|
||||
// We need this when we are testing Google Test itself and therefore
|
||||
// cannot use Google Test assertions.
|
||||
#define GTEST_CHECK_INT_EQ_(expected, actual) \
|
||||
do {\
|
||||
const int expected_val = (expected);\
|
||||
@@ -112,33 +110,13 @@ int g_death_test_count = 0;
|
||||
TEST(BarDeathTest, ThreadSafeAndFast) {
|
||||
g_death_test_count++;
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
GTEST_FLAG(death_test_style) = "threadsafe";
|
||||
EXPECT_DEATH(abort(), "");
|
||||
|
||||
GTEST_FLAG(death_test_style) = "fast";
|
||||
EXPECT_DEATH(abort(), "");
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
}
|
||||
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
int g_param_test_count = 0;
|
||||
|
||||
const int kNumberOfParamTests = 10;
|
||||
|
||||
class MyParamTest : public testing::TestWithParam<int> {};
|
||||
|
||||
TEST_P(MyParamTest, ShouldPass) {
|
||||
// TODO(vladl@google.com): Make parameter value checking robust
|
||||
// WRT order of tests.
|
||||
GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
|
||||
g_param_test_count++;
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(MyParamSequence,
|
||||
MyParamTest,
|
||||
testing::Range(0, kNumberOfParamTests));
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
|
||||
// Resets the count for each test.
|
||||
void ResetCounts() {
|
||||
g_environment_set_up_count = 0;
|
||||
@@ -146,21 +124,17 @@ void ResetCounts() {
|
||||
g_should_fail_count = 0;
|
||||
g_should_pass_count = 0;
|
||||
g_death_test_count = 0;
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
g_param_test_count = 0;
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
}
|
||||
|
||||
// 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);
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
}
|
||||
|
||||
// Tests the behavior of Google Test when --gtest_repeat is not specified.
|
||||
@@ -203,9 +177,6 @@ void TestRepeatWithFilterForSuccessfulTests(int repeat) {
|
||||
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);
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
}
|
||||
|
||||
// Tests using --gtest_repeat when --gtest_filter specifies a set of
|
||||
@@ -221,9 +192,6 @@ void TestRepeatWithFilterForFailedTests(int repeat) {
|
||||
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);
|
||||
#if GTEST_HAS_PARAM_TEST
|
||||
GTEST_CHECK_INT_EQ_(0, g_param_test_count);
|
||||
#endif // GTEST_HAS_PARAM_TEST
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
// Copyright 2008, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: mheule@google.com (Markus Heule)
|
||||
//
|
||||
// This test verifies that it's possible to use Google Test by including
|
||||
// the gtest.h header file alone.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace {
|
||||
|
||||
void Subroutine() {
|
||||
EXPECT_EQ(42, 42);
|
||||
}
|
||||
|
||||
TEST(NoFatalFailureTest, ExpectNoFatalFailure) {
|
||||
EXPECT_NO_FATAL_FAILURE(;);
|
||||
EXPECT_NO_FATAL_FAILURE(SUCCEED());
|
||||
EXPECT_NO_FATAL_FAILURE(Subroutine());
|
||||
EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });
|
||||
}
|
||||
|
||||
TEST(NoFatalFailureTest, AssertNoFatalFailure) {
|
||||
ASSERT_NO_FATAL_FAILURE(;);
|
||||
ASSERT_NO_FATAL_FAILURE(SUCCEED());
|
||||
ASSERT_NO_FATAL_FAILURE(Subroutine());
|
||||
ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -38,9 +38,9 @@
|
||||
// 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_ 1
|
||||
#define GTEST_IMPLEMENTATION
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
#undef GTEST_IMPLEMENTATION
|
||||
|
||||
namespace testing {
|
||||
namespace {
|
||||
@@ -112,36 +112,6 @@ TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {
|
||||
// ManyAsserts() in many threads here.
|
||||
}
|
||||
|
||||
TEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {
|
||||
// TODO(mheule@google.com): Test this works correctly when Google
|
||||
// Test is made thread-safe.
|
||||
}
|
||||
|
||||
TEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {
|
||||
// TODO(mheule@google.com): Test this works correctly when Google
|
||||
// Test is made thread-safe.
|
||||
}
|
||||
|
||||
TEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {
|
||||
// TODO(mheule@google.com): Test this works correctly when Google
|
||||
// Test is made thread-safe.
|
||||
}
|
||||
|
||||
TEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {
|
||||
// TODO(wan@google.com): Test this works correctly when Google Test
|
||||
// is made thread-safe.
|
||||
}
|
||||
|
||||
TEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {
|
||||
// TODO(mheule@google.com): Test this works correctly when Google
|
||||
// Test is made thread-safe.
|
||||
}
|
||||
|
||||
TEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {
|
||||
// TODO(wan@google.com): Test this works correctly when Google Test
|
||||
// is made thread-safe.
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
|
||||
|
||||
@@ -37,13 +37,6 @@ import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
try:
|
||||
import subprocess
|
||||
_SUBPROCESS_MODULE_AVAILABLE = True
|
||||
except:
|
||||
import popen2
|
||||
_SUBPROCESS_MODULE_AVAILABLE = False
|
||||
|
||||
|
||||
# Initially maps a flag to its default value. After
|
||||
# _ParseAndStripGTestFlags() is called, maps a flag to its actual
|
||||
@@ -103,87 +96,6 @@ def GetBuildDir():
|
||||
return os.path.abspath(GetFlag('gtest_build_dir'))
|
||||
|
||||
|
||||
def GetExitStatus(exit_code):
|
||||
"""Returns the argument to exit(), or -1 if exit() wasn't called.
|
||||
|
||||
Args:
|
||||
exit_code: the result value of os.system(command).
|
||||
"""
|
||||
|
||||
if os.name == 'nt':
|
||||
# On Windows, os.WEXITSTATUS() doesn't work and os.system() returns
|
||||
# the argument to exit() directly.
|
||||
return exit_code
|
||||
else:
|
||||
# On Unix, os.WEXITSTATUS() must be used to extract the exit status
|
||||
# from the result of os.system().
|
||||
if os.WIFEXITED(exit_code):
|
||||
return os.WEXITSTATUS(exit_code)
|
||||
else:
|
||||
return -1
|
||||
|
||||
|
||||
class Subprocess:
|
||||
def __init__(self, command, working_dir=None):
|
||||
"""Changes into a specified directory, if provided, and executes a command.
|
||||
Restores the old directory afterwards. Execution results are returned
|
||||
via the following attributes:
|
||||
terminated_by_sygnal True iff the child process has been terminated
|
||||
by a signal.
|
||||
signal Sygnal that terminated the child process.
|
||||
exited True iff the child process exited normally.
|
||||
exit_code The code with which the child proces exited.
|
||||
output Child process's stdout and stderr output
|
||||
combined in a string.
|
||||
|
||||
Args:
|
||||
command: A command to run, in the form of sys.argv.
|
||||
working_dir: A directory to change into.
|
||||
"""
|
||||
|
||||
# The subprocess module is the preferrable way of running programs
|
||||
# since it is available and behaves consistently on all platforms,
|
||||
# including Windows. But it is only available starting in python 2.4.
|
||||
# In earlier python versions, we revert to the popen2 module, which is
|
||||
# available in python 2.0 and later but doesn't provide required
|
||||
# functionality (Popen4) under Windows. This allows us to support Mac
|
||||
# OS X 10.4 Tiger, which has python 2.3 installed.
|
||||
if _SUBPROCESS_MODULE_AVAILABLE:
|
||||
p = subprocess.Popen(command,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
cwd=working_dir, universal_newlines=True)
|
||||
# communicate returns a tuple with the file obect for the child's
|
||||
# output.
|
||||
self.output = p.communicate()[0]
|
||||
self._return_code = p.returncode
|
||||
else:
|
||||
old_dir = os.getcwd()
|
||||
try:
|
||||
if working_dir is not None:
|
||||
os.chdir(working_dir)
|
||||
p = popen2.Popen4(command)
|
||||
p.tochild.close()
|
||||
self.output = p.fromchild.read()
|
||||
ret_code = p.wait()
|
||||
finally:
|
||||
os.chdir(old_dir)
|
||||
# Converts ret_code to match the semantics of
|
||||
# subprocess.Popen.returncode.
|
||||
if os.WIFSIGNALED(ret_code):
|
||||
self._return_code = -os.WTERMSIG(ret_code)
|
||||
else: # os.WIFEXITED(ret_code) should return True here.
|
||||
self._return_code = os.WEXITSTATUS(ret_code)
|
||||
|
||||
if self._return_code < 0:
|
||||
self.terminated_by_signal = True
|
||||
self.exited = False
|
||||
self.signal = -self._return_code
|
||||
else:
|
||||
self.terminated_by_signal = False
|
||||
self.exited = True
|
||||
self.exit_code = self._return_code
|
||||
|
||||
|
||||
def Main():
|
||||
"""Runs the unit test."""
|
||||
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
// Copyright 2009, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Tests Google Test's throw-on-failure mode with exceptions enabled.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdexcept>
|
||||
|
||||
// Prints the given failure message and exits the program with
|
||||
// non-zero. We use this instead of a Google Test assertion to
|
||||
// indicate a failure, as the latter is been tested and cannot be
|
||||
// relied on.
|
||||
void Fail(const char* msg) {
|
||||
printf("FAILURE: %s\n", msg);
|
||||
fflush(stdout);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Tests that an assertion failure throws a subclass of
|
||||
// std::runtime_error.
|
||||
void TestFailureThrowsRuntimeError() {
|
||||
testing::GTEST_FLAG(throw_on_failure) = true;
|
||||
|
||||
// A successful assertion shouldn't throw.
|
||||
try {
|
||||
EXPECT_EQ(3, 3);
|
||||
} catch(...) {
|
||||
Fail("A successful assertion wrongfully threw.");
|
||||
}
|
||||
|
||||
// A failed assertion should throw a subclass of std::runtime_error.
|
||||
try {
|
||||
EXPECT_EQ(2, 3) << "Expected failure";
|
||||
} catch(const std::runtime_error& e) {
|
||||
if (strstr(e.what(), "Expected failure") != NULL)
|
||||
return;
|
||||
|
||||
printf("%s",
|
||||
"A failed assertion did throw an exception of the right type, "
|
||||
"but the message is incorrect. Instead of containing \"Expected "
|
||||
"failure\", it is:\n");
|
||||
Fail(e.what());
|
||||
} catch(...) {
|
||||
Fail("A failed assertion threw the wrong type of exception.");
|
||||
}
|
||||
Fail("A failed assertion should've thrown but didn't.");
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
// We want to ensure that people can use Google Test assertions in
|
||||
// other testing frameworks, as long as they initialize Google Test
|
||||
// properly and set the thrown-on-failure mode. Therefore, we don't
|
||||
// use Google Test's constructs for defining and running tests
|
||||
// (e.g. TEST and RUN_ALL_TESTS) here.
|
||||
|
||||
TestFailureThrowsRuntimeError();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,171 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2009, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
"""Tests Google Test's throw-on-failure mode with exceptions disabled.
|
||||
|
||||
This script invokes gtest_throw_on_failure_test_ (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 unittest
|
||||
|
||||
|
||||
# Constants.
|
||||
|
||||
# The command line flag for enabling/disabling the throw-on-failure mode.
|
||||
THROW_ON_FAILURE = 'gtest_throw_on_failure'
|
||||
|
||||
# Path to the gtest_throw_on_failure_test_ program, compiled with
|
||||
# exceptions disabled.
|
||||
EXE_PATH = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
'gtest_throw_on_failure_test_')
|
||||
|
||||
|
||||
# Utilities.
|
||||
|
||||
|
||||
def SetEnvVar(env_var, value):
|
||||
"""Sets an environment variable to a given value; unsets it when the
|
||||
given value is None.
|
||||
"""
|
||||
|
||||
env_var = env_var.upper()
|
||||
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 True/False if its exit code is/isn't 0."""
|
||||
|
||||
print 'Running "%s". . .' % ' '.join(command)
|
||||
return gtest_test_utils.Subprocess(command).exit_code == 0
|
||||
|
||||
|
||||
# The tests. TODO(wan@google.com): refactor the class to share common
|
||||
# logic with code in gtest_break_on_failure_unittest.py.
|
||||
class ThrowOnFailureTest(unittest.TestCase):
|
||||
"""Tests the throw-on-failure mode."""
|
||||
|
||||
def RunAndVerify(self, env_var_value, flag_value, should_fail):
|
||||
"""Runs gtest_throw_on_failure_test_ and verifies that it does
|
||||
(or does not) exit with a non-zero code.
|
||||
|
||||
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.
|
||||
should_fail: True iff the program is expected to fail.
|
||||
"""
|
||||
|
||||
SetEnvVar(THROW_ON_FAILURE, 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' % THROW_ON_FAILURE
|
||||
else:
|
||||
flag = '--%s' % THROW_ON_FAILURE
|
||||
|
||||
command = [EXE_PATH]
|
||||
if flag:
|
||||
command.append(flag)
|
||||
|
||||
if should_fail:
|
||||
should_or_not = 'should'
|
||||
else:
|
||||
should_or_not = 'should not'
|
||||
|
||||
failed = not Run(command)
|
||||
|
||||
SetEnvVar(THROW_ON_FAILURE, None)
|
||||
|
||||
msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero '
|
||||
'exit code.' %
|
||||
(THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),
|
||||
should_or_not))
|
||||
self.assert_(failed == should_fail, msg)
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of the default mode."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)
|
||||
|
||||
def testThrowOnFailureEnvVar(self):
|
||||
"""Tests using the GTEST_THROW_ON_FAILURE environment variable."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value=None,
|
||||
should_fail=False)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value=None,
|
||||
should_fail=True)
|
||||
|
||||
def testThrowOnFailureFlag(self):
|
||||
"""Tests using the --gtest_throw_on_failure flag."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='0',
|
||||
should_fail=False)
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='1',
|
||||
should_fail=True)
|
||||
|
||||
def testThrowOnFailureFlagOverridesEnvVar(self):
|
||||
"""Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='0',
|
||||
should_fail=False)
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='1',
|
||||
should_fail=True)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='0',
|
||||
should_fail=False)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='1',
|
||||
should_fail=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
@@ -1,56 +0,0 @@
|
||||
// Copyright 2009, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Author: wan@google.com (Zhanyong Wan)
|
||||
|
||||
// Tests Google Test's throw-on-failure mode with exceptions disabled.
|
||||
//
|
||||
// This program must be compiled with exceptions disabled. It will be
|
||||
// invoked by gtest_throw_on_failure_test.py, and is expected to exit
|
||||
// with non-zero in the throw-on-failure mode or 0 otherwise.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
// We want to ensure that people can use Google Test assertions in
|
||||
// other testing frameworks, as long as they initialize Google Test
|
||||
// properly and set the thrown-on-failure mode. Therefore, we don't
|
||||
// use Google Test's constructs for defining and running tests
|
||||
// (e.g. TEST and RUN_ALL_TESTS) here.
|
||||
|
||||
// In the throw-on-failure mode with exceptions disabled, this
|
||||
// assertion will cause the program to exit with a non-zero code.
|
||||
EXPECT_EQ(2, 3);
|
||||
|
||||
// When not in the throw-on-failure mode, the control will reach
|
||||
// here.
|
||||
return 0;
|
||||
}
|
||||
@@ -67,14 +67,23 @@ def AssertEq(expected, 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."""
|
||||
|
||||
# Verifies that 'command' exits with code 1.
|
||||
p = gtest_test_utils.Subprocess(command)
|
||||
Assert(p.exited)
|
||||
AssertEq(1, p.exit_code)
|
||||
Assert('InitGoogleTest' in p.output)
|
||||
# 256 corresponds to return code 0.
|
||||
AssertEq(256, os.system(command))
|
||||
output = GetOutput(command)
|
||||
Assert('InitGoogleTest' in output)
|
||||
|
||||
|
||||
if IS_WINDOWS:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -100,10 +100,10 @@ class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
def _TestOutFile(self, test_name, expected_xml):
|
||||
gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
test_name)
|
||||
command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_]
|
||||
p = gtest_test_utils.Subprocess(command, working_dir=tempfile.mkdtemp())
|
||||
self.assert_(p.exited)
|
||||
self.assertEquals(0, p.exit_code)
|
||||
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
|
||||
@@ -122,9 +122,9 @@ class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
actual = minidom.parse(output_file1)
|
||||
else:
|
||||
actual = minidom.parse(output_file2)
|
||||
self.NormalizeXml(actual.documentElement)
|
||||
self.AssertEquivalentNodes(expected.documentElement,
|
||||
actual.documentElement)
|
||||
self._NormalizeXml(actual.documentElement)
|
||||
self._AssertEquivalentElements(expected.documentElement,
|
||||
actual.documentElement)
|
||||
expected.unlink()
|
||||
actual.unlink()
|
||||
|
||||
|
||||
@@ -54,20 +54,14 @@ EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
</testsuite>
|
||||
<testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
||||
<testcase name="Fails" status="run" time="*" classname="FailedTest">
|
||||
<failure message="Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
|
||||
Value of: 2
|
||||
Expected: 1]]></failure>
|
||||
<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="Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
|
||||
Value of: 2
|
||||
Expected: 1]]></failure>
|
||||
<failure message="Value of: 3
Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
|
||||
Value of: 3
|
||||
Expected: 2]]></failure>
|
||||
<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>
|
||||
@@ -131,11 +125,10 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
if e.errno != errno.ENOENT:
|
||||
raise
|
||||
|
||||
p = gtest_test_utils.Subprocess(
|
||||
[gtest_prog_path, "%s=xml" % GTEST_OUTPUT_FLAG],
|
||||
working_dir=temp_dir)
|
||||
self.assert_(p.exited)
|
||||
self.assertEquals(0, p.exit_code)
|
||||
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))
|
||||
|
||||
|
||||
@@ -151,28 +144,28 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||
gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(),
|
||||
gtest_prog_name)
|
||||
|
||||
command = [gtest_prog_path, "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path)]
|
||||
p = gtest_test_utils.Subprocess(command)
|
||||
if p.terminated_by_signal:
|
||||
self.assert_(False,
|
||||
"%s was killed by signal %d" % (gtest_prog_name, p.signal))
|
||||
else:
|
||||
self.assert_(p.exited)
|
||||
self.assertEquals(expected_exit_code, p.exit_code,
|
||||
"'%s' exited with code %s, which doesn't match "
|
||||
"the expected exit code %s."
|
||||
% (command, p.exit_code, expected_exit_code))
|
||||
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.AssertEquivalentNodes(expected.documentElement,
|
||||
actual.documentElement)
|
||||
self._NormalizeXml(actual.documentElement)
|
||||
self._AssertEquivalentElements(expected.documentElement,
|
||||
actual.documentElement)
|
||||
expected.unlink()
|
||||
actual .unlink()
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'
|
||||
os.environ['GTEST_STACK_TRACE_DEPTH'] = '0'
|
||||
gtest_test_utils.Main()
|
||||
|
||||
@@ -47,35 +47,27 @@ class GTestXMLTestCase(unittest.TestCase):
|
||||
"""
|
||||
|
||||
|
||||
def AssertEquivalentNodes(self, expected_node, actual_node):
|
||||
def _AssertEquivalentElements(self, expected_element, actual_element):
|
||||
"""
|
||||
Asserts that actual_node (a DOM node object) is equivalent to
|
||||
expected_node (another DOM node object), in that either both of
|
||||
them are CDATA nodes and have the same value, or both are DOM
|
||||
elements and actual_node meets all of the following conditions:
|
||||
|
||||
* It has the same tag name as expected_node.
|
||||
* It has the same set of attributes as expected_node, each with
|
||||
the same value as the corresponding attribute of expected_node.
|
||||
An exception is any attribute named "time", which needs only be
|
||||
convertible to a floating-point number.
|
||||
* It has an equivalent set of child nodes (including elements and
|
||||
CDATA sections) as expected_node. Note that we ignore the
|
||||
order of the children as they are not guaranteed to be in any
|
||||
particular order.
|
||||
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)
|
||||
|
||||
if expected_node.nodeType == Node.CDATA_SECTION_NODE:
|
||||
self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)
|
||||
self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)
|
||||
return
|
||||
|
||||
self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)
|
||||
self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)
|
||||
self.assertEquals(expected_node.tagName, actual_node.tagName)
|
||||
|
||||
expected_attributes = expected_node.attributes
|
||||
actual_attributes = actual_node .attributes
|
||||
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)
|
||||
@@ -83,13 +75,13 @@ class GTestXMLTestCase(unittest.TestCase):
|
||||
self.assert_(actual_attr is not None)
|
||||
self.assertEquals(expected_attr.value, actual_attr.value)
|
||||
|
||||
expected_children = self._GetChildren(expected_node)
|
||||
actual_children = self._GetChildren(actual_node)
|
||||
self.assertEquals(len(expected_children), len(actual_children))
|
||||
for child_id, child in expected_children.iteritems():
|
||||
self.assert_(child_id in actual_children,
|
||||
'<%s> is not in <%s>' % (child_id, actual_children))
|
||||
self.AssertEquivalentNodes(child, actual_children[child_id])
|
||||
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",
|
||||
@@ -97,20 +89,18 @@ class GTestXMLTestCase(unittest.TestCase):
|
||||
"failure": "message",
|
||||
}
|
||||
|
||||
def _GetChildren(self, element):
|
||||
def _GetChildElements(self, element):
|
||||
"""
|
||||
Fetches all of the child nodes of element, a DOM Element object.
|
||||
Returns them as the values of a dictionary keyed by the IDs of the
|
||||
children. For <testsuite> and <testcase> elements, the ID is the
|
||||
value of their "name" attribute; for <failure> elements, it is the
|
||||
value of the "message" attribute; for CDATA section node, it is
|
||||
"detail". An exception is raised if any element other than the
|
||||
above four 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.
|
||||
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:
|
||||
@@ -121,14 +111,11 @@ class GTestXMLTestCase(unittest.TestCase):
|
||||
children[childID] = child
|
||||
elif child.nodeType == Node.TEXT_NODE:
|
||||
self.assert_(child.nodeValue.isspace())
|
||||
elif child.nodeType == Node.CDATA_SECTION_NODE:
|
||||
self.assert_("detail" not in children)
|
||||
children["detail"] = child
|
||||
else:
|
||||
self.fail("Encountered unexpected node type %d" % child.nodeType)
|
||||
return children
|
||||
|
||||
def NormalizeXml(self, element):
|
||||
def _NormalizeXml(self, element):
|
||||
"""
|
||||
Normalizes Google Test's XML output to eliminate references to transient
|
||||
information that may change from run to run.
|
||||
@@ -139,20 +126,13 @@ class GTestXMLTestCase(unittest.TestCase):
|
||||
* 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.
|
||||
* The stack traces are removed.
|
||||
"""
|
||||
|
||||
if element.tagName in ("testsuite", "testcase"):
|
||||
time = element.getAttributeNode("time")
|
||||
time.value = re.sub(r"^\d+(\.\d+)?$", "*", time.value)
|
||||
time.value = re.sub(r"^\d+$", "*", time.value)
|
||||
elif element.tagName == "failure":
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.CDATA_SECTION_NODE:
|
||||
# Removes the source line number.
|
||||
cdata = re.sub(r"^.*/(.*:)\d+\n", "\\1*\n", child.nodeValue)
|
||||
# Removes the actual stack trace.
|
||||
child.nodeValue = re.sub(r"\nStack trace:\n(.|\n)*",
|
||||
"", cdata)
|
||||
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)
|
||||
self._NormalizeXml(child)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user