1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2007, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Mock - a framework for writing C++ mock classes.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file tests the built-in actions in gmock-more-actions.h.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock-more-actions.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <functional>
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <sstream>
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock.h"
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest.h"
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/internal/gtest-linked_ptr.h"
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gmock_more_actions_test {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::plus;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::string;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::tr1::get;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::tr1::make_tuple;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::tr1::tuple;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::std::tr1::tuple_element;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Action;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::ActionInterface;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::DeleteArg;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Invoke;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Return;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::ReturnArg;
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenusing testing::ReturnPointee;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::SaveArg;
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenusing testing::SaveArgPointee;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::SetArgReferee;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StaticAssertTypeEq;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Unused;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::WithArg;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::WithoutArgs;
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenusing testing::internal::linked_ptr;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For suppressing compiler warnings on conversion possibly losing precision.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline short Short(short n) { return n; }  // NOLINT
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline char Char(char ch) { return ch; }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sample functions and functors for testing Invoke() and etc.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint Nullary() { return 1; }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NullaryFunctor {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int operator()() { return 2; }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool g_done = false;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VoidNullary() { g_done = true; }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass VoidNullaryFunctor {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void operator()() { g_done = true; }
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool Unary(int x) { return x < 0; }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* Plus1(const char* s) { return s + 1; }
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VoidUnary(int /* n */) { g_done = true; }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ByConstRef(const string& s) { return s == "Hi"; }
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst double g_double = 0;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring ByNonConstRef(string& s) { return s += "+"; }  // NOLINT
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct UnaryFunctor {
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int operator()(bool x) { return x ? 1 : -1; }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* Binary(const char* input, short n) { return input + n; }  // NOLINT
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VoidBinary(int, char) { g_done = true; }
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VoidTernary(int, char, bool) { g_done = true; }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SumOfFirst2(int a, int b, Unused, Unused) { return a + b; }
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VoidFunctionWithFourArguments(char, int, float, double) { g_done = true; }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat4(const char* s1, const char* s2, const char* s3,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4) {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct SumOf5Functor {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int operator()(int a, int b, int c, int d, int e) {
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return a + b + c + d + e;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat5(const char* s1, const char* s2, const char* s3,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4, const char* s5) {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint SumOf6(int a, int b, int c, int d, int e, int f) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return a + b + c + d + e + f;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct SumOf6Functor {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int operator()(int a, int b, int c, int d, int e, int f) {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return a + b + c + d + e + f;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat6(const char* s1, const char* s2, const char* s3,
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4, const char* s5, const char* s6) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5 + s6;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat7(const char* s1, const char* s2, const char* s3,
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4, const char* s5, const char* s6,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s7) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat8(const char* s1, const char* s2, const char* s3,
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4, const char* s5, const char* s6,
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s7, const char* s8) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat9(const char* s1, const char* s2, const char* s3,
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s4, const char* s5, const char* s6,
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               const char* s7, const char* s8, const char* s9) {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring Concat10(const char* s1, const char* s2, const char* s3,
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char* s4, const char* s5, const char* s6,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char* s7, const char* s8, const char* s9,
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char* s10) {
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Foo {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo() : value_(123) {}
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int Nullary() const { return value_; }
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  short Unary(long x) { return static_cast<short>(value_ + x); }  // NOLINT
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string Binary(const string& str, char c) const { return str + c; }
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int Ternary(int x, bool y, char z) { return value_ + x + y*z; }
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int SumOf4(int a, int b, int c, int d) const {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return a + b + c + d + value_;
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int SumOfLast2(Unused, Unused, int a, int b) const { return a + b; }
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int SumOf6(int a, int b, int c, int d, int e, int f) {
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return a + b + c + d + e + f;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string Concat7(const char* s1, const char* s2, const char* s3,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s4, const char* s5, const char* s6,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s7) {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string Concat8(const char* s1, const char* s2, const char* s3,
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s4, const char* s5, const char* s6,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s7, const char* s8) {
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string Concat9(const char* s1, const char* s2, const char* s3,
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s4, const char* s5, const char* s6,
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* s7, const char* s8, const char* s9) {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string Concat10(const char* s1, const char* s2, const char* s3,
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const char* s4, const char* s5, const char* s6,
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const char* s7, const char* s8, const char* s9,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const char* s10) {
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int value_;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a nullary function.
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, Nullary) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int()> a = Invoke(Nullary);  // NOLINT
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, a.Perform(make_tuple()));
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a unary function.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, Unary) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<bool(int)> a = Invoke(Unary);  // NOLINT
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(a.Perform(make_tuple(1)));
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(a.Perform(make_tuple(-1)));
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a binary function.
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, Binary) {
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<const char*(const char*, short)> a = Invoke(Binary);  // NOLINT
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* p = "Hello";
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(p + 2, a.Perform(make_tuple(p, Short(2))));
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a ternary function.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, Ternary) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, char, short)> a = Invoke(Ternary);  // NOLINT
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, a.Perform(make_tuple(1, '\2', Short(3))));
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 4-argument function.
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes4Arguments) {
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int)> a = Invoke(SumOf4);  // NOLINT
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1234, a.Perform(make_tuple(1000, 200, 30, 4)));
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 5-argument function.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes5Arguments) {
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int, int)> a = Invoke(SumOf5);  // NOLINT
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 6-argument function.
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes6Arguments) {
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int, int, int)> a = Invoke(SumOf6);  // NOLINT
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A helper that turns the type of a C-string literal from const
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// char[N] to const char*.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline const char* CharPtr(const char* s) { return s; }
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 7-argument function.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes7Arguments) {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*)> a =
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(Concat7);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("1234567",
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"))));
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 8-argument function.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes8Arguments) {
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*)> a =
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(Concat8);
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("12345678",
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"))));
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 9-argument function.
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes9Arguments) {
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*,
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*)> a = Invoke(Concat9);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("123456789",
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"), CharPtr("9"))));
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 10-argument function.
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionThatTakes10Arguments) {
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*,
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*)> a = Invoke(Concat10);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("1234567890",
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"), CharPtr("9"),
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("0"))));
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with functions with parameters declared as Unused.
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionWithUnusedParameters) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, double, const string&)> a1 =
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(SumOfFirst2);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(12, a1.Perform(make_tuple(10, 2, 5.6, CharPtr("hi"))));
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, bool, int*)> a2 =
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(SumOfFirst2);
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(23, a2.Perform(make_tuple(20, 3, true, static_cast<int*>(NULL))));
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with methods with parameters declared as Unused.
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, MethodWithUnusedParameters) {
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(string, bool, int, int)> a1 =
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::SumOfLast2);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(12, a1.Perform(make_tuple(CharPtr("hi"), true, 10, 2)));
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(char, double, int, int)> a2 =
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::SumOfLast2);
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(23, a2.Perform(make_tuple('a', 2.5, 20, 3)));
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a functor.
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, Functor) {
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<long(long, int)> a = Invoke(plus<long>());  // NOLINT
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3L, a.Perform(make_tuple(1, 2)));
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke(f) as an action of a compatible type.
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeTest, FunctionWithCompatibleType) {
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<long(int, short, char, bool)> a = Invoke(SumOf4);  // NOLINT
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4321, a.Perform(make_tuple(4000, Short(300), Char(20), true)));
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with an object pointer and a method pointer.
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a nullary method.
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, Nullary) {
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int()> a = Invoke(&foo, &Foo::Nullary);  // NOLINT
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(123, a.Perform(make_tuple()));
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a unary method.
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, Unary) {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<short(long)> a = Invoke(&foo, &Foo::Unary);  // NOLINT
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4123, a.Perform(make_tuple(4000)));
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a binary method.
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, Binary) {
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const string&, char)> a = Invoke(&foo, &Foo::Binary);
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string s("Hell");
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello", a.Perform(make_tuple(s, 'o')));
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a ternary method.
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, Ternary) {
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, bool, char)> a = Invoke(&foo, &Foo::Ternary);  // NOLINT
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1124, a.Perform(make_tuple(1000, true, Char(1))));
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 4-argument method.
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes4Arguments) {
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int)> a = Invoke(&foo, &Foo::SumOf4);  // NOLINT
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1357, a.Perform(make_tuple(1000, 200, 30, 4)));
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 5-argument method.
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes5Arguments) {
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int, int)> a = Invoke(&foo, &Foo::SumOf5);  // NOLINT
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(12345, a.Perform(make_tuple(10000, 2000, 300, 40, 5)));
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 6-argument method.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes6Arguments) {
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int, int, int, int, int, int)> a =  // NOLINT
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::SumOf6);
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(123456, a.Perform(make_tuple(100000, 20000, 3000, 400, 50, 6)));
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 7-argument method.
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes7Arguments) {
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*)> a =
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::Concat7);
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("1234567",
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"))));
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 8-argument method.
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes8Arguments) {
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*)> a =
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::Concat8);
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("12345678",
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"))));
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 9-argument method.
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes9Arguments) {
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*,
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*)> a = Invoke(&foo, &Foo::Concat9);
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("123456789",
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"), CharPtr("9"))));
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke() with a 10-argument method.
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodThatTakes10Arguments) {
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<string(const char*, const char*, const char*, const char*,
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*, const char*, const char*,
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const char*, const char*)> a = Invoke(&foo, &Foo::Concat10);
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("1234567890",
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            a.Perform(make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("4"), CharPtr("5"), CharPtr("6"),
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("7"), CharPtr("8"), CharPtr("9"),
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CharPtr("0"))));
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using Invoke(f) as an action of a compatible type.
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(InvokeMethodTest, MethodWithCompatibleType) {
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Foo foo;
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<long(int, short, char, bool)> a =  // NOLINT
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Invoke(&foo, &Foo::SumOf4);
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4444, a.Perform(make_tuple(4000, Short(300), Char(20), true)));
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using WithoutArgs with an action that takes no argument.
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(WithoutArgsTest, NoArg) {
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<int(int n)> a = WithoutArgs(Invoke(Nullary));  // NOLINT
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, a.Perform(make_tuple(2)));
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests using WithArg with an action that takes 1 argument.
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(WithArgTest, OneArg) {
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<bool(double x, int n)> b = WithArg<1>(Invoke(Unary));  // NOLINT
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(b.Perform(make_tuple(1.5, -1)));
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(b.Perform(make_tuple(1.5, 1)));
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ReturnArgActionTest, WorksForOneArgIntArg0) {
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<int(int)> a = ReturnArg<0>();
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, a.Perform(make_tuple(5)));
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ReturnArgActionTest, WorksForMultiArgBoolArg0) {
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<bool(bool, bool, bool)> a = ReturnArg<0>();
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(a.Perform(make_tuple(true, false, false)));
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ReturnArgActionTest, WorksForMultiArgStringArg2) {
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<string(int, int, string, int)> a = ReturnArg<2>();
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("seven", a.Perform(make_tuple(5, 6, string("seven"), 8)));
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SaveArgActionTest, WorksForSameType) {
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int result = 0;
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(int n)> a1 = SaveArg<0>(&result);
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(make_tuple(5));
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, result);
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SaveArgActionTest, WorksForCompatibleType) {
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int result = 0;
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(bool, char)> a1 = SaveArg<1>(&result);
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(make_tuple(true, 'a'));
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', result);
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
512dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(SaveArgPointeeActionTest, WorksForSameType) {
513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int result = 0;
514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const int value = 5;
515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Action<void(const int*)> a1 = SaveArgPointee<0>(&result);
516dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  a1.Perform(make_tuple(&value));
517dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(5, result);
518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
520dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(SaveArgPointeeActionTest, WorksForCompatibleType) {
521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int result = 0;
522dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  char value = 'a';
523dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Action<void(bool, char*)> a1 = SaveArgPointee<1>(&result);
524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  a1.Perform(make_tuple(true, &value));
525dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ('a', result);
526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
528dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(SaveArgPointeeActionTest, WorksForLinkedPtr) {
529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int result = 0;
530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  linked_ptr<int> value(new int(5));
531dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Action<void(linked_ptr<int>)> a1 = SaveArgPointee<0>(&result);
532dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  a1.Perform(make_tuple(value));
533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(5, result);
534dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
535dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArgRefereeActionTest, WorksForSameType) {
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int value = 0;
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(int&)> a1 = SetArgReferee<0>(1);
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(tuple<int&>(value));
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, value);
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArgRefereeActionTest, WorksForCompatibleType) {
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int value = 0;
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(int, int&)> a1 = SetArgReferee<1>('a');
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(tuple<int, int&>(0, value));
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', value);
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArgRefereeActionTest, WorksWithExtraArguments) {
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int value = 0;
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(bool, int, int&, const char*)> a1 = SetArgReferee<2>('a');
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(tuple<bool, int, int&, const char*>(true, 0, value, "hi"));
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', value);
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class that can be used to verify that its destructor is called: it will set
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the bool provided to the constructor to true when destroyed.
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DeletionTester {
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit DeletionTester(bool* is_deleted)
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : is_deleted_(is_deleted) {
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Make sure the bit is set to false.
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *is_deleted_ = false;
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~DeletionTester() {
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *is_deleted_ = true;
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool* is_deleted_;
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DeleteArgActionTest, OneArg) {
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_deleted = false;
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DeletionTester* t = new DeletionTester(&is_deleted);
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(DeletionTester*)> a1 = DeleteArg<0>();      // NOLINT
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(is_deleted);
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(make_tuple(t));
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(is_deleted);
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(DeleteArgActionTest, TenArgs) {
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_deleted = false;
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DeletionTester* t = new DeletionTester(&is_deleted);
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(bool, int, int, const char*, bool,
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    int, int, int, int, DeletionTester*)> a1 = DeleteArg<9>();
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(is_deleted);
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a1.Perform(make_tuple(true, 5, 6, CharPtr("hi"), false, 7, 8, 9, 10, t));
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(is_deleted);
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_EXCEPTIONS
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThrowActionTest, ThrowsGivenExceptionInVoidFunction) {
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<void(int n)> a = Throw('a');
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THROW(a.Perform(make_tuple(0)), char);
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MyException {};
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThrowActionTest, ThrowsGivenExceptionInNonVoidFunction) {
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<double(char ch)> a = Throw(MyException());
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THROW(a.Perform(make_tuple('0')), MyException);
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) {
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Action<double()> a = Throw(MyException());
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THROW(a.Perform(make_tuple()), MyException);
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_HAS_EXCEPTIONS
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that SetArrayArgument<N>(first, last) sets the elements of the array
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// pointed to by the N-th (0-based) argument to values in range [first, last).
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArrayArgumentTest, SetsTheNthArray) {
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef void MyFunction(bool, int*, char*);
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int numbers[] = { 1, 2, 3 };
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers + 3);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int n[4] = {};
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int* pn = n;
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char ch[4] = {};
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char* pch = ch;
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Perform(make_tuple(true, pn, pch));
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, n[0]);
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, n[1]);
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, n[2]);
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[3]);
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[0]);
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[1]);
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[2]);
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[3]);
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tests first and last are iterators.
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string letters = "abc";
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a = SetArrayArgument<2>(letters.begin(), letters.end());
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::fill_n(n, 4, 0);
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::fill_n(ch, 4, '\0');
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Perform(make_tuple(true, pn, pch));
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[0]);
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[1]);
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[2]);
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[3]);
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', ch[0]);
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('b', ch[1]);
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('c', ch[2]);
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[3]);
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests SetArrayArgument<N>(first, last) where first == last.
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArrayArgumentTest, SetsTheNthArrayWithEmptyRange) {
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef void MyFunction(bool, int*);
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int numbers[] = { 1, 2, 3 };
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers);
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int n[4] = {};
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int* pn = n;
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Perform(make_tuple(true, pn));
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[0]);
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[1]);
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[2]);
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, n[3]);
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests SetArrayArgument<N>(first, last) where *first is convertible
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (but not equal) to the argument type.
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArrayArgumentTest, SetsTheNthArrayWithConvertibleType) {
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef void MyFunction(bool, char*);
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int codes[] = { 97, 98, 99 };
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<MyFunction> a = SetArrayArgument<1>(codes, codes + 3);
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char ch[4] = {};
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char* pch = ch;
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Perform(make_tuple(true, pch));
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', ch[0]);
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('b', ch[1]);
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('c', ch[2]);
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('\0', ch[3]);
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test SetArrayArgument<N>(first, last) with iterator as argument.
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) {
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef void MyFunction(bool, std::back_insert_iterator<std::string>);
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string letters = "abc";
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end());
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string s;
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Perform(make_tuple(true, back_inserter(s)));
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(letters, s);
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
694dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(ReturnPointeeTest, Works) {
695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int n = 42;
696dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Action<int()> a = ReturnPointee(&n);
697dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(42, a.Perform(make_tuple()));
698dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  n = 43;
700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(43, a.Perform(make_tuple()));
701dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
702dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace gmock_generated_actions_test
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
705