Merge branch 'google:main' into master

This commit is contained in:
Anthony Graca 2021-12-28 11:42:27 -08:00 committed by GitHub
commit d549f25351
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 133 additions and 141 deletions

View File

@ -190,12 +190,12 @@ Some people put it in a `_test.cc`. This is fine when the interface being mocked
`Foo` changes it, your test could break. (You can't really expect `Foo`'s `Foo` changes it, your test could break. (You can't really expect `Foo`'s
maintainer to fix every test that uses `Foo`, can you?) maintainer to fix every test that uses `Foo`, can you?)
So, the rule of thumb is: if you need to mock `Foo` and it's owned by others, Generally, you should not define mock classes you don't own. If you must mock
define the mock class in `Foo`'s package (better, in a `testing` sub-package such a class owned by others, define the mock class in `Foo`'s Bazel package
such that you can clearly separate production code and testing utilities), put (usually the same directory or a `testing` sub-directory), and put it in a `.h`
it in a `.h` and a `cc_library`. Then everyone can reference them from their and a `cc_library` with `testonly=True`. Then everyone can reference them from
tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and their tests. If `Foo` ever changes, there is only one copy of `MockFoo` to
only tests that depend on the changed methods need to be fixed. change, and only tests that depend on the changed methods need to be fixed.
Another way to do it: you can introduce a thin layer `FooAdaptor` on top of Another way to do it: you can introduce a thin layer `FooAdaptor` on top of
`Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb `Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb

View File

@ -274,8 +274,8 @@ First, define a fixture class. By convention, you should give it the name
class QueueTest : public ::testing::Test { class QueueTest : public ::testing::Test {
protected: protected:
void SetUp() override { void SetUp() override {
q1_.Enqueue(1); q0_.Enqueue(1);
q2_.Enqueue(2); q1_.Enqueue(2);
q2_.Enqueue(3); q2_.Enqueue(3);
} }

View File

@ -3864,9 +3864,9 @@ BoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(
// 'negation' is false; otherwise returns the description of the // 'negation' is false; otherwise returns the description of the
// negation of the matcher. 'param_values' contains a list of strings // negation of the matcher. 'param_values' contains a list of strings
// that are the print-out of the matcher's parameters. // that are the print-out of the matcher's parameters.
GTEST_API_ std::string FormatMatcherDescription(bool negation, GTEST_API_ std::string FormatMatcherDescription(
const char* matcher_name, bool negation, const char* matcher_name,
const Strings& param_values); const std::vector<const char*>& param_names, const Strings& param_values);
// Implements a matcher that checks the value of a optional<> type variable. // Implements a matcher that checks the value of a optional<> type variable.
template <typename ValueMatcher> template <typename ValueMatcher>
@ -5449,7 +5449,7 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
return gmock_description; \ return gmock_description; \
} \ } \
return ::testing::internal::FormatMatcherDescription(negation, #name, \ return ::testing::internal::FormatMatcherDescription(negation, #name, \
{}); \ {}, {}); \
} \ } \
}; \ }; \
}; \ }; \
@ -5461,33 +5461,41 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
const const
#define MATCHER_P(name, p0, description) \ #define MATCHER_P(name, p0, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP, description, (p0)) GMOCK_INTERNAL_MATCHER(name, name##MatcherP, description, (#p0), (p0))
#define MATCHER_P2(name, p0, p1, description) \ #define MATCHER_P2(name, p0, p1, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP2, description, (p0, p1)) GMOCK_INTERNAL_MATCHER(name, name##MatcherP2, description, (#p0, #p1), \
(p0, p1))
#define MATCHER_P3(name, p0, p1, p2, description) \ #define MATCHER_P3(name, p0, p1, p2, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (p0, p1, p2)) GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (#p0, #p1, #p2), \
(p0, p1, p2))
#define MATCHER_P4(name, p0, p1, p2, p3, description) \ #define MATCHER_P4(name, p0, p1, p2, p3, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP4, description, (p0, p1, p2, p3)) GMOCK_INTERNAL_MATCHER(name, name##MatcherP4, description, \
(#p0, #p1, #p2, #p3), (p0, p1, p2, p3))
#define MATCHER_P5(name, p0, p1, p2, p3, p4, description) \ #define MATCHER_P5(name, p0, p1, p2, p3, p4, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP5, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP5, description, \
(p0, p1, p2, p3, p4)) (#p0, #p1, #p2, #p3, #p4), (p0, p1, p2, p3, p4))
#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description) \ #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP6, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP6, description, \
(#p0, #p1, #p2, #p3, #p4, #p5), \
(p0, p1, p2, p3, p4, p5)) (p0, p1, p2, p3, p4, p5))
#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description) \ #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP7, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP7, description, \
(#p0, #p1, #p2, #p3, #p4, #p5, #p6), \
(p0, p1, p2, p3, p4, p5, p6)) (p0, p1, p2, p3, p4, p5, p6))
#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description) \ #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP8, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP8, description, \
(#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7), \
(p0, p1, p2, p3, p4, p5, p6, p7)) (p0, p1, p2, p3, p4, p5, p6, p7))
#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description) \ #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP9, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP9, description, \
(#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7, #p8), \
(p0, p1, p2, p3, p4, p5, p6, p7, p8)) (p0, p1, p2, p3, p4, p5, p6, p7, p8))
#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description) \ #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description) \
GMOCK_INTERNAL_MATCHER(name, name##MatcherP10, description, \ GMOCK_INTERNAL_MATCHER(name, name##MatcherP10, description, \
(#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7, #p8, #p9), \
(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9))
#define GMOCK_INTERNAL_MATCHER(name, full_name, description, args) \ #define GMOCK_INTERNAL_MATCHER(name, full_name, description, arg_names, args) \
template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)> \ template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)> \
class full_name : public ::testing::internal::MatcherBaseImpl< \ class full_name : public ::testing::internal::MatcherBaseImpl< \
full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>> { \ full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>> { \
@ -5516,7 +5524,7 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
return gmock_description; \ return gmock_description; \
} \ } \
return ::testing::internal::FormatMatcherDescription( \ return ::testing::internal::FormatMatcherDescription( \
negation, #name, \ negation, #name, {GMOCK_PP_REMOVE_PARENS(arg_names)}, \
::testing::internal::UniversalTersePrintTupleFieldsToStrings( \ ::testing::internal::UniversalTersePrintTupleFieldsToStrings( \
::std::tuple<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>( \ ::std::tuple<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>( \
GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args)))); \ GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args)))); \

