1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc. 2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved. 3e35fdd936d133bf8a48de140a3c666897588a05shiqian// 4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without 5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are 6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met: 7e35fdd936d133bf8a48de140a3c666897588a05shiqian// 8e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions of source code must retain the above copyright 9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer. 10e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions in binary form must reproduce the above 11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer 12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the 13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution. 14e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Neither the name of Google Inc. nor the names of its 15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from 16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission. 17e35fdd936d133bf8a48de140a3c666897588a05shiqian// 18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e35fdd936d133bf8a48de140a3c666897588a05shiqian// 30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan) 31e35fdd936d133bf8a48de140a3c666897588a05shiqian 32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes. 33e35fdd936d133bf8a48de140a3c666897588a05shiqian// 34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests the built-in actions. 35e35fdd936d133bf8a48de140a3c666897588a05shiqian 3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-actions.h" 37e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <algorithm> 38e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <iterator> 39b5c81098a8ccc25e313ffca56c911200b3591ea0kosak#include <memory> 40e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string> 4153e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h" 4253e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/internal/gmock-port.h" 4353e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h" 4453e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest-spi.h" 45e35fdd936d133bf8a48de140a3c666897588a05shiqian 46e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace { 47e35fdd936d133bf8a48de140a3c666897588a05shiqian 48e35fdd936d133bf8a48de140a3c666897588a05shiqian// This list should be kept sorted. 49e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Action; 50e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ActionInterface; 51e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Assign; 523d1c78b2bff05a794b037b99766640f8f2b19855kosakusing testing::ByMove; 53a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::ByRef; 54e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DefaultValue; 55e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoDefault; 56e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::IgnoreResult; 57e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Invoke; 58e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::InvokeWithoutArgs; 59e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakePolymorphicAction; 60e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ne; 61e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::PolymorphicAction; 62e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Return; 63e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ReturnNull; 64e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ReturnRef; 65e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wanusing testing::ReturnRefOfCopy; 665921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanusing testing::SetArgPointee; 67e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::SetArgumentPointee; 68d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::_; 69d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::get; 70d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::internal::BuiltInDefaultValue; 71d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::internal::Int64; 72d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::internal::UInt64; 73d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::make_tuple; 74d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::tuple; 75d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakusing testing::tuple_element; 765b5d62f19019a398167df1f1b59279e049bf24cezhanyong.wan 77f7af24c7de14ccb10a24909a6f3440a763cb1164zhanyong.wan#if !GTEST_OS_WINDOWS_MOBILE 78e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::SetErrnoAndReturn; 79f7af24c7de14ccb10a24909a6f3440a763cb1164zhanyong.wan#endif 80e35fdd936d133bf8a48de140a3c666897588a05shiqian 8102f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan#if GTEST_HAS_PROTOBUF_ 82e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::TestMessage; 8302f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan#endif // GTEST_HAS_PROTOBUF_ 84e35fdd936d133bf8a48de140a3c666897588a05shiqian 85e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<T*>::Get() returns NULL. 86e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueTest, IsNullForPointerTypes) { 87e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(BuiltInDefaultValue<int*>::Get() == NULL); 88e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(BuiltInDefaultValue<const char*>::Get() == NULL); 89e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(BuiltInDefaultValue<void*>::Get() == NULL); 90e35fdd936d133bf8a48de140a3c666897588a05shiqian} 91e35fdd936d133bf8a48de140a3c666897588a05shiqian 925b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// Tests that BuiltInDefaultValue<T*>::Exists() return true. 935b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wanTEST(BuiltInDefaultValueTest, ExistsForPointerTypes) { 945b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<int*>::Exists()); 955b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<const char*>::Exists()); 965b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<void*>::Exists()); 975b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 985b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 99e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<T>::Get() returns 0 when T is a 100e35fdd936d133bf8a48de140a3c666897588a05shiqian// built-in numeric type. 101e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueTest, IsZeroForNumericTypes) { 10232de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<unsigned char>::Get()); 103e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<signed char>::Get()); 104e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<char>::Get()); 10595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if GMOCK_HAS_SIGNED_WCHAR_T_ 10632de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<unsigned wchar_t>::Get()); 107e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<signed wchar_t>::Get()); 10895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif 10995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if GMOCK_WCHAR_T_IS_NATIVE_ 110e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<wchar_t>::Get()); 11195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif 11232de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<unsigned short>::Get()); // NOLINT 113e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<signed short>::Get()); // NOLINT 114e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<short>::Get()); // NOLINT 11532de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<unsigned int>::Get()); 116e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<signed int>::Get()); 117e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<int>::Get()); 11832de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long>::Get()); // NOLINT 119e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<signed long>::Get()); // NOLINT 120e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<long>::Get()); // NOLINT 12132de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(0U, BuiltInDefaultValue<UInt64>::Get()); 122e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<Int64>::Get()); 123e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<float>::Get()); 124e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<double>::Get()); 125e35fdd936d133bf8a48de140a3c666897588a05shiqian} 126e35fdd936d133bf8a48de140a3c666897588a05shiqian 1275b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a 1285b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// built-in numeric type. 1295b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wanTEST(BuiltInDefaultValueTest, ExistsForNumericTypes) { 1305b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<unsigned char>::Exists()); 1315b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<signed char>::Exists()); 1325b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<char>::Exists()); 13395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if GMOCK_HAS_SIGNED_WCHAR_T_ 1345b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<unsigned wchar_t>::Exists()); 1355b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<signed wchar_t>::Exists()); 13695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif 13795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if GMOCK_WCHAR_T_IS_NATIVE_ 1385b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<wchar_t>::Exists()); 13995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif 1405b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<unsigned short>::Exists()); // NOLINT 1415b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<signed short>::Exists()); // NOLINT 1425b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<short>::Exists()); // NOLINT 1435b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<unsigned int>::Exists()); 1445b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<signed int>::Exists()); 1455b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<int>::Exists()); 1465b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<unsigned long>::Exists()); // NOLINT 1475b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<signed long>::Exists()); // NOLINT 1485b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<long>::Exists()); // NOLINT 1495b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<UInt64>::Exists()); 1505b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<Int64>::Exists()); 1515b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<float>::Exists()); 1525b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<double>::Exists()); 1535b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 1545b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 155e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<bool>::Get() returns false. 156e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueTest, IsFalseForBool) { 157e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(BuiltInDefaultValue<bool>::Get()); 158e35fdd936d133bf8a48de140a3c666897588a05shiqian} 159e35fdd936d133bf8a48de140a3c666897588a05shiqian 1605b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// Tests that BuiltInDefaultValue<bool>::Exists() returns true. 1615b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wanTEST(BuiltInDefaultValueTest, BoolExists) { 1625b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue<bool>::Exists()); 1635b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 1645b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 165e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<T>::Get() returns "" when T is a 166e35fdd936d133bf8a48de140a3c666897588a05shiqian// string type. 167e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueTest, IsEmptyStringForString) { 168e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_STRING 169e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", BuiltInDefaultValue< ::string>::Get()); 170e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_GLOBAL_STRING 171e35fdd936d133bf8a48de140a3c666897588a05shiqian 172e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", BuiltInDefaultValue< ::std::string>::Get()); 173e35fdd936d133bf8a48de140a3c666897588a05shiqian} 174e35fdd936d133bf8a48de140a3c666897588a05shiqian 1755b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a 1765b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// string type. 1775b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wanTEST(BuiltInDefaultValueTest, ExistsForString) { 1785b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan#if GTEST_HAS_GLOBAL_STRING 1795b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue< ::string>::Exists()); 1805b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan#endif // GTEST_HAS_GLOBAL_STRING 1815b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 1825b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(BuiltInDefaultValue< ::std::string>::Exists()); 1835b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 1845b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 185e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<const T>::Get() returns the same 186e35fdd936d133bf8a48de140a3c666897588a05shiqian// value as BuiltInDefaultValue<T>::Get() does. 187e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueTest, WorksForConstTypes) { 188e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", BuiltInDefaultValue<const std::string>::Get()); 189e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, BuiltInDefaultValue<const int>::Get()); 190e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(BuiltInDefaultValue<char* const>::Get() == NULL); 191e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(BuiltInDefaultValue<const bool>::Get()); 192e35fdd936d133bf8a48de140a3c666897588a05shiqian} 193e35fdd936d133bf8a48de140a3c666897588a05shiqian 194d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak// A type that's default constructible. 195d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakclass MyDefaultConstructible { 196d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak public: 197d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak MyDefaultConstructible() : value_(42) {} 198d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 199d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak int value() const { return value_; } 200e35fdd936d133bf8a48de140a3c666897588a05shiqian 201d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak private: 202d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak int value_; 203e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 204e35fdd936d133bf8a48de140a3c666897588a05shiqian 205d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak// A type that's not default constructible. 206d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakclass MyNonDefaultConstructible { 207d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak public: 208d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak // Does not have a default ctor. 209d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak explicit MyNonDefaultConstructible(int a_value) : value_(a_value) {} 210d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 211d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak int value() const { return value_; } 212d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 213d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak private: 214d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak int value_; 215d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak}; 216d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 217a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#if GTEST_HAS_STD_TYPE_TRAITS_ 218d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 219d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakTEST(BuiltInDefaultValueTest, ExistsForDefaultConstructibleType) { 220d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_TRUE(BuiltInDefaultValue<MyDefaultConstructible>::Exists()); 221d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak} 222d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 223d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakTEST(BuiltInDefaultValueTest, IsDefaultConstructedForDefaultConstructibleType) { 224d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_EQ(42, BuiltInDefaultValue<MyDefaultConstructible>::Get().value()); 225d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak} 226d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 227a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#endif // GTEST_HAS_STD_TYPE_TRAITS_ 228d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak 229d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakTEST(BuiltInDefaultValueTest, DoesNotExistForNonDefaultConstructibleType) { 230d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(BuiltInDefaultValue<MyNonDefaultConstructible>::Exists()); 2315b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 2325b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 233e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that BuiltInDefaultValue<T&>::Get() aborts the program. 234e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(BuiltInDefaultValueDeathTest, IsUndefinedForReferences) { 23504d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 236e35fdd936d133bf8a48de140a3c666897588a05shiqian BuiltInDefaultValue<int&>::Get(); 237e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 23804d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 239e35fdd936d133bf8a48de140a3c666897588a05shiqian BuiltInDefaultValue<const char&>::Get(); 240e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 241e35fdd936d133bf8a48de140a3c666897588a05shiqian} 242e35fdd936d133bf8a48de140a3c666897588a05shiqian 243d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakTEST(BuiltInDefaultValueDeathTest, IsUndefinedForNonDefaultConstructibleType) { 24404d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 245d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak BuiltInDefaultValue<MyNonDefaultConstructible>::Get(); 246e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 247e35fdd936d133bf8a48de140a3c666897588a05shiqian} 248e35fdd936d133bf8a48de140a3c666897588a05shiqian 249e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T>::IsSet() is false initially. 250e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueTest, IsInitiallyUnset) { 251e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<int>::IsSet()); 252d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyDefaultConstructible>::IsSet()); 253d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet()); 254e35fdd936d133bf8a48de140a3c666897588a05shiqian} 255e35fdd936d133bf8a48de140a3c666897588a05shiqian 256e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T> can be set and then unset. 257e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueTest, CanBeSetAndUnset) { 2585b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(DefaultValue<int>::Exists()); 259d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 2605b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 261e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<int>::Set(1); 262d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<const MyNonDefaultConstructible>::Set( 263d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak MyNonDefaultConstructible(42)); 264e35fdd936d133bf8a48de140a3c666897588a05shiqian 265e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, DefaultValue<int>::Get()); 266d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_EQ(42, DefaultValue<const MyNonDefaultConstructible>::Get().value()); 267e35fdd936d133bf8a48de140a3c666897588a05shiqian 2685b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(DefaultValue<int>::Exists()); 269d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_TRUE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 2705b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 271e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<int>::Clear(); 272d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<const MyNonDefaultConstructible>::Clear(); 273e35fdd936d133bf8a48de140a3c666897588a05shiqian 274e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<int>::IsSet()); 275d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet()); 2765b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 2775b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(DefaultValue<int>::Exists()); 278d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists()); 279e35fdd936d133bf8a48de140a3c666897588a05shiqian} 280e35fdd936d133bf8a48de140a3c666897588a05shiqian 281e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T>::Get() returns the 282e35fdd936d133bf8a48de140a3c666897588a05shiqian// BuiltInDefaultValue<T>::Get() when DefaultValue<T>::IsSet() is 283e35fdd936d133bf8a48de140a3c666897588a05shiqian// false. 284e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) { 285e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<int>::IsSet()); 2865b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(DefaultValue<int>::Exists()); 287d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::IsSet()); 288d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::Exists()); 289e35fdd936d133bf8a48de140a3c666897588a05shiqian 290e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, DefaultValue<int>::Get()); 291e35fdd936d133bf8a48de140a3c666897588a05shiqian 29204d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 293d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<MyNonDefaultConstructible>::Get(); 294e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 295e35fdd936d133bf8a48de140a3c666897588a05shiqian} 296e35fdd936d133bf8a48de140a3c666897588a05shiqian 2975b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_UNIQUE_PTR_ 298d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakTEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) { 299d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists()); 300d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == NULL); 301b5c81098a8ccc25e313ffca56c911200b3591ea0kosak DefaultValue<std::unique_ptr<int>>::SetFactory([] { 302b5c81098a8ccc25e313ffca56c911200b3591ea0kosak return std::unique_ptr<int>(new int(42)); 303b5c81098a8ccc25e313ffca56c911200b3591ea0kosak }); 304b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists()); 305b5c81098a8ccc25e313ffca56c911200b3591ea0kosak std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get(); 306b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_EQ(42, *i); 307b5c81098a8ccc25e313ffca56c911200b3591ea0kosak} 3085b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#endif // GTEST_HAS_STD_UNIQUE_PTR_ 309b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 310e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<void>::Get() returns void. 311e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueTest, GetWorksForVoid) { 312e35fdd936d133bf8a48de140a3c666897588a05shiqian return DefaultValue<void>::Get(); 313e35fdd936d133bf8a48de140a3c666897588a05shiqian} 314e35fdd936d133bf8a48de140a3c666897588a05shiqian 315e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using DefaultValue with a reference type. 316e35fdd936d133bf8a48de140a3c666897588a05shiqian 317e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T&>::IsSet() is false initially. 318e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueOfReferenceTest, IsInitiallyUnset) { 319e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<int&>::IsSet()); 320d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::IsSet()); 321d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 322e35fdd936d133bf8a48de140a3c666897588a05shiqian} 323e35fdd936d133bf8a48de140a3c666897588a05shiqian 3245b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan// Tests that DefaultValue<T&>::Exists is false initiallly. 3255b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wanTEST(DefaultValueOfReferenceTest, IsInitiallyNotExisting) { 3265b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_FALSE(DefaultValue<int&>::Exists()); 327d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::Exists()); 328d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 3295b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan} 3305b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 331e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T&> can be set and then unset. 332e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueOfReferenceTest, CanBeSetAndUnset) { 333e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 1; 334e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<const int&>::Set(n); 335d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak MyNonDefaultConstructible x(42); 336d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<MyNonDefaultConstructible&>::Set(x); 337e35fdd936d133bf8a48de140a3c666897588a05shiqian 3385b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_TRUE(DefaultValue<const int&>::Exists()); 339d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_TRUE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 3405b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 341e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&n, &(DefaultValue<const int&>::Get())); 342d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_EQ(&x, &(DefaultValue<MyNonDefaultConstructible&>::Get())); 343e35fdd936d133bf8a48de140a3c666897588a05shiqian 344e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<const int&>::Clear(); 345d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<MyNonDefaultConstructible&>::Clear(); 346e35fdd936d133bf8a48de140a3c666897588a05shiqian 3475b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan EXPECT_FALSE(DefaultValue<const int&>::Exists()); 348d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists()); 3495b95fa7b16023c1e1ab0b00f7ce73a2d46a95911zhanyong.wan 350e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<const int&>::IsSet()); 351d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 352e35fdd936d133bf8a48de140a3c666897588a05shiqian} 353e35fdd936d133bf8a48de140a3c666897588a05shiqian 354e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DefaultValue<T&>::Get() returns the 355e35fdd936d133bf8a48de140a3c666897588a05shiqian// BuiltInDefaultValue<T&>::Get() when DefaultValue<T&>::IsSet() is 356e35fdd936d133bf8a48de140a3c666897588a05shiqian// false. 357e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DefaultValueOfReferenceDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) { 358e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(DefaultValue<int&>::IsSet()); 359d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet()); 360e35fdd936d133bf8a48de140a3c666897588a05shiqian 36104d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 362e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<int&>::Get(); 363e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 36404d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 365d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak DefaultValue<MyNonDefaultConstructible>::Get(); 366e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 367e35fdd936d133bf8a48de140a3c666897588a05shiqian} 368e35fdd936d133bf8a48de140a3c666897588a05shiqian 369e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ActionInterface can be implemented by defining the 370e35fdd936d133bf8a48de140a3c666897588a05shiqian// Perform method. 371e35fdd936d133bf8a48de140a3c666897588a05shiqian 372a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wantypedef int MyGlobalFunction(bool, int); 373e35fdd936d133bf8a48de140a3c666897588a05shiqian 374a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wanclass MyActionImpl : public ActionInterface<MyGlobalFunction> { 375e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 376e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual int Perform(const tuple<bool, int>& args) { 377e35fdd936d133bf8a48de140a3c666897588a05shiqian return get<0>(args) ? get<1>(args) : 0; 378e35fdd936d133bf8a48de140a3c666897588a05shiqian } 379e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 380e35fdd936d133bf8a48de140a3c666897588a05shiqian 381e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionInterfaceTest, CanBeImplementedByDefiningPerform) { 382e35fdd936d133bf8a48de140a3c666897588a05shiqian MyActionImpl my_action_impl; 383ed6c9277bb12f2808bb812ae8f91492dac9517b4zhanyong.wan (void)my_action_impl; 384e35fdd936d133bf8a48de140a3c666897588a05shiqian} 385e35fdd936d133bf8a48de140a3c666897588a05shiqian 386e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionInterfaceTest, MakeAction) { 387a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wan Action<MyGlobalFunction> action = MakeAction(new MyActionImpl); 388e35fdd936d133bf8a48de140a3c666897588a05shiqian 389e35fdd936d133bf8a48de140a3c666897588a05shiqian // When exercising the Perform() method of Action<F>, we must pass 390e35fdd936d133bf8a48de140a3c666897588a05shiqian // it a tuple whose size and type are compatible with F's argument 391e35fdd936d133bf8a48de140a3c666897588a05shiqian // types. For example, if F is int(), then Perform() takes a 392e35fdd936d133bf8a48de140a3c666897588a05shiqian // 0-tuple; if F is void(bool, int), then Perform() takes a 393e35fdd936d133bf8a48de140a3c666897588a05shiqian // tuple<bool, int>, and so on. 394e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, action.Perform(make_tuple(true, 5))); 395e35fdd936d133bf8a48de140a3c666897588a05shiqian} 396e35fdd936d133bf8a48de140a3c666897588a05shiqian 397e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Action<F> can be contructed from a pointer to 398e35fdd936d133bf8a48de140a3c666897588a05shiqian// ActionInterface<F>. 399e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionTest, CanBeConstructedFromActionInterface) { 400a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wan Action<MyGlobalFunction> action(new MyActionImpl); 401e35fdd936d133bf8a48de140a3c666897588a05shiqian} 402e35fdd936d133bf8a48de140a3c666897588a05shiqian 403e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Action<F> delegates actual work to ActionInterface<F>. 404e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionTest, DelegatesWorkToActionInterface) { 405a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wan const Action<MyGlobalFunction> action(new MyActionImpl); 406e35fdd936d133bf8a48de140a3c666897588a05shiqian 407e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, action.Perform(make_tuple(true, 5))); 408e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, action.Perform(make_tuple(false, 1))); 409e35fdd936d133bf8a48de140a3c666897588a05shiqian} 410e35fdd936d133bf8a48de140a3c666897588a05shiqian 411e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Action<F> can be copied. 412e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionTest, IsCopyable) { 413a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wan Action<MyGlobalFunction> a1(new MyActionImpl); 414a1a98f840e25692ddcb0ca872aaf8362a2b4e088zhanyong.wan Action<MyGlobalFunction> a2(a1); // Tests the copy constructor. 415e35fdd936d133bf8a48de140a3c666897588a05shiqian 416e35fdd936d133bf8a48de140a3c666897588a05shiqian // a1 should continue to work after being copied from. 417e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, a1.Perform(make_tuple(true, 5))); 418e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a1.Perform(make_tuple(false, 1))); 419e35fdd936d133bf8a48de140a3c666897588a05shiqian 420e35fdd936d133bf8a48de140a3c666897588a05shiqian // a2 should work like the action it was copied from. 421e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, a2.Perform(make_tuple(true, 5))); 422e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a2.Perform(make_tuple(false, 1))); 423e35fdd936d133bf8a48de140a3c666897588a05shiqian 424e35fdd936d133bf8a48de140a3c666897588a05shiqian a2 = a1; // Tests the assignment operator. 425e35fdd936d133bf8a48de140a3c666897588a05shiqian 426e35fdd936d133bf8a48de140a3c666897588a05shiqian // a1 should continue to work after being copied from. 427e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, a1.Perform(make_tuple(true, 5))); 428e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a1.Perform(make_tuple(false, 1))); 429e35fdd936d133bf8a48de140a3c666897588a05shiqian 430e35fdd936d133bf8a48de140a3c666897588a05shiqian // a2 should work like the action it was copied from. 431e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, a2.Perform(make_tuple(true, 5))); 432e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a2.Perform(make_tuple(false, 1))); 433e35fdd936d133bf8a48de140a3c666897588a05shiqian} 434e35fdd936d133bf8a48de140a3c666897588a05shiqian 435e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that an Action<From> object can be converted to a 436e35fdd936d133bf8a48de140a3c666897588a05shiqian// compatible Action<To> object. 437e35fdd936d133bf8a48de140a3c666897588a05shiqian 438e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IsNotZero : public ActionInterface<bool(int)> { // NOLINT 439e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 440e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual bool Perform(const tuple<int>& arg) { 441e35fdd936d133bf8a48de140a3c666897588a05shiqian return get<0>(arg) != 0; 442e35fdd936d133bf8a48de140a3c666897588a05shiqian } 443e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 444e35fdd936d133bf8a48de140a3c666897588a05shiqian 44595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN 44695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Compiling this test on Nokia's Symbian compiler fails with: 44795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// 'Result' is not a member of class 'testing::internal::Function<int>' 44895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// (point of instantiation: '@unnamed@gmock_actions_test_cc@:: 44995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// ActionTest_CanBeConvertedToOtherActionType_Test::TestBody()') 45095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// with no obvious fix. 451e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ActionTest, CanBeConvertedToOtherActionType) { 452e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<bool(int)> a1(new IsNotZero); // NOLINT 453e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<int(char)> a2 = Action<int(char)>(a1); // NOLINT 454e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, a2.Perform(make_tuple('a'))); 455e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a2.Perform(make_tuple('\0'))); 456e35fdd936d133bf8a48de140a3c666897588a05shiqian} 45795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif // !GTEST_OS_SYMBIAN 458e35fdd936d133bf8a48de140a3c666897588a05shiqian 459e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two classes are for testing MakePolymorphicAction(). 460e35fdd936d133bf8a48de140a3c666897588a05shiqian 461e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a polymorphic action that returns the second of the 462e35fdd936d133bf8a48de140a3c666897588a05shiqian// arguments it receives. 463e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReturnSecondArgumentAction { 464e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 465e35fdd936d133bf8a48de140a3c666897588a05shiqian // We want to verify that MakePolymorphicAction() can work with a 466e35fdd936d133bf8a48de140a3c666897588a05shiqian // polymorphic action whose Perform() method template is either 467e35fdd936d133bf8a48de140a3c666897588a05shiqian // const or not. This lets us verify the non-const case. 468e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Result, typename ArgumentTuple> 469e35fdd936d133bf8a48de140a3c666897588a05shiqian Result Perform(const ArgumentTuple& args) { return get<1>(args); } 470e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 471e35fdd936d133bf8a48de140a3c666897588a05shiqian 472e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a polymorphic action that can be used in a nullary 473e35fdd936d133bf8a48de140a3c666897588a05shiqian// function to return 0. 474e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReturnZeroFromNullaryFunctionAction { 475e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 476e35fdd936d133bf8a48de140a3c666897588a05shiqian // For testing that MakePolymorphicAction() works when the 477e35fdd936d133bf8a48de140a3c666897588a05shiqian // implementation class' Perform() method template takes only one 478e35fdd936d133bf8a48de140a3c666897588a05shiqian // template parameter. 479e35fdd936d133bf8a48de140a3c666897588a05shiqian // 480e35fdd936d133bf8a48de140a3c666897588a05shiqian // We want to verify that MakePolymorphicAction() can work with a 481e35fdd936d133bf8a48de140a3c666897588a05shiqian // polymorphic action whose Perform() method template is either 482e35fdd936d133bf8a48de140a3c666897588a05shiqian // const or not. This lets us verify the const case. 483e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Result> 484e35fdd936d133bf8a48de140a3c666897588a05shiqian Result Perform(const tuple<>&) const { return 0; } 485e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 486e35fdd936d133bf8a48de140a3c666897588a05shiqian 487e35fdd936d133bf8a48de140a3c666897588a05shiqian// These functions verify that MakePolymorphicAction() returns a 488e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicAction<T> where T is the argument's type. 489e35fdd936d133bf8a48de140a3c666897588a05shiqian 490e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() { 491e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicAction(ReturnSecondArgumentAction()); 492e35fdd936d133bf8a48de140a3c666897588a05shiqian} 493e35fdd936d133bf8a48de140a3c666897588a05shiqian 494e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicAction<ReturnZeroFromNullaryFunctionAction> 495e35fdd936d133bf8a48de140a3c666897588a05shiqianReturnZeroFromNullaryFunction() { 496e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicAction(ReturnZeroFromNullaryFunctionAction()); 497e35fdd936d133bf8a48de140a3c666897588a05shiqian} 498e35fdd936d133bf8a48de140a3c666897588a05shiqian 499e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakePolymorphicAction() turns a polymorphic action 500e35fdd936d133bf8a48de140a3c666897588a05shiqian// implementation class into a polymorphic action. 501e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakePolymorphicActionTest, ConstructsActionFromImpl) { 502e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(bool, int, double)> a1 = ReturnSecondArgument(); // NOLINT 503e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, a1.Perform(make_tuple(false, 5, 2.0))); 504e35fdd936d133bf8a48de140a3c666897588a05shiqian} 505e35fdd936d133bf8a48de140a3c666897588a05shiqian 506e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakePolymorphicAction() works when the implementation 507e35fdd936d133bf8a48de140a3c666897588a05shiqian// class' Perform() method template has only one template parameter. 508e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakePolymorphicActionTest, WorksWhenPerformHasOneTemplateParameter) { 509e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int()> a1 = ReturnZeroFromNullaryFunction(); 510e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, a1.Perform(make_tuple())); 511e35fdd936d133bf8a48de140a3c666897588a05shiqian 512e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void*()> a2 = ReturnZeroFromNullaryFunction(); 513e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a2.Perform(make_tuple()) == NULL); 514e35fdd936d133bf8a48de140a3c666897588a05shiqian} 515e35fdd936d133bf8a48de140a3c666897588a05shiqian 516e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Return() works as an action for void-returning 517e35fdd936d133bf8a48de140a3c666897588a05shiqian// functions. 518e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnTest, WorksForVoid) { 519e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<void(int)> ret = Return(); // NOLINT 520e35fdd936d133bf8a48de140a3c666897588a05shiqian return ret.Perform(make_tuple(1)); 521e35fdd936d133bf8a48de140a3c666897588a05shiqian} 522e35fdd936d133bf8a48de140a3c666897588a05shiqian 523e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Return(v) returns v. 524e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnTest, ReturnsGivenValue) { 525e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int()> ret = Return(1); // NOLINT 526e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, ret.Perform(make_tuple())); 527e35fdd936d133bf8a48de140a3c666897588a05shiqian 528e35fdd936d133bf8a48de140a3c666897588a05shiqian ret = Return(-5); 529e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(-5, ret.Perform(make_tuple())); 530e35fdd936d133bf8a48de140a3c666897588a05shiqian} 531e35fdd936d133bf8a48de140a3c666897588a05shiqian 532e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Return("string literal") works. 533e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnTest, AcceptsStringLiteral) { 534e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<const char*()> a1 = Return("Hello"); 535e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_STREQ("Hello", a1.Perform(make_tuple())); 536e35fdd936d133bf8a48de140a3c666897588a05shiqian 537e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<std::string()> a2 = Return("world"); 538e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("world", a2.Perform(make_tuple())); 539e35fdd936d133bf8a48de140a3c666897588a05shiqian} 540e35fdd936d133bf8a48de140a3c666897588a05shiqian 5417123d831328321e854b78047effe7a57192a764fkosak// Test struct which wraps a vector of integers. Used in 5427123d831328321e854b78047effe7a57192a764fkosak// 'SupportsWrapperReturnType' test. 5437123d831328321e854b78047effe7a57192a764fkosakstruct IntegerVectorWrapper { 5447123d831328321e854b78047effe7a57192a764fkosak std::vector<int> * v; 5457123d831328321e854b78047effe7a57192a764fkosak IntegerVectorWrapper(std::vector<int>& _v) : v(&_v) {} // NOLINT 5467123d831328321e854b78047effe7a57192a764fkosak}; 5477123d831328321e854b78047effe7a57192a764fkosak 5487123d831328321e854b78047effe7a57192a764fkosak// Tests that Return() works when return type is a wrapper type. 5497123d831328321e854b78047effe7a57192a764fkosakTEST(ReturnTest, SupportsWrapperReturnType) { 5507123d831328321e854b78047effe7a57192a764fkosak // Initialize vector of integers. 5517123d831328321e854b78047effe7a57192a764fkosak std::vector<int> v; 5527123d831328321e854b78047effe7a57192a764fkosak for (int i = 0; i < 5; ++i) v.push_back(i); 5537123d831328321e854b78047effe7a57192a764fkosak 5547123d831328321e854b78047effe7a57192a764fkosak // Return() called with 'v' as argument. The Action will return the same data 5557123d831328321e854b78047effe7a57192a764fkosak // as 'v' (copy) but it will be wrapped in an IntegerVectorWrapper. 5567123d831328321e854b78047effe7a57192a764fkosak Action<IntegerVectorWrapper()> a = Return(v); 5577123d831328321e854b78047effe7a57192a764fkosak const std::vector<int>& result = *(a.Perform(make_tuple()).v); 5587123d831328321e854b78047effe7a57192a764fkosak EXPECT_THAT(result, ::testing::ElementsAre(0, 1, 2, 3, 4)); 5597123d831328321e854b78047effe7a57192a764fkosak} 5607123d831328321e854b78047effe7a57192a764fkosak 561e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Return(v) is covaraint. 562e35fdd936d133bf8a48de140a3c666897588a05shiqian 563e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Base { 564e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator==(const Base&) { return true; } 565e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 566e35fdd936d133bf8a48de140a3c666897588a05shiqian 567e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Derived : public Base { 568e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator==(const Derived&) { return true; } 569e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 570e35fdd936d133bf8a48de140a3c666897588a05shiqian 571e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnTest, IsCovariant) { 572e35fdd936d133bf8a48de140a3c666897588a05shiqian Base base; 573e35fdd936d133bf8a48de140a3c666897588a05shiqian Derived derived; 574e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<Base*()> ret = Return(&base); 575e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&base, ret.Perform(make_tuple())); 576e35fdd936d133bf8a48de140a3c666897588a05shiqian 577e35fdd936d133bf8a48de140a3c666897588a05shiqian ret = Return(&derived); 578e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&derived, ret.Perform(make_tuple())); 579e35fdd936d133bf8a48de140a3c666897588a05shiqian} 580e35fdd936d133bf8a48de140a3c666897588a05shiqian 581a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev// Tests that the type of the value passed into Return is converted into T 582a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev// when the action is cast to Action<T(...)> rather than when the action is 583a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev// performed. See comments on testing::internal::ReturnAction in 584a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev// gmock-actions.h for more information. 585a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevclass FromType { 586a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev public: 58779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm explicit FromType(bool* is_converted) : converted_(is_converted) {} 588a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev bool* converted() const { return converted_; } 589a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 590a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev private: 591a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev bool* const converted_; 59232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 59332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(FromType); 594a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev}; 595a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 596a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevclass ToType { 597a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev public: 59879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // Must allow implicit conversion due to use in ImplicitCast_<T>. 59979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ToType(const FromType& x) { *x.converted() = true; } // NOLINT 600a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev}; 601a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 602a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevTEST(ReturnTest, ConvertsArgumentWhenConverted) { 603a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev bool converted = false; 604a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev FromType x(&converted); 605a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev Action<ToType()> action(Return(x)); 606a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev EXPECT_TRUE(converted) << "Return must convert its argument in its own " 607a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev << "conversion operator."; 608a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev converted = false; 609a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev action.Perform(tuple<>()); 610a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev EXPECT_FALSE(converted) << "Action must NOT convert its argument " 61179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm << "when performed."; 612a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev} 613a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 614a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevclass DestinationType {}; 615a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 616a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevclass SourceType { 617a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev public: 618a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev // Note: a non-const typecast operator. 619a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev operator DestinationType() { return DestinationType(); } 620a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev}; 621a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 622a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosevTEST(ReturnTest, CanConvertArgumentUsingNonConstTypeCastOperator) { 623a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev SourceType s; 624a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev Action<DestinationType()> action(Return(s)); 625a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev} 626a070cbd91c2a8bfe7caed64e31387312a1c5df5avladlosev 627e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ReturnNull() returns NULL in a pointer-returning function. 628e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnNullTest, WorksInPointerReturningFunction) { 629e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<int*()> a1 = ReturnNull(); 630e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a1.Perform(make_tuple()) == NULL); 631e35fdd936d133bf8a48de140a3c666897588a05shiqian 632e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<const char*(bool)> a2 = ReturnNull(); // NOLINT 633e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a2.Perform(make_tuple(true)) == NULL); 634e35fdd936d133bf8a48de140a3c666897588a05shiqian} 635e35fdd936d133bf8a48de140a3c666897588a05shiqian 63653d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak#if GTEST_HAS_STD_UNIQUE_PTR_ 63753d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak// Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning 63853d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak// functions. 63953d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosakTEST(ReturnNullTest, WorksInSmartPointerReturningFunction) { 64053d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak const Action<std::unique_ptr<const int>()> a1 = ReturnNull(); 64153d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak EXPECT_TRUE(a1.Perform(make_tuple()) == nullptr); 64253d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak 64353d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull(); 64453d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak EXPECT_TRUE(a2.Perform(make_tuple("foo")) == nullptr); 64553d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak} 64653d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak#endif // GTEST_HAS_STD_UNIQUE_PTR_ 64753d49dc43ea3f34a61f4a017d33ac5a0b650a68dkosak 648e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ReturnRef(v) works for reference types. 649e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnRefTest, WorksForReference) { 650e35fdd936d133bf8a48de140a3c666897588a05shiqian const int n = 0; 651e35fdd936d133bf8a48de140a3c666897588a05shiqian const Action<const int&(bool)> ret = ReturnRef(n); // NOLINT 652e35fdd936d133bf8a48de140a3c666897588a05shiqian 653e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&n, &ret.Perform(make_tuple(true))); 654e35fdd936d133bf8a48de140a3c666897588a05shiqian} 655e35fdd936d133bf8a48de140a3c666897588a05shiqian 656e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ReturnRef(v) is covariant. 657e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ReturnRefTest, IsCovariant) { 658e35fdd936d133bf8a48de140a3c666897588a05shiqian Base base; 659e35fdd936d133bf8a48de140a3c666897588a05shiqian Derived derived; 660e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<Base&()> a = ReturnRef(base); 661e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&base, &a.Perform(make_tuple())); 662e35fdd936d133bf8a48de140a3c666897588a05shiqian 663e35fdd936d133bf8a48de140a3c666897588a05shiqian a = ReturnRef(derived); 664e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&derived, &a.Perform(make_tuple())); 665e35fdd936d133bf8a48de140a3c666897588a05shiqian} 666e35fdd936d133bf8a48de140a3c666897588a05shiqian 667e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan// Tests that ReturnRefOfCopy(v) works for reference types. 668e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wanTEST(ReturnRefOfCopyTest, WorksForReference) { 669e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan int n = 42; 670e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan const Action<const int&()> ret = ReturnRefOfCopy(n); 671e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan 672e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_NE(&n, &ret.Perform(make_tuple())); 673e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_EQ(42, ret.Perform(make_tuple())); 674e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan 675e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan n = 43; 676e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_NE(&n, &ret.Perform(make_tuple())); 677e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_EQ(42, ret.Perform(make_tuple())); 678e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan} 679e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan 680e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan// Tests that ReturnRefOfCopy(v) is covariant. 681e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wanTEST(ReturnRefOfCopyTest, IsCovariant) { 682e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan Base base; 683e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan Derived derived; 684e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan Action<Base&()> a = ReturnRefOfCopy(base); 685e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_NE(&base, &a.Perform(make_tuple())); 686e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan 687e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan a = ReturnRefOfCopy(derived); 688e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan EXPECT_NE(&derived, &a.Perform(make_tuple())); 689e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan} 690e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan 691e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DoDefault() does the default action for the mock method. 692e35fdd936d133bf8a48de140a3c666897588a05shiqian 693e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MockClass { 694e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 69532de5f53763125925e078498250f7e73a88de9edzhanyong.wan MockClass() {} 69632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 697e35fdd936d133bf8a48de140a3c666897588a05shiqian MOCK_METHOD1(IntFunc, int(bool flag)); // NOLINT 698d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak MOCK_METHOD0(Foo, MyNonDefaultConstructible()); 6995b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_UNIQUE_PTR_ 700b5c81098a8ccc25e313ffca56c911200b3591ea0kosak MOCK_METHOD0(MakeUnique, std::unique_ptr<int>()); 7013d1c78b2bff05a794b037b99766640f8f2b19855kosak MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>()); 702b5c81098a8ccc25e313ffca56c911200b3591ea0kosak MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>()); 703b5c81098a8ccc25e313ffca56c911200b3591ea0kosak#endif 70432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 70532de5f53763125925e078498250f7e73a88de9edzhanyong.wan private: 70632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(MockClass); 707e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 708e35fdd936d133bf8a48de140a3c666897588a05shiqian 709e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DoDefault() returns the built-in default value for the 710e35fdd936d133bf8a48de140a3c666897588a05shiqian// return type by default. 711e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultTest, ReturnsBuiltInDefaultValueByDefault) { 712e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 713e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_CALL(mock, IntFunc(_)) 714e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillOnce(DoDefault()); 715e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, mock.IntFunc(true)); 716e35fdd936d133bf8a48de140a3c666897588a05shiqian} 717e35fdd936d133bf8a48de140a3c666897588a05shiqian 718edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan// Tests that DoDefault() throws (when exceptions are enabled) or aborts 719edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan// the process when there is no built-in default value for the return type. 720e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultDeathTest, DiesForUnknowType) { 721e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 722e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_CALL(mock, Foo()) 723e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillRepeatedly(DoDefault()); 724edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan#if GTEST_HAS_EXCEPTIONS 725edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan EXPECT_ANY_THROW(mock.Foo()); 726edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan#else 72704d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 728e35fdd936d133bf8a48de140a3c666897588a05shiqian mock.Foo(); 729e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 730edd4ab4945aeacdf9bd5ec3ac1654b940ca72532zhanyong.wan#endif 731e35fdd936d133bf8a48de140a3c666897588a05shiqian} 732e35fdd936d133bf8a48de140a3c666897588a05shiqian 733e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that using DoDefault() inside a composite action leads to a 734e35fdd936d133bf8a48de140a3c666897588a05shiqian// run-time error. 735e35fdd936d133bf8a48de140a3c666897588a05shiqian 73632de5f53763125925e078498250f7e73a88de9edzhanyong.wanvoid VoidFunc(bool /* flag */) {} 737e35fdd936d133bf8a48de140a3c666897588a05shiqian 738e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultDeathTest, DiesIfUsedInCompositeAction) { 739e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 740e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_CALL(mock, IntFunc(_)) 741e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillRepeatedly(DoAll(Invoke(VoidFunc), 742e35fdd936d133bf8a48de140a3c666897588a05shiqian DoDefault())); 743e35fdd936d133bf8a48de140a3c666897588a05shiqian 744e35fdd936d133bf8a48de140a3c666897588a05shiqian // Ideally we should verify the error message as well. Sadly, 745e35fdd936d133bf8a48de140a3c666897588a05shiqian // EXPECT_DEATH() can only capture stderr, while Google Mock's 746e35fdd936d133bf8a48de140a3c666897588a05shiqian // errors are printed on stdout. Therefore we have to settle for 747e35fdd936d133bf8a48de140a3c666897588a05shiqian // not verifying the message. 74804d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED({ 749e35fdd936d133bf8a48de140a3c666897588a05shiqian mock.IntFunc(true); 750e35fdd936d133bf8a48de140a3c666897588a05shiqian }, ""); 751e35fdd936d133bf8a48de140a3c666897588a05shiqian} 752e35fdd936d133bf8a48de140a3c666897588a05shiqian 753e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DoDefault() returns the default value set by 754e35fdd936d133bf8a48de140a3c666897588a05shiqian// DefaultValue<T>::Set() when it's not overriden by an ON_CALL(). 755e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultTest, ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne) { 756e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<int>::Set(1); 757e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 758e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_CALL(mock, IntFunc(_)) 759e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillOnce(DoDefault()); 760e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, mock.IntFunc(false)); 761e35fdd936d133bf8a48de140a3c666897588a05shiqian DefaultValue<int>::Clear(); 762e35fdd936d133bf8a48de140a3c666897588a05shiqian} 763e35fdd936d133bf8a48de140a3c666897588a05shiqian 764e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that DoDefault() does the action specified by ON_CALL(). 765e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultTest, DoesWhatOnCallSpecifies) { 766e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 767e35fdd936d133bf8a48de140a3c666897588a05shiqian ON_CALL(mock, IntFunc(_)) 768e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillByDefault(Return(2)); 769e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_CALL(mock, IntFunc(_)) 770e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillOnce(DoDefault()); 771e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, mock.IntFunc(false)); 772e35fdd936d133bf8a48de140a3c666897588a05shiqian} 773e35fdd936d133bf8a48de140a3c666897588a05shiqian 774e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that using DoDefault() in ON_CALL() leads to a run-time failure. 775e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoDefaultTest, CannotBeUsedInOnCall) { 776e35fdd936d133bf8a48de140a3c666897588a05shiqian MockClass mock; 777e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_NONFATAL_FAILURE({ // NOLINT 778e35fdd936d133bf8a48de140a3c666897588a05shiqian ON_CALL(mock, IntFunc(_)) 779e35fdd936d133bf8a48de140a3c666897588a05shiqian .WillByDefault(DoDefault()); 780e35fdd936d133bf8a48de140a3c666897588a05shiqian }, "DoDefault() cannot be used in ON_CALL()"); 781e35fdd936d133bf8a48de140a3c666897588a05shiqian} 782e35fdd936d133bf8a48de140a3c666897588a05shiqian 7835921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// Tests that SetArgPointee<N>(v) sets the variable pointed to by 7845921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// the N-th (0-based) argument to v. 7855921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanTEST(SetArgPointeeTest, SetsTheNthPointee) { 7865921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan typedef void MyFunction(bool, int*, char*); 7875921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<MyFunction> a = SetArgPointee<1>(2); 7885921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 7895921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan int n = 0; 7905921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan char ch = '\0'; 7915921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, &n, &ch)); 7925921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ(2, n); 7935921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ('\0', ch); 7945921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 7955921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a = SetArgPointee<2>('a'); 7965921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan n = 0; 7975921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan ch = '\0'; 7985921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, &n, &ch)); 7995921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ(0, n); 8005921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ('a', ch); 8015921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan} 8025921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 803fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN) 804a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan// Tests that SetArgPointee<N>() accepts a string literal. 805fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan// GCC prior to v4.0 and the Symbian compiler do not support this. 806a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wanTEST(SetArgPointeeTest, AcceptsStringLiteral) { 807fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan typedef void MyFunction(std::string*, const char**); 808fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan Action<MyFunction> a = SetArgPointee<0>("hi"); 809a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan std::string str; 810a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan const char* ptr = NULL; 811fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a.Perform(make_tuple(&str, &ptr)); 812a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_EQ("hi", str); 813a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_TRUE(ptr == NULL); 814a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan 815fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a = SetArgPointee<1>("world"); 816a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan str = ""; 817fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a.Perform(make_tuple(&str, &ptr)); 818a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_EQ("", str); 819a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_STREQ("world", ptr); 820a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan} 821a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan 822fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wanTEST(SetArgPointeeTest, AcceptsWideStringLiteral) { 823fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan typedef void MyFunction(const wchar_t**); 824fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan Action<MyFunction> a = SetArgPointee<0>(L"world"); 825fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan const wchar_t* ptr = NULL; 826fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a.Perform(make_tuple(&ptr)); 827fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan EXPECT_STREQ(L"world", ptr); 828fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 829fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan# if GTEST_HAS_STD_WSTRING 830fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 831fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan typedef void MyStringFunction(std::wstring*); 832fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan Action<MyStringFunction> a2 = SetArgPointee<0>(L"world"); 833fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan std::wstring str = L""; 834fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a2.Perform(make_tuple(&str)); 835fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan EXPECT_EQ(L"world", str); 836fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 837fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan# endif 838fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan} 839fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan#endif 840fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 841a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan// Tests that SetArgPointee<N>() accepts a char pointer. 842a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wanTEST(SetArgPointeeTest, AcceptsCharPointer) { 843a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan typedef void MyFunction(bool, std::string*, const char**); 844a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan const char* const hi = "hi"; 845a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan Action<MyFunction> a = SetArgPointee<1>(hi); 846a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan std::string str; 847a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan const char* ptr = NULL; 848a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan a.Perform(make_tuple(true, &str, &ptr)); 849a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_EQ("hi", str); 850a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_TRUE(ptr == NULL); 851a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan 852a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan char world_array[] = "world"; 853a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan char* const world = world_array; 854a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan a = SetArgPointee<2>(world); 855a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan str = ""; 856a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan a.Perform(make_tuple(true, &str, &ptr)); 857a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_EQ("", str); 858a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan EXPECT_EQ(world, ptr); 859a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan} 860a684b5a5269e3f9c53ef842bf9b9658370418a0czhanyong.wan 861fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wanTEST(SetArgPointeeTest, AcceptsWideCharPointer) { 862fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan typedef void MyFunction(bool, const wchar_t**); 863fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan const wchar_t* const hi = L"hi"; 864fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan Action<MyFunction> a = SetArgPointee<1>(hi); 865fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan const wchar_t* ptr = NULL; 866fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a.Perform(make_tuple(true, &ptr)); 867fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan EXPECT_EQ(hi, ptr); 868fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 869fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan# if GTEST_HAS_STD_WSTRING 870fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 871fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan typedef void MyStringFunction(bool, std::wstring*); 872fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan wchar_t world_array[] = L"world"; 873fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan wchar_t* const world = world_array; 874fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan Action<MyStringFunction> a2 = SetArgPointee<1>(world); 875fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan std::wstring str; 876fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan a2.Perform(make_tuple(true, &str)); 877fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan EXPECT_EQ(world_array, str); 878fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan# endif 879fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan} 880fc8c6c479a5250b709ed7b4406e025439037e18ezhanyong.wan 8815921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan#if GTEST_HAS_PROTOBUF_ 8825921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 8835921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// Tests that SetArgPointee<N>(proto_buffer) sets the v1 protobuf 8845921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// variable pointed to by the N-th (0-based) argument to proto_buffer. 8855921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanTEST(SetArgPointeeTest, SetsTheNthPointeeOfProtoBufferType) { 8865921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage* const msg = new TestMessage; 8875921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_member("yes"); 8885921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage orig_msg; 8895921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan orig_msg.CopyFrom(*msg); 8905921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 8915921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<void(bool, TestMessage*)> a = SetArgPointee<1>(*msg); 8925921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // SetArgPointee<N>(proto_buffer) makes a copy of proto_buffer 8935921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // s.t. the action works even when the original proto_buffer has 8945921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // died. We ensure this behavior by deleting msg before using the 8955921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // action. 8965921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan delete msg; 8975921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 8985921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage dest; 8995921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_FALSE(orig_msg.Equals(dest)); 9005921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, &dest)); 9015921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_TRUE(orig_msg.Equals(dest)); 9025921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan} 9035921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9045921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// Tests that SetArgPointee<N>(proto_buffer) sets the 9055921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// ::ProtocolMessage variable pointed to by the N-th (0-based) 9065921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// argument to proto_buffer. 9075921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanTEST(SetArgPointeeTest, SetsTheNthPointeeOfProtoBufferBaseType) { 9085921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage* const msg = new TestMessage; 9095921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_member("yes"); 9105921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage orig_msg; 9115921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan orig_msg.CopyFrom(*msg); 9125921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9135921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<void(bool, ::ProtocolMessage*)> a = SetArgPointee<1>(*msg); 9145921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // SetArgPointee<N>(proto_buffer) makes a copy of proto_buffer 9155921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // s.t. the action works even when the original proto_buffer has 9165921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // died. We ensure this behavior by deleting msg before using the 9175921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // action. 9185921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan delete msg; 9195921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9205921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan TestMessage dest; 9215921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan ::ProtocolMessage* const dest_base = &dest; 9225921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_FALSE(orig_msg.Equals(dest)); 9235921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, dest_base)); 9245921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_TRUE(orig_msg.Equals(dest)); 9255921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan} 9265921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9275921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// Tests that SetArgPointee<N>(proto2_buffer) sets the v2 9285921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// protobuf variable pointed to by the N-th (0-based) argument to 9295921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// proto2_buffer. 9305921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanTEST(SetArgPointeeTest, SetsTheNthPointeeOfProto2BufferType) { 9315921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan using testing::internal::FooMessage; 9325921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage* const msg = new FooMessage; 9335921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_int_field(2); 9345921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_string_field("hi"); 9355921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage orig_msg; 9365921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan orig_msg.CopyFrom(*msg); 9375921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9385921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<void(bool, FooMessage*)> a = SetArgPointee<1>(*msg); 9395921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // SetArgPointee<N>(proto2_buffer) makes a copy of 9405921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // proto2_buffer s.t. the action works even when the original 9415921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // proto2_buffer has died. We ensure this behavior by deleting msg 9425921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // before using the action. 9435921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan delete msg; 9445921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9455921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage dest; 9465921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan dest.set_int_field(0); 9475921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, &dest)); 9485921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ(2, dest.int_field()); 9495921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ("hi", dest.string_field()); 9505921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan} 9515921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9525921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// Tests that SetArgPointee<N>(proto2_buffer) sets the 9535921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// proto2::Message variable pointed to by the N-th (0-based) argument 9545921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan// to proto2_buffer. 9555921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanTEST(SetArgPointeeTest, SetsTheNthPointeeOfProto2BufferBaseType) { 9565921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan using testing::internal::FooMessage; 9575921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage* const msg = new FooMessage; 9585921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_int_field(2); 9595921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan msg->set_string_field("hi"); 9605921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage orig_msg; 9615921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan orig_msg.CopyFrom(*msg); 9625921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9635921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<void(bool, ::proto2::Message*)> a = SetArgPointee<1>(*msg); 9645921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // SetArgPointee<N>(proto2_buffer) makes a copy of 9655921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // proto2_buffer s.t. the action works even when the original 9665921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // proto2_buffer has died. We ensure this behavior by deleting msg 9675921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan // before using the action. 9685921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan delete msg; 9695921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9705921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan FooMessage dest; 9715921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan dest.set_int_field(0); 9725921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan ::proto2::Message* const dest_base = &dest; 9735921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan a.Perform(make_tuple(true, dest_base)); 9745921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ(2, dest.int_field()); 9755921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan EXPECT_EQ("hi", dest.string_field()); 9765921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan} 9775921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 9785921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan#endif // GTEST_HAS_PROTOBUF_ 9795921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan 980e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that SetArgumentPointee<N>(v) sets the variable pointed to by 981e35fdd936d133bf8a48de140a3c666897588a05shiqian// the N-th (0-based) argument to v. 982e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(SetArgumentPointeeTest, SetsTheNthPointee) { 983e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef void MyFunction(bool, int*, char*); 984e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<MyFunction> a = SetArgumentPointee<1>(2); 985e35fdd936d133bf8a48de140a3c666897588a05shiqian 986e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 987e35fdd936d133bf8a48de140a3c666897588a05shiqian char ch = '\0'; 988e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(true, &n, &ch)); 989e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 990e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('\0', ch); 991e35fdd936d133bf8a48de140a3c666897588a05shiqian 992e35fdd936d133bf8a48de140a3c666897588a05shiqian a = SetArgumentPointee<2>('a'); 993e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 0; 994e35fdd936d133bf8a48de140a3c666897588a05shiqian ch = '\0'; 995e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(true, &n, &ch)); 996e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(0, n); 997e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', ch); 998e35fdd936d133bf8a48de140a3c666897588a05shiqian} 999e35fdd936d133bf8a48de140a3c666897588a05shiqian 100002f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan#if GTEST_HAS_PROTOBUF_ 1001e35fdd936d133bf8a48de140a3c666897588a05shiqian 1002c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Tests that SetArgumentPointee<N>(proto_buffer) sets the v1 protobuf 1003c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// variable pointed to by the N-th (0-based) argument to proto_buffer. 1004e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProtoBufferType) { 1005e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMessage* const msg = new TestMessage; 1006e35fdd936d133bf8a48de140a3c666897588a05shiqian msg->set_member("yes"); 1007e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMessage orig_msg; 1008e35fdd936d133bf8a48de140a3c666897588a05shiqian orig_msg.CopyFrom(*msg); 1009e35fdd936d133bf8a48de140a3c666897588a05shiqian 1010c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Action<void(bool, TestMessage*)> a = SetArgumentPointee<1>(*msg); 1011e35fdd936d133bf8a48de140a3c666897588a05shiqian // SetArgumentPointee<N>(proto_buffer) makes a copy of proto_buffer 1012e35fdd936d133bf8a48de140a3c666897588a05shiqian // s.t. the action works even when the original proto_buffer has 1013e35fdd936d133bf8a48de140a3c666897588a05shiqian // died. We ensure this behavior by deleting msg before using the 1014e35fdd936d133bf8a48de140a3c666897588a05shiqian // action. 1015e35fdd936d133bf8a48de140a3c666897588a05shiqian delete msg; 1016e35fdd936d133bf8a48de140a3c666897588a05shiqian 1017e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMessage dest; 1018e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(orig_msg.Equals(dest)); 1019e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(true, &dest)); 1020e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(orig_msg.Equals(dest)); 1021e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1022e35fdd936d133bf8a48de140a3c666897588a05shiqian 1023c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Tests that SetArgumentPointee<N>(proto_buffer) sets the 1024c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// ::ProtocolMessage variable pointed to by the N-th (0-based) 1025c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// argument to proto_buffer. 1026c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProtoBufferBaseType) { 1027c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan TestMessage* const msg = new TestMessage; 1028c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan msg->set_member("yes"); 1029c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan TestMessage orig_msg; 1030c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan orig_msg.CopyFrom(*msg); 1031c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1032c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Action<void(bool, ::ProtocolMessage*)> a = SetArgumentPointee<1>(*msg); 1033c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // SetArgumentPointee<N>(proto_buffer) makes a copy of proto_buffer 1034c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // s.t. the action works even when the original proto_buffer has 1035c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // died. We ensure this behavior by deleting msg before using the 1036c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // action. 1037c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan delete msg; 1038c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1039c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan TestMessage dest; 1040c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan ::ProtocolMessage* const dest_base = &dest; 1041c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EXPECT_FALSE(orig_msg.Equals(dest)); 1042c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan a.Perform(make_tuple(true, dest_base)); 1043c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EXPECT_TRUE(orig_msg.Equals(dest)); 1044c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan} 1045c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1046c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Tests that SetArgumentPointee<N>(proto2_buffer) sets the v2 1047c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// protobuf variable pointed to by the N-th (0-based) argument to 1048c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// proto2_buffer. 1049e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProto2BufferType) { 1050e35fdd936d133bf8a48de140a3c666897588a05shiqian using testing::internal::FooMessage; 1051e35fdd936d133bf8a48de140a3c666897588a05shiqian FooMessage* const msg = new FooMessage; 1052e35fdd936d133bf8a48de140a3c666897588a05shiqian msg->set_int_field(2); 1053e35fdd936d133bf8a48de140a3c666897588a05shiqian msg->set_string_field("hi"); 1054e35fdd936d133bf8a48de140a3c666897588a05shiqian FooMessage orig_msg; 1055e35fdd936d133bf8a48de140a3c666897588a05shiqian orig_msg.CopyFrom(*msg); 1056e35fdd936d133bf8a48de140a3c666897588a05shiqian 1057c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Action<void(bool, FooMessage*)> a = SetArgumentPointee<1>(*msg); 1058e35fdd936d133bf8a48de140a3c666897588a05shiqian // SetArgumentPointee<N>(proto2_buffer) makes a copy of 1059e35fdd936d133bf8a48de140a3c666897588a05shiqian // proto2_buffer s.t. the action works even when the original 1060e35fdd936d133bf8a48de140a3c666897588a05shiqian // proto2_buffer has died. We ensure this behavior by deleting msg 1061e35fdd936d133bf8a48de140a3c666897588a05shiqian // before using the action. 1062e35fdd936d133bf8a48de140a3c666897588a05shiqian delete msg; 1063e35fdd936d133bf8a48de140a3c666897588a05shiqian 1064e35fdd936d133bf8a48de140a3c666897588a05shiqian FooMessage dest; 1065e35fdd936d133bf8a48de140a3c666897588a05shiqian dest.set_int_field(0); 1066e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(true, &dest)); 1067e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, dest.int_field()); 1068e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("hi", dest.string_field()); 1069e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1070e35fdd936d133bf8a48de140a3c666897588a05shiqian 1071c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Tests that SetArgumentPointee<N>(proto2_buffer) sets the 1072c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// proto2::Message variable pointed to by the N-th (0-based) argument 1073c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// to proto2_buffer. 1074c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanTEST(SetArgumentPointeeTest, SetsTheNthPointeeOfProto2BufferBaseType) { 1075c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan using testing::internal::FooMessage; 1076c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan FooMessage* const msg = new FooMessage; 1077c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan msg->set_int_field(2); 1078c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan msg->set_string_field("hi"); 1079c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan FooMessage orig_msg; 1080c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan orig_msg.CopyFrom(*msg); 1081c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1082c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Action<void(bool, ::proto2::Message*)> a = SetArgumentPointee<1>(*msg); 1083c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // SetArgumentPointee<N>(proto2_buffer) makes a copy of 1084c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // proto2_buffer s.t. the action works even when the original 1085c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // proto2_buffer has died. We ensure this behavior by deleting msg 1086c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan // before using the action. 1087c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan delete msg; 1088c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1089c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan FooMessage dest; 1090c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan dest.set_int_field(0); 1091c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan ::proto2::Message* const dest_base = &dest; 1092c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan a.Perform(make_tuple(true, dest_base)); 1093c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EXPECT_EQ(2, dest.int_field()); 1094c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EXPECT_EQ("hi", dest.string_field()); 1095c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan} 1096c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 109702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan#endif // GTEST_HAS_PROTOBUF_ 1098e35fdd936d133bf8a48de140a3c666897588a05shiqian 1099e35fdd936d133bf8a48de140a3c666897588a05shiqian// Sample functions and functors for testing Invoke() and etc. 1100e35fdd936d133bf8a48de140a3c666897588a05shiqianint Nullary() { return 1; } 1101e35fdd936d133bf8a48de140a3c666897588a05shiqian 1102e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NullaryFunctor { 1103e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1104e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()() { return 2; } 1105e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1106e35fdd936d133bf8a48de140a3c666897588a05shiqian 1107e35fdd936d133bf8a48de140a3c666897588a05shiqianbool g_done = false; 1108e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid VoidNullary() { g_done = true; } 1109e35fdd936d133bf8a48de140a3c666897588a05shiqian 1110e35fdd936d133bf8a48de140a3c666897588a05shiqianclass VoidNullaryFunctor { 1111e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1112e35fdd936d133bf8a48de140a3c666897588a05shiqian void operator()() { g_done = true; } 1113e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1114e35fdd936d133bf8a48de140a3c666897588a05shiqian 1115e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Foo { 1116e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1117e35fdd936d133bf8a48de140a3c666897588a05shiqian Foo() : value_(123) {} 1118e35fdd936d133bf8a48de140a3c666897588a05shiqian 1119e35fdd936d133bf8a48de140a3c666897588a05shiqian int Nullary() const { return value_; } 112029be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan 1121e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1122e35fdd936d133bf8a48de140a3c666897588a05shiqian int value_; 1123e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1124e35fdd936d133bf8a48de140a3c666897588a05shiqian 1125e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests InvokeWithoutArgs(function). 1126e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeWithoutArgsTest, Function) { 1127e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that takes one argument. 1128e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int)> a = InvokeWithoutArgs(Nullary); // NOLINT 1129e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, a.Perform(make_tuple(2))); 1130e35fdd936d133bf8a48de140a3c666897588a05shiqian 1131e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that takes two arguments. 113232de5f53763125925e078498250f7e73a88de9edzhanyong.wan Action<int(int, double)> a2 = InvokeWithoutArgs(Nullary); // NOLINT 1133e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, a2.Perform(make_tuple(2, 3.5))); 1134e35fdd936d133bf8a48de140a3c666897588a05shiqian 1135e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that returns void. 1136e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(int)> a3 = InvokeWithoutArgs(VoidNullary); // NOLINT 1137e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = false; 1138e35fdd936d133bf8a48de140a3c666897588a05shiqian a3.Perform(make_tuple(1)); 1139e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(g_done); 1140e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1141e35fdd936d133bf8a48de140a3c666897588a05shiqian 1142e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests InvokeWithoutArgs(functor). 1143e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeWithoutArgsTest, Functor) { 1144e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that takes no argument. 1145e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int()> a = InvokeWithoutArgs(NullaryFunctor()); // NOLINT 1146e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, a.Perform(make_tuple())); 1147e35fdd936d133bf8a48de140a3c666897588a05shiqian 1148e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that takes three arguments. 114932de5f53763125925e078498250f7e73a88de9edzhanyong.wan Action<int(int, double, char)> a2 = // NOLINT 1150e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeWithoutArgs(NullaryFunctor()); 1151e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, a2.Perform(make_tuple(3, 3.5, 'a'))); 1152e35fdd936d133bf8a48de140a3c666897588a05shiqian 1153e35fdd936d133bf8a48de140a3c666897588a05shiqian // As an action that returns void. 1154e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void()> a3 = InvokeWithoutArgs(VoidNullaryFunctor()); 1155e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = false; 1156e35fdd936d133bf8a48de140a3c666897588a05shiqian a3.Perform(make_tuple()); 1157e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(g_done); 1158e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1159e35fdd936d133bf8a48de140a3c666897588a05shiqian 1160e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests InvokeWithoutArgs(obj_ptr, method). 1161e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeWithoutArgsTest, Method) { 1162e35fdd936d133bf8a48de140a3c666897588a05shiqian Foo foo; 1163e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(bool, char)> a = // NOLINT 1164e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeWithoutArgs(&foo, &Foo::Nullary); 1165e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(123, a.Perform(make_tuple(true, 'a'))); 1166e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1167e35fdd936d133bf8a48de140a3c666897588a05shiqian 1168e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using IgnoreResult() on a polymorphic action. 1169e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(IgnoreResultTest, PolymorphicAction) { 1170e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(int)> a = IgnoreResult(Return(5)); // NOLINT 1171e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(1)); 1172e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1173e35fdd936d133bf8a48de140a3c666897588a05shiqian 1174e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using IgnoreResult() on a monomorphic action. 1175e35fdd936d133bf8a48de140a3c666897588a05shiqian 1176e35fdd936d133bf8a48de140a3c666897588a05shiqianint ReturnOne() { 1177e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = true; 1178e35fdd936d133bf8a48de140a3c666897588a05shiqian return 1; 1179e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1180e35fdd936d133bf8a48de140a3c666897588a05shiqian 1181e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(IgnoreResultTest, MonomorphicAction) { 1182e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = false; 1183e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void()> a = IgnoreResult(Invoke(ReturnOne)); 1184e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple()); 1185e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(g_done); 1186e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1187e35fdd936d133bf8a48de140a3c666897588a05shiqian 1188e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using IgnoreResult() on an action that returns a class type. 1189e35fdd936d133bf8a48de140a3c666897588a05shiqian 1190d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosakMyNonDefaultConstructible ReturnMyNonDefaultConstructible(double /* x */) { 1191e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = true; 1192d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak return MyNonDefaultConstructible(42); 1193e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1194e35fdd936d133bf8a48de140a3c666897588a05shiqian 1195e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(IgnoreResultTest, ActionReturningClass) { 1196e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = false; 1197d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak Action<void(int)> a = 1198d478a1f46d51ac2baa3f3b3896139897f24dc2d1kosak IgnoreResult(Invoke(ReturnMyNonDefaultConstructible)); // NOLINT 1199e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(2)); 1200e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(g_done); 1201e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1202e35fdd936d133bf8a48de140a3c666897588a05shiqian 1203e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AssignTest, Int) { 1204e35fdd936d133bf8a48de140a3c666897588a05shiqian int x = 0; 1205e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(int)> a = Assign(&x, 5); 1206e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(0)); 1207e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(5, x); 1208e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1209e35fdd936d133bf8a48de140a3c666897588a05shiqian 1210e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AssignTest, String) { 1211e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::string x; 1212e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(void)> a = Assign(&x, "Hello, world"); 1213e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple()); 1214e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("Hello, world", x); 1215e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1216e35fdd936d133bf8a48de140a3c666897588a05shiqian 1217e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AssignTest, CompatibleTypes) { 1218e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 0; 1219e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(int)> a = Assign(&x, 5); 1220e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(0)); 1221e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_DOUBLE_EQ(5, x); 1222e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1223e35fdd936d133bf8a48de140a3c666897588a05shiqian 1224f7af24c7de14ccb10a24909a6f3440a763cb1164zhanyong.wan#if !GTEST_OS_WINDOWS_MOBILE 12255b5d62f19019a398167df1f1b59279e049bf24cezhanyong.wan 1226e35fdd936d133bf8a48de140a3c666897588a05shiqianclass SetErrnoAndReturnTest : public testing::Test { 1227e35fdd936d133bf8a48de140a3c666897588a05shiqian protected: 1228e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void SetUp() { errno = 0; } 1229e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void TearDown() { errno = 0; } 1230e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1231e35fdd936d133bf8a48de140a3c666897588a05shiqian 1232e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(SetErrnoAndReturnTest, Int) { 1233e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(void)> a = SetErrnoAndReturn(ENOTTY, -5); 1234e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(-5, a.Perform(make_tuple())); 1235e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(ENOTTY, errno); 1236e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1237e35fdd936d133bf8a48de140a3c666897588a05shiqian 1238e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(SetErrnoAndReturnTest, Ptr) { 1239e35fdd936d133bf8a48de140a3c666897588a05shiqian int x; 1240e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int*(void)> a = SetErrnoAndReturn(ENOTTY, &x); 1241e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(&x, a.Perform(make_tuple())); 1242e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(ENOTTY, errno); 1243e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1244e35fdd936d133bf8a48de140a3c666897588a05shiqian 1245e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(SetErrnoAndReturnTest, CompatibleTypes) { 1246e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<double()> a = SetErrnoAndReturn(EINVAL, 5); 1247e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_DOUBLE_EQ(5.0, a.Perform(make_tuple())); 1248e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(EINVAL, errno); 1249e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1250e35fdd936d133bf8a48de140a3c666897588a05shiqian 1251f7af24c7de14ccb10a24909a6f3440a763cb1164zhanyong.wan#endif // !GTEST_OS_WINDOWS_MOBILE 12525b5d62f19019a398167df1f1b59279e049bf24cezhanyong.wan 1253a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests ByRef(). 1254a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1255a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests that ReferenceWrapper<T> is copyable. 1256a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ByRefTest, IsCopyable) { 1257a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const std::string s1 = "Hi"; 1258a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const std::string s2 = "Hello"; 1259a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 126079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper = 126179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ByRef(s1); 1262a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const std::string& r1 = ref_wrapper; 1263a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&s1, &r1); 1264a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1265a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // Assigns a new value to ref_wrapper. 1266a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan ref_wrapper = ByRef(s2); 1267a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const std::string& r2 = ref_wrapper; 1268a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&s2, &r2); 1269a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 127079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 = 127179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ByRef(s1); 1272a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // Copies ref_wrapper1 to ref_wrapper. 1273a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan ref_wrapper = ref_wrapper1; 1274a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const std::string& r3 = ref_wrapper; 1275a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&s1, &r3); 1276a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan} 1277a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1278a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using ByRef() on a const value. 1279a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ByRefTest, ConstValue) { 1280a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const int n = 0; 1281a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // int& ref = ByRef(n); // This shouldn't compile - we have a 1282a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // negative compilation test to catch it. 1283a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const int& const_ref = ByRef(n); 1284a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&n, &const_ref); 1285a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan} 1286a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1287a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using ByRef() on a non-const value. 1288a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ByRefTest, NonConstValue) { 1289a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan int n = 0; 1290a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1291a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // ByRef(n) can be used as either an int&, 1292a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan int& ref = ByRef(n); 1293a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&n, &ref); 1294a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1295a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // or a const int&. 1296a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const int& const_ref = ByRef(n); 1297a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&n, &const_ref); 1298a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan} 1299a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1300a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests explicitly specifying the type when using ByRef(). 1301a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ByRefTest, ExplicitType) { 1302a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan int n = 0; 1303a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const int& r1 = ByRef<const int>(n); 1304a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&n, &r1); 1305a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1306a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // ByRef<char>(n); // This shouldn't compile - we have a negative 1307a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // compilation test to catch it. 1308a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1309a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan Derived d; 1310a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan Derived& r2 = ByRef<Derived>(d); 1311a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&d, &r2); 1312a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1313a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const Derived& r3 = ByRef<const Derived>(d); 1314a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&d, &r3); 1315a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1316a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan Base& r4 = ByRef<Base>(d); 1317a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&d, &r4); 1318a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1319a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan const Base& r5 = ByRef<const Base>(d); 1320a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(&d, &r5); 1321a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1322a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // The following shouldn't compile - we have a negative compilation 1323a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // test for it. 1324a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // 1325a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // Base b; 1326a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan // ByRef<Derived>(b); 1327a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan} 1328a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 1329a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests that Google Mock prints expression ByRef(x) as a reference to x. 1330a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ByRefTest, PrintsCorrectly) { 1331a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan int n = 42; 1332a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan ::std::stringstream expected, actual; 1333a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan testing::internal::UniversalPrinter<const int&>::Print(n, &expected); 1334a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan testing::internal::UniversalPrint(ByRef(n), &actual); 1335a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan EXPECT_EQ(expected.str(), actual.str()); 1336a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan} 1337a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan 13385b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_UNIQUE_PTR_ 1339b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 1340b5c81098a8ccc25e313ffca56c911200b3591ea0kosakstd::unique_ptr<int> UniquePtrSource() { 1341b5c81098a8ccc25e313ffca56c911200b3591ea0kosak return std::unique_ptr<int>(new int(19)); 1342b5c81098a8ccc25e313ffca56c911200b3591ea0kosak} 1343b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 1344b5c81098a8ccc25e313ffca56c911200b3591ea0kosakstd::vector<std::unique_ptr<int>> VectorUniquePtrSource() { 1345b5c81098a8ccc25e313ffca56c911200b3591ea0kosak std::vector<std::unique_ptr<int>> out; 1346b5c81098a8ccc25e313ffca56c911200b3591ea0kosak out.emplace_back(new int(7)); 1347b5c81098a8ccc25e313ffca56c911200b3591ea0kosak return out; 1348b5c81098a8ccc25e313ffca56c911200b3591ea0kosak} 1349b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 13503d1c78b2bff05a794b037b99766640f8f2b19855kosakTEST(MockMethodTest, CanReturnMoveOnlyValue_Return) { 13513d1c78b2bff05a794b037b99766640f8f2b19855kosak MockClass mock; 13523d1c78b2bff05a794b037b99766640f8f2b19855kosak std::unique_ptr<int> i(new int(19)); 13533d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock, MakeUnique()).WillOnce(Return(ByMove(std::move(i)))); 13543d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock, MakeVectorUnique()) 13553d1c78b2bff05a794b037b99766640f8f2b19855kosak .WillOnce(Return(ByMove(VectorUniquePtrSource()))); 13563d1c78b2bff05a794b037b99766640f8f2b19855kosak Derived* d = new Derived; 13573d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock, MakeUniqueBase()) 13583d1c78b2bff05a794b037b99766640f8f2b19855kosak .WillOnce(Return(ByMove(std::unique_ptr<Derived>(d)))); 13593d1c78b2bff05a794b037b99766640f8f2b19855kosak 13603d1c78b2bff05a794b037b99766640f8f2b19855kosak std::unique_ptr<int> result1 = mock.MakeUnique(); 13613d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_EQ(19, *result1); 13623d1c78b2bff05a794b037b99766640f8f2b19855kosak 13633d1c78b2bff05a794b037b99766640f8f2b19855kosak std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique(); 1364389bad61e2ebe3e99aaf17cb157f43beeb03ba4dkosak EXPECT_EQ(1u, vresult.size()); 13653d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_NE(nullptr, vresult[0]); 13663d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_EQ(7, *vresult[0]); 13673d1c78b2bff05a794b037b99766640f8f2b19855kosak 13683d1c78b2bff05a794b037b99766640f8f2b19855kosak std::unique_ptr<Base> result2 = mock.MakeUniqueBase(); 13693d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_EQ(d, result2.get()); 13703d1c78b2bff05a794b037b99766640f8f2b19855kosak} 13713d1c78b2bff05a794b037b99766640f8f2b19855kosak 13723d1c78b2bff05a794b037b99766640f8f2b19855kosakTEST(MockMethodTest, CanReturnMoveOnlyValue_DoAllReturn) { 13733d1c78b2bff05a794b037b99766640f8f2b19855kosak testing::MockFunction<void()> mock_function; 13743d1c78b2bff05a794b037b99766640f8f2b19855kosak MockClass mock; 13753d1c78b2bff05a794b037b99766640f8f2b19855kosak std::unique_ptr<int> i(new int(19)); 13763d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock_function, Call()); 13773d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock, MakeUnique()).WillOnce(DoAll( 13783d1c78b2bff05a794b037b99766640f8f2b19855kosak InvokeWithoutArgs(&mock_function, &testing::MockFunction<void()>::Call), 13793d1c78b2bff05a794b037b99766640f8f2b19855kosak Return(ByMove(std::move(i))))); 13803d1c78b2bff05a794b037b99766640f8f2b19855kosak 13813d1c78b2bff05a794b037b99766640f8f2b19855kosak std::unique_ptr<int> result1 = mock.MakeUnique(); 13823d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_EQ(19, *result1); 13833d1c78b2bff05a794b037b99766640f8f2b19855kosak} 13843d1c78b2bff05a794b037b99766640f8f2b19855kosak 13853d1c78b2bff05a794b037b99766640f8f2b19855kosakTEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) { 1386b5c81098a8ccc25e313ffca56c911200b3591ea0kosak MockClass mock; 1387b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 1388b5c81098a8ccc25e313ffca56c911200b3591ea0kosak // Check default value 1389b5c81098a8ccc25e313ffca56c911200b3591ea0kosak DefaultValue<std::unique_ptr<int>>::SetFactory([] { 1390b5c81098a8ccc25e313ffca56c911200b3591ea0kosak return std::unique_ptr<int>(new int(42)); 1391b5c81098a8ccc25e313ffca56c911200b3591ea0kosak }); 1392b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_EQ(42, *mock.MakeUnique()); 1393b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 13943d1c78b2bff05a794b037b99766640f8f2b19855kosak EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource)); 1395b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_CALL(mock, MakeVectorUnique()) 1396b5c81098a8ccc25e313ffca56c911200b3591ea0kosak .WillRepeatedly(Invoke(VectorUniquePtrSource)); 1397b5c81098a8ccc25e313ffca56c911200b3591ea0kosak std::unique_ptr<int> result1 = mock.MakeUnique(); 1398b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_EQ(19, *result1); 1399b5c81098a8ccc25e313ffca56c911200b3591ea0kosak std::unique_ptr<int> result2 = mock.MakeUnique(); 1400b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_EQ(19, *result2); 1401b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_NE(result1, result2); 1402b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 1403b5c81098a8ccc25e313ffca56c911200b3591ea0kosak std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique(); 1404389bad61e2ebe3e99aaf17cb157f43beeb03ba4dkosak EXPECT_EQ(1u, vresult.size()); 1405b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_NE(nullptr, vresult[0]); 1406b5c81098a8ccc25e313ffca56c911200b3591ea0kosak EXPECT_EQ(7, *vresult[0]); 1407b5c81098a8ccc25e313ffca56c911200b3591ea0kosak} 1408b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 14095b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#endif // GTEST_HAS_STD_UNIQUE_PTR_ 1410b5c81098a8ccc25e313ffca56c911200b3591ea0kosak 1411e35fdd936d133bf8a48de140a3c666897588a05shiqian} // Unnamed namespace 1412