113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes. 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file tests the built-in actions. 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock-actions.h" 3713481Sgiacomo.travaglini@arm.com#include <algorithm> 3813481Sgiacomo.travaglini@arm.com#include <iterator> 3913481Sgiacomo.travaglini@arm.com#include <memory> 4013481Sgiacomo.travaglini@arm.com#include <string> 4113481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h" 4213481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h" 4313481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4413481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h" 4513481Sgiacomo.travaglini@arm.com 4613481Sgiacomo.travaglini@arm.comnamespace { 4713481Sgiacomo.travaglini@arm.com 4813481Sgiacomo.travaglini@arm.com// This list should be kept sorted. 4913481Sgiacomo.travaglini@arm.comusing testing::Action; 5013481Sgiacomo.travaglini@arm.comusing testing::ActionInterface; 5113481Sgiacomo.travaglini@arm.comusing testing::Assign; 5213481Sgiacomo.travaglini@arm.comusing testing::ByMove; 5313481Sgiacomo.travaglini@arm.comusing testing::ByRef; 5413481Sgiacomo.travaglini@arm.comusing testing::DefaultValue; 5513481Sgiacomo.travaglini@arm.comusing testing::DoDefault; 5613481Sgiacomo.travaglini@arm.comusing testing::IgnoreResult; 5713481Sgiacomo.travaglini@arm.comusing testing::Invoke; 5813481Sgiacomo.travaglini@arm.comusing testing::InvokeWithoutArgs; 5913481Sgiacomo.travaglini@arm.comusing testing::MakePolymorphicAction; 6013481Sgiacomo.travaglini@arm.comusing testing::Ne; 6113481Sgiacomo.travaglini@arm.comusing testing::PolymorphicAction; 6213481Sgiacomo.travaglini@arm.comusing testing::Return; 6313481Sgiacomo.travaglini@arm.comusing testing::ReturnNull; 6413481Sgiacomo.travaglini@arm.comusing testing::ReturnRef; 6513481Sgiacomo.travaglini@arm.comusing testing::ReturnRefOfCopy; 6613481Sgiacomo.travaglini@arm.comusing testing::SetArgPointee; 6713481Sgiacomo.travaglini@arm.comusing testing::SetArgumentPointee; 6813481Sgiacomo.travaglini@arm.comusing testing::_; 6913481Sgiacomo.travaglini@arm.comusing testing::get; 7013481Sgiacomo.travaglini@arm.comusing testing::internal::BuiltInDefaultValue; 7113481Sgiacomo.travaglini@arm.comusing testing::internal::Int64; 7213481Sgiacomo.travaglini@arm.comusing testing::internal::UInt64; 7313481Sgiacomo.travaglini@arm.comusing testing::make_tuple; 7413481Sgiacomo.travaglini@arm.comusing testing::tuple; 7513481Sgiacomo.travaglini@arm.comusing testing::tuple_element; 7613481Sgiacomo.travaglini@arm.com 7713481Sgiacomo.travaglini@arm.com#if !GTEST_OS_WINDOWS_MOBILE 7813481Sgiacomo.travaglini@arm.comusing testing::SetErrnoAndReturn; 7913481Sgiacomo.travaglini@arm.com#endif 8013481Sgiacomo.travaglini@arm.com 8113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PROTOBUF_ 8213481Sgiacomo.travaglini@arm.comusing testing::internal::TestMessage; 8313481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_PROTOBUF_ 8413481Sgiacomo.travaglini@arm.com 8513481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T*>::Get() returns NULL. 8613481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, IsNullForPointerTypes) { 8713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<int*>::Get() == NULL); 8813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<const char*>::Get() == NULL); 8913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<void*>::Get() == NULL); 9013481Sgiacomo.travaglini@arm.com} 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T*>::Exists() return true. 9313481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, ExistsForPointerTypes) { 9413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<int*>::Exists()); 9513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<const char*>::Exists()); 9613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<void*>::Exists()); 9713481Sgiacomo.travaglini@arm.com} 9813481Sgiacomo.travaglini@arm.com 9913481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T>::Get() returns 0 when T is a 10013481Sgiacomo.travaglini@arm.com// built-in numeric type. 10113481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, IsZeroForNumericTypes) { 10213481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<unsigned char>::Get()); 10313481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<signed char>::Get()); 10413481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<char>::Get()); 10513481Sgiacomo.travaglini@arm.com#if GMOCK_HAS_SIGNED_WCHAR_T_ 10613481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<unsigned wchar_t>::Get()); 10713481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<signed wchar_t>::Get()); 10813481Sgiacomo.travaglini@arm.com#endif 10913481Sgiacomo.travaglini@arm.com#if GMOCK_WCHAR_T_IS_NATIVE_ 11013481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<wchar_t>::Get()); 11113481Sgiacomo.travaglini@arm.com#endif 11213481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<unsigned short>::Get()); // NOLINT 11313481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<signed short>::Get()); // NOLINT 11413481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<short>::Get()); // NOLINT 11513481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<unsigned int>::Get()); 11613481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<signed int>::Get()); 11713481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<int>::Get()); 11813481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long>::Get()); // NOLINT 11913481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<signed long>::Get()); // NOLINT 12013481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<long>::Get()); // NOLINT 12113481Sgiacomo.travaglini@arm.com EXPECT_EQ(0U, BuiltInDefaultValue<UInt64>::Get()); 12213481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<Int64>::Get()); 12313481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<float>::Get()); 12413481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<double>::Get()); 12513481Sgiacomo.travaglini@arm.com} 12613481Sgiacomo.travaglini@arm.com 12713481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a 12813481Sgiacomo.travaglini@arm.com// built-in numeric type. 12913481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, ExistsForNumericTypes) { 13013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<unsigned char>::Exists()); 13113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<signed char>::Exists()); 13213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<char>::Exists()); 13313481Sgiacomo.travaglini@arm.com#if GMOCK_HAS_SIGNED_WCHAR_T_ 13413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<unsigned wchar_t>::Exists()); 13513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<signed wchar_t>::Exists()); 13613481Sgiacomo.travaglini@arm.com#endif 13713481Sgiacomo.travaglini@arm.com#if GMOCK_WCHAR_T_IS_NATIVE_ 13813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<wchar_t>::Exists()); 13913481Sgiacomo.travaglini@arm.com#endif 14013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<unsigned short>::Exists()); // NOLINT 14113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<signed short>::Exists()); // NOLINT 14213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<short>::Exists()); // NOLINT 14313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<unsigned int>::Exists()); 14413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<signed int>::Exists()); 14513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<int>::Exists()); 14613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<unsigned long>::Exists()); // NOLINT 14713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<signed long>::Exists()); // NOLINT 14813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<long>::Exists()); // NOLINT 14913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<UInt64>::Exists()); 15013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<Int64>::Exists()); 15113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<float>::Exists()); 15213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<double>::Exists()); 15313481Sgiacomo.travaglini@arm.com} 15413481Sgiacomo.travaglini@arm.com 15513481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<bool>::Get() returns false. 15613481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, IsFalseForBool) { 15713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(BuiltInDefaultValue<bool>::Get()); 15813481Sgiacomo.travaglini@arm.com} 15913481Sgiacomo.travaglini@arm.com 16013481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<bool>::Exists() returns true. 16113481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, BoolExists) { 16213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<bool>::Exists()); 16313481Sgiacomo.travaglini@arm.com} 16413481Sgiacomo.travaglini@arm.com 16513481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T>::Get() returns "" when T is a 16613481Sgiacomo.travaglini@arm.com// string type. 16713481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, IsEmptyStringForString) { 16813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_STRING 16913481Sgiacomo.travaglini@arm.com EXPECT_EQ("", BuiltInDefaultValue< ::string>::Get()); 17013481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_STRING 17113481Sgiacomo.travaglini@arm.com 17213481Sgiacomo.travaglini@arm.com EXPECT_EQ("", BuiltInDefaultValue< ::std::string>::Get()); 17313481Sgiacomo.travaglini@arm.com} 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a 17613481Sgiacomo.travaglini@arm.com// string type. 17713481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, ExistsForString) { 17813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_STRING 17913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue< ::string>::Exists()); 18013481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_STRING 18113481Sgiacomo.travaglini@arm.com 18213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue< ::std::string>::Exists()); 18313481Sgiacomo.travaglini@arm.com} 18413481Sgiacomo.travaglini@arm.com 18513481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<const T>::Get() returns the same 18613481Sgiacomo.travaglini@arm.com// value as BuiltInDefaultValue<T>::Get() does. 18713481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, WorksForConstTypes) { 18813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", BuiltInDefaultValue<const std::string>::Get()); 18913481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, BuiltInDefaultValue<const int>::Get()); 19013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<char* const>::Get() == NULL); 19113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(BuiltInDefaultValue<const bool>::Get()); 19213481Sgiacomo.travaglini@arm.com} 19313481Sgiacomo.travaglini@arm.com 19413481Sgiacomo.travaglini@arm.com// A type that's default constructible. 19513481Sgiacomo.travaglini@arm.comclass MyDefaultConstructible { 19613481Sgiacomo.travaglini@arm.com public: 19713481Sgiacomo.travaglini@arm.com MyDefaultConstructible() : value_(42) {} 19813481Sgiacomo.travaglini@arm.com 19913481Sgiacomo.travaglini@arm.com int value() const { return value_; } 20013481Sgiacomo.travaglini@arm.com 20113481Sgiacomo.travaglini@arm.com private: 20213481Sgiacomo.travaglini@arm.com int value_; 20313481Sgiacomo.travaglini@arm.com}; 20413481Sgiacomo.travaglini@arm.com 20513481Sgiacomo.travaglini@arm.com// A type that's not default constructible. 20613481Sgiacomo.travaglini@arm.comclass MyNonDefaultConstructible { 20713481Sgiacomo.travaglini@arm.com public: 20813481Sgiacomo.travaglini@arm.com // Does not have a default ctor. 20913481Sgiacomo.travaglini@arm.com explicit MyNonDefaultConstructible(int a_value) : value_(a_value) {} 21013481Sgiacomo.travaglini@arm.com 21113481Sgiacomo.travaglini@arm.com int value() const { return value_; } 21213481Sgiacomo.travaglini@arm.com 21313481Sgiacomo.travaglini@arm.com private: 21413481Sgiacomo.travaglini@arm.com int value_; 21513481Sgiacomo.travaglini@arm.com}; 21613481Sgiacomo.travaglini@arm.com 21713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_TYPE_TRAITS_ 21813481Sgiacomo.travaglini@arm.com 21913481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, ExistsForDefaultConstructibleType) { 22013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(BuiltInDefaultValue<MyDefaultConstructible>::Exists()); 22113481Sgiacomo.travaglini@arm.com} 22213481Sgiacomo.travaglini@arm.com 22313481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, IsDefaultConstructedForDefaultConstructibleType) { 22413481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, BuiltInDefaultValue<MyDefaultConstructible>::Get().value()); 22513481Sgiacomo.travaglini@arm.com} 22613481Sgiacomo.travaglini@arm.com 22713481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_TYPE_TRAITS_ 22813481Sgiacomo.travaglini@arm.com 22913481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueTest, DoesNotExistForNonDefaultConstructibleType) { 23013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(BuiltInDefaultValue<MyNonDefaultConstructible>::Exists()); 23113481Sgiacomo.travaglini@arm.com} 23213481Sgiacomo.travaglini@arm.com 23313481Sgiacomo.travaglini@arm.com// Tests that BuiltInDefaultValue<T&>::Get() aborts the program. 23413481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueDeathTest, IsUndefinedForReferences) { 23513481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 23613481Sgiacomo.travaglini@arm.com BuiltInDefaultValue<int&>::Get(); 23713481Sgiacomo.travaglini@arm.com }, ""); 23813481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 23913481Sgiacomo.travaglini@arm.com BuiltInDefaultValue<const char&>::Get(); 24013481Sgiacomo.travaglini@arm.com }, ""); 24113481Sgiacomo.travaglini@arm.com} 24213481Sgiacomo.travaglini@arm.com 24313481Sgiacomo.travaglini@arm.comTEST(BuiltInDefaultValueDeathTest, IsUndefinedForNonDefaultConstructibleType) { 24413481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 24513481Sgiacomo.travaglini@arm.com BuiltInDefaultValue<MyNonDefaultConstructible>::Get(); 24613481Sgiacomo.travaglini@arm.com }, ""); 24713481Sgiacomo.travaglini@arm.com} 24813481Sgiacomo.travaglini@arm.com 24913481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T>::IsSet() is false initially. 25013481Sgiacomo.travaglini@arm.comTEST(DefaultValueTest, IsInitiallyUnset) { 25113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int>::IsSet()); 25213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyDefaultConstructible>::IsSet()); 25313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet()); 25413481Sgiacomo.travaglini@arm.com} 25513481Sgiacomo.travaglini@arm.com 25613481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T> can be set and then unset. 25713481Sgiacomo.travaglini@arm.comTEST(DefaultValueTest, CanBeSetAndUnset) { 25813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<int>::Exists()); 25913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 26013481Sgiacomo.travaglini@arm.com 26113481Sgiacomo.travaglini@arm.com DefaultValue<int>::Set(1); 26213481Sgiacomo.travaglini@arm.com DefaultValue<const MyNonDefaultConstructible>::Set( 26313481Sgiacomo.travaglini@arm.com MyNonDefaultConstructible(42)); 26413481Sgiacomo.travaglini@arm.com 26513481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, DefaultValue<int>::Get()); 26613481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, DefaultValue<const MyNonDefaultConstructible>::Get().value()); 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<int>::Exists()); 26913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 27013481Sgiacomo.travaglini@arm.com 27113481Sgiacomo.travaglini@arm.com DefaultValue<int>::Clear(); 27213481Sgiacomo.travaglini@arm.com DefaultValue<const MyNonDefaultConstructible>::Clear(); 27313481Sgiacomo.travaglini@arm.com 27413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int>::IsSet()); 27513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet()); 27613481Sgiacomo.travaglini@arm.com 27713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<int>::Exists()); 27813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 27913481Sgiacomo.travaglini@arm.com} 28013481Sgiacomo.travaglini@arm.com 28113481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T>::Get() returns the 28213481Sgiacomo.travaglini@arm.com// BuiltInDefaultValue<T>::Get() when DefaultValue<T>::IsSet() is 28313481Sgiacomo.travaglini@arm.com// false. 28413481Sgiacomo.travaglini@arm.comTEST(DefaultValueDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) { 28513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int>::IsSet()); 28613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<int>::Exists()); 28713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::IsSet()); 28813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::Exists()); 28913481Sgiacomo.travaglini@arm.com 29013481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, DefaultValue<int>::Get()); 29113481Sgiacomo.travaglini@arm.com 29213481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 29313481Sgiacomo.travaglini@arm.com DefaultValue<MyNonDefaultConstructible>::Get(); 29413481Sgiacomo.travaglini@arm.com }, ""); 29513481Sgiacomo.travaglini@arm.com} 29613481Sgiacomo.travaglini@arm.com 29713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 29813481Sgiacomo.travaglini@arm.comTEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) { 29913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists()); 30013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == NULL); 30113481Sgiacomo.travaglini@arm.com DefaultValue<std::unique_ptr<int>>::SetFactory([] { 30213481Sgiacomo.travaglini@arm.com return std::unique_ptr<int>(new int(42)); 30313481Sgiacomo.travaglini@arm.com }); 30413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists()); 30513481Sgiacomo.travaglini@arm.com std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get(); 30613481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, *i); 30713481Sgiacomo.travaglini@arm.com} 30813481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_UNIQUE_PTR_ 30913481Sgiacomo.travaglini@arm.com 31013481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<void>::Get() returns void. 31113481Sgiacomo.travaglini@arm.comTEST(DefaultValueTest, GetWorksForVoid) { 31213481Sgiacomo.travaglini@arm.com return DefaultValue<void>::Get(); 31313481Sgiacomo.travaglini@arm.com} 31413481Sgiacomo.travaglini@arm.com 31513481Sgiacomo.travaglini@arm.com// Tests using DefaultValue with a reference type. 31613481Sgiacomo.travaglini@arm.com 31713481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T&>::IsSet() is false initially. 31813481Sgiacomo.travaglini@arm.comTEST(DefaultValueOfReferenceTest, IsInitiallyUnset) { 31913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int&>::IsSet()); 32013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::IsSet()); 32113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 32213481Sgiacomo.travaglini@arm.com} 32313481Sgiacomo.travaglini@arm.com 32413481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T&>::Exists is false initiallly. 32513481Sgiacomo.travaglini@arm.comTEST(DefaultValueOfReferenceTest, IsInitiallyNotExisting) { 32613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int&>::Exists()); 32713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::Exists()); 32813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 32913481Sgiacomo.travaglini@arm.com} 33013481Sgiacomo.travaglini@arm.com 33113481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T&> can be set and then unset. 33213481Sgiacomo.travaglini@arm.comTEST(DefaultValueOfReferenceTest, CanBeSetAndUnset) { 33313481Sgiacomo.travaglini@arm.com int n = 1; 33413481Sgiacomo.travaglini@arm.com DefaultValue<const int&>::Set(n); 33513481Sgiacomo.travaglini@arm.com MyNonDefaultConstructible x(42); 33613481Sgiacomo.travaglini@arm.com DefaultValue<MyNonDefaultConstructible&>::Set(x); 33713481Sgiacomo.travaglini@arm.com 33813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<const int&>::Exists()); 33913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 34013481Sgiacomo.travaglini@arm.com 34113481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &(DefaultValue<const int&>::Get())); 34213481Sgiacomo.travaglini@arm.com EXPECT_EQ(&x, &(DefaultValue<MyNonDefaultConstructible&>::Get())); 34313481Sgiacomo.travaglini@arm.com 34413481Sgiacomo.travaglini@arm.com DefaultValue<const int&>::Clear(); 34513481Sgiacomo.travaglini@arm.com DefaultValue<MyNonDefaultConstructible&>::Clear(); 34613481Sgiacomo.travaglini@arm.com 34713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const int&>::Exists()); 34813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 34913481Sgiacomo.travaglini@arm.com 35013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<const int&>::IsSet()); 35113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 35213481Sgiacomo.travaglini@arm.com} 35313481Sgiacomo.travaglini@arm.com 35413481Sgiacomo.travaglini@arm.com// Tests that DefaultValue<T&>::Get() returns the 35513481Sgiacomo.travaglini@arm.com// BuiltInDefaultValue<T&>::Get() when DefaultValue<T&>::IsSet() is 35613481Sgiacomo.travaglini@arm.com// false. 35713481Sgiacomo.travaglini@arm.comTEST(DefaultValueOfReferenceDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) { 35813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<int&>::IsSet()); 35913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 36013481Sgiacomo.travaglini@arm.com 36113481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 36213481Sgiacomo.travaglini@arm.com DefaultValue<int&>::Get(); 36313481Sgiacomo.travaglini@arm.com }, ""); 36413481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 36513481Sgiacomo.travaglini@arm.com DefaultValue<MyNonDefaultConstructible>::Get(); 36613481Sgiacomo.travaglini@arm.com }, ""); 36713481Sgiacomo.travaglini@arm.com} 36813481Sgiacomo.travaglini@arm.com 36913481Sgiacomo.travaglini@arm.com// Tests that ActionInterface can be implemented by defining the 37013481Sgiacomo.travaglini@arm.com// Perform method. 37113481Sgiacomo.travaglini@arm.com 37213481Sgiacomo.travaglini@arm.comtypedef int MyGlobalFunction(bool, int); 37313481Sgiacomo.travaglini@arm.com 37413481Sgiacomo.travaglini@arm.comclass MyActionImpl : public ActionInterface<MyGlobalFunction> { 37513481Sgiacomo.travaglini@arm.com public: 37613481Sgiacomo.travaglini@arm.com virtual int Perform(const tuple<bool, int>& args) { 37713481Sgiacomo.travaglini@arm.com return get<0>(args) ? get<1>(args) : 0; 37813481Sgiacomo.travaglini@arm.com } 37913481Sgiacomo.travaglini@arm.com}; 38013481Sgiacomo.travaglini@arm.com 38113481Sgiacomo.travaglini@arm.comTEST(ActionInterfaceTest, CanBeImplementedByDefiningPerform) { 38213481Sgiacomo.travaglini@arm.com MyActionImpl my_action_impl; 38313481Sgiacomo.travaglini@arm.com (void)my_action_impl; 38413481Sgiacomo.travaglini@arm.com} 38513481Sgiacomo.travaglini@arm.com 38613481Sgiacomo.travaglini@arm.comTEST(ActionInterfaceTest, MakeAction) { 38713481Sgiacomo.travaglini@arm.com Action<MyGlobalFunction> action = MakeAction(new MyActionImpl); 38813481Sgiacomo.travaglini@arm.com 38913481Sgiacomo.travaglini@arm.com // When exercising the Perform() method of Action<F>, we must pass 39013481Sgiacomo.travaglini@arm.com // it a tuple whose size and type are compatible with F's argument 39113481Sgiacomo.travaglini@arm.com // types. For example, if F is int(), then Perform() takes a 39213481Sgiacomo.travaglini@arm.com // 0-tuple; if F is void(bool, int), then Perform() takes a 39313481Sgiacomo.travaglini@arm.com // tuple<bool, int>, and so on. 39413481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, action.Perform(make_tuple(true, 5))); 39513481Sgiacomo.travaglini@arm.com} 39613481Sgiacomo.travaglini@arm.com 39713481Sgiacomo.travaglini@arm.com// Tests that Action<F> can be contructed from a pointer to 39813481Sgiacomo.travaglini@arm.com// ActionInterface<F>. 39913481Sgiacomo.travaglini@arm.comTEST(ActionTest, CanBeConstructedFromActionInterface) { 40013481Sgiacomo.travaglini@arm.com Action<MyGlobalFunction> action(new MyActionImpl); 40113481Sgiacomo.travaglini@arm.com} 40213481Sgiacomo.travaglini@arm.com 40313481Sgiacomo.travaglini@arm.com// Tests that Action<F> delegates actual work to ActionInterface<F>. 40413481Sgiacomo.travaglini@arm.comTEST(ActionTest, DelegatesWorkToActionInterface) { 40513481Sgiacomo.travaglini@arm.com const Action<MyGlobalFunction> action(new MyActionImpl); 40613481Sgiacomo.travaglini@arm.com 40713481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, action.Perform(make_tuple(true, 5))); 40813481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, action.Perform(make_tuple(false, 1))); 40913481Sgiacomo.travaglini@arm.com} 41013481Sgiacomo.travaglini@arm.com 41113481Sgiacomo.travaglini@arm.com// Tests that Action<F> can be copied. 41213481Sgiacomo.travaglini@arm.comTEST(ActionTest, IsCopyable) { 41313481Sgiacomo.travaglini@arm.com Action<MyGlobalFunction> a1(new MyActionImpl); 41413481Sgiacomo.travaglini@arm.com Action<MyGlobalFunction> a2(a1); // Tests the copy constructor. 41513481Sgiacomo.travaglini@arm.com 41613481Sgiacomo.travaglini@arm.com // a1 should continue to work after being copied from. 41713481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, a1.Perform(make_tuple(true, 5))); 41813481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a1.Perform(make_tuple(false, 1))); 41913481Sgiacomo.travaglini@arm.com 42013481Sgiacomo.travaglini@arm.com // a2 should work like the action it was copied from. 42113481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, a2.Perform(make_tuple(true, 5))); 42213481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a2.Perform(make_tuple(false, 1))); 42313481Sgiacomo.travaglini@arm.com 42413481Sgiacomo.travaglini@arm.com a2 = a1; // Tests the assignment operator. 42513481Sgiacomo.travaglini@arm.com 42613481Sgiacomo.travaglini@arm.com // a1 should continue to work after being copied from. 42713481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, a1.Perform(make_tuple(true, 5))); 42813481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a1.Perform(make_tuple(false, 1))); 42913481Sgiacomo.travaglini@arm.com 43013481Sgiacomo.travaglini@arm.com // a2 should work like the action it was copied from. 43113481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, a2.Perform(make_tuple(true, 5))); 43213481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a2.Perform(make_tuple(false, 1))); 43313481Sgiacomo.travaglini@arm.com} 43413481Sgiacomo.travaglini@arm.com 43513481Sgiacomo.travaglini@arm.com// Tests that an Action<From> object can be converted to a 43613481Sgiacomo.travaglini@arm.com// compatible Action<To> object. 43713481Sgiacomo.travaglini@arm.com 43813481Sgiacomo.travaglini@arm.comclass IsNotZero : public ActionInterface<bool(int)> { // NOLINT 43913481Sgiacomo.travaglini@arm.com public: 44013481Sgiacomo.travaglini@arm.com virtual bool Perform(const tuple<int>& arg) { 44113481Sgiacomo.travaglini@arm.com return get<0>(arg) != 0; 44213481Sgiacomo.travaglini@arm.com } 44313481Sgiacomo.travaglini@arm.com}; 44413481Sgiacomo.travaglini@arm.com 44513481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN 44613481Sgiacomo.travaglini@arm.com// Compiling this test on Nokia's Symbian compiler fails with: 44713481Sgiacomo.travaglini@arm.com// 'Result' is not a member of class 'testing::internal::Function<int>' 44813481Sgiacomo.travaglini@arm.com// (point of instantiation: '@unnamed@gmock_actions_test_cc@:: 44913481Sgiacomo.travaglini@arm.com// ActionTest_CanBeConvertedToOtherActionType_Test::TestBody()') 45013481Sgiacomo.travaglini@arm.com// with no obvious fix. 45113481Sgiacomo.travaglini@arm.comTEST(ActionTest, CanBeConvertedToOtherActionType) { 45213481Sgiacomo.travaglini@arm.com const Action<bool(int)> a1(new IsNotZero); // NOLINT 45313481Sgiacomo.travaglini@arm.com const Action<int(char)> a2 = Action<int(char)>(a1); // NOLINT 45413481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, a2.Perform(make_tuple('a'))); 45513481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a2.Perform(make_tuple('\0'))); 45613481Sgiacomo.travaglini@arm.com} 45713481Sgiacomo.travaglini@arm.com#endif // !GTEST_OS_SYMBIAN 45813481Sgiacomo.travaglini@arm.com 45913481Sgiacomo.travaglini@arm.com// The following two classes are for testing MakePolymorphicAction(). 46013481Sgiacomo.travaglini@arm.com 46113481Sgiacomo.travaglini@arm.com// Implements a polymorphic action that returns the second of the 46213481Sgiacomo.travaglini@arm.com// arguments it receives. 46313481Sgiacomo.travaglini@arm.comclass ReturnSecondArgumentAction { 46413481Sgiacomo.travaglini@arm.com public: 46513481Sgiacomo.travaglini@arm.com // We want to verify that MakePolymorphicAction() can work with a 46613481Sgiacomo.travaglini@arm.com // polymorphic action whose Perform() method template is either 46713481Sgiacomo.travaglini@arm.com // const or not. This lets us verify the non-const case. 46813481Sgiacomo.travaglini@arm.com template <typename Result, typename ArgumentTuple> 46913481Sgiacomo.travaglini@arm.com Result Perform(const ArgumentTuple& args) { return get<1>(args); } 47013481Sgiacomo.travaglini@arm.com}; 47113481Sgiacomo.travaglini@arm.com 47213481Sgiacomo.travaglini@arm.com// Implements a polymorphic action that can be used in a nullary 47313481Sgiacomo.travaglini@arm.com// function to return 0. 47413481Sgiacomo.travaglini@arm.comclass ReturnZeroFromNullaryFunctionAction { 47513481Sgiacomo.travaglini@arm.com public: 47613481Sgiacomo.travaglini@arm.com // For testing that MakePolymorphicAction() works when the 47713481Sgiacomo.travaglini@arm.com // implementation class' Perform() method template takes only one 47813481Sgiacomo.travaglini@arm.com // template parameter. 47913481Sgiacomo.travaglini@arm.com // 48013481Sgiacomo.travaglini@arm.com // We want to verify that MakePolymorphicAction() can work with a 48113481Sgiacomo.travaglini@arm.com // polymorphic action whose Perform() method template is either 48213481Sgiacomo.travaglini@arm.com // const or not. This lets us verify the const case. 48313481Sgiacomo.travaglini@arm.com template <typename Result> 48413481Sgiacomo.travaglini@arm.com Result Perform(const tuple<>&) const { return 0; } 48513481Sgiacomo.travaglini@arm.com}; 48613481Sgiacomo.travaglini@arm.com 48713481Sgiacomo.travaglini@arm.com// These functions verify that MakePolymorphicAction() returns a 48813481Sgiacomo.travaglini@arm.com// PolymorphicAction<T> where T is the argument's type. 48913481Sgiacomo.travaglini@arm.com 49013481Sgiacomo.travaglini@arm.comPolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() { 49113481Sgiacomo.travaglini@arm.com return MakePolymorphicAction(ReturnSecondArgumentAction()); 49213481Sgiacomo.travaglini@arm.com} 49313481Sgiacomo.travaglini@arm.com 49413481Sgiacomo.travaglini@arm.comPolymorphicAction<ReturnZeroFromNullaryFunctionAction> 49513481Sgiacomo.travaglini@arm.comReturnZeroFromNullaryFunction() { 49613481Sgiacomo.travaglini@arm.com return MakePolymorphicAction(ReturnZeroFromNullaryFunctionAction()); 49713481Sgiacomo.travaglini@arm.com} 49813481Sgiacomo.travaglini@arm.com 49913481Sgiacomo.travaglini@arm.com// Tests that MakePolymorphicAction() turns a polymorphic action 50013481Sgiacomo.travaglini@arm.com// implementation class into a polymorphic action. 50113481Sgiacomo.travaglini@arm.comTEST(MakePolymorphicActionTest, ConstructsActionFromImpl) { 50213481Sgiacomo.travaglini@arm.com Action<int(bool, int, double)> a1 = ReturnSecondArgument(); // NOLINT 50313481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, a1.Perform(make_tuple(false, 5, 2.0))); 50413481Sgiacomo.travaglini@arm.com} 50513481Sgiacomo.travaglini@arm.com 50613481Sgiacomo.travaglini@arm.com// Tests that MakePolymorphicAction() works when the implementation 50713481Sgiacomo.travaglini@arm.com// class' Perform() method template has only one template parameter. 50813481Sgiacomo.travaglini@arm.comTEST(MakePolymorphicActionTest, WorksWhenPerformHasOneTemplateParameter) { 50913481Sgiacomo.travaglini@arm.com Action<int()> a1 = ReturnZeroFromNullaryFunction(); 51013481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a1.Perform(make_tuple())); 51113481Sgiacomo.travaglini@arm.com 51213481Sgiacomo.travaglini@arm.com Action<void*()> a2 = ReturnZeroFromNullaryFunction(); 51313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(a2.Perform(make_tuple()) == NULL); 51413481Sgiacomo.travaglini@arm.com} 51513481Sgiacomo.travaglini@arm.com 51613481Sgiacomo.travaglini@arm.com// Tests that Return() works as an action for void-returning 51713481Sgiacomo.travaglini@arm.com// functions. 51813481Sgiacomo.travaglini@arm.comTEST(ReturnTest, WorksForVoid) { 51913481Sgiacomo.travaglini@arm.com const Action<void(int)> ret = Return(); // NOLINT 52013481Sgiacomo.travaglini@arm.com return ret.Perform(make_tuple(1)); 52113481Sgiacomo.travaglini@arm.com} 52213481Sgiacomo.travaglini@arm.com 52313481Sgiacomo.travaglini@arm.com// Tests that Return(v) returns v. 52413481Sgiacomo.travaglini@arm.comTEST(ReturnTest, ReturnsGivenValue) { 52513481Sgiacomo.travaglini@arm.com Action<int()> ret = Return(1); // NOLINT 52613481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, ret.Perform(make_tuple())); 52713481Sgiacomo.travaglini@arm.com 52813481Sgiacomo.travaglini@arm.com ret = Return(-5); 52913481Sgiacomo.travaglini@arm.com EXPECT_EQ(-5, ret.Perform(make_tuple())); 53013481Sgiacomo.travaglini@arm.com} 53113481Sgiacomo.travaglini@arm.com 53213481Sgiacomo.travaglini@arm.com// Tests that Return("string literal") works. 53313481Sgiacomo.travaglini@arm.comTEST(ReturnTest, AcceptsStringLiteral) { 53413481Sgiacomo.travaglini@arm.com Action<const char*()> a1 = Return("Hello"); 53513481Sgiacomo.travaglini@arm.com EXPECT_STREQ("Hello", a1.Perform(make_tuple())); 53613481Sgiacomo.travaglini@arm.com 53713481Sgiacomo.travaglini@arm.com Action<std::string()> a2 = Return("world"); 53813481Sgiacomo.travaglini@arm.com EXPECT_EQ("world", a2.Perform(make_tuple())); 53913481Sgiacomo.travaglini@arm.com} 54013481Sgiacomo.travaglini@arm.com 54113481Sgiacomo.travaglini@arm.com// Test struct which wraps a vector of integers. Used in 54213481Sgiacomo.travaglini@arm.com// 'SupportsWrapperReturnType' test. 54313481Sgiacomo.travaglini@arm.comstruct IntegerVectorWrapper { 54413481Sgiacomo.travaglini@arm.com std::vector<int> * v; 54513481Sgiacomo.travaglini@arm.com IntegerVectorWrapper(std::vector<int>& _v) : v(&_v) {} // NOLINT 54613481Sgiacomo.travaglini@arm.com}; 54713481Sgiacomo.travaglini@arm.com 54813481Sgiacomo.travaglini@arm.com// Tests that Return() works when return type is a wrapper type. 54913481Sgiacomo.travaglini@arm.comTEST(ReturnTest, SupportsWrapperReturnType) { 55013481Sgiacomo.travaglini@arm.com // Initialize vector of integers. 55113481Sgiacomo.travaglini@arm.com std::vector<int> v; 55213481Sgiacomo.travaglini@arm.com for (int i = 0; i < 5; ++i) v.push_back(i); 55313481Sgiacomo.travaglini@arm.com 55413481Sgiacomo.travaglini@arm.com // Return() called with 'v' as argument. The Action will return the same data 55513481Sgiacomo.travaglini@arm.com // as 'v' (copy) but it will be wrapped in an IntegerVectorWrapper. 55613481Sgiacomo.travaglini@arm.com Action<IntegerVectorWrapper()> a = Return(v); 55713481Sgiacomo.travaglini@arm.com const std::vector<int>& result = *(a.Perform(make_tuple()).v); 55813481Sgiacomo.travaglini@arm.com EXPECT_THAT(result, ::testing::ElementsAre(0, 1, 2, 3, 4)); 55913481Sgiacomo.travaglini@arm.com} 56013481Sgiacomo.travaglini@arm.com 56113481Sgiacomo.travaglini@arm.com// Tests that Return(v) is covaraint. 56213481Sgiacomo.travaglini@arm.com 56313481Sgiacomo.travaglini@arm.comstruct Base { 56413481Sgiacomo.travaglini@arm.com bool operator==(const Base&) { return true; } 56513481Sgiacomo.travaglini@arm.com}; 56613481Sgiacomo.travaglini@arm.com 56713481Sgiacomo.travaglini@arm.comstruct Derived : public Base { 56813481Sgiacomo.travaglini@arm.com bool operator==(const Derived&) { return true; } 56913481Sgiacomo.travaglini@arm.com}; 57013481Sgiacomo.travaglini@arm.com 57113481Sgiacomo.travaglini@arm.comTEST(ReturnTest, IsCovariant) { 57213481Sgiacomo.travaglini@arm.com Base base; 57313481Sgiacomo.travaglini@arm.com Derived derived; 57413481Sgiacomo.travaglini@arm.com Action<Base*()> ret = Return(&base); 57513481Sgiacomo.travaglini@arm.com EXPECT_EQ(&base, ret.Perform(make_tuple())); 57613481Sgiacomo.travaglini@arm.com 57713481Sgiacomo.travaglini@arm.com ret = Return(&derived); 57813481Sgiacomo.travaglini@arm.com EXPECT_EQ(&derived, ret.Perform(make_tuple())); 57913481Sgiacomo.travaglini@arm.com} 58013481Sgiacomo.travaglini@arm.com 58113481Sgiacomo.travaglini@arm.com// Tests that the type of the value passed into Return is converted into T 58213481Sgiacomo.travaglini@arm.com// when the action is cast to Action<T(...)> rather than when the action is 58313481Sgiacomo.travaglini@arm.com// performed. See comments on testing::internal::ReturnAction in 58413481Sgiacomo.travaglini@arm.com// gmock-actions.h for more information. 58513481Sgiacomo.travaglini@arm.comclass FromType { 58613481Sgiacomo.travaglini@arm.com public: 58713481Sgiacomo.travaglini@arm.com explicit FromType(bool* is_converted) : converted_(is_converted) {} 58813481Sgiacomo.travaglini@arm.com bool* converted() const { return converted_; } 58913481Sgiacomo.travaglini@arm.com 59013481Sgiacomo.travaglini@arm.com private: 59113481Sgiacomo.travaglini@arm.com bool* const converted_; 59213481Sgiacomo.travaglini@arm.com 59313481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_ASSIGN_(FromType); 59413481Sgiacomo.travaglini@arm.com}; 59513481Sgiacomo.travaglini@arm.com 59613481Sgiacomo.travaglini@arm.comclass ToType { 59713481Sgiacomo.travaglini@arm.com public: 59813481Sgiacomo.travaglini@arm.com // Must allow implicit conversion due to use in ImplicitCast_<T>. 59913481Sgiacomo.travaglini@arm.com ToType(const FromType& x) { *x.converted() = true; } // NOLINT 60013481Sgiacomo.travaglini@arm.com}; 60113481Sgiacomo.travaglini@arm.com 60213481Sgiacomo.travaglini@arm.comTEST(ReturnTest, ConvertsArgumentWhenConverted) { 60313481Sgiacomo.travaglini@arm.com bool converted = false; 60413481Sgiacomo.travaglini@arm.com FromType x(&converted); 60513481Sgiacomo.travaglini@arm.com Action<ToType()> action(Return(x)); 60613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(converted) << "Return must convert its argument in its own " 60713481Sgiacomo.travaglini@arm.com << "conversion operator."; 60813481Sgiacomo.travaglini@arm.com converted = false; 60913481Sgiacomo.travaglini@arm.com action.Perform(tuple<>()); 61013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(converted) << "Action must NOT convert its argument " 61113481Sgiacomo.travaglini@arm.com << "when performed."; 61213481Sgiacomo.travaglini@arm.com} 61313481Sgiacomo.travaglini@arm.com 61413481Sgiacomo.travaglini@arm.comclass DestinationType {}; 61513481Sgiacomo.travaglini@arm.com 61613481Sgiacomo.travaglini@arm.comclass SourceType { 61713481Sgiacomo.travaglini@arm.com public: 61813481Sgiacomo.travaglini@arm.com // Note: a non-const typecast operator. 61913481Sgiacomo.travaglini@arm.com operator DestinationType() { return DestinationType(); } 62013481Sgiacomo.travaglini@arm.com}; 62113481Sgiacomo.travaglini@arm.com 62213481Sgiacomo.travaglini@arm.comTEST(ReturnTest, CanConvertArgumentUsingNonConstTypeCastOperator) { 62313481Sgiacomo.travaglini@arm.com SourceType s; 62413481Sgiacomo.travaglini@arm.com Action<DestinationType()> action(Return(s)); 62513481Sgiacomo.travaglini@arm.com} 62613481Sgiacomo.travaglini@arm.com 62713481Sgiacomo.travaglini@arm.com// Tests that ReturnNull() returns NULL in a pointer-returning function. 62813481Sgiacomo.travaglini@arm.comTEST(ReturnNullTest, WorksInPointerReturningFunction) { 62913481Sgiacomo.travaglini@arm.com const Action<int*()> a1 = ReturnNull(); 63013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(a1.Perform(make_tuple()) == NULL); 63113481Sgiacomo.travaglini@arm.com 63213481Sgiacomo.travaglini@arm.com const Action<const char*(bool)> a2 = ReturnNull(); // NOLINT 63313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(a2.Perform(make_tuple(true)) == NULL); 63413481Sgiacomo.travaglini@arm.com} 63513481Sgiacomo.travaglini@arm.com 63613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 63713481Sgiacomo.travaglini@arm.com// Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning 63813481Sgiacomo.travaglini@arm.com// functions. 63913481Sgiacomo.travaglini@arm.comTEST(ReturnNullTest, WorksInSmartPointerReturningFunction) { 64013481Sgiacomo.travaglini@arm.com const Action<std::unique_ptr<const int>()> a1 = ReturnNull(); 64113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(a1.Perform(make_tuple()) == nullptr); 64213481Sgiacomo.travaglini@arm.com 64313481Sgiacomo.travaglini@arm.com const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull(); 64413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(a2.Perform(make_tuple("foo")) == nullptr); 64513481Sgiacomo.travaglini@arm.com} 64613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_UNIQUE_PTR_ 64713481Sgiacomo.travaglini@arm.com 64813481Sgiacomo.travaglini@arm.com// Tests that ReturnRef(v) works for reference types. 64913481Sgiacomo.travaglini@arm.comTEST(ReturnRefTest, WorksForReference) { 65013481Sgiacomo.travaglini@arm.com const int n = 0; 65113481Sgiacomo.travaglini@arm.com const Action<const int&(bool)> ret = ReturnRef(n); // NOLINT 65213481Sgiacomo.travaglini@arm.com 65313481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &ret.Perform(make_tuple(true))); 65413481Sgiacomo.travaglini@arm.com} 65513481Sgiacomo.travaglini@arm.com 65613481Sgiacomo.travaglini@arm.com// Tests that ReturnRef(v) is covariant. 65713481Sgiacomo.travaglini@arm.comTEST(ReturnRefTest, IsCovariant) { 65813481Sgiacomo.travaglini@arm.com Base base; 65913481Sgiacomo.travaglini@arm.com Derived derived; 66013481Sgiacomo.travaglini@arm.com Action<Base&()> a = ReturnRef(base); 66113481Sgiacomo.travaglini@arm.com EXPECT_EQ(&base, &a.Perform(make_tuple())); 66213481Sgiacomo.travaglini@arm.com 66313481Sgiacomo.travaglini@arm.com a = ReturnRef(derived); 66413481Sgiacomo.travaglini@arm.com EXPECT_EQ(&derived, &a.Perform(make_tuple())); 66513481Sgiacomo.travaglini@arm.com} 66613481Sgiacomo.travaglini@arm.com 66713481Sgiacomo.travaglini@arm.com// Tests that ReturnRefOfCopy(v) works for reference types. 66813481Sgiacomo.travaglini@arm.comTEST(ReturnRefOfCopyTest, WorksForReference) { 66913481Sgiacomo.travaglini@arm.com int n = 42; 67013481Sgiacomo.travaglini@arm.com const Action<const int&()> ret = ReturnRefOfCopy(n); 67113481Sgiacomo.travaglini@arm.com 67213481Sgiacomo.travaglini@arm.com EXPECT_NE(&n, &ret.Perform(make_tuple())); 67313481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, ret.Perform(make_tuple())); 67413481Sgiacomo.travaglini@arm.com 67513481Sgiacomo.travaglini@arm.com n = 43; 67613481Sgiacomo.travaglini@arm.com EXPECT_NE(&n, &ret.Perform(make_tuple())); 67713481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, ret.Perform(make_tuple())); 67813481Sgiacomo.travaglini@arm.com} 67913481Sgiacomo.travaglini@arm.com 68013481Sgiacomo.travaglini@arm.com// Tests that ReturnRefOfCopy(v) is covariant. 68113481Sgiacomo.travaglini@arm.comTEST(ReturnRefOfCopyTest, IsCovariant) { 68213481Sgiacomo.travaglini@arm.com Base base; 68313481Sgiacomo.travaglini@arm.com Derived derived; 68413481Sgiacomo.travaglini@arm.com Action<Base&()> a = ReturnRefOfCopy(base); 68513481Sgiacomo.travaglini@arm.com EXPECT_NE(&base, &a.Perform(make_tuple())); 68613481Sgiacomo.travaglini@arm.com 68713481Sgiacomo.travaglini@arm.com a = ReturnRefOfCopy(derived); 68813481Sgiacomo.travaglini@arm.com EXPECT_NE(&derived, &a.Perform(make_tuple())); 68913481Sgiacomo.travaglini@arm.com} 69013481Sgiacomo.travaglini@arm.com 69113481Sgiacomo.travaglini@arm.com// Tests that DoDefault() does the default action for the mock method. 69213481Sgiacomo.travaglini@arm.com 69313481Sgiacomo.travaglini@arm.comclass MockClass { 69413481Sgiacomo.travaglini@arm.com public: 69513481Sgiacomo.travaglini@arm.com MockClass() {} 69613481Sgiacomo.travaglini@arm.com 69713481Sgiacomo.travaglini@arm.com MOCK_METHOD1(IntFunc, int(bool flag)); // NOLINT 69813481Sgiacomo.travaglini@arm.com MOCK_METHOD0(Foo, MyNonDefaultConstructible()); 69913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 70013481Sgiacomo.travaglini@arm.com MOCK_METHOD0(MakeUnique, std::unique_ptr<int>()); 70113481Sgiacomo.travaglini@arm.com MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>()); 70213481Sgiacomo.travaglini@arm.com MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>()); 70313481Sgiacomo.travaglini@arm.com#endif 70413481Sgiacomo.travaglini@arm.com 70513481Sgiacomo.travaglini@arm.com private: 70613481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(MockClass); 70713481Sgiacomo.travaglini@arm.com}; 70813481Sgiacomo.travaglini@arm.com 70913481Sgiacomo.travaglini@arm.com// Tests that DoDefault() returns the built-in default value for the 71013481Sgiacomo.travaglini@arm.com// return type by default. 71113481Sgiacomo.travaglini@arm.comTEST(DoDefaultTest, ReturnsBuiltInDefaultValueByDefault) { 71213481Sgiacomo.travaglini@arm.com MockClass mock; 71313481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, IntFunc(_)) 71413481Sgiacomo.travaglini@arm.com .WillOnce(DoDefault()); 71513481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, mock.IntFunc(true)); 71613481Sgiacomo.travaglini@arm.com} 71713481Sgiacomo.travaglini@arm.com 71813481Sgiacomo.travaglini@arm.com// Tests that DoDefault() throws (when exceptions are enabled) or aborts 71913481Sgiacomo.travaglini@arm.com// the process when there is no built-in default value for the return type. 72013481Sgiacomo.travaglini@arm.comTEST(DoDefaultDeathTest, DiesForUnknowType) { 72113481Sgiacomo.travaglini@arm.com MockClass mock; 72213481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, Foo()) 72313481Sgiacomo.travaglini@arm.com .WillRepeatedly(DoDefault()); 72413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_EXCEPTIONS 72513481Sgiacomo.travaglini@arm.com EXPECT_ANY_THROW(mock.Foo()); 72613481Sgiacomo.travaglini@arm.com#else 72713481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 72813481Sgiacomo.travaglini@arm.com mock.Foo(); 72913481Sgiacomo.travaglini@arm.com }, ""); 73013481Sgiacomo.travaglini@arm.com#endif 73113481Sgiacomo.travaglini@arm.com} 73213481Sgiacomo.travaglini@arm.com 73313481Sgiacomo.travaglini@arm.com// Tests that using DoDefault() inside a composite action leads to a 73413481Sgiacomo.travaglini@arm.com// run-time error. 73513481Sgiacomo.travaglini@arm.com 73613481Sgiacomo.travaglini@arm.comvoid VoidFunc(bool /* flag */) {} 73713481Sgiacomo.travaglini@arm.com 73813481Sgiacomo.travaglini@arm.comTEST(DoDefaultDeathTest, DiesIfUsedInCompositeAction) { 73913481Sgiacomo.travaglini@arm.com MockClass mock; 74013481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, IntFunc(_)) 74113481Sgiacomo.travaglini@arm.com .WillRepeatedly(DoAll(Invoke(VoidFunc), 74213481Sgiacomo.travaglini@arm.com DoDefault())); 74313481Sgiacomo.travaglini@arm.com 74413481Sgiacomo.travaglini@arm.com // Ideally we should verify the error message as well. Sadly, 74513481Sgiacomo.travaglini@arm.com // EXPECT_DEATH() can only capture stderr, while Google Mock's 74613481Sgiacomo.travaglini@arm.com // errors are printed on stdout. Therefore we have to settle for 74713481Sgiacomo.travaglini@arm.com // not verifying the message. 74813481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 74913481Sgiacomo.travaglini@arm.com mock.IntFunc(true); 75013481Sgiacomo.travaglini@arm.com }, ""); 75113481Sgiacomo.travaglini@arm.com} 75213481Sgiacomo.travaglini@arm.com 75313481Sgiacomo.travaglini@arm.com// Tests that DoDefault() returns the default value set by 75413481Sgiacomo.travaglini@arm.com// DefaultValue<T>::Set() when it's not overriden by an ON_CALL(). 75513481Sgiacomo.travaglini@arm.comTEST(DoDefaultTest, ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne) { 75613481Sgiacomo.travaglini@arm.com DefaultValue<int>::Set(1); 75713481Sgiacomo.travaglini@arm.com MockClass mock; 75813481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, IntFunc(_)) 75913481Sgiacomo.travaglini@arm.com .WillOnce(DoDefault()); 76013481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, mock.IntFunc(false)); 76113481Sgiacomo.travaglini@arm.com DefaultValue<int>::Clear(); 76213481Sgiacomo.travaglini@arm.com} 76313481Sgiacomo.travaglini@arm.com 76413481Sgiacomo.travaglini@arm.com// Tests that DoDefault() does the action specified by ON_CALL(). 76513481Sgiacomo.travaglini@arm.comTEST(DoDefaultTest, DoesWhatOnCallSpecifies) { 76613481Sgiacomo.travaglini@arm.com MockClass mock; 76713481Sgiacomo.travaglini@arm.com ON_CALL(mock, IntFunc(_)) 76813481Sgiacomo.travaglini@arm.com .WillByDefault(Return(2)); 76913481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, IntFunc(_)) 77013481Sgiacomo.travaglini@arm.com .WillOnce(DoDefault()); 77113481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, mock.IntFunc(false)); 77213481Sgiacomo.travaglini@arm.com} 77313481Sgiacomo.travaglini@arm.com 77413481Sgiacomo.travaglini@arm.com// Tests that using DoDefault() in ON_CALL() leads to a run-time failure. 77513481Sgiacomo.travaglini@arm.comTEST(DoDefaultTest, CannotBeUsedInOnCall) { 77613481Sgiacomo.travaglini@arm.com MockClass mock; 77713481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE({ // NOLINT 77813481Sgiacomo.travaglini@arm.com ON_CALL(mock, IntFunc(_)) 77913481Sgiacomo.travaglini@arm.com .WillByDefault(DoDefault()); 78013481Sgiacomo.travaglini@arm.com }, "DoDefault() cannot be used in ON_CALL()"); 78113481Sgiacomo.travaglini@arm.com} 78213481Sgiacomo.travaglini@arm.com 78313481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>(v) sets the variable pointed to by 78413481Sgiacomo.travaglini@arm.com// the N-th (0-based) argument to v. 78513481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, SetsTheNthPointee) { 78613481Sgiacomo.travaglini@arm.com typedef void MyFunction(bool, int*, char*); 78713481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgPointee<1>(2); 78813481Sgiacomo.travaglini@arm.com 78913481Sgiacomo.travaglini@arm.com int n = 0; 79013481Sgiacomo.travaglini@arm.com char ch = '\0'; 79113481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &n, &ch)); 79213481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, n); 79313481Sgiacomo.travaglini@arm.com EXPECT_EQ('\0', ch); 79413481Sgiacomo.travaglini@arm.com 79513481Sgiacomo.travaglini@arm.com a = SetArgPointee<2>('a'); 79613481Sgiacomo.travaglini@arm.com n = 0; 79713481Sgiacomo.travaglini@arm.com ch = '\0'; 79813481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &n, &ch)); 79913481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, n); 80013481Sgiacomo.travaglini@arm.com EXPECT_EQ('a', ch); 80113481Sgiacomo.travaglini@arm.com} 80213481Sgiacomo.travaglini@arm.com 80313481Sgiacomo.travaglini@arm.com#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN) 80413481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>() accepts a string literal. 80513481Sgiacomo.travaglini@arm.com// GCC prior to v4.0 and the Symbian compiler do not support this. 80613481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, AcceptsStringLiteral) { 80713481Sgiacomo.travaglini@arm.com typedef void MyFunction(std::string*, const char**); 80813481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgPointee<0>("hi"); 80913481Sgiacomo.travaglini@arm.com std::string str; 81013481Sgiacomo.travaglini@arm.com const char* ptr = NULL; 81113481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(&str, &ptr)); 81213481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", str); 81313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ptr == NULL); 81413481Sgiacomo.travaglini@arm.com 81513481Sgiacomo.travaglini@arm.com a = SetArgPointee<1>("world"); 81613481Sgiacomo.travaglini@arm.com str = ""; 81713481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(&str, &ptr)); 81813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", str); 81913481Sgiacomo.travaglini@arm.com EXPECT_STREQ("world", ptr); 82013481Sgiacomo.travaglini@arm.com} 82113481Sgiacomo.travaglini@arm.com 82213481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, AcceptsWideStringLiteral) { 82313481Sgiacomo.travaglini@arm.com typedef void MyFunction(const wchar_t**); 82413481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgPointee<0>(L"world"); 82513481Sgiacomo.travaglini@arm.com const wchar_t* ptr = NULL; 82613481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(&ptr)); 82713481Sgiacomo.travaglini@arm.com EXPECT_STREQ(L"world", ptr); 82813481Sgiacomo.travaglini@arm.com 82913481Sgiacomo.travaglini@arm.com# if GTEST_HAS_STD_WSTRING 83013481Sgiacomo.travaglini@arm.com 83113481Sgiacomo.travaglini@arm.com typedef void MyStringFunction(std::wstring*); 83213481Sgiacomo.travaglini@arm.com Action<MyStringFunction> a2 = SetArgPointee<0>(L"world"); 83313481Sgiacomo.travaglini@arm.com std::wstring str = L""; 83413481Sgiacomo.travaglini@arm.com a2.Perform(make_tuple(&str)); 83513481Sgiacomo.travaglini@arm.com EXPECT_EQ(L"world", str); 83613481Sgiacomo.travaglini@arm.com 83713481Sgiacomo.travaglini@arm.com# endif 83813481Sgiacomo.travaglini@arm.com} 83913481Sgiacomo.travaglini@arm.com#endif 84013481Sgiacomo.travaglini@arm.com 84113481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>() accepts a char pointer. 84213481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, AcceptsCharPointer) { 84313481Sgiacomo.travaglini@arm.com typedef void MyFunction(bool, std::string*, const char**); 84413481Sgiacomo.travaglini@arm.com const char* const hi = "hi"; 84513481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgPointee<1>(hi); 84613481Sgiacomo.travaglini@arm.com std::string str; 84713481Sgiacomo.travaglini@arm.com const char* ptr = NULL; 84813481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &str, &ptr)); 84913481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", str); 85013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ptr == NULL); 85113481Sgiacomo.travaglini@arm.com 85213481Sgiacomo.travaglini@arm.com char world_array[] = "world"; 85313481Sgiacomo.travaglini@arm.com char* const world = world_array; 85413481Sgiacomo.travaglini@arm.com a = SetArgPointee<2>(world); 85513481Sgiacomo.travaglini@arm.com str = ""; 85613481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &str, &ptr)); 85713481Sgiacomo.travaglini@arm.com EXPECT_EQ("", str); 85813481Sgiacomo.travaglini@arm.com EXPECT_EQ(world, ptr); 85913481Sgiacomo.travaglini@arm.com} 86013481Sgiacomo.travaglini@arm.com 86113481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, AcceptsWideCharPointer) { 86213481Sgiacomo.travaglini@arm.com typedef void MyFunction(bool, const wchar_t**); 86313481Sgiacomo.travaglini@arm.com const wchar_t* const hi = L"hi"; 86413481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgPointee<1>(hi); 86513481Sgiacomo.travaglini@arm.com const wchar_t* ptr = NULL; 86613481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &ptr)); 86713481Sgiacomo.travaglini@arm.com EXPECT_EQ(hi, ptr); 86813481Sgiacomo.travaglini@arm.com 86913481Sgiacomo.travaglini@arm.com# if GTEST_HAS_STD_WSTRING 87013481Sgiacomo.travaglini@arm.com 87113481Sgiacomo.travaglini@arm.com typedef void MyStringFunction(bool, std::wstring*); 87213481Sgiacomo.travaglini@arm.com wchar_t world_array[] = L"world"; 87313481Sgiacomo.travaglini@arm.com wchar_t* const world = world_array; 87413481Sgiacomo.travaglini@arm.com Action<MyStringFunction> a2 = SetArgPointee<1>(world); 87513481Sgiacomo.travaglini@arm.com std::wstring str; 87613481Sgiacomo.travaglini@arm.com a2.Perform(make_tuple(true, &str)); 87713481Sgiacomo.travaglini@arm.com EXPECT_EQ(world_array, str); 87813481Sgiacomo.travaglini@arm.com# endif 87913481Sgiacomo.travaglini@arm.com} 88013481Sgiacomo.travaglini@arm.com 88113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PROTOBUF_ 88213481Sgiacomo.travaglini@arm.com 88313481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>(proto_buffer) sets the v1 protobuf 88413481Sgiacomo.travaglini@arm.com// variable pointed to by the N-th (0-based) argument to proto_buffer. 88513481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, SetsTheNthPointeeOfProtoBufferType) { 88613481Sgiacomo.travaglini@arm.com TestMessage* const msg = new TestMessage; 88713481Sgiacomo.travaglini@arm.com msg->set_member("yes"); 88813481Sgiacomo.travaglini@arm.com TestMessage orig_msg; 88913481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 89013481Sgiacomo.travaglini@arm.com 89113481Sgiacomo.travaglini@arm.com Action<void(bool, TestMessage*)> a = SetArgPointee<1>(*msg); 89213481Sgiacomo.travaglini@arm.com // SetArgPointee<N>(proto_buffer) makes a copy of proto_buffer 89313481Sgiacomo.travaglini@arm.com // s.t. the action works even when the original proto_buffer has 89413481Sgiacomo.travaglini@arm.com // died. We ensure this behavior by deleting msg before using the 89513481Sgiacomo.travaglini@arm.com // action. 89613481Sgiacomo.travaglini@arm.com delete msg; 89713481Sgiacomo.travaglini@arm.com 89813481Sgiacomo.travaglini@arm.com TestMessage dest; 89913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(orig_msg.Equals(dest)); 90013481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &dest)); 90113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(orig_msg.Equals(dest)); 90213481Sgiacomo.travaglini@arm.com} 90313481Sgiacomo.travaglini@arm.com 90413481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>(proto_buffer) sets the 90513481Sgiacomo.travaglini@arm.com// ::ProtocolMessage variable pointed to by the N-th (0-based) 90613481Sgiacomo.travaglini@arm.com// argument to proto_buffer. 90713481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, SetsTheNthPointeeOfProtoBufferBaseType) { 90813481Sgiacomo.travaglini@arm.com TestMessage* const msg = new TestMessage; 90913481Sgiacomo.travaglini@arm.com msg->set_member("yes"); 91013481Sgiacomo.travaglini@arm.com TestMessage orig_msg; 91113481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 91213481Sgiacomo.travaglini@arm.com 91313481Sgiacomo.travaglini@arm.com Action<void(bool, ::ProtocolMessage*)> a = SetArgPointee<1>(*msg); 91413481Sgiacomo.travaglini@arm.com // SetArgPointee<N>(proto_buffer) makes a copy of proto_buffer 91513481Sgiacomo.travaglini@arm.com // s.t. the action works even when the original proto_buffer has 91613481Sgiacomo.travaglini@arm.com // died. We ensure this behavior by deleting msg before using the 91713481Sgiacomo.travaglini@arm.com // action. 91813481Sgiacomo.travaglini@arm.com delete msg; 91913481Sgiacomo.travaglini@arm.com 92013481Sgiacomo.travaglini@arm.com TestMessage dest; 92113481Sgiacomo.travaglini@arm.com ::ProtocolMessage* const dest_base = &dest; 92213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(orig_msg.Equals(dest)); 92313481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, dest_base)); 92413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(orig_msg.Equals(dest)); 92513481Sgiacomo.travaglini@arm.com} 92613481Sgiacomo.travaglini@arm.com 92713481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>(proto2_buffer) sets the v2 92813481Sgiacomo.travaglini@arm.com// protobuf variable pointed to by the N-th (0-based) argument to 92913481Sgiacomo.travaglini@arm.com// proto2_buffer. 93013481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, SetsTheNthPointeeOfProto2BufferType) { 93113481Sgiacomo.travaglini@arm.com using testing::internal::FooMessage; 93213481Sgiacomo.travaglini@arm.com FooMessage* const msg = new FooMessage; 93313481Sgiacomo.travaglini@arm.com msg->set_int_field(2); 93413481Sgiacomo.travaglini@arm.com msg->set_string_field("hi"); 93513481Sgiacomo.travaglini@arm.com FooMessage orig_msg; 93613481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 93713481Sgiacomo.travaglini@arm.com 93813481Sgiacomo.travaglini@arm.com Action<void(bool, FooMessage*)> a = SetArgPointee<1>(*msg); 93913481Sgiacomo.travaglini@arm.com // SetArgPointee<N>(proto2_buffer) makes a copy of 94013481Sgiacomo.travaglini@arm.com // proto2_buffer s.t. the action works even when the original 94113481Sgiacomo.travaglini@arm.com // proto2_buffer has died. We ensure this behavior by deleting msg 94213481Sgiacomo.travaglini@arm.com // before using the action. 94313481Sgiacomo.travaglini@arm.com delete msg; 94413481Sgiacomo.travaglini@arm.com 94513481Sgiacomo.travaglini@arm.com FooMessage dest; 94613481Sgiacomo.travaglini@arm.com dest.set_int_field(0); 94713481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &dest)); 94813481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, dest.int_field()); 94913481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", dest.string_field()); 95013481Sgiacomo.travaglini@arm.com} 95113481Sgiacomo.travaglini@arm.com 95213481Sgiacomo.travaglini@arm.com// Tests that SetArgPointee<N>(proto2_buffer) sets the 95313481Sgiacomo.travaglini@arm.com// proto2::Message variable pointed to by the N-th (0-based) argument 95413481Sgiacomo.travaglini@arm.com// to proto2_buffer. 95513481Sgiacomo.travaglini@arm.comTEST(SetArgPointeeTest, SetsTheNthPointeeOfProto2BufferBaseType) { 95613481Sgiacomo.travaglini@arm.com using testing::internal::FooMessage; 95713481Sgiacomo.travaglini@arm.com FooMessage* const msg = new FooMessage; 95813481Sgiacomo.travaglini@arm.com msg->set_int_field(2); 95913481Sgiacomo.travaglini@arm.com msg->set_string_field("hi"); 96013481Sgiacomo.travaglini@arm.com FooMessage orig_msg; 96113481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 96213481Sgiacomo.travaglini@arm.com 96313481Sgiacomo.travaglini@arm.com Action<void(bool, ::proto2::Message*)> a = SetArgPointee<1>(*msg); 96413481Sgiacomo.travaglini@arm.com // SetArgPointee<N>(proto2_buffer) makes a copy of 96513481Sgiacomo.travaglini@arm.com // proto2_buffer s.t. the action works even when the original 96613481Sgiacomo.travaglini@arm.com // proto2_buffer has died. We ensure this behavior by deleting msg 96713481Sgiacomo.travaglini@arm.com // before using the action. 96813481Sgiacomo.travaglini@arm.com delete msg; 96913481Sgiacomo.travaglini@arm.com 97013481Sgiacomo.travaglini@arm.com FooMessage dest; 97113481Sgiacomo.travaglini@arm.com dest.set_int_field(0); 97213481Sgiacomo.travaglini@arm.com ::proto2::Message* const dest_base = &dest; 97313481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, dest_base)); 97413481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, dest.int_field()); 97513481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", dest.string_field()); 97613481Sgiacomo.travaglini@arm.com} 97713481Sgiacomo.travaglini@arm.com 97813481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_PROTOBUF_ 97913481Sgiacomo.travaglini@arm.com 98013481Sgiacomo.travaglini@arm.com// Tests that SetArgumentPointee<N>(v) sets the variable pointed to by 98113481Sgiacomo.travaglini@arm.com// the N-th (0-based) argument to v. 98213481Sgiacomo.travaglini@arm.comTEST(SetArgumentPointeeTest, SetsTheNthPointee) { 98313481Sgiacomo.travaglini@arm.com typedef void MyFunction(bool, int*, char*); 98413481Sgiacomo.travaglini@arm.com Action<MyFunction> a = SetArgumentPointee<1>(2); 98513481Sgiacomo.travaglini@arm.com 98613481Sgiacomo.travaglini@arm.com int n = 0; 98713481Sgiacomo.travaglini@arm.com char ch = '\0'; 98813481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &n, &ch)); 98913481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, n); 99013481Sgiacomo.travaglini@arm.com EXPECT_EQ('\0', ch); 99113481Sgiacomo.travaglini@arm.com 99213481Sgiacomo.travaglini@arm.com a = SetArgumentPointee<2>('a'); 99313481Sgiacomo.travaglini@arm.com n = 0; 99413481Sgiacomo.travaglini@arm.com ch = '\0'; 99513481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &n, &ch)); 99613481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, n); 99713481Sgiacomo.travaglini@arm.com EXPECT_EQ('a', ch); 99813481Sgiacomo.travaglini@arm.com} 99913481Sgiacomo.travaglini@arm.com 100013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PROTOBUF_ 100113481Sgiacomo.travaglini@arm.com 100213481Sgiacomo.travaglini@arm.com// Tests that SetArgumentPointee<N>(proto_buffer) sets the v1 protobuf 100313481Sgiacomo.travaglini@arm.com// variable pointed to by the N-th (0-based) argument to proto_buffer. 100413481Sgiacomo.travaglini@arm.comTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProtoBufferType) { 100513481Sgiacomo.travaglini@arm.com TestMessage* const msg = new TestMessage; 100613481Sgiacomo.travaglini@arm.com msg->set_member("yes"); 100713481Sgiacomo.travaglini@arm.com TestMessage orig_msg; 100813481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 100913481Sgiacomo.travaglini@arm.com 101013481Sgiacomo.travaglini@arm.com Action<void(bool, TestMessage*)> a = SetArgumentPointee<1>(*msg); 101113481Sgiacomo.travaglini@arm.com // SetArgumentPointee<N>(proto_buffer) makes a copy of proto_buffer 101213481Sgiacomo.travaglini@arm.com // s.t. the action works even when the original proto_buffer has 101313481Sgiacomo.travaglini@arm.com // died. We ensure this behavior by deleting msg before using the 101413481Sgiacomo.travaglini@arm.com // action. 101513481Sgiacomo.travaglini@arm.com delete msg; 101613481Sgiacomo.travaglini@arm.com 101713481Sgiacomo.travaglini@arm.com TestMessage dest; 101813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(orig_msg.Equals(dest)); 101913481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &dest)); 102013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(orig_msg.Equals(dest)); 102113481Sgiacomo.travaglini@arm.com} 102213481Sgiacomo.travaglini@arm.com 102313481Sgiacomo.travaglini@arm.com// Tests that SetArgumentPointee<N>(proto_buffer) sets the 102413481Sgiacomo.travaglini@arm.com// ::ProtocolMessage variable pointed to by the N-th (0-based) 102513481Sgiacomo.travaglini@arm.com// argument to proto_buffer. 102613481Sgiacomo.travaglini@arm.comTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProtoBufferBaseType) { 102713481Sgiacomo.travaglini@arm.com TestMessage* const msg = new TestMessage; 102813481Sgiacomo.travaglini@arm.com msg->set_member("yes"); 102913481Sgiacomo.travaglini@arm.com TestMessage orig_msg; 103013481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 103113481Sgiacomo.travaglini@arm.com 103213481Sgiacomo.travaglini@arm.com Action<void(bool, ::ProtocolMessage*)> a = SetArgumentPointee<1>(*msg); 103313481Sgiacomo.travaglini@arm.com // SetArgumentPointee<N>(proto_buffer) makes a copy of proto_buffer 103413481Sgiacomo.travaglini@arm.com // s.t. the action works even when the original proto_buffer has 103513481Sgiacomo.travaglini@arm.com // died. We ensure this behavior by deleting msg before using the 103613481Sgiacomo.travaglini@arm.com // action. 103713481Sgiacomo.travaglini@arm.com delete msg; 103813481Sgiacomo.travaglini@arm.com 103913481Sgiacomo.travaglini@arm.com TestMessage dest; 104013481Sgiacomo.travaglini@arm.com ::ProtocolMessage* const dest_base = &dest; 104113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(orig_msg.Equals(dest)); 104213481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, dest_base)); 104313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(orig_msg.Equals(dest)); 104413481Sgiacomo.travaglini@arm.com} 104513481Sgiacomo.travaglini@arm.com 104613481Sgiacomo.travaglini@arm.com// Tests that SetArgumentPointee<N>(proto2_buffer) sets the v2 104713481Sgiacomo.travaglini@arm.com// protobuf variable pointed to by the N-th (0-based) argument to 104813481Sgiacomo.travaglini@arm.com// proto2_buffer. 104913481Sgiacomo.travaglini@arm.comTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProto2BufferType) { 105013481Sgiacomo.travaglini@arm.com using testing::internal::FooMessage; 105113481Sgiacomo.travaglini@arm.com FooMessage* const msg = new FooMessage; 105213481Sgiacomo.travaglini@arm.com msg->set_int_field(2); 105313481Sgiacomo.travaglini@arm.com msg->set_string_field("hi"); 105413481Sgiacomo.travaglini@arm.com FooMessage orig_msg; 105513481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 105613481Sgiacomo.travaglini@arm.com 105713481Sgiacomo.travaglini@arm.com Action<void(bool, FooMessage*)> a = SetArgumentPointee<1>(*msg); 105813481Sgiacomo.travaglini@arm.com // SetArgumentPointee<N>(proto2_buffer) makes a copy of 105913481Sgiacomo.travaglini@arm.com // proto2_buffer s.t. the action works even when the original 106013481Sgiacomo.travaglini@arm.com // proto2_buffer has died. We ensure this behavior by deleting msg 106113481Sgiacomo.travaglini@arm.com // before using the action. 106213481Sgiacomo.travaglini@arm.com delete msg; 106313481Sgiacomo.travaglini@arm.com 106413481Sgiacomo.travaglini@arm.com FooMessage dest; 106513481Sgiacomo.travaglini@arm.com dest.set_int_field(0); 106613481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, &dest)); 106713481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, dest.int_field()); 106813481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", dest.string_field()); 106913481Sgiacomo.travaglini@arm.com} 107013481Sgiacomo.travaglini@arm.com 107113481Sgiacomo.travaglini@arm.com// Tests that SetArgumentPointee<N>(proto2_buffer) sets the 107213481Sgiacomo.travaglini@arm.com// proto2::Message variable pointed to by the N-th (0-based) argument 107313481Sgiacomo.travaglini@arm.com// to proto2_buffer. 107413481Sgiacomo.travaglini@arm.comTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProto2BufferBaseType) { 107513481Sgiacomo.travaglini@arm.com using testing::internal::FooMessage; 107613481Sgiacomo.travaglini@arm.com FooMessage* const msg = new FooMessage; 107713481Sgiacomo.travaglini@arm.com msg->set_int_field(2); 107813481Sgiacomo.travaglini@arm.com msg->set_string_field("hi"); 107913481Sgiacomo.travaglini@arm.com FooMessage orig_msg; 108013481Sgiacomo.travaglini@arm.com orig_msg.CopyFrom(*msg); 108113481Sgiacomo.travaglini@arm.com 108213481Sgiacomo.travaglini@arm.com Action<void(bool, ::proto2::Message*)> a = SetArgumentPointee<1>(*msg); 108313481Sgiacomo.travaglini@arm.com // SetArgumentPointee<N>(proto2_buffer) makes a copy of 108413481Sgiacomo.travaglini@arm.com // proto2_buffer s.t. the action works even when the original 108513481Sgiacomo.travaglini@arm.com // proto2_buffer has died. We ensure this behavior by deleting msg 108613481Sgiacomo.travaglini@arm.com // before using the action. 108713481Sgiacomo.travaglini@arm.com delete msg; 108813481Sgiacomo.travaglini@arm.com 108913481Sgiacomo.travaglini@arm.com FooMessage dest; 109013481Sgiacomo.travaglini@arm.com dest.set_int_field(0); 109113481Sgiacomo.travaglini@arm.com ::proto2::Message* const dest_base = &dest; 109213481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(true, dest_base)); 109313481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, dest.int_field()); 109413481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi", dest.string_field()); 109513481Sgiacomo.travaglini@arm.com} 109613481Sgiacomo.travaglini@arm.com 109713481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_PROTOBUF_ 109813481Sgiacomo.travaglini@arm.com 109913481Sgiacomo.travaglini@arm.com// Sample functions and functors for testing Invoke() and etc. 110013481Sgiacomo.travaglini@arm.comint Nullary() { return 1; } 110113481Sgiacomo.travaglini@arm.com 110213481Sgiacomo.travaglini@arm.comclass NullaryFunctor { 110313481Sgiacomo.travaglini@arm.com public: 110413481Sgiacomo.travaglini@arm.com int operator()() { return 2; } 110513481Sgiacomo.travaglini@arm.com}; 110613481Sgiacomo.travaglini@arm.com 110713481Sgiacomo.travaglini@arm.combool g_done = false; 110813481Sgiacomo.travaglini@arm.comvoid VoidNullary() { g_done = true; } 110913481Sgiacomo.travaglini@arm.com 111013481Sgiacomo.travaglini@arm.comclass VoidNullaryFunctor { 111113481Sgiacomo.travaglini@arm.com public: 111213481Sgiacomo.travaglini@arm.com void operator()() { g_done = true; } 111313481Sgiacomo.travaglini@arm.com}; 111413481Sgiacomo.travaglini@arm.com 111513481Sgiacomo.travaglini@arm.comclass Foo { 111613481Sgiacomo.travaglini@arm.com public: 111713481Sgiacomo.travaglini@arm.com Foo() : value_(123) {} 111813481Sgiacomo.travaglini@arm.com 111913481Sgiacomo.travaglini@arm.com int Nullary() const { return value_; } 112013481Sgiacomo.travaglini@arm.com 112113481Sgiacomo.travaglini@arm.com private: 112213481Sgiacomo.travaglini@arm.com int value_; 112313481Sgiacomo.travaglini@arm.com}; 112413481Sgiacomo.travaglini@arm.com 112513481Sgiacomo.travaglini@arm.com// Tests InvokeWithoutArgs(function). 112613481Sgiacomo.travaglini@arm.comTEST(InvokeWithoutArgsTest, Function) { 112713481Sgiacomo.travaglini@arm.com // As an action that takes one argument. 112813481Sgiacomo.travaglini@arm.com Action<int(int)> a = InvokeWithoutArgs(Nullary); // NOLINT 112913481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, a.Perform(make_tuple(2))); 113013481Sgiacomo.travaglini@arm.com 113113481Sgiacomo.travaglini@arm.com // As an action that takes two arguments. 113213481Sgiacomo.travaglini@arm.com Action<int(int, double)> a2 = InvokeWithoutArgs(Nullary); // NOLINT 113313481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, a2.Perform(make_tuple(2, 3.5))); 113413481Sgiacomo.travaglini@arm.com 113513481Sgiacomo.travaglini@arm.com // As an action that returns void. 113613481Sgiacomo.travaglini@arm.com Action<void(int)> a3 = InvokeWithoutArgs(VoidNullary); // NOLINT 113713481Sgiacomo.travaglini@arm.com g_done = false; 113813481Sgiacomo.travaglini@arm.com a3.Perform(make_tuple(1)); 113913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(g_done); 114013481Sgiacomo.travaglini@arm.com} 114113481Sgiacomo.travaglini@arm.com 114213481Sgiacomo.travaglini@arm.com// Tests InvokeWithoutArgs(functor). 114313481Sgiacomo.travaglini@arm.comTEST(InvokeWithoutArgsTest, Functor) { 114413481Sgiacomo.travaglini@arm.com // As an action that takes no argument. 114513481Sgiacomo.travaglini@arm.com Action<int()> a = InvokeWithoutArgs(NullaryFunctor()); // NOLINT 114613481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, a.Perform(make_tuple())); 114713481Sgiacomo.travaglini@arm.com 114813481Sgiacomo.travaglini@arm.com // As an action that takes three arguments. 114913481Sgiacomo.travaglini@arm.com Action<int(int, double, char)> a2 = // NOLINT 115013481Sgiacomo.travaglini@arm.com InvokeWithoutArgs(NullaryFunctor()); 115113481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, a2.Perform(make_tuple(3, 3.5, 'a'))); 115213481Sgiacomo.travaglini@arm.com 115313481Sgiacomo.travaglini@arm.com // As an action that returns void. 115413481Sgiacomo.travaglini@arm.com Action<void()> a3 = InvokeWithoutArgs(VoidNullaryFunctor()); 115513481Sgiacomo.travaglini@arm.com g_done = false; 115613481Sgiacomo.travaglini@arm.com a3.Perform(make_tuple()); 115713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(g_done); 115813481Sgiacomo.travaglini@arm.com} 115913481Sgiacomo.travaglini@arm.com 116013481Sgiacomo.travaglini@arm.com// Tests InvokeWithoutArgs(obj_ptr, method). 116113481Sgiacomo.travaglini@arm.comTEST(InvokeWithoutArgsTest, Method) { 116213481Sgiacomo.travaglini@arm.com Foo foo; 116313481Sgiacomo.travaglini@arm.com Action<int(bool, char)> a = // NOLINT 116413481Sgiacomo.travaglini@arm.com InvokeWithoutArgs(&foo, &Foo::Nullary); 116513481Sgiacomo.travaglini@arm.com EXPECT_EQ(123, a.Perform(make_tuple(true, 'a'))); 116613481Sgiacomo.travaglini@arm.com} 116713481Sgiacomo.travaglini@arm.com 116813481Sgiacomo.travaglini@arm.com// Tests using IgnoreResult() on a polymorphic action. 116913481Sgiacomo.travaglini@arm.comTEST(IgnoreResultTest, PolymorphicAction) { 117013481Sgiacomo.travaglini@arm.com Action<void(int)> a = IgnoreResult(Return(5)); // NOLINT 117113481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(1)); 117213481Sgiacomo.travaglini@arm.com} 117313481Sgiacomo.travaglini@arm.com 117413481Sgiacomo.travaglini@arm.com// Tests using IgnoreResult() on a monomorphic action. 117513481Sgiacomo.travaglini@arm.com 117613481Sgiacomo.travaglini@arm.comint ReturnOne() { 117713481Sgiacomo.travaglini@arm.com g_done = true; 117813481Sgiacomo.travaglini@arm.com return 1; 117913481Sgiacomo.travaglini@arm.com} 118013481Sgiacomo.travaglini@arm.com 118113481Sgiacomo.travaglini@arm.comTEST(IgnoreResultTest, MonomorphicAction) { 118213481Sgiacomo.travaglini@arm.com g_done = false; 118313481Sgiacomo.travaglini@arm.com Action<void()> a = IgnoreResult(Invoke(ReturnOne)); 118413481Sgiacomo.travaglini@arm.com a.Perform(make_tuple()); 118513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(g_done); 118613481Sgiacomo.travaglini@arm.com} 118713481Sgiacomo.travaglini@arm.com 118813481Sgiacomo.travaglini@arm.com// Tests using IgnoreResult() on an action that returns a class type. 118913481Sgiacomo.travaglini@arm.com 119013481Sgiacomo.travaglini@arm.comMyNonDefaultConstructible ReturnMyNonDefaultConstructible(double /* x */) { 119113481Sgiacomo.travaglini@arm.com g_done = true; 119213481Sgiacomo.travaglini@arm.com return MyNonDefaultConstructible(42); 119313481Sgiacomo.travaglini@arm.com} 119413481Sgiacomo.travaglini@arm.com 119513481Sgiacomo.travaglini@arm.comTEST(IgnoreResultTest, ActionReturningClass) { 119613481Sgiacomo.travaglini@arm.com g_done = false; 119713481Sgiacomo.travaglini@arm.com Action<void(int)> a = 119813481Sgiacomo.travaglini@arm.com IgnoreResult(Invoke(ReturnMyNonDefaultConstructible)); // NOLINT 119913481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(2)); 120013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(g_done); 120113481Sgiacomo.travaglini@arm.com} 120213481Sgiacomo.travaglini@arm.com 120313481Sgiacomo.travaglini@arm.comTEST(AssignTest, Int) { 120413481Sgiacomo.travaglini@arm.com int x = 0; 120513481Sgiacomo.travaglini@arm.com Action<void(int)> a = Assign(&x, 5); 120613481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(0)); 120713481Sgiacomo.travaglini@arm.com EXPECT_EQ(5, x); 120813481Sgiacomo.travaglini@arm.com} 120913481Sgiacomo.travaglini@arm.com 121013481Sgiacomo.travaglini@arm.comTEST(AssignTest, String) { 121113481Sgiacomo.travaglini@arm.com ::std::string x; 121213481Sgiacomo.travaglini@arm.com Action<void(void)> a = Assign(&x, "Hello, world"); 121313481Sgiacomo.travaglini@arm.com a.Perform(make_tuple()); 121413481Sgiacomo.travaglini@arm.com EXPECT_EQ("Hello, world", x); 121513481Sgiacomo.travaglini@arm.com} 121613481Sgiacomo.travaglini@arm.com 121713481Sgiacomo.travaglini@arm.comTEST(AssignTest, CompatibleTypes) { 121813481Sgiacomo.travaglini@arm.com double x = 0; 121913481Sgiacomo.travaglini@arm.com Action<void(int)> a = Assign(&x, 5); 122013481Sgiacomo.travaglini@arm.com a.Perform(make_tuple(0)); 122113481Sgiacomo.travaglini@arm.com EXPECT_DOUBLE_EQ(5, x); 122213481Sgiacomo.travaglini@arm.com} 122313481Sgiacomo.travaglini@arm.com 122413481Sgiacomo.travaglini@arm.com#if !GTEST_OS_WINDOWS_MOBILE 122513481Sgiacomo.travaglini@arm.com 122613481Sgiacomo.travaglini@arm.comclass SetErrnoAndReturnTest : public testing::Test { 122713481Sgiacomo.travaglini@arm.com protected: 122813481Sgiacomo.travaglini@arm.com virtual void SetUp() { errno = 0; } 122913481Sgiacomo.travaglini@arm.com virtual void TearDown() { errno = 0; } 123013481Sgiacomo.travaglini@arm.com}; 123113481Sgiacomo.travaglini@arm.com 123213481Sgiacomo.travaglini@arm.comTEST_F(SetErrnoAndReturnTest, Int) { 123313481Sgiacomo.travaglini@arm.com Action<int(void)> a = SetErrnoAndReturn(ENOTTY, -5); 123413481Sgiacomo.travaglini@arm.com EXPECT_EQ(-5, a.Perform(make_tuple())); 123513481Sgiacomo.travaglini@arm.com EXPECT_EQ(ENOTTY, errno); 123613481Sgiacomo.travaglini@arm.com} 123713481Sgiacomo.travaglini@arm.com 123813481Sgiacomo.travaglini@arm.comTEST_F(SetErrnoAndReturnTest, Ptr) { 123913481Sgiacomo.travaglini@arm.com int x; 124013481Sgiacomo.travaglini@arm.com Action<int*(void)> a = SetErrnoAndReturn(ENOTTY, &x); 124113481Sgiacomo.travaglini@arm.com EXPECT_EQ(&x, a.Perform(make_tuple())); 124213481Sgiacomo.travaglini@arm.com EXPECT_EQ(ENOTTY, errno); 124313481Sgiacomo.travaglini@arm.com} 124413481Sgiacomo.travaglini@arm.com 124513481Sgiacomo.travaglini@arm.comTEST_F(SetErrnoAndReturnTest, CompatibleTypes) { 124613481Sgiacomo.travaglini@arm.com Action<double()> a = SetErrnoAndReturn(EINVAL, 5); 124713481Sgiacomo.travaglini@arm.com EXPECT_DOUBLE_EQ(5.0, a.Perform(make_tuple())); 124813481Sgiacomo.travaglini@arm.com EXPECT_EQ(EINVAL, errno); 124913481Sgiacomo.travaglini@arm.com} 125013481Sgiacomo.travaglini@arm.com 125113481Sgiacomo.travaglini@arm.com#endif // !GTEST_OS_WINDOWS_MOBILE 125213481Sgiacomo.travaglini@arm.com 125313481Sgiacomo.travaglini@arm.com// Tests ByRef(). 125413481Sgiacomo.travaglini@arm.com 125513481Sgiacomo.travaglini@arm.com// Tests that ReferenceWrapper<T> is copyable. 125613481Sgiacomo.travaglini@arm.comTEST(ByRefTest, IsCopyable) { 125713481Sgiacomo.travaglini@arm.com const std::string s1 = "Hi"; 125813481Sgiacomo.travaglini@arm.com const std::string s2 = "Hello"; 125913481Sgiacomo.travaglini@arm.com 126013481Sgiacomo.travaglini@arm.com ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper = 126113481Sgiacomo.travaglini@arm.com ByRef(s1); 126213481Sgiacomo.travaglini@arm.com const std::string& r1 = ref_wrapper; 126313481Sgiacomo.travaglini@arm.com EXPECT_EQ(&s1, &r1); 126413481Sgiacomo.travaglini@arm.com 126513481Sgiacomo.travaglini@arm.com // Assigns a new value to ref_wrapper. 126613481Sgiacomo.travaglini@arm.com ref_wrapper = ByRef(s2); 126713481Sgiacomo.travaglini@arm.com const std::string& r2 = ref_wrapper; 126813481Sgiacomo.travaglini@arm.com EXPECT_EQ(&s2, &r2); 126913481Sgiacomo.travaglini@arm.com 127013481Sgiacomo.travaglini@arm.com ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 = 127113481Sgiacomo.travaglini@arm.com ByRef(s1); 127213481Sgiacomo.travaglini@arm.com // Copies ref_wrapper1 to ref_wrapper. 127313481Sgiacomo.travaglini@arm.com ref_wrapper = ref_wrapper1; 127413481Sgiacomo.travaglini@arm.com const std::string& r3 = ref_wrapper; 127513481Sgiacomo.travaglini@arm.com EXPECT_EQ(&s1, &r3); 127613481Sgiacomo.travaglini@arm.com} 127713481Sgiacomo.travaglini@arm.com 127813481Sgiacomo.travaglini@arm.com// Tests using ByRef() on a const value. 127913481Sgiacomo.travaglini@arm.comTEST(ByRefTest, ConstValue) { 128013481Sgiacomo.travaglini@arm.com const int n = 0; 128113481Sgiacomo.travaglini@arm.com // int& ref = ByRef(n); // This shouldn't compile - we have a 128213481Sgiacomo.travaglini@arm.com // negative compilation test to catch it. 128313481Sgiacomo.travaglini@arm.com const int& const_ref = ByRef(n); 128413481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &const_ref); 128513481Sgiacomo.travaglini@arm.com} 128613481Sgiacomo.travaglini@arm.com 128713481Sgiacomo.travaglini@arm.com// Tests using ByRef() on a non-const value. 128813481Sgiacomo.travaglini@arm.comTEST(ByRefTest, NonConstValue) { 128913481Sgiacomo.travaglini@arm.com int n = 0; 129013481Sgiacomo.travaglini@arm.com 129113481Sgiacomo.travaglini@arm.com // ByRef(n) can be used as either an int&, 129213481Sgiacomo.travaglini@arm.com int& ref = ByRef(n); 129313481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &ref); 129413481Sgiacomo.travaglini@arm.com 129513481Sgiacomo.travaglini@arm.com // or a const int&. 129613481Sgiacomo.travaglini@arm.com const int& const_ref = ByRef(n); 129713481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &const_ref); 129813481Sgiacomo.travaglini@arm.com} 129913481Sgiacomo.travaglini@arm.com 130013481Sgiacomo.travaglini@arm.com// Tests explicitly specifying the type when using ByRef(). 130113481Sgiacomo.travaglini@arm.comTEST(ByRefTest, ExplicitType) { 130213481Sgiacomo.travaglini@arm.com int n = 0; 130313481Sgiacomo.travaglini@arm.com const int& r1 = ByRef<const int>(n); 130413481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, &r1); 130513481Sgiacomo.travaglini@arm.com 130613481Sgiacomo.travaglini@arm.com // ByRef<char>(n); // This shouldn't compile - we have a negative 130713481Sgiacomo.travaglini@arm.com // compilation test to catch it. 130813481Sgiacomo.travaglini@arm.com 130913481Sgiacomo.travaglini@arm.com Derived d; 131013481Sgiacomo.travaglini@arm.com Derived& r2 = ByRef<Derived>(d); 131113481Sgiacomo.travaglini@arm.com EXPECT_EQ(&d, &r2); 131213481Sgiacomo.travaglini@arm.com 131313481Sgiacomo.travaglini@arm.com const Derived& r3 = ByRef<const Derived>(d); 131413481Sgiacomo.travaglini@arm.com EXPECT_EQ(&d, &r3); 131513481Sgiacomo.travaglini@arm.com 131613481Sgiacomo.travaglini@arm.com Base& r4 = ByRef<Base>(d); 131713481Sgiacomo.travaglini@arm.com EXPECT_EQ(&d, &r4); 131813481Sgiacomo.travaglini@arm.com 131913481Sgiacomo.travaglini@arm.com const Base& r5 = ByRef<const Base>(d); 132013481Sgiacomo.travaglini@arm.com EXPECT_EQ(&d, &r5); 132113481Sgiacomo.travaglini@arm.com 132213481Sgiacomo.travaglini@arm.com // The following shouldn't compile - we have a negative compilation 132313481Sgiacomo.travaglini@arm.com // test for it. 132413481Sgiacomo.travaglini@arm.com // 132513481Sgiacomo.travaglini@arm.com // Base b; 132613481Sgiacomo.travaglini@arm.com // ByRef<Derived>(b); 132713481Sgiacomo.travaglini@arm.com} 132813481Sgiacomo.travaglini@arm.com 132913481Sgiacomo.travaglini@arm.com// Tests that Google Mock prints expression ByRef(x) as a reference to x. 133013481Sgiacomo.travaglini@arm.comTEST(ByRefTest, PrintsCorrectly) { 133113481Sgiacomo.travaglini@arm.com int n = 42; 133213481Sgiacomo.travaglini@arm.com ::std::stringstream expected, actual; 133313481Sgiacomo.travaglini@arm.com testing::internal::UniversalPrinter<const int&>::Print(n, &expected); 133413481Sgiacomo.travaglini@arm.com testing::internal::UniversalPrint(ByRef(n), &actual); 133513481Sgiacomo.travaglini@arm.com EXPECT_EQ(expected.str(), actual.str()); 133613481Sgiacomo.travaglini@arm.com} 133713481Sgiacomo.travaglini@arm.com 133813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 133913481Sgiacomo.travaglini@arm.com 134013481Sgiacomo.travaglini@arm.comstd::unique_ptr<int> UniquePtrSource() { 134113481Sgiacomo.travaglini@arm.com return std::unique_ptr<int>(new int(19)); 134213481Sgiacomo.travaglini@arm.com} 134313481Sgiacomo.travaglini@arm.com 134413481Sgiacomo.travaglini@arm.comstd::vector<std::unique_ptr<int>> VectorUniquePtrSource() { 134513481Sgiacomo.travaglini@arm.com std::vector<std::unique_ptr<int>> out; 134613481Sgiacomo.travaglini@arm.com out.emplace_back(new int(7)); 134713481Sgiacomo.travaglini@arm.com return out; 134813481Sgiacomo.travaglini@arm.com} 134913481Sgiacomo.travaglini@arm.com 135013481Sgiacomo.travaglini@arm.comTEST(MockMethodTest, CanReturnMoveOnlyValue_Return) { 135113481Sgiacomo.travaglini@arm.com MockClass mock; 135213481Sgiacomo.travaglini@arm.com std::unique_ptr<int> i(new int(19)); 135313481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeUnique()).WillOnce(Return(ByMove(std::move(i)))); 135413481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeVectorUnique()) 135513481Sgiacomo.travaglini@arm.com .WillOnce(Return(ByMove(VectorUniquePtrSource()))); 135613481Sgiacomo.travaglini@arm.com Derived* d = new Derived; 135713481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeUniqueBase()) 135813481Sgiacomo.travaglini@arm.com .WillOnce(Return(ByMove(std::unique_ptr<Derived>(d)))); 135913481Sgiacomo.travaglini@arm.com 136013481Sgiacomo.travaglini@arm.com std::unique_ptr<int> result1 = mock.MakeUnique(); 136113481Sgiacomo.travaglini@arm.com EXPECT_EQ(19, *result1); 136213481Sgiacomo.travaglini@arm.com 136313481Sgiacomo.travaglini@arm.com std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique(); 136413481Sgiacomo.travaglini@arm.com EXPECT_EQ(1u, vresult.size()); 136513481Sgiacomo.travaglini@arm.com EXPECT_NE(nullptr, vresult[0]); 136613481Sgiacomo.travaglini@arm.com EXPECT_EQ(7, *vresult[0]); 136713481Sgiacomo.travaglini@arm.com 136813481Sgiacomo.travaglini@arm.com std::unique_ptr<Base> result2 = mock.MakeUniqueBase(); 136913481Sgiacomo.travaglini@arm.com EXPECT_EQ(d, result2.get()); 137013481Sgiacomo.travaglini@arm.com} 137113481Sgiacomo.travaglini@arm.com 137213481Sgiacomo.travaglini@arm.comTEST(MockMethodTest, CanReturnMoveOnlyValue_DoAllReturn) { 137313481Sgiacomo.travaglini@arm.com testing::MockFunction<void()> mock_function; 137413481Sgiacomo.travaglini@arm.com MockClass mock; 137513481Sgiacomo.travaglini@arm.com std::unique_ptr<int> i(new int(19)); 137613481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock_function, Call()); 137713481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeUnique()).WillOnce(DoAll( 137813481Sgiacomo.travaglini@arm.com InvokeWithoutArgs(&mock_function, &testing::MockFunction<void()>::Call), 137913481Sgiacomo.travaglini@arm.com Return(ByMove(std::move(i))))); 138013481Sgiacomo.travaglini@arm.com 138113481Sgiacomo.travaglini@arm.com std::unique_ptr<int> result1 = mock.MakeUnique(); 138213481Sgiacomo.travaglini@arm.com EXPECT_EQ(19, *result1); 138313481Sgiacomo.travaglini@arm.com} 138413481Sgiacomo.travaglini@arm.com 138513481Sgiacomo.travaglini@arm.comTEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) { 138613481Sgiacomo.travaglini@arm.com MockClass mock; 138713481Sgiacomo.travaglini@arm.com 138813481Sgiacomo.travaglini@arm.com // Check default value 138913481Sgiacomo.travaglini@arm.com DefaultValue<std::unique_ptr<int>>::SetFactory([] { 139013481Sgiacomo.travaglini@arm.com return std::unique_ptr<int>(new int(42)); 139113481Sgiacomo.travaglini@arm.com }); 139213481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, *mock.MakeUnique()); 139313481Sgiacomo.travaglini@arm.com 139413481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource)); 139513481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, MakeVectorUnique()) 139613481Sgiacomo.travaglini@arm.com .WillRepeatedly(Invoke(VectorUniquePtrSource)); 139713481Sgiacomo.travaglini@arm.com std::unique_ptr<int> result1 = mock.MakeUnique(); 139813481Sgiacomo.travaglini@arm.com EXPECT_EQ(19, *result1); 139913481Sgiacomo.travaglini@arm.com std::unique_ptr<int> result2 = mock.MakeUnique(); 140013481Sgiacomo.travaglini@arm.com EXPECT_EQ(19, *result2); 140113481Sgiacomo.travaglini@arm.com EXPECT_NE(result1, result2); 140213481Sgiacomo.travaglini@arm.com 140313481Sgiacomo.travaglini@arm.com std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique(); 140413481Sgiacomo.travaglini@arm.com EXPECT_EQ(1u, vresult.size()); 140513481Sgiacomo.travaglini@arm.com EXPECT_NE(nullptr, vresult[0]); 140613481Sgiacomo.travaglini@arm.com EXPECT_EQ(7, *vresult[0]); 140713481Sgiacomo.travaglini@arm.com} 140813481Sgiacomo.travaglini@arm.com 140913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_UNIQUE_PTR_ 141013481Sgiacomo.travaglini@arm.com 141113481Sgiacomo.travaglini@arm.com} // Unnamed namespace 1412