View File

@ -38,9 +38,12 @@
#define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ #define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
#include <stdio.h> #include <stdio.h>
#include <ostream> // NOLINT #include <ostream> // NOLINT
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <vector>
#include "gmock/internal/gmock-port.h" #include "gmock/internal/gmock-port.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
@ -61,7 +64,8 @@ namespace internal {
// Joins a vector of strings as if they are fields of a tuple; returns // Joins a vector of strings as if they are fields of a tuple; returns
// the joined string. // the joined string.
GTEST_API_ std::string JoinAsTuple(const Strings& fields); GTEST_API_ std::string JoinAsKeyValueTuple(
const std::vector<const char*>& names, const Strings& values);
// Converts an identifier name to a space-separated list of lower-case // Converts an identifier name to a space-separated list of lower-case
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is

View File

@ -44,6 +44,7 @@
#include <cstring> #include <cstring>
#include <ostream> // NOLINT #include <ostream> // NOLINT
#include <string> #include <string>
#include <vector>
#include "gmock/gmock.h" #include "gmock/gmock.h"
#include "gmock/internal/gmock-port.h" #include "gmock/internal/gmock-port.h"
@ -54,22 +55,23 @@ namespace internal {
// Joins a vector of strings as if they are fields of a tuple; returns // Joins a vector of strings as if they are fields of a tuple; returns
// the joined string. // the joined string.
GTEST_API_ std::string JoinAsTuple(const Strings& fields) { GTEST_API_ std::string JoinAsKeyValueTuple(
switch (fields.size()) { const std::vector<const char*>& names, const Strings& values) {
case 0: GTEST_CHECK_(names.size() == values.size());
if (values.empty()) {
return ""; return "";
case 1: }
return fields[0]; const auto build_one = [&](const size_t i) {
default: return std::string(names[i]) + ": " + values[i];
std::string result = "(" + fields[0]; };
for (size_t i = 1; i < fields.size(); i++) { std::string result = "(" + build_one(0);
for (size_t i = 1; i < values.size(); i++) {
result += ", "; result += ", ";
result += fields[i]; result += build_one(i);
} }
result += ")"; result += ")";
return result; return result;
} }
}
// Converts an identifier name to a space-separated list of lower-case // Converts an identifier name to a space-separated list of lower-case
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is

View File

@ -36,9 +36,11 @@
#include "gmock/gmock-matchers.h" #include "gmock/gmock-matchers.h"
#include <string.h> #include <string.h>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <vector>
namespace testing { namespace testing {
namespace internal { namespace internal {
@ -48,11 +50,13 @@ namespace internal {
// 'negation' is false; otherwise returns the description of the // 'negation' is false; otherwise returns the description of the
// negation of the matcher. 'param_values' contains a list of strings // negation of the matcher. 'param_values' contains a list of strings
// that are the print-out of the matcher's parameters. // that are the print-out of the matcher's parameters.
GTEST_API_ std::string FormatMatcherDescription(bool negation, GTEST_API_ std::string FormatMatcherDescription(
const char* matcher_name, bool negation, const char* matcher_name,
const Strings& param_values) { const std::vector<const char*>& param_names, const Strings& param_values) {
std::string result = ConvertIdentifierNameToWords(matcher_name); std::string result = ConvertIdentifierNameToWords(matcher_name);
if (param_values.size() >= 1) result += " " + JoinAsTuple(param_values); if (param_values.size() >= 1) {
result += " " + JoinAsKeyValueTuple(param_names, param_values);
}
return negation ? "not (" + result + ")" : result; return negation ? "not (" + result + ")" : result;
} }

View File

@ -70,24 +70,23 @@ namespace internal {
namespace { namespace {
TEST(JoinAsTupleTest, JoinsEmptyTuple) { TEST(JoinAsKeyValueTupleTest, JoinsEmptyTuple) {
EXPECT_EQ("", JoinAsTuple(Strings())); EXPECT_EQ("", JoinAsKeyValueTuple({}, Strings()));
} }
TEST(JoinAsTupleTest, JoinsOneTuple) { TEST(JoinAsKeyValueTupleTest, JoinsOneTuple) {
const char* fields[] = {"1"}; EXPECT_EQ("(a: 1)", JoinAsKeyValueTuple({"a"}, {"1"}));
EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
} }
TEST(JoinAsTupleTest, JoinsTwoTuple) { TEST(JoinAsKeyValueTupleTest, JoinsTwoTuple) {
const char* fields[] = {"1", "a"}; EXPECT_EQ("(a: 1, b: 2)", JoinAsKeyValueTuple({"a", "b"}, {"1", "2"}));
EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
} }
TEST(JoinAsTupleTest, JoinsTenTuple) { TEST(JoinAsKeyValueTupleTest, JoinsTenTuple) {
const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; EXPECT_EQ(
EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", "(a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10)",
JoinAsTuple(Strings(fields, fields + 10))); JoinAsKeyValueTuple({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},
{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}));
} }
TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) { TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {

View File

@ -6439,19 +6439,16 @@ TEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {
TEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) { TEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
EXPECT_EQ("is even", EXPECT_EQ("is even",
FormatMatcherDescription(false, "IsEven", Strings())); FormatMatcherDescription(false, "IsEven", {}, Strings()));
EXPECT_EQ("not (is even)", EXPECT_EQ("not (is even)",
FormatMatcherDescription(true, "IsEven", Strings())); FormatMatcherDescription(true, "IsEven", {}, Strings()));
const char* params[] = {"5"}; EXPECT_EQ("equals (a: 5)",
EXPECT_EQ("equals 5", FormatMatcherDescription(false, "Equals", {"a"}, {"5"}));
FormatMatcherDescription(false, "Equals",
Strings(params, params + 1)));
const char* params2[] = {"5", "8"}; EXPECT_EQ(
EXPECT_EQ("is in range (5, 8)", "is in range (a: 5, b: 8)",
FormatMatcherDescription(false, "IsInRange", FormatMatcherDescription(false, "IsInRange", {"a", "b"}, {"5", "8"}));
Strings(params2, params2 + 2)));
} }
// Tests PolymorphicMatcher::mutable_impl(). // Tests PolymorphicMatcher::mutable_impl().
@ -7810,8 +7807,8 @@ TEST(MatcherPMacroTest, Works) {
EXPECT_TRUE(m.Matches(36)); EXPECT_TRUE(m.Matches(36));
EXPECT_FALSE(m.Matches(5)); EXPECT_FALSE(m.Matches(5));
EXPECT_EQ("is greater than 32 and 5", Describe(m)); EXPECT_EQ("is greater than 32 and (n: 5)", Describe(m));
EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); EXPECT_EQ("not (is greater than 32 and (n: 5))", DescribeNegation(m));
EXPECT_EQ("", Explain(m, 36)); EXPECT_EQ("", Explain(m, 36));
EXPECT_EQ("", Explain(m, 5)); EXPECT_EQ("", Explain(m, 5));
} }
@ -7822,8 +7819,8 @@ MATCHER_P(_is_Greater_Than32and_, n, "") { return arg > 32 && arg > n; }
TEST(MatcherPMacroTest, GeneratesCorrectDescription) { TEST(MatcherPMacroTest, GeneratesCorrectDescription) {
const Matcher<int> m = _is_Greater_Than32and_(5); const Matcher<int> m = _is_Greater_Than32and_(5);
EXPECT_EQ("is greater than 32 and 5", Describe(m)); EXPECT_EQ("is greater than 32 and (n: 5)", Describe(m));
EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); EXPECT_EQ("not (is greater than 32 and (n: 5))", DescribeNegation(m));
EXPECT_EQ("", Explain(m, 36)); EXPECT_EQ("", Explain(m, 36));
EXPECT_EQ("", Explain(m, 5)); EXPECT_EQ("", Explain(m, 5));
} }
@ -7856,7 +7853,8 @@ TEST(MatcherPMacroTest, WorksWhenExplicitlyInstantiatedWithReference) {
// likely it will just annoy the user. If the address is // likely it will just annoy the user. If the address is
// interesting, the user should consider passing the parameter by // interesting, the user should consider passing the parameter by
// pointer instead. // pointer instead.
EXPECT_EQ("references uncopyable 1-byte object <31>", Describe(m)); EXPECT_EQ("references uncopyable (variable: 1-byte object <31>)",
Describe(m));
} }
// Tests that the body of MATCHER_Pn() can reference the parameter // Tests that the body of MATCHER_Pn() can reference the parameter
@ -7907,7 +7905,9 @@ TEST(MatcherPnMacroTest,
// likely they will just annoy the user. If the addresses are // likely they will just annoy the user. If the addresses are
// interesting, the user should consider passing the parameters by // interesting, the user should consider passing the parameters by
// pointers instead. // pointers instead.
EXPECT_EQ("references any of (1-byte object <31>, 1-byte object <32>)", EXPECT_EQ(
"references any of (variable1: 1-byte object <31>, variable2: 1-byte "
"object <32>)",
Describe(m)); Describe(m));
} }
@ -7920,8 +7920,9 @@ TEST(MatcherPnMacroTest, Works) {
EXPECT_TRUE(m.Matches(36L)); EXPECT_TRUE(m.Matches(36L));
EXPECT_FALSE(m.Matches(15L)); EXPECT_FALSE(m.Matches(15L));
EXPECT_EQ("is not in closed range (10, 20)", Describe(m)); EXPECT_EQ("is not in closed range (low: 10, hi: 20)", Describe(m));
EXPECT_EQ("not (is not in closed range (10, 20))", DescribeNegation(m)); EXPECT_EQ("not (is not in closed range (low: 10, hi: 20))",
DescribeNegation(m));
EXPECT_EQ("", Explain(m, 36L)); EXPECT_EQ("", Explain(m, 36L));
EXPECT_EQ("", Explain(m, 15L)); EXPECT_EQ("", Explain(m, 15L));
} }

View File

@ -31,7 +31,7 @@
"""Tests that leaked mock objects can be caught be Google Mock.""" """Tests that leaked mock objects can be caught be Google Mock."""
import gmock_test_utils from googlemock.test import gmock_test_utils
PROGRAM_PATH = gmock_test_utils.GetTestExecutablePath('gmock_leak_test_') PROGRAM_PATH = gmock_test_utils.GetTestExecutablePath('gmock_leak_test_')
TEST_WITH_EXPECT_CALL = [PROGRAM_PATH, '--gtest_filter=*ExpectCall*'] TEST_WITH_EXPECT_CALL = [PROGRAM_PATH, '--gtest_filter=*ExpectCall*']

View File

@ -43,7 +43,7 @@ from io import open # pylint: disable=redefined-builtin, g-importing-member
import os import os
import re import re
import sys import sys
import gmock_test_utils from googlemock.test import gmock_test_utils
# The flag for generating the golden file # The flag for generating the golden file

View File

@ -291,7 +291,7 @@ Stack trace:
[ RUN ] GMockOutputTest.PrintsMatcher [ RUN ] GMockOutputTest.PrintsMatcher
FILE:#: Failure FILE:#: Failure
Value of: (std::pair<int, bool>(42, true)) Value of: (std::pair<int, bool>(42, true))
Expected: is pair (is >= 48, true) Expected: is pair (first: is >= 48, second: true)
Actual: (42, true) (of type std::pair<int, bool>) Actual: (42, true) (of type std::pair<int, bool>)
[ FAILED ] GMockOutputTest.PrintsMatcher [ FAILED ] GMockOutputTest.PrintsMatcher
[ FAILED ] GMockOutputTest.UnexpectedCall [ FAILED ] GMockOutputTest.UnexpectedCall

View File

@ -30,21 +30,9 @@
"""Unit test utilities for Google C++ Mocking Framework.""" """Unit test utilities for Google C++ Mocking Framework."""
import os import os
import sys
# Determines path to gtest_test_utils and imports it.
SCRIPT_DIR = os.path.dirname(__file__) or '.'
# isdir resolves symbolic links.
gtest_tests_util_dir = os.path.join(SCRIPT_DIR, '../../googletest/test')
if os.path.isdir(gtest_tests_util_dir):
GTEST_TESTS_UTIL_DIR = gtest_tests_util_dir
else:
GTEST_TESTS_UTIL_DIR = os.path.join(SCRIPT_DIR, '../../googletest/test')
sys.path.append(GTEST_TESTS_UTIL_DIR)
# pylint: disable=C6204 # pylint: disable=C6204
import gtest_test_utils from googletest.test import gtest_test_utils
def GetSourceDir(): def GetSourceDir():

View File

@ -304,6 +304,8 @@ function(py_test name)
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
--build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE} ${ARGN}) --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE} ${ARGN})
endif() endif()
# Make the Python import path consistent between Bazel and CMake.
set_tests_properties(${name} PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_SOURCE_DIR})
endif(PYTHONINTERP_FOUND) endif(PYTHONINTERP_FOUND)
endfunction() endfunction()

