Compare commits
198
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8d7d77c06 | ||
|
|
96683ee668 | ||
|
|
58e37f7e99 | ||
|
|
e7fd109b53 | ||
|
|
717d8ab5e0 | ||
|
|
6f6ab4212a | ||
|
|
efe6bb1db8 | ||
|
|
c875c4e224 | ||
|
|
40412d8512 | ||
|
|
01e18376ef | ||
|
|
1ed6a8c67a | ||
|
|
f014396910 | ||
|
|
d66ce58510 | ||
|
|
c541e7c110 | ||
|
|
cc366710bb | ||
|
|
c88e0b4673 | ||
|
|
4a1a299b20 | ||
|
|
3044657e7a | ||
|
|
be03d00f5f | ||
|
|
1f531be3a1 | ||
|
|
251e720391 | ||
|
|
687c589949 | ||
|
|
2acd538244 | ||
|
|
f269e15c5c | ||
|
|
091d7eb897 | ||
|
|
8e32de89cf | ||
|
|
372e81d814 | ||
|
|
b2a2d36f3a | ||
|
|
e3d405f62b | ||
|
|
1361c77c4d | ||
|
|
ec4fed9321 | ||
|
|
af39146b45 | ||
|
|
812f35b26b | ||
|
|
fb11778f43 | ||
|
|
efd8db1627 | ||
|
|
5924e5b355 | ||
|
|
29836977ef | ||
|
|
6c08816416 | ||
|
|
4fed5f2850 | ||
|
|
124bc587f0 | ||
|
|
9b12f749fa | ||
|
|
148b327ffa | ||
|
|
18fa6a4db3 | ||
|
|
4c7aee827e | ||
|
|
e9078161e6 | ||
|
|
65cfeca1a1 | ||
|
|
334704df26 | ||
|
|
23f642ab23 | ||
|
|
001f281926 | ||
|
|
5ca3ab8331 | ||
|
|
ad1b28b4a9 | ||
|
|
a5b94f6819 | ||
|
|
06f44bc951 | ||
|
|
04cf298916 | ||
|
|
a7833a19bd | ||
|
|
f625681bc4 | ||
|
|
ded275d75e | ||
|
|
029d3dddd4 | ||
|
|
e032d57642 | ||
|
|
4580469122 | ||
|
|
aa99ce5a0d | ||
|
|
cb455a71fb | ||
|
|
d6fb5e3bf7 | ||
|
|
60c3602aaa | ||
|
|
e42cc2294f | ||
|
|
bb2941fcc6 | ||
|
|
a8e067ae5f | ||
|
|
7345a66cbd | ||
|
|
88295d64a7 | ||
|
|
0eb33cfa5c | ||
|
|
a7fa9b3708 | ||
|
|
bc860af087 | ||
|
|
a3580180d1 | ||
|
|
76bce79a34 | ||
|
|
f345b2ca6a | ||
|
|
797b0ad2a3 | ||
|
|
0bdaac5a14 | ||
|
|
dea0484e4d | ||
|
|
97408cae55 | ||
|
|
ccdeec888e | ||
|
|
51eeae5a55 | ||
|
|
783d00fd19 | ||
|
|
baf182e006 | ||
|
|
a5308bb992 | ||
|
|
9c1efac2a1 | ||
|
|
d7fb5e1af4 | ||
|
|
d8a5fb7ee6 | ||
|
|
01bcf8c70d | ||
|
|
d25e625364 | ||
|
|
922e0b7d80 | ||
|
|
952560d3ec | ||
|
|
12a5852e45 | ||
|
|
8fa9461cc2 | ||
|
|
7f6f9c12ad | ||
|
|
057b4e904f | ||
|
|
7ee260c549 | ||
|
|
b5fd99bbd5 | ||
|
|
0cd05c6ea9 | ||
|
|
ca0d46e95d | ||
|
|
3656c2713e | ||
|
|
13b1900717 | ||
|
|
88af49efa7 | ||
|
|
e9fb5c7bac | ||
|
|
a0ced33ac6 | ||
|
|
6f01e3dc12 | ||
|
|
5d6ba6d3b0 | ||
|
|
5fce13091d | ||
|
|
974e18ee6f | ||
|
|
e9faae170f | ||
|
|
fa87209829 | ||
|
|
3288c4deae | ||
|
|
471087fbfc | ||
|
|
9fd3fb00ff | ||
|
|
28219b169c | ||
|
|
837f2229a9 | ||
|
|
e49c6b946a | ||
|
|
f53219cdcb | ||
|
|
abad8af018 | ||
|
|
391ce627de | ||
|
|
038e392ebd | ||
|
|
2d3b36d40a | ||
|
|
50e07d1c92 | ||
|
|
48a1b11058 | ||
|
|
82a570453c | ||
|
|
a798c2f102 | ||
|
|
678c1c73de | ||
|
|
cf4f4400db | ||
|
|
1a727c27aa | ||
|
|
92f0d72507 | ||
|
|
e1ee0fa3e1 | ||
|
|
d92a270d2d | ||
|
|
2ddba26691 | ||
|
|
0bdd45085a | ||
|
|
16feffa8fa | ||
|
|
dc10c3b5e5 | ||
|
|
7b1ced0682 | ||
|
|
a08c03c5f5 | ||
|
|
23142843f7 | ||
|
|
cead3d57c9 | ||
|
|
2d4f208765 | ||
|
|
555486f408 | ||
|
|
6f1c4b3d7b | ||
|
|
8aa75fa771 | ||
|
|
c7d0bc8309 | ||
|
|
6882aa0987 | ||
|
|
2ce822ac55 | ||
|
|
95d8c7ac43 | ||
|
|
3d787f5a0d | ||
|
|
d0ba3ccc76 | ||
|
|
39a26e12d6 | ||
|
|
d9a4bbcaf2 | ||
|
|
10493e3854 | ||
|
|
750d67d809 | ||
|
|
810fb81153 | ||
|
|
fe5b7ef71e | ||
|
|
7a7231c442 | ||
|
|
f063cd25c9 | ||
|
|
2057566e4e | ||
|
|
b80a07ffe6 | ||
|
|
097f64e986 | ||
|
|
b73f27fd16 | ||
|
|
0570e2d930 | ||
|
|
ee33b34bec | ||
|
|
3d568bdda5 | ||
|
|
3f9c7fcaa3 | ||
|
|
2f2e72bae9 | ||
|
|
deaf5615f1 | ||
|
|
4f7c63d991 | ||
|
|
6f21175f57 | ||
|
|
ebedaa18c7 | ||
|
|
394a8a568c | ||
|
|
fd36851c8d | ||
|
|
0a3b403fe0 | ||
|
|
d9251171f5 | ||
|
|
4fb7039fda | ||
|
|
f1c05d4544 | ||
|
|
e3dbee4b35 | ||
|
|
b72202078d | ||
|
|
403a968d3c | ||
|
|
0194f90d0e | ||
|
|
4b4c56aff6 | ||
|
|
b495f72f1f | ||
|
|
f47d75faf3 | ||
|
|
137dcd18cc | ||
|
|
643862d8ad | ||
|
|
d1ad27e0a4 | ||
|
|
6c65a1ca35 | ||
|
|
2491710524 | ||
|
|
408471e20c | ||
|
|
544c96ed5b | ||
|
|
ec25eea8f8 | ||
|
|
bdb3b0a493 | ||
|
|
bba28fa8b2 | ||
|
|
5cd81a7848 | ||
|
|
9d697cc81c | ||
|
|
64e0945546 | ||
|
|
ab669cad0e | ||
|
|
096014a45d |
@@ -10,21 +10,21 @@ body:
|
||||
description: We recommend using the latest commit from GitHub in your projects.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
- type: textarea
|
||||
id: why
|
||||
attributes:
|
||||
label: Why do we need this feature?
|
||||
description: Ideally, explain why a combination of existing features cannot be used instead.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
- type: textarea
|
||||
id: proposal
|
||||
attributes:
|
||||
label: Describe the proposal.
|
||||
description: Include a detailed description of the feature, with usage examples.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
- type: textarea
|
||||
id: platform
|
||||
attributes:
|
||||
label: Is the feature specific to an operating system, compiler, or build system version?
|
||||
|
||||
@@ -24,6 +24,10 @@ Win32-Release/
|
||||
x64-Debug/
|
||||
x64-Release/
|
||||
|
||||
# VSCode files
|
||||
.cache/
|
||||
cmake-variants.yaml
|
||||
|
||||
# Ignore autoconf / automake files
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
|
||||
@@ -132,6 +132,7 @@ cc_library(
|
||||
}),
|
||||
deps = select({
|
||||
":has_absl": [
|
||||
"@com_google_absl//absl/container:flat_hash_set",
|
||||
"@com_google_absl//absl/debugging:failure_signal_handler",
|
||||
"@com_google_absl//absl/debugging:stacktrace",
|
||||
"@com_google_absl//absl/debugging:symbolize",
|
||||
|
||||
+2
-14
@@ -1,22 +1,10 @@
|
||||
# Note: CMake support is community-based. The maintainers do not use CMake
|
||||
# internally.
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
if (POLICY CMP0048)
|
||||
cmake_policy(SET CMP0048 NEW)
|
||||
endif (POLICY CMP0048)
|
||||
|
||||
if (POLICY CMP0069)
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
endif (POLICY CMP0069)
|
||||
|
||||
if (POLICY CMP0077)
|
||||
cmake_policy(SET CMP0077 NEW)
|
||||
endif (POLICY CMP0077)
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
project(googletest-distribution)
|
||||
set(GOOGLETEST_VERSION 1.13.0)
|
||||
set(GOOGLETEST_VERSION 1.14.0)
|
||||
|
||||
if(NOT CYGWIN AND NOT MSYS AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL QNX)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
+19
-9
@@ -88,7 +88,7 @@ check your formatting.
|
||||
If you plan to contribute a patch, you need to build Google Test, Google Mock,
|
||||
and their own tests from a git checkout, which has further requirements:
|
||||
|
||||
* [Python](https://www.python.org/) v2.3 or newer (for running some of the
|
||||
* [Python](https://www.python.org/) v3.6 or newer (for running some of the
|
||||
tests and re-generating certain source files from templates)
|
||||
* [CMake](https://cmake.org/) v2.8.12 or newer
|
||||
|
||||
@@ -102,30 +102,40 @@ To make sure your changes work as intended and don't break existing
|
||||
functionality, you'll want to compile and run Google Test and GoogleMock's own
|
||||
tests. For that you can use CMake:
|
||||
|
||||
mkdir mybuild
|
||||
cd mybuild
|
||||
cmake -Dgtest_build_tests=ON -Dgmock_build_tests=ON ${GTEST_REPO_DIR}
|
||||
```
|
||||
mkdir mybuild
|
||||
cd mybuild
|
||||
cmake -Dgtest_build_tests=ON -Dgmock_build_tests=ON ${GTEST_REPO_DIR}
|
||||
```
|
||||
|
||||
To choose between building only Google Test or Google Mock, you may modify your
|
||||
cmake command to be one of each
|
||||
|
||||
cmake -Dgtest_build_tests=ON ${GTEST_DIR} # sets up Google Test tests
|
||||
cmake -Dgmock_build_tests=ON ${GMOCK_DIR} # sets up Google Mock tests
|
||||
```
|
||||
cmake -Dgtest_build_tests=ON ${GTEST_DIR} # sets up Google Test tests
|
||||
cmake -Dgmock_build_tests=ON ${GMOCK_DIR} # sets up Google Mock tests
|
||||
```
|
||||
|
||||
Make sure you have Python installed, as some of Google Test's tests are written
|
||||
in Python. If the cmake command complains about not being able to find Python
|
||||
(`Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)`), try telling it
|
||||
explicitly where your Python executable can be found:
|
||||
|
||||
cmake -DPYTHON_EXECUTABLE=path/to/python ...
|
||||
```
|
||||
cmake -DPYTHON_EXECUTABLE=path/to/python ...
|
||||
```
|
||||
|
||||
Next, you can build Google Test and / or Google Mock and all desired tests. On
|
||||
\*nix, this is usually done by
|
||||
|
||||
make
|
||||
```
|
||||
make
|
||||
```
|
||||
|
||||
To run the tests, do
|
||||
|
||||
make test
|
||||
```
|
||||
make test
|
||||
```
|
||||
|
||||
All tests should pass.
|
||||
|
||||
@@ -8,6 +8,8 @@ GoogleTest now follows the
|
||||
[Abseil Live at Head philosophy](https://abseil.io/about/philosophy#upgrade-support).
|
||||
We recommend
|
||||
[updating to the latest commit in the `main` branch as often as possible](https://github.com/abseil/abseil-cpp/blob/master/FAQ.md#what-is-live-at-head-and-how-do-i-do-it).
|
||||
We do publish occasional semantic versions, tagged with
|
||||
`v${major}.${minor}.${patch}` (e.g. `v1.13.0`).
|
||||
|
||||
#### Documentation Updates
|
||||
|
||||
@@ -15,13 +17,19 @@ Our documentation is now live on GitHub Pages at
|
||||
https://google.github.io/googletest/. We recommend browsing the documentation on
|
||||
GitHub Pages rather than directly in the repository.
|
||||
|
||||
#### Release 1.12.1
|
||||
#### Release 1.13.0
|
||||
|
||||
[Release 1.12.1](https://github.com/google/googletest/releases/tag/release-1.12.1)
|
||||
is now available.
|
||||
[Release 1.13.0](https://github.com/google/googletest/releases/tag/v1.13.0) is
|
||||
now available.
|
||||
|
||||
The 1.12.x branch will be the last to support C++11. Future releases will
|
||||
require at least C++14.
|
||||
The 1.13.x branch requires at least C++14.
|
||||
|
||||
#### Continuous Integration
|
||||
|
||||
We use Google's internal systems for continuous integration. \
|
||||
GitHub Actions were added for the convenience of open-source contributors. They
|
||||
are exclusively maintained by the open-source community and not used by the
|
||||
GoogleTest team.
|
||||
|
||||
#### Coming Soon
|
||||
|
||||
@@ -46,16 +54,37 @@ More information about building GoogleTest can be found at
|
||||
|
||||
## Features
|
||||
|
||||
* An [xUnit](https://en.wikipedia.org/wiki/XUnit) test framework.
|
||||
* Test discovery.
|
||||
* A rich set of assertions.
|
||||
* User-defined assertions.
|
||||
* Death tests.
|
||||
* Fatal and non-fatal failures.
|
||||
* Value-parameterized tests.
|
||||
* Type-parameterized tests.
|
||||
* Various options for running the tests.
|
||||
* XML test report generation.
|
||||
* xUnit test framework: \
|
||||
Googletest is based on the [xUnit](https://en.wikipedia.org/wiki/XUnit)
|
||||
testing framework, a popular architecture for unit testing
|
||||
* Test discovery: \
|
||||
Googletest automatically discovers and runs your tests, eliminating the need
|
||||
to manually register your tests
|
||||
* Rich set of assertions: \
|
||||
Googletest provides a variety of assertions, such as equality, inequality,
|
||||
exceptions, and more, making it easy to test your code
|
||||
* User-defined assertions: \
|
||||
You can define your own assertions with Googletest, making it simple to
|
||||
write tests that are specific to your code
|
||||
* Death tests: \
|
||||
Googletest supports death tests, which verify that your code exits in a
|
||||
certain way, making it useful for testing error-handling code
|
||||
* Fatal and non-fatal failures: \
|
||||
You can specify whether a test failure should be treated as fatal or
|
||||
non-fatal with Googletest, allowing tests to continue running even if a
|
||||
failure occurs
|
||||
* Value-parameterized tests: \
|
||||
Googletest supports value-parameterized tests, which run multiple times with
|
||||
different input values, making it useful for testing functions that take
|
||||
different inputs
|
||||
* Type-parameterized tests: \
|
||||
Googletest also supports type-parameterized tests, which run with different
|
||||
data types, making it useful for testing functions that work with different
|
||||
data types
|
||||
* Various options for running tests: \
|
||||
Googletest provides many options for running tests including running
|
||||
individual tests, running tests in a specific order and running tests in
|
||||
parallel
|
||||
|
||||
## Supported Platforms
|
||||
|
||||
@@ -63,7 +92,7 @@ GoogleTest follows Google's
|
||||
[Foundational C++ Support Policy](https://opensource.google/documentation/policies/cplusplus-support).
|
||||
See
|
||||
[this table](https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md)
|
||||
for a list of currently supported versions compilers, platforms, and build
|
||||
for a list of currently supported versions of compilers, platforms, and build
|
||||
tools.
|
||||
|
||||
## Who Is Using GoogleTest?
|
||||
|
||||
@@ -1,40 +1,27 @@
|
||||
workspace(name = "com_google_googletest")
|
||||
|
||||
load("//:googletest_deps.bzl", "googletest_deps")
|
||||
googletest_deps()
|
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||
|
||||
http_archive(
|
||||
name = "com_google_absl", # 2023-01-10T21:08:25Z
|
||||
sha256 = "f9a4e749f42c386a32a90fddf0e2913ed408d10c42f7f33ccf4c59ac4f0d1d05",
|
||||
strip_prefix = "abseil-cpp-52835439ca90d86b27bf8cd1708296e95604d724",
|
||||
urls = ["https://github.com/abseil/abseil-cpp/archive/52835439ca90d86b27bf8cd1708296e95604d724.zip"],
|
||||
)
|
||||
|
||||
# Note this must use a commit from the `abseil` branch of the RE2 project.
|
||||
# https://github.com/google/re2/tree/abseil
|
||||
http_archive(
|
||||
name = "com_googlesource_code_re2", # 2022-12-21T14:29:10Z
|
||||
sha256 = "b9ce3a51beebb38534d11d40f8928d40509b9e18a735f6a4a97ad3d014c87cb5",
|
||||
strip_prefix = "re2-d0b1f8f2ecc2ea74956c7608b6f915175314ff0e",
|
||||
urls = ["https://github.com/google/re2/archive/d0b1f8f2ecc2ea74956c7608b6f915175314ff0e.zip"],
|
||||
name = "rules_python", # 2023-07-31T20:39:27Z
|
||||
sha256 = "1250b59a33c591a1c4ba68c62e95fc88a84c334ec35a2e23f46cbc1b9a5a8b55",
|
||||
strip_prefix = "rules_python-e355becc30275939d87116a4ec83dad4bb50d9e1",
|
||||
urls = ["https://github.com/bazelbuild/rules_python/archive/e355becc30275939d87116a4ec83dad4bb50d9e1.zip"],
|
||||
)
|
||||
|
||||
http_archive(
|
||||
name = "rules_python", # 2023-01-10T22:00:51Z
|
||||
sha256 = "5de54486a60ad8948dabe49605bb1c08053e04001a431ab3e96745b4d97a4419",
|
||||
strip_prefix = "rules_python-70cce26432187a60b4e950118791385e6fb3c26f",
|
||||
urls = ["https://github.com/bazelbuild/rules_python/archive/70cce26432187a60b4e950118791385e6fb3c26f.zip"],
|
||||
name = "bazel_skylib", # 2023-05-31T19:24:07Z
|
||||
sha256 = "08c0386f45821ce246bbbf77503c973246ed6ee5c3463e41efc197fa9bc3a7f4",
|
||||
strip_prefix = "bazel-skylib-288731ef9f7f688932bd50e704a91a45ec185f9b",
|
||||
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/288731ef9f7f688932bd50e704a91a45ec185f9b.zip"],
|
||||
)
|
||||
|
||||
http_archive(
|
||||
name = "bazel_skylib", # 2022-11-16T18:29:32Z
|
||||
sha256 = "a22290c26d29d3ecca286466f7f295ac6cbe32c0a9da3a91176a90e0725e3649",
|
||||
strip_prefix = "bazel-skylib-5bfcb1a684550626ce138fe0fe8f5f702b3764c3",
|
||||
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/5bfcb1a684550626ce138fe0fe8f5f702b3764c3.zip"],
|
||||
)
|
||||
|
||||
http_archive(
|
||||
name = "platforms", # 2022-11-09T19:18:22Z
|
||||
sha256 = "b4a3b45dc4202e2b3e34e3bc49d2b5b37295fc23ea58d88fb9e01f3642ad9b55",
|
||||
strip_prefix = "platforms-3fbc687756043fb58a407c2ea8c944bc2fe1d922",
|
||||
urls = ["https://github.com/bazelbuild/platforms/archive/3fbc687756043fb58a407c2ea8c944bc2fe1d922.zip"],
|
||||
name = "platforms", # 2023-07-28T19:44:27Z
|
||||
sha256 = "40eb313613ff00a5c03eed20aba58890046f4d38dec7344f00bb9a8867853526",
|
||||
strip_prefix = "platforms-4ad40ef271da8176d4fc0194d2089b8a76e19d7b",
|
||||
urls = ["https://github.com/bazelbuild/platforms/archive/4ad40ef271da8176d4fc0194d2089b8a76e19d7b.zip"],
|
||||
)
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
|
||||
set -euox pipefail
|
||||
|
||||
readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20220217"
|
||||
readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20220621"
|
||||
readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20230217"
|
||||
readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20230120"
|
||||
|
||||
if [[ -z ${GTEST_ROOT:-} ]]; then
|
||||
GTEST_ROOT="$(realpath $(dirname ${0})/..)"
|
||||
@@ -51,7 +51,7 @@ for cc in /usr/local/bin/gcc /opt/llvm/clang/bin/clang; do
|
||||
--workdir="/build" \
|
||||
--rm \
|
||||
--env="CC=${cc}" \
|
||||
--env="CXX_FLAGS=\"-Werror -Wdeprecated\"" \
|
||||
--env=CXXFLAGS="-Werror -Wdeprecated" \
|
||||
${LINUX_LATEST_CONTAINER} \
|
||||
/bin/bash -c "
|
||||
cmake /src \
|
||||
@@ -78,6 +78,7 @@ time docker run \
|
||||
--copt="-Wall" \
|
||||
--copt="-Werror" \
|
||||
--copt="-Wuninitialized" \
|
||||
--copt="-Wundef" \
|
||||
--copt="-Wno-error=pragmas" \
|
||||
--distdir="/bazel-distdir" \
|
||||
--features=external_include_paths \
|
||||
@@ -99,6 +100,7 @@ for std in ${STD}; do
|
||||
--copt="-Wall" \
|
||||
--copt="-Werror" \
|
||||
--copt="-Wuninitialized" \
|
||||
--copt="-Wundef" \
|
||||
--define="absl=${absl}" \
|
||||
--distdir="/bazel-distdir" \
|
||||
--features=external_include_paths \
|
||||
@@ -123,6 +125,7 @@ for std in ${STD}; do
|
||||
--copt="-Wall" \
|
||||
--copt="-Werror" \
|
||||
--copt="-Wuninitialized" \
|
||||
--copt="-Wundef" \
|
||||
--define="absl=${absl}" \
|
||||
--distdir="/bazel-distdir" \
|
||||
--features=external_include_paths \
|
||||
|
||||
@@ -66,6 +66,7 @@ for absl in 0 1; do
|
||||
${BAZEL_BIN} test ... \
|
||||
--copt="-Wall" \
|
||||
--copt="-Werror" \
|
||||
--copt="-Wundef" \
|
||||
--cxxopt="-std=c++14" \
|
||||
--define="absl=${absl}" \
|
||||
--features=external_include_paths \
|
||||
|
||||
+13
-11
@@ -2,12 +2,14 @@ SETLOCAL ENABLEDELAYEDEXPANSION
|
||||
|
||||
SET BAZEL_EXE=%KOKORO_GFILE_DIR%\bazel-5.1.1-windows-x86_64.exe
|
||||
|
||||
SET PATH=C:\Python37;%PATH%
|
||||
SET BAZEL_PYTHON=C:\python37\python.exe
|
||||
SET PATH=C:\Python34;%PATH%
|
||||
SET BAZEL_PYTHON=C:\python34\python.exe
|
||||
SET BAZEL_SH=C:\tools\msys64\usr\bin\bash.exe
|
||||
SET CMAKE_BIN="C:\Program Files\CMake\bin\cmake.exe"
|
||||
SET CTEST_BIN="C:\Program Files\CMake\bin\ctest.exe"
|
||||
SET CMAKE_BIN="cmake.exe"
|
||||
SET CTEST_BIN="ctest.exe"
|
||||
SET CTEST_OUTPUT_ON_FAILURE=1
|
||||
SET CMAKE_BUILD_PARALLEL_LEVEL=16
|
||||
SET CTEST_PARALLEL_LEVEL=16
|
||||
|
||||
IF EXIST git\googletest (
|
||||
CD git\googletest
|
||||
@@ -18,12 +20,12 @@ IF EXIST git\googletest (
|
||||
IF %errorlevel% neq 0 EXIT /B 1
|
||||
|
||||
:: ----------------------------------------------------------------------------
|
||||
:: CMake Visual Studio 15 2017 Win64
|
||||
MKDIR cmake_msvc2017
|
||||
CD cmake_msvc2017
|
||||
:: CMake
|
||||
MKDIR cmake_msvc2022
|
||||
CD cmake_msvc2022
|
||||
|
||||
%CMAKE_BIN% .. ^
|
||||
-G "Visual Studio 15 2017 Win64" ^
|
||||
-G "Visual Studio 17 2022" ^
|
||||
-DPYTHON_EXECUTABLE:FILEPATH=c:\python37\python.exe ^
|
||||
-DPYTHON_INCLUDE_DIR:PATH=c:\python37\include ^
|
||||
-DPYTHON_LIBRARY:FILEPATH=c:\python37\lib\site-packages\pip ^
|
||||
@@ -39,12 +41,12 @@ IF %errorlevel% neq 0 EXIT /B 1
|
||||
IF %errorlevel% neq 0 EXIT /B 1
|
||||
|
||||
CD ..
|
||||
RMDIR /S /Q cmake_msvc2017
|
||||
RMDIR /S /Q cmake_msvc2022
|
||||
|
||||
:: ----------------------------------------------------------------------------
|
||||
:: Bazel Visual Studio 15 2017 Win64
|
||||
:: Bazel
|
||||
|
||||
SET BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
|
||||
SET BAZEL_VS=C:\Program Files\Microsoft Visual Studio\2022\Community
|
||||
%BAZEL_EXE% test ... ^
|
||||
--compilation_mode=dbg ^
|
||||
--copt=/std:c++14 ^
|
||||
|
||||
+127
-98
@@ -1,9 +1,9 @@
|
||||
# Advanced googletest Topics
|
||||
# Advanced GoogleTest Topics
|
||||
|
||||
## Introduction
|
||||
|
||||
Now that you have read the [googletest Primer](primer.md) and learned how to
|
||||
write tests using googletest, it's time to learn some new tricks. This document
|
||||
Now that you have read the [GoogleTest Primer](primer.md) and learned how to
|
||||
write tests using GoogleTest, it's time to learn some new tricks. This document
|
||||
will show you more assertions as well as how to construct complex failure
|
||||
messages, propagate fatal failures, reuse and speed up your test fixtures, and
|
||||
use various flags with your tests.
|
||||
@@ -25,7 +25,7 @@ Reference.
|
||||
|
||||
### Predicate Assertions for Better Error Messages
|
||||
|
||||
Even though googletest has a rich set of assertions, they can never be complete,
|
||||
Even though GoogleTest has a rich set of assertions, they can never be complete,
|
||||
as it's impossible (nor a good idea) to anticipate all scenarios a user might
|
||||
run into. Therefore, sometimes a user has to use `EXPECT_TRUE()` to check a
|
||||
complex expression, for lack of a better macro. This has the problem of not
|
||||
@@ -35,7 +35,7 @@ failure message by themselves, streaming it into `EXPECT_TRUE()`. However, this
|
||||
is awkward especially when the expression has side-effects or is expensive to
|
||||
evaluate.
|
||||
|
||||
googletest gives you three different options to solve this problem:
|
||||
GoogleTest gives you three different options to solve this problem:
|
||||
|
||||
#### Using an Existing Boolean Function
|
||||
|
||||
@@ -304,9 +304,9 @@ TEST_F(SkipFixture, SkipsOneTest) {
|
||||
|
||||
As with assertion macros, you can stream a custom message into `GTEST_SKIP()`.
|
||||
|
||||
## Teaching googletest How to Print Your Values
|
||||
## Teaching GoogleTest How to Print Your Values
|
||||
|
||||
When a test assertion such as `EXPECT_EQ` fails, googletest prints the argument
|
||||
When a test assertion such as `EXPECT_EQ` fails, GoogleTest prints the argument
|
||||
values to help you debug. It does this using a user-extensible value printer.
|
||||
|
||||
This printer knows how to print built-in C++ types, native arrays, STL
|
||||
@@ -315,73 +315,96 @@ prints the raw bytes in the value and hopes that you the user can figure it out.
|
||||
|
||||
As mentioned earlier, the printer is *extensible*. That means you can teach it
|
||||
to do a better job at printing your particular type than to dump the bytes. To
|
||||
do that, define `<<` for your type:
|
||||
|
||||
```c++
|
||||
#include <ostream>
|
||||
do that, define an `AbslStringify()` overload as a `friend` function template
|
||||
for your type:
|
||||
|
||||
```cpp
|
||||
namespace foo {
|
||||
|
||||
class Bar { // We want googletest to be able to print instances of this.
|
||||
...
|
||||
// Create a free inline friend function.
|
||||
friend std::ostream& operator<<(std::ostream& os, const Bar& bar) {
|
||||
return os << bar.DebugString(); // whatever needed to print bar to os
|
||||
class Point { // We want GoogleTest to be able to print instances of this.
|
||||
...
|
||||
// Provide a friend overload.
|
||||
template <typename Sink>
|
||||
friend void AbslStringify(Sink& sink, const Point& point) {
|
||||
absl::Format(&sink, "(%d, %d)", point.x, point.y);
|
||||
}
|
||||
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
// If you can't declare the function in the class it's important that the
|
||||
// << operator is defined in the SAME namespace that defines Bar. C++'s look-up
|
||||
// rules rely on that.
|
||||
std::ostream& operator<<(std::ostream& os, const Bar& bar) {
|
||||
return os << bar.DebugString(); // whatever needed to print bar to os
|
||||
// AbslStringify overload is defined in the SAME namespace that defines Point.
|
||||
// C++'s look-up rules rely on that.
|
||||
enum class EnumWithStringify { kMany = 0, kChoices = 1 };
|
||||
|
||||
template <typename Sink>
|
||||
void AbslStringify(Sink& sink, EnumWithStringify e) {
|
||||
absl::Format(&sink, "%s", e == EnumWithStringify::kMany ? "Many" : "Choices");
|
||||
}
|
||||
|
||||
} // namespace foo
|
||||
```
|
||||
|
||||
Sometimes, this might not be an option: your team may consider it bad style to
|
||||
have a `<<` operator for `Bar`, or `Bar` may already have a `<<` operator that
|
||||
doesn't do what you want (and you cannot change it). If so, you can instead
|
||||
define a `PrintTo()` function like this:
|
||||
{: .callout .note}
|
||||
Note: `AbslStringify()` utilizes a generic "sink" buffer to construct its
|
||||
string. For more information about supported operations on `AbslStringify()`'s
|
||||
sink, see go/abslstringify.
|
||||
|
||||
`AbslStringify()` can also use `absl::StrFormat`'s catch-all `%v` type specifier
|
||||
within its own format strings to perform type deduction. `Point` above could be
|
||||
formatted as `"(%v, %v)"` for example, and deduce the `int` values as `%d`.
|
||||
|
||||
Sometimes, `AbslStringify()` might not be an option: your team may wish to print
|
||||
types with extra debugging information for testing purposes only. If so, you can
|
||||
instead define a `PrintTo()` function like this:
|
||||
|
||||
```c++
|
||||
#include <ostream>
|
||||
|
||||
namespace foo {
|
||||
|
||||
class Bar {
|
||||
class Point {
|
||||
...
|
||||
friend void PrintTo(const Bar& bar, std::ostream* os) {
|
||||
*os << bar.DebugString(); // whatever needed to print bar to os
|
||||
friend void PrintTo(const Point& point, std::ostream* os) {
|
||||
*os << "(" << point.x << "," << point.y << ")";
|
||||
}
|
||||
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
// If you can't declare the function in the class it's important that PrintTo()
|
||||
// is defined in the SAME namespace that defines Bar. C++'s look-up rules rely
|
||||
// on that.
|
||||
void PrintTo(const Bar& bar, std::ostream* os) {
|
||||
*os << bar.DebugString(); // whatever needed to print bar to os
|
||||
// is defined in the SAME namespace that defines Point. C++'s look-up rules
|
||||
// rely on that.
|
||||
void PrintTo(const Point& point, std::ostream* os) {
|
||||
*os << "(" << point.x << "," << point.y << ")";
|
||||
}
|
||||
|
||||
} // namespace foo
|
||||
```
|
||||
|
||||
If you have defined both `<<` and `PrintTo()`, the latter will be used when
|
||||
googletest is concerned. This allows you to customize how the value appears in
|
||||
googletest's output without affecting code that relies on the behavior of its
|
||||
`<<` operator.
|
||||
If you have defined both `AbslStringify()` and `PrintTo()`, the latter will be
|
||||
used by GoogleTest. This allows you to customize how the value appears in
|
||||
GoogleTest's output without affecting code that relies on the behavior of
|
||||
`AbslStringify()`.
|
||||
|
||||
If you want to print a value `x` using googletest's value printer yourself, just
|
||||
If you have an existing `<<` operator and would like to define an
|
||||
`AbslStringify()`, the latter will be used for GoogleTest printing.
|
||||
|
||||
If you want to print a value `x` using GoogleTest's value printer yourself, just
|
||||
call `::testing::PrintToString(x)`, which returns an `std::string`:
|
||||
|
||||
```c++
|
||||
vector<pair<Bar, int> > bar_ints = GetBarIntVector();
|
||||
vector<pair<Point, int> > point_ints = GetPointIntVector();
|
||||
|
||||
EXPECT_TRUE(IsCorrectBarIntVector(bar_ints))
|
||||
<< "bar_ints = " << testing::PrintToString(bar_ints);
|
||||
EXPECT_TRUE(IsCorrectPointIntVector(point_ints))
|
||||
<< "point_ints = " << testing::PrintToString(point_ints);
|
||||
```
|
||||
|
||||
For more details regarding `AbslStringify()` and its integration with other
|
||||
libraries, see go/abslstringify.
|
||||
|
||||
## Death Tests
|
||||
|
||||
In many applications, there are assertions that can cause application failure if
|
||||
@@ -451,7 +474,7 @@ Note that a death test only cares about three things:
|
||||
3. does the stderr output match `matcher`?
|
||||
|
||||
In particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it
|
||||
will **not** cause the death test to fail, as googletest assertions don't abort
|
||||
will **not** cause the death test to fail, as GoogleTest assertions don't abort
|
||||
the process.
|
||||
|
||||
### Death Test Naming
|
||||
@@ -482,14 +505,14 @@ TEST_F(FooDeathTest, DoesThat) {
|
||||
|
||||
### Regular Expression Syntax
|
||||
|
||||
When built with Bazel and using Abseil, googletest uses the
|
||||
When built with Bazel and using Abseil, GoogleTest uses the
|
||||
[RE2](https://github.com/google/re2/wiki/Syntax) syntax. Otherwise, for POSIX
|
||||
systems (Linux, Cygwin, Mac), googletest uses the
|
||||
systems (Linux, Cygwin, Mac), GoogleTest uses the
|
||||
[POSIX extended regular expression](http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04)
|
||||
syntax. To learn about POSIX syntax, you may want to read this
|
||||
[Wikipedia entry](http://en.wikipedia.org/wiki/Regular_expression#POSIX_extended).
|
||||
|
||||
On Windows, googletest uses its own simple regular expression implementation. It
|
||||
On Windows, GoogleTest uses its own simple regular expression implementation. It
|
||||
lacks many features. For example, we don't support union (`"x|y"`), grouping
|
||||
(`"(xy)"`), brackets (`"[xy]"`), and repetition count (`"x{5,7}"`), among
|
||||
others. Below is what we do support (`A` denotes a literal character, period
|
||||
@@ -519,7 +542,7 @@ Expression | Meaning
|
||||
`$` | matches the end of a string (not that of each line)
|
||||
`xy` | matches `x` followed by `y`
|
||||
|
||||
To help you determine which capability is available on your system, googletest
|
||||
To help you determine which capability is available on your system, GoogleTest
|
||||
defines macros to govern which regular expression it is using. The macros are:
|
||||
`GTEST_USES_SIMPLE_RE=1` or `GTEST_USES_POSIX_RE=1`. If you want your death
|
||||
tests to work in all cases, you can either `#if` on these macros or use the more
|
||||
@@ -539,7 +562,7 @@ arrange that kind of environment. For example, statically-initialized modules
|
||||
may start threads before main is ever reached. Once threads have been created,
|
||||
it may be difficult or impossible to clean them up.
|
||||
|
||||
googletest has three features intended to raise awareness of threading issues.
|
||||
GoogleTest has three features intended to raise awareness of threading issues.
|
||||
|
||||
1. A warning is emitted if multiple threads are running when a death test is
|
||||
encountered.
|
||||
@@ -562,7 +585,7 @@ The automated testing framework does not set the style flag. You can choose a
|
||||
particular style of death tests by setting the flag programmatically:
|
||||
|
||||
```c++
|
||||
GTEST_FLAG_SET(death_test_style, "threadsafe")
|
||||
GTEST_FLAG_SET(death_test_style, "threadsafe");
|
||||
```
|
||||
|
||||
You can do this in `main()` to set the style for all death tests in the binary,
|
||||
@@ -592,7 +615,7 @@ TEST(MyDeathTest, TestTwo) {
|
||||
|
||||
The `statement` argument of `ASSERT_EXIT()` can be any valid C++ statement. If
|
||||
it leaves the current function via a `return` statement or by throwing an
|
||||
exception, the death test is considered to have failed. Some googletest macros
|
||||
exception, the death test is considered to have failed. Some GoogleTest macros
|
||||
may return from the current function (e.g. `ASSERT_TRUE()`), so be sure to avoid
|
||||
them in `statement`.
|
||||
|
||||
@@ -726,7 +749,7 @@ TEST(FooTest, Bar) {
|
||||
}
|
||||
```
|
||||
|
||||
To alleviate this, googletest provides three different solutions. You could use
|
||||
To alleviate this, GoogleTest provides three different solutions. You could use
|
||||
either exceptions, the `(ASSERT|EXPECT)_NO_FATAL_FAILURE` assertions or the
|
||||
`HasFatalFailure()` function. They are described in the following two
|
||||
subsections.
|
||||
@@ -760,7 +783,7 @@ in it, the test will continue after the subroutine returns. This may not be what
|
||||
you want.
|
||||
|
||||
Often people want fatal failures to propagate like exceptions. For that
|
||||
googletest offers the following macros:
|
||||
GoogleTest offers the following macros:
|
||||
|
||||
Fatal assertion | Nonfatal assertion | Verifies
|
||||
------------------------------------- | ------------------------------------- | --------
|
||||
@@ -852,7 +875,7 @@ will output XML like this:
|
||||
> needs to be prefixed with `::testing::Test::` if used outside of the
|
||||
> `TEST` body and the test fixture class.
|
||||
> * *`key`* must be a valid XML attribute name, and cannot conflict with the
|
||||
> ones already used by googletest (`name`, `status`, `time`, `classname`,
|
||||
> ones already used by GoogleTest (`name`, `status`, `time`, `classname`,
|
||||
> `type_param`, and `value_param`).
|
||||
> * Calling `RecordProperty()` outside of the lifespan of a test is allowed.
|
||||
> If it's called outside of a test but between a test suite's
|
||||
@@ -863,13 +886,13 @@ will output XML like this:
|
||||
|
||||
## Sharing Resources Between Tests in the Same Test Suite
|
||||
|
||||
googletest creates a new test fixture object for each test in order to make
|
||||
GoogleTest creates a new test fixture object for each test in order to make
|
||||
tests independent and easier to debug. However, sometimes tests use resources
|
||||
that are expensive to set up, making the one-copy-per-test model prohibitively
|
||||
expensive.
|
||||
|
||||
If the tests don't change the resource, there's no harm in their sharing a
|
||||
single resource copy. So, in addition to per-test set-up/tear-down, googletest
|
||||
single resource copy. So, in addition to per-test set-up/tear-down, GoogleTest
|
||||
also supports per-test-suite set-up/tear-down. To use it:
|
||||
|
||||
1. In your test fixture class (say `FooTest` ), declare as `static` some member
|
||||
@@ -881,7 +904,7 @@ also supports per-test-suite set-up/tear-down. To use it:
|
||||
`u`!) to set up the shared resources and a `static void TearDownTestSuite()`
|
||||
function to tear them down.
|
||||
|
||||
That's it! googletest automatically calls `SetUpTestSuite()` before running the
|
||||
That's it! GoogleTest automatically calls `SetUpTestSuite()` before running the
|
||||
*first test* in the `FooTest` test suite (i.e. before creating the first
|
||||
`FooTest` object), and calls `TearDownTestSuite()` after running the *last test*
|
||||
in it (i.e. after deleting the last `FooTest` object). In between, the tests can
|
||||
@@ -896,7 +919,8 @@ Note that `SetUpTestSuite()` may be called multiple times for a test fixture
|
||||
class that has derived classes, so you should not expect code in the function
|
||||
body to be run only once. Also, derived classes still have access to shared
|
||||
resources defined as static members, so careful consideration is needed when
|
||||
managing shared resources to avoid memory leaks.
|
||||
managing shared resources to avoid memory leaks if shared resources are not
|
||||
properly cleaned up in `TearDownTestSuite()`.
|
||||
|
||||
Here's an example of per-test-suite set-up and tear-down:
|
||||
|
||||
@@ -907,10 +931,15 @@ class FooTest : public testing::Test {
|
||||
// Called before the first test in this test suite.
|
||||
// Can be omitted if not needed.
|
||||
static void SetUpTestSuite() {
|
||||
// Avoid reallocating static objects if called in subclasses of FooTest.
|
||||
if (shared_resource_ == nullptr) {
|
||||
shared_resource_ = new ...;
|
||||
}
|
||||
shared_resource_ = new ...;
|
||||
|
||||
// If `shared_resource_` is **not deleted** in `TearDownTestSuite()`,
|
||||
// reallocation should be prevented because `SetUpTestSuite()` may be called
|
||||
// in subclasses of FooTest and lead to memory leak.
|
||||
//
|
||||
// if (shared_resource_ == nullptr) {
|
||||
// shared_resource_ = new ...;
|
||||
// }
|
||||
}
|
||||
|
||||
// Per-test-suite tear-down.
|
||||
@@ -968,7 +997,7 @@ class Environment : public ::testing::Environment {
|
||||
};
|
||||
```
|
||||
|
||||
Then, you register an instance of your environment class with googletest by
|
||||
Then, you register an instance of your environment class with GoogleTest by
|
||||
calling the `::testing::AddGlobalTestEnvironment()` function:
|
||||
|
||||
```c++
|
||||
@@ -985,7 +1014,7 @@ It's OK to register multiple environment objects. In this suite, their `SetUp()`
|
||||
will be called in the order they are registered, and their `TearDown()` will be
|
||||
called in the reverse order.
|
||||
|
||||
Note that googletest takes ownership of the registered environment objects.
|
||||
Note that GoogleTest takes ownership of the registered environment objects.
|
||||
Therefore **do not delete them** by yourself.
|
||||
|
||||
You should call `AddGlobalTestEnvironment()` before `RUN_ALL_TESTS()` is called,
|
||||
@@ -1037,7 +1066,7 @@ they must be declared **public** rather than **protected** in order to use
|
||||
|
||||
```c++
|
||||
class FooTest :
|
||||
public testing::TestWithParam<const char*> {
|
||||
public testing::TestWithParam<absl::string_view> {
|
||||
// You can implement all the usual fixture class members here.
|
||||
// To access the test parameter, call GetParam() from class
|
||||
// TestWithParam<T>.
|
||||
@@ -1048,7 +1077,7 @@ class BaseTest : public testing::Test {
|
||||
...
|
||||
};
|
||||
class BarTest : public BaseTest,
|
||||
public testing::WithParamInterface<const char*> {
|
||||
public testing::WithParamInterface<absl::string_view> {
|
||||
...
|
||||
};
|
||||
```
|
||||
@@ -1119,8 +1148,8 @@ with parameter values `"cat"` and `"dog"` using the
|
||||
[`ValuesIn`](reference/testing.md#param-generators) parameter generator:
|
||||
|
||||
```c++
|
||||
const char* pets[] = {"cat", "dog"};
|
||||
INSTANTIATE_TEST_SUITE_P(Pets, FooTest, testing::ValuesIn(pets));
|
||||
constexpr absl::string_view kPets[] = {"cat", "dog"};
|
||||
INSTANTIATE_TEST_SUITE_P(Pets, FooTest, testing::ValuesIn(kPets));
|
||||
```
|
||||
|
||||
The tests from the instantiation above will have these names:
|
||||
@@ -1495,12 +1524,12 @@ To test them, we use the following special techniques:
|
||||
|
||||
## "Catching" Failures
|
||||
|
||||
If you are building a testing utility on top of googletest, you'll want to test
|
||||
your utility. What framework would you use to test it? googletest, of course.
|
||||
If you are building a testing utility on top of GoogleTest, you'll want to test
|
||||
your utility. What framework would you use to test it? GoogleTest, of course.
|
||||
|
||||
The challenge is to verify that your testing utility reports failures correctly.
|
||||
In frameworks that report a failure by throwing an exception, you could catch
|
||||
the exception and assert on it. But googletest doesn't use exceptions, so how do
|
||||
the exception and assert on it. But GoogleTest doesn't use exceptions, so how do
|
||||
we test that a piece of code generates an expected failure?
|
||||
|
||||
`"gtest/gtest-spi.h"` contains some constructs to do this.
|
||||
@@ -1643,9 +1672,9 @@ particular, you cannot find the test suite name in `SetUpTestSuite()`,
|
||||
`TearDownTestSuite()` (where you know the test suite name implicitly), or
|
||||
functions called from them.
|
||||
|
||||
## Extending googletest by Handling Test Events
|
||||
## Extending GoogleTest by Handling Test Events
|
||||
|
||||
googletest provides an **event listener API** to let you receive notifications
|
||||
GoogleTest provides an **event listener API** to let you receive notifications
|
||||
about the progress of a test program and test failures. The events you can
|
||||
listen to include the start and end of the test program, a test suite, or a test
|
||||
method, among others. You may use this API to augment or replace the standard
|
||||
@@ -1706,7 +1735,7 @@ Here's an example:
|
||||
### Using Event Listeners
|
||||
|
||||
To use the event listener you have defined, add an instance of it to the
|
||||
googletest event listener list (represented by class
|
||||
GoogleTest event listener list (represented by class
|
||||
[`TestEventListeners`](reference/testing.md#TestEventListeners) - note the "s"
|
||||
at the end of the name) in your `main()` function, before calling
|
||||
`RUN_ALL_TESTS()`:
|
||||
@@ -1717,7 +1746,7 @@ int main(int argc, char** argv) {
|
||||
// Gets hold of the event listener list.
|
||||
testing::TestEventListeners& listeners =
|
||||
testing::UnitTest::GetInstance()->listeners();
|
||||
// Adds a listener to the end. googletest takes the ownership.
|
||||
// Adds a listener to the end. GoogleTest takes the ownership.
|
||||
listeners.Append(new MinimalistPrinter);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
@@ -1769,7 +1798,7 @@ See [sample10_unittest.cc] for an example of a failure-raising listener.
|
||||
|
||||
## Running Test Programs: Advanced Options
|
||||
|
||||
googletest test programs are ordinary executables. Once built, you can run them
|
||||
GoogleTest test programs are ordinary executables. Once built, you can run them
|
||||
directly and affect their behavior via the following environment variables
|
||||
and/or command line flags. For the flags to work, your programs must call
|
||||
`::testing::InitGoogleTest()` before calling `RUN_ALL_TESTS()`.
|
||||
@@ -1802,10 +1831,10 @@ corresponding environment variable for this flag.
|
||||
|
||||
#### Running a Subset of the Tests
|
||||
|
||||
By default, a googletest program runs all tests the user has defined. Sometimes,
|
||||
By default, a GoogleTest program runs all tests the user has defined. Sometimes,
|
||||
you want to run only a subset of the tests (e.g. for debugging or quickly
|
||||
verifying a change). If you set the `GTEST_FILTER` environment variable or the
|
||||
`--gtest_filter` flag to a filter string, googletest will only run the tests
|
||||
`--gtest_filter` flag to a filter string, GoogleTest will only run the tests
|
||||
whose full names (in the form of `TestSuiteName.TestName`) match the filter.
|
||||
|
||||
The format of a filter is a '`:`'-separated list of wildcard patterns (called
|
||||
@@ -1836,7 +1865,7 @@ For example:
|
||||
|
||||
#### Stop test execution upon first failure
|
||||
|
||||
By default, a googletest program runs all tests the user has defined. In some
|
||||
By default, a GoogleTest program runs all tests the user has defined. In some
|
||||
cases (e.g. iterative test development & execution) it may be desirable stop
|
||||
test execution upon first failure (trading improved latency for completeness).
|
||||
If `GTEST_FAIL_FAST` environment variable or `--gtest_fail_fast` flag is set,
|
||||
@@ -1853,7 +1882,7 @@ If you need to disable all tests in a test suite, you can either add `DISABLED_`
|
||||
to the front of the name of each test, or alternatively add it to the front of
|
||||
the test suite name.
|
||||
|
||||
For example, the following tests won't be run by googletest, even though they
|
||||
For example, the following tests won't be run by GoogleTest, even though they
|
||||
will still be compiled:
|
||||
|
||||
```c++
|
||||
@@ -1868,7 +1897,7 @@ TEST_F(DISABLED_BarTest, DoesXyz) { ... }
|
||||
|
||||
{: .callout .note}
|
||||
NOTE: This feature should only be used for temporary pain-relief. You still have
|
||||
to fix the disabled tests at a later date. As a reminder, googletest will print
|
||||
to fix the disabled tests at a later date. As a reminder, GoogleTest will print
|
||||
a banner warning you if a test program contains any disabled tests.
|
||||
|
||||
{: .callout .tip}
|
||||
@@ -1926,16 +1955,16 @@ You can specify the `--gtest_shuffle` flag (or set the `GTEST_SHUFFLE`
|
||||
environment variable to `1`) to run the tests in a program in a random order.
|
||||
This helps to reveal bad dependencies between tests.
|
||||
|
||||
By default, googletest uses a random seed calculated from the current time.
|
||||
By default, GoogleTest uses a random seed calculated from the current time.
|
||||
Therefore you'll get a different order every time. The console output includes
|
||||
the random seed value, such that you can reproduce an order-related test failure
|
||||
later. To specify the random seed explicitly, use the `--gtest_random_seed=SEED`
|
||||
flag (or set the `GTEST_RANDOM_SEED` environment variable), where `SEED` is an
|
||||
integer in the range [0, 99999]. The seed value 0 is special: it tells
|
||||
googletest to do the default behavior of calculating the seed from the current
|
||||
GoogleTest to do the default behavior of calculating the seed from the current
|
||||
time.
|
||||
|
||||
If you combine this with `--gtest_repeat=N`, googletest will pick a different
|
||||
If you combine this with `--gtest_repeat=N`, GoogleTest will pick a different
|
||||
random seed and re-shuffle the tests in each iteration.
|
||||
|
||||
### Distributing Test Functions to Multiple Machines
|
||||
@@ -1994,7 +2023,7 @@ shards, but here's one possible scenario:
|
||||
|
||||
#### Colored Terminal Output
|
||||
|
||||
googletest can use colors in its terminal output to make it easier to spot the
|
||||
GoogleTest can use colors in its terminal output to make it easier to spot the
|
||||
important information:
|
||||
|
||||
<pre>...
|
||||
@@ -2019,25 +2048,25 @@ important information:
|
||||
|
||||
You can set the `GTEST_COLOR` environment variable or the `--gtest_color`
|
||||
command line flag to `yes`, `no`, or `auto` (the default) to enable colors,
|
||||
disable colors, or let googletest decide. When the value is `auto`, googletest
|
||||
disable colors, or let GoogleTest decide. When the value is `auto`, GoogleTest
|
||||
will use colors if and only if the output goes to a terminal and (on non-Windows
|
||||
platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`.
|
||||
|
||||
#### Suppressing test passes
|
||||
|
||||
By default, googletest prints 1 line of output for each test, indicating if it
|
||||
By default, GoogleTest prints 1 line of output for each test, indicating if it
|
||||
passed or failed. To show only test failures, run the test program with
|
||||
`--gtest_brief=1`, or set the GTEST_BRIEF environment variable to `1`.
|
||||
|
||||
#### Suppressing the Elapsed Time
|
||||
|
||||
By default, googletest prints the time it takes to run each test. To disable
|
||||
By default, GoogleTest prints the time it takes to run each test. To disable
|
||||
that, run the test program with the `--gtest_print_time=0` command line flag, or
|
||||
set the GTEST_PRINT_TIME environment variable to `0`.
|
||||
|
||||
#### Suppressing UTF-8 Text Output
|
||||
|
||||
In case of assertion failures, googletest prints expected and actual values of
|
||||
In case of assertion failures, GoogleTest prints expected and actual values of
|
||||
type `string` both as hex-encoded strings as well as in readable UTF-8 text if
|
||||
they contain valid non-ASCII UTF-8 characters. If you want to suppress the UTF-8
|
||||
text because, for example, you don't have an UTF-8 compatible output medium, run
|
||||
@@ -2046,7 +2075,7 @@ environment variable to `0`.
|
||||
|
||||
#### Generating an XML Report
|
||||
|
||||
googletest can emit a detailed XML report to a file in addition to its normal
|
||||
GoogleTest can emit a detailed XML report to a file in addition to its normal
|
||||
textual output. The report contains the duration of each test, and thus can help
|
||||
you identify slow tests.
|
||||
|
||||
@@ -2057,15 +2086,15 @@ in which case the output can be found in the `test_detail.xml` file in the
|
||||
current directory.
|
||||
|
||||
If you specify a directory (for example, `"xml:output/directory/"` on Linux or
|
||||
`"xml:output\directory\"` on Windows), googletest will create the XML file in
|
||||
`"xml:output\directory\"` on Windows), GoogleTest will create the XML file in
|
||||
that directory, named after the test executable (e.g. `foo_test.xml` for test
|
||||
program `foo_test` or `foo_test.exe`). If the file already exists (perhaps left
|
||||
over from a previous run), googletest will pick a different name (e.g.
|
||||
over from a previous run), GoogleTest will pick a different name (e.g.
|
||||
`foo_test_1.xml`) to avoid overwriting it.
|
||||
|
||||
The report is based on the `junitreport` Ant task. Since that format was
|
||||
originally intended for Java, a little interpretation is required to make it
|
||||
apply to googletest tests, as shown here:
|
||||
apply to GoogleTest tests, as shown here:
|
||||
|
||||
```xml
|
||||
<testsuites name="AllTests" ...>
|
||||
@@ -2080,8 +2109,8 @@ apply to googletest tests, as shown here:
|
||||
```
|
||||
|
||||
* The root `<testsuites>` element corresponds to the entire test program.
|
||||
* `<testsuite>` elements correspond to googletest test suites.
|
||||
* `<testcase>` elements correspond to googletest test functions.
|
||||
* `<testsuite>` elements correspond to GoogleTest test suites.
|
||||
* `<testcase>` elements correspond to GoogleTest test functions.
|
||||
|
||||
For instance, the following program
|
||||
|
||||
@@ -2114,7 +2143,7 @@ could generate this report:
|
||||
Things to note:
|
||||
|
||||
* The `tests` attribute of a `<testsuites>` or `<testsuite>` element tells how
|
||||
many test functions the googletest program or test suite contains, while the
|
||||
many test functions the GoogleTest program or test suite contains, while the
|
||||
`failures` attribute tells how many of them failed.
|
||||
|
||||
* The `time` attribute expresses the duration of the test, test suite, or
|
||||
@@ -2126,12 +2155,12 @@ Things to note:
|
||||
* The `file` and `line` attributes record the source file location, where the
|
||||
test was defined.
|
||||
|
||||
* Each `<failure>` element corresponds to a single failed googletest
|
||||
* Each `<failure>` element corresponds to a single failed GoogleTest
|
||||
assertion.
|
||||
|
||||
#### Generating a JSON Report
|
||||
|
||||
googletest can also emit a JSON report as an alternative format to XML. To
|
||||
GoogleTest can also emit a JSON report as an alternative format to XML. To
|
||||
generate the JSON report, set the `GTEST_OUTPUT` environment variable or the
|
||||
`--gtest_output` flag to the string `"json:path_to_output_file"`, which will
|
||||
create the file at the given location. You can also just use the string
|
||||
@@ -2356,7 +2385,7 @@ variable has been set.
|
||||
|
||||
When running test programs under a debugger, it's very convenient if the
|
||||
debugger can catch an assertion failure and automatically drop into interactive
|
||||
mode. googletest's *break-on-failure* mode supports this behavior.
|
||||
mode. GoogleTest's *break-on-failure* mode supports this behavior.
|
||||
|
||||
To enable it, set the `GTEST_BREAK_ON_FAILURE` environment variable to a value
|
||||
other than `0`. Alternatively, you can use the `--gtest_break_on_failure`
|
||||
@@ -2364,9 +2393,9 @@ command line flag.
|
||||
|
||||
#### Disabling Catching Test-Thrown Exceptions
|
||||
|
||||
googletest can be used either with or without exceptions enabled. If a test
|
||||
GoogleTest can be used either with or without exceptions enabled. If a test
|
||||
throws a C++ exception or (on Windows) a structured exception (SEH), by default
|
||||
googletest catches it, reports it as a test failure, and continues with the next
|
||||
GoogleTest catches it, reports it as a test failure, and continues with the next
|
||||
test method. This maximizes the coverage of a test run. Also, on Windows an
|
||||
uncaught exception will cause a pop-up window, so catching the exceptions allows
|
||||
you to run the tests automatically.
|
||||
@@ -2404,4 +2433,4 @@ void __tsan_on_report() {
|
||||
```
|
||||
|
||||
After compiling your project with one of the sanitizers enabled, if a particular
|
||||
test triggers a sanitizer error, googletest will report that it failed.
|
||||
test triggers a sanitizer error, GoogleTest will report that it failed.
|
||||
|
||||
@@ -20,7 +20,7 @@ class Foo {
|
||||
(note that `~Foo()` **must** be virtual) we can define its mock as
|
||||
|
||||
```cpp
|
||||
#include "gmock/gmock.h"
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockFoo : public Foo {
|
||||
public:
|
||||
|
||||
+44
-43
@@ -285,6 +285,10 @@ If you are concerned about the performance overhead incurred by virtual
|
||||
functions, and profiling confirms your concern, you can combine this with the
|
||||
recipe for [mocking non-virtual methods](#MockingNonVirtualMethods).
|
||||
|
||||
Alternatively, instead of introducing a new interface, you can rewrite your code
|
||||
to accept a std::function instead of the free function, and then use
|
||||
[MockFunction](#MockFunction) to mock the std::function.
|
||||
|
||||
### Old-Style `MOCK_METHODn` Macros
|
||||
|
||||
Before the generic `MOCK_METHOD` macro
|
||||
@@ -693,9 +697,9 @@ TEST(AbcTest, Xyz) {
|
||||
EXPECT_CALL(foo, DoThat(_, _));
|
||||
|
||||
int n = 0;
|
||||
EXPECT_EQ('+', foo.DoThis(5)); // FakeFoo::DoThis() is invoked.
|
||||
EXPECT_EQ(foo.DoThis(5), '+'); // FakeFoo::DoThis() is invoked.
|
||||
foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked.
|
||||
EXPECT_EQ(2, n);
|
||||
EXPECT_EQ(n, 2);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1125,11 +1129,11 @@ using STL's `<functional>` header is just painful). For example, here's a
|
||||
predicate that's satisfied by any number that is >= 0, <= 100, and != 50:
|
||||
|
||||
```cpp
|
||||
using testing::AllOf;
|
||||
using testing::Ge;
|
||||
using testing::Le;
|
||||
using testing::Matches;
|
||||
using testing::Ne;
|
||||
using ::testing::AllOf;
|
||||
using ::testing::Ge;
|
||||
using ::testing::Le;
|
||||
using ::testing::Matches;
|
||||
using ::testing::Ne;
|
||||
...
|
||||
Matches(AllOf(Ge(0), Le(100), Ne(50)))
|
||||
```
|
||||
@@ -1857,7 +1861,7 @@ error. So, what shall you do?
|
||||
Though you may be tempted, DO NOT use `std::ref()`:
|
||||
|
||||
```cpp
|
||||
using testing::Return;
|
||||
using ::testing::Return;
|
||||
|
||||
class MockFoo : public Foo {
|
||||
public:
|
||||
@@ -1869,7 +1873,7 @@ class MockFoo : public Foo {
|
||||
EXPECT_CALL(foo, GetValue())
|
||||
.WillRepeatedly(Return(std::ref(x))); // Wrong!
|
||||
x = 42;
|
||||
EXPECT_EQ(42, foo.GetValue());
|
||||
EXPECT_EQ(foo.GetValue(), 42);
|
||||
```
|
||||
|
||||
Unfortunately, it doesn't work here. The above code will fail with error:
|
||||
@@ -1891,14 +1895,14 @@ the expectation is set, and `Return(std::ref(x))` will always return 0.
|
||||
returns the value pointed to by `pointer` at the time the action is *executed*:
|
||||
|
||||
```cpp
|
||||
using testing::ReturnPointee;
|
||||
using ::testing::ReturnPointee;
|
||||
...
|
||||
int x = 0;
|
||||
MockFoo foo;
|
||||
EXPECT_CALL(foo, GetValue())
|
||||
.WillRepeatedly(ReturnPointee(&x)); // Note the & here.
|
||||
x = 42;
|
||||
EXPECT_EQ(42, foo.GetValue()); // This will succeed now.
|
||||
EXPECT_EQ(foo.GetValue(), 42); // This will succeed now.
|
||||
```
|
||||
|
||||
### Combining Actions
|
||||
@@ -2260,7 +2264,7 @@ TEST_F(FooTest, Test) {
|
||||
|
||||
EXPECT_CALL(foo, DoThis(2))
|
||||
.WillOnce(Invoke(NewPermanentCallback(SignOfSum, 5)));
|
||||
EXPECT_EQ('+', foo.DoThis(2)); // Invokes SignOfSum(5, 2).
|
||||
EXPECT_EQ(foo.DoThis(2), '+'); // Invokes SignOfSum(5, 2).
|
||||
}
|
||||
```
|
||||
|
||||
@@ -2636,8 +2640,8 @@ action will exhibit different behaviors. Example:
|
||||
.WillRepeatedly(IncrementCounter(0));
|
||||
foo.DoThis(); // Returns 1.
|
||||
foo.DoThis(); // Returns 2.
|
||||
foo.DoThat(); // Returns 1 - Blah() uses a different
|
||||
// counter than Bar()'s.
|
||||
foo.DoThat(); // Returns 1 - DoThat() uses a different
|
||||
// counter than DoThis()'s.
|
||||
```
|
||||
|
||||
versus
|
||||
@@ -2767,36 +2771,33 @@ returns a null `unique_ptr`, that’s what you’ll get if you don’t specify a
|
||||
action:
|
||||
|
||||
```cpp
|
||||
using ::testing::IsNull;
|
||||
...
|
||||
// Use the default action.
|
||||
EXPECT_CALL(mock_buzzer_, MakeBuzz("hello"));
|
||||
|
||||
// Triggers the previous EXPECT_CALL.
|
||||
EXPECT_EQ(nullptr, mock_buzzer_.MakeBuzz("hello"));
|
||||
EXPECT_THAT(mock_buzzer_.MakeBuzz("hello"), IsNull());
|
||||
```
|
||||
|
||||
If you are not happy with the default action, you can tweak it as usual; see
|
||||
[Setting Default Actions](#OnCall).
|
||||
|
||||
If you just need to return a pre-defined move-only value, you can use the
|
||||
`Return(ByMove(...))` action:
|
||||
If you just need to return a move-only value, you can use it in combination with
|
||||
`WillOnce`. For example:
|
||||
|
||||
```cpp
|
||||
// When this fires, the unique_ptr<> specified by ByMove(...) will
|
||||
// be returned.
|
||||
EXPECT_CALL(mock_buzzer_, MakeBuzz("world"))
|
||||
.WillOnce(Return(ByMove(std::make_unique<Buzz>(AccessLevel::kInternal))));
|
||||
|
||||
EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("world"));
|
||||
EXPECT_CALL(mock_buzzer_, MakeBuzz("hello"))
|
||||
.WillOnce(Return(std::make_unique<Buzz>(AccessLevel::kInternal)));
|
||||
EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("hello"));
|
||||
```
|
||||
|
||||
Note that `ByMove()` is essential here - if you drop it, the code won’t compile.
|
||||
|
||||
Quiz time! What do you think will happen if a `Return(ByMove(...))` action is
|
||||
performed more than once (e.g. you write `...
|
||||
.WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time
|
||||
the action runs, the source value will be consumed (since it’s a move-only
|
||||
value), so the next time around, there’s no value to move from -- you’ll get a
|
||||
run-time error that `Return(ByMove(...))` can only be run once.
|
||||
Quiz time! What do you think will happen if a `Return` action is performed more
|
||||
than once (e.g. you write `... .WillRepeatedly(Return(std::move(...)));`)? Come
|
||||
think of it, after the first time the action runs, the source value will be
|
||||
consumed (since it’s a move-only value), so the next time around, there’s no
|
||||
value to move from -- you’ll get a run-time error that `Return(std::move(...))`
|
||||
can only be run once.
|
||||
|
||||
If you need your mock method to do more than just moving a pre-defined value,
|
||||
remember that you can always use a lambda or a callable object, which can do
|
||||
@@ -2813,7 +2814,7 @@ pretty much anything you want:
|
||||
```
|
||||
|
||||
Every time this `EXPECT_CALL` fires, a new `unique_ptr<Buzz>` will be created
|
||||
and returned. You cannot do this with `Return(ByMove(...))`.
|
||||
and returned. You cannot do this with `Return(std::make_unique<...>(...))`.
|
||||
|
||||
That covers returning move-only values; but how do we work with methods
|
||||
accepting move-only arguments? The answer is that they work normally, although
|
||||
@@ -3193,11 +3194,11 @@ You can unlock this power by running your test with the `--gmock_verbose=info`
|
||||
flag. For example, given the test program:
|
||||
|
||||
```cpp
|
||||
#include "gmock/gmock.h"
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
using testing::_;
|
||||
using testing::HasSubstr;
|
||||
using testing::Return;
|
||||
using ::testing::_;
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::Return;
|
||||
|
||||
class MockFoo {
|
||||
public:
|
||||
@@ -3818,15 +3819,15 @@ If the built-in actions don't work for you, you can easily define your own one.
|
||||
All you need is a call operator with a signature compatible with the mocked
|
||||
function. So you can use a lambda:
|
||||
|
||||
```
|
||||
```cpp
|
||||
MockFunction<int(int)> mock;
|
||||
EXPECT_CALL(mock, Call).WillOnce([](const int input) { return input * 7; });
|
||||
EXPECT_EQ(14, mock.AsStdFunction()(2));
|
||||
EXPECT_EQ(mock.AsStdFunction()(2), 14);
|
||||
```
|
||||
|
||||
Or a struct with a call operator (even a templated one):
|
||||
|
||||
```
|
||||
```cpp
|
||||
struct MultiplyBy {
|
||||
template <typename T>
|
||||
T operator()(T arg) { return arg * multiplier; }
|
||||
@@ -3841,16 +3842,16 @@ struct MultiplyBy {
|
||||
It's also fine for the callable to take no arguments, ignoring the arguments
|
||||
supplied to the mock function:
|
||||
|
||||
```
|
||||
```cpp
|
||||
MockFunction<int(int)> mock;
|
||||
EXPECT_CALL(mock, Call).WillOnce([] { return 17; });
|
||||
EXPECT_EQ(17, mock.AsStdFunction()(0));
|
||||
EXPECT_EQ(mock.AsStdFunction()(0), 17);
|
||||
```
|
||||
|
||||
When used with `WillOnce`, the callable can assume it will be called at most
|
||||
once and is allowed to be a move-only type:
|
||||
|
||||
```
|
||||
```cpp
|
||||
// An action that contains move-only types and has an &&-qualified operator,
|
||||
// demanding in the type system that it be called at most once. This can be
|
||||
// used with WillOnce, but the compiler will reject it if handed to
|
||||
@@ -4294,7 +4295,7 @@ particular type than to dump the bytes.
|
||||
### Mock std::function {#MockFunction}
|
||||
|
||||
`std::function` is a general function type introduced in C++11. It is a
|
||||
preferred way of passing callbacks to new interfaces. Functions are copiable,
|
||||
preferred way of passing callbacks to new interfaces. Functions are copyable,
|
||||
and are not usually passed around by pointer, which makes them tricky to mock.
|
||||
But fear not - `MockFunction` can help you with that.
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ follow:
|
||||
After the process, you should have something like:
|
||||
|
||||
```cpp
|
||||
#include "gmock/gmock.h" // Brings in gMock.
|
||||
#include <gmock/gmock.h> // Brings in gMock.
|
||||
|
||||
class MockTurtle : public Turtle {
|
||||
public:
|
||||
@@ -224,8 +224,8 @@ Here's an example:
|
||||
|
||||
```cpp
|
||||
#include "path/to/mock-turtle.h"
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using ::testing::AtLeast; // #1
|
||||
|
||||
|
||||
+5
-9
@@ -19,19 +19,15 @@ examples here we assume you want to compile the sample
|
||||
Using `pkg-config` in CMake is fairly easy:
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
|
||||
cmake_policy(SET CMP0048 NEW)
|
||||
project(my_gtest_pkgconfig VERSION 0.0.1 LANGUAGES CXX)
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_search_module(GTEST REQUIRED gtest_main)
|
||||
|
||||
add_executable(testapp samples/sample3_unittest.cc)
|
||||
target_link_libraries(testapp ${GTEST_LDFLAGS})
|
||||
target_compile_options(testapp PUBLIC ${GTEST_CFLAGS})
|
||||
add_executable(testapp)
|
||||
target_sources(testapp PRIVATE samples/sample3_unittest.cc)
|
||||
target_link_libraries(testapp PRIVATE ${GTEST_LDFLAGS})
|
||||
target_compile_options(testapp PRIVATE ${GTEST_CFLAGS})
|
||||
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
add_test(first_and_only_test testapp)
|
||||
```
|
||||
|
||||
|
||||
+6
-33
@@ -1,35 +1,8 @@
|
||||
# Supported Platforms
|
||||
|
||||
GoogleTest requires a codebase and compiler compliant with the C++11 standard or
|
||||
newer.
|
||||
|
||||
The GoogleTest code is officially supported on the following platforms.
|
||||
Operating systems or tools not listed below are community-supported. For
|
||||
community-supported platforms, patches that do not complicate the code may be
|
||||
considered.
|
||||
|
||||
If you notice any problems on your platform, please file an issue on the
|
||||
[GoogleTest GitHub Issue Tracker](https://github.com/google/googletest/issues).
|
||||
Pull requests containing fixes are welcome!
|
||||
|
||||
### Operating systems
|
||||
|
||||
* Linux
|
||||
* macOS
|
||||
* Windows
|
||||
|
||||
### Compilers
|
||||
|
||||
* gcc 5.0+
|
||||
* clang 5.0+
|
||||
* MSVC 2015+
|
||||
|
||||
**macOS users:** Xcode 9.3+ provides clang 5.0+.
|
||||
|
||||
### Build systems
|
||||
|
||||
* [Bazel](https://bazel.build/)
|
||||
* [CMake](https://cmake.org/)
|
||||
|
||||
Bazel is the build system used by the team internally and in tests. CMake is
|
||||
supported on a best-effort basis and by the community.
|
||||
GoogleTest follows Google's
|
||||
[Foundational C++ Support Policy](https://opensource.google/documentation/policies/cplusplus-support).
|
||||
See
|
||||
[this table](https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md)
|
||||
for a list of currently supported versions compilers, platforms, and build
|
||||
tools.
|
||||
|
||||
+48
-48
@@ -1,74 +1,74 @@
|
||||
# Googletest Primer
|
||||
# GoogleTest Primer
|
||||
|
||||
## Introduction: Why googletest?
|
||||
## Introduction: Why GoogleTest?
|
||||
|
||||
*googletest* helps you write better C++ tests.
|
||||
*GoogleTest* helps you write better C++ tests.
|
||||
|
||||
googletest is a testing framework developed by the Testing Technology team with
|
||||
GoogleTest is a testing framework developed by the Testing Technology team with
|
||||
Google's specific requirements and constraints in mind. Whether you work on
|
||||
Linux, Windows, or a Mac, if you write C++ code, googletest can help you. And it
|
||||
Linux, Windows, or a Mac, if you write C++ code, GoogleTest can help you. And it
|
||||
supports *any* kind of tests, not just unit tests.
|
||||
|
||||
So what makes a good test, and how does googletest fit in? We believe:
|
||||
So what makes a good test, and how does GoogleTest fit in? We believe:
|
||||
|
||||
1. Tests should be *independent* and *repeatable*. It's a pain to debug a test
|
||||
that succeeds or fails as a result of other tests. googletest isolates the
|
||||
that succeeds or fails as a result of other tests. GoogleTest isolates the
|
||||
tests by running each of them on a different object. When a test fails,
|
||||
googletest allows you to run it in isolation for quick debugging.
|
||||
GoogleTest allows you to run it in isolation for quick debugging.
|
||||
2. Tests should be well *organized* and reflect the structure of the tested
|
||||
code. googletest groups related tests into test suites that can share data
|
||||
code. GoogleTest groups related tests into test suites that can share data
|
||||
and subroutines. This common pattern is easy to recognize and makes tests
|
||||
easy to maintain. Such consistency is especially helpful when people switch
|
||||
projects and start to work on a new code base.
|
||||
3. Tests should be *portable* and *reusable*. Google has a lot of code that is
|
||||
platform-neutral; its tests should also be platform-neutral. googletest
|
||||
platform-neutral; its tests should also be platform-neutral. GoogleTest
|
||||
works on different OSes, with different compilers, with or without
|
||||
exceptions, so googletest tests can work with a variety of configurations.
|
||||
exceptions, so GoogleTest tests can work with a variety of configurations.
|
||||
4. When tests fail, they should provide as much *information* about the problem
|
||||
as possible. googletest doesn't stop at the first test failure. Instead, it
|
||||
as possible. GoogleTest doesn't stop at the first test failure. Instead, it
|
||||
only stops the current test and continues with the next. You can also set up
|
||||
tests that report non-fatal failures after which the current test continues.
|
||||
Thus, you can detect and fix multiple bugs in a single run-edit-compile
|
||||
cycle.
|
||||
5. The testing framework should liberate test writers from housekeeping chores
|
||||
and let them focus on the test *content*. googletest automatically keeps
|
||||
and let them focus on the test *content*. GoogleTest automatically keeps
|
||||
track of all tests defined, and doesn't require the user to enumerate them
|
||||
in order to run them.
|
||||
6. Tests should be *fast*. With googletest, you can reuse shared resources
|
||||
6. Tests should be *fast*. With GoogleTest, you can reuse shared resources
|
||||
across tests and pay for the set-up/tear-down only once, without making
|
||||
tests depend on each other.
|
||||
|
||||
Since googletest is based on the popular xUnit architecture, you'll feel right
|
||||
Since GoogleTest is based on the popular xUnit architecture, you'll feel right
|
||||
at home if you've used JUnit or PyUnit before. If not, it will take you about 10
|
||||
minutes to learn the basics and get started. So let's go!
|
||||
|
||||
## Beware of the nomenclature
|
||||
## Beware of the Nomenclature
|
||||
|
||||
{: .callout .note}
|
||||
_Note:_ There might be some confusion arising from different definitions of the
|
||||
terms _Test_, _Test Case_ and _Test Suite_, so beware of misunderstanding these.
|
||||
*Note:* There might be some confusion arising from different definitions of the
|
||||
terms *Test*, *Test Case* and *Test Suite*, so beware of misunderstanding these.
|
||||
|
||||
Historically, googletest started to use the term _Test Case_ for grouping
|
||||
Historically, GoogleTest started to use the term *Test Case* for grouping
|
||||
related tests, whereas current publications, including International Software
|
||||
Testing Qualifications Board ([ISTQB](http://www.istqb.org/)) materials and
|
||||
various textbooks on software quality, use the term
|
||||
_[Test Suite][istqb test suite]_ for this.
|
||||
*[Test Suite][istqb test suite]* for this.
|
||||
|
||||
The related term _Test_, as it is used in googletest, corresponds to the term
|
||||
_[Test Case][istqb test case]_ of ISTQB and others.
|
||||
The related term *Test*, as it is used in GoogleTest, corresponds to the term
|
||||
*[Test Case][istqb test case]* of ISTQB and others.
|
||||
|
||||
The term _Test_ is commonly of broad enough sense, including ISTQB's definition
|
||||
of _Test Case_, so it's not much of a problem here. But the term _Test Case_ as
|
||||
The term *Test* is commonly of broad enough sense, including ISTQB's definition
|
||||
of *Test Case*, so it's not much of a problem here. But the term *Test Case* as
|
||||
was used in Google Test is of contradictory sense and thus confusing.
|
||||
|
||||
googletest recently started replacing the term _Test Case_ with _Test Suite_.
|
||||
GoogleTest recently started replacing the term *Test Case* with *Test Suite*.
|
||||
The preferred API is *TestSuite*. The older TestCase API is being slowly
|
||||
deprecated and refactored away.
|
||||
|
||||
So please be aware of the different definitions of the terms:
|
||||
|
||||
|
||||
Meaning | googletest Term | [ISTQB](http://www.istqb.org/) Term
|
||||
Meaning | GoogleTest Term | [ISTQB](http://www.istqb.org/) Term
|
||||
:----------------------------------------------------------------------------------- | :---------------------- | :----------------------------------
|
||||
Exercise a particular program path with specific input values and verify the results | [TEST()](#simple-tests) | [Test Case][istqb test case]
|
||||
|
||||
@@ -78,7 +78,7 @@ Exercise a particular program path with specific input values and verify the res
|
||||
|
||||
## Basic Concepts
|
||||
|
||||
When using googletest, you start by writing *assertions*, which are statements
|
||||
When using GoogleTest, you start by writing *assertions*, which are statements
|
||||
that check whether a condition is true. An assertion's result can be *success*,
|
||||
*nonfatal failure*, or *fatal failure*. If a fatal failure occurs, it aborts the
|
||||
current function; otherwise the program continues normally.
|
||||
@@ -98,11 +98,11 @@ assertion level and building up to tests and test suites.
|
||||
|
||||
## Assertions
|
||||
|
||||
googletest assertions are macros that resemble function calls. You test a class
|
||||
GoogleTest assertions are macros that resemble function calls. You test a class
|
||||
or function by making assertions about its behavior. When an assertion fails,
|
||||
googletest prints the assertion's source file and line number location, along
|
||||
GoogleTest prints the assertion's source file and line number location, along
|
||||
with a failure message. You may also supply a custom failure message which will
|
||||
be appended to googletest's message.
|
||||
be appended to GoogleTest's message.
|
||||
|
||||
The assertions come in pairs that test the same thing but have different effects
|
||||
on the current function. `ASSERT_*` versions generate fatal failures when they
|
||||
@@ -149,7 +149,7 @@ To create a test:
|
||||
1. Use the `TEST()` macro to define and name a test function. These are
|
||||
ordinary C++ functions that don't return a value.
|
||||
2. In this function, along with any valid C++ statements you want to include,
|
||||
use the various googletest assertions to check values.
|
||||
use the various GoogleTest assertions to check values.
|
||||
3. The test's result is determined by the assertions; if any assertion in the
|
||||
test fails (either fatally or non-fatally), or if the test crashes, the
|
||||
entire test fails. Otherwise, it succeeds.
|
||||
@@ -190,7 +190,7 @@ TEST(FactorialTest, HandlesPositiveInput) {
|
||||
}
|
||||
```
|
||||
|
||||
googletest groups the test results by test suites, so logically related tests
|
||||
GoogleTest groups the test results by test suites, so logically related tests
|
||||
should be in the same test suite; in other words, the first argument to their
|
||||
`TEST()` should be the same. In the above example, we have two tests,
|
||||
`HandlesZeroInput` and `HandlesPositiveInput`, that belong to the same test
|
||||
@@ -227,14 +227,14 @@ When using a fixture, use `TEST_F()` instead of `TEST()` as it allows you to
|
||||
access objects and subroutines in the test fixture:
|
||||
|
||||
```c++
|
||||
TEST_F(TestFixtureName, TestName) {
|
||||
TEST_F(TestFixtureClassName, TestName) {
|
||||
... test body ...
|
||||
}
|
||||
```
|
||||
|
||||
Like `TEST()`, the first argument is the test suite name, but for `TEST_F()`
|
||||
this must be the name of the test fixture class. You've probably guessed: `_F`
|
||||
is for fixture.
|
||||
Unlike `TEST()`, in `TEST_F()` the first argument must be the name of the test
|
||||
fixture class. (`_F` stands for "Fixture"). No test suite name is specified for
|
||||
this macro.
|
||||
|
||||
Unfortunately, the C++ macro system does not allow us to create a single macro
|
||||
that can handle both types of tests. Using the wrong macro causes a compiler
|
||||
@@ -244,12 +244,12 @@ Also, you must first define a test fixture class before using it in a
|
||||
`TEST_F()`, or you'll get the compiler error "`virtual outside class
|
||||
declaration`".
|
||||
|
||||
For each test defined with `TEST_F()`, googletest will create a *fresh* test
|
||||
For each test defined with `TEST_F()`, GoogleTest will create a *fresh* test
|
||||
fixture at runtime, immediately initialize it via `SetUp()`, run the test, clean
|
||||
up by calling `TearDown()`, and then delete the test fixture. Note that
|
||||
different tests in the same test suite have different test fixture objects, and
|
||||
googletest always deletes a test fixture before it creates the next one.
|
||||
googletest does **not** reuse the same test fixture for multiple tests. Any
|
||||
GoogleTest always deletes a test fixture before it creates the next one.
|
||||
GoogleTest does **not** reuse the same test fixture for multiple tests. Any
|
||||
changes one test makes to the fixture do not affect other tests.
|
||||
|
||||
As an example, let's write tests for a FIFO queue class named `Queue`, which has
|
||||
@@ -325,7 +325,7 @@ would lead to a segfault when `n` is `NULL`.
|
||||
|
||||
When these tests run, the following happens:
|
||||
|
||||
1. googletest constructs a `QueueTest` object (let's call it `t1`).
|
||||
1. GoogleTest constructs a `QueueTest` object (let's call it `t1`).
|
||||
2. `t1.SetUp()` initializes `t1`.
|
||||
3. The first test (`IsEmptyInitially`) runs on `t1`.
|
||||
4. `t1.TearDown()` cleans up after the test finishes.
|
||||
@@ -337,7 +337,7 @@ When these tests run, the following happens:
|
||||
|
||||
## Invoking the Tests
|
||||
|
||||
`TEST()` and `TEST_F()` implicitly register their tests with googletest. So,
|
||||
`TEST()` and `TEST_F()` implicitly register their tests with GoogleTest. So,
|
||||
unlike with many other C++ testing frameworks, you don't have to re-list all
|
||||
your defined tests in order to run them.
|
||||
|
||||
@@ -348,7 +348,7 @@ test suites, or even different source files.
|
||||
|
||||
When invoked, the `RUN_ALL_TESTS()` macro:
|
||||
|
||||
* Saves the state of all googletest flags.
|
||||
* Saves the state of all GoogleTest flags.
|
||||
|
||||
* Creates a test fixture object for the first test.
|
||||
|
||||
@@ -360,7 +360,7 @@ When invoked, the `RUN_ALL_TESTS()` macro:
|
||||
|
||||
* Deletes the fixture.
|
||||
|
||||
* Restores the state of all googletest flags.
|
||||
* Restores the state of all GoogleTest flags.
|
||||
|
||||
* Repeats the above steps for the next test, until all tests have run.
|
||||
|
||||
@@ -374,14 +374,14 @@ If a fatal failure happens the subsequent steps will be skipped.
|
||||
> return the value of `RUN_ALL_TESTS()`.
|
||||
>
|
||||
> Also, you should call `RUN_ALL_TESTS()` only **once**. Calling it more than
|
||||
> once conflicts with some advanced googletest features (e.g., thread-safe
|
||||
> once conflicts with some advanced GoogleTest features (e.g., thread-safe
|
||||
> [death tests](advanced.md#death-tests)) and thus is not supported.
|
||||
|
||||
**Availability**: Linux, Windows, Mac.
|
||||
|
||||
## Writing the main() Function
|
||||
|
||||
Most users should _not_ need to write their own `main` function and instead link
|
||||
Most users should *not* need to write their own `main` function and instead link
|
||||
with `gtest_main` (as opposed to with `gtest`), which defines a suitable entry
|
||||
point. See the end of this section for details. The remainder of this section
|
||||
should only apply when you need to do something custom before the tests run that
|
||||
@@ -395,7 +395,7 @@ You can start from this boilerplate:
|
||||
```c++
|
||||
#include "this/package/foo.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace my {
|
||||
namespace project {
|
||||
@@ -456,7 +456,7 @@ int main(int argc, char **argv) {
|
||||
```
|
||||
|
||||
The `::testing::InitGoogleTest()` function parses the command line for
|
||||
googletest flags, and removes all recognized flags. This allows the user to
|
||||
GoogleTest flags, and removes all recognized flags. This allows the user to
|
||||
control a test program's behavior via various flags, which we'll cover in the
|
||||
[AdvancedGuide](advanced.md). You **must** call this function before calling
|
||||
`RUN_ALL_TESTS()`, or the flags won't be properly initialized.
|
||||
@@ -476,7 +476,7 @@ NOTE: `ParseGUnitFlags()` is deprecated in favor of `InitGoogleTest()`.
|
||||
|
||||
* Google Test is designed to be thread-safe. The implementation is thread-safe
|
||||
on systems where the `pthreads` library is available. It is currently
|
||||
_unsafe_ to use Google Test assertions from two threads concurrently on
|
||||
*unsafe* to use Google Test assertions from two threads concurrently on
|
||||
other systems (e.g. Windows). In most tests this is not an issue as usually
|
||||
the assertions are done in the main thread. If you want to help, you can
|
||||
volunteer to implement the necessary synchronization primitives in
|
||||
|
||||
@@ -105,10 +105,17 @@ file (`@com_google_googletest`). For more information about Bazel `BUILD` files,
|
||||
see the
|
||||
[Bazel C++ Tutorial](https://docs.bazel.build/versions/main/tutorial/cpp.html).
|
||||
|
||||
{: .callout .note}
|
||||
NOTE: In the example below, we assume Clang or GCC and set `--cxxopt=-std=c++14`
|
||||
to ensure that GoogleTest is compiled as C++14 instead of the compiler's default
|
||||
setting (which could be C++11). For MSVC, the equivalent would be
|
||||
`--cxxopt=/std:c++14`. See [Supported Platforms](platforms.md) for more details
|
||||
on supported language versions.
|
||||
|
||||
Now you can build and run your test:
|
||||
|
||||
<pre>
|
||||
<strong>my_workspace$ bazel test --test_output=all //:hello_test</strong>
|
||||
<strong>my_workspace$ bazel test --cxxopt=-std=c++14 --test_output=all //:hello_test</strong>
|
||||
INFO: Analyzed target //:hello_test (26 packages loaded, 362 targets configured).
|
||||
INFO: Found 1 test target...
|
||||
INFO: From Testing //:hello_test:
|
||||
|
||||
@@ -54,6 +54,7 @@ project(my_project)
|
||||
|
||||
# GoogleTest requires at least C++14
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
|
||||
@@ -88,7 +88,7 @@ For example, the following code verifies that the string `value1` starts with
|
||||
10:
|
||||
|
||||
```cpp
|
||||
#include "gmock/gmock.h"
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
using ::testing::AllOf;
|
||||
using ::testing::Gt;
|
||||
@@ -515,7 +515,7 @@ Verifies that *`expression`* is a success `HRESULT`.
|
||||
### EXPECT_HRESULT_FAILED {#EXPECT_HRESULT_FAILED}
|
||||
|
||||
`EXPECT_HRESULT_FAILED(`*`expression`*`)` \
|
||||
`EXPECT_HRESULT_FAILED(`*`expression`*`)`
|
||||
`ASSERT_HRESULT_FAILED(`*`expression`*`)`
|
||||
|
||||
Verifies that *`expression`* is a failure `HRESULT`.
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ The `argument` can be either a C string or a C++ string object:
|
||||
| `StrCaseNe(string)` | `argument` is not equal to `string`, ignoring case. |
|
||||
| `StrEq(string)` | `argument` is equal to `string`. |
|
||||
| `StrNe(string)` | `argument` is not equal to `string`. |
|
||||
| `WhenBase64Unescaped(m)` | `argument` is a base-64 escaped string whose unescaped string matches `m`. |
|
||||
| `WhenBase64Unescaped(m)` | `argument` is a base-64 escaped string whose unescaped string matches `m`. The web-safe format from [RFC 4648](https://www.rfc-editor.org/rfc/rfc4648#section-5) is supported. |
|
||||
|
||||
`ContainsRegex()` and `MatchesRegex()` take ownership of the `RE` object. They
|
||||
use the regular expression syntax defined
|
||||
@@ -288,3 +288,15 @@ which must be a permanent callback.
|
||||
return ExplainMatchResult(matcher, arg.nested().property(), result_listener);
|
||||
}
|
||||
```
|
||||
|
||||
5. You can use `DescribeMatcher<>` to describe another matcher. For example:
|
||||
|
||||
```cpp
|
||||
MATCHER_P(XAndYThat, matcher,
|
||||
"X that " + DescribeMatcher<int>(matcher, negation) +
|
||||
(negation ? " or" : " and") + " Y that " +
|
||||
DescribeMatcher<double>(matcher, negation)) {
|
||||
return ExplainMatchResult(matcher, arg.x(), result_listener) &&
|
||||
ExplainMatchResult(matcher, arg.y(), result_listener);
|
||||
}
|
||||
```
|
||||
|
||||
+36
-35
@@ -110,6 +110,7 @@ namespace:
|
||||
| `Bool()` | Yields sequence `{false, true}`. |
|
||||
| `Combine(g1, g2, ..., gN)` | Yields as `std::tuple` *n*-tuples all combinations (Cartesian product) of the values generated by the given *n* generators `g1`, `g2`, ..., `gN`. |
|
||||
| `ConvertGenerator<T>(g)` | Yields values generated by generator `g`, `static_cast` to `T`. |
|
||||
|
||||
The optional last argument *`name_generator`* is a function or functor that
|
||||
generates custom test name suffixes based on the test parameters. The function
|
||||
must accept an argument of type
|
||||
@@ -121,8 +122,8 @@ custom function can be used for more control:
|
||||
```cpp
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
MyInstantiation, MyTestSuite,
|
||||
::testing::Values(...),
|
||||
[](const ::testing::TestParamInfo<MyTestSuite::ParamType>& info) {
|
||||
testing::Values(...),
|
||||
[](const testing::TestParamInfo<MyTestSuite::ParamType>& info) {
|
||||
// Can use info.param here to generate the test suffix
|
||||
std::string name = ...
|
||||
return name;
|
||||
@@ -147,7 +148,7 @@ type, for example:
|
||||
|
||||
```cpp
|
||||
template <typename T>
|
||||
class MyFixture : public ::testing::Test {
|
||||
class MyFixture : public testing::Test {
|
||||
public:
|
||||
...
|
||||
using List = std::list<T>;
|
||||
@@ -323,7 +324,7 @@ Then the test code should look like:
|
||||
```cpp
|
||||
namespace my_namespace {
|
||||
|
||||
class MyClassTest : public ::testing::Test {
|
||||
class MyClassTest : public testing::Test {
|
||||
...
|
||||
};
|
||||
|
||||
@@ -386,7 +387,7 @@ GoogleTest defines the following classes and types to help with writing tests.
|
||||
|
||||
### AssertionResult {#AssertionResult}
|
||||
|
||||
`::testing::AssertionResult`
|
||||
`testing::AssertionResult`
|
||||
|
||||
A class for indicating whether an assertion was successful.
|
||||
|
||||
@@ -400,14 +401,14 @@ To create an instance of this class, use one of the factory functions
|
||||
|
||||
### AssertionException {#AssertionException}
|
||||
|
||||
`::testing::AssertionException`
|
||||
`testing::AssertionException`
|
||||
|
||||
Exception which can be thrown from
|
||||
[`TestEventListener::OnTestPartResult`](#TestEventListener::OnTestPartResult).
|
||||
|
||||
### EmptyTestEventListener {#EmptyTestEventListener}
|
||||
|
||||
`::testing::EmptyTestEventListener`
|
||||
`testing::EmptyTestEventListener`
|
||||
|
||||
Provides an empty implementation of all methods in the
|
||||
[`TestEventListener`](#TestEventListener) interface, such that a subclass only
|
||||
@@ -415,7 +416,7 @@ needs to override the methods it cares about.
|
||||
|
||||
### Environment {#Environment}
|
||||
|
||||
`::testing::Environment`
|
||||
`testing::Environment`
|
||||
|
||||
Represents a global test environment. See
|
||||
[Global Set-Up and Tear-Down](../advanced.md#global-set-up-and-tear-down).
|
||||
@@ -436,7 +437,7 @@ Override this to define how to tear down the environment.
|
||||
|
||||
### ScopedTrace {#ScopedTrace}
|
||||
|
||||
`::testing::ScopedTrace`
|
||||
`testing::ScopedTrace`
|
||||
|
||||
An instance of this class causes a trace to be included in every test failure
|
||||
message generated by code in the scope of the lifetime of the `ScopedTrace`
|
||||
@@ -452,7 +453,7 @@ ScopedTrace(const char* file, int line, const T& message)
|
||||
Example usage:
|
||||
|
||||
```cpp
|
||||
::testing::ScopedTrace trace("file.cc", 123, "message");
|
||||
testing::ScopedTrace trace("file.cc", 123, "message");
|
||||
```
|
||||
|
||||
The resulting trace includes the given source file path and line number, and the
|
||||
@@ -463,7 +464,7 @@ See also [`SCOPED_TRACE`](#SCOPED_TRACE).
|
||||
|
||||
### Test {#Test}
|
||||
|
||||
`::testing::Test`
|
||||
`testing::Test`
|
||||
|
||||
The abstract class that all tests inherit from. `Test` is not copyable.
|
||||
|
||||
@@ -551,7 +552,7 @@ after running each individual test.
|
||||
|
||||
### TestWithParam {#TestWithParam}
|
||||
|
||||
`::testing::TestWithParam<T>`
|
||||
`testing::TestWithParam<T>`
|
||||
|
||||
A convenience class which inherits from both [`Test`](#Test) and
|
||||
[`WithParamInterface<T>`](#WithParamInterface).
|
||||
@@ -671,7 +672,7 @@ during execution of `SetUpTestSuite` and `TearDownTestSuite`.
|
||||
|
||||
### TestInfo {#TestInfo}
|
||||
|
||||
`::testing::TestInfo`
|
||||
`testing::TestInfo`
|
||||
|
||||
Stores information about a test.
|
||||
|
||||
@@ -750,7 +751,7 @@ Returns the result of the test. See [`TestResult`](#TestResult).
|
||||
|
||||
### TestParamInfo {#TestParamInfo}
|
||||
|
||||
`::testing::TestParamInfo<T>`
|
||||
`testing::TestParamInfo<T>`
|
||||
|
||||
Describes a parameter to a value-parameterized test. The type `T` is the type of
|
||||
the parameter.
|
||||
@@ -760,7 +761,7 @@ and its integer index respectively.
|
||||
|
||||
### UnitTest {#UnitTest}
|
||||
|
||||
`::testing::UnitTest`
|
||||
`testing::UnitTest`
|
||||
|
||||
This class contains information about the test program.
|
||||
|
||||
@@ -928,7 +929,7 @@ GoogleTest. See [`TestEventListeners`](#TestEventListeners).
|
||||
|
||||
### TestEventListener {#TestEventListener}
|
||||
|
||||
`::testing::TestEventListener`
|
||||
`testing::TestEventListener`
|
||||
|
||||
The interface for tracing execution of tests. The methods below are listed in
|
||||
the order the corresponding events are fired.
|
||||
@@ -1026,7 +1027,7 @@ Fired after all test activities have ended.
|
||||
|
||||
### TestEventListeners {#TestEventListeners}
|
||||
|
||||
`::testing::TestEventListeners`
|
||||
`testing::TestEventListeners`
|
||||
|
||||
Lets users add listeners to track events in GoogleTest.
|
||||
|
||||
@@ -1071,7 +1072,7 @@ the caller and makes this function return `NULL` the next time.
|
||||
|
||||
### TestPartResult {#TestPartResult}
|
||||
|
||||
`::testing::TestPartResult`
|
||||
`testing::TestPartResult`
|
||||
|
||||
A copyable object representing the result of a test part (i.e. an assertion or
|
||||
an explicit `FAIL()`, `ADD_FAILURE()`, or `SUCCESS()`).
|
||||
@@ -1153,7 +1154,7 @@ Returns true if and only if the test part failed.
|
||||
|
||||
### TestProperty {#TestProperty}
|
||||
|
||||
`::testing::TestProperty`
|
||||
`testing::TestProperty`
|
||||
|
||||
A copyable object representing a user-specified test property which can be
|
||||
output as a key/value string pair.
|
||||
@@ -1180,7 +1181,7 @@ Sets a new value, overriding the previous one.
|
||||
|
||||
### TestResult {#TestResult}
|
||||
|
||||
`::testing::TestResult`
|
||||
`testing::TestResult`
|
||||
|
||||
Contains information about the result of a single test.
|
||||
|
||||
@@ -1261,20 +1262,20 @@ range, aborts the program.
|
||||
|
||||
### TimeInMillis {#TimeInMillis}
|
||||
|
||||
`::testing::TimeInMillis`
|
||||
`testing::TimeInMillis`
|
||||
|
||||
An integer type representing time in milliseconds.
|
||||
|
||||
### Types {#Types}
|
||||
|
||||
`::testing::Types<T...>`
|
||||
`testing::Types<T...>`
|
||||
|
||||
Represents a list of types for use in typed tests and type-parameterized tests.
|
||||
|
||||
The template argument `T...` can be any number of types, for example:
|
||||
|
||||
```
|
||||
::testing::Types<char, int, unsigned int>
|
||||
testing::Types<char, int, unsigned int>
|
||||
```
|
||||
|
||||
See [Typed Tests](../advanced.md#typed-tests) and
|
||||
@@ -1283,7 +1284,7 @@ information.
|
||||
|
||||
### WithParamInterface {#WithParamInterface}
|
||||
|
||||
`::testing::WithParamInterface<T>`
|
||||
`testing::WithParamInterface<T>`
|
||||
|
||||
The pure interface class that all value-parameterized tests inherit from.
|
||||
|
||||
@@ -1309,9 +1310,9 @@ tests.
|
||||
|
||||
### InitGoogleTest {#InitGoogleTest}
|
||||
|
||||
`void ::testing::InitGoogleTest(int* argc, char** argv)` \
|
||||
`void ::testing::InitGoogleTest(int* argc, wchar_t** argv)` \
|
||||
`void ::testing::InitGoogleTest()`
|
||||
`void testing::InitGoogleTest(int* argc, char** argv)` \
|
||||
`void testing::InitGoogleTest(int* argc, wchar_t** argv)` \
|
||||
`void testing::InitGoogleTest()`
|
||||
|
||||
Initializes GoogleTest. This must be called before calling
|
||||
[`RUN_ALL_TESTS()`](#RUN_ALL_TESTS). In particular, it parses the command line
|
||||
@@ -1328,7 +1329,7 @@ platforms where there is no `argc`/`argv`.
|
||||
|
||||
### AddGlobalTestEnvironment {#AddGlobalTestEnvironment}
|
||||
|
||||
`Environment* ::testing::AddGlobalTestEnvironment(Environment* env)`
|
||||
`Environment* testing::AddGlobalTestEnvironment(Environment* env)`
|
||||
|
||||
Adds a test environment to the test program. Must be called before
|
||||
[`RUN_ALL_TESTS()`](#RUN_ALL_TESTS) is called. See
|
||||
@@ -1341,7 +1342,7 @@ See also [`Environment`](#Environment).
|
||||
|
||||
```cpp
|
||||
template <typename Factory>
|
||||
TestInfo* ::testing::RegisterTest(const char* test_suite_name, const char* test_name,
|
||||
TestInfo* testing::RegisterTest(const char* test_suite_name, const char* test_name,
|
||||
const char* type_param, const char* value_param,
|
||||
const char* file, int line, Factory factory)
|
||||
```
|
||||
@@ -1380,27 +1381,27 @@ an all-caps name.
|
||||
|
||||
### AssertionSuccess {#AssertionSuccess}
|
||||
|
||||
`AssertionResult ::testing::AssertionSuccess()`
|
||||
`AssertionResult testing::AssertionSuccess()`
|
||||
|
||||
Creates a successful assertion result. See
|
||||
[`AssertionResult`](#AssertionResult).
|
||||
|
||||
### AssertionFailure {#AssertionFailure}
|
||||
|
||||
`AssertionResult ::testing::AssertionFailure()`
|
||||
`AssertionResult testing::AssertionFailure()`
|
||||
|
||||
Creates a failed assertion result. Use the `<<` operator to store a failure
|
||||
message:
|
||||
|
||||
```cpp
|
||||
::testing::AssertionFailure() << "My failure message";
|
||||
testing::AssertionFailure() << "My failure message";
|
||||
```
|
||||
|
||||
See [`AssertionResult`](#AssertionResult).
|
||||
|
||||
### StaticAssertTypeEq {#StaticAssertTypeEq}
|
||||
|
||||
`::testing::StaticAssertTypeEq<T1, T2>()`
|
||||
`testing::StaticAssertTypeEq<T1, T2>()`
|
||||
|
||||
Compile-time assertion for type equality. Compiles if and only if `T1` and `T2`
|
||||
are the same type. The value it returns is irrelevant.
|
||||
@@ -1409,7 +1410,7 @@ See [Type Assertions](../advanced.md#type-assertions) for more information.
|
||||
|
||||
### PrintToString {#PrintToString}
|
||||
|
||||
`std::string ::testing::PrintToString(x)`
|
||||
`std::string testing::PrintToString(x)`
|
||||
|
||||
Prints any value `x` using GoogleTest's value printer.
|
||||
|
||||
@@ -1419,7 +1420,7 @@ for more information.
|
||||
|
||||
### PrintToStringParamName {#PrintToStringParamName}
|
||||
|
||||
`std::string ::testing::PrintToStringParamName(TestParamInfo<T>& info)`
|
||||
`std::string testing::PrintToStringParamName(TestParamInfo<T>& info)`
|
||||
|
||||
A built-in parameterized test name generator which returns the result of
|
||||
[`PrintToString`](#PrintToString) called on `info.param`. Does not work when the
|
||||
|
||||
+10
-19
@@ -36,8 +36,7 @@ endif()
|
||||
# as ${gmock_SOURCE_DIR} and to the root binary directory as
|
||||
# ${gmock_BINARY_DIR}.
|
||||
# Language "C" is required for find_package(Threads).
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_policy(SET CMP0048 NEW)
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)
|
||||
|
||||
if (COMMAND set_up_hermetic_build)
|
||||
@@ -101,18 +100,14 @@ else()
|
||||
target_link_libraries(gmock_main PUBLIC gmock)
|
||||
set_target_properties(gmock_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
endif()
|
||||
# If the CMake version supports it, attach header directory information
|
||||
# to the targets for when we are part of a parent build (ie being pulled
|
||||
# in via add_subdirectory() rather than being a standalone build).
|
||||
if (DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11")
|
||||
string(REPLACE ";" "$<SEMICOLON>" dirs "${gmock_build_include_dirs}")
|
||||
target_include_directories(gmock SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
target_include_directories(gmock_main SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
endif()
|
||||
|
||||
string(REPLACE ";" "$<SEMICOLON>" dirs "${gmock_build_include_dirs}")
|
||||
target_include_directories(gmock SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
target_include_directories(gmock_main SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -136,11 +131,7 @@ if (gmock_build_tests)
|
||||
enable_testing()
|
||||
|
||||
if (MINGW OR CYGWIN)
|
||||
if (CMAKE_VERSION VERSION_LESS "2.8.12")
|
||||
add_compile_options("-Wa,-mbig-obj")
|
||||
else()
|
||||
add_definitions("-Wa,-mbig-obj")
|
||||
endif()
|
||||
add_compile_options("-Wa,-mbig-obj")
|
||||
endif()
|
||||
|
||||
############################################################
|
||||
|
||||
@@ -146,10 +146,7 @@
|
||||
#include "gmock/internal/gmock-port.h"
|
||||
#include "gmock/internal/gmock-pp.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
namespace testing {
|
||||
|
||||
@@ -614,7 +611,7 @@ class DefaultValue {
|
||||
private:
|
||||
class ValueProducer {
|
||||
public:
|
||||
virtual ~ValueProducer() {}
|
||||
virtual ~ValueProducer() = default;
|
||||
virtual T Produce() = 0;
|
||||
};
|
||||
|
||||
@@ -702,8 +699,8 @@ class ActionInterface {
|
||||
typedef typename internal::Function<F>::Result Result;
|
||||
typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
|
||||
|
||||
ActionInterface() {}
|
||||
virtual ~ActionInterface() {}
|
||||
ActionInterface() = default;
|
||||
virtual ~ActionInterface() = default;
|
||||
|
||||
// Performs the action. This method is not const, as in general an
|
||||
// action can have side effects and be stateful. For example, a
|
||||
@@ -752,7 +749,7 @@ class Action<R(Args...)> {
|
||||
|
||||
// Constructs a null Action. Needed for storing Action objects in
|
||||
// STL containers.
|
||||
Action() {}
|
||||
Action() = default;
|
||||
|
||||
// Construct an Action from a specified callable.
|
||||
// This cannot take std::function directly, because then Action would not be
|
||||
@@ -1276,7 +1273,7 @@ class AssignAction {
|
||||
const T2 value_;
|
||||
};
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
// Implements the SetErrnoAndReturn action to simulate return from
|
||||
// various system calls and libc functions.
|
||||
@@ -1420,19 +1417,19 @@ struct WithArgsAction {
|
||||
// providing a call operator because even with a particular set of arguments
|
||||
// they don't have a fixed return type.
|
||||
|
||||
template <typename R, typename... Args,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<
|
||||
InnerAction,
|
||||
// Unfortunately we can't use the InnerSignature alias here;
|
||||
// MSVC complains about the I parameter pack not being
|
||||
// expanded (error C3520) despite it being expanded in the
|
||||
// type alias.
|
||||
// TupleElement is also an MSVC workaround.
|
||||
// See its definition for details.
|
||||
OnceAction<R(internal::TupleElement<
|
||||
I, std::tuple<Args...>>...)>>::value,
|
||||
int>::type = 0>
|
||||
template <
|
||||
typename R, typename... Args,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<InnerAction,
|
||||
// Unfortunately we can't use the InnerSignature
|
||||
// alias here; MSVC complains about the I
|
||||
// parameter pack not being expanded (error C3520)
|
||||
// despite it being expanded in the type alias.
|
||||
// TupleElement is also an MSVC workaround.
|
||||
// See its definition for details.
|
||||
OnceAction<R(internal::TupleElement<
|
||||
I, std::tuple<Args...>>...)>>::value,
|
||||
int>::type = 0>
|
||||
operator OnceAction<R(Args...)>() && { // NOLINT
|
||||
struct OA {
|
||||
OnceAction<InnerSignature<R, Args...>> inner_action;
|
||||
@@ -1447,19 +1444,19 @@ struct WithArgsAction {
|
||||
return OA{std::move(inner_action)};
|
||||
}
|
||||
|
||||
template <typename R, typename... Args,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<
|
||||
const InnerAction&,
|
||||
// Unfortunately we can't use the InnerSignature alias here;
|
||||
// MSVC complains about the I parameter pack not being
|
||||
// expanded (error C3520) despite it being expanded in the
|
||||
// type alias.
|
||||
// TupleElement is also an MSVC workaround.
|
||||
// See its definition for details.
|
||||
Action<R(internal::TupleElement<
|
||||
I, std::tuple<Args...>>...)>>::value,
|
||||
int>::type = 0>
|
||||
template <
|
||||
typename R, typename... Args,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<const InnerAction&,
|
||||
// Unfortunately we can't use the InnerSignature
|
||||
// alias here; MSVC complains about the I
|
||||
// parameter pack not being expanded (error C3520)
|
||||
// despite it being expanded in the type alias.
|
||||
// TupleElement is also an MSVC workaround.
|
||||
// See its definition for details.
|
||||
Action<R(internal::TupleElement<
|
||||
I, std::tuple<Args...>>...)>>::value,
|
||||
int>::type = 0>
|
||||
operator Action<R(Args...)>() const { // NOLINT
|
||||
Action<InnerSignature<R, Args...>> converted(inner_action);
|
||||
|
||||
@@ -1929,7 +1926,7 @@ PolymorphicAction<internal::AssignAction<T1, T2>> Assign(T1* ptr, T2 val) {
|
||||
return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val));
|
||||
}
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
// Creates an action that sets errno and returns the appropriate error.
|
||||
template <typename T>
|
||||
@@ -2295,8 +2292,6 @@ template <typename F, typename Impl>
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace testing {
|
||||
// The implementation of a cardinality.
|
||||
class CardinalityInterface {
|
||||
public:
|
||||
virtual ~CardinalityInterface() {}
|
||||
virtual ~CardinalityInterface() = default;
|
||||
|
||||
// Conservative estimate on the lower/upper bound of the number of
|
||||
// calls allowed.
|
||||
@@ -92,7 +92,7 @@ class GTEST_API_ Cardinality {
|
||||
public:
|
||||
// Constructs a null cardinality. Needed for storing Cardinality
|
||||
// objects in STL containers.
|
||||
Cardinality() {}
|
||||
Cardinality() = default;
|
||||
|
||||
// Constructs a Cardinality from its implementation.
|
||||
explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {}
|
||||
|
||||
@@ -180,8 +180,9 @@ using internal::FunctionMocker;
|
||||
_Signature)>::Result \
|
||||
GMOCK_INTERNAL_EXPAND(_CallType) \
|
||||
_MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \
|
||||
GMOCK_PP_IF(_Constness, const, ) _RefSpec _NoexceptSpec \
|
||||
GMOCK_PP_IF(_Override, override, ) GMOCK_PP_IF(_Final, final, ) { \
|
||||
GMOCK_PP_IF(_Constness, const, ) \
|
||||
_RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \
|
||||
GMOCK_PP_IF(_Final, final, ) { \
|
||||
GMOCK_MOCKER_(_N, _Constness, _MethodName) \
|
||||
.SetOwnerAndName(this, #_MethodName); \
|
||||
return GMOCK_MOCKER_(_N, _Constness, _MethodName) \
|
||||
|
||||
@@ -257,6 +257,8 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <exception>
|
||||
#include <functional>
|
||||
#include <initializer_list>
|
||||
#include <ios>
|
||||
#include <iterator>
|
||||
@@ -562,7 +564,7 @@ namespace internal {
|
||||
// If the explanation is not empty, prints it to the ostream.
|
||||
inline void PrintIfNotEmpty(const std::string& explanation,
|
||||
::std::ostream* os) {
|
||||
if (explanation != "" && os != nullptr) {
|
||||
if (!explanation.empty() && os != nullptr) {
|
||||
*os << ", " << explanation;
|
||||
}
|
||||
}
|
||||
@@ -1199,27 +1201,27 @@ class PairMatchBase {
|
||||
};
|
||||
};
|
||||
|
||||
class Eq2Matcher : public PairMatchBase<Eq2Matcher, AnyEq> {
|
||||
class Eq2Matcher : public PairMatchBase<Eq2Matcher, std::equal_to<>> {
|
||||
public:
|
||||
static const char* Desc() { return "an equal pair"; }
|
||||
};
|
||||
class Ne2Matcher : public PairMatchBase<Ne2Matcher, AnyNe> {
|
||||
class Ne2Matcher : public PairMatchBase<Ne2Matcher, std::not_equal_to<>> {
|
||||
public:
|
||||
static const char* Desc() { return "an unequal pair"; }
|
||||
};
|
||||
class Lt2Matcher : public PairMatchBase<Lt2Matcher, AnyLt> {
|
||||
class Lt2Matcher : public PairMatchBase<Lt2Matcher, std::less<>> {
|
||||
public:
|
||||
static const char* Desc() { return "a pair where the first < the second"; }
|
||||
};
|
||||
class Gt2Matcher : public PairMatchBase<Gt2Matcher, AnyGt> {
|
||||
class Gt2Matcher : public PairMatchBase<Gt2Matcher, std::greater<>> {
|
||||
public:
|
||||
static const char* Desc() { return "a pair where the first > the second"; }
|
||||
};
|
||||
class Le2Matcher : public PairMatchBase<Le2Matcher, AnyLe> {
|
||||
class Le2Matcher : public PairMatchBase<Le2Matcher, std::less_equal<>> {
|
||||
public:
|
||||
static const char* Desc() { return "a pair where the first <= the second"; }
|
||||
};
|
||||
class Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {
|
||||
class Ge2Matcher : public PairMatchBase<Ge2Matcher, std::greater_equal<>> {
|
||||
public:
|
||||
static const char* Desc() { return "a pair where the first >= the second"; }
|
||||
};
|
||||
@@ -1473,6 +1475,7 @@ class SomeOfArrayMatcher {
|
||||
operator Matcher<U>() const { // NOLINT
|
||||
using RawU = typename std::decay<U>::type;
|
||||
std::vector<Matcher<RawU>> matchers;
|
||||
matchers.reserve(matchers_.size());
|
||||
for (const auto& matcher : matchers_) {
|
||||
matchers.push_back(MatcherCast<RawU>(matcher));
|
||||
}
|
||||
@@ -2964,7 +2967,7 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {
|
||||
const bool match = inner_matcher_.MatchAndExplain(
|
||||
pair_getters::First(key_value, Rank0()), &inner_listener);
|
||||
const std::string explanation = inner_listener.str();
|
||||
if (explanation != "") {
|
||||
if (!explanation.empty()) {
|
||||
*listener << "whose first field is a value " << explanation;
|
||||
}
|
||||
return match;
|
||||
@@ -3111,12 +3114,12 @@ class PairMatcherImpl : public MatcherInterface<PairType> {
|
||||
const std::string& second_explanation,
|
||||
MatchResultListener* listener) const {
|
||||
*listener << "whose both fields match";
|
||||
if (first_explanation != "") {
|
||||
if (!first_explanation.empty()) {
|
||||
*listener << ", where the first field is a value " << first_explanation;
|
||||
}
|
||||
if (second_explanation != "") {
|
||||
if (!second_explanation.empty()) {
|
||||
*listener << ", ";
|
||||
if (first_explanation != "") {
|
||||
if (!first_explanation.empty()) {
|
||||
*listener << "and ";
|
||||
} else {
|
||||
*listener << "where ";
|
||||
@@ -3317,8 +3320,8 @@ class FieldsAreMatcherImpl<Struct, IndexSequence<I...>>
|
||||
std::vector<StringMatchResultListener> inner_listener(sizeof...(I));
|
||||
|
||||
VariadicExpand(
|
||||
{failed_pos == ~size_t{}&& !std::get<I>(matchers_).MatchAndExplain(
|
||||
std::get<I>(tuple), &inner_listener[I])
|
||||
{failed_pos == ~size_t{} && !std::get<I>(matchers_).MatchAndExplain(
|
||||
std::get<I>(tuple), &inner_listener[I])
|
||||
? failed_pos = I
|
||||
: 0 ...});
|
||||
if (failed_pos != ~size_t{}) {
|
||||
@@ -5474,8 +5477,7 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
|
||||
inline name##Matcher GMOCK_INTERNAL_WARNING_PUSH() \
|
||||
GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-function") \
|
||||
GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \
|
||||
name \
|
||||
GMOCK_INTERNAL_WARNING_POP()() { \
|
||||
name GMOCK_INTERNAL_WARNING_POP()() { \
|
||||
return {}; \
|
||||
} \
|
||||
template <typename arg_type> \
|
||||
@@ -5543,7 +5545,8 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
|
||||
\
|
||||
private: \
|
||||
::std::string FormatDescription(bool negation) const { \
|
||||
::std::string gmock_description = (description); \
|
||||
::std::string gmock_description; \
|
||||
gmock_description = (description); \
|
||||
if (!gmock_description.empty()) { \
|
||||
return gmock_description; \
|
||||
} \
|
||||
|
||||
@@ -526,9 +526,10 @@
|
||||
GMOCK_INTERNAL_LIST_##value_params)){}) \
|
||||
GMOCK_ACTION_CLASS_(name, value_params)(const GMOCK_ACTION_CLASS_( \
|
||||
name, value_params) &) noexcept GMOCK_INTERNAL_DEFN_COPY_ \
|
||||
##value_params GMOCK_ACTION_CLASS_(name, value_params)( \
|
||||
GMOCK_ACTION_CLASS_(name, value_params) &&) noexcept \
|
||||
GMOCK_INTERNAL_DEFN_COPY_##value_params template <typename F> \
|
||||
##value_params \
|
||||
GMOCK_ACTION_CLASS_(name, value_params)(GMOCK_ACTION_CLASS_( \
|
||||
name, value_params) &&) noexcept GMOCK_INTERNAL_DEFN_COPY_ \
|
||||
##value_params template <typename F> \
|
||||
operator ::testing::Action<F>() const { \
|
||||
return GMOCK_PP_IF( \
|
||||
GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
|
||||
@@ -582,10 +583,7 @@ namespace testing {
|
||||
// the macro definition, as the warnings are generated when the macro
|
||||
// is expanded and macro expansion cannot contain #pragma. Therefore
|
||||
// we suppress them here.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
namespace internal {
|
||||
|
||||
@@ -602,13 +600,13 @@ template <std::size_t index, typename... Params>
|
||||
struct InvokeArgumentAction {
|
||||
template <typename... Args,
|
||||
typename = typename std::enable_if<(index < sizeof...(Args))>::type>
|
||||
auto operator()(Args&&... args) const -> decltype(internal::InvokeArgument(
|
||||
auto operator()(Args &&...args) const -> decltype(internal::InvokeArgument(
|
||||
std::get<index>(std::forward_as_tuple(std::forward<Args>(args)...)),
|
||||
std::declval<const Params&>()...)) {
|
||||
internal::FlatTuple<Args&&...> args_tuple(FlatTupleConstructTag{},
|
||||
std::forward<Args>(args)...);
|
||||
return params.Apply([&](const Params&... unpacked_params) {
|
||||
auto&& callable = args_tuple.template Get<index>();
|
||||
std::declval<const Params &>()...)) {
|
||||
internal::FlatTuple<Args &&...> args_tuple(FlatTupleConstructTag{},
|
||||
std::forward<Args>(args)...);
|
||||
return params.Apply([&](const Params &...unpacked_params) {
|
||||
auto &&callable = args_tuple.template Get<index>();
|
||||
return internal::InvokeArgument(
|
||||
std::forward<decltype(callable)>(callable), unpacked_params...);
|
||||
});
|
||||
@@ -648,14 +646,12 @@ struct InvokeArgumentAction {
|
||||
// later.
|
||||
template <std::size_t index, typename... Params>
|
||||
internal::InvokeArgumentAction<index, typename std::decay<Params>::type...>
|
||||
InvokeArgument(Params&&... params) {
|
||||
InvokeArgument(Params &&...params) {
|
||||
return {internal::FlatTuple<typename std::decay<Params>::type...>(
|
||||
internal::FlatTupleConstructTag{}, std::forward<Params>(params)...)};
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
} // namespace testing
|
||||
|
||||
|
||||
@@ -49,14 +49,11 @@ namespace testing {
|
||||
|
||||
// Silence C4100 (unreferenced formal
|
||||
// parameter) for MSVC
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#if (_MSC_VER == 1900)
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
// and silence C4800 (C4800: 'int *const ': forcing value
|
||||
// to bool 'true' or 'false') for MSVC 14
|
||||
#pragma warning(disable : 4800)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800)
|
||||
#endif
|
||||
|
||||
namespace internal {
|
||||
@@ -113,9 +110,10 @@ MATCHER(IsFalse, negation ? "is true" : "is false") {
|
||||
return !static_cast<bool>(arg);
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4800
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
} // namespace testing
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ constexpr bool HasStrictnessModifier() {
|
||||
// deregistration. This guarantees that MockClass's constructor and destructor
|
||||
// run with the same level of strictness as its instance methods.
|
||||
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW && \
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MINGW) && \
|
||||
(defined(_MSC_VER) || defined(__clang__))
|
||||
// We need to mark these classes with this declspec to ensure that
|
||||
// the empty base class optimization is performed.
|
||||
|
||||
@@ -204,6 +204,9 @@ class GTEST_API_ UntypedFunctionMockerBase {
|
||||
|
||||
using UntypedExpectations = std::vector<std::shared_ptr<ExpectationBase>>;
|
||||
|
||||
struct UninterestingCallCleanupHandler;
|
||||
struct FailureCleanupHandler;
|
||||
|
||||
// Returns an Expectation object that references and co-owns exp,
|
||||
// which must be an expectation on this mock function.
|
||||
Expectation GetHandleOf(ExpectationBase* exp);
|
||||
@@ -563,7 +566,7 @@ class ExpectationSet {
|
||||
typedef Expectation::Set::value_type value_type;
|
||||
|
||||
// Constructs an empty set.
|
||||
ExpectationSet() {}
|
||||
ExpectationSet() = default;
|
||||
|
||||
// This single-argument ctor must not be explicit, in order to support the
|
||||
// ExpectationSet es = EXPECT_CALL(...);
|
||||
@@ -1396,6 +1399,41 @@ class Cleanup final {
|
||||
std::function<void()> f_;
|
||||
};
|
||||
|
||||
struct UntypedFunctionMockerBase::UninterestingCallCleanupHandler {
|
||||
CallReaction reaction;
|
||||
std::stringstream& ss;
|
||||
|
||||
~UninterestingCallCleanupHandler() {
|
||||
ReportUninterestingCall(reaction, ss.str());
|
||||
}
|
||||
};
|
||||
|
||||
struct UntypedFunctionMockerBase::FailureCleanupHandler {
|
||||
std::stringstream& ss;
|
||||
std::stringstream& why;
|
||||
std::stringstream& loc;
|
||||
const ExpectationBase* untyped_expectation;
|
||||
bool found;
|
||||
bool is_excessive;
|
||||
|
||||
~FailureCleanupHandler() {
|
||||
ss << "\n" << why.str();
|
||||
|
||||
if (!found) {
|
||||
// No expectation matches this call - reports a failure.
|
||||
Expect(false, nullptr, -1, ss.str());
|
||||
} else if (is_excessive) {
|
||||
// We had an upper-bound violation and the failure message is in ss.
|
||||
Expect(false, untyped_expectation->file(), untyped_expectation->line(),
|
||||
ss.str());
|
||||
} else {
|
||||
// We had an expected call and the matching expectation is
|
||||
// described in ss.
|
||||
Log(kInfo, loc.str() + ss.str(), 2);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename F>
|
||||
class FunctionMocker;
|
||||
|
||||
@@ -1408,7 +1446,7 @@ class FunctionMocker<R(Args...)> final : public UntypedFunctionMockerBase {
|
||||
using ArgumentTuple = std::tuple<Args...>;
|
||||
using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;
|
||||
|
||||
FunctionMocker() {}
|
||||
FunctionMocker() = default;
|
||||
|
||||
// There is no generally useful and implementable semantics of
|
||||
// copying a mock object, so copying a mock is usually a user error.
|
||||
@@ -1794,8 +1832,15 @@ R FunctionMocker<R(Args...)>::InvokeWith(ArgumentTuple&& args)
|
||||
//
|
||||
// We use RAII to do the latter in case R is void or a non-moveable type. In
|
||||
// either case we can't assign it to a local variable.
|
||||
const Cleanup report_uninteresting_call(
|
||||
[&] { ReportUninterestingCall(reaction, ss.str()); });
|
||||
//
|
||||
// Note that std::bind() is essential here.
|
||||
// We *don't* use any local callback types (like lambdas).
|
||||
// Doing so slows down compilation dramatically because the *constructor* of
|
||||
// std::function<T> is re-instantiated with different template
|
||||
// parameters each time.
|
||||
const UninterestingCallCleanupHandler report_uninteresting_call = {
|
||||
reaction, ss
|
||||
};
|
||||
|
||||
return PerformActionAndPrintResult(nullptr, std::move(args), ss.str(), ss);
|
||||
}
|
||||
@@ -1839,22 +1884,14 @@ R FunctionMocker<R(Args...)>::InvokeWith(ArgumentTuple&& args)
|
||||
//
|
||||
// We use RAII to do the latter in case R is void or a non-moveable type. In
|
||||
// either case we can't assign it to a local variable.
|
||||
const Cleanup handle_failures([&] {
|
||||
ss << "\n" << why.str();
|
||||
|
||||
if (!found) {
|
||||
// No expectation matches this call - reports a failure.
|
||||
Expect(false, nullptr, -1, ss.str());
|
||||
} else if (is_excessive) {
|
||||
// We had an upper-bound violation and the failure message is in ss.
|
||||
Expect(false, untyped_expectation->file(), untyped_expectation->line(),
|
||||
ss.str());
|
||||
} else {
|
||||
// We had an expected call and the matching expectation is
|
||||
// described in ss.
|
||||
Log(kInfo, loc.str() + ss.str(), 2);
|
||||
}
|
||||
});
|
||||
//
|
||||
// Note that we *don't* use any local callback types (like lambdas) here.
|
||||
// Doing so slows down compilation dramatically because the *constructor* of
|
||||
// std::function<T> is re-instantiated with different template
|
||||
// parameters each time.
|
||||
const FailureCleanupHandler handle_failures = {
|
||||
ss, why, loc, untyped_expectation, found, is_excessive
|
||||
};
|
||||
|
||||
return PerformActionAndPrintResult(untyped_action, std::move(args), ss.str(),
|
||||
ss);
|
||||
|
||||
@@ -58,11 +58,7 @@ namespace internal {
|
||||
|
||||
// Silence MSVC C4100 (unreferenced formal parameter) and
|
||||
// C4805('==': unsafe mix of type 'const int' and type 'const bool')
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#pragma warning(disable : 4805)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4805)
|
||||
|
||||
// Joins a vector of strings as if they are fields of a tuple; returns
|
||||
// the joined string.
|
||||
@@ -228,7 +224,7 @@ class FailureReporterInterface {
|
||||
// The type of a failure (either non-fatal or fatal).
|
||||
enum FailureType { kNonfatal, kFatal };
|
||||
|
||||
virtual ~FailureReporterInterface() {}
|
||||
virtual ~FailureReporterInterface() = default;
|
||||
|
||||
// Reports a failure that occurred at the given source file location.
|
||||
virtual void ReportFailure(FailureType type, const char* file, int line,
|
||||
@@ -315,7 +311,8 @@ GTEST_API_ WithoutMatchers GetWithoutMatchers();
|
||||
// crashes).
|
||||
template <typename T>
|
||||
inline T Invalid() {
|
||||
Assert(false, "", -1, "Internal error: attempt to return invalid value");
|
||||
Assert(/*condition=*/false, /*file=*/"", /*line=*/-1,
|
||||
"Internal error: attempt to return invalid value");
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
__builtin_unreachable();
|
||||
#elif defined(_MSC_VER)
|
||||
@@ -468,8 +465,10 @@ struct Function<R(Args...)> {
|
||||
using MakeResultIgnoredValue = IgnoredValue(Args...);
|
||||
};
|
||||
|
||||
#ifdef GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
|
||||
template <typename R, typename... Args>
|
||||
constexpr size_t Function<R(Args...)>::ArgumentCount;
|
||||
#endif
|
||||
|
||||
// Workaround for MSVC error C2039: 'type': is not a member of 'std'
|
||||
// when std::tuple_element is used.
|
||||
@@ -480,9 +479,7 @@ using TupleElement = typename std::tuple_element<I, T>::type;
|
||||
|
||||
bool Base64Unescape(const std::string& encoded, std::string* decoded);
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 4805
|
||||
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
#include "gmock/internal/custom/gmock-port.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
#include "absl/flags/declare.h"
|
||||
#include "absl/flags/flag.h"
|
||||
#endif
|
||||
@@ -73,7 +73,7 @@
|
||||
#define GMOCK_FLAG(name) FLAGS_gmock_##name
|
||||
|
||||
// Pick a command line flags implementation.
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
|
||||
// Macros for defining flags.
|
||||
#define GMOCK_DEFINE_bool_(name, default_val, doc) \
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <cctype>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <ostream> // NOLINT
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -87,7 +88,7 @@ GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {
|
||||
(!IsDigit(prev_char) && IsDigit(*p));
|
||||
|
||||
if (IsAlNum(*p)) {
|
||||
if (starts_new_word && result != "") result += ' ';
|
||||
if (starts_new_word && !result.empty()) result += ' ';
|
||||
result += ToLower(*p);
|
||||
}
|
||||
}
|
||||
@@ -198,6 +199,10 @@ GTEST_API_ void IllegalDoDefault(const char* file, int line) {
|
||||
"the variable in various places.");
|
||||
}
|
||||
|
||||
constexpr char UndoWebSafeEncoding(char c) {
|
||||
return c == '-' ? '+' : c == '_' ? '/' : c;
|
||||
}
|
||||
|
||||
constexpr char UnBase64Impl(char c, const char* const base64, char carry) {
|
||||
return *base64 == 0 ? static_cast<char>(65)
|
||||
: *base64 == c
|
||||
@@ -208,7 +213,8 @@ constexpr char UnBase64Impl(char c, const char* const base64, char carry) {
|
||||
template <size_t... I>
|
||||
constexpr std::array<char, 256> UnBase64Impl(IndexSequence<I...>,
|
||||
const char* const base64) {
|
||||
return {{UnBase64Impl(static_cast<char>(I), base64, 0)...}};
|
||||
return {
|
||||
{UnBase64Impl(UndoWebSafeEncoding(static_cast<char>(I)), base64, 0)...}};
|
||||
}
|
||||
|
||||
constexpr std::array<char, 256> UnBase64(const char* const base64) {
|
||||
|
||||
@@ -53,7 +53,7 @@ GTEST_API_ std::string FormatMatcherDescription(
|
||||
bool negation, const char* matcher_name,
|
||||
const std::vector<const char*>& param_names, const Strings& param_values) {
|
||||
std::string result = ConvertIdentifierNameToWords(matcher_name);
|
||||
if (param_values.size() >= 1) {
|
||||
if (!param_values.empty()) {
|
||||
result += " " + JoinAsKeyValueTuple(param_names, param_values);
|
||||
}
|
||||
return negation ? "not (" + result + ")" : result;
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
@@ -48,20 +49,17 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
|
||||
#if defined(GTEST_OS_CYGWIN) || defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC)
|
||||
#include <unistd.h> // NOLINT
|
||||
#endif
|
||||
#if GTEST_OS_QURT
|
||||
#ifdef GTEST_OS_QURT
|
||||
#include <qurt_event.h>
|
||||
#endif
|
||||
|
||||
// Silence C4800 (C4800: 'int *const ': forcing value
|
||||
// to bool 'true' or 'false') for MSVC 15
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER == 1900
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4800)
|
||||
#endif
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800)
|
||||
#endif
|
||||
|
||||
namespace testing {
|
||||
@@ -98,7 +96,7 @@ ExpectationBase::ExpectationBase(const char* a_file, int a_line,
|
||||
action_count_checked_(false) {}
|
||||
|
||||
// Destructs an ExpectationBase object.
|
||||
ExpectationBase::~ExpectationBase() {}
|
||||
ExpectationBase::~ExpectationBase() = default;
|
||||
|
||||
// Explicitly specifies the cardinality of this expectation. Used by
|
||||
// the subclasses to implement the .Times() clause.
|
||||
@@ -300,7 +298,7 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {
|
||||
"See "
|
||||
"https://github.com/google/googletest/blob/main/docs/"
|
||||
"gmock_cook_book.md#"
|
||||
"knowing-when-to-expect for details.\n",
|
||||
"knowing-when-to-expect-useoncall for details.\n",
|
||||
stack_frames_to_skip);
|
||||
break;
|
||||
default: // FAIL
|
||||
@@ -311,7 +309,7 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {
|
||||
UntypedFunctionMockerBase::UntypedFunctionMockerBase()
|
||||
: mock_obj_(nullptr), name_("") {}
|
||||
|
||||
UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}
|
||||
UntypedFunctionMockerBase::~UntypedFunctionMockerBase() = default;
|
||||
|
||||
// Sets the mock object this mock method belongs to, and registers
|
||||
// this information in the global mock registry. Will be called
|
||||
@@ -506,7 +504,7 @@ class MockObjectRegistry {
|
||||
std::cout << internal::FormatFileLocation(state.first_used_file,
|
||||
state.first_used_line);
|
||||
std::cout << " ERROR: this mock object";
|
||||
if (state.first_used_test != "") {
|
||||
if (!state.first_used_test.empty()) {
|
||||
std::cout << " (used in test " << state.first_used_test_suite << "."
|
||||
<< state.first_used_test << ")";
|
||||
}
|
||||
@@ -529,7 +527,7 @@ class MockObjectRegistry {
|
||||
// RUN_ALL_TESTS() has already returned when this destructor is
|
||||
// called. Therefore we cannot use the normal Google Test
|
||||
// failure reporting mechanism.
|
||||
#if GTEST_OS_QURT
|
||||
#ifdef GTEST_OS_QURT
|
||||
qurt_exception_raise_fatal();
|
||||
#else
|
||||
_exit(1); // We cannot call exit() as it is not reentrant and
|
||||
@@ -748,13 +746,13 @@ void Mock::ClearDefaultActionsLocked(void* mock_obj)
|
||||
// needed by VerifyAndClearExpectationsLocked().
|
||||
}
|
||||
|
||||
Expectation::Expectation() {}
|
||||
Expectation::Expectation() = default;
|
||||
|
||||
Expectation::Expectation(
|
||||
const std::shared_ptr<internal::ExpectationBase>& an_expectation_base)
|
||||
: expectation_base_(an_expectation_base) {}
|
||||
|
||||
Expectation::~Expectation() {}
|
||||
Expectation::~Expectation() = default;
|
||||
|
||||
// Adds an expectation to a sequence.
|
||||
void Sequence::AddExpectation(const Expectation& expectation) const {
|
||||
@@ -788,8 +786,6 @@ InSequence::~InSequence() {
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER == 1900
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4800
|
||||
#endif
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "gmock/internal/gmock-port.h"
|
||||
|
||||
GMOCK_DEFINE_bool_(catch_leaked_mocks, true,
|
||||
|
||||
@@ -32,8 +32,9 @@
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#if GTEST_OS_ESP8266 || GTEST_OS_ESP32
|
||||
#if GTEST_OS_ESP8266
|
||||
#if defined(GTEST_OS_ESP8266) || defined(GTEST_OS_ESP32) || \
|
||||
(defined(GTEST_OS_NRF52) && defined(ARDUINO))
|
||||
#ifdef GTEST_OS_ESP8266
|
||||
extern "C" {
|
||||
#endif
|
||||
void setup() {
|
||||
@@ -43,7 +44,7 @@ void setup() {
|
||||
testing::InitGoogleMock();
|
||||
}
|
||||
void loop() { RUN_ALL_TESTS(); }
|
||||
#if GTEST_OS_ESP8266
|
||||
#ifdef GTEST_OS_ESP8266
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -55,7 +56,7 @@ void loop() { RUN_ALL_TESTS(); }
|
||||
// Windows. See the following link to track the current status of this bug:
|
||||
// https://web.archive.org/web/20170912203238/connect.microsoft.com/VisualStudio/feedback/details/394464/wmain-link-error-in-the-static-library
|
||||
// // NOLINT
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
#include <tchar.h> // NOLINT
|
||||
|
||||
GTEST_API_ int _tmain(int argc, TCHAR** argv) {
|
||||
|
||||
@@ -31,33 +31,33 @@
|
||||
//
|
||||
// This file tests the built-in actions.
|
||||
|
||||
// Silence C4100 (unreferenced formal parameter) and C4503 (decorated name
|
||||
// length exceeded) for MSVC.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#pragma warning(disable : 4503)
|
||||
#if _MSC_VER == 1900
|
||||
// and silence C4800 (C4800: 'int *const ': forcing value
|
||||
// to bool 'true' or 'false') for MSVC 15
|
||||
#pragma warning(disable : 4800)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "gmock/gmock-actions.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gmock/internal/gmock-port.h"
|
||||
#include "gtest/gtest-spi.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
// Silence C4100 (unreferenced formal parameter) and C4503 (decorated name
|
||||
// length exceeded) for MSVC.
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4503)
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
// and silence C4800 (C4800: 'int *const ': forcing value
|
||||
// to bool 'true' or 'false') for MSVC 15
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800)
|
||||
#endif
|
||||
|
||||
namespace testing {
|
||||
namespace {
|
||||
@@ -222,7 +222,8 @@ TEST(TypeTraits, IsInvocableRV) {
|
||||
// In C++17 and above, where it's guaranteed that functions can return
|
||||
// non-moveable objects, everything should work fine for non-moveable rsult
|
||||
// types too.
|
||||
#if defined(__cplusplus) && __cplusplus >= 201703L
|
||||
#if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
|
||||
GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
{
|
||||
struct NonMoveable {
|
||||
NonMoveable() = default;
|
||||
@@ -448,7 +449,7 @@ TEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) {
|
||||
EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
|
||||
EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == nullptr);
|
||||
DefaultValue<std::unique_ptr<int>>::SetFactory(
|
||||
[] { return std::unique_ptr<int>(new int(42)); });
|
||||
[] { return std::make_unique<int>(42); });
|
||||
EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
|
||||
std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get();
|
||||
EXPECT_EQ(42, *i);
|
||||
@@ -986,7 +987,7 @@ TEST(ReturnRoundRobinTest, WorksForVector) {
|
||||
|
||||
class MockClass {
|
||||
public:
|
||||
MockClass() {}
|
||||
MockClass() = default;
|
||||
|
||||
MOCK_METHOD1(IntFunc, int(bool flag)); // NOLINT
|
||||
MOCK_METHOD0(Foo, MyNonDefaultConstructible());
|
||||
@@ -1410,7 +1411,7 @@ TEST(DoAll, ProvidesLvalueReferencesToInitialActions) {
|
||||
void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
|
||||
};
|
||||
|
||||
MockFunction<void(Obj &&)> mock;
|
||||
MockFunction<void(Obj&&)> mock;
|
||||
EXPECT_CALL(mock, Call)
|
||||
.WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}))
|
||||
.WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
|
||||
@@ -1438,7 +1439,7 @@ TEST(DoAll, ProvidesLvalueReferencesToInitialActions) {
|
||||
void operator()(Obj&) && {}
|
||||
};
|
||||
|
||||
MockFunction<void(Obj &&)> mock;
|
||||
MockFunction<void(Obj&&)> mock;
|
||||
EXPECT_CALL(mock, Call)
|
||||
.WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
|
||||
|
||||
@@ -1596,7 +1597,7 @@ TEST(WithArgsTest, RefQualifiedInnerAction) {
|
||||
EXPECT_EQ(19, mock.AsStdFunction()(0, 17));
|
||||
}
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
class SetErrnoAndReturnTest : public testing::Test {
|
||||
protected:
|
||||
@@ -1755,9 +1756,7 @@ TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
|
||||
delete c;
|
||||
}
|
||||
|
||||
std::unique_ptr<int> UniquePtrSource() {
|
||||
return std::unique_ptr<int>(new int(19));
|
||||
}
|
||||
std::unique_ptr<int> UniquePtrSource() { return std::make_unique<int>(19); }
|
||||
|
||||
std::vector<std::unique_ptr<int>> VectorUniquePtrSource() {
|
||||
std::vector<std::unique_ptr<int>> out;
|
||||
@@ -1806,7 +1805,7 @@ TEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) {
|
||||
|
||||
// Check default value
|
||||
DefaultValue<std::unique_ptr<int>>::SetFactory(
|
||||
[] { return std::unique_ptr<int>(new int(42)); });
|
||||
[] { return std::make_unique<int>(42); });
|
||||
EXPECT_EQ(42, *mock.MakeUnique());
|
||||
|
||||
EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource));
|
||||
@@ -1826,7 +1825,7 @@ TEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) {
|
||||
|
||||
TEST(MockMethodTest, CanTakeMoveOnlyValue) {
|
||||
MockClass mock;
|
||||
auto make = [](int i) { return std::unique_ptr<int>(new int(i)); };
|
||||
auto make = [](int i) { return std::make_unique<int>(i); };
|
||||
|
||||
EXPECT_CALL(mock, TakeUnique(_)).WillRepeatedly([](std::unique_ptr<int> i) {
|
||||
return *i;
|
||||
@@ -2057,9 +2056,7 @@ struct Double {
|
||||
}
|
||||
};
|
||||
|
||||
std::unique_ptr<int> UniqueInt(int i) {
|
||||
return std::unique_ptr<int>(new int(i));
|
||||
}
|
||||
std::unique_ptr<int> UniqueInt(int i) { return std::make_unique<int>(i); }
|
||||
|
||||
TEST(FunctorActionTest, ActionFromFunction) {
|
||||
Action<int(int, int&, int*)> a = &Add;
|
||||
@@ -2165,3 +2162,8 @@ TEST(ActionMacro, LargeArity) {
|
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1900)
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4800
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 4503
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
//
|
||||
// This file tests the built-in cardinalities.
|
||||
|
||||
#include <ostream>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest-spi.h"
|
||||
#include "gtest/gtest.h"
|
||||
@@ -50,7 +52,7 @@ using testing::MakeCardinality;
|
||||
|
||||
class MockFoo {
|
||||
public:
|
||||
MockFoo() {}
|
||||
MockFoo() = default;
|
||||
MOCK_METHOD0(Bar, int()); // NOLINT
|
||||
|
||||
private:
|
||||
|
||||
@@ -27,18 +27,15 @@
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Silence C4503 (decorated name length exceeded) for MSVC.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4503)
|
||||
#endif
|
||||
|
||||
// Google Mock - a framework for writing C++ mock classes.
|
||||
//
|
||||
// This file tests the function mocker classes.
|
||||
#include "gmock/gmock-function-mocker.h"
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
// Silence C4503 (decorated name length exceeded) for MSVC.
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4503)
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
|
||||
// we are getting compiler errors if we use basetyps.h, hence including
|
||||
// objbase.h for definition of STDMETHOD.
|
||||
@@ -73,7 +70,7 @@ using testing::TypedEq;
|
||||
template <typename T>
|
||||
class TemplatedCopyable {
|
||||
public:
|
||||
TemplatedCopyable() {}
|
||||
TemplatedCopyable() = default;
|
||||
|
||||
template <typename U>
|
||||
TemplatedCopyable(const U& other) {} // NOLINT
|
||||
@@ -81,7 +78,7 @@ class TemplatedCopyable {
|
||||
|
||||
class FooInterface {
|
||||
public:
|
||||
virtual ~FooInterface() {}
|
||||
virtual ~FooInterface() = default;
|
||||
|
||||
virtual void VoidReturning(int x) = 0;
|
||||
|
||||
@@ -123,7 +120,7 @@ class FooInterface {
|
||||
virtual int RefQualifiedOverloaded() & = 0;
|
||||
virtual int RefQualifiedOverloaded() && = 0;
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
STDMETHOD_(int, CTNullary)() = 0;
|
||||
STDMETHOD_(bool, CTUnary)(int x) = 0;
|
||||
STDMETHOD_(int, CTDecimal)
|
||||
@@ -137,13 +134,10 @@ class FooInterface {
|
||||
// significant in determining whether two virtual functions had the same
|
||||
// signature. This was fixed in Visual Studio 2008. However, the compiler
|
||||
// still emits a warning that alerts about this change in behavior.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4373)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4373)
|
||||
class MockFoo : public FooInterface {
|
||||
public:
|
||||
MockFoo() {}
|
||||
MockFoo() = default;
|
||||
|
||||
// Makes sure that a mock function parameter can be named.
|
||||
MOCK_METHOD(void, VoidReturning, (int n)); // NOLINT
|
||||
@@ -184,7 +178,7 @@ class MockFoo : public FooInterface {
|
||||
MOCK_METHOD(int (*)(bool), ReturnsFunctionPointer1, (int), ());
|
||||
MOCK_METHOD(fn_ptr, ReturnsFunctionPointer2, (int), ());
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
MOCK_METHOD(int, CTNullary, (), (Calltype(STDMETHODCALLTYPE)));
|
||||
MOCK_METHOD(bool, CTUnary, (int), (Calltype(STDMETHODCALLTYPE)));
|
||||
MOCK_METHOD(int, CTDecimal,
|
||||
@@ -214,7 +208,7 @@ class MockFoo : public FooInterface {
|
||||
|
||||
class LegacyMockFoo : public FooInterface {
|
||||
public:
|
||||
LegacyMockFoo() {}
|
||||
LegacyMockFoo() = default;
|
||||
|
||||
// Makes sure that a mock function parameter can be named.
|
||||
MOCK_METHOD1(VoidReturning, void(int n)); // NOLINT
|
||||
@@ -254,7 +248,7 @@ class LegacyMockFoo : public FooInterface {
|
||||
MOCK_METHOD1(ReturnsFunctionPointer1, int (*(int))(bool));
|
||||
MOCK_METHOD1(ReturnsFunctionPointer2, fn_ptr(int));
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());
|
||||
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int)); // NOLINT
|
||||
MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal,
|
||||
@@ -285,9 +279,7 @@ class LegacyMockFoo : public FooInterface {
|
||||
LegacyMockFoo& operator=(const LegacyMockFoo&) = delete;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4373
|
||||
|
||||
template <class T>
|
||||
class FunctionMockerTest : public testing::Test {
|
||||
@@ -412,7 +404,7 @@ TYPED_TEST(FunctionMockerTest, MocksTypeWithTemplatedCopyCtor) {
|
||||
EXPECT_TRUE(this->foo_->TypeWithTemplatedCopyCtor(TemplatedCopyable<int>()));
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Tests mocking a nullary function with calltype.
|
||||
TYPED_TEST(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
|
||||
EXPECT_CALL(this->mock_foo_, CTNullary())
|
||||
@@ -495,7 +487,7 @@ TEST(FunctionMockerTest, RefQualified) {
|
||||
|
||||
class MockB {
|
||||
public:
|
||||
MockB() {}
|
||||
MockB() = default;
|
||||
|
||||
MOCK_METHOD(void, DoB, ());
|
||||
|
||||
@@ -506,7 +498,7 @@ class MockB {
|
||||
|
||||
class LegacyMockB {
|
||||
public:
|
||||
LegacyMockB() {}
|
||||
LegacyMockB() = default;
|
||||
|
||||
MOCK_METHOD0(DoB, void());
|
||||
|
||||
@@ -542,7 +534,7 @@ TYPED_TEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {
|
||||
template <typename T>
|
||||
class StackInterface {
|
||||
public:
|
||||
virtual ~StackInterface() {}
|
||||
virtual ~StackInterface() = default;
|
||||
|
||||
// Template parameter appears in function parameter.
|
||||
virtual void Push(const T& value) = 0;
|
||||
@@ -555,7 +547,7 @@ class StackInterface {
|
||||
template <typename T>
|
||||
class MockStack : public StackInterface<T> {
|
||||
public:
|
||||
MockStack() {}
|
||||
MockStack() = default;
|
||||
|
||||
MOCK_METHOD(void, Push, (const T& elem), ());
|
||||
MOCK_METHOD(void, Pop, (), (final));
|
||||
@@ -574,7 +566,7 @@ class MockStack : public StackInterface<T> {
|
||||
template <typename T>
|
||||
class LegacyMockStack : public StackInterface<T> {
|
||||
public:
|
||||
LegacyMockStack() {}
|
||||
LegacyMockStack() = default;
|
||||
|
||||
MOCK_METHOD1_T(Push, void(const T& elem));
|
||||
MOCK_METHOD0_T(Pop, void());
|
||||
@@ -628,7 +620,7 @@ TYPED_TEST(TemplateMockTest, MethodWithCommaInReturnTypeWorks) {
|
||||
EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Tests mocking template interfaces with calltype.
|
||||
|
||||
template <typename T>
|
||||
@@ -719,7 +711,7 @@ TYPED_TEST(TemplateMockTestWithCallType, Works) {
|
||||
|
||||
class MockOverloadedOnArgNumber {
|
||||
public:
|
||||
MockOverloadedOnArgNumber() {}
|
||||
MockOverloadedOnArgNumber() = default;
|
||||
|
||||
MY_MOCK_METHODS1_;
|
||||
|
||||
@@ -731,7 +723,7 @@ class MockOverloadedOnArgNumber {
|
||||
|
||||
class LegacyMockOverloadedOnArgNumber {
|
||||
public:
|
||||
LegacyMockOverloadedOnArgNumber() {}
|
||||
LegacyMockOverloadedOnArgNumber() = default;
|
||||
|
||||
LEGACY_MY_MOCK_METHODS1_;
|
||||
|
||||
@@ -766,7 +758,7 @@ TYPED_TEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
|
||||
|
||||
class MockOverloadedOnConstness {
|
||||
public:
|
||||
MockOverloadedOnConstness() {}
|
||||
MockOverloadedOnConstness() = default;
|
||||
|
||||
MY_MOCK_METHODS2_;
|
||||
|
||||
@@ -1002,3 +994,5 @@ TEST(MockMethodMockFunctionTest, NoexceptSpecifierPreserved) {
|
||||
|
||||
} // namespace gmock_function_mocker_test
|
||||
} // namespace testing
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4503
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
@@ -56,7 +57,7 @@
|
||||
#include "src/gtest-internal-inl.h"
|
||||
#undef GTEST_IMPLEMENTATION_
|
||||
|
||||
#if GTEST_OS_CYGWIN
|
||||
#ifdef GTEST_OS_CYGWIN
|
||||
#include <sys/types.h> // For ssize_t. NOLINT
|
||||
#endif
|
||||
|
||||
@@ -167,7 +168,7 @@ TEST(KindOfTest, Integer) {
|
||||
EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long long)); // NOLINT
|
||||
EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT
|
||||
EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT
|
||||
#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN
|
||||
#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || defined(GTEST_OS_CYGWIN)
|
||||
// ssize_t is not defined on Windows and possibly some other OSes.
|
||||
EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT
|
||||
#endif
|
||||
|
||||
@@ -31,16 +31,17 @@
|
||||
//
|
||||
// This file tests some commonly used argument matchers.
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4244)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "test/gmock-matchers_test.h"
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244 4100)
|
||||
|
||||
namespace testing {
|
||||
namespace gmock_matchers_test {
|
||||
namespace {
|
||||
@@ -954,7 +955,7 @@ TEST(AllArgsTest, WorksForNonTuple) {
|
||||
|
||||
class AllArgsHelper {
|
||||
public:
|
||||
AllArgsHelper() {}
|
||||
AllArgsHelper() = default;
|
||||
|
||||
MOCK_METHOD2(Helper, int(char x, int y));
|
||||
|
||||
@@ -975,7 +976,7 @@ TEST(AllArgsTest, WorksInWithClause) {
|
||||
|
||||
class OptionalMatchersHelper {
|
||||
public:
|
||||
OptionalMatchersHelper() {}
|
||||
OptionalMatchersHelper() = default;
|
||||
|
||||
MOCK_METHOD0(NoArgs, int());
|
||||
|
||||
@@ -1037,7 +1038,7 @@ class FloatingPointTest : public testing::Test {
|
||||
Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),
|
||||
further_from_infinity_(
|
||||
Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),
|
||||
max_(Floating::Max()),
|
||||
max_(std::numeric_limits<RawType>::max()),
|
||||
nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),
|
||||
nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {}
|
||||
|
||||
@@ -1512,6 +1513,4 @@ TEST(AnyOfTest, WorksOnMoveOnlyType) {
|
||||
} // namespace gmock_matchers_test
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4244 4100
|
||||
|
||||
@@ -31,18 +31,19 @@
|
||||
//
|
||||
// This file tests some commonly used argument matchers.
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4244)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "test/gmock-matchers_test.h"
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244 4100)
|
||||
|
||||
|
||||
namespace testing {
|
||||
namespace gmock_matchers_test {
|
||||
namespace {
|
||||
@@ -588,8 +589,8 @@ TEST(MatcherCastTest, ValueIsNotCopied) {
|
||||
|
||||
class Base {
|
||||
public:
|
||||
virtual ~Base() {}
|
||||
Base() {}
|
||||
virtual ~Base() = default;
|
||||
Base() = default;
|
||||
|
||||
private:
|
||||
Base(const Base&) = delete;
|
||||
@@ -864,7 +865,7 @@ struct Type {
|
||||
};
|
||||
|
||||
TEST(TypedEqTest, HasSpecifiedType) {
|
||||
// Verfies that the type of TypedEq<T>(v) is Matcher<T>.
|
||||
// Verifies that the type of TypedEq<T>(v) is Matcher<T>.
|
||||
Type<Matcher<int>>::IsTypeOf(TypedEq<int>(5));
|
||||
Type<Matcher<double>>::IsTypeOf(TypedEq<double>(5));
|
||||
}
|
||||
@@ -1530,7 +1531,7 @@ TEST(PairTest, MatchesCorrectly) {
|
||||
EXPECT_THAT(p, Pair(25, "foo"));
|
||||
EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
|
||||
|
||||
// 'first' doesnt' match, but 'second' matches.
|
||||
// 'first' doesn't match, but 'second' matches.
|
||||
EXPECT_THAT(p, Not(Pair(42, "foo")));
|
||||
EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
|
||||
|
||||
@@ -1545,7 +1546,7 @@ TEST(PairTest, MatchesCorrectly) {
|
||||
|
||||
TEST(PairTest, WorksWithMoveOnly) {
|
||||
pair<std::unique_ptr<int>, std::unique_ptr<int>> p;
|
||||
p.second.reset(new int(7));
|
||||
p.second = std::make_unique<int>(7);
|
||||
EXPECT_THAT(p, Pair(Eq(nullptr), Ne(nullptr)));
|
||||
}
|
||||
|
||||
@@ -1805,11 +1806,13 @@ TEST(WhenBase64UnescapedTest, MatchesUnescapedBase64Strings) {
|
||||
EXPECT_FALSE(m1.Matches("invalid base64"));
|
||||
EXPECT_FALSE(m1.Matches("aGVsbG8gd29ybGQ=")); // hello world
|
||||
EXPECT_TRUE(m1.Matches("aGVsbG8gd29ybGQh")); // hello world!
|
||||
EXPECT_TRUE(m1.Matches("+/-_IQ")); // \xfb\xff\xbf!
|
||||
|
||||
const Matcher<const std::string&> m2 = WhenBase64Unescaped(EndsWith("!"));
|
||||
EXPECT_FALSE(m2.Matches("invalid base64"));
|
||||
EXPECT_FALSE(m2.Matches("aGVsbG8gd29ybGQ=")); // hello world
|
||||
EXPECT_TRUE(m2.Matches("aGVsbG8gd29ybGQh")); // hello world!
|
||||
EXPECT_TRUE(m2.Matches("+/-_IQ")); // \xfb\xff\xbf!
|
||||
|
||||
#if GTEST_INTERNAL_HAS_STRING_VIEW
|
||||
const Matcher<const internal::StringView&> m3 =
|
||||
@@ -1817,6 +1820,7 @@ TEST(WhenBase64UnescapedTest, MatchesUnescapedBase64Strings) {
|
||||
EXPECT_FALSE(m3.Matches("invalid base64"));
|
||||
EXPECT_FALSE(m3.Matches("aGVsbG8gd29ybGQ=")); // hello world
|
||||
EXPECT_TRUE(m3.Matches("aGVsbG8gd29ybGQh")); // hello world!
|
||||
EXPECT_TRUE(m3.Matches("+/-_IQ")); // \xfb\xff\xbf!
|
||||
#endif // GTEST_INTERNAL_HAS_STRING_VIEW
|
||||
}
|
||||
|
||||
@@ -2354,6 +2358,4 @@ TEST(PolymorphicMatcherTest, CanAccessImpl) {
|
||||
} // namespace gmock_matchers_test
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4244 4100
|
||||
|
||||
@@ -31,13 +31,23 @@
|
||||
//
|
||||
// This file tests some commonly used argument matchers.
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <deque>
|
||||
#include <forward_list>
|
||||
#include <iterator>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4244)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244 4100)
|
||||
|
||||
#include "test/gmock-matchers_test.h"
|
||||
|
||||
@@ -1826,8 +1836,8 @@ TEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
|
||||
}
|
||||
|
||||
TEST(UnorderedElementsAreArrayTest, VectorBool) {
|
||||
const bool a[] = {0, 1, 0, 1, 1};
|
||||
const bool b[] = {1, 0, 1, 1, 0};
|
||||
const bool a[] = {false, true, false, true, true};
|
||||
const bool b[] = {true, false, true, true, false};
|
||||
std::vector<bool> expected(std::begin(a), std::end(a));
|
||||
std::vector<bool> actual(std::begin(b), std::end(b));
|
||||
StringMatchResultListener listener;
|
||||
@@ -2778,7 +2788,7 @@ TEST(ElementsAreTest, WorksWithNativeArrayPassedByReference) {
|
||||
|
||||
class NativeArrayPassedAsPointerAndSize {
|
||||
public:
|
||||
NativeArrayPassedAsPointerAndSize() {}
|
||||
NativeArrayPassedAsPointerAndSize() = default;
|
||||
|
||||
MOCK_METHOD(void, Helper, (int* array, int size));
|
||||
|
||||
@@ -3124,6 +3134,4 @@ TEST(ContainsTest, WorksForTwoDimensionalNativeArray) {
|
||||
} // namespace gmock_matchers_test
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4244 4100
|
||||
|
||||
@@ -31,13 +31,19 @@
|
||||
//
|
||||
// This file tests some commonly used argument matchers.
|
||||
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
// Silence warning C4244: 'initializing': conversion from 'int' to 'short',
|
||||
// possible loss of data and C4100, unreferenced local parameter
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4244)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244 4100)
|
||||
|
||||
#include "test/gmock-matchers_test.h"
|
||||
|
||||
@@ -202,7 +208,7 @@ TEST(IsTrueTest, IsTrueIsFalse) {
|
||||
EXPECT_THAT(nonnull_unique, Not(IsFalse()));
|
||||
}
|
||||
|
||||
#if GTEST_HAS_TYPED_TEST
|
||||
#ifdef GTEST_HAS_TYPED_TEST
|
||||
// Tests ContainerEq with different container types, and
|
||||
// different element types.
|
||||
|
||||
@@ -863,7 +869,7 @@ TEST(ArgsTest, AcceptsOneTemplateArg) {
|
||||
}
|
||||
|
||||
TEST(ArgsTest, AcceptsTwoTemplateArgs) {
|
||||
const std::tuple<short, int, long> t(4, 5, 6L); // NOLINT
|
||||
const std::tuple<short, int, long> t(short{4}, 5, 6L); // NOLINT
|
||||
|
||||
EXPECT_THAT(t, (Args<0, 1>(Lt())));
|
||||
EXPECT_THAT(t, (Args<1, 2>(Lt())));
|
||||
@@ -871,13 +877,13 @@ TEST(ArgsTest, AcceptsTwoTemplateArgs) {
|
||||
}
|
||||
|
||||
TEST(ArgsTest, AcceptsRepeatedTemplateArgs) {
|
||||
const std::tuple<short, int, long> t(4, 5, 6L); // NOLINT
|
||||
const std::tuple<short, int, long> t(short{4}, 5, 6L); // NOLINT
|
||||
EXPECT_THAT(t, (Args<0, 0>(Eq())));
|
||||
EXPECT_THAT(t, Not(Args<1, 1>(Ne())));
|
||||
}
|
||||
|
||||
TEST(ArgsTest, AcceptsDecreasingTemplateArgs) {
|
||||
const std::tuple<short, int, long> t(4, 5, 6L); // NOLINT
|
||||
const std::tuple<short, int, long> t(short{4}, 5, 6L); // NOLINT
|
||||
EXPECT_THAT(t, (Args<2, 0>(Gt())));
|
||||
EXPECT_THAT(t, Not(Args<2, 1>(Lt())));
|
||||
}
|
||||
@@ -892,7 +898,7 @@ TEST(ArgsTest, AcceptsMoreTemplateArgsThanArityOfOriginalTuple) {
|
||||
}
|
||||
|
||||
TEST(ArgsTest, CanBeNested) {
|
||||
const std::tuple<short, int, long, int> t(4, 5, 6L, 6); // NOLINT
|
||||
const std::tuple<short, int, long, int> t(short{4}, 5, 6L, 6); // NOLINT
|
||||
EXPECT_THAT(t, (Args<1, 2, 3>(Args<1, 2>(Eq()))));
|
||||
EXPECT_THAT(t, (Args<0, 1, 3>(Args<0, 2>(Lt()))));
|
||||
}
|
||||
@@ -1792,8 +1798,8 @@ TEST(ThrowsPredicateCompilesTest, ExceptionMatcherAcceptsBroadType) {
|
||||
{
|
||||
Matcher<uint64_t> inner = Eq(10);
|
||||
Matcher<std::function<void()>> matcher = Throws<uint32_t>(inner);
|
||||
EXPECT_TRUE(matcher.Matches([]() { throw(uint32_t) 10; }));
|
||||
EXPECT_FALSE(matcher.Matches([]() { throw(uint32_t) 11; }));
|
||||
EXPECT_TRUE(matcher.Matches([]() { throw (uint32_t)10; }));
|
||||
EXPECT_FALSE(matcher.Matches([]() { throw (uint32_t)11; }));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1814,6 +1820,4 @@ TEST(ThrowsPredicateCompilesTest, MessageMatcherAcceptsNonMatcher) {
|
||||
} // namespace gmock_matchers_test
|
||||
} // namespace testing
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4244 4100
|
||||
|
||||
@@ -148,9 +148,9 @@ class GreaterThanMatcher : public MatcherInterface<T> {
|
||||
};
|
||||
|
||||
// Names and instantiates a new instance of GTestMatcherTestP.
|
||||
#define INSTANTIATE_GTEST_MATCHER_TEST_P(TestSuite) \
|
||||
using TestSuite##P = GTestMatcherTestP; \
|
||||
INSTANTIATE_TEST_SUITE_P(MatcherInterface, TestSuite##P, Values(false)); \
|
||||
#define INSTANTIATE_GTEST_MATCHER_TEST_P(TestSuite) \
|
||||
using TestSuite##P = GTestMatcherTestP; \
|
||||
INSTANTIATE_TEST_SUITE_P(MatcherInterface, TestSuite##P, Values(false)); \
|
||||
INSTANTIATE_TEST_SUITE_P(GtestMatcher, TestSuite##P, Values(true))
|
||||
|
||||
class GTestMatcherTestP : public testing::TestWithParam<bool> {
|
||||
|
||||
@@ -31,22 +31,23 @@
|
||||
//
|
||||
// This file tests the built-in actions in gmock-actions.h.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4577)
|
||||
#endif
|
||||
|
||||
#include "gmock/gmock-more-actions.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest-spi.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4577)
|
||||
|
||||
namespace testing {
|
||||
namespace gmock_more_actions_test {
|
||||
|
||||
@@ -676,7 +677,7 @@ TEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) {
|
||||
Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end());
|
||||
|
||||
std::string s;
|
||||
a.Perform(std::make_tuple(true, back_inserter(s)));
|
||||
a.Perform(std::make_tuple(true, std::back_inserter(s)));
|
||||
EXPECT_EQ(letters, s);
|
||||
}
|
||||
|
||||
@@ -982,11 +983,7 @@ TEST(DoAllTest, ImplicitlyConvertsActionArguments) {
|
||||
// is expanded and macro expansion cannot contain #pragma. Therefore
|
||||
// we suppress them here.
|
||||
// Also suppress C4503 decorated name length exceeded, name was truncated
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#pragma warning(disable : 4503)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4503)
|
||||
// Tests the ACTION*() macro family.
|
||||
|
||||
// Tests that ACTION() can define an action that doesn't reference the
|
||||
@@ -1548,3 +1545,6 @@ TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
|
||||
|
||||
} // namespace gmock_more_actions_test
|
||||
} // namespace testing
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 4503
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4577
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
// clash with ::testing::Mock.
|
||||
class Mock {
|
||||
public:
|
||||
Mock() {}
|
||||
Mock() = default;
|
||||
|
||||
MOCK_METHOD0(DoThis, void());
|
||||
|
||||
@@ -78,7 +78,7 @@ class CallsMockMethodInDestructor {
|
||||
|
||||
class Foo {
|
||||
public:
|
||||
virtual ~Foo() {}
|
||||
virtual ~Foo() = default;
|
||||
|
||||
virtual void DoThis() = 0;
|
||||
virtual int DoThat(bool flag) = 0;
|
||||
@@ -86,7 +86,7 @@ class Foo {
|
||||
|
||||
class MockFoo : public Foo {
|
||||
public:
|
||||
MockFoo() {}
|
||||
MockFoo() = default;
|
||||
void Delete() { delete this; }
|
||||
|
||||
MOCK_METHOD0(DoThis, void());
|
||||
@@ -109,7 +109,7 @@ class MockBar {
|
||||
(a10 ? 'T' : 'F');
|
||||
}
|
||||
|
||||
virtual ~MockBar() {}
|
||||
virtual ~MockBar() = default;
|
||||
|
||||
const std::string& str() const { return str_; }
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ class NonDefaultConstructible {
|
||||
|
||||
class MockA {
|
||||
public:
|
||||
MockA() {}
|
||||
MockA() = default;
|
||||
|
||||
MOCK_METHOD1(DoA, void(int n));
|
||||
MOCK_METHOD1(ReturnResult, Result(int n));
|
||||
@@ -113,7 +113,7 @@ class MockA {
|
||||
|
||||
class MockB {
|
||||
public:
|
||||
MockB() {}
|
||||
MockB() = default;
|
||||
|
||||
MOCK_CONST_METHOD0(DoB, int()); // NOLINT
|
||||
MOCK_METHOD1(DoB, int(int n)); // NOLINT
|
||||
@@ -125,7 +125,7 @@ class MockB {
|
||||
|
||||
class ReferenceHoldingMock {
|
||||
public:
|
||||
ReferenceHoldingMock() {}
|
||||
ReferenceHoldingMock() = default;
|
||||
|
||||
MOCK_METHOD1(AcceptReference, void(std::shared_ptr<MockA>*));
|
||||
|
||||
@@ -143,12 +143,12 @@ class ReferenceHoldingMock {
|
||||
|
||||
class CC {
|
||||
public:
|
||||
virtual ~CC() {}
|
||||
virtual ~CC() = default;
|
||||
virtual int Method() = 0;
|
||||
};
|
||||
class MockCC : public CC {
|
||||
public:
|
||||
MockCC() {}
|
||||
MockCC() = default;
|
||||
|
||||
MOCK_METHOD0(Method, int());
|
||||
|
||||
@@ -804,39 +804,40 @@ TEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {
|
||||
"to be called at least once");
|
||||
}
|
||||
|
||||
#if defined(__cplusplus) && __cplusplus >= 201703L
|
||||
#if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
|
||||
GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
|
||||
// It should be possible to return a non-moveable type from a mock action in
|
||||
// C++17 and above, where it's guaranteed that such a type can be initialized
|
||||
// from a prvalue returned from a function.
|
||||
TEST(ExpectCallTest, NonMoveableType) {
|
||||
// Define a non-moveable result type.
|
||||
struct Result {
|
||||
explicit Result(int x_in) : x(x_in) {}
|
||||
Result(Result&&) = delete;
|
||||
struct NonMoveableStruct {
|
||||
explicit NonMoveableStruct(int x_in) : x(x_in) {}
|
||||
NonMoveableStruct(NonMoveableStruct&&) = delete;
|
||||
|
||||
int x;
|
||||
};
|
||||
|
||||
static_assert(!std::is_move_constructible_v<Result>);
|
||||
static_assert(!std::is_copy_constructible_v<Result>);
|
||||
static_assert(!std::is_move_constructible_v<NonMoveableStruct>);
|
||||
static_assert(!std::is_copy_constructible_v<NonMoveableStruct>);
|
||||
|
||||
static_assert(!std::is_move_assignable_v<Result>);
|
||||
static_assert(!std::is_copy_assignable_v<Result>);
|
||||
static_assert(!std::is_move_assignable_v<NonMoveableStruct>);
|
||||
static_assert(!std::is_copy_assignable_v<NonMoveableStruct>);
|
||||
|
||||
// We should be able to use a callable that returns that result as both a
|
||||
// OnceAction and an Action, whether the callable ignores arguments or not.
|
||||
const auto return_17 = [] { return Result(17); };
|
||||
const auto return_17 = [] { return NonMoveableStruct(17); };
|
||||
|
||||
static_cast<void>(OnceAction<Result()>{return_17});
|
||||
static_cast<void>(Action<Result()>{return_17});
|
||||
static_cast<void>(OnceAction<NonMoveableStruct()>{return_17});
|
||||
static_cast<void>(Action<NonMoveableStruct()>{return_17});
|
||||
|
||||
static_cast<void>(OnceAction<Result(int)>{return_17});
|
||||
static_cast<void>(Action<Result(int)>{return_17});
|
||||
static_cast<void>(OnceAction<NonMoveableStruct(int)>{return_17});
|
||||
static_cast<void>(Action<NonMoveableStruct(int)>{return_17});
|
||||
|
||||
// It should be possible to return the result end to end through an
|
||||
// EXPECT_CALL statement, with both WillOnce and WillRepeatedly.
|
||||
MockFunction<Result()> mock;
|
||||
MockFunction<NonMoveableStruct()> mock;
|
||||
EXPECT_CALL(mock, Call) //
|
||||
.WillOnce(return_17) //
|
||||
.WillRepeatedly(return_17);
|
||||
@@ -1088,16 +1089,7 @@ TEST(UnexpectedCallTest, UnsatisfiedPrerequisites) {
|
||||
|
||||
// Verifies that the failure message contains the two unsatisfied
|
||||
// pre-requisites but not the satisfied one.
|
||||
#if GTEST_USES_PCRE
|
||||
EXPECT_THAT(
|
||||
r.message(),
|
||||
ContainsRegex(
|
||||
// PCRE has trouble using (.|\n) to match any character, but
|
||||
// supports the (?s) prefix for using . to match any character.
|
||||
"(?s)the following immediate pre-requisites are not satisfied:\n"
|
||||
".*: pre-requisite #0\n"
|
||||
".*: pre-requisite #1"));
|
||||
#elif GTEST_USES_POSIX_RE
|
||||
#ifdef GTEST_USES_POSIX_RE
|
||||
EXPECT_THAT(r.message(),
|
||||
ContainsRegex(
|
||||
// POSIX RE doesn't understand the (?s) prefix, but has no
|
||||
@@ -1112,7 +1104,7 @@ TEST(UnexpectedCallTest, UnsatisfiedPrerequisites) {
|
||||
"the following immediate pre-requisites are not satisfied:"));
|
||||
EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #0"));
|
||||
EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #1"));
|
||||
#endif // GTEST_USES_PCRE
|
||||
#endif // GTEST_USES_POSIX_RE
|
||||
|
||||
b.DoB(1);
|
||||
b.DoB(3);
|
||||
@@ -1779,16 +1771,11 @@ TEST(DeletingMockEarlyTest, Success2) {
|
||||
|
||||
// Suppresses warning on unreferenced formal parameter in MSVC with
|
||||
// -W4.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
ACTION_P(Delete, ptr) { delete ptr; }
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
TEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {
|
||||
MockA* const a = new MockA;
|
||||
@@ -1895,7 +1882,7 @@ struct Unprintable {
|
||||
|
||||
class MockC {
|
||||
public:
|
||||
MockC() {}
|
||||
MockC() = default;
|
||||
|
||||
MOCK_METHOD6(VoidMethod, void(bool cond, int n, std::string s, void* p,
|
||||
const Printable& x, Unprintable y));
|
||||
@@ -2064,7 +2051,7 @@ class GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
|
||||
"See "
|
||||
"https://github.com/google/googletest/blob/main/docs/"
|
||||
"gmock_cook_book.md#"
|
||||
"knowing-when-to-expect for details.";
|
||||
"knowing-when-to-expect-useoncall for details.";
|
||||
|
||||
// A void-returning function.
|
||||
CaptureStdout();
|
||||
@@ -2135,7 +2122,7 @@ void PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {
|
||||
|
||||
class LogTestHelper {
|
||||
public:
|
||||
LogTestHelper() {}
|
||||
LogTestHelper() = default;
|
||||
|
||||
MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));
|
||||
|
||||
@@ -2602,14 +2589,7 @@ TEST(ParameterlessExpectationsTest,
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
|
||||
// Allows the user to define their own main and then invoke gmock_main
|
||||
// from it. This might be necessary on some platforms which require
|
||||
// specific setup and teardown.
|
||||
#if GMOCK_RENAME_MAIN
|
||||
int gmock_main(int argc, char** argv) {
|
||||
#else
|
||||
int main(int argc, char** argv) {
|
||||
#endif // GMOCK_RENAME_MAIN
|
||||
testing::InitGoogleMock(&argc, argv);
|
||||
// Ensures that the tests pass no matter what value of
|
||||
// --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
// Tests Google Mock's functionality that depends on exceptions.
|
||||
|
||||
#include <exception>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
|
||||
@@ -54,50 +54,59 @@ class GMockLeakTest(gmock_test_utils.TestCase):
|
||||
def testCatchesLeakedMockByDefault(self):
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL,
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_EXPECT_CALL, env=environ
|
||||
).exit_code,
|
||||
)
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_ON_CALL,
|
||||
env=environ).exit_code)
|
||||
0, gmock_test_utils.Subprocess(TEST_WITH_ON_CALL, env=environ).exit_code
|
||||
)
|
||||
|
||||
def testDoesNotCatchLeakedMockWhenDisabled(self):
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +
|
||||
['--gmock_catch_leaked_mocks=0'],
|
||||
env=environ).exit_code)
|
||||
self.assertEquals(
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks=0'],
|
||||
env=environ,
|
||||
).exit_code,
|
||||
)
|
||||
self.assertEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_ON_CALL +
|
||||
['--gmock_catch_leaked_mocks=0'],
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_ON_CALL + ['--gmock_catch_leaked_mocks=0'], env=environ
|
||||
).exit_code,
|
||||
)
|
||||
|
||||
def testCatchesLeakedMockWhenEnabled(self):
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +
|
||||
['--gmock_catch_leaked_mocks'],
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks'], env=environ
|
||||
).exit_code,
|
||||
)
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_ON_CALL +
|
||||
['--gmock_catch_leaked_mocks'],
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_ON_CALL + ['--gmock_catch_leaked_mocks'], env=environ
|
||||
).exit_code,
|
||||
)
|
||||
|
||||
def testCatchesLeakedMockWhenEnabledWithExplictFlagValue(self):
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_WITH_EXPECT_CALL +
|
||||
['--gmock_catch_leaked_mocks=1'],
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks=1'],
|
||||
env=environ,
|
||||
).exit_code,
|
||||
)
|
||||
|
||||
def testCatchesMultipleLeakedMocks(self):
|
||||
self.assertNotEqual(
|
||||
0,
|
||||
gmock_test_utils.Subprocess(TEST_MULTIPLE_LEAKS +
|
||||
['--gmock_catch_leaked_mocks'],
|
||||
env=environ).exit_code)
|
||||
gmock_test_utils.Subprocess(
|
||||
TEST_MULTIPLE_LEAKS + ['--gmock_catch_leaked_mocks'], env=environ
|
||||
).exit_code,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -40,13 +40,13 @@ using ::testing::Return;
|
||||
|
||||
class FooInterface {
|
||||
public:
|
||||
virtual ~FooInterface() {}
|
||||
virtual ~FooInterface() = default;
|
||||
virtual void DoThis() = 0;
|
||||
};
|
||||
|
||||
class MockFoo : public FooInterface {
|
||||
public:
|
||||
MockFoo() {}
|
||||
MockFoo() = default;
|
||||
|
||||
MOCK_METHOD0(DoThis, void());
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
@@ -181,7 +181,7 @@ using testing::WithArg;
|
||||
using testing::WithArgs;
|
||||
using testing::WithoutArgs;
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
using testing::SetErrnoAndReturn;
|
||||
#endif
|
||||
|
||||
@@ -194,7 +194,7 @@ using testing::MatchesRegex;
|
||||
|
||||
class Interface {
|
||||
public:
|
||||
virtual ~Interface() {}
|
||||
virtual ~Interface() = default;
|
||||
virtual void VoidFromString(char* str) = 0;
|
||||
virtual char* StringFromString(char* str) = 0;
|
||||
virtual int IntFromString(char* str) = 0;
|
||||
@@ -208,7 +208,7 @@ class Interface {
|
||||
|
||||
class Mock : public Interface {
|
||||
public:
|
||||
Mock() {}
|
||||
Mock() = default;
|
||||
|
||||
MOCK_METHOD1(VoidFromString, void(char* str));
|
||||
MOCK_METHOD1(StringFromString, char*(char* str));
|
||||
@@ -306,7 +306,7 @@ TEST(LinkTest, TestSetArrayArgument) {
|
||||
mock.VoidFromString(&ch);
|
||||
}
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
// Tests the linkage of the SetErrnoAndReturn action.
|
||||
TEST(LinkTest, TestSetErrnoAndReturn) {
|
||||
@@ -423,10 +423,7 @@ TEST(LinkTest, TestThrow) {
|
||||
// the macro definition, as the warnings are generated when the macro
|
||||
// is expanded and macro expansion cannot contain #pragma. Therefore
|
||||
// we suppress them here.
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
// Tests the linkage of actions created using ACTION macro.
|
||||
namespace {
|
||||
@@ -459,9 +456,7 @@ ACTION_P2(ReturnEqualsEitherOf, first, second) {
|
||||
}
|
||||
} // namespace
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
TEST(LinkTest, TestActionP2Macro) {
|
||||
Mock mock;
|
||||
|
||||
@@ -39,7 +39,7 @@ gmock_output_test.py
|
||||
|
||||
"""
|
||||
|
||||
from io import open # pylint: disable=redefined-builtin, g-importing-member
|
||||
from io import open # pylint: disable=redefined-builtin, g-importing-member
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
@@ -168,9 +168,13 @@ class GMockOutputTest(gmock_test_utils.TestCase):
|
||||
|
||||
# The raw output should contain 2 leaked mock object errors for
|
||||
# test GMockOutputTest.CatchesLeakedMocks.
|
||||
self.assertEqual(['GMockOutputTest.CatchesLeakedMocks',
|
||||
'GMockOutputTest.CatchesLeakedMocks'],
|
||||
leaky_tests)
|
||||
self.assertEqual(
|
||||
[
|
||||
'GMockOutputTest.CatchesLeakedMocks',
|
||||
'GMockOutputTest.CatchesLeakedMocks',
|
||||
],
|
||||
leaky_tests,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -38,10 +38,7 @@
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
// Silence C4100 (unreferenced formal parameter)
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
using testing::_;
|
||||
using testing::AnyNumber;
|
||||
@@ -55,7 +52,7 @@ using testing::Value;
|
||||
|
||||
class MockFoo {
|
||||
public:
|
||||
MockFoo() {}
|
||||
MockFoo() = default;
|
||||
|
||||
MOCK_METHOD3(Bar, char(const std::string& s, int i, double x));
|
||||
MOCK_METHOD2(Bar2, bool(int x, int y));
|
||||
@@ -286,6 +283,4 @@ int main(int argc, char** argv) {
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
@@ -40,6 +40,7 @@ FILE:#: EXPECT_CALL(foo_, Bar2(0, _))...
|
||||
Actual: 1
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnexpectedCall
|
||||
[ RUN ] GMockOutputTest.UnexpectedCallToVoidFunction
|
||||
unknown file: Failure
|
||||
@@ -53,6 +54,7 @@ FILE:#: EXPECT_CALL(foo_, Bar3(0, _))...
|
||||
Actual: 1
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnexpectedCallToVoidFunction
|
||||
[ RUN ] GMockOutputTest.ExcessiveCall
|
||||
FILE:#: Failure
|
||||
@@ -61,6 +63,7 @@ Mock function called more times than expected - returning default value.
|
||||
Returns: false
|
||||
Expected: to be called once
|
||||
Actual: called twice - over-saturated and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.ExcessiveCall
|
||||
[ RUN ] GMockOutputTest.ExcessiveCallToVoidFunction
|
||||
FILE:#: Failure
|
||||
@@ -68,6 +71,7 @@ Mock function called more times than expected - returning directly.
|
||||
Function call: Bar3(0, 1)
|
||||
Expected: to be called once
|
||||
Actual: called twice - over-saturated and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.ExcessiveCallToVoidFunction
|
||||
[ RUN ] GMockOutputTest.UninterestingCall
|
||||
|
||||
@@ -75,14 +79,14 @@ GMOCK WARNING:
|
||||
Uninteresting mock function call - returning default value.
|
||||
Function call: Bar2(0, 1)
|
||||
Returns: false
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect for details.
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
|
||||
[ OK ] GMockOutputTest.UninterestingCall
|
||||
[ RUN ] GMockOutputTest.UninterestingCallToVoidFunction
|
||||
|
||||
GMOCK WARNING:
|
||||
Uninteresting mock function call - returning directly.
|
||||
Function call: Bar3(0, 1)
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect for details.
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
|
||||
[ OK ] GMockOutputTest.UninterestingCallToVoidFunction
|
||||
[ RUN ] GMockOutputTest.RetiredExpectation
|
||||
unknown file: Failure
|
||||
@@ -104,6 +108,7 @@ FILE:#: tried expectation #1: EXPECT_CALL(foo_, Bar2(0, 0))...
|
||||
Actual: 1
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.RetiredExpectation
|
||||
[ RUN ] GMockOutputTest.UnsatisfiedPrerequisite
|
||||
unknown file: Failure
|
||||
@@ -125,6 +130,7 @@ FILE:#: pre-requisite #0
|
||||
(end of pre-requisites)
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnsatisfiedPrerequisite
|
||||
[ RUN ] GMockOutputTest.UnsatisfiedPrerequisites
|
||||
unknown file: Failure
|
||||
@@ -147,6 +153,7 @@ FILE:#: pre-requisite #1
|
||||
(end of pre-requisites)
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnsatisfiedPrerequisites
|
||||
[ RUN ] GMockOutputTest.UnsatisfiedWith
|
||||
FILE:#: Failure
|
||||
@@ -154,16 +161,19 @@ Actual function call count doesn't match EXPECT_CALL(foo_, Bar2(_, _))...
|
||||
Expected args: are a pair where the first >= the second
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnsatisfiedWith
|
||||
[ RUN ] GMockOutputTest.UnsatisfiedExpectation
|
||||
FILE:#: Failure
|
||||
Actual function call count doesn't match EXPECT_CALL(foo_, Bar2(0, _))...
|
||||
Expected: to be called twice
|
||||
Actual: called once - unsatisfied and active
|
||||
|
||||
FILE:#: Failure
|
||||
Actual function call count doesn't match EXPECT_CALL(foo_, Bar(_, _, _))...
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnsatisfiedExpectation
|
||||
[ RUN ] GMockOutputTest.MismatchArguments
|
||||
unknown file: Failure
|
||||
@@ -180,6 +190,7 @@ FILE:#: EXPECT_CALL(foo_, Bar(Ref(s), _, Ge(0)))...
|
||||
Actual: -0.1
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.MismatchArguments
|
||||
[ RUN ] GMockOutputTest.MismatchWith
|
||||
unknown file: Failure
|
||||
@@ -194,6 +205,7 @@ FILE:#: EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))...
|
||||
Actual: don't match
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.MismatchWith
|
||||
[ RUN ] GMockOutputTest.MismatchArgumentsAndWith
|
||||
unknown file: Failure
|
||||
@@ -210,6 +222,7 @@ FILE:#: EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))...
|
||||
Actual: don't match
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.MismatchArgumentsAndWith
|
||||
[ RUN ] GMockOutputTest.UnexpectedCallWithDefaultAction
|
||||
unknown file: Failure
|
||||
@@ -227,6 +240,7 @@ FILE:#: EXPECT_CALL(foo_, Bar2(2, 2))...
|
||||
Actual: 0
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
unknown file: Failure
|
||||
|
||||
Unexpected mock function call - taking default action specified at:
|
||||
@@ -242,6 +256,7 @@ FILE:#: EXPECT_CALL(foo_, Bar2(2, 2))...
|
||||
Actual: 0
|
||||
Expected: to be called once
|
||||
Actual: never called - unsatisfied and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.UnexpectedCallWithDefaultAction
|
||||
[ RUN ] GMockOutputTest.ExcessiveCallWithDefaultAction
|
||||
FILE:#: Failure
|
||||
@@ -251,6 +266,7 @@ FILE:#:
|
||||
Returns: true
|
||||
Expected: to be called once
|
||||
Actual: called twice - over-saturated and active
|
||||
|
||||
FILE:#: Failure
|
||||
Mock function called more times than expected - taking default action specified at:
|
||||
FILE:#:
|
||||
@@ -258,6 +274,7 @@ FILE:#:
|
||||
Returns: false
|
||||
Expected: to be called once
|
||||
Actual: called twice - over-saturated and active
|
||||
|
||||
[ FAILED ] GMockOutputTest.ExcessiveCallWithDefaultAction
|
||||
[ RUN ] GMockOutputTest.UninterestingCallWithDefaultAction
|
||||
|
||||
@@ -266,14 +283,14 @@ Uninteresting mock function call - taking default action specified at:
|
||||
FILE:#:
|
||||
Function call: Bar2(2, 2)
|
||||
Returns: true
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect for details.
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
|
||||
|
||||
GMOCK WARNING:
|
||||
Uninteresting mock function call - taking default action specified at:
|
||||
FILE:#:
|
||||
Function call: Bar2(1, 1)
|
||||
Returns: false
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect for details.
|
||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
|
||||
[ OK ] GMockOutputTest.UninterestingCallWithDefaultAction
|
||||
[ RUN ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction
|
||||
|
||||
@@ -292,7 +309,8 @@ Stack trace:
|
||||
FILE:#: Failure
|
||||
Value of: (std::pair<int, bool>(42, true))
|
||||
Expected: is pair (first: is >= 48, second: true)
|
||||
Actual: (42, true) (of type std::pair<int, bool>)
|
||||
Actual: (42, true) (of type std::pair<int,bool>)
|
||||
|
||||
[ FAILED ] GMockOutputTest.PrintsMatcher
|
||||
[ FAILED ] GMockOutputTest.UnexpectedCall
|
||||
[ FAILED ] GMockOutputTest.UnexpectedCallToVoidFunction
|
||||
|
||||
@@ -174,6 +174,6 @@ TEST(WideInitGoogleMockTest, ParsesGoogleMockFlagAndUnrecognizedFlag) {
|
||||
// Makes sure Google Mock flags can be accessed in code.
|
||||
TEST(FlagTest, IsAccessibleInCode) {
|
||||
bool dummy =
|
||||
GMOCK_FLAG_GET(catch_leaked_mocks) && GMOCK_FLAG_GET(verbose) == "";
|
||||
GMOCK_FLAG_GET(catch_leaked_mocks) && GMOCK_FLAG_GET(verbose).empty();
|
||||
(void)dummy; // Avoids the "unused local variable" warning.
|
||||
}
|
||||
|
||||
@@ -77,9 +77,6 @@ def GetExitStatus(exit_code):
|
||||
return -1
|
||||
|
||||
|
||||
# Suppresses the "Invalid const name" lint complaint
|
||||
# pylint: disable-msg=C6409
|
||||
|
||||
# Exposes utilities from gtest_test_utils.
|
||||
Subprocess = gtest_test_utils.Subprocess
|
||||
TestCase = gtest_test_utils.TestCase
|
||||
@@ -87,8 +84,6 @@ environ = gtest_test_utils.environ
|
||||
SetEnvVar = gtest_test_utils.SetEnvVar
|
||||
PREMATURE_EXIT_FILE_ENV_VAR = gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR
|
||||
|
||||
# pylint: enable-msg=C6409
|
||||
|
||||
|
||||
def Main():
|
||||
"""Runs the unit test."""
|
||||
|
||||
+10
-18
@@ -46,14 +46,9 @@ endif()
|
||||
|
||||
# Project version:
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_policy(SET CMP0048 NEW)
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(gtest VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)
|
||||
|
||||
if (POLICY CMP0063) # Visibility
|
||||
cmake_policy(SET CMP0063 NEW)
|
||||
endif (POLICY CMP0063)
|
||||
|
||||
if (COMMAND set_up_hermetic_build)
|
||||
set_up_hermetic_build()
|
||||
endif()
|
||||
@@ -100,12 +95,14 @@ if (INSTALL_GTEST)
|
||||
set(version_file "${generated_dir}/${cmake_package_name}ConfigVersion.cmake")
|
||||
write_basic_package_version_file(${version_file} VERSION ${GOOGLETEST_VERSION} COMPATIBILITY AnyNewerVersion)
|
||||
install(EXPORT ${targets_export_name}
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
NAMESPACE ${cmake_package_name}::
|
||||
DESTINATION ${cmake_files_install_dir})
|
||||
set(config_file "${generated_dir}/${cmake_package_name}Config.cmake")
|
||||
configure_package_config_file("${gtest_SOURCE_DIR}/cmake/Config.cmake.in"
|
||||
"${config_file}" INSTALL_DESTINATION ${cmake_files_install_dir})
|
||||
install(FILES ${version_file} ${config_file}
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
DESTINATION ${cmake_files_install_dir})
|
||||
endif()
|
||||
|
||||
@@ -143,18 +140,13 @@ if(GTEST_HAS_ABSL)
|
||||
endif()
|
||||
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
|
||||
set_target_properties(gtest_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
# If the CMake version supports it, attach header directory information
|
||||
# to the targets for when we are part of a parent build (ie being pulled
|
||||
# in via add_subdirectory() rather than being a standalone build).
|
||||
if (DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11")
|
||||
string(REPLACE ";" "$<SEMICOLON>" dirs "${gtest_build_include_dirs}")
|
||||
target_include_directories(gtest SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
target_include_directories(gtest_main SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
endif()
|
||||
string(REPLACE ";" "$<SEMICOLON>" dirs "${gtest_build_include_dirs}")
|
||||
target_include_directories(gtest SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
target_include_directories(gtest_main SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${dirs}>"
|
||||
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "QNX")
|
||||
target_link_libraries(gtest PUBLIC regex)
|
||||
endif()
|
||||
|
||||
+28
-14
@@ -25,7 +25,7 @@ When building GoogleTest as a standalone project, the typical workflow starts
|
||||
with
|
||||
|
||||
```
|
||||
git clone https://github.com/google/googletest.git -b release-1.12.1
|
||||
git clone https://github.com/google/googletest.git -b v1.13.0
|
||||
cd googletest # Main directory of the cloned repository.
|
||||
mkdir build # Create a directory to hold the build output.
|
||||
cd build
|
||||
@@ -124,12 +124,12 @@ match the project in which it is included.
|
||||
|
||||
#### C++ Standard Version
|
||||
|
||||
An environment that supports C++11 is required in order to successfully build
|
||||
An environment that supports C++14 is required in order to successfully build
|
||||
GoogleTest. One way to ensure this is to specify the standard in the top-level
|
||||
project, for example by using the `set(CMAKE_CXX_STANDARD 11)` command. If this
|
||||
is not feasible, for example in a C project using GoogleTest for validation,
|
||||
then it can be specified by adding it to the options for cmake via the
|
||||
`DCMAKE_CXX_FLAGS` option.
|
||||
project, for example by using the `set(CMAKE_CXX_STANDARD 14)` command along
|
||||
with `set(CMAKE_CXX_STANDARD_REQUIRED ON)`. If this is not feasible, for example
|
||||
in a C project using GoogleTest for validation, then it can be specified by
|
||||
adding it to the options for cmake via the`-DCMAKE_CXX_FLAGS` option.
|
||||
|
||||
### Tweaking GoogleTest
|
||||
|
||||
@@ -145,18 +145,22 @@ We list the most frequently used macros below. For a complete list, see file
|
||||
### Multi-threaded Tests
|
||||
|
||||
GoogleTest is thread-safe where the pthread library is available. After
|
||||
`#include "gtest/gtest.h"`, you can check the
|
||||
`#include <gtest/gtest.h>`, you can check the
|
||||
`GTEST_IS_THREADSAFE` macro to see whether this is the case (yes if the macro is
|
||||
`#defined` to 1, no if it's undefined.).
|
||||
|
||||
If GoogleTest doesn't correctly detect whether pthread is available in your
|
||||
environment, you can force it with
|
||||
|
||||
-DGTEST_HAS_PTHREAD=1
|
||||
```
|
||||
-DGTEST_HAS_PTHREAD=1
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
-DGTEST_HAS_PTHREAD=0
|
||||
```
|
||||
-DGTEST_HAS_PTHREAD=0
|
||||
```
|
||||
|
||||
When GoogleTest uses pthread, you may need to add flags to your compiler and/or
|
||||
linker to select the pthread library, or you'll get link errors. If you use the
|
||||
@@ -172,14 +176,18 @@ as a DLL on Windows) if you prefer.
|
||||
|
||||
To compile *gtest* as a shared library, add
|
||||
|
||||
-DGTEST_CREATE_SHARED_LIBRARY=1
|
||||
```
|
||||
-DGTEST_CREATE_SHARED_LIBRARY=1
|
||||
```
|
||||
|
||||
to the compiler flags. You'll also need to tell the linker to produce a shared
|
||||
library instead - consult your linker's manual for how to do it.
|
||||
|
||||
To compile your *tests* that use the gtest shared library, add
|
||||
|
||||
-DGTEST_LINKED_AS_SHARED_LIBRARY=1
|
||||
```
|
||||
-DGTEST_LINKED_AS_SHARED_LIBRARY=1
|
||||
```
|
||||
|
||||
to the compiler flags.
|
||||
|
||||
@@ -200,7 +208,9 @@ rename its macro to avoid the conflict.
|
||||
Specifically, if both GoogleTest and some other code define macro FOO, you can
|
||||
add
|
||||
|
||||
-DGTEST_DONT_DEFINE_FOO=1
|
||||
```
|
||||
-DGTEST_DONT_DEFINE_FOO=1
|
||||
```
|
||||
|
||||
to the compiler flags to tell GoogleTest to change the macro's name from `FOO`
|
||||
to `GTEST_FOO`. Currently `FOO` can be `ASSERT_EQ`, `ASSERT_FALSE`, `ASSERT_GE`,
|
||||
@@ -208,10 +218,14 @@ to `GTEST_FOO`. Currently `FOO` can be `ASSERT_EQ`, `ASSERT_FALSE`, `ASSERT_GE`,
|
||||
`EXPECT_FALSE`, `EXPECT_TRUE`, `FAIL`, `SUCCEED`, `TEST`, or `TEST_F`. For
|
||||
example, with `-DGTEST_DONT_DEFINE_TEST=1`, you'll need to write
|
||||
|
||||
GTEST_TEST(SomeTest, DoesThis) { ... }
|
||||
```
|
||||
GTEST_TEST(SomeTest, DoesThis) { ... }
|
||||
```
|
||||
|
||||
instead of
|
||||
|
||||
TEST(SomeTest, DoesThis) { ... }
|
||||
```
|
||||
TEST(SomeTest, DoesThis) { ... }
|
||||
```
|
||||
|
||||
in order to define a test.
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
# Test and Google Mock's option() definitions, and thus must be
|
||||
# called *after* the options have been defined.
|
||||
|
||||
if (POLICY CMP0054)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
endif (POLICY CMP0054)
|
||||
|
||||
# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
|
||||
#
|
||||
# This must be a macro(), as inside a function string() can only
|
||||
@@ -90,14 +86,24 @@ macro(config_compiler_and_linker)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
set(cxx_base_flags "${cxx_base_flags} -utf-8")
|
||||
endif()
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(cxx_base_flags "-Wall -Wshadow -Wconversion")
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
||||
set(cxx_base_flags "${cxx_base_flags} /fp:precise -Wno-inconsistent-missing-override -Wno-microsoft-exception-spec -Wno-unused-function -Wno-unused-but-set-variable")
|
||||
endif()
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
|
||||
CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
||||
set(cxx_base_flags "-Wall -Wshadow -Wconversion -Wundef")
|
||||
set(cxx_exception_flags "-fexceptions")
|
||||
set(cxx_no_exception_flags "-fno-exceptions")
|
||||
set(cxx_strict_flags "-W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls")
|
||||
set(cxx_strict_flags "-W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Winline -Wredundant-decls")
|
||||
set(cxx_no_rtti_flags "-fno-rtti")
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(cxx_strict_flags "${cxx_strict_flags} -Wchar-subscripts")
|
||||
endif()
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
||||
set(cxx_base_flags "${cxx_base_flags} -Wno-implicit-float-size-conversion -ffp-model=precise")
|
||||
endif()
|
||||
elseif (CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(cxx_base_flags "-Wall -Wshadow")
|
||||
set(cxx_base_flags "-Wall -Wshadow -Wundef")
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0.0)
|
||||
set(cxx_base_flags "${cxx_base_flags} -Wno-error=dangling-else")
|
||||
endif()
|
||||
@@ -182,23 +188,14 @@ function(cxx_library_with_type name type cxx_flags)
|
||||
set_target_properties(${name}
|
||||
PROPERTIES
|
||||
COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
|
||||
if (NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11")
|
||||
target_compile_definitions(${name} INTERFACE
|
||||
$<INSTALL_INTERFACE:GTEST_LINKED_AS_SHARED_LIBRARY=1>)
|
||||
endif()
|
||||
target_compile_definitions(${name} INTERFACE
|
||||
$<INSTALL_INTERFACE:GTEST_LINKED_AS_SHARED_LIBRARY=1>)
|
||||
endif()
|
||||
if (DEFINED GTEST_HAS_PTHREAD)
|
||||
if ("${CMAKE_VERSION}" VERSION_LESS "3.1.0")
|
||||
set(threads_spec ${CMAKE_THREAD_LIBS_INIT})
|
||||
else()
|
||||
set(threads_spec Threads::Threads)
|
||||
endif()
|
||||
target_link_libraries(${name} PUBLIC ${threads_spec})
|
||||
target_link_libraries(${name} PUBLIC Threads::Threads)
|
||||
endif()
|
||||
|
||||
if (NOT "${CMAKE_VERSION}" VERSION_LESS "3.8")
|
||||
target_compile_features(${name} PUBLIC cxx_std_14)
|
||||
endif()
|
||||
target_compile_features(${name} PUBLIC cxx_std_14)
|
||||
endfunction()
|
||||
|
||||
########################################################################
|
||||
@@ -250,20 +247,7 @@ function(cxx_executable name dir libs)
|
||||
${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
# CMP0094 policy enables finding a Python executable in the LOCATION order, as
|
||||
# specified by the PATH environment variable.
|
||||
if (POLICY CMP0094)
|
||||
cmake_policy(SET CMP0094 NEW)
|
||||
endif()
|
||||
|
||||
# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
|
||||
if ("${CMAKE_VERSION}" VERSION_LESS "3.12.0")
|
||||
find_package(PythonInterp)
|
||||
else()
|
||||
find_package(Python COMPONENTS Interpreter)
|
||||
set(PYTHONINTERP_FOUND ${Python_Interpreter_FOUND})
|
||||
set(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
|
||||
endif()
|
||||
find_package(Python3)
|
||||
|
||||
# cxx_test_with_flags(name cxx_flags libs srcs...)
|
||||
#
|
||||
@@ -289,34 +273,22 @@ endfunction()
|
||||
# creates a Python test with the given name whose main module is in
|
||||
# test/name.py. It does nothing if Python is not installed.
|
||||
function(py_test name)
|
||||
if (PYTHONINTERP_FOUND)
|
||||
if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_GREATER 3.1)
|
||||
if (CMAKE_CONFIGURATION_TYPES)
|
||||
# Multi-configuration build generators as for Visual Studio save
|
||||
# output in a subdirectory of CMAKE_CURRENT_BINARY_DIR (Debug,
|
||||
# Release etc.), so we have to provide it here.
|
||||
add_test(NAME ${name}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
||||
--build_dir=${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG> ${ARGN})
|
||||
else (CMAKE_CONFIGURATION_TYPES)
|
||||
# Single-configuration build generators like Makefile generators
|
||||
# don't have subdirs below CMAKE_CURRENT_BINARY_DIR.
|
||||
add_test(NAME ${name}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
||||
--build_dir=${CMAKE_CURRENT_BINARY_DIR} ${ARGN})
|
||||
endif (CMAKE_CONFIGURATION_TYPES)
|
||||
else()
|
||||
# ${CMAKE_CURRENT_BINARY_DIR} is known at configuration time, so we can
|
||||
# directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
|
||||
# only at ctest runtime (by calling ctest -c <Configuration>), so
|
||||
# we have to escape $ to delay variable substitution here.
|
||||
add_test(NAME ${name}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
||||
--build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE} ${ARGN})
|
||||
endif()
|
||||
# Make the Python import path consistent between Bazel and CMake.
|
||||
set_tests_properties(${name} PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_SOURCE_DIR})
|
||||
endif(PYTHONINTERP_FOUND)
|
||||
if (NOT Python3_Interpreter_FOUND)
|
||||
return()
|
||||
endif()
|
||||
|
||||
get_cmake_property(is_multi "GENERATOR_IS_MULTI_CONFIG")
|
||||
set(build_dir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
if (is_multi)
|
||||
set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
|
||||
endif()
|
||||
|
||||
add_test(NAME ${name}
|
||||
COMMAND Python3::Interpreter ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
||||
--build_dir=${build_dir} ${ARGN})
|
||||
|
||||
# Make the Python import path consistent between Bazel and CMake.
|
||||
set_tests_properties(${name} PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_SOURCE_DIR})
|
||||
endfunction()
|
||||
|
||||
# install_project(targets...)
|
||||
@@ -325,10 +297,12 @@ endfunction()
|
||||
function(install_project)
|
||||
if(INSTALL_GTEST)
|
||||
install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/"
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
# Install the project targets.
|
||||
install(TARGETS ${ARGN}
|
||||
EXPORT ${targets_export_name}
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
@@ -340,6 +314,7 @@ function(install_project)
|
||||
get_target_property(t_pdb_output_directory ${t} PDB_OUTPUT_DIRECTORY)
|
||||
install(FILES
|
||||
"${t_pdb_output_directory}/\${CMAKE_INSTALL_CONFIG_NAME}/$<$<CONFIG:Debug>:${t_pdb_name_debug}>$<$<NOT:$<CONFIG:Debug>>:${t_pdb_name}>.pdb"
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
OPTIONAL)
|
||||
endforeach()
|
||||
@@ -350,6 +325,7 @@ function(install_project)
|
||||
configure_file("${PROJECT_SOURCE_DIR}/cmake/${t}.pc.in"
|
||||
"${configured_pc}" @ONLY)
|
||||
install(FILES "${configured_pc}"
|
||||
COMPONENT "${PROJECT_NAME}"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
@@ -181,7 +181,7 @@ class GTEST_API_ AssertionResult {
|
||||
// assertion's expectation). When nothing has been streamed into the
|
||||
// object, returns an empty string.
|
||||
const char* message() const {
|
||||
return message_.get() != nullptr ? message_->c_str() : "";
|
||||
return message_ != nullptr ? message_->c_str() : "";
|
||||
}
|
||||
// Deprecated; please use message() instead.
|
||||
const char* failure_message() const { return message(); }
|
||||
@@ -204,7 +204,7 @@ class GTEST_API_ AssertionResult {
|
||||
private:
|
||||
// Appends the contents of message to message_.
|
||||
void AppendMessage(const Message& a_message) {
|
||||
if (message_.get() == nullptr) message_.reset(new ::std::string);
|
||||
if (message_ == nullptr) message_ = ::std::make_unique<::std::string>();
|
||||
message_->append(a_message.GetString().c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ GTEST_DECLARE_string_(death_test_style);
|
||||
|
||||
namespace testing {
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
namespace internal {
|
||||
|
||||
@@ -203,7 +203,7 @@ class GTEST_API_ ExitedWithCode {
|
||||
const int exit_code_;
|
||||
};
|
||||
|
||||
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
|
||||
#if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
|
||||
// Tests that an exit code describes an exit due to termination by a
|
||||
// given signal.
|
||||
class GTEST_API_ KilledBySignal {
|
||||
@@ -328,7 +328,7 @@ class GTEST_API_ KilledBySignal {
|
||||
// death tests are supported; otherwise they just issue a warning. This is
|
||||
// useful when you are combining death test assertions with normal test
|
||||
// assertions in one test.
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||
EXPECT_DEATH(statement, regex)
|
||||
#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
@@ -106,13 +107,13 @@ class MatchResultListener {
|
||||
MatchResultListener& operator=(const MatchResultListener&) = delete;
|
||||
};
|
||||
|
||||
inline MatchResultListener::~MatchResultListener() {}
|
||||
inline MatchResultListener::~MatchResultListener() = default;
|
||||
|
||||
// An instance of a subclass of this knows how to describe itself as a
|
||||
// matcher.
|
||||
class GTEST_API_ MatcherDescriberInterface {
|
||||
public:
|
||||
virtual ~MatcherDescriberInterface() {}
|
||||
virtual ~MatcherDescriberInterface() = default;
|
||||
|
||||
// Describes this matcher to an ostream. The function should print
|
||||
// a verb phrase that describes the property a value matching this
|
||||
@@ -178,43 +179,6 @@ class MatcherInterface : public MatcherDescriberInterface {
|
||||
|
||||
namespace internal {
|
||||
|
||||
struct AnyEq {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a == b;
|
||||
}
|
||||
};
|
||||
struct AnyNe {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a != b;
|
||||
}
|
||||
};
|
||||
struct AnyLt {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a < b;
|
||||
}
|
||||
};
|
||||
struct AnyGt {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a > b;
|
||||
}
|
||||
};
|
||||
struct AnyLe {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a <= b;
|
||||
}
|
||||
};
|
||||
struct AnyGe {
|
||||
template <typename A, typename B>
|
||||
bool operator()(const A& a, const B& b) const {
|
||||
return a >= b;
|
||||
}
|
||||
};
|
||||
|
||||
// A match result listener that ignores the explanation.
|
||||
class DummyMatchResultListener : public MatchResultListener {
|
||||
public:
|
||||
@@ -530,7 +494,7 @@ template <>
|
||||
class GTEST_API_ Matcher<const std::string&>
|
||||
: public internal::MatcherBase<const std::string&> {
|
||||
public:
|
||||
Matcher() {}
|
||||
Matcher() = default;
|
||||
|
||||
explicit Matcher(const MatcherInterface<const std::string&>* impl)
|
||||
: internal::MatcherBase<const std::string&>(impl) {}
|
||||
@@ -552,7 +516,7 @@ template <>
|
||||
class GTEST_API_ Matcher<std::string>
|
||||
: public internal::MatcherBase<std::string> {
|
||||
public:
|
||||
Matcher() {}
|
||||
Matcher() = default;
|
||||
|
||||
explicit Matcher(const MatcherInterface<const std::string&>* impl)
|
||||
: internal::MatcherBase<std::string>(impl) {}
|
||||
@@ -580,7 +544,7 @@ template <>
|
||||
class GTEST_API_ Matcher<const internal::StringView&>
|
||||
: public internal::MatcherBase<const internal::StringView&> {
|
||||
public:
|
||||
Matcher() {}
|
||||
Matcher() = default;
|
||||
|
||||
explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
|
||||
: internal::MatcherBase<const internal::StringView&>(impl) {}
|
||||
@@ -606,7 +570,7 @@ template <>
|
||||
class GTEST_API_ Matcher<internal::StringView>
|
||||
: public internal::MatcherBase<internal::StringView> {
|
||||
public:
|
||||
Matcher() {}
|
||||
Matcher() = default;
|
||||
|
||||
explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
|
||||
: internal::MatcherBase<internal::StringView>(impl) {}
|
||||
@@ -758,50 +722,53 @@ class ComparisonBase {
|
||||
};
|
||||
|
||||
template <typename Rhs>
|
||||
class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {
|
||||
class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>> {
|
||||
public:
|
||||
explicit EqMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) {}
|
||||
: ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>>(rhs) {}
|
||||
static const char* Desc() { return "is equal to"; }
|
||||
static const char* NegatedDesc() { return "isn't equal to"; }
|
||||
};
|
||||
template <typename Rhs>
|
||||
class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {
|
||||
class NeMatcher
|
||||
: public ComparisonBase<NeMatcher<Rhs>, Rhs, std::not_equal_to<>> {
|
||||
public:
|
||||
explicit NeMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) {}
|
||||
: ComparisonBase<NeMatcher<Rhs>, Rhs, std::not_equal_to<>>(rhs) {}
|
||||
static const char* Desc() { return "isn't equal to"; }
|
||||
static const char* NegatedDesc() { return "is equal to"; }
|
||||
};
|
||||
template <typename Rhs>
|
||||
class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {
|
||||
class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>> {
|
||||
public:
|
||||
explicit LtMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) {}
|
||||
: ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>>(rhs) {}
|
||||
static const char* Desc() { return "is <"; }
|
||||
static const char* NegatedDesc() { return "isn't <"; }
|
||||
};
|
||||
template <typename Rhs>
|
||||
class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {
|
||||
class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>> {
|
||||
public:
|
||||
explicit GtMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) {}
|
||||
: ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>>(rhs) {}
|
||||
static const char* Desc() { return "is >"; }
|
||||
static const char* NegatedDesc() { return "isn't >"; }
|
||||
};
|
||||
template <typename Rhs>
|
||||
class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {
|
||||
class LeMatcher
|
||||
: public ComparisonBase<LeMatcher<Rhs>, Rhs, std::less_equal<>> {
|
||||
public:
|
||||
explicit LeMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) {}
|
||||
: ComparisonBase<LeMatcher<Rhs>, Rhs, std::less_equal<>>(rhs) {}
|
||||
static const char* Desc() { return "is <="; }
|
||||
static const char* NegatedDesc() { return "isn't <="; }
|
||||
};
|
||||
template <typename Rhs>
|
||||
class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {
|
||||
class GeMatcher
|
||||
: public ComparisonBase<GeMatcher<Rhs>, Rhs, std::greater_equal<>> {
|
||||
public:
|
||||
explicit GeMatcher(const Rhs& rhs)
|
||||
: ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) {}
|
||||
: ComparisonBase<GeMatcher<Rhs>, Rhs, std::greater_equal<>>(rhs) {}
|
||||
static const char* Desc() { return "is >="; }
|
||||
static const char* NegatedDesc() { return "isn't >="; }
|
||||
};
|
||||
|
||||
@@ -56,6 +56,13 @@
|
||||
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
#include <type_traits>
|
||||
|
||||
#include "absl/strings/internal/has_absl_stringify.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
|
||||
/* class A needs to have dll-interface to be used by clients of class B */)
|
||||
|
||||
@@ -111,8 +118,17 @@ class GTEST_API_ Message {
|
||||
*ss_ << str;
|
||||
}
|
||||
|
||||
// Streams a non-pointer value to this object.
|
||||
template <typename T>
|
||||
// Streams a non-pointer value to this object. If building a version of
|
||||
// GoogleTest with ABSL, this overload is only enabled if the value does not
|
||||
// have an AbslStringify definition.
|
||||
template <typename T
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
,
|
||||
typename std::enable_if<
|
||||
!absl::strings_internal::HasAbslStringify<T>::value, // NOLINT
|
||||
int>::type = 0
|
||||
#endif // GTEST_HAS_ABSL
|
||||
>
|
||||
inline Message& operator<<(const T& val) {
|
||||
// Some libraries overload << for STL containers. These
|
||||
// overloads are defined in the global namespace instead of ::std.
|
||||
@@ -133,6 +149,22 @@ class GTEST_API_ Message {
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// Streams a non-pointer value with an AbslStringify definition to this
|
||||
// object.
|
||||
template <typename T,
|
||||
typename std::enable_if<
|
||||
absl::strings_internal::HasAbslStringify<T>::value, // NOLINT
|
||||
int>::type = 0>
|
||||
inline Message& operator<<(const T& val) {
|
||||
// ::operator<< is needed here for a similar reason as with the non-Abseil
|
||||
// version above
|
||||
using ::operator<<;
|
||||
*ss_ << absl::StrCat(val);
|
||||
return *this;
|
||||
}
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
// Streams a pointer value to this object.
|
||||
//
|
||||
// This function is an overload of the previous one. When you
|
||||
|
||||
@@ -449,7 +449,8 @@ internal::ParamConverterGenerator<T> ConvertGenerator(
|
||||
|
||||
#define TEST_P(test_suite_name, test_name) \
|
||||
class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
|
||||
: public test_suite_name, private ::testing::internal::GTestNonCopyable {\
|
||||
: public test_suite_name, \
|
||||
private ::testing::internal::GTestNonCopyable { \
|
||||
public: \
|
||||
GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \
|
||||
void TestBody() override; \
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
// 1. foo::PrintTo(const T&, ostream*)
|
||||
// 2. operator<<(ostream&, const T&) defined in either foo or the
|
||||
// global namespace.
|
||||
// * Prefer AbslStringify(..) to operator<<(..), per https://abseil.io/tips/215.
|
||||
// * Define foo::PrintTo(..) if the type already has AbslStringify(..), but an
|
||||
// alternative presentation in test results is of interest.
|
||||
//
|
||||
// However if T is an STL-style container then it is printed element-wise
|
||||
// unless foo::PrintTo(const T&, ostream*) is defined. Note that
|
||||
@@ -112,6 +115,10 @@
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
#include "absl/strings/internal/has_absl_stringify.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
#endif // GTEST_HAS_ABSL
|
||||
#include "gtest/internal/gtest-internal.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
@@ -206,12 +213,13 @@ struct StreamPrinter {
|
||||
// Don't accept member pointers here. We'd print them via implicit
|
||||
// conversion to bool, which isn't useful.
|
||||
typename = typename std::enable_if<
|
||||
!std::is_member_pointer<T>::value>::type,
|
||||
// Only accept types for which we can find a streaming operator via
|
||||
// ADL (possibly involving implicit conversions).
|
||||
typename = decltype(std::declval<std::ostream&>()
|
||||
<< std::declval<const T&>())>
|
||||
static void PrintValue(const T& value, ::std::ostream* os) {
|
||||
!std::is_member_pointer<T>::value>::type>
|
||||
// Only accept types for which we can find a streaming operator via
|
||||
// ADL (possibly involving implicit conversions).
|
||||
// (Use SFINAE via return type, because it seems GCC < 12 doesn't handle name
|
||||
// lookup properly when we do it in the template parameter list.)
|
||||
static auto PrintValue(const T& value, ::std::ostream* os)
|
||||
-> decltype((void)(*os << value)) {
|
||||
// Call streaming operator found by ADL, possibly with implicit conversions
|
||||
// of the arguments.
|
||||
*os << value;
|
||||
@@ -259,6 +267,18 @@ struct ConvertibleToStringViewPrinter {
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
struct ConvertibleToAbslStringifyPrinter {
|
||||
template <
|
||||
typename T,
|
||||
typename = typename std::enable_if<
|
||||
absl::strings_internal::HasAbslStringify<T>::value>::type> // NOLINT
|
||||
static void PrintValue(const T& value, ::std::ostream* os) {
|
||||
*os << absl::StrCat(value);
|
||||
}
|
||||
};
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
// Prints the given number of bytes in the given object to the given
|
||||
// ostream.
|
||||
GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
|
||||
@@ -297,8 +317,8 @@ struct FindFirstPrinter<
|
||||
// - Print containers (they have begin/end/etc).
|
||||
// - Print function pointers.
|
||||
// - Print object pointers.
|
||||
// - Use the stream operator, if available.
|
||||
// - Print protocol buffers.
|
||||
// - Use the stream operator, if available.
|
||||
// - Print types convertible to BiggestInt.
|
||||
// - Print types convertible to StringView, if available.
|
||||
// - Fallback to printing the raw bytes of the object.
|
||||
@@ -306,9 +326,13 @@ template <typename T>
|
||||
void PrintWithFallback(const T& value, ::std::ostream* os) {
|
||||
using Printer = typename FindFirstPrinter<
|
||||
T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter,
|
||||
ProtobufPrinter,
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
ConvertibleToAbslStringifyPrinter,
|
||||
#endif // GTEST_HAS_ABSL
|
||||
internal_stream_operator_without_lexical_name_lookup::StreamPrinter,
|
||||
ProtobufPrinter, ConvertibleToIntegerPrinter,
|
||||
ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type;
|
||||
ConvertibleToIntegerPrinter, ConvertibleToStringViewPrinter,
|
||||
RawBytesPrinter, FallbackPrinter>::type;
|
||||
Printer::PrintValue(value, os);
|
||||
}
|
||||
|
||||
@@ -473,7 +497,7 @@ GTEST_API_ void PrintTo(char32_t c, ::std::ostream* os);
|
||||
inline void PrintTo(char16_t c, ::std::ostream* os) {
|
||||
PrintTo(ImplicitCast_<char32_t>(c), os);
|
||||
}
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
inline void PrintTo(char8_t c, ::std::ostream* os) {
|
||||
PrintTo(ImplicitCast_<char32_t>(c), os);
|
||||
}
|
||||
@@ -529,7 +553,10 @@ int AppropriateResolution(FloatType val) {
|
||||
} else if (val >= 0.0001) {
|
||||
mulfor6 = 1e9;
|
||||
}
|
||||
if (static_cast<int32_t>(val * mulfor6 + 0.5) / mulfor6 == val) return 6;
|
||||
if (static_cast<FloatType>(static_cast<int32_t>(val * mulfor6 + 0.5)) /
|
||||
mulfor6 ==
|
||||
val)
|
||||
return 6;
|
||||
} else if (val < 1e10) {
|
||||
FloatType divfor6 = 1.0;
|
||||
if (val >= 1e9) { // 1,000,000,000 to 9,999,999,999
|
||||
@@ -541,7 +568,10 @@ int AppropriateResolution(FloatType val) {
|
||||
} else if (val >= 1e6) { // 1,000,000 to 9,999,999
|
||||
divfor6 = 10;
|
||||
}
|
||||
if (static_cast<int32_t>(val / divfor6 + 0.5) * divfor6 == val) return 6;
|
||||
if (static_cast<FloatType>(static_cast<int32_t>(val / divfor6 + 0.5)) *
|
||||
divfor6 ==
|
||||
val)
|
||||
return 6;
|
||||
}
|
||||
return full;
|
||||
}
|
||||
@@ -580,7 +610,7 @@ inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
|
||||
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
|
||||
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||
}
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
// Overloads for u8 strings.
|
||||
GTEST_API_ void PrintTo(const char8_t* s, ::std::ostream* os);
|
||||
inline void PrintTo(char8_t* s, ::std::ostream* os) {
|
||||
@@ -850,7 +880,7 @@ class UniversalPrinter<Variant<T...>> {
|
||||
public:
|
||||
static void Print(const Variant<T...>& value, ::std::ostream* os) {
|
||||
*os << '(';
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
absl::visit(Visitor{os, value.index()}, value);
|
||||
#else
|
||||
std::visit(Visitor{os, value.index()}, value);
|
||||
@@ -900,7 +930,7 @@ void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
|
||||
GTEST_API_ void UniversalPrintArray(const char* begin, size_t len,
|
||||
::std::ostream* os);
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
// This overload prints a (const) char8_t array compactly.
|
||||
GTEST_API_ void UniversalPrintArray(const char8_t* begin, size_t len,
|
||||
::std::ostream* os);
|
||||
@@ -996,7 +1026,7 @@ template <>
|
||||
class UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> {
|
||||
};
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
template <>
|
||||
class UniversalTersePrinter<const char8_t*> {
|
||||
public:
|
||||
|
||||
@@ -133,7 +133,7 @@ std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
|
||||
// virtual.
|
||||
class GTEST_API_ TestPartResultArray {
|
||||
public:
|
||||
TestPartResultArray() {}
|
||||
TestPartResultArray() = default;
|
||||
|
||||
// Appends the given TestPartResult to the array.
|
||||
void Append(const TestPartResult& result);
|
||||
@@ -154,7 +154,7 @@ class GTEST_API_ TestPartResultArray {
|
||||
// This interface knows how to report a test part result.
|
||||
class GTEST_API_ TestPartResultReporterInterface {
|
||||
public:
|
||||
virtual ~TestPartResultReporterInterface() {}
|
||||
virtual ~TestPartResultReporterInterface() = default;
|
||||
|
||||
virtual void ReportTestPartResult(const TestPartResult& result) = 0;
|
||||
};
|
||||
|
||||
@@ -267,28 +267,28 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
|
||||
TYPED_TEST_SUITE_P
|
||||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
|
||||
#define TYPED_TEST_P(SuiteName, TestName) \
|
||||
namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
|
||||
template <typename gtest_TypeParam_> \
|
||||
class TestName : public SuiteName<gtest_TypeParam_> { \
|
||||
private: \
|
||||
typedef SuiteName<gtest_TypeParam_> TestFixture; \
|
||||
typedef gtest_TypeParam_ TypeParam; \
|
||||
void TestBody() override; \
|
||||
}; \
|
||||
static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
|
||||
GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \
|
||||
__FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \
|
||||
GTEST_STRINGIFY_(TestName)); \
|
||||
} \
|
||||
template <typename gtest_TypeParam_> \
|
||||
void GTEST_SUITE_NAMESPACE_( \
|
||||
#define TYPED_TEST_P(SuiteName, TestName) \
|
||||
namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
|
||||
template <typename gtest_TypeParam_> \
|
||||
class TestName : public SuiteName<gtest_TypeParam_> { \
|
||||
private: \
|
||||
typedef SuiteName<gtest_TypeParam_> TestFixture; \
|
||||
typedef gtest_TypeParam_ TypeParam; \
|
||||
void TestBody() override; \
|
||||
}; \
|
||||
static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
|
||||
GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \
|
||||
__FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \
|
||||
GTEST_STRINGIFY_(TestName)); \
|
||||
} \
|
||||
template <typename gtest_TypeParam_> \
|
||||
void GTEST_SUITE_NAMESPACE_( \
|
||||
SuiteName)::TestName<gtest_TypeParam_>::TestBody()
|
||||
|
||||
// Note: this won't work correctly if the trailing arguments are macros.
|
||||
#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \
|
||||
namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
|
||||
typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \
|
||||
typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \
|
||||
} \
|
||||
static const char* const GTEST_REGISTERED_TEST_NAMES_( \
|
||||
SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \
|
||||
|
||||
@@ -166,11 +166,7 @@ namespace testing {
|
||||
|
||||
// Silence C4100 (unreferenced formal parameter) and 4805
|
||||
// unsafe mix of type 'const int' and type 'const bool'
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4805)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4805 4100)
|
||||
|
||||
// The upper limit for valid stack trace depths.
|
||||
const int kMaxStackTraceDepth = 100;
|
||||
@@ -201,8 +197,8 @@ std::set<std::string>* GetIgnoredParameterizedTestSuites();
|
||||
class GTestNonCopyable {
|
||||
public:
|
||||
GTestNonCopyable() = default;
|
||||
GTestNonCopyable(const GTestNonCopyable &) = delete;
|
||||
GTestNonCopyable &operator=(const GTestNonCopyable &) = delete;
|
||||
GTestNonCopyable(const GTestNonCopyable&) = delete;
|
||||
GTestNonCopyable& operator=(const GTestNonCopyable&) = delete;
|
||||
~GTestNonCopyable() = default;
|
||||
};
|
||||
|
||||
@@ -301,7 +297,13 @@ class GTEST_API_ Test {
|
||||
// SetUp/TearDown method of Environment objects registered with Google
|
||||
// Test) will be output as attributes of the <testsuites> element.
|
||||
static void RecordProperty(const std::string& key, const std::string& value);
|
||||
static void RecordProperty(const std::string& key, int64_t value);
|
||||
// We do not define a custom serialization except for values that can be
|
||||
// converted to int64_t, but other values could be logged in this way.
|
||||
template <typename T, std::enable_if_t<std::is_convertible<T, int64_t>::value,
|
||||
bool> = true>
|
||||
static void RecordProperty(const std::string& key, const T& value) {
|
||||
RecordProperty(key, (Message() << value).GetString());
|
||||
}
|
||||
|
||||
protected:
|
||||
// Creates a Test object.
|
||||
@@ -549,14 +551,14 @@ class GTEST_API_ TestInfo {
|
||||
// Returns the name of the parameter type, or NULL if this is not a typed
|
||||
// or a type-parameterized test.
|
||||
const char* type_param() const {
|
||||
if (type_param_.get() != nullptr) return type_param_->c_str();
|
||||
if (type_param_ != nullptr) return type_param_->c_str();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Returns the text representation of the value parameter, or NULL if this
|
||||
// is not a value-parameterized test.
|
||||
const char* value_param() const {
|
||||
if (value_param_.get() != nullptr) return value_param_->c_str();
|
||||
if (value_param_ != nullptr) return value_param_->c_str();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -598,7 +600,7 @@ class GTEST_API_ TestInfo {
|
||||
const TestResult* result() const { return &result_; }
|
||||
|
||||
private:
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
friend class internal::DefaultDeathTestFactory;
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
friend class Test;
|
||||
@@ -695,7 +697,7 @@ class GTEST_API_ TestSuite {
|
||||
// Returns the name of the parameter type, or NULL if this is not a
|
||||
// type-parameterized test suite.
|
||||
const char* type_param() const {
|
||||
if (type_param_.get() != nullptr) return type_param_->c_str();
|
||||
if (type_param_ != nullptr) return type_param_->c_str();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -892,7 +894,7 @@ class GTEST_API_ TestSuite {
|
||||
class Environment {
|
||||
public:
|
||||
// The d'tor is virtual as we need to subclass Environment.
|
||||
virtual ~Environment() {}
|
||||
virtual ~Environment() = default;
|
||||
|
||||
// Override this to define how to set up the environment.
|
||||
virtual void SetUp() {}
|
||||
@@ -923,7 +925,7 @@ class GTEST_API_ AssertionException
|
||||
// the order the corresponding events are fired.
|
||||
class TestEventListener {
|
||||
public:
|
||||
virtual ~TestEventListener() {}
|
||||
virtual ~TestEventListener() = default;
|
||||
|
||||
// Fired before any test activity starts.
|
||||
virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
|
||||
@@ -1053,6 +1055,10 @@ class GTEST_API_ TestEventListeners {
|
||||
return default_xml_generator_;
|
||||
}
|
||||
|
||||
// Controls whether events will be forwarded by the repeater to the
|
||||
// listeners in the list.
|
||||
void SuppressEventForwarding(bool);
|
||||
|
||||
private:
|
||||
friend class TestSuite;
|
||||
friend class TestInfo;
|
||||
@@ -1082,7 +1088,6 @@ class GTEST_API_ TestEventListeners {
|
||||
// Controls whether events will be forwarded by the repeater to the
|
||||
// listeners in the list.
|
||||
bool EventForwardingEnabled() const;
|
||||
void SuppressEventForwarding();
|
||||
|
||||
// The actual list of listeners.
|
||||
internal::TestEventRepeater* repeater_;
|
||||
@@ -1669,7 +1674,7 @@ template <typename T>
|
||||
class WithParamInterface {
|
||||
public:
|
||||
typedef T ParamType;
|
||||
virtual ~WithParamInterface() {}
|
||||
virtual ~WithParamInterface() = default;
|
||||
|
||||
// The current parameter value. Is also available in the test fixture's
|
||||
// constructor.
|
||||
@@ -1745,7 +1750,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
|
||||
|
||||
// Define this macro to 1 to omit the definition of FAIL(), which is a
|
||||
// generic name and clashes with some other libraries.
|
||||
#if !GTEST_DONT_DEFINE_FAIL
|
||||
#if !(defined(GTEST_DONT_DEFINE_FAIL) && GTEST_DONT_DEFINE_FAIL)
|
||||
#define FAIL() GTEST_FAIL()
|
||||
#endif
|
||||
|
||||
@@ -1754,7 +1759,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
|
||||
|
||||
// Define this macro to 1 to omit the definition of SUCCEED(), which
|
||||
// is a generic name and clashes with some other libraries.
|
||||
#if !GTEST_DONT_DEFINE_SUCCEED
|
||||
#if !(defined(GTEST_DONT_DEFINE_SUCCEED) && GTEST_DONT_DEFINE_SUCCEED)
|
||||
#define SUCCEED() GTEST_SUCCEED()
|
||||
#endif
|
||||
|
||||
@@ -1798,19 +1803,19 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
|
||||
// Define these macros to 1 to omit the definition of the corresponding
|
||||
// EXPECT or ASSERT, which clashes with some users' own code.
|
||||
|
||||
#if !GTEST_DONT_DEFINE_EXPECT_TRUE
|
||||
#if !(defined(GTEST_DONT_DEFINE_EXPECT_TRUE) && GTEST_DONT_DEFINE_EXPECT_TRUE)
|
||||
#define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_EXPECT_FALSE
|
||||
#if !(defined(GTEST_DONT_DEFINE_EXPECT_FALSE) && GTEST_DONT_DEFINE_EXPECT_FALSE)
|
||||
#define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_TRUE
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_TRUE) && GTEST_DONT_DEFINE_ASSERT_TRUE)
|
||||
#define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_FALSE
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_FALSE) && GTEST_DONT_DEFINE_ASSERT_FALSE)
|
||||
#define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition)
|
||||
#endif
|
||||
|
||||
@@ -1889,27 +1894,27 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
|
||||
// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
|
||||
// ASSERT_XY(), which clashes with some users' own code.
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_EQ
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_EQ) && GTEST_DONT_DEFINE_ASSERT_EQ)
|
||||
#define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_NE
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_NE) && GTEST_DONT_DEFINE_ASSERT_NE)
|
||||
#define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_LE
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_LE) && GTEST_DONT_DEFINE_ASSERT_LE)
|
||||
#define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_LT
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_LT) && GTEST_DONT_DEFINE_ASSERT_LT)
|
||||
#define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_GE
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_GE) && GTEST_DONT_DEFINE_ASSERT_GE)
|
||||
#define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
|
||||
#endif
|
||||
|
||||
#if !GTEST_DONT_DEFINE_ASSERT_GT
|
||||
#if !(defined(GTEST_DONT_DEFINE_ASSERT_GT) && GTEST_DONT_DEFINE_ASSERT_GT)
|
||||
#define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
|
||||
#endif
|
||||
|
||||
@@ -1997,7 +2002,7 @@ GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
|
||||
GTEST_API_ 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.
|
||||
@@ -2096,8 +2101,8 @@ class GTEST_API_ ScopedTrace {
|
||||
// Assuming that each thread maintains its own stack of traces.
|
||||
// Therefore, a SCOPED_TRACE() would (correctly) only affect the
|
||||
// assertions in its own thread.
|
||||
#define SCOPED_TRACE(message) \
|
||||
::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)( \
|
||||
#define SCOPED_TRACE(message) \
|
||||
const ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)( \
|
||||
__FILE__, __LINE__, (message))
|
||||
|
||||
// Compile-time assertion for type equality.
|
||||
@@ -2167,7 +2172,7 @@ constexpr bool StaticAssertTypeEq() noexcept {
|
||||
|
||||
// Define this macro to 1 to omit the definition of TEST(), which
|
||||
// is a generic name and clashes with some other libraries.
|
||||
#if !GTEST_DONT_DEFINE_TEST
|
||||
#if !(defined(GTEST_DONT_DEFINE_TEST) && GTEST_DONT_DEFINE_TEST)
|
||||
#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)
|
||||
#endif
|
||||
|
||||
@@ -2199,7 +2204,7 @@ constexpr bool StaticAssertTypeEq() noexcept {
|
||||
#define GTEST_TEST_F(test_fixture, test_name) \
|
||||
GTEST_TEST_(test_fixture, test_name, test_fixture, \
|
||||
::testing::internal::GetTypeId<test_fixture>())
|
||||
#if !GTEST_DONT_DEFINE_TEST_F
|
||||
#if !(defined(GTEST_DONT_DEFINE_TEST_F) && GTEST_DONT_DEFINE_TEST_F)
|
||||
#define TEST_F(test_fixture, test_name) GTEST_TEST_F(test_fixture, test_name)
|
||||
#endif
|
||||
|
||||
@@ -2214,9 +2219,7 @@ GTEST_API_ std::string TempDir();
|
||||
// in it should be considered read-only.
|
||||
GTEST_API_ std::string SrcDir();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4805 4100
|
||||
|
||||
// Dynamically registers a test with the framework.
|
||||
//
|
||||
|
||||
@@ -57,7 +57,7 @@ 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
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
|
||||
/* class A needs to have dll-interface to be used by clients of class B */)
|
||||
@@ -88,7 +88,7 @@ class GTEST_API_ DeathTest {
|
||||
static bool Create(const char* statement, Matcher<const std::string&> matcher,
|
||||
const char* file, int line, DeathTest** test);
|
||||
DeathTest();
|
||||
virtual ~DeathTest() {}
|
||||
virtual ~DeathTest() = default;
|
||||
|
||||
// A helper class that aborts a death test when it's deleted.
|
||||
class ReturnSentinel {
|
||||
@@ -153,7 +153,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
||||
// Factory interface for death tests. May be mocked out for testing.
|
||||
class DeathTestFactory {
|
||||
public:
|
||||
virtual ~DeathTestFactory() {}
|
||||
virtual ~DeathTestFactory() = default;
|
||||
virtual bool Create(const char* statement,
|
||||
Matcher<const std::string&> matcher, const char* file,
|
||||
int line, DeathTest** test) = 0;
|
||||
@@ -238,7 +238,7 @@ inline Matcher<const ::std::string&> MakeDeathTestMatcher(
|
||||
} \
|
||||
break; \
|
||||
case ::testing::internal::DeathTest::EXECUTE_TEST: { \
|
||||
::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
|
||||
const ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
|
||||
gtest_dt); \
|
||||
GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
|
||||
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
@@ -307,9 +307,6 @@ class FloatingPoint {
|
||||
// Returns the floating-point number that represent positive infinity.
|
||||
static RawType Infinity() { return ReinterpretBits(kExponentBitMask); }
|
||||
|
||||
// Returns the maximum representable finite floating-point number.
|
||||
static RawType Max();
|
||||
|
||||
// Non-static methods
|
||||
|
||||
// Returns the bits that represents this number.
|
||||
@@ -390,17 +387,6 @@ class FloatingPoint {
|
||||
FloatingPointUnion u_;
|
||||
};
|
||||
|
||||
// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
|
||||
// macro defined by <windows.h>.
|
||||
template <>
|
||||
inline float FloatingPoint<float>::Max() {
|
||||
return FLT_MAX;
|
||||
}
|
||||
template <>
|
||||
inline double FloatingPoint<double>::Max() {
|
||||
return DBL_MAX;
|
||||
}
|
||||
|
||||
// Typedefs the instances of the FloatingPoint template class that we
|
||||
// care to use.
|
||||
typedef FloatingPoint<float> Float;
|
||||
@@ -449,7 +435,7 @@ GTEST_API_ TypeId GetTestTypeId();
|
||||
// of a Test object.
|
||||
class TestFactoryBase {
|
||||
public:
|
||||
virtual ~TestFactoryBase() {}
|
||||
virtual ~TestFactoryBase() = default;
|
||||
|
||||
// Creates a test instance to run. The instance is both created and destroyed
|
||||
// within TestInfoImpl::Run()
|
||||
@@ -471,7 +457,7 @@ class TestFactoryImpl : public TestFactoryBase {
|
||||
Test* CreateTest() override { return new TestClass; }
|
||||
};
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Predicate-formatters for implementing the HRESULT checking macros
|
||||
// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
|
||||
@@ -914,8 +900,10 @@ class HasDebugStringAndShortDebugString {
|
||||
HasDebugStringType::value && HasShortDebugStringType::value;
|
||||
};
|
||||
|
||||
#ifdef GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
|
||||
template <typename T>
|
||||
constexpr bool HasDebugStringAndShortDebugString<T>::value;
|
||||
#endif
|
||||
|
||||
// When the compiler sees expression IsContainerTest<C>(0), if C is an
|
||||
// STL-style container class, the first overload of IsContainerTest
|
||||
@@ -1509,19 +1497,20 @@ class NeverThrown {
|
||||
gtest_ar_, text, #actual, #expected) \
|
||||
.c_str())
|
||||
|
||||
#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (::testing::internal::AlwaysTrue()) { \
|
||||
::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
|
||||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
||||
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__) \
|
||||
: fail("Expected: " #statement \
|
||||
" doesn't generate new fatal " \
|
||||
"failures in the current thread.\n" \
|
||||
#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (::testing::internal::AlwaysTrue()) { \
|
||||
const ::testing::internal::HasNewFatalFailureHelper \
|
||||
gtest_fatal_failure_checker; \
|
||||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
||||
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
|
||||
} \
|
||||
} else /* NOLINT */ \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__) \
|
||||
: fail("Expected: " #statement \
|
||||
" doesn't generate new fatal " \
|
||||
"failures in the current thread.\n" \
|
||||
" Actual: it does.")
|
||||
|
||||
// Expands to the name of the class that implements the given test.
|
||||
|
||||
@@ -97,7 +97,7 @@ class ParamGenerator;
|
||||
template <typename T>
|
||||
class ParamIteratorInterface {
|
||||
public:
|
||||
virtual ~ParamIteratorInterface() {}
|
||||
virtual ~ParamIteratorInterface() = default;
|
||||
// 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.
|
||||
@@ -171,7 +171,7 @@ class ParamGeneratorInterface {
|
||||
public:
|
||||
typedef T ParamType;
|
||||
|
||||
virtual ~ParamGeneratorInterface() {}
|
||||
virtual ~ParamGeneratorInterface() = default;
|
||||
|
||||
// Generator interface definition
|
||||
virtual ParamIteratorInterface<T>* Begin() const = 0;
|
||||
@@ -215,7 +215,7 @@ class RangeGenerator : public ParamGeneratorInterface<T> {
|
||||
end_(end),
|
||||
step_(step),
|
||||
end_index_(CalculateEndIndex(begin, end, step)) {}
|
||||
~RangeGenerator() override {}
|
||||
~RangeGenerator() override = default;
|
||||
|
||||
ParamIteratorInterface<T>* Begin() const override {
|
||||
return new Iterator(this, begin_, 0, step_);
|
||||
@@ -230,7 +230,7 @@ class RangeGenerator : public ParamGeneratorInterface<T> {
|
||||
Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
|
||||
IncrementT step)
|
||||
: base_(base), value_(value), index_(index), step_(step) {}
|
||||
~Iterator() override {}
|
||||
~Iterator() override = default;
|
||||
|
||||
const ParamGeneratorInterface<T>* BaseGenerator() const override {
|
||||
return base_;
|
||||
@@ -299,7 +299,7 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
|
||||
template <typename ForwardIterator>
|
||||
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
|
||||
: container_(begin, end) {}
|
||||
~ValuesInIteratorRangeGenerator() override {}
|
||||
~ValuesInIteratorRangeGenerator() override = default;
|
||||
|
||||
ParamIteratorInterface<T>* Begin() const override {
|
||||
return new Iterator(this, container_.begin());
|
||||
@@ -316,7 +316,7 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
|
||||
Iterator(const ParamGeneratorInterface<T>* base,
|
||||
typename ContainerType::const_iterator iterator)
|
||||
: base_(base), iterator_(iterator) {}
|
||||
~Iterator() override {}
|
||||
~Iterator() override = default;
|
||||
|
||||
const ParamGeneratorInterface<T>* BaseGenerator() const override {
|
||||
return base_;
|
||||
@@ -420,7 +420,7 @@ class ParameterizedTestFactory : public TestFactoryBase {
|
||||
template <class ParamType>
|
||||
class TestMetaFactoryBase {
|
||||
public:
|
||||
virtual ~TestMetaFactoryBase() {}
|
||||
virtual ~TestMetaFactoryBase() = default;
|
||||
|
||||
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
|
||||
};
|
||||
@@ -439,7 +439,7 @@ class TestMetaFactory
|
||||
public:
|
||||
using ParamType = typename TestSuite::ParamType;
|
||||
|
||||
TestMetaFactory() {}
|
||||
TestMetaFactory() = default;
|
||||
|
||||
TestFactoryBase* CreateTestFactory(ParamType parameter) override {
|
||||
return new ParameterizedTestFactory<TestSuite>(parameter);
|
||||
@@ -462,7 +462,7 @@ class TestMetaFactory
|
||||
// and calls RegisterTests() on each of them when asked.
|
||||
class ParameterizedTestSuiteInfoBase {
|
||||
public:
|
||||
virtual ~ParameterizedTestSuiteInfoBase() {}
|
||||
virtual ~ParameterizedTestSuiteInfoBase() = default;
|
||||
|
||||
// Base part of test suite name for display purposes.
|
||||
virtual const std::string& GetTestSuiteName() const = 0;
|
||||
@@ -691,7 +691,7 @@ using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;
|
||||
// ParameterizedTestSuiteInfo descriptors.
|
||||
class ParameterizedTestSuiteRegistry {
|
||||
public:
|
||||
ParameterizedTestSuiteRegistry() {}
|
||||
ParameterizedTestSuiteRegistry() = default;
|
||||
~ParameterizedTestSuiteRegistry() {
|
||||
for (auto& test_suite_info : test_suite_infos_) {
|
||||
delete test_suite_info;
|
||||
@@ -794,10 +794,7 @@ internal::ParamGenerator<typename Container::value_type> ValuesIn(
|
||||
namespace internal {
|
||||
// Used in the Values() function to provide polymorphic capabilities.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4100)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
|
||||
|
||||
template <typename... Ts>
|
||||
class ValueArray {
|
||||
@@ -818,9 +815,7 @@ class ValueArray {
|
||||
FlatTuple<Ts...> v_;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100
|
||||
|
||||
template <typename... T>
|
||||
class CartesianProductGenerator
|
||||
@@ -830,7 +825,7 @@ class CartesianProductGenerator
|
||||
|
||||
CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)
|
||||
: generators_(g) {}
|
||||
~CartesianProductGenerator() override {}
|
||||
~CartesianProductGenerator() override = default;
|
||||
|
||||
ParamIteratorInterface<ParamType>* Begin() const override {
|
||||
return new Iterator(this, generators_, false);
|
||||
@@ -855,7 +850,7 @@ class CartesianProductGenerator
|
||||
current_(is_end ? end_ : begin_) {
|
||||
ComputeCurrentValue();
|
||||
}
|
||||
~IteratorImpl() override {}
|
||||
~IteratorImpl() override = default;
|
||||
|
||||
const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {
|
||||
return base_;
|
||||
@@ -956,7 +951,7 @@ class CartesianProductHolder {
|
||||
template <typename From, typename To>
|
||||
class ParamGeneratorConverter : public ParamGeneratorInterface<To> {
|
||||
public:
|
||||
ParamGeneratorConverter(ParamGenerator<From> gen) // NOLINT
|
||||
ParamGeneratorConverter(ParamGenerator<From> gen) // NOLINT
|
||||
: generator_(std::move(gen)) {}
|
||||
|
||||
ParamIteratorInterface<To>* Begin() const override {
|
||||
@@ -974,7 +969,7 @@ class ParamGeneratorConverter : public ParamGeneratorInterface<To> {
|
||||
: base_(base), it_(it), end_(end) {
|
||||
if (it_ != end_) value_ = std::make_shared<To>(static_cast<To>(*it_));
|
||||
}
|
||||
~Iterator() override {}
|
||||
~Iterator() override = default;
|
||||
|
||||
const ParamGeneratorInterface<To>* BaseGenerator() const override {
|
||||
return base_;
|
||||
|
||||
@@ -113,6 +113,10 @@
|
||||
#define GTEST_OS_XTENSA 1
|
||||
#elif defined(__hexagon__)
|
||||
#define GTEST_OS_QURT 1
|
||||
#elif defined(CPU_QN9090) || defined(CPU_QN9090HN)
|
||||
#define GTEST_OS_NXP_QN9090 1
|
||||
#elif defined(NRF52)
|
||||
#define GTEST_OS_NRF52 1
|
||||
#endif // __CYGWIN__
|
||||
|
||||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
|
||||
|
||||
@@ -161,10 +161,10 @@
|
||||
// NOT define them.
|
||||
//
|
||||
// These macros are public so that portable tests can be written.
|
||||
// Such tests typically surround code using a feature with an #if
|
||||
// Such tests typically surround code using a feature with an #ifdef
|
||||
// which controls that code. For example:
|
||||
//
|
||||
// #if GTEST_HAS_DEATH_TEST
|
||||
// #ifdef GTEST_HAS_DEATH_TEST
|
||||
// EXPECT_DEATH(DoSomethingDeadly());
|
||||
// #endif
|
||||
//
|
||||
@@ -178,6 +178,7 @@
|
||||
// define themselves.
|
||||
// GTEST_USES_SIMPLE_RE - our own simple regex is used;
|
||||
// the above RE\b(s) are mutually exclusive.
|
||||
// GTEST_HAS_ABSL - Google Test is compiled with Abseil.
|
||||
|
||||
// Misc public macros
|
||||
// ------------------
|
||||
@@ -202,16 +203,24 @@
|
||||
// is suppressed.
|
||||
// GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or
|
||||
// UniversalPrinter<absl::any> specializations.
|
||||
// Always defined to 0 or 1.
|
||||
// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional>
|
||||
// or
|
||||
// UniversalPrinter<absl::optional>
|
||||
// specializations.
|
||||
// specializations. Always defined to 0 or 1.
|
||||
// GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
|
||||
// Matcher<absl::string_view>
|
||||
// specializations.
|
||||
// specializations. Always defined to 0 or 1.
|
||||
// GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or
|
||||
// UniversalPrinter<absl::variant>
|
||||
// specializations.
|
||||
// specializations. Always defined to 0 or 1.
|
||||
// GTEST_USE_OWN_FLAGFILE_FLAG_ - Always defined to 0 or 1.
|
||||
// GTEST_HAS_CXXABI_H_ - Always defined to 0 or 1.
|
||||
// GTEST_CAN_STREAM_RESULTS_ - Always defined to 0 or 1.
|
||||
// GTEST_HAS_ALT_PATH_SEP_ - Always defined to 0 or 1.
|
||||
// GTEST_WIDE_STRING_USES_UTF16_ - Always defined to 0 or 1.
|
||||
// GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - Always defined to 0 or 1.
|
||||
// GTEST_HAS_NOTIFICATION_- Always defined to 0 or 1.
|
||||
//
|
||||
// Synchronization:
|
||||
// Mutex, MutexLock, ThreadLocal, GetThreadCount()
|
||||
@@ -303,7 +312,15 @@
|
||||
#include "gtest/internal/custom/gtest-port.h"
|
||||
#include "gtest/internal/gtest-port-arch.h"
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifndef GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
|
||||
#define GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 0
|
||||
#endif
|
||||
|
||||
#ifndef GTEST_HAS_NOTIFICATION_
|
||||
#define GTEST_HAS_NOTIFICATION_ 0
|
||||
#endif
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
#include "absl/flags/declare.h"
|
||||
#include "absl/flags/flag.h"
|
||||
#include "absl/flags/reflection.h"
|
||||
@@ -361,13 +378,13 @@
|
||||
// Brings in definitions for functions used in the testing::internal::posix
|
||||
// namespace (read, write, close, chdir, isatty, stat). We do not currently
|
||||
// use them on Windows Mobile.
|
||||
#if GTEST_OS_WINDOWS
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#ifndef GTEST_OS_WINDOWS_MOBILE
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#endif
|
||||
// In order to avoid having to include <windows.h>, use forward declaration
|
||||
#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
|
||||
#if defined(GTEST_OS_WINDOWS_MINGW) && !defined(__MINGW64_VERSION_MAJOR)
|
||||
// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
|
||||
// separate (equivalent) structs, instead of using typedef
|
||||
typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
@@ -377,7 +394,7 @@ typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
|
||||
typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#endif
|
||||
#elif GTEST_OS_XTENSA
|
||||
#elif defined(GTEST_OS_XTENSA)
|
||||
#include <unistd.h>
|
||||
// Xtensa toolchains define strcasecmp in the string.h header instead of
|
||||
// strings.h. string.h is already included.
|
||||
@@ -389,7 +406,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#include <unistd.h>
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_LINUX_ANDROID
|
||||
#ifdef GTEST_OS_LINUX_ANDROID
|
||||
// Used to define __ANDROID_API__ matching the target NDK API level.
|
||||
#include <android/api-level.h> // NOLINT
|
||||
#endif
|
||||
@@ -397,17 +414,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// Defines this to true if and only if Google Test can use POSIX regular
|
||||
// expressions.
|
||||
#ifndef GTEST_HAS_POSIX_RE
|
||||
#if GTEST_OS_LINUX_ANDROID
|
||||
#ifdef GTEST_OS_LINUX_ANDROID
|
||||
// On Android, <regex.h> is only available starting with Gingerbread.
|
||||
#define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
|
||||
#else
|
||||
#define GTEST_HAS_POSIX_RE \
|
||||
!(GTEST_OS_WINDOWS || GTEST_OS_XTENSA || GTEST_OS_QURT)
|
||||
#if !(defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_XTENSA) || \
|
||||
defined(GTEST_OS_QURT))
|
||||
#define GTEST_HAS_POSIX_RE 1
|
||||
#else
|
||||
#define GTEST_HAS_POSIX_RE 0
|
||||
#endif
|
||||
#endif // GTEST_OS_LINUX_ANDROID
|
||||
#endif
|
||||
|
||||
// Select the regular expression implementation.
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// When using Abseil, RE2 is required.
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "re2/re2.h"
|
||||
@@ -443,8 +464,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// cleanups prior to that. To reliably check for C++ exception availability with
|
||||
// clang, check for
|
||||
// __EXCEPTIONS && __has_feature(cxx_exceptions).
|
||||
#define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
|
||||
#elif defined(__GNUC__) && __EXCEPTIONS
|
||||
#if defined(__EXCEPTIONS) && __EXCEPTIONS && __has_feature(cxx_exceptions)
|
||||
#define GTEST_HAS_EXCEPTIONS 1
|
||||
#else
|
||||
#define GTEST_HAS_EXCEPTIONS 0
|
||||
#endif
|
||||
#elif defined(__GNUC__) && defined(__EXCEPTIONS) && __EXCEPTIONS
|
||||
// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
|
||||
#define GTEST_HAS_EXCEPTIONS 1
|
||||
#elif defined(__SUNPRO_CC)
|
||||
@@ -452,7 +477,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// detecting whether they are enabled or not. Therefore, we assume that
|
||||
// they are enabled unless the user tells us otherwise.
|
||||
#define GTEST_HAS_EXCEPTIONS 1
|
||||
#elif defined(__IBMCPP__) && __EXCEPTIONS
|
||||
#elif defined(__IBMCPP__) && defined(__EXCEPTIONS) && __EXCEPTIONS
|
||||
// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
|
||||
#define GTEST_HAS_EXCEPTIONS 1
|
||||
#elif defined(__HP_aCC)
|
||||
@@ -472,11 +497,15 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// Cygwin 1.7 and below doesn't support ::std::wstring.
|
||||
// Solaris' libc++ doesn't support it either. Android has
|
||||
// no support for it at least as recent as Froyo (2.2).
|
||||
#define GTEST_HAS_STD_WSTRING \
|
||||
(!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
|
||||
GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || \
|
||||
GTEST_OS_XTENSA || GTEST_OS_QURT))
|
||||
|
||||
#if (!(defined(GTEST_OS_LINUX_ANDROID) || defined(GTEST_OS_CYGWIN) || \
|
||||
defined(GTEST_OS_SOLARIS) || defined(GTEST_OS_HAIKU) || \
|
||||
defined(GTEST_OS_ESP32) || defined(GTEST_OS_ESP8266) || \
|
||||
defined(GTEST_OS_XTENSA) || defined(GTEST_OS_QURT) || \
|
||||
defined(GTEST_OS_NXP_QN9090) || defined(GTEST_OS_NRF52)))
|
||||
#define GTEST_HAS_STD_WSTRING 1
|
||||
#else
|
||||
#define GTEST_HAS_STD_WSTRING 0
|
||||
#endif
|
||||
#endif // GTEST_HAS_STD_WSTRING
|
||||
|
||||
#ifndef GTEST_HAS_FILE_SYSTEM
|
||||
@@ -506,7 +535,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// -frtti -fno-exceptions, the build fails at link time with undefined
|
||||
// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
|
||||
// so disable RTTI when detected.
|
||||
#if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && !defined(__EXCEPTIONS)
|
||||
#if defined(GTEST_OS_LINUX_ANDROID) && defined(_STLPORT_MAJOR) && \
|
||||
!defined(__EXCEPTIONS)
|
||||
#define GTEST_HAS_RTTI 0
|
||||
#else
|
||||
#define GTEST_HAS_RTTI 1
|
||||
@@ -554,11 +584,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
//
|
||||
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
|
||||
// to your compiler flags.
|
||||
#define GTEST_HAS_PTHREAD \
|
||||
(GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \
|
||||
GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
|
||||
GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \
|
||||
GTEST_OS_HAIKU || GTEST_OS_GNU_HURD)
|
||||
#if (defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || \
|
||||
defined(GTEST_OS_HPUX) || defined(GTEST_OS_QNX) || \
|
||||
defined(GTEST_OS_FREEBSD) || defined(GTEST_OS_NACL) || \
|
||||
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \
|
||||
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \
|
||||
defined(GTEST_OS_OPENBSD) || defined(GTEST_OS_HAIKU) || \
|
||||
defined(GTEST_OS_GNU_HURD))
|
||||
#define GTEST_HAS_PTHREAD 1
|
||||
#else
|
||||
#define GTEST_HAS_PTHREAD 0
|
||||
#endif
|
||||
#endif // GTEST_HAS_PTHREAD
|
||||
|
||||
#if GTEST_HAS_PTHREAD
|
||||
@@ -577,8 +613,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#ifndef GTEST_HAS_CLONE
|
||||
// The user didn't tell us, so we need to figure it out.
|
||||
|
||||
#if GTEST_OS_LINUX && !defined(__ia64__)
|
||||
#if GTEST_OS_LINUX_ANDROID
|
||||
#if defined(GTEST_OS_LINUX) && !defined(__ia64__)
|
||||
#if defined(GTEST_OS_LINUX_ANDROID)
|
||||
// On Android, clone() became available at different API levels for each 32-bit
|
||||
// architecture.
|
||||
#if defined(__LP64__) || (defined(__arm__) && __ANDROID_API__ >= 9) || \
|
||||
@@ -603,9 +639,10 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// By default, we assume that stream redirection is supported on all
|
||||
// platforms except known mobile / embedded ones. Also, if the port doesn't have
|
||||
// a file system, stream redirection is not supported.
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
|
||||
GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA || \
|
||||
GTEST_OS_QURT || !GTEST_HAS_FILE_SYSTEM
|
||||
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \
|
||||
defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_ESP8266) || \
|
||||
defined(GTEST_OS_XTENSA) || defined(GTEST_OS_QURT) || \
|
||||
!GTEST_HAS_FILE_SYSTEM
|
||||
#define GTEST_HAS_STREAM_REDIRECTION 0
|
||||
#else
|
||||
#define GTEST_HAS_STREAM_REDIRECTION 1
|
||||
@@ -614,13 +651,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
|
||||
// Determines whether to support death tests.
|
||||
// pops up a dialog window that cannot be suppressed programmatically.
|
||||
#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
|
||||
(GTEST_OS_MAC && !GTEST_OS_IOS) || \
|
||||
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \
|
||||
GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \
|
||||
GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
|
||||
GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU || \
|
||||
GTEST_OS_GNU_HURD)
|
||||
#if (defined(GTEST_OS_LINUX) || defined(GTEST_OS_CYGWIN) || \
|
||||
defined(GTEST_OS_SOLARIS) || \
|
||||
(defined(GTEST_OS_MAC) && !defined(GTEST_OS_IOS)) || \
|
||||
(defined(GTEST_OS_WINDOWS_DESKTOP) && _MSC_VER) || \
|
||||
defined(GTEST_OS_WINDOWS_MINGW) || defined(GTEST_OS_AIX) || \
|
||||
defined(GTEST_OS_HPUX) || defined(GTEST_OS_OPENBSD) || \
|
||||
defined(GTEST_OS_QNX) || defined(GTEST_OS_FREEBSD) || \
|
||||
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \
|
||||
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \
|
||||
defined(GTEST_OS_HAIKU) || defined(GTEST_OS_GNU_HURD))
|
||||
// Death tests require a file system to work properly.
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
#define GTEST_HAS_DEATH_TEST 1
|
||||
@@ -638,14 +678,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#endif
|
||||
|
||||
// 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_AIX || GTEST_OS_OS2)
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_CYGWIN) || \
|
||||
defined(GTEST_OS_AIX) || defined(GTEST_OS_OS2)
|
||||
#define GTEST_WIDE_STRING_USES_UTF16_ 1
|
||||
#else
|
||||
#define GTEST_WIDE_STRING_USES_UTF16_ 0
|
||||
#endif
|
||||
|
||||
// Determines whether test results can be streamed to a socket.
|
||||
#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \
|
||||
GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD || \
|
||||
GTEST_OS_GNU_HURD
|
||||
#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_GNU_KFREEBSD) || \
|
||||
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
|
||||
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_OPENBSD) || \
|
||||
defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_MAC)
|
||||
#define GTEST_CAN_STREAM_RESULTS_ 1
|
||||
#else
|
||||
#define GTEST_CAN_STREAM_RESULTS_ 0
|
||||
#endif
|
||||
|
||||
// Defines some utility macros.
|
||||
@@ -712,7 +759,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
|
||||
__attribute__((format(__MINGW_PRINTF_FORMAT, string_index, first_to_check)))
|
||||
#elif GTEST_HAVE_ATTRIBUTE_(format)
|
||||
#define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
|
||||
#define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
|
||||
__attribute__((format(printf, string_index, first_to_check)))
|
||||
#else
|
||||
#define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)
|
||||
@@ -759,14 +806,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
|
||||
#ifndef GTEST_IS_THREADSAFE
|
||||
|
||||
#define GTEST_IS_THREADSAFE \
|
||||
(GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
|
||||
(GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \
|
||||
GTEST_HAS_PTHREAD)
|
||||
#if (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
|
||||
(defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_PHONE) && \
|
||||
!defined(GTEST_OS_WINDOWS_RT)) || \
|
||||
GTEST_HAS_PTHREAD)
|
||||
#define GTEST_IS_THREADSAFE 1
|
||||
#endif
|
||||
|
||||
#endif // GTEST_IS_THREADSAFE
|
||||
|
||||
#if GTEST_IS_THREADSAFE
|
||||
#ifdef GTEST_IS_THREADSAFE
|
||||
// Some platforms don't support including these threading related headers.
|
||||
#include <condition_variable> // NOLINT
|
||||
#include <mutex> // NOLINT
|
||||
@@ -808,7 +857,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
// Ask the compiler not to perform tail call optimization inside
|
||||
// the marked function.
|
||||
#define GTEST_NO_TAIL_CALL_ __attribute__((disable_tail_calls))
|
||||
#elif __GNUC__
|
||||
#elif defined(__GNUC__) && !defined(__NVCOMPILER)
|
||||
#define GTEST_NO_TAIL_CALL_ \
|
||||
__attribute__((optimize("no-optimize-sibling-calls")))
|
||||
#else
|
||||
@@ -871,9 +920,11 @@ using std::tuple_size;
|
||||
namespace internal {
|
||||
|
||||
// A secret type that Google Test users don't know about. It has no
|
||||
// definition on purpose. Therefore it's impossible to create a
|
||||
// accessible constructors on purpose. Therefore it's impossible to create a
|
||||
// Secret object, which is what we want.
|
||||
class Secret;
|
||||
class Secret {
|
||||
Secret(const Secret&) = delete;
|
||||
};
|
||||
|
||||
// A helper for suppressing warnings on constant condition. It just
|
||||
// returns 'condition'.
|
||||
@@ -881,7 +932,7 @@ GTEST_API_ bool IsTrue(bool condition);
|
||||
|
||||
// Defines RE.
|
||||
|
||||
#if GTEST_USES_RE2
|
||||
#ifdef GTEST_USES_RE2
|
||||
|
||||
// This is almost `using RE = ::RE2`, except it is copy-constructible, and it
|
||||
// needs to disambiguate the `std::string`, `absl::string_view`, and `const
|
||||
@@ -906,7 +957,9 @@ class GTEST_API_ RE {
|
||||
RE2 regex_;
|
||||
};
|
||||
|
||||
#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
|
||||
#elif defined(GTEST_USES_POSIX_RE) || defined(GTEST_USES_SIMPLE_RE)
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
|
||||
/* class A needs to have dll-interface to be used by clients of class B */)
|
||||
|
||||
// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
|
||||
// Regular Expression syntax.
|
||||
@@ -923,7 +976,7 @@ class GTEST_API_ RE {
|
||||
~RE();
|
||||
|
||||
// Returns the string representation of the regex.
|
||||
const char* pattern() const { return pattern_; }
|
||||
const char* pattern() const { return pattern_.c_str(); }
|
||||
|
||||
// FullMatch(str, re) returns true if and only if regular expression re
|
||||
// matches the entire str.
|
||||
@@ -941,21 +994,21 @@ class GTEST_API_ RE {
|
||||
|
||||
private:
|
||||
void Init(const char* regex);
|
||||
const char* pattern_;
|
||||
std::string pattern_;
|
||||
bool is_valid_;
|
||||
|
||||
#if GTEST_USES_POSIX_RE
|
||||
#ifdef 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();
|
||||
std::string full_pattern_; // For FullMatch();
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
||||
#endif // ::testing::internal::RE implementation
|
||||
|
||||
// Formats a source file path and a line number as they would appear
|
||||
@@ -1088,47 +1141,6 @@ inline To ImplicitCast_(To x) {
|
||||
return x;
|
||||
}
|
||||
|
||||
// When you upcast (that is, cast a pointer from type Foo to type
|
||||
// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
|
||||
// always succeed. When you downcast (that is, cast a pointer from
|
||||
// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
|
||||
// how do you know the pointer is really of type SubclassOfFoo? It
|
||||
// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
|
||||
// when you downcast, you should use this macro. In debug mode, we
|
||||
// use dynamic_cast<> to double-check the downcast is legal (we die
|
||||
// if it's not). In normal mode, we do the efficient static_cast<>
|
||||
// instead. Thus, it's important to test in debug mode to make sure
|
||||
// the cast is legal!
|
||||
// This is the only place in the code we should use dynamic_cast<>.
|
||||
// In particular, you SHOULDN'T be using dynamic_cast<> in order to
|
||||
// do RTTI (eg code like this:
|
||||
// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
|
||||
// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
|
||||
// You should design the code some other way not to need this.
|
||||
//
|
||||
// This relatively ugly name is intentional. It prevents clashes with
|
||||
// similar functions users may have (e.g., down_cast). The internal
|
||||
// namespace alone is not enough because the function can be found by ADL.
|
||||
template <typename To, typename From> // use like this: DownCast_<T*>(foo);
|
||||
inline To DownCast_(From* f) { // so we only accept pointers
|
||||
// Ensures that To is a sub-type of From *. This test is here only
|
||||
// for compile-time type checking, and has no overhead in an
|
||||
// optimized build at run-time, as it will be optimized away
|
||||
// completely.
|
||||
GTEST_INTENTIONAL_CONST_COND_PUSH_()
|
||||
if (false) {
|
||||
GTEST_INTENTIONAL_CONST_COND_POP_()
|
||||
const To to = nullptr;
|
||||
::testing::internal::ImplicitCast_<From*>(to);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_RTTI
|
||||
// RTTI: debug mode only!
|
||||
GTEST_CHECK_(f == nullptr || dynamic_cast<To>(f) != nullptr);
|
||||
#endif
|
||||
return static_cast<To>(f);
|
||||
}
|
||||
|
||||
// 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.
|
||||
@@ -1136,17 +1148,12 @@ inline To DownCast_(From* f) { // so we only accept pointers
|
||||
// check to enforce this.
|
||||
template <class Derived, class Base>
|
||||
Derived* CheckedDowncastToActualType(Base* base) {
|
||||
static_assert(std::is_base_of<Base, Derived>::value,
|
||||
"target type not derived from source type");
|
||||
#if GTEST_HAS_RTTI
|
||||
GTEST_CHECK_(typeid(*base) == typeid(Derived));
|
||||
#endif
|
||||
|
||||
#if GTEST_HAS_DOWNCAST_
|
||||
return ::down_cast<Derived*>(base);
|
||||
#elif GTEST_HAS_RTTI
|
||||
return dynamic_cast<Derived*>(base); // NOLINT
|
||||
#else
|
||||
return static_cast<Derived*>(base); // Poor man's downcast.
|
||||
GTEST_CHECK_(base == nullptr || dynamic_cast<Derived*>(base) != nullptr);
|
||||
#endif
|
||||
return static_cast<Derived*>(base);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_STREAM_REDIRECTION
|
||||
@@ -1172,7 +1179,7 @@ GTEST_API_ std::string ReadEntireFile(FILE* file);
|
||||
// All command line arguments.
|
||||
GTEST_API_ std::vector<std::string> GetArgvs();
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
std::vector<std::string> GetInjectableArgvs();
|
||||
// Deprecated: pass the args vector by value instead.
|
||||
@@ -1183,9 +1190,9 @@ void ClearInjectableArgvs();
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Defines synchronization primitives.
|
||||
#if GTEST_IS_THREADSAFE
|
||||
#ifdef GTEST_IS_THREADSAFE
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Provides leak-safe Windows kernel handle ownership.
|
||||
// Used in death tests and in threading support.
|
||||
class GTEST_API_ AutoHandle {
|
||||
@@ -1264,7 +1271,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
||||
// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
|
||||
// defined, but we don't want to use MinGW's pthreads implementation, which
|
||||
// has conformance problems with some versions of the POSIX standard.
|
||||
#if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
|
||||
#if GTEST_HAS_PTHREAD && !defined(GTEST_OS_WINDOWS_MINGW)
|
||||
|
||||
// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
|
||||
// Consequently, it cannot select a correct instantiation of ThreadWithParam
|
||||
@@ -1273,7 +1280,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
|
||||
// problem.
|
||||
class ThreadWithParamBase {
|
||||
public:
|
||||
virtual ~ThreadWithParamBase() {}
|
||||
virtual ~ThreadWithParamBase() = default;
|
||||
virtual void Run() = 0;
|
||||
};
|
||||
|
||||
@@ -1350,7 +1357,8 @@ class ThreadWithParam : public ThreadWithParamBase {
|
||||
// Mutex and ThreadLocal have already been imported into the namespace.
|
||||
// Nothing to do here.
|
||||
|
||||
#elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
|
||||
#elif defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_PHONE) && \
|
||||
!defined(GTEST_OS_WINDOWS_RT)
|
||||
|
||||
// Mutex implements mutex on Windows platforms. It is used in conjunction
|
||||
// with class MutexLock:
|
||||
@@ -1734,7 +1742,7 @@ typedef GTestMutexLock MutexLock;
|
||||
// ThreadLocalValueHolderBase.
|
||||
class GTEST_API_ ThreadLocalValueHolderBase {
|
||||
public:
|
||||
virtual ~ThreadLocalValueHolderBase() {}
|
||||
virtual ~ThreadLocalValueHolderBase() = default;
|
||||
};
|
||||
|
||||
// Called by pthread to delete thread-local data stored by
|
||||
@@ -1806,8 +1814,8 @@ class GTEST_API_ ThreadLocal {
|
||||
|
||||
class ValueHolderFactory {
|
||||
public:
|
||||
ValueHolderFactory() {}
|
||||
virtual ~ValueHolderFactory() {}
|
||||
ValueHolderFactory() = default;
|
||||
virtual ~ValueHolderFactory() = default;
|
||||
virtual ValueHolder* MakeNewHolder() const = 0;
|
||||
|
||||
private:
|
||||
@@ -1817,7 +1825,7 @@ class GTEST_API_ ThreadLocal {
|
||||
|
||||
class DefaultValueHolderFactory : public ValueHolderFactory {
|
||||
public:
|
||||
DefaultValueHolderFactory() {}
|
||||
DefaultValueHolderFactory() = default;
|
||||
ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
|
||||
|
||||
private:
|
||||
@@ -1903,7 +1911,7 @@ class GTEST_API_ ThreadLocal {
|
||||
// we cannot detect it.
|
||||
GTEST_API_ size_t GetThreadCount();
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#define GTEST_PATH_SEP_ "\\"
|
||||
#define GTEST_HAS_ALT_PATH_SEP_ 1
|
||||
#else
|
||||
@@ -1939,7 +1947,7 @@ inline bool IsUpper(char ch) {
|
||||
inline bool IsXDigit(char ch) {
|
||||
return isxdigit(static_cast<unsigned char>(ch)) != 0;
|
||||
}
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
inline bool IsXDigit(char8_t ch) {
|
||||
return isxdigit(static_cast<unsigned char>(ch)) != 0;
|
||||
}
|
||||
@@ -1980,11 +1988,11 @@ namespace posix {
|
||||
|
||||
// File system porting.
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
typedef struct _stat StatStruct;
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
|
||||
// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
|
||||
// time and thus not defined there.
|
||||
@@ -1995,7 +2003,7 @@ inline int RmDir(const char* dir) { return _rmdir(dir); }
|
||||
inline bool IsDir(const StatStruct& st) { return (_S_IFDIR & st.st_mode) != 0; }
|
||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
#elif GTEST_OS_ESP8266
|
||||
#elif defined(GTEST_OS_ESP8266)
|
||||
typedef struct stat StatStruct;
|
||||
|
||||
inline int FileNo(FILE* file) { return fileno(file); }
|
||||
@@ -2012,7 +2020,7 @@ typedef struct stat StatStruct;
|
||||
|
||||
inline int FileNo(FILE* file) { return fileno(file); }
|
||||
inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
|
||||
#if GTEST_OS_QURT
|
||||
#ifdef GTEST_OS_QURT
|
||||
// QuRT doesn't support any directory functions, including rmdir
|
||||
inline int RmDir(const char*) { return 0; }
|
||||
#else
|
||||
@@ -2025,17 +2033,17 @@ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
|
||||
|
||||
// Other functions with a different name on Windows.
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
inline int DoIsATTY(int fd) { return isatty(fd); }
|
||||
inline int StrCaseCmp(const char* s1, const char* s2) {
|
||||
return stricmp(s1, s2);
|
||||
}
|
||||
inline char* StrDup(const char* src) { return strdup(src); }
|
||||
#else // !__BORLANDC__
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \
|
||||
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)
|
||||
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_ZOS) || \
|
||||
defined(GTEST_OS_IOS) || defined(GTEST_OS_WINDOWS_PHONE) || \
|
||||
defined(GTEST_OS_WINDOWS_RT) || defined(ESP_PLATFORM)
|
||||
inline int DoIsATTY(int /* fd */) { return 0; }
|
||||
#else
|
||||
inline int DoIsATTY(int fd) { return _isatty(fd); }
|
||||
@@ -2043,24 +2051,14 @@ inline int DoIsATTY(int fd) { return _isatty(fd); }
|
||||
inline int StrCaseCmp(const char* s1, const char* s2) {
|
||||
return _stricmp(s1, s2);
|
||||
}
|
||||
inline char* StrDup(const char* src) { return _strdup(src); }
|
||||
#endif // __BORLANDC__
|
||||
|
||||
#elif GTEST_OS_ESP8266
|
||||
|
||||
inline int DoIsATTY(int fd) { return isatty(fd); }
|
||||
inline int StrCaseCmp(const char* s1, const char* s2) {
|
||||
return strcasecmp(s1, s2);
|
||||
}
|
||||
inline char* StrDup(const char* src) { return strdup(src); }
|
||||
|
||||
#else
|
||||
|
||||
inline int DoIsATTY(int fd) { return isatty(fd); }
|
||||
inline int StrCaseCmp(const char* s1, const char* s2) {
|
||||
return strcasecmp(s1, s2);
|
||||
}
|
||||
inline char* StrDup(const char* src) { return strdup(src); }
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
@@ -2083,13 +2081,13 @@ GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
|
||||
// StrError() aren't needed on Windows CE at this time and thus not
|
||||
// defined there.
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \
|
||||
!GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA && \
|
||||
!GTEST_OS_QURT
|
||||
#if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_WINDOWS_PHONE) && \
|
||||
!defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_ESP8266) && \
|
||||
!defined(GTEST_OS_XTENSA) && !defined(GTEST_OS_QURT)
|
||||
inline int ChDir(const char* dir) { return chdir(dir); }
|
||||
#endif
|
||||
inline FILE* FOpen(const char* path, const char* mode) {
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MINGW)
|
||||
struct wchar_codecvt : public std::codecvt<wchar_t, char, std::mbstate_t> {};
|
||||
std::wstring_convert<wchar_codecvt> converter;
|
||||
std::wstring wide_path = converter.from_bytes(path);
|
||||
@@ -2099,14 +2097,14 @@ inline FILE* FOpen(const char* path, const char* mode) {
|
||||
return fopen(path, mode);
|
||||
#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
|
||||
}
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
#if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_QURT)
|
||||
inline FILE* FReopen(const char* path, const char* mode, FILE* stream) {
|
||||
return freopen(path, mode, stream);
|
||||
}
|
||||
inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
|
||||
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
inline int FClose(FILE* fp) { return fclose(fp); }
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
#if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_QURT)
|
||||
inline int Read(int fd, void* buf, unsigned int count) {
|
||||
return static_cast<int>(read(fd, buf, count));
|
||||
}
|
||||
@@ -2117,14 +2115,14 @@ inline int Close(int fd) { return close(fd); }
|
||||
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
#endif // GTEST_HAS_FILE_SYSTEM
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
#if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_QURT)
|
||||
inline const char* StrError(int errnum) { return strerror(errnum); }
|
||||
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
|
||||
|
||||
inline const char* GetEnv(const char* name) {
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
|
||||
GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA || \
|
||||
GTEST_OS_QURT
|
||||
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \
|
||||
defined(GTEST_OS_ESP8266) || defined(GTEST_OS_XTENSA) || \
|
||||
defined(GTEST_OS_QURT)
|
||||
// We are on an embedded platform, which has no environment variables.
|
||||
static_cast<void>(name); // To prevent 'unused argument' warning.
|
||||
return nullptr;
|
||||
@@ -2140,7 +2138,7 @@ inline const char* GetEnv(const char* name) {
|
||||
|
||||
GTEST_DISABLE_MSC_DEPRECATED_POP_()
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
// 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.
|
||||
@@ -2156,7 +2154,7 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_()
|
||||
// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
|
||||
// function in order to achieve that. We use macro definition here because
|
||||
// snprintf is a variadic function.
|
||||
#if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if defined(_MSC_VER) && !defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
// MSVC 2005 and above support variadic macros.
|
||||
#define GTEST_SNPRINTF_(buffer, size, format, ...) \
|
||||
_snprintf_s(buffer, size, size, format, __VA_ARGS__)
|
||||
@@ -2229,7 +2227,7 @@ using TimeInMillis = int64_t; // Represents time in milliseconds.
|
||||
#endif // !defined(GTEST_FLAG)
|
||||
|
||||
// Pick a command line flags implementation.
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
|
||||
// Macros for defining flags.
|
||||
#define GTEST_DEFINE_bool_(name, default_val, doc) \
|
||||
@@ -2340,7 +2338,7 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
|
||||
|
||||
#endif // !defined(GTEST_INTERNAL_DEPRECATED)
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// Always use absl::any for UniversalPrinter<> specializations if googletest
|
||||
// is built with absl support.
|
||||
#define GTEST_INTERNAL_HAS_ANY 1
|
||||
@@ -2352,7 +2350,8 @@ using Any = ::absl::any;
|
||||
} // namespace testing
|
||||
#else
|
||||
#ifdef __has_include
|
||||
#if __has_include(<any>) && __cplusplus >= 201703L
|
||||
#if __has_include(<any>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L && \
|
||||
(!defined(_MSC_VER) || GTEST_HAS_RTTI)
|
||||
// Otherwise for C++17 and higher use std::any for UniversalPrinter<>
|
||||
// specializations.
|
||||
#define GTEST_INTERNAL_HAS_ANY 1
|
||||
@@ -2364,11 +2363,15 @@ using Any = ::std::any;
|
||||
} // namespace testing
|
||||
// The case where absl is configured NOT to alias std::any is not
|
||||
// supported.
|
||||
#endif // __has_include(<any>) && __cplusplus >= 201703L
|
||||
#endif // __has_include(<any>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
#endif // __has_include
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifndef GTEST_INTERNAL_HAS_ANY
|
||||
#define GTEST_INTERNAL_HAS_ANY 0
|
||||
#endif
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// Always use absl::optional for UniversalPrinter<> specializations if
|
||||
// googletest is built with absl support.
|
||||
#define GTEST_INTERNAL_HAS_OPTIONAL 1
|
||||
@@ -2382,7 +2385,7 @@ inline ::absl::nullopt_t Nullopt() { return ::absl::nullopt; }
|
||||
} // namespace testing
|
||||
#else
|
||||
#ifdef __has_include
|
||||
#if __has_include(<optional>) && __cplusplus >= 201703L
|
||||
#if __has_include(<optional>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
// Otherwise for C++17 and higher use std::optional for UniversalPrinter<>
|
||||
// specializations.
|
||||
#define GTEST_INTERNAL_HAS_OPTIONAL 1
|
||||
@@ -2396,11 +2399,15 @@ inline ::std::nullopt_t Nullopt() { return ::std::nullopt; }
|
||||
} // namespace testing
|
||||
// The case where absl is configured NOT to alias std::optional is not
|
||||
// supported.
|
||||
#endif // __has_include(<optional>) && __cplusplus >= 201703L
|
||||
#endif // __has_include(<optional>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
#endif // __has_include
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifndef GTEST_INTERNAL_HAS_OPTIONAL
|
||||
#define GTEST_INTERNAL_HAS_OPTIONAL 0
|
||||
#endif
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// Always use absl::string_view for Matcher<> specializations if googletest
|
||||
// is built with absl support.
|
||||
#define GTEST_INTERNAL_HAS_STRING_VIEW 1
|
||||
@@ -2412,7 +2419,7 @@ using StringView = ::absl::string_view;
|
||||
} // namespace testing
|
||||
#else
|
||||
#ifdef __has_include
|
||||
#if __has_include(<string_view>) && __cplusplus >= 201703L
|
||||
#if __has_include(<string_view>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
// Otherwise for C++17 and higher use std::string_view for Matcher<>
|
||||
// specializations.
|
||||
#define GTEST_INTERNAL_HAS_STRING_VIEW 1
|
||||
@@ -2424,11 +2431,16 @@ using StringView = ::std::string_view;
|
||||
} // namespace testing
|
||||
// The case where absl is configured NOT to alias std::string_view is not
|
||||
// supported.
|
||||
#endif // __has_include(<string_view>) && __cplusplus >= 201703L
|
||||
#endif // __has_include(<string_view>) && GTEST_INTERNAL_CPLUSPLUS_LANG >=
|
||||
// 201703L
|
||||
#endif // __has_include
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifndef GTEST_INTERNAL_HAS_STRING_VIEW
|
||||
#define GTEST_INTERNAL_HAS_STRING_VIEW 0
|
||||
#endif
|
||||
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
// Always use absl::variant for UniversalPrinter<> specializations if googletest
|
||||
// is built with absl support.
|
||||
#define GTEST_INTERNAL_HAS_VARIANT 1
|
||||
@@ -2441,7 +2453,7 @@ using Variant = ::absl::variant<T...>;
|
||||
} // namespace testing
|
||||
#else
|
||||
#ifdef __has_include
|
||||
#if __has_include(<variant>) && __cplusplus >= 201703L
|
||||
#if __has_include(<variant>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
// Otherwise for C++17 and higher use std::variant for UniversalPrinter<>
|
||||
// specializations.
|
||||
#define GTEST_INTERNAL_HAS_VARIANT 1
|
||||
@@ -2453,8 +2465,17 @@ using Variant = ::std::variant<T...>;
|
||||
} // namespace internal
|
||||
} // namespace testing
|
||||
// The case where absl is configured NOT to alias std::variant is not supported.
|
||||
#endif // __has_include(<variant>) && __cplusplus >= 201703L
|
||||
#endif // __has_include(<variant>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
|
||||
#endif // __has_include
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
#ifndef GTEST_INTERNAL_HAS_VARIANT
|
||||
#define GTEST_INTERNAL_HAS_VARIANT 0
|
||||
#endif
|
||||
|
||||
#if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
|
||||
GTEST_INTERNAL_CPLUSPLUS_LANG < 201703L
|
||||
#define GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL 1
|
||||
#endif
|
||||
|
||||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
|
||||
|
||||
@@ -73,7 +73,7 @@ class GTEST_API_ String {
|
||||
// memory using malloc().
|
||||
static const char* CloneCString(const char* c_str);
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
|
||||
// able to pass strings to Win32 APIs on CE we need to convert them
|
||||
// to 'Unicode', UTF-16.
|
||||
|
||||
@@ -67,6 +67,22 @@ inline std::string CanonicalizeForStdLibVersioning(std::string s) {
|
||||
s.erase(strlen("std"), end - strlen("std"));
|
||||
}
|
||||
}
|
||||
|
||||
// Strip redundant spaces in typename to match MSVC
|
||||
// For example, std::pair<int, bool> -> std::pair<int,bool>
|
||||
static const char to_search[] = ", ";
|
||||
static const char replace_str[] = ",";
|
||||
size_t pos = 0;
|
||||
while (true) {
|
||||
// Get the next occurrence from the current position
|
||||
pos = s.find(to_search, pos);
|
||||
if (pos == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
// Replace this occurrence of substring
|
||||
s.replace(pos, strlen(to_search), replace_str);
|
||||
pos += strlen(replace_str);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -85,6 +101,20 @@ inline std::string GetTypeName(const std::type_info& type) {
|
||||
const std::string name_str(status == 0 ? readable_name : name);
|
||||
free(readable_name);
|
||||
return CanonicalizeForStdLibVersioning(name_str);
|
||||
#elif defined(_MSC_VER)
|
||||
// Strip struct and class due to differences between
|
||||
// MSVC and other compilers. std::pair<int,bool> is printed as
|
||||
// "struct std::pair<int,bool>" when using MSVC vs "std::pair<int, bool>" with
|
||||
// other compilers.
|
||||
std::string s = name;
|
||||
// Only strip the leading "struct " and "class ", so uses rfind == 0 to
|
||||
// ensure that
|
||||
if (s.rfind("struct ", 0) == 0) {
|
||||
s = s.substr(strlen("struct "));
|
||||
} else if (s.rfind("class ", 0) == 0) {
|
||||
s = s.substr(strlen("class "));
|
||||
}
|
||||
return s;
|
||||
#else
|
||||
return name;
|
||||
#endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
// The prime table interface.
|
||||
class PrimeTable {
|
||||
public:
|
||||
virtual ~PrimeTable() {}
|
||||
virtual ~PrimeTable() = default;
|
||||
|
||||
// Returns true if and only if n is a prime number.
|
||||
virtual bool IsPrime(int n) const = 0;
|
||||
@@ -78,8 +78,9 @@ 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);
|
||||
: is_prime_size_(std::max(1, max + 1)),
|
||||
is_prime_(new bool[static_cast<size_t>(is_prime_size_)]) {
|
||||
CalculatePrimesUpTo(is_prime_size_ - 1);
|
||||
}
|
||||
~PreCalculatedPrimeTable() override { delete[] is_prime_; }
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ using ::testing::InitGoogleTest;
|
||||
using ::testing::Test;
|
||||
using ::testing::TestEventListeners;
|
||||
using ::testing::TestInfo;
|
||||
using ::testing::TestPartResult;
|
||||
using ::testing::UnitTest;
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
// and each test is given one combination as a parameter.
|
||||
|
||||
// Use class definitions to test from this header.
|
||||
#include <tuple>
|
||||
|
||||
#include "prime_tables.h"
|
||||
#include "gtest/gtest.h"
|
||||
namespace {
|
||||
|
||||
@@ -40,7 +40,6 @@ using ::testing::Test;
|
||||
using ::testing::TestEventListeners;
|
||||
using ::testing::TestInfo;
|
||||
using ::testing::TestPartResult;
|
||||
using ::testing::TestSuite;
|
||||
using ::testing::UnitTest;
|
||||
namespace {
|
||||
// Provides alternative output mode which produces minimal amount of
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace testing {
|
||||
// Used in EXPECT_TRUE/FALSE(assertion_result).
|
||||
AssertionResult::AssertionResult(const AssertionResult& other)
|
||||
: success_(other.success_),
|
||||
message_(other.message_.get() != nullptr
|
||||
message_(other.message_ != nullptr
|
||||
? new ::std::string(*other.message_)
|
||||
: static_cast< ::std::string*>(nullptr)) {}
|
||||
|
||||
@@ -58,7 +58,7 @@ void AssertionResult::swap(AssertionResult& other) {
|
||||
// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
|
||||
AssertionResult AssertionResult::operator!() const {
|
||||
AssertionResult negation(!success_);
|
||||
if (message_.get() != nullptr) negation << *message_;
|
||||
if (message_ != nullptr) negation << *message_;
|
||||
return negation;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,14 +33,18 @@
|
||||
#include "gtest/gtest-death-test.h"
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/internal/custom/gtest.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_OS_MAC
|
||||
#ifdef GTEST_OS_MAC
|
||||
#include <crt_externs.h>
|
||||
#endif // GTEST_OS_MAC
|
||||
|
||||
@@ -48,24 +52,24 @@
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <signal.h>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
#include <sys/wait.h>
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_QNX
|
||||
#ifdef GTEST_OS_QNX
|
||||
#include <spawn.h>
|
||||
#endif // GTEST_OS_QNX
|
||||
|
||||
#if GTEST_OS_FUCHSIA
|
||||
#ifdef GTEST_OS_FUCHSIA
|
||||
#include <lib/fdio/fd.h>
|
||||
#include <lib/fdio/io.h>
|
||||
#include <lib/fdio/spawn.h>
|
||||
@@ -131,13 +135,13 @@ GTEST_DEFINE_string_(
|
||||
|
||||
namespace testing {
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Valid only for fast death tests. Indicates the code is running in the
|
||||
// child process of a fast style death test.
|
||||
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
|
||||
#if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
|
||||
static bool g_in_fast_death_test_child = false;
|
||||
#endif
|
||||
|
||||
@@ -147,7 +151,7 @@ static bool g_in_fast_death_test_child = false;
|
||||
// tests. IMPORTANT: This is an internal utility. Using it may break the
|
||||
// implementation of death tests. User code MUST NOT use it.
|
||||
bool InDeathTestChild() {
|
||||
#if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
// On Windows and Fuchsia, death tests are thread-safe regardless of the value
|
||||
// of the death_test_style flag.
|
||||
@@ -169,7 +173,7 @@ ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {}
|
||||
|
||||
// ExitedWithCode function-call operator.
|
||||
bool ExitedWithCode::operator()(int exit_status) const {
|
||||
#if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
return exit_status == exit_code_;
|
||||
|
||||
@@ -180,7 +184,7 @@ bool ExitedWithCode::operator()(int exit_status) const {
|
||||
#endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
|
||||
}
|
||||
|
||||
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
|
||||
#if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
|
||||
// KilledBySignal constructor.
|
||||
KilledBySignal::KilledBySignal(int signum) : signum_(signum) {}
|
||||
|
||||
@@ -207,7 +211,7 @@ namespace internal {
|
||||
static std::string ExitSummary(int exit_code) {
|
||||
Message m;
|
||||
|
||||
#if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
m << "Exited with exit status " << exit_code;
|
||||
|
||||
@@ -234,7 +238,7 @@ bool ExitedUnsuccessfully(int exit_status) {
|
||||
return !ExitedWithCode(0)(exit_status);
|
||||
}
|
||||
|
||||
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
|
||||
#if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA)
|
||||
// Generates a textual failure message when a death test finds more than
|
||||
// one thread running, or cannot determine the number of threads, prior
|
||||
// to executing the given statement. It is the responsibility of the
|
||||
@@ -263,7 +267,7 @@ static const char kDeathTestReturned = 'R';
|
||||
static const char kDeathTestThrew = 'T';
|
||||
static const char kDeathTestInternalError = 'I';
|
||||
|
||||
#if GTEST_OS_FUCHSIA
|
||||
#ifdef GTEST_OS_FUCHSIA
|
||||
|
||||
// File descriptor used for the pipe in the child process.
|
||||
static const int kFuchsiaReadPipeFd = 3;
|
||||
@@ -621,7 +625,21 @@ bool DeathTestImpl::Passed(bool status_ok) {
|
||||
return success;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifndef GTEST_OS_WINDOWS
|
||||
// Note: The return value points into args, so the return value's lifetime is
|
||||
// bound to that of args.
|
||||
static std::unique_ptr<char*[]> CreateArgvFromArgs(
|
||||
std::vector<std::string>& args) {
|
||||
auto result = std::make_unique<char*[]>(args.size() + 1);
|
||||
for (size_t i = 0; i < args.size(); ++i) {
|
||||
result[i] = &args[i][0];
|
||||
}
|
||||
result[args.size()] = nullptr; // extra null terminator
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// WindowsDeathTest implements death tests on Windows. Due to the
|
||||
// specifics of starting new processes on Windows, death tests there are
|
||||
// always threadsafe, and Google Test considers the
|
||||
@@ -808,7 +826,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
|
||||
return OVERSEE_TEST;
|
||||
}
|
||||
|
||||
#elif GTEST_OS_FUCHSIA
|
||||
#elif defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
class FuchsiaDeathTest : public DeathTestImpl {
|
||||
public:
|
||||
@@ -836,36 +854,6 @@ class FuchsiaDeathTest : public DeathTestImpl {
|
||||
zx::socket stderr_socket_;
|
||||
};
|
||||
|
||||
// Utility class for accumulating command-line arguments.
|
||||
class Arguments {
|
||||
public:
|
||||
Arguments() { args_.push_back(nullptr); }
|
||||
|
||||
~Arguments() {
|
||||
for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
|
||||
++i) {
|
||||
free(*i);
|
||||
}
|
||||
}
|
||||
void AddArgument(const char* argument) {
|
||||
args_.insert(args_.end() - 1, posix::StrDup(argument));
|
||||
}
|
||||
|
||||
template <typename Str>
|
||||
void AddArguments(const ::std::vector<Str>& arguments) {
|
||||
for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
|
||||
i != arguments.end(); ++i) {
|
||||
args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
|
||||
}
|
||||
}
|
||||
char* const* Argv() { return &args_[0]; }
|
||||
|
||||
int size() { return static_cast<int>(args_.size()) - 1; }
|
||||
|
||||
private:
|
||||
std::vector<char*> args_;
|
||||
};
|
||||
|
||||
// Waits for the child in a death test to exit, returning its exit
|
||||
// status, or 0 if no child process exists. As a side effect, sets the
|
||||
// outcome data member.
|
||||
@@ -986,10 +974,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
|
||||
kInternalRunDeathTestFlag + "=" + file_ +
|
||||
"|" + StreamableToString(line_) + "|" +
|
||||
StreamableToString(death_test_index);
|
||||
Arguments args;
|
||||
args.AddArguments(GetInjectableArgvs());
|
||||
args.AddArgument(filter_flag.c_str());
|
||||
args.AddArgument(internal_flag.c_str());
|
||||
|
||||
std::vector<std::string> args = GetInjectableArgvs();
|
||||
args.push_back(filter_flag);
|
||||
args.push_back(internal_flag);
|
||||
|
||||
// Build the pipe for communication with the child.
|
||||
zx_status_t status;
|
||||
@@ -1041,8 +1029,14 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
// Spawn the child process.
|
||||
status = fdio_spawn_etc(child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0],
|
||||
args.Argv(), nullptr, 2, spawn_actions,
|
||||
// Note: The test component must have `fuchsia.process.Launcher` declared
|
||||
// in its manifest. (Fuchsia integration tests require creating a
|
||||
// "Fuchsia Test Component" which contains a "Fuchsia Component Manifest")
|
||||
// Launching processes is a privileged operation in Fuchsia, and the
|
||||
// declaration indicates that the ability is required for the component.
|
||||
std::unique_ptr<char*[]> argv = CreateArgvFromArgs(args);
|
||||
status = fdio_spawn_etc(child_job, FDIO_SPAWN_CLONE_ALL, argv[0], argv.get(),
|
||||
nullptr, 2, spawn_actions,
|
||||
child_process_.reset_and_get_address(), nullptr);
|
||||
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);
|
||||
|
||||
@@ -1134,7 +1128,7 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {
|
||||
LogToStderr();
|
||||
// Event forwarding to the listeners of event listener API mush be shut
|
||||
// down in death test subprocesses.
|
||||
GetUnitTestImpl()->listeners()->SuppressEventForwarding();
|
||||
GetUnitTestImpl()->listeners()->SuppressEventForwarding(true);
|
||||
g_in_fast_death_test_child = true;
|
||||
return EXECUTE_TEST;
|
||||
} else {
|
||||
@@ -1173,34 +1167,6 @@ class ExecDeathTest : public ForkingDeathTest {
|
||||
const int line_;
|
||||
};
|
||||
|
||||
// Utility class for accumulating command-line arguments.
|
||||
class Arguments {
|
||||
public:
|
||||
Arguments() { args_.push_back(nullptr); }
|
||||
|
||||
~Arguments() {
|
||||
for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
|
||||
++i) {
|
||||
free(*i);
|
||||
}
|
||||
}
|
||||
void AddArgument(const char* argument) {
|
||||
args_.insert(args_.end() - 1, posix::StrDup(argument));
|
||||
}
|
||||
|
||||
template <typename Str>
|
||||
void AddArguments(const ::std::vector<Str>& arguments) {
|
||||
for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
|
||||
i != arguments.end(); ++i) {
|
||||
args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
|
||||
}
|
||||
}
|
||||
char* const* Argv() { return &args_[0]; }
|
||||
|
||||
private:
|
||||
std::vector<char*> args_;
|
||||
};
|
||||
|
||||
// A struct that encompasses the arguments to the child process of a
|
||||
// threadsafe-style death test process.
|
||||
struct ExecDeathTestArgs {
|
||||
@@ -1208,7 +1174,7 @@ struct ExecDeathTestArgs {
|
||||
int close_fd; // File descriptor to close; the read end of a pipe
|
||||
};
|
||||
|
||||
#if GTEST_OS_QNX
|
||||
#ifdef GTEST_OS_QNX
|
||||
extern "C" char** environ;
|
||||
#else // GTEST_OS_QNX
|
||||
// The main function for a threadsafe-style death test child process.
|
||||
@@ -1289,7 +1255,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
|
||||
ExecDeathTestArgs args = {argv, close_fd};
|
||||
pid_t child_pid = -1;
|
||||
|
||||
#if GTEST_OS_QNX
|
||||
#ifdef GTEST_OS_QNX
|
||||
// Obtains the current directory and sets it to be closed in the child
|
||||
// process.
|
||||
const int cwd_fd = open(".", O_RDONLY);
|
||||
@@ -1320,7 +1286,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
|
||||
|
||||
#else // GTEST_OS_QNX
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
// When a SIGPROF signal is received while fork() or clone() are executing,
|
||||
// the process may hang. To avoid this, we ignore SIGPROF here and re-enable
|
||||
// it after the call to fork()/clone() is complete.
|
||||
@@ -1367,11 +1333,10 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
|
||||
#endif // GTEST_HAS_CLONE
|
||||
|
||||
if (use_fork && (child_pid = fork()) == 0) {
|
||||
ExecDeathTestChildMain(&args);
|
||||
_exit(0);
|
||||
_exit(ExecDeathTestChildMain(&args));
|
||||
}
|
||||
#endif // GTEST_OS_QNX
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(
|
||||
sigaction(SIGPROF, &saved_sigprof_action, nullptr));
|
||||
#endif // GTEST_OS_LINUX
|
||||
@@ -1410,10 +1375,9 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
||||
StreamableToString(line_) + "|" +
|
||||
StreamableToString(death_test_index) + "|" +
|
||||
StreamableToString(pipe_fd[1]);
|
||||
Arguments args;
|
||||
args.AddArguments(GetArgvsForDeathTestChildProcess());
|
||||
args.AddArgument(filter_flag.c_str());
|
||||
args.AddArgument(internal_flag.c_str());
|
||||
std::vector<std::string> args = GetArgvsForDeathTestChildProcess();
|
||||
args.push_back(filter_flag);
|
||||
args.push_back(internal_flag);
|
||||
|
||||
DeathTest::set_last_death_test_message("");
|
||||
|
||||
@@ -1422,7 +1386,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
||||
// is necessary.
|
||||
FlushInfoLog();
|
||||
|
||||
const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
|
||||
std::unique_ptr<char*[]> argv = CreateArgvFromArgs(args);
|
||||
const pid_t child_pid = ExecDeathTestSpawnChild(argv.get(), pipe_fd[0]);
|
||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
||||
set_child_pid(child_pid);
|
||||
set_read_fd(pipe_fd[0]);
|
||||
@@ -1463,14 +1428,14 @@ bool DefaultDeathTestFactory::Create(const char* statement,
|
||||
}
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
if (GTEST_FLAG_GET(death_test_style) == "threadsafe" ||
|
||||
GTEST_FLAG_GET(death_test_style) == "fast") {
|
||||
*test = new WindowsDeathTest(statement, std::move(matcher), file, line);
|
||||
}
|
||||
|
||||
#elif GTEST_OS_FUCHSIA
|
||||
#elif defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
if (GTEST_FLAG_GET(death_test_style) == "threadsafe" ||
|
||||
GTEST_FLAG_GET(death_test_style) == "fast") {
|
||||
@@ -1497,7 +1462,7 @@ bool DefaultDeathTestFactory::Create(const char* statement,
|
||||
return true;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Recreates the pipe and event handles from the provided parameters,
|
||||
// signals the event, and returns a file descriptor wrapped around the pipe
|
||||
// handle. This function is called in the child process only.
|
||||
@@ -1564,7 +1529,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,
|
||||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
|
||||
// the flag is specified; otherwise returns NULL.
|
||||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
|
||||
if (GTEST_FLAG_GET(internal_run_death_test) == "") return nullptr;
|
||||
if (GTEST_FLAG_GET(internal_run_death_test).empty()) return nullptr;
|
||||
|
||||
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
|
||||
// can use it here.
|
||||
@@ -1574,7 +1539,7 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
|
||||
SplitString(GTEST_FLAG_GET(internal_run_death_test), '|', &fields);
|
||||
int write_fd = -1;
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
unsigned int parent_process_id = 0;
|
||||
size_t write_handle_as_size_t = 0;
|
||||
@@ -1591,7 +1556,7 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
|
||||
write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t,
|
||||
event_handle_as_size_t);
|
||||
|
||||
#elif GTEST_OS_FUCHSIA
|
||||
#elif defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
if (fields.size() != 3 || !ParseNaturalNumber(fields[1], &line) ||
|
||||
!ParseNaturalNumber(fields[2], &index)) {
|
||||
|
||||
@@ -31,12 +31,15 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
|
||||
#include "gtest/gtest-message.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
#include <windows.h>
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#elif defined(GTEST_OS_WINDOWS)
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#else
|
||||
@@ -47,7 +50,7 @@
|
||||
|
||||
#include "gtest/internal/gtest-string.h"
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#define GTEST_PATH_MAX_ _MAX_PATH
|
||||
#elif defined(PATH_MAX)
|
||||
#define GTEST_PATH_MAX_ PATH_MAX
|
||||
@@ -62,7 +65,7 @@
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// On Windows, '\\' is the standard path separator, but many tools and the
|
||||
// Windows API also accept '/' as an alternate path separator. Unless otherwise
|
||||
// noted, a file path can contain either kind of path separators, or a mixture
|
||||
@@ -70,7 +73,7 @@ namespace internal {
|
||||
const char kPathSeparator = '\\';
|
||||
const char kAlternatePathSeparator = '/';
|
||||
const char kAlternatePathSeparatorString[] = "/";
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
// Windows CE doesn't have a current directory. You should not use
|
||||
// the current directory in tests on Windows CE, but this at least
|
||||
// provides a reasonable fallback.
|
||||
@@ -96,19 +99,21 @@ static bool IsPathSeparator(char c) {
|
||||
|
||||
// Returns the current working directory, or "" if unsuccessful.
|
||||
FilePath FilePath::GetCurrentDir() {
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
|
||||
GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 || \
|
||||
GTEST_OS_XTENSA || GTEST_OS_QURT
|
||||
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \
|
||||
defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_ESP8266) || \
|
||||
defined(GTEST_OS_ESP32) || defined(GTEST_OS_XTENSA) || \
|
||||
defined(GTEST_OS_QURT) || defined(GTEST_OS_NXP_QN9090) || \
|
||||
defined(GTEST_OS_NRF52)
|
||||
// These platforms do not have a current directory, so we just return
|
||||
// something reasonable.
|
||||
return FilePath(kCurrentDirectoryString);
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#elif defined(GTEST_OS_WINDOWS)
|
||||
char cwd[GTEST_PATH_MAX_ + 1] = {'\0'};
|
||||
return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd);
|
||||
#else
|
||||
char cwd[GTEST_PATH_MAX_ + 1] = {'\0'};
|
||||
char* result = getcwd(cwd, sizeof(cwd));
|
||||
#if GTEST_OS_NACL
|
||||
#ifdef GTEST_OS_NACL
|
||||
// getcwd will likely fail in NaCl due to the sandbox, so return something
|
||||
// reasonable. The user may have provided a shim implementation for getcwd,
|
||||
// however, so fallback only when failure is detected.
|
||||
@@ -148,20 +153,19 @@ const char* FilePath::FindLastPathSeparator() const {
|
||||
}
|
||||
|
||||
size_t FilePath::CalculateRootLength() const {
|
||||
const auto &path = pathname_;
|
||||
const auto& path = pathname_;
|
||||
auto s = path.begin();
|
||||
auto end = path.end();
|
||||
#if GTEST_OS_WINDOWS
|
||||
if (end - s >= 2 && s[1] == ':' &&
|
||||
(end - s == 2 || IsPathSeparator(s[2])) &&
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
if (end - s >= 2 && s[1] == ':' && (end - s == 2 || IsPathSeparator(s[2])) &&
|
||||
(('A' <= s[0] && s[0] <= 'Z') || ('a' <= s[0] && s[0] <= 'z'))) {
|
||||
// A typical absolute path like "C:\Windows" or "D:"
|
||||
s += 2;
|
||||
if (s != end) {
|
||||
++s;
|
||||
}
|
||||
} else if (end - s >= 3 && IsPathSeparator(*s) && IsPathSeparator(*(s + 1))
|
||||
&& !IsPathSeparator(*(s + 2))) {
|
||||
} else if (end - s >= 3 && IsPathSeparator(*s) && IsPathSeparator(*(s + 1)) &&
|
||||
!IsPathSeparator(*(s + 2))) {
|
||||
// Move past the "\\" prefix in a UNC path like "\\Server\Share\Folder"
|
||||
s += 2;
|
||||
// Skip 2 components and their following separators ("Server\" and "Share\")
|
||||
@@ -245,7 +249,7 @@ FilePath FilePath::ConcatPaths(const FilePath& directory,
|
||||
// Returns true if pathname describes something findable in the file-system,
|
||||
// either a file, directory, or whatever.
|
||||
bool FilePath::FileOrDirectoryExists() const {
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
|
||||
const DWORD attributes = GetFileAttributes(unicode);
|
||||
delete[] unicode;
|
||||
@@ -260,7 +264,7 @@ bool FilePath::FileOrDirectoryExists() const {
|
||||
// that exists.
|
||||
bool FilePath::DirectoryExists() const {
|
||||
bool result = false;
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Don't strip off trailing separator if path is a root directory on
|
||||
// Windows (like "C:\\").
|
||||
const FilePath& path(IsRootDirectory() ? *this
|
||||
@@ -269,7 +273,7 @@ bool FilePath::DirectoryExists() const {
|
||||
const FilePath& path(*this);
|
||||
#endif
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
|
||||
const DWORD attributes = GetFileAttributes(unicode);
|
||||
delete[] unicode;
|
||||
@@ -295,9 +299,7 @@ bool FilePath::IsRootDirectory() const {
|
||||
}
|
||||
|
||||
// Returns true if pathname describes an absolute path.
|
||||
bool FilePath::IsAbsolutePath() const {
|
||||
return CalculateRootLength() > 0;
|
||||
}
|
||||
bool FilePath::IsAbsolutePath() const { return CalculateRootLength() > 0; }
|
||||
|
||||
// Returns a pathname for a file that does not currently exist. The pathname
|
||||
// will be directory/base_name.extension or
|
||||
@@ -347,14 +349,16 @@ 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_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
FilePath removed_sep(this->RemoveTrailingPathSeparator());
|
||||
LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
|
||||
int result = CreateDirectory(unicode, nullptr) ? 0 : -1;
|
||||
delete[] unicode;
|
||||
#elif GTEST_OS_WINDOWS
|
||||
#elif defined(GTEST_OS_WINDOWS)
|
||||
int result = _mkdir(pathname_.c_str());
|
||||
#elif GTEST_OS_ESP8266 || GTEST_OS_XTENSA || GTEST_OS_QURT
|
||||
#elif defined(GTEST_OS_ESP8266) || defined(GTEST_OS_XTENSA) || \
|
||||
defined(GTEST_OS_QURT) || defined(GTEST_OS_NXP_QN9090) || \
|
||||
defined(GTEST_OS_NRF52)
|
||||
// do nothing
|
||||
int result = 0;
|
||||
#else
|
||||
@@ -383,7 +387,7 @@ void FilePath::Normalize() {
|
||||
auto out = pathname_.begin();
|
||||
|
||||
auto i = pathname_.cbegin();
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// UNC paths are treated specially
|
||||
if (pathname_.end() - i >= 3 && IsPathSeparator(*i) &&
|
||||
IsPathSeparator(*(i + 1)) && !IsPathSeparator(*(i + 2))) {
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#include <netdb.h> // NOLINT
|
||||
#endif
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <windows.h> // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
@@ -92,7 +92,8 @@ GTEST_API_ TimeInMillis GetTimeInMillis();
|
||||
// Returns true if and only if Google Test should use colors in the output.
|
||||
GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
|
||||
|
||||
// Formats the given time in milliseconds as seconds.
|
||||
// Formats the given time in milliseconds as seconds. If the input is an exact N
|
||||
// seconds, the output has a trailing decimal point (e.g., "N." instead of "N").
|
||||
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
|
||||
|
||||
// Converts the given time in milliseconds to a date string in the ISO 8601
|
||||
@@ -383,13 +384,13 @@ class GTEST_API_ UnitTestOptions {
|
||||
static bool FilterMatchesTest(const std::string& test_suite_name,
|
||||
const std::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
|
||||
// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
|
||||
// Returns EXCEPTION_EXECUTE_HANDLER if given SEH exception was handled, or
|
||||
// EXCEPTION_CONTINUE_SEARCH otherwise.
|
||||
// This function is useful as an __except condition.
|
||||
static int GTestShouldProcessSEH(DWORD exception_code);
|
||||
static int GTestProcessSEH(DWORD seh_code, const char* location);
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
// Returns true if "name" matches the ':' separated list of glob-style
|
||||
@@ -406,8 +407,8 @@ GTEST_API_ FilePath GetCurrentExecutableName();
|
||||
// The role interface for getting the OS stack trace as a string.
|
||||
class OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetterInterface() {}
|
||||
virtual ~OsStackTraceGetterInterface() {}
|
||||
OsStackTraceGetterInterface() = default;
|
||||
virtual ~OsStackTraceGetterInterface() = default;
|
||||
|
||||
// Returns the current OS stack trace as an std::string. Parameters:
|
||||
//
|
||||
@@ -435,13 +436,13 @@ class OsStackTraceGetterInterface {
|
||||
// A working implementation of the OsStackTraceGetterInterface interface.
|
||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetter() {}
|
||||
OsStackTraceGetter() = default;
|
||||
|
||||
std::string CurrentStackTrace(int max_depth, int skip_count) override;
|
||||
void UponLeavingGTest() override;
|
||||
|
||||
private:
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
Mutex mutex_; // Protects all internal state.
|
||||
|
||||
// We save the stack frame below the frame that calls user code.
|
||||
@@ -671,7 +672,7 @@ class GTEST_API_ UnitTestImpl {
|
||||
void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,
|
||||
internal::TearDownTestSuiteFunc tear_down_tc,
|
||||
TestInfo* test_info) {
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
// 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
|
||||
@@ -684,7 +685,7 @@ class GTEST_API_ UnitTestImpl {
|
||||
GTEST_CHECK_(!original_working_dir_.IsEmpty())
|
||||
<< "Failed to get the current working directory.";
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
#endif // GTEST_HAS_FILE_SYSTEM
|
||||
|
||||
GetTestSuite(test_info->test_suite_name(), test_info->type_param(),
|
||||
set_up_tc, tear_down_tc)
|
||||
@@ -777,7 +778,7 @@ class GTEST_API_ UnitTestImpl {
|
||||
return gtest_trace_stack_.get();
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
void InitDeathTestSubprocessControlInfo() {
|
||||
internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
|
||||
}
|
||||
@@ -942,7 +943,7 @@ class GTEST_API_ 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.
|
||||
std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
|
||||
@@ -966,7 +967,7 @@ inline UnitTestImpl* GetUnitTestImpl() {
|
||||
return UnitTest::GetInstance()->impl();
|
||||
}
|
||||
|
||||
#if GTEST_USES_SIMPLE_RE
|
||||
#ifdef GTEST_USES_SIMPLE_RE
|
||||
|
||||
// Internal helper functions for implementing the simple regular
|
||||
// expression matcher.
|
||||
@@ -992,7 +993,7 @@ GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
|
||||
GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
|
||||
GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Returns the message describing the last system error, regardless of the
|
||||
// platform.
|
||||
@@ -1063,7 +1064,7 @@ class StreamingListener : public EmptyTestEventListener {
|
||||
// Abstract base class for writing strings to a socket.
|
||||
class AbstractSocketWriter {
|
||||
public:
|
||||
virtual ~AbstractSocketWriter() {}
|
||||
virtual ~AbstractSocketWriter() = default;
|
||||
|
||||
// Sends a string to the socket.
|
||||
virtual void Send(const std::string& message) = 0;
|
||||
|
||||
@@ -37,8 +37,12 @@
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <io.h>
|
||||
#include <sys/stat.h>
|
||||
#include <windows.h>
|
||||
@@ -51,32 +55,34 @@
|
||||
#include <unistd.h>
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_MAC
|
||||
#ifdef GTEST_OS_MAC
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/task.h>
|
||||
#include <mach/vm_map.h>
|
||||
#endif // GTEST_OS_MAC
|
||||
|
||||
#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
|
||||
GTEST_OS_NETBSD || GTEST_OS_OPENBSD
|
||||
#if defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
|
||||
defined(GTEST_OS_GNU_KFREEBSD) || defined(GTEST_OS_NETBSD) || \
|
||||
defined(GTEST_OS_OPENBSD)
|
||||
#include <sys/sysctl.h>
|
||||
#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
|
||||
#if defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
|
||||
defined(GTEST_OS_GNU_KFREEBSD)
|
||||
#include <sys/user.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if GTEST_OS_QNX
|
||||
#ifdef GTEST_OS_QNX
|
||||
#include <devctl.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/procfs.h>
|
||||
#endif // GTEST_OS_QNX
|
||||
|
||||
#if GTEST_OS_AIX
|
||||
#ifdef GTEST_OS_AIX
|
||||
#include <procinfo.h>
|
||||
#include <sys/types.h>
|
||||
#endif // GTEST_OS_AIX
|
||||
|
||||
#if GTEST_OS_FUCHSIA
|
||||
#ifdef GTEST_OS_FUCHSIA
|
||||
#include <zircon/process.h>
|
||||
#include <zircon/syscalls.h>
|
||||
#endif // GTEST_OS_FUCHSIA
|
||||
@@ -90,7 +96,7 @@
|
||||
namespace testing {
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_OS_LINUX || GTEST_OS_GNU_HURD
|
||||
#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_GNU_HURD)
|
||||
|
||||
namespace {
|
||||
template <typename T>
|
||||
@@ -113,7 +119,7 @@ size_t GetThreadCount() {
|
||||
return ReadProcFileField<size_t>(filename, 19);
|
||||
}
|
||||
|
||||
#elif GTEST_OS_MAC
|
||||
#elif defined(GTEST_OS_MAC)
|
||||
|
||||
size_t GetThreadCount() {
|
||||
const task_t task = mach_task_self();
|
||||
@@ -131,20 +137,20 @@ size_t GetThreadCount() {
|
||||
}
|
||||
}
|
||||
|
||||
#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
|
||||
GTEST_OS_NETBSD
|
||||
#elif defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
|
||||
defined(GTEST_OS_GNU_KFREEBSD) || defined(GTEST_OS_NETBSD)
|
||||
|
||||
#if GTEST_OS_NETBSD
|
||||
#ifdef GTEST_OS_NETBSD
|
||||
#undef KERN_PROC
|
||||
#define KERN_PROC KERN_PROC2
|
||||
#define kinfo_proc kinfo_proc2
|
||||
#endif
|
||||
|
||||
#if GTEST_OS_DRAGONFLY
|
||||
#ifdef GTEST_OS_DRAGONFLY
|
||||
#define KP_NLWP(kp) (kp.kp_nthreads)
|
||||
#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
|
||||
#elif defined(GTEST_OS_FREEBSD) || defined(GTEST_OS_GNU_KFREEBSD)
|
||||
#define KP_NLWP(kp) (kp.ki_numthreads)
|
||||
#elif GTEST_OS_NETBSD
|
||||
#elif defined(GTEST_OS_NETBSD)
|
||||
#define KP_NLWP(kp) (kp.p_nlwps)
|
||||
#endif
|
||||
|
||||
@@ -156,7 +162,7 @@ size_t GetThreadCount() {
|
||||
KERN_PROC,
|
||||
KERN_PROC_PID,
|
||||
getpid(),
|
||||
#if GTEST_OS_NETBSD
|
||||
#ifdef GTEST_OS_NETBSD
|
||||
sizeof(struct kinfo_proc),
|
||||
1,
|
||||
#endif
|
||||
@@ -169,7 +175,7 @@ size_t GetThreadCount() {
|
||||
}
|
||||
return static_cast<size_t>(KP_NLWP(info));
|
||||
}
|
||||
#elif GTEST_OS_OPENBSD
|
||||
#elif defined(GTEST_OS_OPENBSD)
|
||||
|
||||
// Returns the number of threads running in the process, or 0 to indicate that
|
||||
// we cannot detect it.
|
||||
@@ -193,8 +199,8 @@ size_t GetThreadCount() {
|
||||
mib[5] = static_cast<int>(size / static_cast<size_t>(mib[4]));
|
||||
|
||||
// populate array of structs
|
||||
struct kinfo_proc info[mib[5]];
|
||||
if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
|
||||
std::vector<struct kinfo_proc> info(mib[5]);
|
||||
if (sysctl(mib, miblen, info.data(), &size, NULL, 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -206,7 +212,7 @@ size_t GetThreadCount() {
|
||||
return nthreads;
|
||||
}
|
||||
|
||||
#elif GTEST_OS_QNX
|
||||
#elif defined(GTEST_OS_QNX)
|
||||
|
||||
// Returns the number of threads running in the process, or 0 to indicate that
|
||||
// we cannot detect it.
|
||||
@@ -226,7 +232,7 @@ size_t GetThreadCount() {
|
||||
}
|
||||
}
|
||||
|
||||
#elif GTEST_OS_AIX
|
||||
#elif defined(GTEST_OS_AIX)
|
||||
|
||||
size_t GetThreadCount() {
|
||||
struct procentry64 entry;
|
||||
@@ -239,7 +245,7 @@ size_t GetThreadCount() {
|
||||
}
|
||||
}
|
||||
|
||||
#elif GTEST_OS_FUCHSIA
|
||||
#elif defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
size_t GetThreadCount() {
|
||||
int dummy_buffer;
|
||||
@@ -264,7 +270,7 @@ size_t GetThreadCount() {
|
||||
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
|
||||
#if defined(GTEST_IS_THREADSAFE) && defined(GTEST_OS_WINDOWS)
|
||||
|
||||
AutoHandle::AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
|
||||
|
||||
@@ -655,7 +661,7 @@ void ThreadLocalRegistry::OnThreadLocalDestroyed(
|
||||
|
||||
#endif // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_USES_POSIX_RE
|
||||
#ifdef GTEST_USES_POSIX_RE
|
||||
|
||||
// Implements RE. Currently only needed for death tests.
|
||||
|
||||
@@ -668,7 +674,6 @@ RE::~RE() {
|
||||
regfree(&partial_regex_);
|
||||
regfree(&full_regex_);
|
||||
}
|
||||
free(const_cast<char*>(pattern_));
|
||||
}
|
||||
|
||||
// Returns true if and only if regular expression re matches the entire str.
|
||||
@@ -690,7 +695,7 @@ bool RE::PartialMatch(const char* str, const RE& re) {
|
||||
|
||||
// Initializes an RE from its string representation.
|
||||
void RE::Init(const char* regex) {
|
||||
pattern_ = posix::StrDup(regex);
|
||||
pattern_ = regex;
|
||||
|
||||
// Reserves enough bytes to hold the regular expression used for a
|
||||
// full match.
|
||||
@@ -718,7 +723,7 @@ void RE::Init(const char* regex) {
|
||||
delete[] full_pattern;
|
||||
}
|
||||
|
||||
#elif GTEST_USES_SIMPLE_RE
|
||||
#elif defined(GTEST_USES_SIMPLE_RE)
|
||||
|
||||
// Returns true if and only if ch appears anywhere in str (excluding the
|
||||
// terminating '\0' character).
|
||||
@@ -920,27 +925,26 @@ bool MatchRegexAnywhere(const char* regex, const char* str) {
|
||||
|
||||
// Implements the RE class.
|
||||
|
||||
RE::~RE() {
|
||||
free(const_cast<char*>(pattern_));
|
||||
free(const_cast<char*>(full_pattern_));
|
||||
}
|
||||
RE::~RE() = default;
|
||||
|
||||
// Returns true if and only if 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);
|
||||
return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_.c_str(), str);
|
||||
}
|
||||
|
||||
// Returns true if and only if 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);
|
||||
return re.is_valid_ && MatchRegexAnywhere(re.pattern_.c_str(), str);
|
||||
}
|
||||
|
||||
// Initializes an RE from its string representation.
|
||||
void RE::Init(const char* regex) {
|
||||
pattern_ = full_pattern_ = nullptr;
|
||||
full_pattern_.clear();
|
||||
pattern_.clear();
|
||||
|
||||
if (regex != nullptr) {
|
||||
pattern_ = posix::StrDup(regex);
|
||||
pattern_ = regex;
|
||||
}
|
||||
|
||||
is_valid_ = ValidateRegex(regex);
|
||||
@@ -949,25 +953,19 @@ void RE::Init(const char* regex) {
|
||||
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;
|
||||
// full match: we need space to prepend a '^' and append a '$'.
|
||||
full_pattern_.reserve(pattern_.size() + 2);
|
||||
|
||||
if (*regex != '^')
|
||||
*buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
|
||||
if (pattern_.empty() || pattern_.front() != '^') {
|
||||
full_pattern_.push_back('^'); // 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;
|
||||
full_pattern_.append(pattern_);
|
||||
|
||||
if (len == 0 || regex[len - 1] != '$')
|
||||
*buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
|
||||
|
||||
*buffer = '\0';
|
||||
if (pattern_.empty() || pattern_.back() != '$') {
|
||||
full_pattern_.push_back('$'); // Makes sure full_pattern_ ends with '$'.
|
||||
}
|
||||
}
|
||||
|
||||
#endif // GTEST_USES_POSIX_RE
|
||||
@@ -1035,7 +1033,7 @@ class CapturedStream {
|
||||
public:
|
||||
// The ctor redirects the stream to a temporary file.
|
||||
explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
char temp_dir_path[MAX_PATH + 1] = {'\0'}; // NOLINT
|
||||
char temp_file_path[MAX_PATH + 1] = {'\0'}; // NOLINT
|
||||
|
||||
@@ -1054,7 +1052,7 @@ class CapturedStream {
|
||||
// directory, so we create the temporary file in a temporary directory.
|
||||
std::string name_template;
|
||||
|
||||
#if GTEST_OS_LINUX_ANDROID
|
||||
#ifdef GTEST_OS_LINUX_ANDROID
|
||||
// Note: Android applications are expected to call the framework's
|
||||
// Context.getExternalStorageDirectory() method through JNI to get
|
||||
// the location of the world-writable SD Card directory. However,
|
||||
@@ -1067,7 +1065,7 @@ class CapturedStream {
|
||||
// '/sdcard' and other variants cannot be relied on, as they are not
|
||||
// guaranteed to be mounted, or may have a delay in mounting.
|
||||
name_template = "/data/local/tmp/";
|
||||
#elif GTEST_OS_IOS
|
||||
#elif defined(GTEST_OS_IOS)
|
||||
char user_temp_dir[PATH_MAX + 1];
|
||||
|
||||
// Documented alternative to NSTemporaryDirectory() (for obtaining creating
|
||||
@@ -1227,7 +1225,7 @@ std::string ReadEntireFile(FILE* file) {
|
||||
return content;
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
static const std::vector<std::string>* g_injected_test_argvs =
|
||||
nullptr; // Owned.
|
||||
|
||||
@@ -1254,7 +1252,7 @@ void ClearInjectableArgvs() {
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
namespace posix {
|
||||
void Abort() {
|
||||
DebugBreak();
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
#include <cctype>
|
||||
#include <cstdint>
|
||||
#include <cwchar>
|
||||
#include <iomanip>
|
||||
#include <ios>
|
||||
#include <ostream> // NOLINT
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
@@ -214,7 +216,7 @@ static const char* GetCharWidthPrefix(signed char) { return ""; }
|
||||
|
||||
static const char* GetCharWidthPrefix(unsigned char) { return ""; }
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
static const char* GetCharWidthPrefix(char8_t) { return "u8"; }
|
||||
#endif
|
||||
|
||||
@@ -230,7 +232,7 @@ static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
|
||||
return PrintAsStringLiteralTo(ToChar32(c), os);
|
||||
}
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {
|
||||
return PrintAsStringLiteralTo(ToChar32(c), os);
|
||||
}
|
||||
@@ -393,7 +395,7 @@ void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
|
||||
UniversalPrintCharArray(begin, len, os);
|
||||
}
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
// Prints a (const) char8_t array of 'len' elements, starting at address
|
||||
// 'begin'.
|
||||
void UniversalPrintArray(const char8_t* begin, size_t len, ostream* os) {
|
||||
@@ -436,7 +438,7 @@ void PrintCStringTo(const Char* s, ostream* os) {
|
||||
|
||||
void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
|
||||
#endif
|
||||
|
||||
@@ -528,7 +530,7 @@ void PrintStringTo(const ::std::string& s, ostream* os) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cpp_char8_t
|
||||
#ifdef __cpp_lib_char8_t
|
||||
void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
|
||||
PrintCharsAsStringTo(s.data(), s.size(), os);
|
||||
}
|
||||
|
||||
@@ -32,13 +32,14 @@
|
||||
|
||||
#include "gtest/gtest-test-part.h"
|
||||
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
#include "src/gtest-internal-inl.h"
|
||||
|
||||
namespace testing {
|
||||
|
||||
using internal::GetUnitTestImpl;
|
||||
|
||||
// Gets the summary of the failure message by omitting the stack trace
|
||||
// in it.
|
||||
std::string TestPartResult::ExtractSummary(const char* message) {
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
|
||||
#include "gtest/gtest-typed-test.h"
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
namespace testing {
|
||||
@@ -90,7 +94,7 @@ const char* TypedTestSuitePState::VerifyRegisteredTestNames(
|
||||
}
|
||||
|
||||
const std::string& errors_str = errors.GetString();
|
||||
if (errors_str != "") {
|
||||
if (!errors_str.empty()) {
|
||||
fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
|
||||
errors_str.c_str());
|
||||
fflush(stderr);
|
||||
|
||||
+200
-138
@@ -44,15 +44,21 @@
|
||||
#include <chrono> // NOLINT
|
||||
#include <cmath>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <initializer_list>
|
||||
#include <iomanip>
|
||||
#include <ios>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <ostream> // NOLINT
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
#include <unordered_set>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/gtest-assertion-result.h"
|
||||
@@ -60,7 +66,7 @@
|
||||
#include "gtest/internal/custom/gtest.h"
|
||||
#include "gtest/internal/gtest-port.h"
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
|
||||
#include <fcntl.h> // NOLINT
|
||||
#include <limits.h> // NOLINT
|
||||
@@ -73,18 +79,18 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#elif GTEST_OS_ZOS
|
||||
#elif defined(GTEST_OS_ZOS)
|
||||
#include <sys/time.h> // NOLINT
|
||||
|
||||
// On z/OS we additionally need strings.h for strcasecmp.
|
||||
#include <strings.h> // NOLINT
|
||||
|
||||
#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
|
||||
#elif defined(GTEST_OS_WINDOWS_MOBILE) // We are on Windows CE.
|
||||
|
||||
#include <windows.h> // NOLINT
|
||||
#undef min
|
||||
|
||||
#elif GTEST_OS_WINDOWS // We are on Windows proper.
|
||||
#elif defined(GTEST_OS_WINDOWS) // We are on Windows proper.
|
||||
|
||||
#include <windows.h> // NOLINT
|
||||
#undef min
|
||||
@@ -98,7 +104,7 @@
|
||||
#include <sys/timeb.h> // NOLINT
|
||||
#include <sys/types.h> // NOLINT
|
||||
|
||||
#if GTEST_OS_WINDOWS_MINGW
|
||||
#ifdef GTEST_OS_WINDOWS_MINGW
|
||||
#include <sys/time.h> // NOLINT
|
||||
#endif // GTEST_OS_WINDOWS_MINGW
|
||||
|
||||
@@ -124,17 +130,18 @@
|
||||
|
||||
#include "src/gtest-internal-inl.h"
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_MAC
|
||||
#ifdef GTEST_OS_MAC
|
||||
#ifndef GTEST_OS_IOS
|
||||
#include <crt_externs.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
#include "absl/container/flat_hash_set.h"
|
||||
#include "absl/debugging/failure_signal_handler.h"
|
||||
#include "absl/debugging/stacktrace.h"
|
||||
#include "absl/debugging/symbolize.h"
|
||||
@@ -142,6 +149,8 @@
|
||||
#include "absl/flags/usage.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
#include "absl/strings/str_replace.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/strings/strip.h"
|
||||
#endif // GTEST_HAS_ABSL
|
||||
|
||||
// Checks builtin compiler feature |x| while avoiding an extra layer of #ifdefs
|
||||
@@ -407,7 +416,7 @@ uint32_t Random::Generate(uint32_t range) {
|
||||
// GTestIsInitialized() returns true if and only if the user has initialized
|
||||
// Google Test. Useful for catching the user mistake of not initializing
|
||||
// Google Test before calling RUN_ALL_TESTS().
|
||||
static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
|
||||
static bool GTestIsInitialized() { return !GetArgvs().empty(); }
|
||||
|
||||
// Iterates over a vector of TestSuites, keeping a running sum of the
|
||||
// results of calling a given int-returning method on each.
|
||||
@@ -629,7 +638,7 @@ static ::std::vector<std::string> g_argvs;
|
||||
FilePath GetCurrentExecutableName() {
|
||||
FilePath result;
|
||||
|
||||
#if GTEST_OS_WINDOWS || GTEST_OS_OS2
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_OS2)
|
||||
result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe"));
|
||||
#else
|
||||
result.Set(FilePath(GetArgvs()[0]));
|
||||
@@ -854,13 +863,18 @@ bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name,
|
||||
}
|
||||
|
||||
#if GTEST_HAS_SEH
|
||||
// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
|
||||
// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
|
||||
// This function is useful as an __except condition.
|
||||
int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
|
||||
static std::string FormatSehExceptionMessage(DWORD exception_code,
|
||||
const char* location) {
|
||||
Message message;
|
||||
message << "SEH exception with code 0x" << std::setbase(16) << exception_code
|
||||
<< std::setbase(10) << " thrown in " << location << ".";
|
||||
return message.GetString();
|
||||
}
|
||||
|
||||
int UnitTestOptions::GTestProcessSEH(DWORD seh_code, const char* location) {
|
||||
// Google Test should handle a SEH exception if:
|
||||
// 1. the user wants it to, AND
|
||||
// 2. this is not a breakpoint exception, AND
|
||||
// 2. this is not a breakpoint exception or stack overflow, AND
|
||||
// 3. this is not a C++ exception (VC++ implements them via SEH,
|
||||
// apparently).
|
||||
//
|
||||
@@ -868,16 +882,20 @@ int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
|
||||
// (see http://support.microsoft.com/kb/185294 for more information).
|
||||
const DWORD kCxxExceptionCode = 0xe06d7363;
|
||||
|
||||
bool should_handle = true;
|
||||
if (!GTEST_FLAG_GET(catch_exceptions) || seh_code == kCxxExceptionCode ||
|
||||
seh_code == EXCEPTION_BREAKPOINT ||
|
||||
seh_code == EXCEPTION_STACK_OVERFLOW) {
|
||||
return EXCEPTION_CONTINUE_SEARCH; // Don't handle these exceptions
|
||||
}
|
||||
|
||||
if (!GTEST_FLAG_GET(catch_exceptions))
|
||||
should_handle = false;
|
||||
else if (exception_code == EXCEPTION_BREAKPOINT)
|
||||
should_handle = false;
|
||||
else if (exception_code == kCxxExceptionCode)
|
||||
should_handle = false;
|
||||
internal::ReportFailureInUnknownLocation(
|
||||
TestPartResult::kFatalFailure,
|
||||
FormatSehExceptionMessage(seh_code, location) +
|
||||
"\n"
|
||||
"Stack trace:\n" +
|
||||
::testing::internal::GetCurrentOsStackTraceExceptTop(1));
|
||||
|
||||
return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
#endif // GTEST_HAS_SEH
|
||||
|
||||
@@ -1134,8 +1152,8 @@ class Timer {
|
||||
|
||||
// Return time elapsed in milliseconds since the timer was created.
|
||||
TimeInMillis Elapsed() {
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
clock::now() - start_)
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
|
||||
start_)
|
||||
.count();
|
||||
}
|
||||
|
||||
@@ -1164,7 +1182,7 @@ TimeInMillis GetTimeInMillis() {
|
||||
|
||||
// class String.
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#ifdef GTEST_OS_WINDOWS_MOBILE
|
||||
// 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
|
||||
@@ -1866,14 +1884,14 @@ AssertionResult IsNotSubstring(const char* needle_expr,
|
||||
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
namespace {
|
||||
|
||||
// Helper function for IsHRESULT{SuccessFailure} predicates
|
||||
AssertionResult HRESULTFailureHelper(const char* expr, const char* expected,
|
||||
long hr) { // NOLINT
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE
|
||||
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_TV_TITLE)
|
||||
|
||||
// Windows CE doesn't support FormatMessage.
|
||||
const char error_text[] = "";
|
||||
@@ -2134,9 +2152,9 @@ bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
|
||||
|
||||
if (rhs == nullptr) return false;
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
return _wcsicmp(lhs, rhs) == 0;
|
||||
#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
|
||||
#elif defined(GTEST_OS_LINUX) && !defined(GTEST_OS_LINUX_ANDROID)
|
||||
return wcscasecmp(lhs, rhs) == 0;
|
||||
#else
|
||||
// Android, Mac OS X and Cygwin don't define wcscasecmp.
|
||||
@@ -2236,7 +2254,7 @@ TestResult::TestResult()
|
||||
: death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}
|
||||
|
||||
// D'tor.
|
||||
TestResult::~TestResult() {}
|
||||
TestResult::~TestResult() = default;
|
||||
|
||||
// Returns the i-th test part result among all the results. i can
|
||||
// range from 0 to total_part_count() - 1. If i is not in that range,
|
||||
@@ -2324,7 +2342,9 @@ static std::vector<std::string> GetReservedAttributesForElement(
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
// TODO(jdesprez): Merge the two getReserved attributes once skip is improved
|
||||
// This function is only used when file systems are enabled.
|
||||
static std::vector<std::string> GetReservedOutputAttributesForElement(
|
||||
const std::string& xml_element) {
|
||||
if (xml_element == "testsuites") {
|
||||
@@ -2339,6 +2359,7 @@ static std::vector<std::string> GetReservedOutputAttributesForElement(
|
||||
// This code is unreachable but some compilers may not realizes that.
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
#endif
|
||||
|
||||
static std::string FormatWordList(const std::vector<std::string>& words) {
|
||||
Message word_list;
|
||||
@@ -2442,7 +2463,7 @@ Test::Test() : gtest_flag_saver_(new GTEST_FLAG_SAVER_) {}
|
||||
// The d'tor restores the states of all flags. The actual work is
|
||||
// done by the d'tor of the gtest_flag_saver_ field, and thus not
|
||||
// visible here.
|
||||
Test::~Test() {}
|
||||
Test::~Test() = default;
|
||||
|
||||
// Sets up the test fixture.
|
||||
//
|
||||
@@ -2458,11 +2479,6 @@ void Test::TearDown() {}
|
||||
void Test::RecordProperty(const std::string& key, const std::string& value) {
|
||||
UnitTest::GetInstance()->RecordProperty(key, value);
|
||||
}
|
||||
// We do not define a customary serialization except for integers,
|
||||
// but other values could be logged in this way.
|
||||
void Test::RecordProperty(const std::string& key, int64_t value) {
|
||||
RecordProperty(key, (Message() << value).GetString());
|
||||
}
|
||||
|
||||
namespace internal {
|
||||
|
||||
@@ -2546,23 +2562,6 @@ bool Test::HasSameFixtureClass() {
|
||||
return true;
|
||||
}
|
||||
|
||||
#if GTEST_HAS_SEH
|
||||
|
||||
// Adds an "exception thrown" fatal failure to the current test. This
|
||||
// function returns its result via an output parameter pointer because VC++
|
||||
// prohibits creation of objects with destructors on stack in functions
|
||||
// using __try (see error C2712).
|
||||
static std::string* FormatSehExceptionMessage(DWORD exception_code,
|
||||
const char* location) {
|
||||
Message message;
|
||||
message << "SEH exception with code 0x" << std::setbase(16) << exception_code
|
||||
<< std::setbase(10) << " thrown in " << location << ".";
|
||||
|
||||
return new std::string(message.GetString());
|
||||
}
|
||||
|
||||
#endif // GTEST_HAS_SEH
|
||||
|
||||
namespace internal {
|
||||
|
||||
#if GTEST_HAS_EXCEPTIONS
|
||||
@@ -2604,16 +2603,8 @@ Result HandleSehExceptionsInMethodIfSupported(T* object, Result (T::*method)(),
|
||||
#if GTEST_HAS_SEH
|
||||
__try {
|
||||
return (object->*method)();
|
||||
} __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT
|
||||
GetExceptionCode())) {
|
||||
// We create the exception message on the heap because VC++ prohibits
|
||||
// creation of objects with destructors on stack in functions using __try
|
||||
// (see error C2712).
|
||||
std::string* exception_message =
|
||||
FormatSehExceptionMessage(GetExceptionCode(), location);
|
||||
internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
|
||||
*exception_message);
|
||||
delete exception_message;
|
||||
} __except (internal::UnitTestOptions::GTestProcessSEH( // NOLINT
|
||||
GetExceptionCode(), location)) {
|
||||
return static_cast<Result>(0);
|
||||
}
|
||||
#else
|
||||
@@ -2982,6 +2973,25 @@ void TestSuite::Run() {
|
||||
|
||||
TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
|
||||
|
||||
// Ensure our tests are in a deterministic order.
|
||||
//
|
||||
// We do this by sorting lexicographically on (file, line number), providing
|
||||
// an order matching what the user can see in the source code.
|
||||
//
|
||||
// In the common case the line number comparison shouldn't be necessary,
|
||||
// because the registrations made by the TEST macro are executed in order
|
||||
// within a translation unit. But this is not true of the manual registration
|
||||
// API, and in more exotic scenarios a single file may be part of multiple
|
||||
// translation units.
|
||||
std::stable_sort(test_info_list_.begin(), test_info_list_.end(),
|
||||
[](const TestInfo* const a, const TestInfo* const b) {
|
||||
if (const int result = std::strcmp(a->file(), b->file())) {
|
||||
return result < 0;
|
||||
}
|
||||
|
||||
return a->line() < b->line();
|
||||
});
|
||||
|
||||
// Call both legacy and the new API
|
||||
repeater->OnTestSuiteStart(*this);
|
||||
// Legacy API is deprecated but still available
|
||||
@@ -2993,7 +3003,8 @@ void TestSuite::Run() {
|
||||
internal::HandleExceptionsInMethodIfSupported(
|
||||
this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");
|
||||
|
||||
const bool skip_all = ad_hoc_test_result().Failed();
|
||||
const bool skip_all =
|
||||
ad_hoc_test_result().Failed() || ad_hoc_test_result().Skipped();
|
||||
|
||||
start_timestamp_ = internal::GetTimeInMillis();
|
||||
internal::Timer timer;
|
||||
@@ -3145,7 +3156,7 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) {
|
||||
// following statements add the test part result message to the Output
|
||||
// window such that the user can double-click on it to jump to the
|
||||
// corresponding source code location; otherwise they do nothing.
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
// We don't call OutputDebugString*() on Windows Mobile, as printing
|
||||
// to stdout is done by OutputDebugString() there already - we don't
|
||||
// want the same message printed twice.
|
||||
@@ -3155,8 +3166,9 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) {
|
||||
}
|
||||
|
||||
// class PrettyUnitTestResultPrinter
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \
|
||||
!GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \
|
||||
!defined(GTEST_OS_WINDOWS_PHONE) && !defined(GTEST_OS_WINDOWS_RT) && \
|
||||
!defined(GTEST_OS_WINDOWS_MINGW)
|
||||
|
||||
// Returns the character attribute for the given color.
|
||||
static WORD GetColorAttribute(GTestColor color) {
|
||||
@@ -3228,7 +3240,7 @@ bool ShouldUseColor(bool stdout_is_tty) {
|
||||
const char* const gtest_color = c.c_str();
|
||||
|
||||
if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MINGW)
|
||||
// On Windows the TERM variable is usually not set, but the
|
||||
// console there does support colors.
|
||||
return stdout_is_tty;
|
||||
@@ -3283,8 +3295,9 @@ static void ColoredPrintf(GTestColor color, const char* fmt, ...) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \
|
||||
!GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \
|
||||
!defined(GTEST_OS_WINDOWS_PHONE) && !defined(GTEST_OS_WINDOWS_RT) && \
|
||||
!defined(GTEST_OS_WINDOWS_MINGW)
|
||||
const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
|
||||
// Gets the current text color.
|
||||
@@ -3338,7 +3351,7 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
|
||||
// Class PrettyUnitTestResultPrinter is copyable.
|
||||
class PrettyUnitTestResultPrinter : public TestEventListener {
|
||||
public:
|
||||
PrettyUnitTestResultPrinter() {}
|
||||
PrettyUnitTestResultPrinter() = default;
|
||||
static void PrintTestName(const char* test_suite, const char* test) {
|
||||
printf("%s.%s", test_suite, test);
|
||||
}
|
||||
@@ -3646,7 +3659,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
|
||||
// Class BriefUnitTestResultPrinter is copyable.
|
||||
class BriefUnitTestResultPrinter : public TestEventListener {
|
||||
public:
|
||||
BriefUnitTestResultPrinter() {}
|
||||
BriefUnitTestResultPrinter() = default;
|
||||
static void PrintTestName(const char* test_suite, const char* test) {
|
||||
printf("%s.%s", test_suite, test);
|
||||
}
|
||||
@@ -3761,28 +3774,28 @@ class TestEventRepeater : public TestEventListener {
|
||||
bool forwarding_enabled() const { return forwarding_enabled_; }
|
||||
void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
|
||||
|
||||
void OnTestProgramStart(const UnitTest& unit_test) override;
|
||||
void OnTestProgramStart(const UnitTest& parameter) override;
|
||||
void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;
|
||||
void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;
|
||||
void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override;
|
||||
void OnEnvironmentsSetUpStart(const UnitTest& parameter) override;
|
||||
void OnEnvironmentsSetUpEnd(const UnitTest& parameter) override;
|
||||
// Legacy API is deprecated but still available
|
||||
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
void OnTestCaseStart(const TestSuite& parameter) override;
|
||||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
void OnTestSuiteStart(const TestSuite& parameter) override;
|
||||
void OnTestStart(const TestInfo& test_info) override;
|
||||
void OnTestDisabled(const TestInfo& test_info) override;
|
||||
void OnTestPartResult(const TestPartResult& result) override;
|
||||
void OnTestEnd(const TestInfo& test_info) override;
|
||||
void OnTestStart(const TestInfo& parameter) override;
|
||||
void OnTestDisabled(const TestInfo& parameter) override;
|
||||
void OnTestPartResult(const TestPartResult& parameter) override;
|
||||
void OnTestEnd(const TestInfo& parameter) override;
|
||||
// Legacy API is deprecated but still available
|
||||
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
void OnTestCaseEnd(const TestCase& parameter) override;
|
||||
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
|
||||
void OnTestSuiteEnd(const TestSuite& parameter) override;
|
||||
void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;
|
||||
void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override;
|
||||
void OnEnvironmentsTearDownStart(const UnitTest& parameter) override;
|
||||
void OnEnvironmentsTearDownEnd(const UnitTest& parameter) override;
|
||||
void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;
|
||||
void OnTestProgramEnd(const UnitTest& unit_test) override;
|
||||
void OnTestProgramEnd(const UnitTest& parameter) override;
|
||||
|
||||
private:
|
||||
// Controls whether events will be forwarded to listeners_. Set to false
|
||||
@@ -4089,6 +4102,13 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
|
||||
// Formats the given time in milliseconds as seconds.
|
||||
std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
|
||||
::std::stringstream ss;
|
||||
// For the exact N seconds, makes sure output has a trailing decimal point.
|
||||
// Sets precision so that we won't have many trailing zeros (e.g., 300 ms
|
||||
// will be just 0.3, 410 ms 0.41, and so on)
|
||||
ss << std::fixed
|
||||
<< std::setprecision(
|
||||
ms % 1000 == 0 ? 0 : (ms % 100 == 0 ? 1 : (ms % 10 == 0 ? 2 : 3)))
|
||||
<< std::showpoint;
|
||||
ss << (static_cast<double>(ms) * 1e-3);
|
||||
return ss.str();
|
||||
}
|
||||
@@ -4950,7 +4970,7 @@ const char* const OsStackTraceGetterInterface::kElidedFramesMarker =
|
||||
|
||||
std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count)
|
||||
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
std::string result;
|
||||
|
||||
if (max_depth <= 0) {
|
||||
@@ -4999,7 +5019,7 @@ std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count)
|
||||
}
|
||||
|
||||
void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
void* caller_frame = nullptr;
|
||||
if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) {
|
||||
caller_frame = nullptr;
|
||||
@@ -5010,7 +5030,7 @@ void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||
#endif // GTEST_HAS_ABSL
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
// A helper class that creates the premature-exit file in its
|
||||
// constructor and deletes the file in its destructor.
|
||||
class ScopedPrematureExitFile {
|
||||
@@ -5030,7 +5050,7 @@ class ScopedPrematureExitFile {
|
||||
}
|
||||
|
||||
~ScopedPrematureExitFile() {
|
||||
#if !GTEST_OS_ESP8266
|
||||
#ifndef GTEST_OS_ESP8266
|
||||
if (!premature_exit_filepath_.empty()) {
|
||||
int retval = remove(premature_exit_filepath_.c_str());
|
||||
if (retval) {
|
||||
@@ -5120,8 +5140,8 @@ bool TestEventListeners::EventForwardingEnabled() const {
|
||||
return repeater_->forwarding_enabled();
|
||||
}
|
||||
|
||||
void TestEventListeners::SuppressEventForwarding() {
|
||||
repeater_->set_forwarding_enabled(false);
|
||||
void TestEventListeners::SuppressEventForwarding(bool suppress) {
|
||||
repeater_->set_forwarding_enabled(!suppress);
|
||||
}
|
||||
|
||||
// class UnitTest
|
||||
@@ -5298,7 +5318,7 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
|
||||
msg << message;
|
||||
|
||||
internal::MutexLock lock(&mutex_);
|
||||
if (impl_->gtest_trace_stack().size() > 0) {
|
||||
if (!impl_->gtest_trace_stack().empty()) {
|
||||
msg << "\n" << GTEST_NAME_ << " trace:";
|
||||
|
||||
for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {
|
||||
@@ -5311,6 +5331,8 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
|
||||
|
||||
if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) {
|
||||
msg << internal::kStackTraceMarker << os_stack_trace;
|
||||
} else {
|
||||
msg << "\n";
|
||||
}
|
||||
|
||||
const TestPartResult result = TestPartResult(
|
||||
@@ -5326,7 +5348,8 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
|
||||
// with another testing framework) and specify the former on the
|
||||
// command line for debugging.
|
||||
if (GTEST_FLAG_GET(break_on_failure)) {
|
||||
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
|
||||
#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_PHONE) && \
|
||||
!defined(GTEST_OS_WINDOWS_RT)
|
||||
// Using DebugBreak on Windows allows gtest to still break into a debugger
|
||||
// when a failure happens and both the --gtest_break_on_failure and
|
||||
// the --gtest_catch_exceptions flags are specified.
|
||||
@@ -5374,7 +5397,7 @@ void UnitTest::RecordProperty(const std::string& key,
|
||||
// We don't protect this under mutex_, as we only support calling it
|
||||
// from the main thread.
|
||||
int UnitTest::Run() {
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
const bool in_death_test_child_process =
|
||||
GTEST_FLAG_GET(internal_run_death_test).length() > 0;
|
||||
|
||||
@@ -5403,32 +5426,36 @@ int UnitTest::Run() {
|
||||
in_death_test_child_process
|
||||
? nullptr
|
||||
: internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
|
||||
#else
|
||||
const bool in_death_test_child_process = false;
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
// Captures the value of GTEST_FLAG(catch_exceptions). This value will be
|
||||
// used for the duration of the program.
|
||||
impl()->set_catch_exceptions(GTEST_FLAG_GET(catch_exceptions));
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Either the user wants Google Test to catch exceptions thrown by the
|
||||
// tests or this is executing in the context of death test child
|
||||
// process. In either case the user does not want to see pop-up dialogs
|
||||
// about crashes - they are expected.
|
||||
if (impl()->catch_exceptions() || in_death_test_child_process) {
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
|
||||
#if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_WINDOWS_PHONE) && \
|
||||
!defined(GTEST_OS_WINDOWS_RT)
|
||||
// SetErrorMode doesn't exist on CE.
|
||||
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
|
||||
SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
|
||||
#endif // !GTEST_OS_WINDOWS_MOBILE
|
||||
|
||||
#if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if (defined(_MSC_VER) || defined(GTEST_OS_WINDOWS_MINGW)) && \
|
||||
!defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
// Death test children can be terminated with _abort(). On Windows,
|
||||
// _abort() can show a dialog with a warning message. This forces the
|
||||
// abort message to go to stderr instead.
|
||||
_set_error_mode(_OUT_TO_STDERR);
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if defined(_MSC_VER) && !defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
// In the debug version, Visual Studio pops up a separate dialog
|
||||
// offering a choice to debug the aborted program. We need to suppress
|
||||
// this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
|
||||
@@ -5450,6 +5477,8 @@ int UnitTest::Run() {
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
(void)in_death_test_child_process; // Needed inside the #if block above
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
return internal::HandleExceptionsInMethodIfSupported(
|
||||
@@ -5545,7 +5574,7 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
|
||||
random_(0), // Will be reseeded before first use.
|
||||
start_timestamp_(0),
|
||||
elapsed_time_(0),
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
death_test_factory_(new DefaultDeathTestFactory),
|
||||
#endif
|
||||
// Will be overridden by the flag before first use.
|
||||
@@ -5585,12 +5614,12 @@ void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
|
||||
test_result->RecordProperty(xml_element, test_property);
|
||||
}
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
// Disables event forwarding if the control is currently in a death test
|
||||
// subprocess. Must not be called before InitGoogleTest.
|
||||
void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
|
||||
if (internal_run_death_test_flag_.get() != nullptr)
|
||||
listeners()->SuppressEventForwarding();
|
||||
if (internal_run_death_test_flag_ != nullptr)
|
||||
listeners()->SuppressEventForwarding(true);
|
||||
}
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
|
||||
@@ -5605,13 +5634,15 @@ void UnitTestImpl::ConfigureXmlOutput() {
|
||||
} else if (output_format == "json") {
|
||||
listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter(
|
||||
UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
|
||||
} else if (output_format != "") {
|
||||
} else if (!output_format.empty()) {
|
||||
GTEST_LOG_(WARNING) << "WARNING: unrecognized output format \""
|
||||
<< output_format << "\" ignored.";
|
||||
}
|
||||
#else
|
||||
GTEST_LOG_(ERROR) << "ERROR: alternative output formats require "
|
||||
<< "GTEST_HAS_FILE_SYSTEM to be enabled";
|
||||
if (!output_format.empty()) {
|
||||
GTEST_LOG_(ERROR) << "ERROR: alternative output formats require "
|
||||
<< "GTEST_HAS_FILE_SYSTEM to be enabled";
|
||||
}
|
||||
#endif // GTEST_HAS_FILE_SYSTEM
|
||||
}
|
||||
|
||||
@@ -5648,7 +5679,7 @@ void UnitTestImpl::PostFlagParsingInit() {
|
||||
listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_());
|
||||
#endif // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_)
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
InitDeathTestSubprocessControlInfo();
|
||||
SuppressTestEventsIfInSubprocess();
|
||||
#endif // GTEST_HAS_DEATH_TEST
|
||||
@@ -5671,7 +5702,7 @@ void UnitTestImpl::PostFlagParsingInit() {
|
||||
ConfigureStreamingOutput();
|
||||
#endif // GTEST_CAN_STREAM_RESULTS_
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
if (GTEST_FLAG_GET(install_failure_signal_handler)) {
|
||||
absl::FailureSignalHandlerOptions options;
|
||||
absl::InstallFailureSignalHandler(options);
|
||||
@@ -5786,9 +5817,8 @@ bool UnitTestImpl::RunAllTests() {
|
||||
// death test.
|
||||
bool in_subprocess_for_death_test = false;
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
in_subprocess_for_death_test =
|
||||
(internal_run_death_test_flag_.get() != nullptr);
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
in_subprocess_for_death_test = (internal_run_death_test_flag_ != nullptr);
|
||||
#if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)
|
||||
if (in_subprocess_for_death_test) {
|
||||
GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();
|
||||
@@ -5951,10 +5981,6 @@ bool UnitTestImpl::RunAllTests() {
|
||||
"() before calling RUN_ALL_TESTS(). This is INVALID. Soon " GTEST_NAME_
|
||||
" will start to enforce the valid usage. "
|
||||
"Please fix it ASAP, or IT WILL START TO FAIL.\n"); // NOLINT
|
||||
#if GTEST_FOR_GOOGLE_
|
||||
ColoredPrintf(GTestColor::kRed,
|
||||
"For more details, see http://wiki/Main/ValidGUnitMain.\n");
|
||||
#endif // GTEST_FOR_GOOGLE_
|
||||
}
|
||||
|
||||
return !failed;
|
||||
@@ -6172,7 +6198,7 @@ void UnitTestImpl::ListTestsMatchingFilter() {
|
||||
}
|
||||
}
|
||||
fflush(stdout);
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
const std::string& output_format = UnitTestOptions::GetOutputFormat();
|
||||
if (output_format == "xml" || output_format == "json") {
|
||||
FILE* fileout = OpenFileForWriting(
|
||||
@@ -6510,7 +6536,7 @@ static const char kColorEncodedHelpMessage[] =
|
||||
#endif // GTEST_CAN_STREAM_RESULTS_
|
||||
"\n"
|
||||
"Assertion Behavior:\n"
|
||||
#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
|
||||
#if defined(GTEST_HAS_DEATH_TEST) && !defined(GTEST_OS_WINDOWS)
|
||||
" @G--" GTEST_FLAG_PREFIX_
|
||||
"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
|
||||
" Set the default death test style.\n"
|
||||
@@ -6651,26 +6677,60 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
|
||||
}
|
||||
|
||||
// Parses the command line for Google Test flags, without initializing
|
||||
// other parts of Google Test.
|
||||
// other parts of Google Test. This function updates argc and argv by removing
|
||||
// flags that are known to GoogleTest (including other user flags defined using
|
||||
// ABSL_FLAG if GoogleTest is built with GTEST_USE_ABSL). Other arguments
|
||||
// remain in place. Unrecognized flags are not reported and do not cause the
|
||||
// program to exit.
|
||||
void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
|
||||
#if GTEST_HAS_ABSL
|
||||
if (*argc > 0) {
|
||||
// absl::ParseCommandLine() requires *argc > 0.
|
||||
auto positional_args = absl::flags_internal::ParseCommandLineImpl(
|
||||
*argc, argv, absl::flags_internal::ArgvListAction::kRemoveParsedArgs,
|
||||
absl::flags_internal::UsageFlagsAction::kHandleUsage,
|
||||
absl::flags_internal::OnUndefinedFlag::kReportUndefined);
|
||||
// Any command-line positional arguments not part of any command-line flag
|
||||
// (or arguments to a flag) are copied back out to argv, with the program
|
||||
// invocation name at position 0, and argc is resized. This includes
|
||||
// positional arguments after the flag-terminating delimiter '--'.
|
||||
// See https://abseil.io/docs/cpp/guides/flags.
|
||||
std::copy(positional_args.begin(), positional_args.end(), argv);
|
||||
if (static_cast<int>(positional_args.size()) < *argc) {
|
||||
argv[positional_args.size()] = nullptr;
|
||||
*argc = static_cast<int>(positional_args.size());
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
if (*argc <= 0) return;
|
||||
|
||||
std::vector<char*> positional_args;
|
||||
std::vector<absl::UnrecognizedFlag> unrecognized_flags;
|
||||
absl::ParseAbseilFlagsOnly(*argc, argv, positional_args, unrecognized_flags);
|
||||
absl::flat_hash_set<absl::string_view> unrecognized;
|
||||
for (const auto& flag : unrecognized_flags) {
|
||||
unrecognized.insert(flag.flag_name);
|
||||
}
|
||||
absl::flat_hash_set<char*> positional;
|
||||
for (const auto& arg : positional_args) {
|
||||
positional.insert(arg);
|
||||
}
|
||||
|
||||
int out_pos = 1;
|
||||
int in_pos = 1;
|
||||
for (; in_pos < *argc; ++in_pos) {
|
||||
char* arg = argv[in_pos];
|
||||
absl::string_view arg_str(arg);
|
||||
if (absl::ConsumePrefix(&arg_str, "--")) {
|
||||
// Flag-like argument. If the flag was unrecognized, keep it.
|
||||
// If it was a GoogleTest flag, remove it.
|
||||
if (unrecognized.contains(arg_str)) {
|
||||
argv[out_pos++] = argv[in_pos];
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (arg_str.empty()) {
|
||||
++in_pos;
|
||||
break; // '--' indicates that the rest of the arguments are positional
|
||||
}
|
||||
|
||||
// Probably a positional argument. If it is in fact positional, keep it.
|
||||
// If it was a value for the flag argument, remove it.
|
||||
if (positional.contains(arg)) {
|
||||
argv[out_pos++] = arg;
|
||||
}
|
||||
}
|
||||
|
||||
// The rest are positional args for sure.
|
||||
while (in_pos < *argc) {
|
||||
argv[out_pos++] = argv[in_pos++];
|
||||
}
|
||||
|
||||
*argc = out_pos;
|
||||
argv[out_pos] = nullptr;
|
||||
#else
|
||||
ParseGoogleTestFlagsOnlyImpl(argc, argv);
|
||||
#endif
|
||||
@@ -6678,7 +6738,7 @@ void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
|
||||
// Fix the value of *_NSGetArgc() on macOS, but if and only if
|
||||
// *_NSGetArgv() == argv
|
||||
// Only applicable to char** version of argv
|
||||
#if GTEST_OS_MAC
|
||||
#ifdef GTEST_OS_MAC
|
||||
#ifndef GTEST_OS_IOS
|
||||
if (*_NSGetArgv() == argv) {
|
||||
*_NSGetArgc() = *argc;
|
||||
@@ -6706,7 +6766,7 @@ void InitGoogleTestImpl(int* argc, CharType** argv) {
|
||||
g_argvs.push_back(StreamableToString(argv[i]));
|
||||
}
|
||||
|
||||
#if GTEST_HAS_ABSL
|
||||
#ifdef GTEST_HAS_ABSL
|
||||
absl::InitializeSymbolizer(g_argvs[0].c_str());
|
||||
|
||||
// When using the Abseil Flags library, set the program usage message to the
|
||||
@@ -6790,16 +6850,16 @@ static std::string GetDirFromEnv(
|
||||
std::string TempDir() {
|
||||
#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)
|
||||
return GTEST_CUSTOM_TEMPDIR_FUNCTION_();
|
||||
#elif GTEST_OS_WINDOWS || GTEST_OS_WINDOWS_MOBILE
|
||||
#elif defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
return GetDirFromEnv({"TEST_TMPDIR", "TEMP"}, "\\temp\\", '\\');
|
||||
#elif GTEST_OS_LINUX_ANDROID
|
||||
#elif defined(GTEST_OS_LINUX_ANDROID)
|
||||
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/data/local/tmp/", '/');
|
||||
#else
|
||||
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/tmp/", '/');
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(GTEST_CUSTOM_SRCDIR_FUNCTION_)
|
||||
#if GTEST_HAS_FILE_SYSTEM && !defined(GTEST_CUSTOM_SRCDIR_FUNCTION_)
|
||||
// Returns the directory path (including terminating separator) of the current
|
||||
// executable as derived from argv[0].
|
||||
static std::string GetCurrentExecutableDirectory() {
|
||||
@@ -6808,13 +6868,14 @@ static std::string GetCurrentExecutableDirectory() {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if GTEST_HAS_FILE_SYSTEM
|
||||
std::string SrcDir() {
|
||||
#if defined(GTEST_CUSTOM_SRCDIR_FUNCTION_)
|
||||
return GTEST_CUSTOM_SRCDIR_FUNCTION_();
|
||||
#elif GTEST_OS_WINDOWS || GTEST_OS_WINDOWS_MOBILE
|
||||
#elif defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
return GetDirFromEnv({"TEST_SRCDIR"}, GetCurrentExecutableDirectory().c_str(),
|
||||
'\\');
|
||||
#elif GTEST_OS_LINUX_ANDROID
|
||||
#elif defined(GTEST_OS_LINUX_ANDROID)
|
||||
return GetDirFromEnv({"TEST_SRCDIR"}, GetCurrentExecutableDirectory().c_str(),
|
||||
'/');
|
||||
#else
|
||||
@@ -6822,6 +6883,7 @@ std::string SrcDir() {
|
||||
'/');
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
// Class ScopedTrace
|
||||
|
||||
|
||||
@@ -31,10 +31,11 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#if GTEST_OS_ESP8266 || GTEST_OS_ESP32
|
||||
#if defined(GTEST_OS_ESP8266) || defined(GTEST_OS_ESP32) || \
|
||||
(defined(GTEST_OS_NRF52) && defined(ARDUINO))
|
||||
// Arduino-like platforms: program entry points are setup/loop instead of main.
|
||||
|
||||
#if GTEST_OS_ESP8266
|
||||
#ifdef GTEST_OS_ESP8266
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@@ -42,11 +43,11 @@ void setup() { testing::InitGoogleTest(); }
|
||||
|
||||
void loop() { RUN_ALL_TESTS(); }
|
||||
|
||||
#if GTEST_OS_ESP8266
|
||||
#ifdef GTEST_OS_ESP8266
|
||||
}
|
||||
#endif
|
||||
|
||||
#elif GTEST_OS_QURT
|
||||
#elif defined(GTEST_OS_QURT)
|
||||
// QuRT: program entry point is main, but argc/argv are unusable.
|
||||
|
||||
GTEST_API_ int main() {
|
||||
|
||||
@@ -64,6 +64,7 @@ cc_test(
|
||||
"googletest-global-environment-unittest_.cc",
|
||||
"googletest-break-on-failure-unittest_.cc",
|
||||
"googletest-listener-test.cc",
|
||||
"googletest-message-test.cc",
|
||||
"googletest-output-test_.cc",
|
||||
"googletest-list-tests-unittest_.cc",
|
||||
"googletest-shuffle-test_.cc",
|
||||
|
||||
@@ -59,7 +59,8 @@ CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
|
||||
|
||||
# Path to the googletest-break-on-failure-unittest_ program.
|
||||
EXE_PATH = gtest_test_utils.GetTestExecutablePath(
|
||||
'googletest-break-on-failure-unittest_')
|
||||
'googletest-break-on-failure-unittest_'
|
||||
)
|
||||
|
||||
|
||||
environ = gtest_test_utils.environ
|
||||
@@ -87,22 +88,26 @@ def Run(command):
|
||||
|
||||
|
||||
class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
|
||||
"""Tests using the GTEST_BREAK_ON_FAILURE environment variable or
|
||||
"""Unit test for Google Test's break-on-failure mode.
|
||||
|
||||
Tests using the GTEST_BREAK_ON_FAILURE environment variable or
|
||||
the --gtest_break_on_failure flag to turn assertion failures into
|
||||
segmentation faults.
|
||||
"""
|
||||
|
||||
def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
|
||||
"""Runs googletest-break-on-failure-unittest_ and verifies that it does
|
||||
"""Runs googletest-break-on-failure-unittest_ and verifies its behavior.
|
||||
|
||||
Runs googletest-break-on-failure-unittest_ and verifies that it does
|
||||
(or does not) have a seg-fault.
|
||||
|
||||
Args:
|
||||
env_var_value: value of the GTEST_BREAK_ON_FAILURE environment
|
||||
variable; None if the variable should be unset.
|
||||
flag_value: value of the --gtest_break_on_failure flag;
|
||||
None if the flag should not be present.
|
||||
expect_seg_fault: 1 if the program is expected to generate a seg-fault;
|
||||
0 otherwise.
|
||||
variable; None if the variable should be unset.
|
||||
flag_value: value of the --gtest_break_on_failure flag; None if the
|
||||
flag should not be present.
|
||||
expect_seg_fault: 1 if the program is expected to generate a seg-fault; 0
|
||||
otherwise.
|
||||
"""
|
||||
|
||||
SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
|
||||
@@ -132,74 +137,56 @@ class GTestBreakOnFailureUnitTest(gtest_test_utils.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))
|
||||
self.assert_(has_seg_fault == expect_seg_fault, msg)
|
||||
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,
|
||||
)
|
||||
self.assertTrue(has_seg_fault == expect_seg_fault, msg)
|
||||
|
||||
def testDefaultBehavior(self):
|
||||
"""Tests the behavior of the default mode."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value=None,
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value=None, flag_value=None, expect_seg_fault=0)
|
||||
|
||||
def testEnvVar(self):
|
||||
"""Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value=None,
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value=None,
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='0', flag_value=None, expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1', flag_value=None, expect_seg_fault=1)
|
||||
|
||||
def testFlag(self):
|
||||
"""Tests using the --gtest_break_on_failure flag."""
|
||||
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value=None,
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value=None, flag_value='0', expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value=None, flag_value='1', expect_seg_fault=1)
|
||||
|
||||
def testFlagOverridesEnvVar(self):
|
||||
"""Tests that the flag overrides the environment variable."""
|
||||
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='0',
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='0',
|
||||
expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='0', flag_value='0', expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='0', flag_value='1', expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='1', flag_value='0', expect_seg_fault=0)
|
||||
self.RunAndVerify(env_var_value='1', flag_value='1', expect_seg_fault=1)
|
||||
|
||||
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)
|
||||
self.RunAndVerify(env_var_value=None, flag_value='1', expect_seg_fault=1)
|
||||
finally:
|
||||
SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
|
||||
|
||||
if IS_WINDOWS:
|
||||
|
||||
def testCatchExceptionsDoesNotInterfere(self):
|
||||
"""Tests that gtest_catch_exceptions doesn't interfere."""
|
||||
|
||||
SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
|
||||
try:
|
||||
self.RunAndVerify(env_var_value='1',
|
||||
flag_value='1',
|
||||
expect_seg_fault=1)
|
||||
self.RunAndVerify(env_var_value='1', flag_value='1', expect_seg_fault=1)
|
||||
finally:
|
||||
SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
@@ -49,7 +49,7 @@ namespace {
|
||||
// A test that's expected to fail.
|
||||
TEST(Foo, Bar) { EXPECT_EQ(2, 3); }
|
||||
|
||||
#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if GTEST_HAS_SEH && !defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
// On Windows Mobile global exception handlers are not supported.
|
||||
LONG WINAPI
|
||||
ExitWithExceptionCode(struct _EXCEPTION_POINTERS* exception_pointers) {
|
||||
@@ -60,12 +60,12 @@ ExitWithExceptionCode(struct _EXCEPTION_POINTERS* exception_pointers) {
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
// Suppresses display of the Windows error dialog upon encountering
|
||||
// a general protection fault (segment violation).
|
||||
SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
|
||||
|
||||
#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
|
||||
#if GTEST_HAS_SEH && !defined(GTEST_OS_WINDOWS_MOBILE)
|
||||
|
||||
// The default unhandled exception filter does not always exit
|
||||
// with the exception code as exit code - for example it exits with
|
||||
|
||||
@@ -46,12 +46,14 @@ FILTER_FLAG = FLAG_PREFIX + 'filter'
|
||||
# Path to the googletest-catch-exceptions-ex-test_ binary, compiled with
|
||||
# exceptions enabled.
|
||||
EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
|
||||
'googletest-catch-exceptions-ex-test_')
|
||||
'googletest-catch-exceptions-ex-test_'
|
||||
)
|
||||
|
||||
# Path to the googletest-catch-exceptions-test_ binary, compiled with
|
||||
# exceptions disabled.
|
||||
EXE_PATH = gtest_test_utils.GetTestExecutablePath(
|
||||
'googletest-catch-exceptions-no-ex-test_')
|
||||
'googletest-catch-exceptions-no-ex-test_'
|
||||
)
|
||||
|
||||
environ = gtest_test_utils.environ
|
||||
SetEnvVar = gtest_test_utils.SetEnvVar
|
||||
@@ -64,7 +66,8 @@ SetEnvVar = gtest_test_utils.SetEnvVar
|
||||
SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
|
||||
|
||||
TEST_LIST = gtest_test_utils.Subprocess(
|
||||
[EXE_PATH, LIST_TESTS_FLAG], env=environ).output
|
||||
[EXE_PATH, LIST_TESTS_FLAG], env=environ
|
||||
).output
|
||||
|
||||
SUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
|
||||
|
||||
@@ -72,33 +75,47 @@ if SUPPORTS_SEH_EXCEPTIONS:
|
||||
BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output
|
||||
|
||||
EX_BINARY_OUTPUT = gtest_test_utils.Subprocess(
|
||||
[EX_EXE_PATH], env=environ).output
|
||||
[EX_EXE_PATH], env=environ
|
||||
).output
|
||||
|
||||
|
||||
# The tests.
|
||||
if SUPPORTS_SEH_EXCEPTIONS:
|
||||
# pylint:disable-msg=C6302
|
||||
|
||||
class CatchSehExceptionsTest(gtest_test_utils.TestCase):
|
||||
"""Tests exception-catching behavior."""
|
||||
|
||||
|
||||
def TestSehExceptions(self, test_output):
|
||||
self.assert_('SEH exception with code 0x2a thrown '
|
||||
'in the test fixture\'s constructor'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown '
|
||||
'in the test fixture\'s destructor'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown in SetUpTestSuite()'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown in TearDownTestSuite()'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown in SetUp()'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown in TearDown()'
|
||||
in test_output)
|
||||
self.assert_('SEH exception with code 0x2a thrown in the test body'
|
||||
in test_output)
|
||||
self.assertIn(
|
||||
(
|
||||
'SEH exception with code 0x2a thrown '
|
||||
"in the test fixture's constructor"
|
||||
),
|
||||
test_output,
|
||||
)
|
||||
self.assertIn(
|
||||
(
|
||||
'SEH exception with code 0x2a thrown '
|
||||
"in the test fixture's destructor"
|
||||
),
|
||||
test_output,
|
||||
)
|
||||
self.assertIn(
|
||||
'SEH exception with code 0x2a thrown in SetUpTestSuite()', test_output
|
||||
)
|
||||
self.assertIn(
|
||||
'SEH exception with code 0x2a thrown in TearDownTestSuite()',
|
||||
test_output,
|
||||
)
|
||||
self.assertIn(
|
||||
'SEH exception with code 0x2a thrown in SetUp()', test_output
|
||||
)
|
||||
self.assertIn(
|
||||
'SEH exception with code 0x2a thrown in TearDown()', test_output
|
||||
)
|
||||
self.assertIn(
|
||||
'SEH exception with code 0x2a thrown in the test body', test_output
|
||||
)
|
||||
|
||||
def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
|
||||
self.TestSehExceptions(EX_BINARY_OUTPUT)
|
||||
@@ -110,126 +127,188 @@ if SUPPORTS_SEH_EXCEPTIONS:
|
||||
class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
|
||||
"""Tests C++ exception-catching behavior.
|
||||
|
||||
Tests in this test case verify that:
|
||||
* C++ exceptions are caught and logged as C++ (not SEH) exceptions
|
||||
* Exception thrown affect the remainder of the test work flow in the
|
||||
expected manner.
|
||||
Tests in this test case verify that:
|
||||
* C++ exceptions are caught and logged as C++ (not SEH) exceptions
|
||||
* Exception thrown affect the remainder of the test work flow in the
|
||||
expected manner.
|
||||
"""
|
||||
|
||||
def testCatchesCxxExceptionsInFixtureConstructor(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description '
|
||||
'"Standard C++ exception" thrown '
|
||||
'in the test fixture\'s constructor' in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT)
|
||||
self.assert_('unexpected' not in EX_BINARY_OUTPUT,
|
||||
'This failure belongs in this test only if '
|
||||
'"CxxExceptionInConstructorTest" (no quotes) '
|
||||
'appears on the same line as words "called unexpectedly"')
|
||||
"in the test fixture's constructor"
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'unexpected' not in EX_BINARY_OUTPUT,
|
||||
(
|
||||
'This failure belongs in this test only if '
|
||||
'"CxxExceptionInConstructorTest" (no quotes) '
|
||||
'appears on the same line as words "called unexpectedly"'
|
||||
),
|
||||
)
|
||||
|
||||
if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
|
||||
EX_BINARY_OUTPUT):
|
||||
if (
|
||||
'CxxExceptionInDestructorTest.ThrowsExceptionInDestructor'
|
||||
in EX_BINARY_OUTPUT
|
||||
):
|
||||
|
||||
def testCatchesCxxExceptionsInFixtureDestructor(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description '
|
||||
'"Standard C++ exception" thrown '
|
||||
'in the test fixture\'s destructor' in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT)
|
||||
"in the test fixture's destructor"
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInDestructorTest::TearDownTestSuite() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testCatchesCxxExceptionsInSetUpTestCase(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description "Standard C++ exception"'
|
||||
' thrown in SetUpTestSuite()' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
' thrown in SetUpTestSuite()'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInConstructorTest::TearDownTestSuite() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInConstructorTest::TearDownTestSuite() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertFalse(
|
||||
'CxxExceptionInSetUpTestSuiteTest constructor '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTestSuiteTest constructor called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertFalse(
|
||||
'CxxExceptionInSetUpTestSuiteTest destructor '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTestSuiteTest destructor called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertFalse(
|
||||
'CxxExceptionInSetUpTestSuiteTest::SetUp() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTestSuiteTest::SetUp() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertFalse(
|
||||
'CxxExceptionInSetUpTestSuiteTest::TearDown() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTestSuiteTest::TearDown() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertFalse(
|
||||
'CxxExceptionInSetUpTestSuiteTest test body '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTestSuiteTest test body called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testCatchesCxxExceptionsInTearDownTestCase(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description "Standard C++ exception"'
|
||||
' thrown in TearDownTestSuite()' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
' thrown in TearDownTestSuite()'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testCatchesCxxExceptionsInSetUp(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description "Standard C++ exception"'
|
||||
' thrown in SetUp()' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
' thrown in SetUp()'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInSetUpTest::TearDownTestSuite() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTest::TearDownTestSuite() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInSetUpTest destructor '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInSetUpTest destructor called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInSetUpTest::TearDown() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
self.assert_('unexpected' not in EX_BINARY_OUTPUT,
|
||||
'This failure belongs in this test only if '
|
||||
'"CxxExceptionInSetUpTest" (no quotes) '
|
||||
'appears on the same line as words "called unexpectedly"')
|
||||
'CxxExceptionInSetUpTest::TearDown() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'unexpected' not in EX_BINARY_OUTPUT,
|
||||
(
|
||||
'This failure belongs in this test only if '
|
||||
'"CxxExceptionInSetUpTest" (no quotes) '
|
||||
'appears on the same line as words "called unexpectedly"'
|
||||
),
|
||||
)
|
||||
|
||||
def testCatchesCxxExceptionsInTearDown(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description "Standard C++ exception"'
|
||||
' thrown in TearDown()' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
' thrown in TearDown()'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInTearDownTest::TearDownTestSuite() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInTearDownTest::TearDownTestSuite() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInTearDownTest destructor '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInTearDownTest destructor called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testCatchesCxxExceptionsInTestBody(self):
|
||||
self.assertTrue(
|
||||
'C++ exception with description "Standard C++ exception"'
|
||||
' thrown in the test body' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
' thrown in the test body'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInTestBodyTest::TearDownTestSuite() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInTestBodyTest::TearDownTestSuite() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInTestBodyTest destructor '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInTestBodyTest destructor called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
self.assertTrue(
|
||||
'CxxExceptionInTestBodyTest::TearDown() '
|
||||
'called as expected.' in EX_BINARY_OUTPUT, EX_BINARY_OUTPUT)
|
||||
'CxxExceptionInTestBodyTest::TearDown() called as expected.'
|
||||
in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testCatchesNonStdCxxExceptions(self):
|
||||
self.assertTrue(
|
||||
'Unknown C++ exception thrown in the test body' in EX_BINARY_OUTPUT,
|
||||
EX_BINARY_OUTPUT)
|
||||
EX_BINARY_OUTPUT,
|
||||
)
|
||||
|
||||
def testUnhandledCxxExceptionsAbortTheProgram(self):
|
||||
# Filters out SEH exception tests on Windows. Unhandled SEH exceptions
|
||||
# cause tests to show pop-up windows there.
|
||||
FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
|
||||
filter_out_seh_tests_flag = FILTER_FLAG + '=-*Seh*'
|
||||
# By default, Google Test doesn't catch the exceptions.
|
||||
uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
|
||||
[EX_EXE_PATH,
|
||||
NO_CATCH_EXCEPTIONS_FLAG,
|
||||
FITLER_OUT_SEH_TESTS_FLAG],
|
||||
env=environ).output
|
||||
[EX_EXE_PATH, NO_CATCH_EXCEPTIONS_FLAG, filter_out_seh_tests_flag],
|
||||
env=environ,
|
||||
).output
|
||||
|
||||
self.assert_('Unhandled C++ exception terminating the program'
|
||||
in uncaught_exceptions_ex_binary_output)
|
||||
self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
|
||||
self.assertIn(
|
||||
'Unhandled C++ exception terminating the program',
|
||||
uncaught_exceptions_ex_binary_output,
|
||||
)
|
||||
self.assertNotIn('unexpected', uncaught_exceptions_ex_binary_output)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -65,63 +65,64 @@ def UsesColor(term, color_env_var, color_flag):
|
||||
|
||||
|
||||
class GTestColorTest(gtest_test_utils.TestCase):
|
||||
|
||||
def testNoEnvVarNoFlag(self):
|
||||
"""Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
|
||||
|
||||
if not IS_WINDOWS:
|
||||
self.assert_(not UsesColor('dumb', None, None))
|
||||
self.assert_(not UsesColor('emacs', None, None))
|
||||
self.assert_(not UsesColor('xterm-mono', None, None))
|
||||
self.assert_(not UsesColor('unknown', None, None))
|
||||
self.assert_(not UsesColor(None, None, None))
|
||||
self.assert_(UsesColor('linux', None, None))
|
||||
self.assert_(UsesColor('cygwin', None, None))
|
||||
self.assert_(UsesColor('xterm', None, None))
|
||||
self.assert_(UsesColor('xterm-color', None, None))
|
||||
self.assert_(UsesColor('xterm-kitty', None, None))
|
||||
self.assert_(UsesColor('xterm-256color', None, None))
|
||||
self.assertTrue(not UsesColor('dumb', None, None))
|
||||
self.assertTrue(not UsesColor('emacs', None, None))
|
||||
self.assertTrue(not UsesColor('xterm-mono', None, None))
|
||||
self.assertTrue(not UsesColor('unknown', None, None))
|
||||
self.assertTrue(not UsesColor(None, None, None))
|
||||
self.assertTrue(UsesColor('linux', None, None))
|
||||
self.assertTrue(UsesColor('cygwin', None, None))
|
||||
self.assertTrue(UsesColor('xterm', None, None))
|
||||
self.assertTrue(UsesColor('xterm-color', None, None))
|
||||
self.assertTrue(UsesColor('xterm-kitty', None, None))
|
||||
self.assertTrue(UsesColor('xterm-256color', None, None))
|
||||
|
||||
def testFlagOnly(self):
|
||||
"""Tests the case when there's --gtest_color but not GTEST_COLOR."""
|
||||
|
||||
self.assert_(not UsesColor('dumb', None, 'no'))
|
||||
self.assert_(not UsesColor('xterm-color', None, 'no'))
|
||||
self.assertTrue(not UsesColor('dumb', None, 'no'))
|
||||
self.assertTrue(not UsesColor('xterm-color', None, 'no'))
|
||||
if not IS_WINDOWS:
|
||||
self.assert_(not UsesColor('emacs', None, 'auto'))
|
||||
self.assert_(UsesColor('xterm', None, 'auto'))
|
||||
self.assert_(UsesColor('dumb', None, 'yes'))
|
||||
self.assert_(UsesColor('xterm', None, 'yes'))
|
||||
self.assertTrue(not UsesColor('emacs', None, 'auto'))
|
||||
self.assertTrue(UsesColor('xterm', None, 'auto'))
|
||||
self.assertTrue(UsesColor('dumb', None, 'yes'))
|
||||
self.assertTrue(UsesColor('xterm', None, 'yes'))
|
||||
|
||||
def testEnvVarOnly(self):
|
||||
"""Tests the case when there's GTEST_COLOR but not --gtest_color."""
|
||||
|
||||
self.assert_(not UsesColor('dumb', 'no', None))
|
||||
self.assert_(not UsesColor('xterm-color', 'no', None))
|
||||
self.assertTrue(not UsesColor('dumb', 'no', None))
|
||||
self.assertTrue(not UsesColor('xterm-color', 'no', None))
|
||||
if not IS_WINDOWS:
|
||||
self.assert_(not UsesColor('dumb', 'auto', None))
|
||||
self.assert_(UsesColor('xterm-color', 'auto', None))
|
||||
self.assert_(UsesColor('dumb', 'yes', None))
|
||||
self.assert_(UsesColor('xterm-color', 'yes', None))
|
||||
self.assertTrue(not UsesColor('dumb', 'auto', None))
|
||||
self.assertTrue(UsesColor('xterm-color', 'auto', None))
|
||||
self.assertTrue(UsesColor('dumb', 'yes', None))
|
||||
self.assertTrue(UsesColor('xterm-color', 'yes', None))
|
||||
|
||||
def testEnvVarAndFlag(self):
|
||||
"""Tests the case when there are both GTEST_COLOR and --gtest_color."""
|
||||
|
||||
self.assert_(not UsesColor('xterm-color', 'no', 'no'))
|
||||
self.assert_(UsesColor('dumb', 'no', 'yes'))
|
||||
self.assert_(UsesColor('xterm-color', 'no', 'auto'))
|
||||
self.assertTrue(not UsesColor('xterm-color', 'no', 'no'))
|
||||
self.assertTrue(UsesColor('dumb', 'no', 'yes'))
|
||||
self.assertTrue(UsesColor('xterm-color', 'no', 'auto'))
|
||||
|
||||
def testAliasesOfYesAndNo(self):
|
||||
"""Tests using aliases in specifying --gtest_color."""
|
||||
|
||||
self.assert_(UsesColor('dumb', None, 'true'))
|
||||
self.assert_(UsesColor('dumb', None, 'YES'))
|
||||
self.assert_(UsesColor('dumb', None, 'T'))
|
||||
self.assert_(UsesColor('dumb', None, '1'))
|
||||
self.assertTrue(UsesColor('dumb', None, 'true'))
|
||||
self.assertTrue(UsesColor('dumb', None, 'YES'))
|
||||
self.assertTrue(UsesColor('dumb', None, 'T'))
|
||||
self.assertTrue(UsesColor('dumb', None, '1'))
|
||||
|
||||
self.assert_(not UsesColor('xterm', None, 'f'))
|
||||
self.assert_(not UsesColor('xterm', None, 'false'))
|
||||
self.assert_(not UsesColor('xterm', None, '0'))
|
||||
self.assert_(not UsesColor('xterm', None, 'unknown'))
|
||||
self.assertTrue(not UsesColor('xterm', None, 'f'))
|
||||
self.assertTrue(not UsesColor('xterm', None, 'false'))
|
||||
self.assertTrue(not UsesColor('xterm', None, '0'))
|
||||
self.assertTrue(not UsesColor('xterm', None, 'unknown'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
using testing::internal::AlwaysFalse;
|
||||
using testing::internal::AlwaysTrue;
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
#include <direct.h> // For chdir().
|
||||
#include <fcntl.h> // For O_BINARY
|
||||
#include <io.h>
|
||||
@@ -52,7 +52,10 @@ using testing::internal::AlwaysTrue;
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#ifdef GTEST_OS_LINUX
|
||||
#include <sys/time.h>
|
||||
#endif // GTEST_OS_LINUX
|
||||
|
||||
@@ -200,7 +203,7 @@ int DieInDebugElse12(int* sideeffect) {
|
||||
return 12;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Death in dbg due to Windows CRT assertion failure, not opt.
|
||||
int DieInCRTDebugElse12(int* sideeffect) {
|
||||
@@ -220,7 +223,7 @@ int DieInCRTDebugElse12(int* sideeffect) {
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
|
||||
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
// Tests the ExitedWithCode predicate.
|
||||
TEST(ExitStatusPredicateTest, ExitedWithCode) {
|
||||
@@ -327,23 +330,6 @@ TEST_F(TestForDeathTest, SingleStatement) {
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#if GTEST_USES_PCRE
|
||||
|
||||
void DieWithEmbeddedNul() {
|
||||
fprintf(stderr, "Hello%cmy null world.\n", '\0');
|
||||
fflush(stderr);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
|
||||
// message has a NUL character in it.
|
||||
TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
|
||||
EXPECT_DEATH(DieWithEmbeddedNul(), "my null world");
|
||||
ASSERT_DEATH(DieWithEmbeddedNul(), "my null world");
|
||||
}
|
||||
|
||||
#endif // GTEST_USES_PCRE
|
||||
|
||||
// Tests that death test macros expand to code which interacts well with switch
|
||||
// statements.
|
||||
TEST_F(TestForDeathTest, SwitchStatement) {
|
||||
@@ -391,7 +377,7 @@ TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
|
||||
ASSERT_DEATH(_exit(1), "");
|
||||
}
|
||||
|
||||
#if GTEST_OS_LINUX
|
||||
#ifdef GTEST_OS_LINUX
|
||||
void SigprofAction(int, siginfo_t*, void*) { /* no op */
|
||||
}
|
||||
|
||||
@@ -521,16 +507,12 @@ TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
|
||||
const testing::internal::RE regex(regex_c_str);
|
||||
EXPECT_DEATH(GlobalFunction(), regex);
|
||||
|
||||
#if !GTEST_USES_PCRE
|
||||
|
||||
const ::std::string regex_std_str(regex_c_str);
|
||||
EXPECT_DEATH(GlobalFunction(), regex_std_str);
|
||||
|
||||
// This one is tricky; a temporary pointer into another temporary. Reference
|
||||
// lifetime extension of the pointer is not sufficient.
|
||||
EXPECT_DEATH(GlobalFunction(), ::std::string(regex_c_str).c_str());
|
||||
|
||||
#endif // !GTEST_USES_PCRE
|
||||
}
|
||||
|
||||
// Tests that a non-void function can be used in a death test.
|
||||
@@ -662,7 +644,7 @@ TEST_F(TestForDeathTest, TestExpectDebugDeath) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/crtsetreportmode
|
||||
// In debug mode, the calls to _CrtSetReportMode and _CrtSetReportFile enable
|
||||
@@ -714,7 +696,7 @@ void ExpectDebugDeathHelper(bool* aborted) {
|
||||
*aborted = false;
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
|
||||
printf(
|
||||
"This test should be considered failing if it shows "
|
||||
@@ -826,14 +808,14 @@ static void TestExitMacros() {
|
||||
EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
|
||||
ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
|
||||
// Of all signals effects on the process exit code, only those of SIGABRT
|
||||
// are documented on Windows.
|
||||
// See https://msdn.microsoft.com/en-us/query-bi/m/dwwzkt4c.
|
||||
EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar";
|
||||
|
||||
#elif !GTEST_OS_FUCHSIA
|
||||
#elif !defined(GTEST_OS_FUCHSIA)
|
||||
|
||||
// Fuchsia has no unix signals.
|
||||
EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
|
||||
@@ -1198,7 +1180,7 @@ TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {
|
||||
EXPECT_STREQ("", GetLastErrnoDescription().c_str());
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
TEST(AutoHandleTest, AutoHandleWorks) {
|
||||
HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
ASSERT_NE(INVALID_HANDLE_VALUE, handle);
|
||||
@@ -1225,7 +1207,7 @@ TEST(AutoHandleTest, AutoHandleWorks) {
|
||||
}
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
typedef unsigned __int64 BiggestParsable;
|
||||
typedef signed __int64 BiggestSignedParsable;
|
||||
#else
|
||||
@@ -1322,7 +1304,7 @@ TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
|
||||
EXPECT_EQ(123, char_result);
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS
|
||||
#ifdef GTEST_OS_WINDOWS
|
||||
TEST(EnvironmentTest, HandleFitsIntoSizeT) {
|
||||
ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
|
||||
}
|
||||
@@ -1374,7 +1356,7 @@ void DieWithMessage(const char* message) {
|
||||
TEST(MatcherDeathTest, DoesNotBreakBareRegexMatching) {
|
||||
// googletest tests this, of course; here we ensure that including googlemock
|
||||
// has not broken it.
|
||||
#if GTEST_USES_POSIX_RE
|
||||
#ifdef GTEST_USES_POSIX_RE
|
||||
EXPECT_DEATH(DieWithMessage("O, I die, Horatio."), "I d[aeiou]e");
|
||||
#else
|
||||
EXPECT_DEATH(DieWithMessage("O, I die, Horatio."), "I di?e");
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include "gtest/gtest-death-test.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#if GTEST_HAS_DEATH_TEST
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
|
||||
#if GTEST_HAS_SEH
|
||||
#include <windows.h> // For RaiseException().
|
||||
|
||||
@@ -101,7 +101,6 @@ class GTestEnvVarTest(gtest_test_utils.TestCase):
|
||||
TestFlag('death_test_use_fork', '1', '0')
|
||||
TestFlag('stack_trace_depth', '0', '100')
|
||||
|
||||
|
||||
def testXmlOutputFile(self):
|
||||
"""Tests that $XML_OUTPUT_FILE affects the output flag."""
|
||||
|
||||
@@ -116,5 +115,6 @@ class GTestEnvVarTest(gtest_test_utils.TestCase):
|
||||
SetEnvVar('XML_OUTPUT_FILE', 'tmp/bar.xml')
|
||||
AssertEq('xml:tmp/foo.xml', GetFlag('output'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtest_test_utils.Main()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user