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