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