mirror of
https://github.com/google/googletest.git
synced 2025-03-10 17:36:10 +00:00
Adds mutable_impl() and impl() to PolymorphicMatcher (by Zhanyong Wan); Enables gMock to compile with VC 7.1 (by Vlad Losev).
This commit is contained in:
parent
0ea67f88ae
commit
2b43a9ecd1
@ -236,6 +236,14 @@ class PolymorphicMatcher {
|
|||||||
public:
|
public:
|
||||||
explicit PolymorphicMatcher(const Impl& impl) : impl_(impl) {}
|
explicit PolymorphicMatcher(const Impl& impl) : impl_(impl) {}
|
||||||
|
|
||||||
|
// Returns a mutable reference to the underlying matcher
|
||||||
|
// implementation object.
|
||||||
|
Impl& mutable_impl() { return impl_; }
|
||||||
|
|
||||||
|
// Returns an immutable reference to the underlying matcher
|
||||||
|
// implementation object.
|
||||||
|
const Impl& impl() const { return impl_; }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator Matcher<T>() const {
|
operator Matcher<T>() const {
|
||||||
return Matcher<T>(new MonomorphicImpl<T>(impl_));
|
return Matcher<T>(new MonomorphicImpl<T>(impl_));
|
||||||
@ -273,11 +281,12 @@ class PolymorphicMatcher {
|
|||||||
// doesn't need to customize it.
|
// doesn't need to customize it.
|
||||||
ExplainMatchResultTo(impl_, x, os);
|
ExplainMatchResultTo(impl_, x, os);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Impl impl_;
|
const Impl impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
const Impl impl_;
|
Impl impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Creates a matcher from its implementation. This is easier to use
|
// Creates a matcher from its implementation. This is easier to use
|
||||||
|
@ -75,33 +75,11 @@
|
|||||||
namespace testing {
|
namespace testing {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
// For Windows, check the compiler version. At least VS 2005 SP1 is
|
// For MS Visual C++, check the compiler version. At least VS 2003 is
|
||||||
// required to compile Google Mock.
|
// required to compile Google Mock.
|
||||||
#if GTEST_OS_WINDOWS
|
#if defined(_MSC_VER) && _MSC_VER < 1310
|
||||||
|
#error "At least Visual C++ 2003 (7.1) is required to compile Google Mock."
|
||||||
#if _MSC_VER < 1400
|
#endif
|
||||||
#error "At least Visual Studio 2005 SP1 is required to compile Google Mock."
|
|
||||||
#elif _MSC_VER == 1400
|
|
||||||
|
|
||||||
// Unfortunately there is no unique _MSC_VER number for SP1. So for VS 2005
|
|
||||||
// we have to check if it has SP1 by checking whether a bug fixed in SP1
|
|
||||||
// is present. The bug in question is
|
|
||||||
// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101702
|
|
||||||
// where the compiler incorrectly reports sizeof(poiter to an array).
|
|
||||||
|
|
||||||
class TestForSP1 {
|
|
||||||
private: // GCC complains if x_ is used by sizeof before defining it.
|
|
||||||
static char x_[100];
|
|
||||||
// VS 2005 RTM incorrectly reports sizeof(&x) as 100, and that value
|
|
||||||
// is used to trigger 'invalid negative array size' error. If you
|
|
||||||
// see this error, upgrade to VS 2005 SP1 since Google Mock will not
|
|
||||||
// compile in VS 2005 RTM.
|
|
||||||
static char Google_Mock_requires_Visual_Studio_2005_SP1_or_later_to_compile_[
|
|
||||||
sizeof(&x_) != 100 ? 1 : -1];
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _MSC_VER
|
|
||||||
#endif // GTEST_OS_WINDOWS
|
|
||||||
|
|
||||||
// Use implicit_cast as a safe version of static_cast or const_cast
|
// Use implicit_cast as a safe version of static_cast or const_cast
|
||||||
// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
|
// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
|
||||||
|
@ -55,10 +55,12 @@ namespace {
|
|||||||
|
|
||||||
using ::std::ostream;
|
using ::std::ostream;
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE // Windows CE does not define _snprintf_s.
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#elif GTEST_OS_WINDOWS
|
#elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf.
|
||||||
#define snprintf _snprintf_s
|
#define snprintf _snprintf_s
|
||||||
|
#elif _MSC_VER
|
||||||
|
#define snprintf _snprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Prints a segment of bytes in the given object.
|
// Prints a segment of bytes in the given object.
|
||||||
|
@ -1784,13 +1784,19 @@ TEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
|
|||||||
// which cannot reference auto variables.
|
// which cannot reference auto variables.
|
||||||
static int n;
|
static int n;
|
||||||
n = 5;
|
n = 5;
|
||||||
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Gt(10)) << "This should fail.",
|
|
||||||
|
// VC++ prior to version 8.0 SP1 has a bug where it will not see any
|
||||||
|
// functions declared in the namespace scope from within nested classes.
|
||||||
|
// EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
|
||||||
|
// namespace-level functions invoked inside them need to be explicitly
|
||||||
|
// resolved.
|
||||||
|
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
|
||||||
"Value of: n\n"
|
"Value of: n\n"
|
||||||
"Expected: is greater than 10\n"
|
"Expected: is greater than 10\n"
|
||||||
" Actual: 5\n"
|
" Actual: 5");
|
||||||
"This should fail.");
|
|
||||||
n = 0;
|
n = 0;
|
||||||
EXPECT_NONFATAL_FAILURE(EXPECT_THAT(n, AllOf(Le(7), Ge(5))),
|
EXPECT_NONFATAL_FAILURE(
|
||||||
|
EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
|
||||||
"Value of: n\n"
|
"Value of: n\n"
|
||||||
"Expected: (is less than or equal to 7) and "
|
"Expected: (is less than or equal to 7) and "
|
||||||
"(is greater than or equal to 5)\n"
|
"(is greater than or equal to 5)\n"
|
||||||
@ -1805,11 +1811,11 @@ TEST(MatcherAssertionTest, WorksForByRefArguments) {
|
|||||||
static int n;
|
static int n;
|
||||||
n = 0;
|
n = 0;
|
||||||
EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
|
EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
|
||||||
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Not(Ref(n))),
|
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
|
||||||
"Value of: n\n"
|
"Value of: n\n"
|
||||||
"Expected: does not reference the variable @");
|
"Expected: does not reference the variable @");
|
||||||
// Tests the "Actual" part.
|
// Tests the "Actual" part.
|
||||||
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Not(Ref(n))),
|
EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
|
||||||
"Actual: 0 (is located @");
|
"Actual: 0 (is located @");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2745,7 +2751,6 @@ TEST(ResultOfTest, WorksForReferencingCallables) {
|
|||||||
EXPECT_FALSE(matcher3.Matches(n2));
|
EXPECT_FALSE(matcher3.Matches(n2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class DivisibleByImpl {
|
class DivisibleByImpl {
|
||||||
public:
|
public:
|
||||||
explicit DivisibleByImpl(int divider) : divider_(divider) {}
|
explicit DivisibleByImpl(int divider) : divider_(divider) {}
|
||||||
@ -2763,9 +2768,11 @@ class DivisibleByImpl {
|
|||||||
*os << "is not divisible by " << divider_;
|
*os << "is not divisible by " << divider_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_divider(int divider) { divider_ = divider; }
|
||||||
int divider() const { return divider_; }
|
int divider() const { return divider_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const int divider_;
|
int divider_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// For testing using ExplainMatchResultTo() with polymorphic matchers.
|
// For testing using ExplainMatchResultTo() with polymorphic matchers.
|
||||||
@ -2859,6 +2866,7 @@ TEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
|
|||||||
EXPECT_TRUE(m.Matches(n2));
|
EXPECT_TRUE(m.Matches(n2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GTEST_HAS_TYPED_TEST
|
||||||
// Tests ContainerEq with different container types, and
|
// Tests ContainerEq with different container types, and
|
||||||
// different element types.
|
// different element types.
|
||||||
|
|
||||||
@ -2927,6 +2935,7 @@ TYPED_TEST(ContainerEqTest, DuplicateDifference) {
|
|||||||
// But in any case there should be no explanation.
|
// But in any case there should be no explanation.
|
||||||
EXPECT_EQ("", Explain(m, test_set));
|
EXPECT_EQ("", Explain(m, test_set));
|
||||||
}
|
}
|
||||||
|
#endif // GTEST_HAS_TYPED_TEST
|
||||||
|
|
||||||
// Tests that mutliple missing values are reported.
|
// Tests that mutliple missing values are reported.
|
||||||
// Using just vector here, so order is predicatble.
|
// Using just vector here, so order is predicatble.
|
||||||
@ -3345,5 +3354,22 @@ TEST(FormatMatcherDescriptionTest,
|
|||||||
Strings(params, params + 1)));
|
Strings(params, params + 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests PolymorphicMatcher::mutable_impl().
|
||||||
|
TEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
|
||||||
|
PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
|
||||||
|
DivisibleByImpl& impl = m.mutable_impl();
|
||||||
|
EXPECT_EQ(42, impl.divider());
|
||||||
|
|
||||||
|
impl.set_divider(0);
|
||||||
|
EXPECT_EQ(0, m.mutable_impl().divider());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests PolymorphicMatcher::impl().
|
||||||
|
TEST(PolymorphicMatcherTest, CanAccessImpl) {
|
||||||
|
const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
|
||||||
|
const DivisibleByImpl& impl = m.impl();
|
||||||
|
EXPECT_EQ(42, impl.divider());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace gmock_matchers_test
|
} // namespace gmock_matchers_test
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
@ -1432,7 +1432,7 @@ TEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {
|
|||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
// Calls must be in strict order when specified so.
|
// Calls must be in strict order when specified so.
|
||||||
TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo) {
|
TEST(AfterDeathTest, CallsMustBeInStrictOrderWhenSpecifiedSo) {
|
||||||
MockA a;
|
MockA a;
|
||||||
MockB b;
|
MockB b;
|
||||||
Expectation e1 = EXPECT_CALL(a, DoA(1));
|
Expectation e1 = EXPECT_CALL(a, DoA(1));
|
||||||
@ -1454,17 +1454,17 @@ TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo) {
|
|||||||
// gtest and gmock print messages to stdout, which isn't captured by
|
// gtest and gmock print messages to stdout, which isn't captured by
|
||||||
// death tests. Therefore we have to match with an empty regular
|
// death tests. Therefore we have to match with an empty regular
|
||||||
// expression in all the EXPECT_DEATH()s.
|
// expression in all the EXPECT_DEATH()s.
|
||||||
EXPECT_DEATH(a.ReturnResult(2), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), "");
|
||||||
|
|
||||||
b.DoB();
|
b.DoB();
|
||||||
EXPECT_DEATH(a.ReturnResult(2), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), "");
|
||||||
|
|
||||||
b.DoB();
|
b.DoB();
|
||||||
a.ReturnResult(2);
|
a.ReturnResult(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calls must satisfy the partial order when specified so.
|
// Calls must satisfy the partial order when specified so.
|
||||||
TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
|
TEST(AfterDeathTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
|
||||||
MockA a;
|
MockA a;
|
||||||
Expectation e = EXPECT_CALL(a, DoA(1));
|
Expectation e = EXPECT_CALL(a, DoA(1));
|
||||||
const ExpectationSet es = EXPECT_CALL(a, DoA(2));
|
const ExpectationSet es = EXPECT_CALL(a, DoA(2));
|
||||||
@ -1472,17 +1472,17 @@ TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
|
|||||||
.After(e, es)
|
.After(e, es)
|
||||||
.WillOnce(Return(Result()));
|
.WillOnce(Return(Result()));
|
||||||
|
|
||||||
EXPECT_DEATH(a.ReturnResult(3), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
|
||||||
|
|
||||||
a.DoA(2);
|
a.DoA(2);
|
||||||
EXPECT_DEATH(a.ReturnResult(3), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
|
||||||
|
|
||||||
a.DoA(1);
|
a.DoA(1);
|
||||||
a.ReturnResult(3);
|
a.ReturnResult(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// .After() can be combined with .InSequence().
|
// .After() can be combined with .InSequence().
|
||||||
TEST(AfterTest, CanBeUsedWithInSequence) {
|
TEST(AfterDeathTest, CanBeUsedWithInSequence) {
|
||||||
MockA a;
|
MockA a;
|
||||||
Sequence s;
|
Sequence s;
|
||||||
Expectation e = EXPECT_CALL(a, DoA(1));
|
Expectation e = EXPECT_CALL(a, DoA(1));
|
||||||
@ -1492,7 +1492,7 @@ TEST(AfterTest, CanBeUsedWithInSequence) {
|
|||||||
.WillOnce(Return(Result()));
|
.WillOnce(Return(Result()));
|
||||||
|
|
||||||
a.DoA(1);
|
a.DoA(1);
|
||||||
EXPECT_DEATH(a.ReturnResult(3), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
|
||||||
|
|
||||||
a.DoA(2);
|
a.DoA(2);
|
||||||
a.ReturnResult(3);
|
a.ReturnResult(3);
|
||||||
@ -1551,7 +1551,7 @@ TEST(AfterTest, AcceptsDuplicatedInput) {
|
|||||||
.WillOnce(Return(Result()));
|
.WillOnce(Return(Result()));
|
||||||
|
|
||||||
a.DoA(1);
|
a.DoA(1);
|
||||||
EXPECT_DEATH(a.ReturnResult(3), "");
|
EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
|
||||||
|
|
||||||
a.DoA(2);
|
a.DoA(2);
|
||||||
a.ReturnResult(3);
|
a.ReturnResult(3);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user