1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc.
2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved.
3e35fdd936d133bf8a48de140a3c666897588a05shiqian//
4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without
5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are
6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met:
7e35fdd936d133bf8a48de140a3c666897588a05shiqian//
8e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions of source code must retain the above copyright
9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer.
10e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions in binary form must reproduce the above
11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer
12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the
13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution.
14e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Neither the name of Google Inc. nor the names of its
15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from
16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission.
17e35fdd936d133bf8a48de140a3c666897588a05shiqian//
18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e35fdd936d133bf8a48de140a3c666897588a05shiqian//
30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan)
31e35fdd936d133bf8a48de140a3c666897588a05shiqian
32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes.
33e35fdd936d133bf8a48de140a3c666897588a05shiqian//
34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests the built-in actions generated by a script.
35e35fdd936d133bf8a48de140a3c666897588a05shiqian
3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-generated-actions.h"
37e35fdd936d133bf8a48de140a3c666897588a05shiqian
38e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional>
39387bdd551d4a88383246841ac3f70324b8d42772zhanyong.wan#include <sstream>
40e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string>
4153e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h"
4253e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h"
43e35fdd936d133bf8a48de140a3c666897588a05shiqian
44e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing {
45e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_generated_actions_test {
46e35fdd936d133bf8a48de140a3c666897588a05shiqian
47e35fdd936d133bf8a48de140a3c666897588a05shiqianusing ::std::plus;
48e35fdd936d133bf8a48de140a3c666897588a05shiqianusing ::std::string;
49bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::get;
50bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::make_tuple;
51bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple;
52bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple_element;
53e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_;
54e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Action;
55e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ActionInterface;
56e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef;
57e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoAll;
58e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Invoke;
59e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Return;
601c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanusing testing::ReturnNew;
615921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanusing testing::SetArgPointee;
62326aa564127acf095f6f0952b2f54d149a10d824shiqianusing testing::StaticAssertTypeEq;
63e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Unused;
64e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::WithArgs;
65e35fdd936d133bf8a48de140a3c666897588a05shiqian
6632de5f53763125925e078498250f7e73a88de9edzhanyong.wan// For suppressing compiler warnings on conversion possibly losing precision.
6732de5f53763125925e078498250f7e73a88de9edzhanyong.waninline short Short(short n) { return n; }  // NOLINT
6832de5f53763125925e078498250f7e73a88de9edzhanyong.waninline char Char(char ch) { return ch; }
6932de5f53763125925e078498250f7e73a88de9edzhanyong.wan
70a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Sample functions and functors for testing various actions.
71e35fdd936d133bf8a48de140a3c666897588a05shiqianint Nullary() { return 1; }
72e35fdd936d133bf8a48de140a3c666897588a05shiqian
73e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NullaryFunctor {
74e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
75e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()() { return 2; }
76e35fdd936d133bf8a48de140a3c666897588a05shiqian};
77e35fdd936d133bf8a48de140a3c666897588a05shiqian
78e35fdd936d133bf8a48de140a3c666897588a05shiqianbool g_done = false;
79e35fdd936d133bf8a48de140a3c666897588a05shiqian
80e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Unary(int x) { return x < 0; }
81e35fdd936d133bf8a48de140a3c666897588a05shiqian
82e35fdd936d133bf8a48de140a3c666897588a05shiqianconst char* Plus1(const char* s) { return s + 1; }
83e35fdd936d133bf8a48de140a3c666897588a05shiqian
8409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberbool ByConstRef(const std::string& s) { return s == "Hi"; }
85e35fdd936d133bf8a48de140a3c666897588a05shiqian
86e35fdd936d133bf8a48de140a3c666897588a05shiqianconst double g_double = 0;
87e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
88e35fdd936d133bf8a48de140a3c666897588a05shiqian
8909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string ByNonConstRef(std::string& s) { return s += "+"; }  // NOLINT
90e35fdd936d133bf8a48de140a3c666897588a05shiqian
91e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct UnaryFunctor {
92e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(bool x) { return x ? 1 : -1; }
93e35fdd936d133bf8a48de140a3c666897588a05shiqian};
94e35fdd936d133bf8a48de140a3c666897588a05shiqian
95e35fdd936d133bf8a48de140a3c666897588a05shiqianconst char* Binary(const char* input, short n) { return input + n; }  // NOLINT
96e35fdd936d133bf8a48de140a3c666897588a05shiqian
97e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid VoidBinary(int, char) { g_done = true; }
98e35fdd936d133bf8a48de140a3c666897588a05shiqian
99e35fdd936d133bf8a48de140a3c666897588a05shiqianint Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
100e35fdd936d133bf8a48de140a3c666897588a05shiqian
101e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid VoidTernary(int, char, bool) { g_done = true; }
102e35fdd936d133bf8a48de140a3c666897588a05shiqian
103e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
104e35fdd936d133bf8a48de140a3c666897588a05shiqian
10509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat4(const char* s1, const char* s2, const char* s3,
10609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4) {
10709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4;
108e35fdd936d133bf8a48de140a3c666897588a05shiqian}
109e35fdd936d133bf8a48de140a3c666897588a05shiqian
110e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
111e35fdd936d133bf8a48de140a3c666897588a05shiqian
112e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct SumOf5Functor {
113e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(int a, int b, int c, int d, int e) {
114e35fdd936d133bf8a48de140a3c666897588a05shiqian    return a + b + c + d + e;
115e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
116e35fdd936d133bf8a48de140a3c666897588a05shiqian};
117e35fdd936d133bf8a48de140a3c666897588a05shiqian
11809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat5(const char* s1, const char* s2, const char* s3,
11909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5) {
12009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5;
121e35fdd936d133bf8a48de140a3c666897588a05shiqian}
122e35fdd936d133bf8a48de140a3c666897588a05shiqian
123e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf6(int a, int b, int c, int d, int e, int f) {
124e35fdd936d133bf8a48de140a3c666897588a05shiqian  return a + b + c + d + e + f;
125e35fdd936d133bf8a48de140a3c666897588a05shiqian}
126e35fdd936d133bf8a48de140a3c666897588a05shiqian
127e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct SumOf6Functor {
128e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(int a, int b, int c, int d, int e, int f) {
129e35fdd936d133bf8a48de140a3c666897588a05shiqian    return a + b + c + d + e + f;
130e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
131e35fdd936d133bf8a48de140a3c666897588a05shiqian};
132e35fdd936d133bf8a48de140a3c666897588a05shiqian
13309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat6(const char* s1, const char* s2, const char* s3,
13409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6) {
13509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6;
136e35fdd936d133bf8a48de140a3c666897588a05shiqian}
137e35fdd936d133bf8a48de140a3c666897588a05shiqian
13809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat7(const char* s1, const char* s2, const char* s3,
13909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
14009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7) {
14109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
142e35fdd936d133bf8a48de140a3c666897588a05shiqian}
143e35fdd936d133bf8a48de140a3c666897588a05shiqian
14409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat8(const char* s1, const char* s2, const char* s3,
14509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
14609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7, const char* s8) {
14709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
148e35fdd936d133bf8a48de140a3c666897588a05shiqian}
149e35fdd936d133bf8a48de140a3c666897588a05shiqian
15009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat9(const char* s1, const char* s2, const char* s3,
15109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
15209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7, const char* s8, const char* s9) {
15309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
154e35fdd936d133bf8a48de140a3c666897588a05shiqian}
155e35fdd936d133bf8a48de140a3c666897588a05shiqian
15609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat10(const char* s1, const char* s2, const char* s3,
15709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s4, const char* s5, const char* s6,
15809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s7, const char* s8, const char* s9,
15909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s10) {
16009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
161e35fdd936d133bf8a48de140a3c666897588a05shiqian}
162e35fdd936d133bf8a48de140a3c666897588a05shiqian
16390c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan// A helper that turns the type of a C-string literal from const
16490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan// char[N] to const char*.
16590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.waninline const char* CharPtr(const char* s) { return s; }
16690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan
167e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests InvokeArgument<N>(...).
168e35fdd936d133bf8a48de140a3c666897588a05shiqian
169e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a nullary function.
170e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function0) {
171e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int, int(*)())> a = InvokeArgument<1>();  // NOLINT
172e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, a.Perform(make_tuple(2, &Nullary)));
173e35fdd936d133bf8a48de140a3c666897588a05shiqian}
174e35fdd936d133bf8a48de140a3c666897588a05shiqian
175e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a unary function.
176e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor1) {
177e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(UnaryFunctor)> a = InvokeArgument<0>(true);  // NOLINT
178e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, a.Perform(make_tuple(UnaryFunctor())));
179e35fdd936d133bf8a48de140a3c666897588a05shiqian}
180e35fdd936d133bf8a48de140a3c666897588a05shiqian
181e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 5-ary function.
182e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function5) {
183e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int(*)(int, int, int, int, int))> a =  // NOLINT
184e35fdd936d133bf8a48de140a3c666897588a05shiqian      InvokeArgument<0>(10000, 2000, 300, 40, 5);
185e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(12345, a.Perform(make_tuple(&SumOf5)));
186e35fdd936d133bf8a48de140a3c666897588a05shiqian}
187e35fdd936d133bf8a48de140a3c666897588a05shiqian
188e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 5-ary functor.
189e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor5) {
190e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(SumOf5Functor)> a =  // NOLINT
191e35fdd936d133bf8a48de140a3c666897588a05shiqian      InvokeArgument<0>(10000, 2000, 300, 40, 5);
192e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(12345, a.Perform(make_tuple(SumOf5Functor())));
193e35fdd936d133bf8a48de140a3c666897588a05shiqian}
194e35fdd936d133bf8a48de140a3c666897588a05shiqian
195e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 6-ary function.
196e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function6) {
197e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int(*)(int, int, int, int, int, int))> a =  // NOLINT
198e35fdd936d133bf8a48de140a3c666897588a05shiqian      InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
199e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(123456, a.Perform(make_tuple(&SumOf6)));
200e35fdd936d133bf8a48de140a3c666897588a05shiqian}
201e35fdd936d133bf8a48de140a3c666897588a05shiqian
202e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 6-ary functor.
203e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor6) {
204e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(SumOf6Functor)> a =  // NOLINT
205e35fdd936d133bf8a48de140a3c666897588a05shiqian      InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
206e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(123456, a.Perform(make_tuple(SumOf6Functor())));
207e35fdd936d133bf8a48de140a3c666897588a05shiqian}
208e35fdd936d133bf8a48de140a3c666897588a05shiqian
209e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 7-ary function.
210e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function7) {
21109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(std::string(*)(const char*, const char*, const char*,
21209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*, const char*, const char*,
21309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*))>
21409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7");
215e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("1234567", a.Perform(make_tuple(&Concat7)));
216e35fdd936d133bf8a48de140a3c666897588a05shiqian}
217e35fdd936d133bf8a48de140a3c666897588a05shiqian
218e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 8-ary function.
219e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function8) {
22009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(std::string(*)(const char*, const char*, const char*,
22109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*, const char*, const char*,
22209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*, const char*))>
22309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8");
224e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("12345678", a.Perform(make_tuple(&Concat8)));
225e35fdd936d133bf8a48de140a3c666897588a05shiqian}
226e35fdd936d133bf8a48de140a3c666897588a05shiqian
227e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 9-ary function.
228e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function9) {
22909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(std::string(*)(const char*, const char*, const char*,
23009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*, const char*, const char*,
23109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                                    const char*, const char*, const char*))>
23209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9");
233e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("123456789", a.Perform(make_tuple(&Concat9)));
234e35fdd936d133bf8a48de140a3c666897588a05shiqian}
235e35fdd936d133bf8a48de140a3c666897588a05shiqian
236e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 10-ary function.
237e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function10) {
23809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(std::string(*)(
23909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      const char*, const char*, const char*, const char*, const char*,
24009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      const char*, const char*, const char*, const char*, const char*))>
24109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
242e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("1234567890", a.Perform(make_tuple(&Concat10)));
243e35fdd936d133bf8a48de140a3c666897588a05shiqian}
244e35fdd936d133bf8a48de140a3c666897588a05shiqian
245e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a pointer argument.
246e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByPointerFunction) {
247e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT
24832de5f53763125925e078498250f7e73a88de9edzhanyong.wan      InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1));
249e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_STREQ("i", a.Perform(make_tuple(&Binary)));
250e35fdd936d133bf8a48de140a3c666897588a05shiqian}
251e35fdd936d133bf8a48de140a3c666897588a05shiqian
252e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a const char*
253e35fdd936d133bf8a48de140a3c666897588a05shiqian// by passing it a C-string literal.
254e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, FunctionWithCStringLiteral) {
255e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT
25632de5f53763125925e078498250f7e73a88de9edzhanyong.wan      InvokeArgument<0>("Hi", Short(1));
257e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_STREQ("i", a.Perform(make_tuple(&Binary)));
258e35fdd936d133bf8a48de140a3c666897588a05shiqian}
259e35fdd936d133bf8a48de140a3c666897588a05shiqian
260e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a const reference.
261e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByConstReferenceFunction) {
26209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<bool(bool (*function)(const std::string& s))> a =  // NOLINT
26309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      InvokeArgument<0>(std::string("Hi"));
264e35fdd936d133bf8a48de140a3c666897588a05shiqian  // When action 'a' is constructed, it makes a copy of the temporary
265e35fdd936d133bf8a48de140a3c666897588a05shiqian  // string object passed to it, so it's OK to use 'a' later, when the
266e35fdd936d133bf8a48de140a3c666897588a05shiqian  // temporary object has already died.
267e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(a.Perform(make_tuple(&ByConstRef)));
268e35fdd936d133bf8a48de140a3c666897588a05shiqian}
269e35fdd936d133bf8a48de140a3c666897588a05shiqian
270e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with ByRef() and a function that takes a
271e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference.
272e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {
273e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<bool(bool(*)(const double& x))> a =  // NOLINT
274e35fdd936d133bf8a48de140a3c666897588a05shiqian      InvokeArgument<0>(ByRef(g_double));
275e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The above line calls ByRef() on a const value.
276e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(a.Perform(make_tuple(&ReferencesGlobalDouble)));
277e35fdd936d133bf8a48de140a3c666897588a05shiqian
278e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 0;
279e35fdd936d133bf8a48de140a3c666897588a05shiqian  a = InvokeArgument<0>(ByRef(x));  // This calls ByRef() on a non-const.
280e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(a.Perform(make_tuple(&ReferencesGlobalDouble)));
281e35fdd936d133bf8a48de140a3c666897588a05shiqian}
282e35fdd936d133bf8a48de140a3c666897588a05shiqian
283a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using WithArgs and with an action that takes 1 argument.
284e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, OneArg) {
285e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary));  // NOLINT
286e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(a.Perform(make_tuple(1.5, -1)));
287e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(a.Perform(make_tuple(1.5, 1)));
288e35fdd936d133bf8a48de140a3c666897588a05shiqian}
289e35fdd936d133bf8a48de140a3c666897588a05shiqian
290e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 2 arguments.
291e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, TwoArgs) {
29232de5f53763125925e078498250f7e73a88de9edzhanyong.wan  Action<const char*(const char* s, double x, short n)> a =
293e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 2>(Invoke(Binary));
294e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char s[] = "Hello";
29532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(s + 2, a.Perform(make_tuple(CharPtr(s), 0.5, Short(2))));
296e35fdd936d133bf8a48de140a3c666897588a05shiqian}
297e35fdd936d133bf8a48de140a3c666897588a05shiqian
298e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 3 arguments.
299e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ThreeArgs) {
300e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int, double, char, short)> a =  // NOLINT
301e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 2, 3>(Invoke(Ternary));
30232de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(123, a.Perform(make_tuple(100, 6.5, Char(20), Short(3))));
303e35fdd936d133bf8a48de140a3c666897588a05shiqian}
304e35fdd936d133bf8a48de140a3c666897588a05shiqian
305e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 4 arguments.
306e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, FourArgs) {
30709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, double, const char*,
30809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*)>
30909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = WithArgs<4, 3, 1, 0>(Invoke(Concat4));
31090c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("4310", a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), 2.5,
31190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                         CharPtr("3"), CharPtr("4"))));
312e35fdd936d133bf8a48de140a3c666897588a05shiqian}
313e35fdd936d133bf8a48de140a3c666897588a05shiqian
314e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 5 arguments.
315e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, FiveArgs) {
31609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
31709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*)>
31809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = WithArgs<4, 3, 2, 1, 0>(Invoke(Concat5));
31990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("43210",
32090c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
32190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                 CharPtr("3"), CharPtr("4"))));
322e35fdd936d133bf8a48de140a3c666897588a05shiqian}
323e35fdd936d133bf8a48de140a3c666897588a05shiqian
324e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 6 arguments.
325e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, SixArgs) {
32609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*)> a =
327e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2, 2, 1, 0>(Invoke(Concat6));
32890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("012210",
32990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"))));
330e35fdd936d133bf8a48de140a3c666897588a05shiqian}
331e35fdd936d133bf8a48de140a3c666897588a05shiqian
332e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 7 arguments.
333e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, SevenArgs) {
33409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*)> a =
335e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2, 3, 2, 1, 0>(Invoke(Concat7));
33690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("0123210",
33790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
33890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                 CharPtr("3"))));
339e35fdd936d133bf8a48de140a3c666897588a05shiqian}
340e35fdd936d133bf8a48de140a3c666897588a05shiqian
341e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 8 arguments.
342e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, EightArgs) {
34309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*)> a =
344e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2, 3, 0, 1, 2, 3>(Invoke(Concat8));
34590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("01230123",
34690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
34790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                 CharPtr("3"))));
348e35fdd936d133bf8a48de140a3c666897588a05shiqian}
349e35fdd936d133bf8a48de140a3c666897588a05shiqian
350e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 9 arguments.
351e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, NineArgs) {
35209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*)> a =
353e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2, 3, 1, 2, 3, 2, 3>(Invoke(Concat9));
35490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("012312323",
35590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
35690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                 CharPtr("3"))));
357e35fdd936d133bf8a48de140a3c666897588a05shiqian}
358e35fdd936d133bf8a48de140a3c666897588a05shiqian
359e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 10 arguments.
360e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, TenArgs) {
36109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*)> a =
362e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(Concat10));
36390c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("0123210123",
36490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan            a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
36590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan                                 CharPtr("3"))));
366e35fdd936d133bf8a48de140a3c666897588a05shiqian}
367e35fdd936d133bf8a48de140a3c666897588a05shiqian
368e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that is not Invoke().
369e35fdd936d133bf8a48de140a3c666897588a05shiqianclass SubstractAction : public ActionInterface<int(int, int)> {  // NOLINT
370e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
371e35fdd936d133bf8a48de140a3c666897588a05shiqian  virtual int Perform(const tuple<int, int>& args) {
372e35fdd936d133bf8a48de140a3c666897588a05shiqian    return get<0>(args) - get<1>(args);
373e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
374e35fdd936d133bf8a48de140a3c666897588a05shiqian};
375e35fdd936d133bf8a48de140a3c666897588a05shiqian
376e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, NonInvokeAction) {
377e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(const string&, int, int)> a =  // NOLINT
378e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<2, 1>(MakeAction(new SubstractAction));
379f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  string s("hello");
380f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  EXPECT_EQ(8, a.Perform(tuple<const string&, int, int>(s, 2, 10)));
381e35fdd936d133bf8a48de140a3c666897588a05shiqian}
382e35fdd936d133bf8a48de140a3c666897588a05shiqian
383e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs to pass all original arguments in the original order.
384e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, Identity) {
385e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int x, char y, short z)> a =  // NOLINT
386e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 2>(Invoke(Ternary));
38732de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(123, a.Perform(make_tuple(100, Char(20), Short(3))));
388e35fdd936d133bf8a48de140a3c666897588a05shiqian}
389e35fdd936d133bf8a48de140a3c666897588a05shiqian
390e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with repeated arguments.
391e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, RepeatedArguments) {
392e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(bool, int m, int n)> a =  // NOLINT
393e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<1, 1, 1, 1>(Invoke(SumOf4));
394e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(4, a.Perform(make_tuple(false, 1, 10)));
395e35fdd936d133bf8a48de140a3c666897588a05shiqian}
396e35fdd936d133bf8a48de140a3c666897588a05shiqian
397e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with reversed argument order.
398e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ReversedArgumentOrder) {
399e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<const char*(short n, const char* input)> a =  // NOLINT
400e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<1, 0>(Invoke(Binary));
401e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char s[] = "Hello";
40232de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(s + 2, a.Perform(make_tuple(Short(2), CharPtr(s))));
403e35fdd936d133bf8a48de140a3c666897588a05shiqian}
404e35fdd936d133bf8a48de140a3c666897588a05shiqian
405e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with compatible, but not identical, argument types.
406e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ArgsOfCompatibleTypes) {
40732de5f53763125925e078498250f7e73a88de9edzhanyong.wan  Action<long(short x, char y, double z, char c)> a =  // NOLINT
408e35fdd936d133bf8a48de140a3c666897588a05shiqian      WithArgs<0, 1, 3>(Invoke(Ternary));
40932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(123, a.Perform(make_tuple(Short(100), Char(20), 5.6, Char(3))));
410e35fdd936d133bf8a48de140a3c666897588a05shiqian}
411e35fdd936d133bf8a48de140a3c666897588a05shiqian
412e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that returns void.
413e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, VoidAction) {
414e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary));
415e35fdd936d133bf8a48de140a3c666897588a05shiqian  g_done = false;
416e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.Perform(make_tuple(1.5, 'a', 3));
417e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(g_done);
418e35fdd936d133bf8a48de140a3c666897588a05shiqian}
419e35fdd936d133bf8a48de140a3c666897588a05shiqian
420e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2).
421e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, TwoActions) {
422e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
4235921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan  Action<int(int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT
424e35fdd936d133bf8a48de140a3c666897588a05shiqian                              Return(2));
425e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, a.Perform(make_tuple(&n)));
426e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, n);
427e35fdd936d133bf8a48de140a3c666897588a05shiqian}
428e35fdd936d133bf8a48de140a3c666897588a05shiqian
429e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3).
430e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, ThreeActions) {
431e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
4325921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan  Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT
4335921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan                                    SetArgPointee<1>(2),
434e35fdd936d133bf8a48de140a3c666897588a05shiqian                                    Return(3));
435e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n)));
436e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
437e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
438e35fdd936d133bf8a48de140a3c666897588a05shiqian}
439e35fdd936d133bf8a48de140a3c666897588a05shiqian
440e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3, a4).
441e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, FourActions) {
442e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
443e35fdd936d133bf8a48de140a3c666897588a05shiqian  char ch = '\0';
444e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*)> a =  // NOLINT
4455921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
4465921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
4475921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
448e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
449e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n, &ch)));
450e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
451e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
452e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', ch);
453e35fdd936d133bf8a48de140a3c666897588a05shiqian}
454e35fdd936d133bf8a48de140a3c666897588a05shiqian
455e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3, a4, a5).
456e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, FiveActions) {
457e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
458e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0';
459e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*)> action =  // NOLINT
4605921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
4615921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
4625921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
4635921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
464e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
465e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b)));
466e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
467e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
468e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
469e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
470e35fdd936d133bf8a48de140a3c666897588a05shiqian}
471e35fdd936d133bf8a48de140a3c666897588a05shiqian
472e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a6).
473e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, SixActions) {
474e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
475e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0', c = '\0';
476e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*, char*)> action =  // NOLINT
4775921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
4785921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
4795921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
4805921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
4815921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<4>('c'),
482e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
483e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c)));
484e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
485e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
486e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
487e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
488e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('c', c);
489e35fdd936d133bf8a48de140a3c666897588a05shiqian}
490e35fdd936d133bf8a48de140a3c666897588a05shiqian
491e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a7).
492e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, SevenActions) {
493e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
494e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0', c = '\0', d = '\0';
495e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*, char*, char*)> action =  // NOLINT
4965921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
4975921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
4985921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
4995921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
5005921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<4>('c'),
5015921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<5>('d'),
502e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
503e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d)));
504e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
505e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
506e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
507e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
508e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('c', c);
509e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('d', d);
510e35fdd936d133bf8a48de140a3c666897588a05shiqian}
511e35fdd936d133bf8a48de140a3c666897588a05shiqian
512e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a8).
513e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, EightActions) {
514e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
515e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0';
516e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
517e35fdd936d133bf8a48de140a3c666897588a05shiqian             char*)> action =
5185921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
5195921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
5205921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
5215921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
5225921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<4>('c'),
5235921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<5>('d'),
5245921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<6>('e'),
525e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
526e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e)));
527e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
528e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
529e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
530e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
531e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('c', c);
532e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('d', d);
533e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('e', e);
534e35fdd936d133bf8a48de140a3c666897588a05shiqian}
535e35fdd936d133bf8a48de140a3c666897588a05shiqian
536e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a9).
537e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, NineActions) {
538e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
539e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0', f = '\0';
540e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
541e35fdd936d133bf8a48de140a3c666897588a05shiqian             char*, char*)> action =
5425921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
5435921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
5445921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
5455921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
5465921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<4>('c'),
5475921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<5>('d'),
5485921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<6>('e'),
5495921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<7>('f'),
550e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
551e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f)));
552e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
553e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
554e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
555e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
556e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('c', c);
557e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('d', d);
558e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('e', e);
559e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('f', f);
560e35fdd936d133bf8a48de140a3c666897588a05shiqian}
561e35fdd936d133bf8a48de140a3c666897588a05shiqian
562e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a10).
563e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, TenActions) {
564e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
565e35fdd936d133bf8a48de140a3c666897588a05shiqian  char a = '\0', b = '\0', c = '\0', d = '\0';
566e35fdd936d133bf8a48de140a3c666897588a05shiqian  char e = '\0', f = '\0', g = '\0';
567e35fdd936d133bf8a48de140a3c666897588a05shiqian  Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
568e35fdd936d133bf8a48de140a3c666897588a05shiqian             char*, char*, char*)> action =
5695921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan      DoAll(SetArgPointee<0>(1),
5705921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<1>(2),
5715921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<2>('a'),
5725921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<3>('b'),
5735921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<4>('c'),
5745921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<5>('d'),
5755921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<6>('e'),
5765921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<7>('f'),
5775921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan            SetArgPointee<8>('g'),
578e35fdd936d133bf8a48de140a3c666897588a05shiqian            Return(3));
579e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g)));
580e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(1, m);
581e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(2, n);
582e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('a', a);
583e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('b', b);
584e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('c', c);
585e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('d', d);
586e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('e', e);
587e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('f', f);
588e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ('g', g);
589e35fdd936d133bf8a48de140a3c666897588a05shiqian}
590e35fdd936d133bf8a48de140a3c666897588a05shiqian
59132de5f53763125925e078498250f7e73a88de9edzhanyong.wan// The ACTION*() macros trigger warning C4100 (unreferenced formal
59232de5f53763125925e078498250f7e73a88de9edzhanyong.wan// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
59332de5f53763125925e078498250f7e73a88de9edzhanyong.wan// the macro definition, as the warnings are generated when the macro
59432de5f53763125925e078498250f7e73a88de9edzhanyong.wan// is expanded and macro expansion cannot contain #pragma.  Therefore
59532de5f53763125925e078498250f7e73a88de9edzhanyong.wan// we suppress them here.
59632de5f53763125925e078498250f7e73a88de9edzhanyong.wan#ifdef _MSC_VER
597658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(push)
598658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(disable:4100)
59932de5f53763125925e078498250f7e73a88de9edzhanyong.wan#endif
60032de5f53763125925e078498250f7e73a88de9edzhanyong.wan
601326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests the ACTION*() macro family.
602326aa564127acf095f6f0952b2f54d149a10d824shiqian
603326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can define an action that doesn't reference the
604326aa564127acf095f6f0952b2f54d149a10d824shiqian// mock function arguments.
605326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Return5) { return 5; }
606326aa564127acf095f6f0952b2f54d149a10d824shiqian
607326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksWhenNotReferencingArguments) {
608326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<double()> a1 = Return5();
609326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_DOUBLE_EQ(5, a1.Perform(make_tuple()));
610326aa564127acf095f6f0952b2f54d149a10d824shiqian
611326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(double, bool)> a2 = Return5();
612326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(5, a2.Perform(make_tuple(1, true)));
613326aa564127acf095f6f0952b2f54d149a10d824shiqian}
614326aa564127acf095f6f0952b2f54d149a10d824shiqian
615326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can define an action that returns void.
616326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(IncrementArg1) { (*arg1)++; }
617326aa564127acf095f6f0952b2f54d149a10d824shiqian
618326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksWhenReturningVoid) {
619326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<void(int, int*)> a1 = IncrementArg1();
620326aa564127acf095f6f0952b2f54d149a10d824shiqian  int n = 0;
621326aa564127acf095f6f0952b2f54d149a10d824shiqian  a1.Perform(make_tuple(5, &n));
622326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, n);
623326aa564127acf095f6f0952b2f54d149a10d824shiqian}
624326aa564127acf095f6f0952b2f54d149a10d824shiqian
625326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the type of the
626326aa564127acf095f6f0952b2f54d149a10d824shiqian// argument.
627326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(IncrementArg2) {
628326aa564127acf095f6f0952b2f54d149a10d824shiqian  StaticAssertTypeEq<int*, arg2_type>();
629326aa564127acf095f6f0952b2f54d149a10d824shiqian  arg2_type temp = arg2;
630326aa564127acf095f6f0952b2f54d149a10d824shiqian  (*temp)++;
631326aa564127acf095f6f0952b2f54d149a10d824shiqian}
632326aa564127acf095f6f0952b2f54d149a10d824shiqian
633326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceArgumentType) {
634326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<void(int, bool, int*)> a1 = IncrementArg2();
635326aa564127acf095f6f0952b2f54d149a10d824shiqian  int n = 0;
636326aa564127acf095f6f0952b2f54d149a10d824shiqian  a1.Perform(make_tuple(5, false, &n));
637326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, n);
638326aa564127acf095f6f0952b2f54d149a10d824shiqian}
639326aa564127acf095f6f0952b2f54d149a10d824shiqian
640326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the argument tuple
641326aa564127acf095f6f0952b2f54d149a10d824shiqian// via args_type and args.
642326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Sum2) {
643bd0188320de5aab1b09718e2c466387099d43cfbkosak  StaticAssertTypeEq<tuple<int, char, int*>, args_type>();
644326aa564127acf095f6f0952b2f54d149a10d824shiqian  args_type args_copy = args;
645326aa564127acf095f6f0952b2f54d149a10d824shiqian  return get<0>(args_copy) + get<1>(args_copy);
646326aa564127acf095f6f0952b2f54d149a10d824shiqian}
647326aa564127acf095f6f0952b2f54d149a10d824shiqian
648326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceArgumentTuple) {
649326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int, char, int*)> a1 = Sum2();
650326aa564127acf095f6f0952b2f54d149a10d824shiqian  int dummy = 0;
65132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(11, a1.Perform(make_tuple(5, Char(6), &dummy)));
652326aa564127acf095f6f0952b2f54d149a10d824shiqian}
653326aa564127acf095f6f0952b2f54d149a10d824shiqian
654326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the mock function
655326aa564127acf095f6f0952b2f54d149a10d824shiqian// type.
656326aa564127acf095f6f0952b2f54d149a10d824shiqianint Dummy(bool flag) { return flag? 1 : 0; }
657326aa564127acf095f6f0952b2f54d149a10d824shiqian
658326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(InvokeDummy) {
659326aa564127acf095f6f0952b2f54d149a10d824shiqian  StaticAssertTypeEq<int(bool), function_type>();
660326aa564127acf095f6f0952b2f54d149a10d824shiqian  function_type* fp = &Dummy;
661326aa564127acf095f6f0952b2f54d149a10d824shiqian  return (*fp)(true);
662326aa564127acf095f6f0952b2f54d149a10d824shiqian}
663326aa564127acf095f6f0952b2f54d149a10d824shiqian
664326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceMockFunctionType) {
665326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(bool)> a1 = InvokeDummy();
666326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, a1.Perform(make_tuple(true)));
667326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, a1.Perform(make_tuple(false)));
668326aa564127acf095f6f0952b2f54d149a10d824shiqian}
669326aa564127acf095f6f0952b2f54d149a10d824shiqian
670326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the mock function's
671326aa564127acf095f6f0952b2f54d149a10d824shiqian// return type.
672326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(InvokeDummy2) {
673326aa564127acf095f6f0952b2f54d149a10d824shiqian  StaticAssertTypeEq<int, return_type>();
674326aa564127acf095f6f0952b2f54d149a10d824shiqian  return_type result = Dummy(true);
675326aa564127acf095f6f0952b2f54d149a10d824shiqian  return result;
676326aa564127acf095f6f0952b2f54d149a10d824shiqian}
677326aa564127acf095f6f0952b2f54d149a10d824shiqian
678326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceMockFunctionReturnType) {
679326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(bool)> a1 = InvokeDummy2();
680326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, a1.Perform(make_tuple(true)));
681326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(1, a1.Perform(make_tuple(false)));
682326aa564127acf095f6f0952b2f54d149a10d824shiqian}
683326aa564127acf095f6f0952b2f54d149a10d824shiqian
6847f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan// Tests that ACTION() works for arguments passed by const reference.
6857f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanACTION(ReturnAddrOfConstBoolReferenceArg) {
6867f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  StaticAssertTypeEq<const bool&, arg1_type>();
6877f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  return &arg1;
6887f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan}
6897f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan
6907f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanTEST(ActionMacroTest, WorksForConstReferenceArg) {
6917f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg();
6927f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  const bool b = false;
6937f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  EXPECT_EQ(&b, a.Perform(tuple<int, const bool&>(0, b)));
6947f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan}
6957f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan
6967f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan// Tests that ACTION() works for arguments passed by non-const reference.
6977f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanACTION(ReturnAddrOfIntReferenceArg) {
6987f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  StaticAssertTypeEq<int&, arg0_type>();
6997f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  return &arg0;
7007f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan}
7017f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan
7027f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanTEST(ActionMacroTest, WorksForNonConstReferenceArg) {
7037f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg();
7047f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  int n = 0;
7057f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan  EXPECT_EQ(&n, a.Perform(tuple<int&, bool, int>(n, true, 1)));
7067f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan}
7077f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan
708326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can be used in a namespace.
709326aa564127acf095f6f0952b2f54d149a10d824shiqiannamespace action_test {
710326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Sum) { return arg0 + arg1; }
711326aa564127acf095f6f0952b2f54d149a10d824shiqian}  // namespace action_test
712326aa564127acf095f6f0952b2f54d149a10d824shiqian
713326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksInNamespace) {
714326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int, int)> a1 = action_test::Sum();
715326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(3, a1.Perform(make_tuple(1, 2)));
716326aa564127acf095f6f0952b2f54d149a10d824shiqian}
717326aa564127acf095f6f0952b2f54d149a10d824shiqian
718326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the same ACTION definition works for mock functions with
719326aa564127acf095f6f0952b2f54d149a10d824shiqian// different argument numbers.
720326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(PlusTwo) { return arg0 + 2; }
721326aa564127acf095f6f0952b2f54d149a10d824shiqian
722326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksForDifferentArgumentNumbers) {
723326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = PlusTwo();
724326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(4, a1.Perform(make_tuple(2)));
725326aa564127acf095f6f0952b2f54d149a10d824shiqian
726326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<double(float, void*)> a2 = PlusTwo();
727326aa564127acf095f6f0952b2f54d149a10d824shiqian  int dummy;
728326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_DOUBLE_EQ(6, a2.Perform(make_tuple(4.0f, &dummy)));
729326aa564127acf095f6f0952b2f54d149a10d824shiqian}
730326aa564127acf095f6f0952b2f54d149a10d824shiqian
731326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION_P can define a parameterized action.
732326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(Plus, n) { return arg0 + n; }
733326aa564127acf095f6f0952b2f54d149a10d824shiqian
734326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, DefinesParameterizedAction) {
735326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int m, bool t)> a1 = Plus(9);
736326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10, a1.Perform(make_tuple(1, true)));
737326aa564127acf095f6f0952b2f54d149a10d824shiqian}
738326aa564127acf095f6f0952b2f54d149a10d824shiqian
739326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION_P can reference the argument types
740326aa564127acf095f6f0952b2f54d149a10d824shiqian// and the parameter type.
741326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(TypedPlus, n) {
742326aa564127acf095f6f0952b2f54d149a10d824shiqian  arg0_type t1 = arg0;
743326aa564127acf095f6f0952b2f54d149a10d824shiqian  n_type t2 = n;
744326aa564127acf095f6f0952b2f54d149a10d824shiqian  return t1 + t2;
745326aa564127acf095f6f0952b2f54d149a10d824shiqian}
746326aa564127acf095f6f0952b2f54d149a10d824shiqian
747326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) {
748326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(char m, bool t)> a1 = TypedPlus(9);
74932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(10, a1.Perform(make_tuple(Char(1), true)));
750326aa564127acf095f6f0952b2f54d149a10d824shiqian}
751326aa564127acf095f6f0952b2f54d149a10d824shiqian
752326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that a parameterized action can be used in any mock function
753326aa564127acf095f6f0952b2f54d149a10d824shiqian// whose type is compatible.
754326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, WorksInCompatibleMockFunction) {
755326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<std::string(const std::string& s)> a1 = Plus("tail");
756326aa564127acf095f6f0952b2f54d149a10d824shiqian  const std::string re = "re";
757f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  EXPECT_EQ("retail", a1.Perform(tuple<const std::string&>(re)));
758326aa564127acf095f6f0952b2f54d149a10d824shiqian}
759326aa564127acf095f6f0952b2f54d149a10d824shiqian
760326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that we can use ACTION*() to define actions overloaded on the
761326aa564127acf095f6f0952b2f54d149a10d824shiqian// number of parameters.
762326aa564127acf095f6f0952b2f54d149a10d824shiqian
763326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; }
764326aa564127acf095f6f0952b2f54d149a10d824shiqian
765326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(OverloadedAction, default_value) {
766326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 ? arg1 : default_value;
767326aa564127acf095f6f0952b2f54d149a10d824shiqian}
768326aa564127acf095f6f0952b2f54d149a10d824shiqian
769326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(OverloadedAction, true_value, false_value) {
770326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 ? true_value : false_value;
771326aa564127acf095f6f0952b2f54d149a10d824shiqian}
772326aa564127acf095f6f0952b2f54d149a10d824shiqian
773326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanDefineOverloadedActions) {
774326aa564127acf095f6f0952b2f54d149a10d824shiqian  typedef Action<const char*(bool, const char*)> MyAction;
775326aa564127acf095f6f0952b2f54d149a10d824shiqian
776326aa564127acf095f6f0952b2f54d149a10d824shiqian  const MyAction a1 = OverloadedAction();
77790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("hello", a1.Perform(make_tuple(false, CharPtr("world"))));
77890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("world", a1.Perform(make_tuple(true, CharPtr("world"))));
779326aa564127acf095f6f0952b2f54d149a10d824shiqian
780326aa564127acf095f6f0952b2f54d149a10d824shiqian  const MyAction a2 = OverloadedAction("hi");
78190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("hi", a2.Perform(make_tuple(false, CharPtr("world"))));
78290c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("world", a2.Perform(make_tuple(true, CharPtr("world"))));
783326aa564127acf095f6f0952b2f54d149a10d824shiqian
784326aa564127acf095f6f0952b2f54d149a10d824shiqian  const MyAction a3 = OverloadedAction("hi", "you");
78590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("hi", a3.Perform(make_tuple(true, CharPtr("world"))));
78690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_STREQ("you", a3.Perform(make_tuple(false, CharPtr("world"))));
787326aa564127acf095f6f0952b2f54d149a10d824shiqian}
788326aa564127acf095f6f0952b2f54d149a10d824shiqian
789326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests ACTION_Pn where n >= 3.
790326aa564127acf095f6f0952b2f54d149a10d824shiqian
791326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; }
792326aa564127acf095f6f0952b2f54d149a10d824shiqian
793326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor3Parameters) {
794326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4);
795326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_DOUBLE_EQ(3123.4, a1.Perform(make_tuple(3000, true)));
796326aa564127acf095f6f0952b2f54d149a10d824shiqian
797326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<std::string(const std::string& s)> a2 = Plus("tail", "-", ">");
798326aa564127acf095f6f0952b2f54d149a10d824shiqian  const std::string re = "re";
799f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  EXPECT_EQ("retail->", a2.Perform(tuple<const std::string&>(re)));
800326aa564127acf095f6f0952b2f54d149a10d824shiqian}
801326aa564127acf095f6f0952b2f54d149a10d824shiqian
802326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; }
803326aa564127acf095f6f0952b2f54d149a10d824shiqian
804326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor4Parameters) {
805326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4);
806326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(make_tuple(10)));
807326aa564127acf095f6f0952b2f54d149a10d824shiqian}
808326aa564127acf095f6f0952b2f54d149a10d824shiqian
809326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; }
810326aa564127acf095f6f0952b2f54d149a10d824shiqian
811326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor5Parameters) {
812326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5);
813326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(make_tuple(10)));
814326aa564127acf095f6f0952b2f54d149a10d824shiqian}
815326aa564127acf095f6f0952b2f54d149a10d824shiqian
816326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P6(Plus, p0, p1, p2, p3, p4, p5) {
817326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 + p0 + p1 + p2 + p3 + p4 + p5;
818326aa564127acf095f6f0952b2f54d149a10d824shiqian}
819326aa564127acf095f6f0952b2f54d149a10d824shiqian
820326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor6Parameters) {
821326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6);
822326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(make_tuple(10)));
823326aa564127acf095f6f0952b2f54d149a10d824shiqian}
824326aa564127acf095f6f0952b2f54d149a10d824shiqian
825326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) {
826326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;
827326aa564127acf095f6f0952b2f54d149a10d824shiqian}
828326aa564127acf095f6f0952b2f54d149a10d824shiqian
829326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor7Parameters) {
830326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7);
831326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(make_tuple(10)));
832326aa564127acf095f6f0952b2f54d149a10d824shiqian}
833326aa564127acf095f6f0952b2f54d149a10d824shiqian
834326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) {
835326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
836326aa564127acf095f6f0952b2f54d149a10d824shiqian}
837326aa564127acf095f6f0952b2f54d149a10d824shiqian
838326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor8Parameters) {
839326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8);
840326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8, a1.Perform(make_tuple(10)));
841326aa564127acf095f6f0952b2f54d149a10d824shiqian}
842326aa564127acf095f6f0952b2f54d149a10d824shiqian
843326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) {
844326aa564127acf095f6f0952b2f54d149a10d824shiqian  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;
845326aa564127acf095f6f0952b2f54d149a10d824shiqian}
846326aa564127acf095f6f0952b2f54d149a10d824shiqian
847326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor9Parameters) {
848326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9);
849326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, a1.Perform(make_tuple(10)));
850326aa564127acf095f6f0952b2f54d149a10d824shiqian}
851326aa564127acf095f6f0952b2f54d149a10d824shiqian
852326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) {
853326aa564127acf095f6f0952b2f54d149a10d824shiqian  arg0_type t0 = arg0;
854326aa564127acf095f6f0952b2f54d149a10d824shiqian  last_param_type t9 = last_param;
855326aa564127acf095f6f0952b2f54d149a10d824shiqian  return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9;
856326aa564127acf095f6f0952b2f54d149a10d824shiqian}
857326aa564127acf095f6f0952b2f54d149a10d824shiqian
858326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor10Parameters) {
859326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
860326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10,
861326aa564127acf095f6f0952b2f54d149a10d824shiqian            a1.Perform(make_tuple(10)));
862326aa564127acf095f6f0952b2f54d149a10d824shiqian}
863326aa564127acf095f6f0952b2f54d149a10d824shiqian
864326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the action body can promote the parameter types.
865326aa564127acf095f6f0952b2f54d149a10d824shiqian
866326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(PadArgument, prefix, suffix) {
867326aa564127acf095f6f0952b2f54d149a10d824shiqian  // The following lines promote the two parameters to desired types.
868326aa564127acf095f6f0952b2f54d149a10d824shiqian  std::string prefix_str(prefix);
86932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  char suffix_char = static_cast<char>(suffix);
870326aa564127acf095f6f0952b2f54d149a10d824shiqian  return prefix_str + arg0 + suffix_char;
871326aa564127acf095f6f0952b2f54d149a10d824shiqian}
872326aa564127acf095f6f0952b2f54d149a10d824shiqian
873326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, SimpleTypePromotion) {
874326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<std::string(const char*)> no_promo =
875326aa564127acf095f6f0952b2f54d149a10d824shiqian      PadArgument(std::string("foo"), 'r');
876326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<std::string(const char*)> promo =
877326aa564127acf095f6f0952b2f54d149a10d824shiqian      PadArgument("foo", static_cast<int>('r'));
87890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("foobar", no_promo.Perform(make_tuple(CharPtr("ba"))));
87990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan  EXPECT_EQ("foobar", promo.Perform(make_tuple(CharPtr("ba"))));
880326aa564127acf095f6f0952b2f54d149a10d824shiqian}
881326aa564127acf095f6f0952b2f54d149a10d824shiqian
882326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that we can partially restrict parameter types using a
883326aa564127acf095f6f0952b2f54d149a10d824shiqian// straight-forward pattern.
884326aa564127acf095f6f0952b2f54d149a10d824shiqian
885326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines a generic action that doesn't restrict the types of its
886326aa564127acf095f6f0952b2f54d149a10d824shiqian// parameters.
887326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P3(ConcatImpl, a, b, c) {
888326aa564127acf095f6f0952b2f54d149a10d824shiqian  std::stringstream ss;
889326aa564127acf095f6f0952b2f54d149a10d824shiqian  ss << a << b << c;
890326aa564127acf095f6f0952b2f54d149a10d824shiqian  return ss.str();
891326aa564127acf095f6f0952b2f54d149a10d824shiqian}
892326aa564127acf095f6f0952b2f54d149a10d824shiqian
893326aa564127acf095f6f0952b2f54d149a10d824shiqian// Next, we try to restrict that either the first parameter is a
894326aa564127acf095f6f0952b2f54d149a10d824shiqian// string, or the second parameter is an int.
895326aa564127acf095f6f0952b2f54d149a10d824shiqian
896326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines a partially specialized wrapper that restricts the first
897326aa564127acf095f6f0952b2f54d149a10d824shiqian// parameter to std::string.
898326aa564127acf095f6f0952b2f54d149a10d824shiqiantemplate <typename T1, typename T2>
899326aa564127acf095f6f0952b2f54d149a10d824shiqian// ConcatImplActionP3 is the class template ACTION_P3 uses to
900326aa564127acf095f6f0952b2f54d149a10d824shiqian// implement ConcatImpl.  We shouldn't change the name as this
901326aa564127acf095f6f0952b2f54d149a10d824shiqian// pattern requires the user to use it directly.
902326aa564127acf095f6f0952b2f54d149a10d824shiqianConcatImplActionP3<std::string, T1, T2>
903326aa564127acf095f6f0952b2f54d149a10d824shiqianConcat(const std::string& a, T1 b, T2 c) {
9041f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  GTEST_INTENTIONAL_CONST_COND_PUSH_()
905326aa564127acf095f6f0952b2f54d149a10d824shiqian  if (true) {
9061f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  GTEST_INTENTIONAL_CONST_COND_POP_()
907326aa564127acf095f6f0952b2f54d149a10d824shiqian    // This branch verifies that ConcatImpl() can be invoked without
908326aa564127acf095f6f0952b2f54d149a10d824shiqian    // explicit template arguments.
909326aa564127acf095f6f0952b2f54d149a10d824shiqian    return ConcatImpl(a, b, c);
910326aa564127acf095f6f0952b2f54d149a10d824shiqian  } else {
911326aa564127acf095f6f0952b2f54d149a10d824shiqian    // This branch verifies that ConcatImpl() can also be invoked with
912326aa564127acf095f6f0952b2f54d149a10d824shiqian    // explicit template arguments.  It doesn't really need to be
913326aa564127acf095f6f0952b2f54d149a10d824shiqian    // executed as this is a compile-time verification.
914326aa564127acf095f6f0952b2f54d149a10d824shiqian    return ConcatImpl<std::string, T1, T2>(a, b, c);
915326aa564127acf095f6f0952b2f54d149a10d824shiqian  }
916326aa564127acf095f6f0952b2f54d149a10d824shiqian}
917326aa564127acf095f6f0952b2f54d149a10d824shiqian
918326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines another partially specialized wrapper that restricts the
919326aa564127acf095f6f0952b2f54d149a10d824shiqian// second parameter to int.
920326aa564127acf095f6f0952b2f54d149a10d824shiqiantemplate <typename T1, typename T2>
921326aa564127acf095f6f0952b2f54d149a10d824shiqianConcatImplActionP3<T1, int, T2>
922326aa564127acf095f6f0952b2f54d149a10d824shiqianConcat(T1 a, int b, T2 c) {
923326aa564127acf095f6f0952b2f54d149a10d824shiqian  return ConcatImpl(a, b, c);
924326aa564127acf095f6f0952b2f54d149a10d824shiqian}
925326aa564127acf095f6f0952b2f54d149a10d824shiqian
926326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {
927326aa564127acf095f6f0952b2f54d149a10d824shiqian  Action<const std::string()> a1 = Concat("Hello", "1", 2);
928326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ("Hello12", a1.Perform(make_tuple()));
929326aa564127acf095f6f0952b2f54d149a10d824shiqian
930326aa564127acf095f6f0952b2f54d149a10d824shiqian  a1 = Concat(1, 2, 3);
931326aa564127acf095f6f0952b2f54d149a10d824shiqian  EXPECT_EQ("123", a1.Perform(make_tuple()));
932326aa564127acf095f6f0952b2f54d149a10d824shiqian}
933326aa564127acf095f6f0952b2f54d149a10d824shiqian
934326aa564127acf095f6f0952b2f54d149a10d824shiqian// Verifies the type of an ACTION*.
935326aa564127acf095f6f0952b2f54d149a10d824shiqian
936326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(DoFoo) {}
937326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(DoFoo, p) {}
938326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(DoFoo, p0, p1) {}
939326aa564127acf095f6f0952b2f54d149a10d824shiqian
940326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, TypesAreCorrect) {
941326aa564127acf095f6f0952b2f54d149a10d824shiqian  // DoFoo() must be assignable to a DoFooAction variable.
942326aa564127acf095f6f0952b2f54d149a10d824shiqian  DoFooAction a0 = DoFoo();
943326aa564127acf095f6f0952b2f54d149a10d824shiqian
944326aa564127acf095f6f0952b2f54d149a10d824shiqian  // DoFoo(1) must be assignable to a DoFooActionP variable.
945326aa564127acf095f6f0952b2f54d149a10d824shiqian  DoFooActionP<int> a1 = DoFoo(1);
946326aa564127acf095f6f0952b2f54d149a10d824shiqian
947326aa564127acf095f6f0952b2f54d149a10d824shiqian  // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk
948326aa564127acf095f6f0952b2f54d149a10d824shiqian  // variable, and so on.
949326aa564127acf095f6f0952b2f54d149a10d824shiqian  DoFooActionP2<int, char> a2 = DoFoo(1, '2');
950326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP3<int, int, char> a3 = Plus(1, 2, '3');
951326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4');
952326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5');
953326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6');
954326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP7<int, int, int, int, int, int, char> a7 =
955326aa564127acf095f6f0952b2f54d149a10d824shiqian      Plus(1, 2, 3, 4, 5, 6, '7');
956326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP8<int, int, int, int, int, int, int, char> a8 =
957326aa564127acf095f6f0952b2f54d149a10d824shiqian      Plus(1, 2, 3, 4, 5, 6, 7, '8');
958326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =
959326aa564127acf095f6f0952b2f54d149a10d824shiqian      Plus(1, 2, 3, 4, 5, 6, 7, 8, '9');
960326aa564127acf095f6f0952b2f54d149a10d824shiqian  PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =
961326aa564127acf095f6f0952b2f54d149a10d824shiqian      Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');
96229be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan
96329be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  // Avoid "unused variable" warnings.
96429be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a0;
96529be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a1;
96629be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a2;
96729be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a3;
96829be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a4;
96929be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a5;
97029be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a6;
97129be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a7;
97229be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a8;
97329be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a9;
97429be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan  (void)a10;
975326aa564127acf095f6f0952b2f54d149a10d824shiqian}
976326aa564127acf095f6f0952b2f54d149a10d824shiqian
977c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan// Tests that an ACTION_P*() action can be explicitly instantiated
978c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan// with reference-typed parameters.
979c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
980c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P(Plus1, x) { return x; }
981c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P2(Plus2, x, y) { return x + y; }
982c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P3(Plus3, x, y, z) { return x + y + z; }
983c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
984c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
985c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan}
986c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
987c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanTEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
988c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  int x = 1, y = 2, z = 3;
989c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  const tuple<> empty = make_tuple();
990c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
991c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  Action<int()> a = Plus1<int&>(x);
992c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  EXPECT_EQ(1, a.Perform(empty));
993c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
994c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  a = Plus2<const int&, int&>(x, y);
995c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  EXPECT_EQ(3, a.Perform(empty));
996c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
997c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  a = Plus3<int&, const int&, int&>(x, y, z);
998c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  EXPECT_EQ(6, a.Perform(empty));
999c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
1000c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
1001c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,
1002c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan      int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],
1003c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan                              n[8], n[9]);
1004c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan  EXPECT_EQ(55, a.Perform(empty));
1005c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan}
1006c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan
10071c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass NullaryConstructorClass {
10081c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public:
10091c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  NullaryConstructorClass() : value_(123) {}
10101c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  int value_;
10111c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan};
10121c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10131c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a nullary constructor.
10141c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, NoArgs) {
10151c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();
10161c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  NullaryConstructorClass* c = a.Perform(make_tuple());
10171c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  EXPECT_EQ(123, c->value_);
10181c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  delete c;
10191c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}
10201c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10211c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass UnaryConstructorClass {
10221c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public:
10231c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  explicit UnaryConstructorClass(int value) : value_(value) {}
10241c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  int value_;
10251c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan};
10261c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10271c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a unary constructor.
10281c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, Unary) {
10291c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
10301c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  UnaryConstructorClass* c = a.Perform(make_tuple());
10311c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  EXPECT_EQ(4000, c->value_);
10321c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  delete c;
10331c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}
10341c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10351c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
10361c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  Action<UnaryConstructorClass*(bool, int)> a =
10371c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan      ReturnNew<UnaryConstructorClass>(4000);
10381c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  UnaryConstructorClass* c = a.Perform(make_tuple(false, 5));
10391c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  EXPECT_EQ(4000, c->value_);
10401c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  delete c;
10411c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}
10421c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10431c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
10441c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  Action<const UnaryConstructorClass*()> a =
10451c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan      ReturnNew<UnaryConstructorClass>(4000);
10461c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  const UnaryConstructorClass* c = a.Perform(make_tuple());
10471c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  EXPECT_EQ(4000, c->value_);
10481c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  delete c;
10491c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}
10501c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10511c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass TenArgConstructorClass {
10521c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public:
10531c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5,
10541c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan                         int a6, int a7, int a8, int a9, int a10)
10551c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan    : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {
10561c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  }
10571c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  int value_;
10581c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan};
10591c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
10601c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a 10-argument constructor.
10611c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
10621c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  Action<TenArgConstructorClass*()> a =
10631c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan      ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,
10641c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan                                        4000000, 500000, 60000,
10651c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan                                        7000, 800, 90, 0);
10661c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  TenArgConstructorClass* c = a.Perform(make_tuple());
10671c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  EXPECT_EQ(1234567890, c->value_);
10681c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan  delete c;
10691c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}
10701c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan
107118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works when there is no value parameter.
107218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(CreateNew,
107318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(typename, T),
107418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_0_VALUE_PARAMS()) {
107518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return new T;
107618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
107718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
107818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksWithoutValueParam) {
107918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int*()> a = CreateNew<int>();
108018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int* p = a.Perform(make_tuple());
108118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  delete p;
108218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
108318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
108418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works when there are value parameters.
108518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(CreateNew,
108618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(typename, T),
108718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_1_VALUE_PARAMS(a0)) {
108818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return new T(a0);
108918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
109018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
109118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksWithValueParams) {
109218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int*()> a = CreateNew<int>(42);
109318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int* p = a.Perform(make_tuple());
109418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(42, *p);
109518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  delete p;
109618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
109718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
109818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for integral template parameters.
109918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(MyDeleteArg,
110018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(int, k),
110118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_0_VALUE_PARAMS()) {
1102bd0188320de5aab1b09718e2c466387099d43cfbkosak  delete get<k>(args);
110318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
110418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
110518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Resets a bool variable in the destructor.
110618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass BoolResetter {
110718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan public:
110818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  explicit BoolResetter(bool* value) : value_(value) {}
110918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  ~BoolResetter() { *value_ = false; }
111018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan private:
111132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  bool* value_;
111218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan};
111318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
111418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
111518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
111618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n = 0;
111718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  bool b = true;
111818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  BoolResetter* resetter = new BoolResetter(&b);
111918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  a.Perform(make_tuple(&n, resetter));
112018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(b);  // Verifies that resetter is deleted.
112118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
112218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
112318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATES works for template template parameters.
112418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSmartPointer,
112518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
112618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                                      Pointer),
112718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_1_VALUE_PARAMS(pointee)) {
112818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return Pointer<pointee_type>(new pointee_type(pointee));
112918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
113018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
113118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
113218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  using ::testing::internal::linked_ptr;
113318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);
113418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  linked_ptr<int> p = a.Perform(make_tuple());
113518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(42, *p);
113618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
113718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
113818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for 10 template parameters.
113918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wantemplate <typename T1, typename T2, typename T3, int k4, bool k5,
114018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan          unsigned int k6, typename T7, typename T8, typename T9>
114118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanstruct GiantTemplate {
114218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan public:
114318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  explicit GiantTemplate(int a_value) : value(a_value) {}
114418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int value;
114518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan};
114618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
114718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnGiant,
114818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_10_TEMPLATE_PARAMS(
114918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    typename, T1,
115018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    typename, T2,
115118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    typename, T3,
115218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    int, k4,
115318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    bool, k5,
115418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    unsigned int, k6,
115518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    class, T7,
115618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    class, T8,
115718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    class, T9,
115818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                    template <typename T> class, T10),
115918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_1_VALUE_PARAMS(value)) {
116018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
116118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
116218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
116318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksFor10TemplateParameters) {
116418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  using ::testing::internal::linked_ptr;
116518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  typedef GiantTemplate<linked_ptr<int>, bool, double, 5,
116618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan      true, 6, char, unsigned, int> Giant;
116718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<Giant()> a = ReturnGiant<
116818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan      int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);
116918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Giant giant = a.Perform(make_tuple());
117018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(42, giant.value);
117118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
117218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
117318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for 10 value parameters.
117418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum,
117518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(typename, Number),
117618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
117718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
117818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
117918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
118018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksFor10ValueParameters) {
118118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
118218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(55, a.Perform(make_tuple()));
118318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
118418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
118518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
118618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// on the number of value parameters.
118718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
118818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION(ReturnSum) { return 0; }
118918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
119018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_P(ReturnSum, x) { return x; }
119118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
119218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum,
119318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(typename, Number),
119418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_2_VALUE_PARAMS(v1, v2)) {
119518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return static_cast<Number>(v1) + v2;
119618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
119718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
119818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum,
119918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_1_TEMPLATE_PARAMS(typename, Number),
120018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_3_VALUE_PARAMS(v1, v2, v3)) {
120118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return static_cast<Number>(v1) + v2 + v3;
120218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
120318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
120418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum,
120518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
120618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan                AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
120718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  return static_cast<Number>(v1) + v2 + v3 + v4 + k;
120818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
120918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
121018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
121118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a0 = ReturnSum();
121218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a1 = ReturnSum(1);
121318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a2 = ReturnSum<int>(1, 2);
121418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
121518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
121618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(0, a0.Perform(make_tuple()));
121718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(1, a1.Perform(make_tuple()));
121818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(3, a2.Perform(make_tuple()));
121918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(6, a3.Perform(make_tuple()));
122018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_EQ(12345, a4.Perform(make_tuple()));
122118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
122218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
122332de5f53763125925e078498250f7e73a88de9edzhanyong.wan#ifdef _MSC_VER
1224658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(pop)
122532de5f53763125925e078498250f7e73a88de9edzhanyong.wan#endif
122632de5f53763125925e078498250f7e73a88de9edzhanyong.wan
1227e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace gmock_generated_actions_test
1228e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace testing
1229