View File

@ -39,7 +39,7 @@ Google Test) with different environments and command line flags.
""" """
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.

View File

@ -35,7 +35,7 @@ googletest-catch-exceptions-ex-test_ (programs written with
Google Test) and verifies their output. Google Test) and verifies their output.
""" """
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.
FLAG_PREFIX = '--gtest_' FLAG_PREFIX = '--gtest_'

View File

@ -32,7 +32,7 @@
"""Verifies that Google Test correctly determines whether to use colors.""" """Verifies that Google Test correctly determines whether to use colors."""
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
IS_WINDOWS = os.name == 'nt' IS_WINDOWS = os.name == 'nt'

View File

@ -668,35 +668,19 @@ TEST_F(TestForDeathTest, TestExpectDebugDeath) {
# if GTEST_OS_WINDOWS # if GTEST_OS_WINDOWS
// Tests that EXPECT_DEBUG_DEATH works as expected when in debug mode // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/crtsetreportmode
// the Windows CRT crashes the process with an assertion failure. // In debug mode, the calls to _CrtSetReportMode and _CrtSetReportFile enable
// the dumping of assertions to stderr. Tests that EXPECT_DEATH works as
// expected when in CRT debug mode (compiled with /MTd or /MDd, which defines
// _DEBUG) the Windows CRT crashes the process with an assertion failure.
// 1. Asserts on death. // 1. Asserts on death.
// 2. Has no side effect (doesn't pop up a window or wait for user input). // 2. Has no side effect (doesn't pop up a window or wait for user input).
// #ifdef _DEBUG
// And in opt mode, it:
// 1. Has side effects but does not assert.
TEST_F(TestForDeathTest, CRTDebugDeath) { TEST_F(TestForDeathTest, CRTDebugDeath) {
int sideeffect = 0; EXPECT_DEATH(DieInCRTDebugElse12(nullptr), "dup.* : Assertion failed")
// Put the regex in a local variable to make sure we don't get an "unused"
// warning in opt mode.
const char* regex = "dup.* : Assertion failed";
EXPECT_DEBUG_DEATH(DieInCRTDebugElse12(&sideeffect), regex)
<< "Must accept a streamed message"; << "Must accept a streamed message";
# ifdef NDEBUG
// Checks that the assignment occurs in opt mode (sideeffect).
EXPECT_EQ(12, sideeffect);
# else
// Checks that the assignment does not occur in dbg mode (no sideeffect).
EXPECT_EQ(0, sideeffect);
# endif
} }
#endif // _DEBUG
# endif // GTEST_OS_WINDOWS # endif // GTEST_OS_WINDOWS

View File

@ -32,7 +32,7 @@
"""Verifies that Google Test correctly parses environment variables.""" """Verifies that Google Test correctly parses environment variables."""
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
IS_WINDOWS = os.name == 'nt' IS_WINDOWS = os.name == 'nt'

View File

@ -41,7 +41,7 @@ line flags.
""" """
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.

View File

@ -47,7 +47,7 @@ try:
except ImportError: except ImportError:
pass pass
import sys import sys
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.

View File

@ -36,7 +36,7 @@ googletest-global-environment-unittest_ (a program written with Google Test).
""" """
import re import re
import gtest_test_utils from googletest.test import gtest_test_utils
def RunAndReturnOutput(args=None): def RunAndReturnOutput(args=None):

View File

@ -32,8 +32,8 @@
import json import json
import os import os
import gtest_json_test_utils from googletest.test import gtest_json_test_utils
import gtest_test_utils from googletest.test import gtest_test_utils
GTEST_OUTPUT_SUBDIR = 'json_outfiles' GTEST_OUTPUT_SUBDIR = 'json_outfiles'
GTEST_OUTPUT_1_TEST = 'gtest_xml_outfile1_test_' GTEST_OUTPUT_1_TEST = 'gtest_xml_outfile1_test_'

View File

@ -37,8 +37,8 @@ import os
import re import re
import sys import sys
import gtest_json_test_utils from googletest.test import gtest_json_test_utils
import gtest_test_utils from googletest.test import gtest_test_utils
GTEST_FILTER_FLAG = '--gtest_filter' GTEST_FILTER_FLAG = '--gtest_filter'
GTEST_LIST_TESTS_FLAG = '--gtest_list_tests' GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'

View File

@ -38,7 +38,7 @@ Google Test) the command line flags.
""" """
import re import re
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.

