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