Fix gmock Action behaviour when return type is Wrapper

This commit is contained in:
kosak 2014-11-17 02:04:46 +00:00
parent 506340a66b
commit 7123d83132
2 changed files with 26 additions and 2 deletions

View File

@ -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

View File

@ -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 {