1a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Copyright 2007, Google Inc.
2a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// All rights reserved.
3a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//
4a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Redistribution and use in source and binary forms, with or without
5a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// modification, are permitted provided that the following conditions are
6a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// met:
7a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//
8a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//     * Redistributions of source code must retain the above copyright
9a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// notice, this list of conditions and the following disclaimer.
10a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//     * Redistributions in binary form must reproduce the above
11a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// copyright notice, this list of conditions and the following disclaimer
12a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// in the documentation and/or other materials provided with the
13a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// distribution.
14a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//     * Neither the name of Google Inc. nor the names of its
15a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// contributors may be used to endorse or promote products derived from
16a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// this software without specific prior written permission.
17a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//
18a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//
30a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Author: wan@google.com (Zhanyong Wan)
31a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
32a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Google Mock - a framework for writing C++ mock classes.
33a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan//
34a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// This file tests the built-in actions in gmock-more-actions.h.
35a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-more-actions.h"
37a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
38a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan#include <functional>
39a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan#include <sstream>
40a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan#include <string>
4153e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h"
4253e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h"
432321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan#include "gtest/internal/gtest-linked_ptr.h"
44a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
45a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wannamespace testing {
46a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wannamespace gmock_more_actions_test {
47a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
48a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing ::std::plus;
49a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing ::std::string;
50bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::get;
51bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::make_tuple;
52bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple;
53bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple_element;
54a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::_;
55a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::Action;
56a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::ActionInterface;
57a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::DeleteArg;
58a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::Invoke;
59a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::Return;
60a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::ReturnArg;
61e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wanusing testing::ReturnPointee;
62a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::SaveArg;
632321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wanusing testing::SaveArgPointee;
64a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::SetArgReferee;
65a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::StaticAssertTypeEq;
66a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::Unused;
67a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::WithArg;
68a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanusing testing::WithoutArgs;
692321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wanusing testing::internal::linked_ptr;
70a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
7132de5f53763125925e078498250f7e73a88de9edzhanyong.wan// For suppressing compiler warnings on conversion possibly losing precision.
7232de5f53763125925e078498250f7e73a88de9edzhanyong.waninline short Short(short n) { return n; }  // NOLINT
7332de5f53763125925e078498250f7e73a88de9edzhanyong.waninline char Char(char ch) { return ch; }
7432de5f53763125925e078498250f7e73a88de9edzhanyong.wan
75a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Sample functions and functors for testing Invoke() and etc.
76a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint Nullary() { return 1; }
77a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
78a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanclass NullaryFunctor {
79a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan public:
80a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int operator()() { return 2; }
81a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
82a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
83a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanbool g_done = false;
84a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanvoid VoidNullary() { g_done = true; }
85a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
86a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanclass VoidNullaryFunctor {
87a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan public:
88a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  void operator()() { g_done = true; }
89a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
90a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
91a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanbool Unary(int x) { return x < 0; }
92a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
93a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanconst char* Plus1(const char* s) { return s + 1; }
94a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
9532de5f53763125925e078498250f7e73a88de9edzhanyong.wanvoid VoidUnary(int /* n */) { g_done = true; }
96a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
9709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberbool ByConstRef(const std::string& s) { return s == "Hi"; }
98a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
99a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanconst double g_double = 0;
100a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
101a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
10209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string ByNonConstRef(std::string& s) { return s += "+"; }  // NOLINT
103a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
104a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanstruct UnaryFunctor {
105a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int operator()(bool x) { return x ? 1 : -1; }
106a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
107a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
108a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanconst char* Binary(const char* input, short n) { return input + n; }  // NOLINT
109a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
110a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanvoid VoidBinary(int, char) { g_done = true; }
111a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
112a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
113a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
114a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanvoid VoidTernary(int, char, bool) { g_done = true; }
115a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
116a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
117a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
118a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint SumOfFirst2(int a, int b, Unused, Unused) { return a + b; }
119a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
120a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanvoid VoidFunctionWithFourArguments(char, int, float, double) { g_done = true; }
121a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
12209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat4(const char* s1, const char* s2, const char* s3,
12309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4) {
12409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4;
125a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
126a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
127a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
128a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
129a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanstruct SumOf5Functor {
130a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int operator()(int a, int b, int c, int d, int e) {
131a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    return a + b + c + d + e;
132a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
133a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
134a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
13509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat5(const char* s1, const char* s2, const char* s3,
13609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5) {
13709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5;
138a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
139a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
140a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanint SumOf6(int a, int b, int c, int d, int e, int f) {
141a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  return a + b + c + d + e + f;
142a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
143a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
144a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanstruct SumOf6Functor {
145a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int operator()(int a, int b, int c, int d, int e, int f) {
146a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    return a + b + c + d + e + f;
147a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
148a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
149a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
15009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat6(const char* s1, const char* s2, const char* s3,
15109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6) {
15209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6;
153a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
154a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
15509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat7(const char* s1, const char* s2, const char* s3,
15609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
15709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7) {
15809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
159a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
160a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
16109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat8(const char* s1, const char* s2, const char* s3,
16209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
16309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7, const char* s8) {
16409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
165a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
166a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
16709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat9(const char* s1, const char* s2, const char* s3,
16809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s4, const char* s5, const char* s6,
16909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                    const char* s7, const char* s8, const char* s9) {
17009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
171a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
172a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
17309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat10(const char* s1, const char* s2, const char* s3,
17409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s4, const char* s5, const char* s6,
17509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s7, const char* s8, const char* s9,
17609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char* s10) {
17709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
178a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
179a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
180a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanclass Foo {
181a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan public:
182a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo() : value_(123) {}
183a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
184a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int Nullary() const { return value_; }
185a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
186a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  short Unary(long x) { return static_cast<short>(value_ + x); }  // NOLINT
187a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
18809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  std::string Binary(const std::string& str, char c) const { return str + c; }
189a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
190a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int Ternary(int x, bool y, char z) { return value_ + x + y*z; }
191a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
192a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int SumOf4(int a, int b, int c, int d) const {
193a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    return a + b + c + d + value_;
194a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
195a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
196a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int SumOfLast2(Unused, Unused, int a, int b) const { return a + b; }
197a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
198a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
199a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
200a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int SumOf6(int a, int b, int c, int d, int e, int f) {
201a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    return a + b + c + d + e + f;
202a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
203a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
20409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  std::string Concat7(const char* s1, const char* s2, const char* s3,
20509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s4, const char* s5, const char* s6,
20609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s7) {
20709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
208a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
209a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
21009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  std::string Concat8(const char* s1, const char* s2, const char* s3,
21109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s4, const char* s5, const char* s6,
21209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s7, const char* s8) {
21309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
214a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
215a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
21609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  std::string Concat9(const char* s1, const char* s2, const char* s3,
21709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s4, const char* s5, const char* s6,
21809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                      const char* s7, const char* s8, const char* s9) {
21909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
220a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
221a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
22209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  std::string Concat10(const char* s1, const char* s2, const char* s3,
22309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                       const char* s4, const char* s5, const char* s6,
22409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                       const char* s7, const char* s8, const char* s9,
22509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                       const char* s10) {
22609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber    return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
227a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
22879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
229a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan private:
230a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int value_;
231a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
232a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
233a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a nullary function.
234a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, Nullary) {
235a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int()> a = Invoke(Nullary);  // NOLINT
236a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1, a.Perform(make_tuple()));
237a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
238a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
239a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a unary function.
240a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, Unary) {
241a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<bool(int)> a = Invoke(Unary);  // NOLINT
242a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_FALSE(a.Perform(make_tuple(1)));
243a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_TRUE(a.Perform(make_tuple(-1)));
244a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
245a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
246a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a binary function.
247a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, Binary) {
248a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<const char*(const char*, short)> a = Invoke(Binary);  // NOLINT
249a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const char* p = "Hello";
25032de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(p + 2, a.Perform(make_tuple(p, Short(2))));
251a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
252a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
253a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a ternary function.
254a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, Ternary) {
255a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, char, short)> a = Invoke(Ternary);  // NOLINT
25632de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(6, a.Perform(make_tuple(1, '\2', Short(3))));
257a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
258a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
259a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 4-argument function.
260a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes4Arguments) {
261a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int)> a = Invoke(SumOf4);  // NOLINT
262a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1234, a.Perform(make_tuple(1000, 200, 30, 4)));
263a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
264a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
265a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 5-argument function.
266a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes5Arguments) {
267a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int, int)> a = Invoke(SumOf5);  // NOLINT
268a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));
269a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
270a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
271a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 6-argument function.
272a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes6Arguments) {
273a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int, int, int)> a = Invoke(SumOf6);  // NOLINT
274a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));
275a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
276a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
277a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// A helper that turns the type of a C-string literal from const
278a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// char[N] to const char*.
279a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.waninline const char* CharPtr(const char* s) { return s; }
280a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
281a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 7-argument function.
282a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes7Arguments) {
28309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
28409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*)>
28509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(Concat7);
286a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("1234567",
287a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
288a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
289a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"))));
290a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
291a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
292a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 8-argument function.
293a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes8Arguments) {
29409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
29509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*)>
29609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(Concat8);
297a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("12345678",
298a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
299a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
300a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"))));
301a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
302a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
303a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 9-argument function.
304a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes9Arguments) {
30509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
30609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*,
30709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*)>
30809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(Concat9);
309a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("123456789",
310a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
311a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
312a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"), CharPtr("9"))));
313a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
314a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
315a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 10-argument function.
316a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionThatTakes10Arguments) {
31709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
31809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*,
31909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*)>
32009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(Concat10);
321a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("1234567890",
322a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
323a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
324a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"), CharPtr("9"),
325a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("0"))));
326a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
327a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
328a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with functions with parameters declared as Unused.
329a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionWithUnusedParameters) {
330a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, double, const string&)> a1 =
331a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan      Invoke(SumOfFirst2);
332f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  string s("hi");
333f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  EXPECT_EQ(12, a1.Perform(
334f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue    tuple<int, int, double, const string&>(10, 2, 5.6, s)));
335a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
336a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, bool, int*)> a2 =
337a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan      Invoke(SumOfFirst2);
338a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(23, a2.Perform(make_tuple(20, 3, true, static_cast<int*>(NULL))));
339a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
340a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
341a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with methods with parameters declared as Unused.
342a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, MethodWithUnusedParameters) {
343a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
34409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<int(std::string, bool, int, int)> a1 = Invoke(&foo, &Foo::SumOfLast2);
345a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(12, a1.Perform(make_tuple(CharPtr("hi"), true, 10, 2)));
346a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
347a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(char, double, int, int)> a2 =
348a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan      Invoke(&foo, &Foo::SumOfLast2);
349a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(23, a2.Perform(make_tuple('a', 2.5, 20, 3)));
350a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
351a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
352a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a functor.
353a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, Functor) {
35432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  Action<long(long, int)> a = Invoke(plus<long>());  // NOLINT
35532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(3L, a.Perform(make_tuple(1, 2)));
356a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
357a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
358a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke(f) as an action of a compatible type.
359a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeTest, FunctionWithCompatibleType) {
360a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<long(int, short, char, bool)> a = Invoke(SumOf4);  // NOLINT
36132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(4321, a.Perform(make_tuple(4000, Short(300), Char(20), true)));
362a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
363a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
364a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with an object pointer and a method pointer.
365a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
366a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a nullary method.
367a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, Nullary) {
368a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
369a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int()> a = Invoke(&foo, &Foo::Nullary);  // NOLINT
370a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(123, a.Perform(make_tuple()));
371a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
372a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
373a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a unary method.
374a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, Unary) {
375a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
376a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<short(long)> a = Invoke(&foo, &Foo::Unary);  // NOLINT
377a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(4123, a.Perform(make_tuple(4000)));
378a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
379a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
380a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a binary method.
381a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, Binary) {
382a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
383a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<string(const string&, char)> a = Invoke(&foo, &Foo::Binary);
384a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  string s("Hell");
385f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue  EXPECT_EQ("Hello", a.Perform(
386f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue      tuple<const string&, char>(s, 'o')));
387a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
388a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
389a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a ternary method.
390a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, Ternary) {
391a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
392a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, bool, char)> a = Invoke(&foo, &Foo::Ternary);  // NOLINT
39332de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(1124, a.Perform(make_tuple(1000, true, Char(1))));
394a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
395a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
396a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 4-argument method.
397a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes4Arguments) {
398a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
399a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int)> a = Invoke(&foo, &Foo::SumOf4);  // NOLINT
400a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1357, a.Perform(make_tuple(1000, 200, 30, 4)));
401a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
402a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
403a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 5-argument method.
404a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes5Arguments) {
405a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
406a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int, int)> a = Invoke(&foo, &Foo::SumOf5);  // NOLINT
407a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));
408a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
409a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
410a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 6-argument method.
411a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes6Arguments) {
412a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
413a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int, int, int, int, int, int)> a =  // NOLINT
414a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan      Invoke(&foo, &Foo::SumOf6);
415a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));
416a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
417a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
418a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 7-argument method.
419a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes7Arguments) {
420a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
42109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
42209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*)>
42309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(&foo, &Foo::Concat7);
424a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("1234567",
425a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
426a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
427a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"))));
428a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
429a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
430a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 8-argument method.
431a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes8Arguments) {
432a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
43309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
43409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*)>
43509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(&foo, &Foo::Concat8);
436a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("12345678",
437a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
438a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
439a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"))));
440a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
441a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
442a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 9-argument method.
443a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes9Arguments) {
444a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
44509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
44609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*,
44709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*)>
44809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(&foo, &Foo::Concat9);
449a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("123456789",
450a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
451a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
452a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"), CharPtr("9"))));
453a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
454a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
455a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke() with a 10-argument method.
456a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodThatTakes10Arguments) {
457a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
45809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  Action<std::string(const char*, const char*, const char*, const char*,
45909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*, const char*, const char*,
46009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber                     const char*, const char*)>
46109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber      a = Invoke(&foo, &Foo::Concat10);
462a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ("1234567890",
463a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
464a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
465a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("7"), CharPtr("8"), CharPtr("9"),
466a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                                 CharPtr("0"))));
467a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
468a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
469a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using Invoke(f) as an action of a compatible type.
470a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(InvokeMethodTest, MethodWithCompatibleType) {
471a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Foo foo;
472a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<long(int, short, char, bool)> a =  // NOLINT
473a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan      Invoke(&foo, &Foo::SumOf4);
47432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  EXPECT_EQ(4444, a.Perform(make_tuple(4000, Short(300), Char(20), true)));
475a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
476a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
477a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using WithoutArgs with an action that takes no argument.
478a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(WithoutArgsTest, NoArg) {
479a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<int(int n)> a = WithoutArgs(Invoke(Nullary));  // NOLINT
480a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1, a.Perform(make_tuple(2)));
481a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
482a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
483a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using WithArg with an action that takes 1 argument.
484a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(WithArgTest, OneArg) {
485a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<bool(double x, int n)> b = WithArg<1>(Invoke(Unary));  // NOLINT
486a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_TRUE(b.Perform(make_tuple(1.5, -1)));
487a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_FALSE(b.Perform(make_tuple(1.5, 1)));
488a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
489a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
490a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ReturnArgActionTest, WorksForOneArgIntArg0) {
491a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<int(int)> a = ReturnArg<0>();
492a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(5, a.Perform(make_tuple(5)));
493a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
494a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
495a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ReturnArgActionTest, WorksForMultiArgBoolArg0) {
496a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<bool(bool, bool, bool)> a = ReturnArg<0>();
497a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_TRUE(a.Perform(make_tuple(true, false, false)));
498a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
499a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
500a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ReturnArgActionTest, WorksForMultiArgStringArg2) {
50109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  const Action<std::string(int, int, std::string, int)> a = ReturnArg<2>();
50209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber  EXPECT_EQ("seven", a.Perform(make_tuple(5, 6, std::string("seven"), 8)));
503a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
504a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
505a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SaveArgActionTest, WorksForSameType) {
506a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int result = 0;
507a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(int n)> a1 = SaveArg<0>(&result);
508a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(make_tuple(5));
509a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(5, result);
510a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
511a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
512a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SaveArgActionTest, WorksForCompatibleType) {
513a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int result = 0;
514a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(bool, char)> a1 = SaveArg<1>(&result);
515a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(make_tuple(true, 'a'));
516a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('a', result);
517a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
518a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
5192321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wanTEST(SaveArgPointeeActionTest, WorksForSameType) {
5202321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  int result = 0;
5212321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  const int value = 5;
5222321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  const Action<void(const int*)> a1 = SaveArgPointee<0>(&result);
5232321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  a1.Perform(make_tuple(&value));
5242321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  EXPECT_EQ(5, result);
5252321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan}
5262321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan
5272321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wanTEST(SaveArgPointeeActionTest, WorksForCompatibleType) {
5282321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  int result = 0;
5292321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  char value = 'a';
5302321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  const Action<void(bool, char*)> a1 = SaveArgPointee<1>(&result);
5312321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  a1.Perform(make_tuple(true, &value));
5322321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  EXPECT_EQ('a', result);
5332321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan}
5342321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan
5352321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wanTEST(SaveArgPointeeActionTest, WorksForLinkedPtr) {
5362321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  int result = 0;
5372321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  linked_ptr<int> value(new int(5));
5382321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  const Action<void(linked_ptr<int>)> a1 = SaveArgPointee<0>(&result);
5392321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  a1.Perform(make_tuple(value));
5402321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan  EXPECT_EQ(5, result);
5412321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan}
5422321b2a6757328bbf30b69af434c28dac3060b83zhanyong.wan
543a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArgRefereeActionTest, WorksForSameType) {
544a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int value = 0;
545a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(int&)> a1 = SetArgReferee<0>(1);
546a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(tuple<int&>(value));
547a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1, value);
548a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
549a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
550a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArgRefereeActionTest, WorksForCompatibleType) {
551a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int value = 0;
552a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(int, int&)> a1 = SetArgReferee<1>('a');
553a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(tuple<int, int&>(0, value));
554a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('a', value);
555a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
556a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
557a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArgRefereeActionTest, WorksWithExtraArguments) {
558a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int value = 0;
559a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(bool, int, int&, const char*)> a1 = SetArgReferee<2>('a');
560a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(tuple<bool, int, int&, const char*>(true, 0, value, "hi"));
561a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('a', value);
562a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
563a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
564a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// A class that can be used to verify that its destructor is called: it will set
565a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// the bool provided to the constructor to true when destroyed.
566a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanclass DeletionTester {
567a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan public:
568a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  explicit DeletionTester(bool* is_deleted)
569a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    : is_deleted_(is_deleted) {
570a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    // Make sure the bit is set to false.
571a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    *is_deleted_ = false;
572a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
573a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
574a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  ~DeletionTester() {
575a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan    *is_deleted_ = true;
576a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  }
577a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
578a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan private:
579a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  bool* is_deleted_;
580a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan};
581a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
582a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(DeleteArgActionTest, OneArg) {
583a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  bool is_deleted = false;
584a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  DeletionTester* t = new DeletionTester(&is_deleted);
585a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(DeletionTester*)> a1 = DeleteArg<0>();      // NOLINT
586a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_FALSE(is_deleted);
587a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(make_tuple(t));
588a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_TRUE(is_deleted);
589a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
590a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
591a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(DeleteArgActionTest, TenArgs) {
592a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  bool is_deleted = false;
593a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  DeletionTester* t = new DeletionTester(&is_deleted);
594a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(bool, int, int, const char*, bool,
595a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan                    int, int, int, int, DeletionTester*)> a1 = DeleteArg<9>();
596a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_FALSE(is_deleted);
597a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a1.Perform(make_tuple(true, 5, 6, CharPtr("hi"), false, 7, 8, 9, 10, t));
598a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_TRUE(is_deleted);
599a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
600a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
601a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan#if GTEST_HAS_EXCEPTIONS
602a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
603a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ThrowActionTest, ThrowsGivenExceptionInVoidFunction) {
604a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<void(int n)> a = Throw('a');
605a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_THROW(a.Perform(make_tuple(0)), char);
606a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
607a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
608a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanclass MyException {};
609a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
610a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ThrowActionTest, ThrowsGivenExceptionInNonVoidFunction) {
611a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<double(char ch)> a = Throw(MyException());
612a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_THROW(a.Perform(make_tuple('0')), MyException);
613a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
614a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
615a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) {
616a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  const Action<double()> a = Throw(MyException());
617a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_THROW(a.Perform(make_tuple()), MyException);
618a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
619a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
620a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan#endif  // GTEST_HAS_EXCEPTIONS
621a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
622a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests that SetArrayArgument<N>(first, last) sets the elements of the array
623a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// pointed to by the N-th (0-based) argument to values in range [first, last).
624a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArrayArgumentTest, SetsTheNthArray) {
625a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  typedef void MyFunction(bool, int*, char*);
626a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int numbers[] = { 1, 2, 3 };
627a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers + 3);
628a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
629a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int n[4] = {};
630a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int* pn = n;
631a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  char ch[4] = {};
632a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  char* pch = ch;
633a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a.Perform(make_tuple(true, pn, pch));
634a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(1, n[0]);
635a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(2, n[1]);
636a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(3, n[2]);
637a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[3]);
638a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('\0', ch[0]);
639a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('\0', ch[1]);
640a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('\0', ch[2]);
641a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('\0', ch[3]);
642a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
643a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  // Tests first and last are iterators.
644a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  std::string letters = "abc";
645a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a = SetArrayArgument<2>(letters.begin(), letters.end());
646a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  std::fill_n(n, 4, 0);
647a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  std::fill_n(ch, 4, '\0');
648a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a.Perform(make_tuple(true, pn, pch));
649a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[0]);
650a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[1]);
651a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[2]);
652a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[3]);
653a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('a', ch[0]);
654a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('b', ch[1]);
655a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('c', ch[2]);
656a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ('\0', ch[3]);
657a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
658a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
659a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests SetArrayArgument<N>(first, last) where first == last.
660a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArrayArgumentTest, SetsTheNthArrayWithEmptyRange) {
661a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  typedef void MyFunction(bool, int*);
662a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int numbers[] = { 1, 2, 3 };
663a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers);
664a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
665a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int n[4] = {};
666a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  int* pn = n;
667a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a.Perform(make_tuple(true, pn));
668a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[0]);
669a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[1]);
670a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[2]);
671a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(0, n[3]);
672a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
673a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
674a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests SetArrayArgument<N>(first, last) where *first is convertible
675a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// (but not equal) to the argument type.
676a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArrayArgumentTest, SetsTheNthArrayWithConvertibleType) {
677b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  typedef void MyFunction(bool, int*);
678b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  char chars[] = { 97, 98, 99 };
679b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  Action<MyFunction> a = SetArrayArgument<1>(chars, chars + 3);
680b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak
681b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  int codes[4] = { 111, 222, 333, 444 };
682b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  int* pcodes = codes;
683b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  a.Perform(make_tuple(true, pcodes));
684b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  EXPECT_EQ(97, codes[0]);
685b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  EXPECT_EQ(98, codes[1]);
686b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  EXPECT_EQ(99, codes[2]);
687b93d0f10d5a1bab088223a57420ef599b26a5e0fkosak  EXPECT_EQ(444, codes[3]);
688a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
689a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
690a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Test SetArrayArgument<N>(first, last) with iterator as argument.
691a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wanTEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) {
692a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  typedef void MyFunction(bool, std::back_insert_iterator<std::string>);
693a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  std::string letters = "abc";
694a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end());
695a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
696a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  std::string s;
697a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  a.Perform(make_tuple(true, back_inserter(s)));
698a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan  EXPECT_EQ(letters, s);
699a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}
700a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan
701e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wanTEST(ReturnPointeeTest, Works) {
702e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan  int n = 42;
703e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan  const Action<int()> a = ReturnPointee(&n);
704e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan  EXPECT_EQ(42, a.Perform(make_tuple()));
705e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan
706e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan  n = 43;
707e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan  EXPECT_EQ(43, a.Perform(make_tuple()));
708e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan}
709e3bd0981ca06e682bcd03659286d7a3267c4d999zhanyong.wan
710a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}  // namespace gmock_generated_actions_test
711a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan}  // namespace testing
712