View File

@ -42,7 +42,7 @@ import difflib
import os import os
import re import re
import sys import sys
import gtest_test_utils from googletest.test import gtest_test_utils
# The flag for generating the golden file # The flag for generating the golden file

View File

@ -30,7 +30,7 @@
"""Verifies that Google Test warns the user when not initialized properly.""" """Verifies that Google Test warns the user when not initialized properly."""
import gtest_test_utils from googletest.test import gtest_test_utils
binary_name = 'googletest-param-test-invalid-name1-test_' binary_name = 'googletest-param-test-invalid-name1-test_'
COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name) COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)

View File

@ -30,7 +30,7 @@
"""Verifies that Google Test warns the user when not initialized properly.""" """Verifies that Google Test warns the user when not initialized properly."""
import gtest_test_utils from googletest.test import gtest_test_utils
binary_name = 'googletest-param-test-invalid-name2-test_' binary_name = 'googletest-param-test-invalid-name2-test_'
COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name) COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)

View File

@ -31,7 +31,7 @@
"""Verifies that SetUpTestSuite and TearDownTestSuite errors are noticed.""" """Verifies that SetUpTestSuite and TearDownTestSuite errors are noticed."""
import gtest_test_utils from googletest.test import gtest_test_utils
COMMAND = gtest_test_utils.GetTestExecutablePath( COMMAND = gtest_test_utils.GetTestExecutablePath(
'googletest-setuptestsuite-test_') 'googletest-setuptestsuite-test_')

