mirror of
https://github.com/google/googletest.git
synced 2024-12-30 21:23:01 +08:00
Fix gmock Action behaviour when return type is Wrapper
This commit is contained in:
parent
506340a66b
commit
7123d83132
@ -534,16 +534,20 @@ class ReturnAction {
|
|||||||
// Result without considering explicit constructors, thus resolving the
|
// Result without considering explicit constructors, thus resolving the
|
||||||
// ambiguity. value_ is then initialized using its copy constructor.
|
// ambiguity. value_ is then initialized using its copy constructor.
|
||||||
explicit Impl(const linked_ptr<R>& value)
|
explicit Impl(const linked_ptr<R>& value)
|
||||||
: value_(ImplicitCast_<Result>(*value)) {}
|
: value_before_cast_(*value),
|
||||||
|
value_(ImplicitCast_<Result>(value_before_cast_)) {}
|
||||||
|
|
||||||
virtual Result Perform(const ArgumentTuple&) { return value_; }
|
virtual Result Perform(const ArgumentTuple&) { return value_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,
|
GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,
|
||||||
Result_cannot_be_a_reference_type);
|
Result_cannot_be_a_reference_type);
|
||||||
|
// We save the value before casting just in case it is being cast to a
|
||||||
|
// wrapper type.
|
||||||
|
R value_before_cast_;
|
||||||
Result value_;
|
Result value_;
|
||||||
|
|
||||||
GTEST_DISALLOW_ASSIGN_(Impl);
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Partially specialize for ByMoveWrapper. This version of ReturnAction will
|
// Partially specialize for ByMoveWrapper. This version of ReturnAction will
|
||||||
|
@ -509,6 +509,26 @@ TEST(ReturnTest, AcceptsStringLiteral) {
|
|||||||
EXPECT_EQ("world", a2.Perform(make_tuple()));
|
EXPECT_EQ("world", a2.Perform(make_tuple()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test struct which wraps a vector of integers. Used in
|
||||||
|
// 'SupportsWrapperReturnType' test.
|
||||||
|
struct IntegerVectorWrapper {
|
||||||
|
std::vector<int> * v;
|
||||||
|
IntegerVectorWrapper(std::vector<int>& _v) : v(&_v) {} // NOLINT
|
||||||
|
};
|
||||||
|
|
||||||
|
// Tests that Return() works when return type is a wrapper type.
|
||||||
|
TEST(ReturnTest, SupportsWrapperReturnType) {
|
||||||
|
// Initialize vector of integers.
|
||||||
|
std::vector<int> v;
|
||||||
|
for (int i = 0; i < 5; ++i) v.push_back(i);
|
||||||
|
|
||||||
|
// Return() called with 'v' as argument. The Action will return the same data
|
||||||
|
// as 'v' (copy) but it will be wrapped in an IntegerVectorWrapper.
|
||||||
|
Action<IntegerVectorWrapper()> a = Return(v);
|
||||||
|
const std::vector<int>& result = *(a.Perform(make_tuple()).v);
|
||||||
|
EXPECT_THAT(result, ::testing::ElementsAre(0, 1, 2, 3, 4));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests that Return(v) is covaraint.
|
// Tests that Return(v) is covaraint.
|
||||||
|
|
||||||
struct Base {
|
struct Base {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user