mirror of
https://github.com/google/googletest.git
synced 2025-12-21 11:04:54 +08:00
Merge branch 'google:main' into master
This commit is contained in:
commit
d549f25351
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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), \
|
||||||
#define MATCHER_P3(name, p0, p1, p2, description) \
|
(p0, p1))
|
||||||
GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (p0, p1, p2))
|
#define MATCHER_P3(name, p0, p1, p2, description) \
|
||||||
#define MATCHER_P4(name, p0, p1, p2, p3, description) \
|
GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (#p0, #p1, #p2), \
|
||||||
GMOCK_INTERNAL_MATCHER(name, name##MatcherP4, description, (p0, p1, p2, p3))
|
(p0, p1, p2))
|
||||||
|
#define MATCHER_P4(name, p0, p1, p2, p3, description) \
|
||||||
|
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)))); \
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,21 +55,22 @@ 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());
|
||||||
return "";
|
if (values.empty()) {
|
||||||
case 1:
|
return "";
|
||||||
return fields[0];
|
|
||||||
default:
|
|
||||||
std::string result = "(" + fields[0];
|
|
||||||
for (size_t i = 1; i < fields.size(); i++) {
|
|
||||||
result += ", ";
|
|
||||||
result += fields[i];
|
|
||||||
}
|
|
||||||
result += ")";
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
const auto build_one = [&](const size_t i) {
|
||||||
|
return std::string(names[i]) + ": " + values[i];
|
||||||
|
};
|
||||||
|
std::string result = "(" + build_one(0);
|
||||||
|
for (size_t i = 1; i < values.size(); i++) {
|
||||||
|
result += ", ";
|
||||||
|
result += build_one(i);
|
||||||
|
}
|
||||||
|
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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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,8 +7905,10 @@ 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(
|
||||||
Describe(m));
|
"references any of (variable1: 1-byte object <31>, variable2: 1-byte "
|
||||||
|
"object <32>)",
|
||||||
|
Describe(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that a simple MATCHER_P2() definition works.
|
// Tests that a simple MATCHER_P2() definition works.
|
||||||
@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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*']
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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():
|
||||||
|
|||||||
@ -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()
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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_'
|
||||||
|
|||||||
@ -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'
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -41,7 +41,7 @@ line flags.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import gtest_test_utils
|
from googletest.test import gtest_test_utils
|
||||||
|
|
||||||
# Constants.
|
# Constants.
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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_'
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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_')
|
||||||
|
|||||||
@ -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_')
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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_')
|
||||||
|
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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_"
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -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'
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user