diff options
Diffstat (limited to 'googlemock/test')
| -rw-r--r-- | googlemock/test/gmock-actions_test.cc | 36 | 
1 files changed, 36 insertions, 0 deletions
| diff --git a/googlemock/test/gmock-actions_test.cc b/googlemock/test/gmock-actions_test.cc index dcce111a..ae4fa20e 100644 --- a/googlemock/test/gmock-actions_test.cc +++ b/googlemock/test/gmock-actions_test.cc @@ -46,6 +46,7 @@  #include <iterator>  #include <memory>  #include <string> +#include <type_traits>  #include "gmock/gmock.h"  #include "gmock/internal/gmock-port.h"  #include "gtest/gtest.h" @@ -647,6 +648,41 @@ TEST(ReturnRefTest, IsCovariant) {    EXPECT_EQ(&derived, &a.Perform(std::make_tuple()));  } +template <typename T, typename = decltype(ReturnRef(std::declval<T&&>()))> +bool CanCallReturnRef(T&&) { return true; } +bool CanCallReturnRef(Unused) { return false; } + +// Tests that ReturnRef(v) is working with non-temporaries (T&) +TEST(ReturnRefTest, WorksForNonTemporary) { +  int scalar_value = 123; +  EXPECT_TRUE(CanCallReturnRef(scalar_value)); + +  std::string non_scalar_value("ABC"); +  EXPECT_TRUE(CanCallReturnRef(non_scalar_value)); + +  const int const_scalar_value{321}; +  EXPECT_TRUE(CanCallReturnRef(const_scalar_value)); + +  const std::string const_non_scalar_value("CBA"); +  EXPECT_TRUE(CanCallReturnRef(const_non_scalar_value)); +} + +// Tests that ReturnRef(v) is not working with temporaries (T&&) +TEST(ReturnRefTest, DoesNotWorkForTemporary) { +  auto scalar_value = []()  -> int { return 123; }; +  EXPECT_FALSE(CanCallReturnRef(scalar_value())); + +  auto non_scalar_value = []() -> std::string { return "ABC"; }; +  EXPECT_FALSE(CanCallReturnRef(non_scalar_value())); + +  // cannot use here callable returning "const scalar type", +  // because such const for scalar return type is ignored +  EXPECT_FALSE(CanCallReturnRef(static_cast<const int>(321))); + +  auto const_non_scalar_value = []() -> const std::string { return "CBA"; }; +  EXPECT_FALSE(CanCallReturnRef(const_non_scalar_value())); +} +  // Tests that ReturnRefOfCopy(v) works for reference types.  TEST(ReturnRefOfCopyTest, WorksForReference) {    int n = 42; | 
