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