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