View File

@ -31,7 +31,7 @@
"""Verifies that test shuffling works.""" """Verifies that test shuffling works."""
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
# Command to run the googletest-shuffle-test_ program. # Command to run the googletest-shuffle-test_ program.
COMMAND = gtest_test_utils.GetTestExecutablePath('googletest-shuffle-test_') COMMAND = gtest_test_utils.GetTestExecutablePath('googletest-shuffle-test_')

View File

@ -36,7 +36,7 @@ Google Test) with different environments and command line flags.
""" """
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
# Constants. # Constants.

View File

@ -31,7 +31,7 @@
"""Verifies that Google Test warns the user when not initialized properly.""" """Verifies that Google Test warns the user when not initialized properly."""
import gtest_test_utils from googletest.test import gtest_test_utils
COMMAND = gtest_test_utils.GetTestExecutablePath('googletest-uninitialized-test_') COMMAND = gtest_test_utils.GetTestExecutablePath('googletest-uninitialized-test_')

View File

@ -39,7 +39,7 @@ SYNOPSIS
import os import os
import re import re
import gtest_test_utils from googletest.test import gtest_test_utils
IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux' IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'

View File

@ -40,7 +40,7 @@ This script tests such functionality by invoking gtest_list_output_unittest_
import os import os
import re import re
import gtest_test_utils from googletest.test import gtest_test_utils
GTEST_LIST_TESTS_FLAG = '--gtest_list_tests' GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
GTEST_OUTPUT_FLAG = '--gtest_output' GTEST_OUTPUT_FLAG = '--gtest_output'

