-
Notifications
You must be signed in to change notification settings - Fork 30.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
deps: extract gtest source files to deps/googletest
PR-URL: #39386 Refs: #39361 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent
2cf52f8
commit 626eb07
Showing
42 changed files
with
25,191 additions
and
26,678 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
{ | ||
'targets': [ | ||
{ | ||
'target_name': 'gtest', | ||
'type': 'static_library', | ||
'sources': [ | ||
'include/gtest/gtest_pred_impl.h', | ||
'include/gtest/gtest-death-test.h', | ||
'include/gtest/gtest-matchers.h', | ||
'include/gtest/gtest-message.h', | ||
'include/gtest/gtest-param-test.h', | ||
'include/gtest/gtest-printers.h', | ||
'include/gtest/gtest-spi.h', | ||
'include/gtest/gtest-test-part.h', | ||
'include/gtest/gtest-typed-test.h', | ||
'include/gtest/gtest.h', | ||
'include/gtest/internal/gtest-death-test-internal.h', | ||
'include/gtest/internal/gtest-filepath.h', | ||
'include/gtest/internal/gtest-internal.h', | ||
'include/gtest/internal/gtest-param-util.h', | ||
'include/gtest/internal/gtest-port-arch.h', | ||
'include/gtest/internal/gtest-port.h', | ||
'include/gtest/internal/gtest-string.h', | ||
'include/gtest/internal/gtest-type-util.h', | ||
'include/gtest/internal/custom/gtest-port.h', | ||
'include/gtest/internal/custom/gtest-printers.h', | ||
'include/gtest/internal/custom/gtest.h', | ||
'src/gtest-all.cc', | ||
'src/gtest-death-test.cc', | ||
'src/gtest-filepath.cc', | ||
'src/gtest-internal-inl.h', | ||
'src/gtest-matchers.cc', | ||
'src/gtest-port.cc', | ||
'src/gtest-printers.cc', | ||
'src/gtest-test-part.cc', | ||
'src/gtest-typed-test.cc', | ||
'src/gtest.cc', | ||
], | ||
'sources!': [ | ||
'src/gtest-all.cc', # Not needed by our build. | ||
], | ||
'include_dirs': [ | ||
'.', # src | ||
'include', | ||
], | ||
'dependencies': [ | ||
'gtest_prod', | ||
], | ||
'defines': [ | ||
# In order to allow regex matches in gtest to be shared between Windows | ||
# and other systems, we tell gtest to always use it's internal engine. | ||
'GTEST_HAS_POSIX_RE=0', | ||
'GTEST_LANG_CXX11=1', | ||
], | ||
'all_dependent_settings': { | ||
'defines': [ | ||
'GTEST_HAS_POSIX_RE=0', | ||
'GTEST_LANG_CXX11=1', | ||
], | ||
}, | ||
'conditions': [ | ||
['OS=="android"', { | ||
'defines': [ | ||
'GTEST_HAS_CLONE=0', | ||
], | ||
'direct_dependent_settings': { | ||
'defines': [ | ||
'GTEST_HAS_CLONE=0', | ||
], | ||
}, | ||
}], | ||
], | ||
'direct_dependent_settings': { | ||
'defines': [ | ||
'UNIT_TEST', | ||
], | ||
'include_dirs': [ | ||
'include', | ||
], | ||
}, | ||
}, | ||
{ | ||
'target_name': 'gtest_main', | ||
'type': 'static_library', | ||
'dependencies': [ | ||
'gtest', | ||
], | ||
'sources': [ | ||
'src/gtest_main.cc', | ||
], | ||
}, | ||
{ | ||
'target_name': 'gtest_prod', | ||
'type': 'none', | ||
'sources': [ | ||
'include/gtest/gtest_prod.h', | ||
], | ||
'direct_dependent_settings': { | ||
'include_dirs': [ | ||
'include', | ||
], | ||
}, | ||
}, | ||
], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,346 @@ | ||
// Copyright 2005, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
||
// | ||
// The Google C++ Testing and Mocking Framework (Google Test) | ||
// | ||
// This header file defines the public API for death tests. It is | ||
// #included by gtest.h so a user doesn't need to include this | ||
// directly. | ||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ | ||
|
||
#include "gtest/internal/gtest-death-test-internal.h" | ||
|
||
// This flag controls the style of death tests. Valid values are "threadsafe", | ||
// meaning that the death test child process will re-execute the test binary | ||
// from the start, running only a single death test, or "fast", | ||
// meaning that the child process will execute the test logic immediately | ||
// after forking. | ||
GTEST_DECLARE_string_(death_test_style); | ||
|
||
namespace testing { | ||
|
||
#if GTEST_HAS_DEATH_TEST | ||
|
||
namespace internal { | ||
|
||
// Returns a Boolean value indicating whether the caller is currently | ||
// executing in the context of the death test child process. Tools such as | ||
// Valgrind heap checkers may need this to modify their behavior in death | ||
// tests. IMPORTANT: This is an internal utility. Using it may break the | ||
// implementation of death tests. User code MUST NOT use it. | ||
GTEST_API_ bool InDeathTestChild(); | ||
|
||
} // namespace internal | ||
|
||
// The following macros are useful for writing death tests. | ||
|
||
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is | ||
// executed: | ||
// | ||
// 1. It generates a warning if there is more than one active | ||
// thread. This is because it's safe to fork() or clone() only | ||
// when there is a single thread. | ||
// | ||
// 2. The parent process clone()s a sub-process and runs the death | ||
// test in it; the sub-process exits with code 0 at the end of the | ||
// death test, if it hasn't exited already. | ||
// | ||
// 3. The parent process waits for the sub-process to terminate. | ||
// | ||
// 4. The parent process checks the exit code and error message of | ||
// the sub-process. | ||
// | ||
// Examples: | ||
// | ||
// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); | ||
// for (int i = 0; i < 5; i++) { | ||
// EXPECT_DEATH(server.ProcessRequest(i), | ||
// "Invalid request .* in ProcessRequest()") | ||
// << "Failed to die on request " << i; | ||
// } | ||
// | ||
// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); | ||
// | ||
// bool KilledBySIGHUP(int exit_code) { | ||
// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; | ||
// } | ||
// | ||
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); | ||
// | ||
// The final parameter to each of these macros is a matcher applied to any data | ||
// the sub-process wrote to stderr. For compatibility with existing tests, a | ||
// bare string is interpreted as a regular expression matcher. | ||
// | ||
// On the regular expressions used in death tests: | ||
// | ||
// GOOGLETEST_CM0005 DO NOT DELETE | ||
// On POSIX-compliant systems (*nix), we use the <regex.h> library, | ||
// which uses the POSIX extended regex syntax. | ||
// | ||
// On other platforms (e.g. Windows or Mac), we only support a simple regex | ||
// syntax implemented as part of Google Test. This limited | ||
// implementation should be enough most of the time when writing | ||
// death tests; though it lacks many features you can find in PCRE | ||
// or POSIX extended regex syntax. For example, we don't support | ||
// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and | ||
// repetition count ("x{5,7}"), among others. | ||
// | ||
// Below is the syntax that we do support. We chose it to be a | ||
// subset of both PCRE and POSIX extended regex, so it's easy to | ||
// learn wherever you come from. In the following: 'A' denotes a | ||
// literal character, period (.), or a single \\ escape sequence; | ||
// 'x' and 'y' denote regular expressions; 'm' and 'n' are for | ||
// natural numbers. | ||
// | ||
// c matches any literal character c | ||
// \\d matches any decimal digit | ||
// \\D matches any character that's not a decimal digit | ||
// \\f matches \f | ||
// \\n matches \n | ||
// \\r matches \r | ||
// \\s matches any ASCII whitespace, including \n | ||
// \\S matches any character that's not a whitespace | ||
// \\t matches \t | ||
// \\v matches \v | ||
// \\w matches any letter, _, or decimal digit | ||
// \\W matches any character that \\w doesn't match | ||
// \\c matches any literal character c, which must be a punctuation | ||
// . matches any single character except \n | ||
// A? matches 0 or 1 occurrences of A | ||
// A* matches 0 or many occurrences of A | ||
// A+ matches 1 or many occurrences of A | ||
// ^ matches the beginning of a string (not that of each line) | ||
// $ matches the end of a string (not that of each line) | ||
// xy matches x followed by y | ||
// | ||
// If you accidentally use PCRE or POSIX extended regex features | ||
// not implemented by us, you will get a run-time failure. In that | ||
// case, please try to rewrite your regular expression within the | ||
// above syntax. | ||
// | ||
// This implementation is *not* meant to be as highly tuned or robust | ||
// as a compiled regex library, but should perform well enough for a | ||
// death test, which already incurs significant overhead by launching | ||
// a child process. | ||
// | ||
// Known caveats: | ||
// | ||
// A "threadsafe" style death test obtains the path to the test | ||
// program from argv[0] and re-executes it in the sub-process. For | ||
// simplicity, the current implementation doesn't search the PATH | ||
// when launching the sub-process. This means that the user must | ||
// invoke the test program via a path that contains at least one | ||
// path separator (e.g. path/to/foo_test and | ||
// /absolute/path/to/bar_test are fine, but foo_test is not). This | ||
// is rarely a problem as people usually don't put the test binary | ||
// directory in PATH. | ||
// | ||
|
||
// Asserts that a given `statement` causes the program to exit, with an | ||
// integer exit status that satisfies `predicate`, and emitting error output | ||
// that matches `matcher`. | ||
# define ASSERT_EXIT(statement, predicate, matcher) \ | ||
GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_FATAL_FAILURE_) | ||
|
||
// Like `ASSERT_EXIT`, but continues on to successive tests in the | ||
// test suite, if any: | ||
# define EXPECT_EXIT(statement, predicate, matcher) \ | ||
GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_NONFATAL_FAILURE_) | ||
|
||
// Asserts that a given `statement` causes the program to exit, either by | ||
// explicitly exiting with a nonzero exit code or being killed by a | ||
// signal, and emitting error output that matches `matcher`. | ||
# define ASSERT_DEATH(statement, matcher) \ | ||
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher) | ||
|
||
// Like `ASSERT_DEATH`, but continues on to successive tests in the | ||
// test suite, if any: | ||
# define EXPECT_DEATH(statement, matcher) \ | ||
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher) | ||
|
||
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: | ||
|
||
// Tests that an exit code describes a normal exit with a given exit code. | ||
class GTEST_API_ ExitedWithCode { | ||
public: | ||
explicit ExitedWithCode(int exit_code); | ||
ExitedWithCode(const ExitedWithCode&) = default; | ||
void operator=(const ExitedWithCode& other) = delete; | ||
bool operator()(int exit_status) const; | ||
private: | ||
const int exit_code_; | ||
}; | ||
|
||
# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA | ||
// Tests that an exit code describes an exit due to termination by a | ||
// given signal. | ||
// GOOGLETEST_CM0006 DO NOT DELETE | ||
class GTEST_API_ KilledBySignal { | ||
public: | ||
explicit KilledBySignal(int signum); | ||
bool operator()(int exit_status) const; | ||
private: | ||
const int signum_; | ||
}; | ||
# endif // !GTEST_OS_WINDOWS | ||
|
||
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. | ||
// The death testing framework causes this to have interesting semantics, | ||
// since the sideeffects of the call are only visible in opt mode, and not | ||
// in debug mode. | ||
// | ||
// In practice, this can be used to test functions that utilize the | ||
// LOG(DFATAL) macro using the following style: | ||
// | ||
// int DieInDebugOr12(int* sideeffect) { | ||
// if (sideeffect) { | ||
// *sideeffect = 12; | ||
// } | ||
// LOG(DFATAL) << "death"; | ||
// return 12; | ||
// } | ||
// | ||
// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) { | ||
// int sideeffect = 0; | ||
// // Only asserts in dbg. | ||
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); | ||
// | ||
// #ifdef NDEBUG | ||
// // opt-mode has sideeffect visible. | ||
// EXPECT_EQ(12, sideeffect); | ||
// #else | ||
// // dbg-mode no visible sideeffect. | ||
// EXPECT_EQ(0, sideeffect); | ||
// #endif | ||
// } | ||
// | ||
// This will assert that DieInDebugReturn12InOpt() crashes in debug | ||
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the | ||
// appropriate fallback value (12 in this case) in opt mode. If you | ||
// need to test that a function has appropriate side-effects in opt | ||
// mode, include assertions against the side-effects. A general | ||
// pattern for this is: | ||
// | ||
// EXPECT_DEBUG_DEATH({ | ||
// // Side-effects here will have an effect after this statement in | ||
// // opt mode, but none in debug mode. | ||
// EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); | ||
// }, "death"); | ||
// | ||
# ifdef NDEBUG | ||
|
||
# define EXPECT_DEBUG_DEATH(statement, regex) \ | ||
GTEST_EXECUTE_STATEMENT_(statement, regex) | ||
|
||
# define ASSERT_DEBUG_DEATH(statement, regex) \ | ||
GTEST_EXECUTE_STATEMENT_(statement, regex) | ||
|
||
# else | ||
|
||
# define EXPECT_DEBUG_DEATH(statement, regex) \ | ||
EXPECT_DEATH(statement, regex) | ||
|
||
# define ASSERT_DEBUG_DEATH(statement, regex) \ | ||
ASSERT_DEATH(statement, regex) | ||
|
||
# endif // NDEBUG for EXPECT_DEBUG_DEATH | ||
#endif // GTEST_HAS_DEATH_TEST | ||
|
||
// This macro is used for implementing macros such as | ||
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where | ||
// death tests are not supported. Those macros must compile on such systems | ||
// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters | ||
// on systems that support death tests. This allows one to write such a macro on | ||
// a system that does not support death tests and be sure that it will compile | ||
// on a death-test supporting system. It is exposed publicly so that systems | ||
// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST | ||
// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and | ||
// ASSERT_DEATH_IF_SUPPORTED. | ||
// | ||
// Parameters: | ||
// statement - A statement that a macro such as EXPECT_DEATH would test | ||
// for program termination. This macro has to make sure this | ||
// statement is compiled but not executed, to ensure that | ||
// EXPECT_DEATH_IF_SUPPORTED compiles with a certain | ||
// parameter if and only if EXPECT_DEATH compiles with it. | ||
// regex - A regex that a macro such as EXPECT_DEATH would use to test | ||
// the output of statement. This parameter has to be | ||
// compiled but not evaluated by this macro, to ensure that | ||
// this macro only accepts expressions that a macro such as | ||
// EXPECT_DEATH would accept. | ||
// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED | ||
// and a return statement for ASSERT_DEATH_IF_SUPPORTED. | ||
// This ensures that ASSERT_DEATH_IF_SUPPORTED will not | ||
// compile inside functions where ASSERT_DEATH doesn't | ||
// compile. | ||
// | ||
// The branch that has an always false condition is used to ensure that | ||
// statement and regex are compiled (and thus syntactically correct) but | ||
// never executed. The unreachable code macro protects the terminator | ||
// statement from generating an 'unreachable code' warning in case | ||
// statement unconditionally returns or throws. The Message constructor at | ||
// the end allows the syntax of streaming additional messages into the | ||
// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. | ||
# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ | ||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||
if (::testing::internal::AlwaysTrue()) { \ | ||
GTEST_LOG_(WARNING) \ | ||
<< "Death tests are not supported on this platform.\n" \ | ||
<< "Statement '" #statement "' cannot be verified."; \ | ||
} else if (::testing::internal::AlwaysFalse()) { \ | ||
::testing::internal::RE::PartialMatch(".*", (regex)); \ | ||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||
terminator; \ | ||
} else \ | ||
::testing::Message() | ||
|
||
// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and | ||
// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if | ||
// death tests are supported; otherwise they just issue a warning. This is | ||
// useful when you are combining death test assertions with normal test | ||
// assertions in one test. | ||
#if GTEST_HAS_DEATH_TEST | ||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ | ||
EXPECT_DEATH(statement, regex) | ||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ | ||
ASSERT_DEATH(statement, regex) | ||
#else | ||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ | ||
GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) | ||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ | ||
GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) | ||
#endif | ||
|
||
} // namespace testing | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
// Copyright 2005, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
||
// | ||
// The Google C++ Testing and Mocking Framework (Google Test) | ||
// | ||
// This header file defines the Message class. | ||
// | ||
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to | ||
// leave some internal implementation details in this header file. | ||
// They are clearly marked by comments like this: | ||
// | ||
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. | ||
// | ||
// Such code is NOT meant to be used by a user directly, and is subject | ||
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user | ||
// program! | ||
|
||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ | ||
|
||
#include <limits> | ||
#include <memory> | ||
#include <sstream> | ||
|
||
#include "gtest/internal/gtest-port.h" | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ | ||
/* class A needs to have dll-interface to be used by clients of class B */) | ||
|
||
// Ensures that there is at least one operator<< in the global namespace. | ||
// See Message& operator<<(...) below for why. | ||
void operator<<(const testing::internal::Secret&, int); | ||
|
||
namespace testing { | ||
|
||
// The Message class works like an ostream repeater. | ||
// | ||
// Typical usage: | ||
// | ||
// 1. You stream a bunch of values to a Message object. | ||
// It will remember the text in a stringstream. | ||
// 2. Then you stream the Message object to an ostream. | ||
// This causes the text in the Message to be streamed | ||
// to the ostream. | ||
// | ||
// For example; | ||
// | ||
// testing::Message foo; | ||
// foo << 1 << " != " << 2; | ||
// std::cout << foo; | ||
// | ||
// will print "1 != 2". | ||
// | ||
// Message is not intended to be inherited from. In particular, its | ||
// destructor is not virtual. | ||
// | ||
// Note that stringstream behaves differently in gcc and in MSVC. You | ||
// can stream a NULL char pointer to it in the former, but not in the | ||
// latter (it causes an access violation if you do). The Message | ||
// class hides this difference by treating a NULL char pointer as | ||
// "(null)". | ||
class GTEST_API_ Message { | ||
private: | ||
// The type of basic IO manipulators (endl, ends, and flush) for | ||
// narrow streams. | ||
typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); | ||
|
||
public: | ||
// Constructs an empty Message. | ||
Message(); | ||
|
||
// Copy constructor. | ||
Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT | ||
*ss_ << msg.GetString(); | ||
} | ||
|
||
// Constructs a Message from a C-string. | ||
explicit Message(const char* str) : ss_(new ::std::stringstream) { | ||
*ss_ << str; | ||
} | ||
|
||
// Streams a non-pointer value to this object. | ||
template <typename T> | ||
inline Message& operator <<(const T& val) { | ||
// Some libraries overload << for STL containers. These | ||
// overloads are defined in the global namespace instead of ::std. | ||
// | ||
// C++'s symbol lookup rule (i.e. Koenig lookup) says that these | ||
// overloads are visible in either the std namespace or the global | ||
// namespace, but not other namespaces, including the testing | ||
// namespace which Google Test's Message class is in. | ||
// | ||
// To allow STL containers (and other types that has a << operator | ||
// defined in the global namespace) to be used in Google Test | ||
// assertions, testing::Message must access the custom << operator | ||
// from the global namespace. With this using declaration, | ||
// overloads of << defined in the global namespace and those | ||
// visible via Koenig lookup are both exposed in this function. | ||
using ::operator <<; | ||
*ss_ << val; | ||
return *this; | ||
} | ||
|
||
// Streams a pointer value to this object. | ||
// | ||
// This function is an overload of the previous one. When you | ||
// stream a pointer to a Message, this definition will be used as it | ||
// is more specialized. (The C++ Standard, section | ||
// [temp.func.order].) If you stream a non-pointer, then the | ||
// previous definition will be used. | ||
// | ||
// The reason for this overload is that streaming a NULL pointer to | ||
// ostream is undefined behavior. Depending on the compiler, you | ||
// may get "0", "(nil)", "(null)", or an access violation. To | ||
// ensure consistent result across compilers, we always treat NULL | ||
// as "(null)". | ||
template <typename T> | ||
inline Message& operator <<(T* const& pointer) { // NOLINT | ||
if (pointer == nullptr) { | ||
*ss_ << "(null)"; | ||
} else { | ||
*ss_ << pointer; | ||
} | ||
return *this; | ||
} | ||
|
||
// Since the basic IO manipulators are overloaded for both narrow | ||
// and wide streams, we have to provide this specialized definition | ||
// of operator <<, even though its body is the same as the | ||
// templatized version above. Without this definition, streaming | ||
// endl or other basic IO manipulators to Message will confuse the | ||
// compiler. | ||
Message& operator <<(BasicNarrowIoManip val) { | ||
*ss_ << val; | ||
return *this; | ||
} | ||
|
||
// Instead of 1/0, we want to see true/false for bool values. | ||
Message& operator <<(bool b) { | ||
return *this << (b ? "true" : "false"); | ||
} | ||
|
||
// These two overloads allow streaming a wide C string to a Message | ||
// using the UTF-8 encoding. | ||
Message& operator <<(const wchar_t* wide_c_str); | ||
Message& operator <<(wchar_t* wide_c_str); | ||
|
||
#if GTEST_HAS_STD_WSTRING | ||
// Converts the given wide string to a narrow string using the UTF-8 | ||
// encoding, and streams the result to this Message object. | ||
Message& operator <<(const ::std::wstring& wstr); | ||
#endif // GTEST_HAS_STD_WSTRING | ||
|
||
// Gets the text streamed to this object so far as an std::string. | ||
// Each '\0' character in the buffer is replaced with "\\0". | ||
// | ||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. | ||
std::string GetString() const; | ||
|
||
private: | ||
// We'll hold the text streamed to this object here. | ||
const std::unique_ptr< ::std::stringstream> ss_; | ||
|
||
// We declare (but don't implement) this to prevent the compiler | ||
// from implementing the assignment operator. | ||
void operator=(const Message&); | ||
}; | ||
|
||
// Streams a Message to an ostream. | ||
inline std::ostream& operator <<(std::ostream& os, const Message& sb) { | ||
return os << sb.GetString(); | ||
} | ||
|
||
namespace internal { | ||
|
||
// Converts a streamable value to an std::string. A NULL pointer is | ||
// converted to "(null)". When the input value is a ::string, | ||
// ::std::string, ::wstring, or ::std::wstring object, each NUL | ||
// character in it is replaced with "\\0". | ||
template <typename T> | ||
std::string StreamableToString(const T& streamable) { | ||
return (Message() << streamable).GetString(); | ||
} | ||
|
||
} // namespace internal | ||
} // namespace testing | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ |
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,238 @@ | ||
// Copyright 2007, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
||
// | ||
// Utilities for testing Google Test itself and code that uses Google Test | ||
// (e.g. frameworks built on top of Google Test). | ||
|
||
// GOOGLETEST_CM0004 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ | ||
|
||
#include "gtest/gtest.h" | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ | ||
/* class A needs to have dll-interface to be used by clients of class B */) | ||
|
||
namespace testing { | ||
|
||
// This helper class can be used to mock out Google Test failure reporting | ||
// so that we can test Google Test or code that builds on Google Test. | ||
// | ||
// An object of this class appends a TestPartResult object to the | ||
// TestPartResultArray object given in the constructor whenever a Google Test | ||
// failure is reported. It can either intercept only failures that are | ||
// generated in the same thread that created this object or it can intercept | ||
// all generated failures. The scope of this mock object can be controlled with | ||
// the second argument to the two arguments constructor. | ||
class GTEST_API_ ScopedFakeTestPartResultReporter | ||
: public TestPartResultReporterInterface { | ||
public: | ||
// The two possible mocking modes of this object. | ||
enum InterceptMode { | ||
INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. | ||
INTERCEPT_ALL_THREADS // Intercepts all failures. | ||
}; | ||
|
||
// The c'tor sets this object as the test part result reporter used | ||
// by Google Test. The 'result' parameter specifies where to report the | ||
// results. This reporter will only catch failures generated in the current | ||
// thread. DEPRECATED | ||
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); | ||
|
||
// Same as above, but you can choose the interception scope of this object. | ||
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, | ||
TestPartResultArray* result); | ||
|
||
// The d'tor restores the previous test part result reporter. | ||
~ScopedFakeTestPartResultReporter() override; | ||
|
||
// Appends the TestPartResult object to the TestPartResultArray | ||
// received in the constructor. | ||
// | ||
// This method is from the TestPartResultReporterInterface | ||
// interface. | ||
void ReportTestPartResult(const TestPartResult& result) override; | ||
|
||
private: | ||
void Init(); | ||
|
||
const InterceptMode intercept_mode_; | ||
TestPartResultReporterInterface* old_reporter_; | ||
TestPartResultArray* const result_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); | ||
}; | ||
|
||
namespace internal { | ||
|
||
// A helper class for implementing EXPECT_FATAL_FAILURE() and | ||
// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given | ||
// TestPartResultArray contains exactly one failure that has the given | ||
// type and contains the given substring. If that's not the case, a | ||
// non-fatal failure will be generated. | ||
class GTEST_API_ SingleFailureChecker { | ||
public: | ||
// The constructor remembers the arguments. | ||
SingleFailureChecker(const TestPartResultArray* results, | ||
TestPartResult::Type type, const std::string& substr); | ||
~SingleFailureChecker(); | ||
private: | ||
const TestPartResultArray* const results_; | ||
const TestPartResult::Type type_; | ||
const std::string substr_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); | ||
}; | ||
|
||
} // namespace internal | ||
|
||
} // namespace testing | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 | ||
|
||
// A set of macros for testing Google Test assertions or code that's expected | ||
// to generate Google Test fatal failures. It verifies that the given | ||
// statement will cause exactly one fatal Google Test failure with 'substr' | ||
// being part of the failure message. | ||
// | ||
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only | ||
// affects and considers failures generated in the current thread and | ||
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. | ||
// | ||
// The verification of the assertion is done correctly even when the statement | ||
// throws an exception or aborts the current function. | ||
// | ||
// Known restrictions: | ||
// - 'statement' cannot reference local non-static variables or | ||
// non-static members of the current object. | ||
// - 'statement' cannot return a value. | ||
// - You cannot stream a failure message to this macro. | ||
// | ||
// Note that even though the implementations of the following two | ||
// macros are much alike, we cannot refactor them to use a common | ||
// helper macro, due to some peculiarity in how the preprocessor | ||
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in | ||
// gtest_unittest.cc will fail to compile if we do that. | ||
#define EXPECT_FATAL_FAILURE(statement, substr) \ | ||
do { \ | ||
class GTestExpectFatalFailureHelper {\ | ||
public:\ | ||
static void Execute() { statement; }\ | ||
};\ | ||
::testing::TestPartResultArray gtest_failures;\ | ||
::testing::internal::SingleFailureChecker gtest_checker(\ | ||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ | ||
{\ | ||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||
::testing::ScopedFakeTestPartResultReporter:: \ | ||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ | ||
GTestExpectFatalFailureHelper::Execute();\ | ||
}\ | ||
} while (::testing::internal::AlwaysFalse()) | ||
|
||
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ | ||
do { \ | ||
class GTestExpectFatalFailureHelper {\ | ||
public:\ | ||
static void Execute() { statement; }\ | ||
};\ | ||
::testing::TestPartResultArray gtest_failures;\ | ||
::testing::internal::SingleFailureChecker gtest_checker(\ | ||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ | ||
{\ | ||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||
::testing::ScopedFakeTestPartResultReporter:: \ | ||
INTERCEPT_ALL_THREADS, >est_failures);\ | ||
GTestExpectFatalFailureHelper::Execute();\ | ||
}\ | ||
} while (::testing::internal::AlwaysFalse()) | ||
|
||
// A macro for testing Google Test assertions or code that's expected to | ||
// generate Google Test non-fatal failures. It asserts that the given | ||
// statement will cause exactly one non-fatal Google Test failure with 'substr' | ||
// being part of the failure message. | ||
// | ||
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only | ||
// affects and considers failures generated in the current thread and | ||
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. | ||
// | ||
// 'statement' is allowed to reference local variables and members of | ||
// the current object. | ||
// | ||
// The verification of the assertion is done correctly even when the statement | ||
// throws an exception or aborts the current function. | ||
// | ||
// Known restrictions: | ||
// - You cannot stream a failure message to this macro. | ||
// | ||
// Note that even though the implementations of the following two | ||
// macros are much alike, we cannot refactor them to use a common | ||
// helper macro, due to some peculiarity in how the preprocessor | ||
// works. If we do that, the code won't compile when the user gives | ||
// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that | ||
// expands to code containing an unprotected comma. The | ||
// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc | ||
// catches that. | ||
// | ||
// For the same reason, we have to write | ||
// if (::testing::internal::AlwaysTrue()) { statement; } | ||
// instead of | ||
// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) | ||
// to avoid an MSVC warning on unreachable code. | ||
#define EXPECT_NONFATAL_FAILURE(statement, substr) \ | ||
do {\ | ||
::testing::TestPartResultArray gtest_failures;\ | ||
::testing::internal::SingleFailureChecker gtest_checker(\ | ||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \ | ||
(substr));\ | ||
{\ | ||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||
::testing::ScopedFakeTestPartResultReporter:: \ | ||
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ | ||
if (::testing::internal::AlwaysTrue()) { statement; }\ | ||
}\ | ||
} while (::testing::internal::AlwaysFalse()) | ||
|
||
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ | ||
do {\ | ||
::testing::TestPartResultArray gtest_failures;\ | ||
::testing::internal::SingleFailureChecker gtest_checker(\ | ||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \ | ||
(substr));\ | ||
{\ | ||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ | ||
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ | ||
>est_failures);\ | ||
if (::testing::internal::AlwaysTrue()) { statement; }\ | ||
}\ | ||
} while (::testing::internal::AlwaysFalse()) | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_SPI_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
// Copyright 2008, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ | ||
|
||
#include <iosfwd> | ||
#include <vector> | ||
#include "gtest/internal/gtest-internal.h" | ||
#include "gtest/internal/gtest-string.h" | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ | ||
/* class A needs to have dll-interface to be used by clients of class B */) | ||
|
||
namespace testing { | ||
|
||
// A copyable object representing the result of a test part (i.e. an | ||
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). | ||
// | ||
// Don't inherit from TestPartResult as its destructor is not virtual. | ||
class GTEST_API_ TestPartResult { | ||
public: | ||
// The possible outcomes of a test part (i.e. an assertion or an | ||
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()). | ||
enum Type { | ||
kSuccess, // Succeeded. | ||
kNonFatalFailure, // Failed but the test can continue. | ||
kFatalFailure, // Failed and the test should be terminated. | ||
kSkip // Skipped. | ||
}; | ||
|
||
// C'tor. TestPartResult does NOT have a default constructor. | ||
// Always use this constructor (with parameters) to create a | ||
// TestPartResult object. | ||
TestPartResult(Type a_type, const char* a_file_name, int a_line_number, | ||
const char* a_message) | ||
: type_(a_type), | ||
file_name_(a_file_name == nullptr ? "" : a_file_name), | ||
line_number_(a_line_number), | ||
summary_(ExtractSummary(a_message)), | ||
message_(a_message) {} | ||
|
||
// Gets the outcome of the test part. | ||
Type type() const { return type_; } | ||
|
||
// Gets the name of the source file where the test part took place, or | ||
// NULL if it's unknown. | ||
const char* file_name() const { | ||
return file_name_.empty() ? nullptr : file_name_.c_str(); | ||
} | ||
|
||
// Gets the line in the source file where the test part took place, | ||
// or -1 if it's unknown. | ||
int line_number() const { return line_number_; } | ||
|
||
// Gets the summary of the failure message. | ||
const char* summary() const { return summary_.c_str(); } | ||
|
||
// Gets the message associated with the test part. | ||
const char* message() const { return message_.c_str(); } | ||
|
||
// Returns true if and only if the test part was skipped. | ||
bool skipped() const { return type_ == kSkip; } | ||
|
||
// Returns true if and only if the test part passed. | ||
bool passed() const { return type_ == kSuccess; } | ||
|
||
// Returns true if and only if the test part non-fatally failed. | ||
bool nonfatally_failed() const { return type_ == kNonFatalFailure; } | ||
|
||
// Returns true if and only if the test part fatally failed. | ||
bool fatally_failed() const { return type_ == kFatalFailure; } | ||
|
||
// Returns true if and only if the test part failed. | ||
bool failed() const { return fatally_failed() || nonfatally_failed(); } | ||
|
||
private: | ||
Type type_; | ||
|
||
// Gets the summary of the failure message by omitting the stack | ||
// trace in it. | ||
static std::string ExtractSummary(const char* message); | ||
|
||
// The name of the source file where the test part took place, or | ||
// "" if the source file is unknown. | ||
std::string file_name_; | ||
// The line in the source file where the test part took place, or -1 | ||
// if the line number is unknown. | ||
int line_number_; | ||
std::string summary_; // The test failure summary. | ||
std::string message_; // The test failure message. | ||
}; | ||
|
||
// Prints a TestPartResult object. | ||
std::ostream& operator<<(std::ostream& os, const TestPartResult& result); | ||
|
||
// An array of TestPartResult objects. | ||
// | ||
// Don't inherit from TestPartResultArray as its destructor is not | ||
// virtual. | ||
class GTEST_API_ TestPartResultArray { | ||
public: | ||
TestPartResultArray() {} | ||
|
||
// Appends the given TestPartResult to the array. | ||
void Append(const TestPartResult& result); | ||
|
||
// Returns the TestPartResult at the given index (0-based). | ||
const TestPartResult& GetTestPartResult(int index) const; | ||
|
||
// Returns the number of TestPartResult objects in the array. | ||
int size() const; | ||
|
||
private: | ||
std::vector<TestPartResult> array_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); | ||
}; | ||
|
||
// This interface knows how to report a test part result. | ||
class GTEST_API_ TestPartResultReporterInterface { | ||
public: | ||
virtual ~TestPartResultReporterInterface() {} | ||
|
||
virtual void ReportTestPartResult(const TestPartResult& result) = 0; | ||
}; | ||
|
||
namespace internal { | ||
|
||
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a | ||
// statement generates new fatal failures. To do so it registers itself as the | ||
// current test part result reporter. Besides checking if fatal failures were | ||
// reported, it only delegates the reporting to the former result reporter. | ||
// The original result reporter is restored in the destructor. | ||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. | ||
class GTEST_API_ HasNewFatalFailureHelper | ||
: public TestPartResultReporterInterface { | ||
public: | ||
HasNewFatalFailureHelper(); | ||
~HasNewFatalFailureHelper() override; | ||
void ReportTestPartResult(const TestPartResult& result) override; | ||
bool has_new_fatal_failure() const { return has_new_fatal_failure_; } | ||
private: | ||
bool has_new_fatal_failure_; | ||
TestPartResultReporterInterface* original_reporter_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); | ||
}; | ||
|
||
} // namespace internal | ||
|
||
} // namespace testing | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ |
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,359 @@ | ||
// Copyright 2006, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
||
// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command | ||
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! | ||
// | ||
// Implements a family of generic predicate assertion macros. | ||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ | ||
|
||
#include "gtest/gtest.h" | ||
|
||
namespace testing { | ||
|
||
// This header implements a family of generic predicate assertion | ||
// macros: | ||
// | ||
// ASSERT_PRED_FORMAT1(pred_format, v1) | ||
// ASSERT_PRED_FORMAT2(pred_format, v1, v2) | ||
// ... | ||
// | ||
// where pred_format is a function or functor that takes n (in the | ||
// case of ASSERT_PRED_FORMATn) values and their source expression | ||
// text, and returns a testing::AssertionResult. See the definition | ||
// of ASSERT_EQ in gtest.h for an example. | ||
// | ||
// If you don't care about formatting, you can use the more | ||
// restrictive version: | ||
// | ||
// ASSERT_PRED1(pred, v1) | ||
// ASSERT_PRED2(pred, v1, v2) | ||
// ... | ||
// | ||
// where pred is an n-ary function or functor that returns bool, | ||
// and the values v1, v2, ..., must support the << operator for | ||
// streaming to std::ostream. | ||
// | ||
// We also define the EXPECT_* variations. | ||
// | ||
// For now we only support predicates whose arity is at most 5. | ||
// Please email googletestframework@googlegroups.com if you need | ||
// support for higher arities. | ||
|
||
// GTEST_ASSERT_ is the basic statement to which all of the assertions | ||
// in this file reduce. Don't use this in your code. | ||
|
||
#define GTEST_ASSERT_(expression, on_failure) \ | ||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||
if (const ::testing::AssertionResult gtest_ar = (expression)) \ | ||
; \ | ||
else \ | ||
on_failure(gtest_ar.failure_message()) | ||
|
||
|
||
// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use | ||
// this in your code. | ||
template <typename Pred, | ||
typename T1> | ||
AssertionResult AssertPred1Helper(const char* pred_text, | ||
const char* e1, | ||
Pred pred, | ||
const T1& v1) { | ||
if (pred(v1)) return AssertionSuccess(); | ||
|
||
return AssertionFailure() | ||
<< pred_text << "(" << e1 << ") evaluates to false, where" | ||
<< "\n" | ||
<< e1 << " evaluates to " << ::testing::PrintToString(v1); | ||
} | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. | ||
// Don't use this in your code. | ||
#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ | ||
GTEST_ASSERT_(pred_format(#v1, v1), \ | ||
on_failure) | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use | ||
// this in your code. | ||
#define GTEST_PRED1_(pred, v1, on_failure)\ | ||
GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ | ||
#v1, \ | ||
pred, \ | ||
v1), on_failure) | ||
|
||
// Unary predicate assertion macros. | ||
#define EXPECT_PRED_FORMAT1(pred_format, v1) \ | ||
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) | ||
#define EXPECT_PRED1(pred, v1) \ | ||
GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) | ||
#define ASSERT_PRED_FORMAT1(pred_format, v1) \ | ||
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) | ||
#define ASSERT_PRED1(pred, v1) \ | ||
GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) | ||
|
||
|
||
|
||
// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use | ||
// this in your code. | ||
template <typename Pred, | ||
typename T1, | ||
typename T2> | ||
AssertionResult AssertPred2Helper(const char* pred_text, | ||
const char* e1, | ||
const char* e2, | ||
Pred pred, | ||
const T1& v1, | ||
const T2& v2) { | ||
if (pred(v1, v2)) return AssertionSuccess(); | ||
|
||
return AssertionFailure() | ||
<< pred_text << "(" << e1 << ", " << e2 | ||
<< ") evaluates to false, where" | ||
<< "\n" | ||
<< e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" | ||
<< e2 << " evaluates to " << ::testing::PrintToString(v2); | ||
} | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. | ||
// Don't use this in your code. | ||
#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ | ||
GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ | ||
on_failure) | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use | ||
// this in your code. | ||
#define GTEST_PRED2_(pred, v1, v2, on_failure)\ | ||
GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ | ||
#v1, \ | ||
#v2, \ | ||
pred, \ | ||
v1, \ | ||
v2), on_failure) | ||
|
||
// Binary predicate assertion macros. | ||
#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ | ||
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) | ||
#define EXPECT_PRED2(pred, v1, v2) \ | ||
GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) | ||
#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ | ||
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) | ||
#define ASSERT_PRED2(pred, v1, v2) \ | ||
GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) | ||
|
||
|
||
|
||
// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use | ||
// this in your code. | ||
template <typename Pred, | ||
typename T1, | ||
typename T2, | ||
typename T3> | ||
AssertionResult AssertPred3Helper(const char* pred_text, | ||
const char* e1, | ||
const char* e2, | ||
const char* e3, | ||
Pred pred, | ||
const T1& v1, | ||
const T2& v2, | ||
const T3& v3) { | ||
if (pred(v1, v2, v3)) return AssertionSuccess(); | ||
|
||
return AssertionFailure() | ||
<< pred_text << "(" << e1 << ", " << e2 << ", " << e3 | ||
<< ") evaluates to false, where" | ||
<< "\n" | ||
<< e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" | ||
<< e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" | ||
<< e3 << " evaluates to " << ::testing::PrintToString(v3); | ||
} | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. | ||
// Don't use this in your code. | ||
#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ | ||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ | ||
on_failure) | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use | ||
// this in your code. | ||
#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ | ||
GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ | ||
#v1, \ | ||
#v2, \ | ||
#v3, \ | ||
pred, \ | ||
v1, \ | ||
v2, \ | ||
v3), on_failure) | ||
|
||
// Ternary predicate assertion macros. | ||
#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ | ||
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) | ||
#define EXPECT_PRED3(pred, v1, v2, v3) \ | ||
GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) | ||
#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ | ||
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) | ||
#define ASSERT_PRED3(pred, v1, v2, v3) \ | ||
GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) | ||
|
||
|
||
|
||
// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use | ||
// this in your code. | ||
template <typename Pred, | ||
typename T1, | ||
typename T2, | ||
typename T3, | ||
typename T4> | ||
AssertionResult AssertPred4Helper(const char* pred_text, | ||
const char* e1, | ||
const char* e2, | ||
const char* e3, | ||
const char* e4, | ||
Pred pred, | ||
const T1& v1, | ||
const T2& v2, | ||
const T3& v3, | ||
const T4& v4) { | ||
if (pred(v1, v2, v3, v4)) return AssertionSuccess(); | ||
|
||
return AssertionFailure() | ||
<< pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 | ||
<< ") evaluates to false, where" | ||
<< "\n" | ||
<< e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" | ||
<< e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" | ||
<< e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" | ||
<< e4 << " evaluates to " << ::testing::PrintToString(v4); | ||
} | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. | ||
// Don't use this in your code. | ||
#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ | ||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ | ||
on_failure) | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use | ||
// this in your code. | ||
#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ | ||
GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ | ||
#v1, \ | ||
#v2, \ | ||
#v3, \ | ||
#v4, \ | ||
pred, \ | ||
v1, \ | ||
v2, \ | ||
v3, \ | ||
v4), on_failure) | ||
|
||
// 4-ary predicate assertion macros. | ||
#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ | ||
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) | ||
#define EXPECT_PRED4(pred, v1, v2, v3, v4) \ | ||
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) | ||
#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ | ||
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) | ||
#define ASSERT_PRED4(pred, v1, v2, v3, v4) \ | ||
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) | ||
|
||
|
||
|
||
// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use | ||
// this in your code. | ||
template <typename Pred, | ||
typename T1, | ||
typename T2, | ||
typename T3, | ||
typename T4, | ||
typename T5> | ||
AssertionResult AssertPred5Helper(const char* pred_text, | ||
const char* e1, | ||
const char* e2, | ||
const char* e3, | ||
const char* e4, | ||
const char* e5, | ||
Pred pred, | ||
const T1& v1, | ||
const T2& v2, | ||
const T3& v3, | ||
const T4& v4, | ||
const T5& v5) { | ||
if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); | ||
|
||
return AssertionFailure() | ||
<< pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 | ||
<< ", " << e5 << ") evaluates to false, where" | ||
<< "\n" | ||
<< e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" | ||
<< e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" | ||
<< e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" | ||
<< e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n" | ||
<< e5 << " evaluates to " << ::testing::PrintToString(v5); | ||
} | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. | ||
// Don't use this in your code. | ||
#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ | ||
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ | ||
on_failure) | ||
|
||
// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use | ||
// this in your code. | ||
#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ | ||
GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ | ||
#v1, \ | ||
#v2, \ | ||
#v3, \ | ||
#v4, \ | ||
#v5, \ | ||
pred, \ | ||
v1, \ | ||
v2, \ | ||
v3, \ | ||
v4, \ | ||
v5), on_failure) | ||
|
||
// 5-ary predicate assertion macros. | ||
#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ | ||
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) | ||
#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ | ||
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) | ||
#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ | ||
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) | ||
#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ | ||
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) | ||
|
||
|
||
|
||
} // namespace testing | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
# Customization Points | ||
|
||
The custom directory is an injection point for custom user configurations. | ||
|
||
## Header `gtest.h` | ||
|
||
### The following macros can be defined: | ||
|
||
* `GTEST_OS_STACK_TRACE_GETTER_` - The name of an implementation of | ||
`OsStackTraceGetterInterface`. | ||
* `GTEST_CUSTOM_TEMPDIR_FUNCTION_` - An override for `testing::TempDir()`. See | ||
`testing::TempDir` for semantics and signature. | ||
|
||
## Header `gtest-port.h` | ||
|
||
The following macros can be defined: | ||
|
||
### Flag related macros: | ||
|
||
* `GTEST_FLAG(flag_name)` | ||
* `GTEST_USE_OWN_FLAGFILE_FLAG_` - Define to 0 when the system provides its | ||
own flagfile flag parsing. | ||
* `GTEST_DECLARE_bool_(name)` | ||
* `GTEST_DECLARE_int32_(name)` | ||
* `GTEST_DECLARE_string_(name)` | ||
* `GTEST_DEFINE_bool_(name, default_val, doc)` | ||
* `GTEST_DEFINE_int32_(name, default_val, doc)` | ||
* `GTEST_DEFINE_string_(name, default_val, doc)` | ||
* `GTEST_FLAG_GET(flag_name)` | ||
* `GTEST_FLAG_SET(flag_name, value)` | ||
|
||
### Logging: | ||
|
||
* `GTEST_LOG_(severity)` | ||
* `GTEST_CHECK_(condition)` | ||
* Functions `LogToStderr()` and `FlushInfoLog()` have to be provided too. | ||
|
||
### Threading: | ||
|
||
* `GTEST_HAS_NOTIFICATION_` - Enabled if Notification is already provided. | ||
* `GTEST_HAS_MUTEX_AND_THREAD_LOCAL_` - Enabled if `Mutex` and `ThreadLocal` | ||
are already provided. Must also provide `GTEST_DECLARE_STATIC_MUTEX_(mutex)` | ||
and `GTEST_DEFINE_STATIC_MUTEX_(mutex)` | ||
* `GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)` | ||
* `GTEST_LOCK_EXCLUDED_(locks)` | ||
|
||
### Underlying library support features | ||
|
||
* `GTEST_HAS_CXXABI_H_` | ||
|
||
### Exporting API symbols: | ||
|
||
* `GTEST_API_` - Specifier for exported symbols. | ||
|
||
## Header `gtest-printers.h` | ||
|
||
* See documentation at `gtest/gtest-printers.h` for details on how to define a | ||
custom printer. |
37 changes: 37 additions & 0 deletions
37
deps/googletest/include/gtest/internal/custom/gtest-port.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// Copyright 2015, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// Injection point for custom user configurations. See README for details | ||
// | ||
// ** Custom implementation starts here ** | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ |
42 changes: 42 additions & 0 deletions
42
deps/googletest/include/gtest/internal/custom/gtest-printers.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
// Copyright 2015, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// This file provides an injection point for custom printers in a local | ||
// installation of gTest. | ||
// It will be included from gtest-printers.h and the overrides in this file | ||
// will be visible to everyone. | ||
// | ||
// Injection point for custom user configurations. See README for details | ||
// | ||
// ** Custom implementation starts here ** | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// Copyright 2015, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// Injection point for custom user configurations. See README for details | ||
// | ||
// ** Custom implementation starts here ** | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ |
302 changes: 302 additions & 0 deletions
302
deps/googletest/include/gtest/internal/gtest-death-test-internal.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,302 @@ | ||
// Copyright 2005, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// The Google C++ Testing and Mocking Framework (Google Test) | ||
// | ||
// This header file defines internal utilities needed for implementing | ||
// death tests. They are subject to change without notice. | ||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ | ||
|
||
#include "gtest/gtest-matchers.h" | ||
#include "gtest/internal/gtest-internal.h" | ||
|
||
#include <stdio.h> | ||
#include <memory> | ||
|
||
GTEST_DECLARE_string_(internal_run_death_test); | ||
|
||
namespace testing { | ||
namespace internal { | ||
|
||
// Names of the flags (needed for parsing Google Test flags). | ||
const char kDeathTestStyleFlag[] = "death_test_style"; | ||
const char kDeathTestUseFork[] = "death_test_use_fork"; | ||
const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; | ||
|
||
#if GTEST_HAS_DEATH_TEST | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ | ||
/* class A needs to have dll-interface to be used by clients of class B */) | ||
|
||
// DeathTest is a class that hides much of the complexity of the | ||
// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method | ||
// returns a concrete class that depends on the prevailing death test | ||
// style, as defined by the --gtest_death_test_style and/or | ||
// --gtest_internal_run_death_test flags. | ||
|
||
// In describing the results of death tests, these terms are used with | ||
// the corresponding definitions: | ||
// | ||
// exit status: The integer exit information in the format specified | ||
// by wait(2) | ||
// exit code: The integer code passed to exit(3), _exit(2), or | ||
// returned from main() | ||
class GTEST_API_ DeathTest { | ||
public: | ||
// Create returns false if there was an error determining the | ||
// appropriate action to take for the current death test; for example, | ||
// if the gtest_death_test_style flag is set to an invalid value. | ||
// The LastMessage method will return a more detailed message in that | ||
// case. Otherwise, the DeathTest pointer pointed to by the "test" | ||
// argument is set. If the death test should be skipped, the pointer | ||
// is set to NULL; otherwise, it is set to the address of a new concrete | ||
// DeathTest object that controls the execution of the current test. | ||
static bool Create(const char* statement, Matcher<const std::string&> matcher, | ||
const char* file, int line, DeathTest** test); | ||
DeathTest(); | ||
virtual ~DeathTest() { } | ||
|
||
// A helper class that aborts a death test when it's deleted. | ||
class ReturnSentinel { | ||
public: | ||
explicit ReturnSentinel(DeathTest* test) : test_(test) { } | ||
~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } | ||
private: | ||
DeathTest* const test_; | ||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); | ||
} GTEST_ATTRIBUTE_UNUSED_; | ||
|
||
// An enumeration of possible roles that may be taken when a death | ||
// test is encountered. EXECUTE means that the death test logic should | ||
// be executed immediately. OVERSEE means that the program should prepare | ||
// the appropriate environment for a child process to execute the death | ||
// test, then wait for it to complete. | ||
enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; | ||
|
||
// An enumeration of the three reasons that a test might be aborted. | ||
enum AbortReason { | ||
TEST_ENCOUNTERED_RETURN_STATEMENT, | ||
TEST_THREW_EXCEPTION, | ||
TEST_DID_NOT_DIE | ||
}; | ||
|
||
// Assumes one of the above roles. | ||
virtual TestRole AssumeRole() = 0; | ||
|
||
// Waits for the death test to finish and returns its status. | ||
virtual int Wait() = 0; | ||
|
||
// Returns true if the death test passed; that is, the test process | ||
// exited during the test, its exit status matches a user-supplied | ||
// predicate, and its stderr output matches a user-supplied regular | ||
// expression. | ||
// The user-supplied predicate may be a macro expression rather | ||
// than a function pointer or functor, or else Wait and Passed could | ||
// be combined. | ||
virtual bool Passed(bool exit_status_ok) = 0; | ||
|
||
// Signals that the death test did not die as expected. | ||
virtual void Abort(AbortReason reason) = 0; | ||
|
||
// Returns a human-readable outcome message regarding the outcome of | ||
// the last death test. | ||
static const char* LastMessage(); | ||
|
||
static void set_last_death_test_message(const std::string& message); | ||
|
||
private: | ||
// A string containing a description of the outcome of the last death test. | ||
static std::string last_death_test_message_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); | ||
}; | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 | ||
|
||
// Factory interface for death tests. May be mocked out for testing. | ||
class DeathTestFactory { | ||
public: | ||
virtual ~DeathTestFactory() { } | ||
virtual bool Create(const char* statement, | ||
Matcher<const std::string&> matcher, const char* file, | ||
int line, DeathTest** test) = 0; | ||
}; | ||
|
||
// A concrete DeathTestFactory implementation for normal use. | ||
class DefaultDeathTestFactory : public DeathTestFactory { | ||
public: | ||
bool Create(const char* statement, Matcher<const std::string&> matcher, | ||
const char* file, int line, DeathTest** test) override; | ||
}; | ||
|
||
// Returns true if exit_status describes a process that was terminated | ||
// by a signal, or exited normally with a nonzero exit code. | ||
GTEST_API_ bool ExitedUnsuccessfully(int exit_status); | ||
|
||
// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads | ||
// and interpreted as a regex (rather than an Eq matcher) for legacy | ||
// compatibility. | ||
inline Matcher<const ::std::string&> MakeDeathTestMatcher( | ||
::testing::internal::RE regex) { | ||
return ContainsRegex(regex.pattern()); | ||
} | ||
inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) { | ||
return ContainsRegex(regex); | ||
} | ||
inline Matcher<const ::std::string&> MakeDeathTestMatcher( | ||
const ::std::string& regex) { | ||
return ContainsRegex(regex); | ||
} | ||
|
||
// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's | ||
// used directly. | ||
inline Matcher<const ::std::string&> MakeDeathTestMatcher( | ||
Matcher<const ::std::string&> matcher) { | ||
return matcher; | ||
} | ||
|
||
// Traps C++ exceptions escaping statement and reports them as test | ||
// failures. Note that trapping SEH exceptions is not implemented here. | ||
# if GTEST_HAS_EXCEPTIONS | ||
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ | ||
try { \ | ||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||
} catch (const ::std::exception& gtest_exception) { \ | ||
fprintf(\ | ||
stderr, \ | ||
"\n%s: Caught std::exception-derived exception escaping the " \ | ||
"death test statement. Exception message: %s\n", \ | ||
::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ | ||
gtest_exception.what()); \ | ||
fflush(stderr); \ | ||
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ | ||
} catch (...) { \ | ||
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ | ||
} | ||
|
||
# else | ||
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ | ||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) | ||
|
||
# endif | ||
|
||
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, | ||
// ASSERT_EXIT*, and EXPECT_EXIT*. | ||
#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \ | ||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||
if (::testing::internal::AlwaysTrue()) { \ | ||
::testing::internal::DeathTest* gtest_dt; \ | ||
if (!::testing::internal::DeathTest::Create( \ | ||
#statement, \ | ||
::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \ | ||
__FILE__, __LINE__, >est_dt)) { \ | ||
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ | ||
} \ | ||
if (gtest_dt != nullptr) { \ | ||
std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \ | ||
switch (gtest_dt->AssumeRole()) { \ | ||
case ::testing::internal::DeathTest::OVERSEE_TEST: \ | ||
if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ | ||
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ | ||
} \ | ||
break; \ | ||
case ::testing::internal::DeathTest::EXECUTE_TEST: { \ | ||
::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \ | ||
gtest_dt); \ | ||
GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ | ||
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ | ||
break; \ | ||
} \ | ||
} \ | ||
} \ | ||
} else \ | ||
GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \ | ||
: fail(::testing::internal::DeathTest::LastMessage()) | ||
// The symbol "fail" here expands to something into which a message | ||
// can be streamed. | ||
|
||
// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in | ||
// NDEBUG mode. In this case we need the statements to be executed and the macro | ||
// must accept a streamed message even though the message is never printed. | ||
// The regex object is not evaluated, but it is used to prevent "unused" | ||
// warnings and to avoid an expression that doesn't compile in debug mode. | ||
#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ | ||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ | ||
if (::testing::internal::AlwaysTrue()) { \ | ||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | ||
} else if (!::testing::internal::AlwaysTrue()) { \ | ||
::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ | ||
} else \ | ||
::testing::Message() | ||
|
||
// A class representing the parsed contents of the | ||
// --gtest_internal_run_death_test flag, as it existed when | ||
// RUN_ALL_TESTS was called. | ||
class InternalRunDeathTestFlag { | ||
public: | ||
InternalRunDeathTestFlag(const std::string& a_file, | ||
int a_line, | ||
int an_index, | ||
int a_write_fd) | ||
: file_(a_file), line_(a_line), index_(an_index), | ||
write_fd_(a_write_fd) {} | ||
|
||
~InternalRunDeathTestFlag() { | ||
if (write_fd_ >= 0) | ||
posix::Close(write_fd_); | ||
} | ||
|
||
const std::string& file() const { return file_; } | ||
int line() const { return line_; } | ||
int index() const { return index_; } | ||
int write_fd() const { return write_fd_; } | ||
|
||
private: | ||
std::string file_; | ||
int line_; | ||
int index_; | ||
int write_fd_; | ||
|
||
GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); | ||
}; | ||
|
||
// Returns a newly created InternalRunDeathTestFlag object with fields | ||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if | ||
// the flag is specified; otherwise returns NULL. | ||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); | ||
|
||
#endif // GTEST_HAS_DEATH_TEST | ||
|
||
} // namespace internal | ||
} // namespace testing | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ |
211 changes: 211 additions & 0 deletions
211
deps/googletest/include/gtest/internal/gtest-filepath.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,211 @@ | ||
// Copyright 2008, Google Inc. | ||
// All rights reserved. | ||
// | ||
// Redistribution and use in source and binary forms, with or without | ||
// modification, are permitted provided that the following conditions are | ||
// met: | ||
// | ||
// * Redistributions of source code must retain the above copyright | ||
// notice, this list of conditions and the following disclaimer. | ||
// * Redistributions in binary form must reproduce the above | ||
// copyright notice, this list of conditions and the following disclaimer | ||
// in the documentation and/or other materials provided with the | ||
// distribution. | ||
// * Neither the name of Google Inc. nor the names of its | ||
// contributors may be used to endorse or promote products derived from | ||
// this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// | ||
// Google Test filepath utilities | ||
// | ||
// This header file declares classes and functions used internally by | ||
// Google Test. They are subject to change without notice. | ||
// | ||
// This file is #included in gtest/internal/gtest-internal.h. | ||
// Do not include this header file separately! | ||
|
||
// GOOGLETEST_CM0001 DO NOT DELETE | ||
|
||
#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ | ||
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ | ||
|
||
#include "gtest/internal/gtest-string.h" | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ | ||
/* class A needs to have dll-interface to be used by clients of class B */) | ||
|
||
namespace testing { | ||
namespace internal { | ||
|
||
// FilePath - a class for file and directory pathname manipulation which | ||
// handles platform-specific conventions (like the pathname separator). | ||
// Used for helper functions for naming files in a directory for xml output. | ||
// Except for Set methods, all methods are const or static, which provides an | ||
// "immutable value object" -- useful for peace of mind. | ||
// A FilePath with a value ending in a path separator ("like/this/") represents | ||
// a directory, otherwise it is assumed to represent a file. In either case, | ||
// it may or may not represent an actual file or directory in the file system. | ||
// Names are NOT checked for syntax correctness -- no checking for illegal | ||
// characters, malformed paths, etc. | ||
|
||
class GTEST_API_ FilePath { | ||
public: | ||
FilePath() : pathname_("") { } | ||
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } | ||
|
||
explicit FilePath(const std::string& pathname) : pathname_(pathname) { | ||
Normalize(); | ||
} | ||
|
||
FilePath& operator=(const FilePath& rhs) { | ||
Set(rhs); | ||
return *this; | ||
} | ||
|
||
void Set(const FilePath& rhs) { | ||
pathname_ = rhs.pathname_; | ||
} | ||
|
||
const std::string& string() const { return pathname_; } | ||
const char* c_str() const { return pathname_.c_str(); } | ||
|
||
// Returns the current working directory, or "" if unsuccessful. | ||
static FilePath GetCurrentDir(); | ||
|
||
// Given directory = "dir", base_name = "test", number = 0, | ||
// extension = "xml", returns "dir/test.xml". If number is greater | ||
// than zero (e.g., 12), returns "dir/test_12.xml". | ||
// On Windows platform, uses \ as the separator rather than /. | ||
static FilePath MakeFileName(const FilePath& directory, | ||
const FilePath& base_name, | ||
int number, | ||
const char* extension); | ||
|
||
// Given directory = "dir", relative_path = "test.xml", | ||
// returns "dir/test.xml". | ||
// On Windows, uses \ as the separator rather than /. | ||
static FilePath ConcatPaths(const FilePath& directory, | ||
const FilePath& relative_path); | ||
|
||
// Returns a pathname for a file that does not currently exist. The pathname | ||
// will be directory/base_name.extension or | ||
// directory/base_name_<number>.extension if directory/base_name.extension | ||
// already exists. The number will be incremented until a pathname is found | ||
// that does not already exist. | ||
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. | ||
// There could be a race condition if two or more processes are calling this | ||
// function at the same time -- they could both pick the same filename. | ||
static FilePath GenerateUniqueFileName(const FilePath& directory, | ||
const FilePath& base_name, | ||
const char* extension); | ||
|
||
// Returns true if and only if the path is "". | ||
bool IsEmpty() const { return pathname_.empty(); } | ||
|
||
// If input name has a trailing separator character, removes it and returns | ||
// the name, otherwise return the name string unmodified. | ||
// On Windows platform, uses \ as the separator, other platforms use /. | ||
FilePath RemoveTrailingPathSeparator() const; | ||
|
||
// Returns a copy of the FilePath with the directory part removed. | ||
// Example: FilePath("path/to/file").RemoveDirectoryName() returns | ||
// FilePath("file"). If there is no directory part ("just_a_file"), it returns | ||
// the FilePath unmodified. If there is no file part ("just_a_dir/") it | ||
// returns an empty FilePath (""). | ||
// On Windows platform, '\' is the path separator, otherwise it is '/'. | ||
FilePath RemoveDirectoryName() const; | ||
|
||
// RemoveFileName returns the directory path with the filename removed. | ||
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". | ||
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns | ||
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does | ||
// not have a file, like "just/a/dir/", it returns the FilePath unmodified. | ||
// On Windows platform, '\' is the path separator, otherwise it is '/'. | ||
FilePath RemoveFileName() const; | ||
|
||
// Returns a copy of the FilePath with the case-insensitive extension removed. | ||
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns | ||
// FilePath("dir/file"). If a case-insensitive extension is not | ||
// found, returns a copy of the original FilePath. | ||
FilePath RemoveExtension(const char* extension) const; | ||
|
||
// Creates directories so that path exists. Returns true if successful or if | ||
// the directories already exist; returns false if unable to create | ||
// directories for any reason. Will also return false if the FilePath does | ||
// not represent a directory (that is, it doesn't end with a path separator). | ||
bool CreateDirectoriesRecursively() const; | ||
|
||
// Create the directory so that path exists. Returns true if successful or | ||
// if the directory already exists; returns false if unable to create the | ||
// directory for any reason, including if the parent directory does not | ||
// exist. Not named "CreateDirectory" because that's a macro on Windows. | ||
bool CreateFolder() const; | ||
|
||
// Returns true if FilePath describes something in the file-system, | ||
// either a file, directory, or whatever, and that something exists. | ||
bool FileOrDirectoryExists() const; | ||
|
||
// Returns true if pathname describes a directory in the file-system | ||
// that exists. | ||
bool DirectoryExists() const; | ||
|
||
// Returns true if FilePath ends with a path separator, which indicates that | ||
// it is intended to represent a directory. Returns false otherwise. | ||
// This does NOT check that a directory (or file) actually exists. | ||
bool IsDirectory() const; | ||
|
||
// Returns true if pathname describes a root directory. (Windows has one | ||
// root directory per disk drive.) | ||
bool IsRootDirectory() const; | ||
|
||
// Returns true if pathname describes an absolute path. | ||
bool IsAbsolutePath() const; | ||
|
||
private: | ||
// Replaces multiple consecutive separators with a single separator. | ||
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other | ||
// redundancies that might be in a pathname involving "." or "..". | ||
// | ||
// A pathname with multiple consecutive separators may occur either through | ||
// user error or as a result of some scripts or APIs that generate a pathname | ||
// with a trailing separator. On other platforms the same API or script | ||
// may NOT generate a pathname with a trailing "/". Then elsewhere that | ||
// pathname may have another "/" and pathname components added to it, | ||
// without checking for the separator already being there. | ||
// The script language and operating system may allow paths like "foo//bar" | ||
// but some of the functions in FilePath will not handle that correctly. In | ||
// particular, RemoveTrailingPathSeparator() only removes one separator, and | ||
// it is called in CreateDirectoriesRecursively() assuming that it will change | ||
// a pathname from directory syntax (trailing separator) to filename syntax. | ||
// | ||
// On Windows this method also replaces the alternate path separator '/' with | ||
// the primary path separator '\\', so that for example "bar\\/\\foo" becomes | ||
// "bar\\foo". | ||
|
||
void Normalize(); | ||
|
||
// Returns a pointer to the last occurrence of a valid path separator in | ||
// the FilePath. On Windows, for example, both '/' and '\' are valid path | ||
// separators. Returns NULL if no path separator was found. | ||
const char* FindLastPathSeparator() const; | ||
|
||
std::string pathname_; | ||
}; // class FilePath | ||
|
||
} // namespace internal | ||
} // namespace testing | ||
|
||
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 | ||
|
||
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ |
Oops, something went wrong.