View File

@ -35,7 +35,7 @@ output.
import re import re
import gtest_test_utils from googletest.test import gtest_test_utils
# Path to the gtest_skip_in_environment_setup_test binary # Path to the gtest_skip_in_environment_setup_test binary
EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_skip_test') EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_skip_test')

View File

@ -33,7 +33,7 @@ This script invokes gtest_skip_in_environment_setup_test_ and verifies its
output. output.
""" """
import gtest_test_utils from googletest.test import gtest_test_utils
# Path to the gtest_skip_in_environment_setup_test binary # Path to the gtest_skip_in_environment_setup_test binary
EXE_PATH = gtest_test_utils.GetTestExecutablePath( EXE_PATH = gtest_test_utils.GetTestExecutablePath(

View File

@ -31,7 +31,7 @@
import os import os
import gtest_test_utils from googletest.test import gtest_test_utils
binary_name = 'gtest_testbridge_test_' binary_name = 'gtest_testbridge_test_'
COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name) COMMAND = gtest_test_utils.GetTestExecutablePath(binary_name)

View File

@ -33,8 +33,8 @@
import os import os
from xml.dom import minidom, Node from xml.dom import minidom, Node
import gtest_test_utils from googletest.test import gtest_test_utils
import gtest_xml_test_utils from googletest.test import gtest_xml_test_utils
GTEST_OUTPUT_SUBDIR = "xml_outfiles" GTEST_OUTPUT_SUBDIR = "xml_outfiles"
GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_" GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"

View File

@ -38,8 +38,8 @@ import re
import sys import sys
from xml.dom import minidom, Node from xml.dom import minidom, Node
import gtest_test_utils from googletest.test import gtest_test_utils
import gtest_xml_test_utils from googletest.test import gtest_xml_test_utils
GTEST_FILTER_FLAG = '--gtest_filter' GTEST_FILTER_FLAG = '--gtest_filter'
GTEST_LIST_TESTS_FLAG = '--gtest_list_tests' GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'

View File

@ -31,7 +31,7 @@
import re import re
from xml.dom import minidom, Node from xml.dom import minidom, Node
import gtest_test_utils from googletest.test import gtest_test_utils
GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml' GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'