1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc. 2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved. 3e35fdd936d133bf8a48de140a3c666897588a05shiqian// 4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without 5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are 6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met: 7e35fdd936d133bf8a48de140a3c666897588a05shiqian// 8e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions of source code must retain the above copyright 9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer. 10e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions in binary form must reproduce the above 11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer 12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the 13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution. 14e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Neither the name of Google Inc. nor the names of its 15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from 16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission. 17e35fdd936d133bf8a48de140a3c666897588a05shiqian// 18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e35fdd936d133bf8a48de140a3c666897588a05shiqian// 30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan) 31e35fdd936d133bf8a48de140a3c666897588a05shiqian 32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes. 33e35fdd936d133bf8a48de140a3c666897588a05shiqian// 34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests the built-in actions generated by a script. 35e35fdd936d133bf8a48de140a3c666897588a05shiqian 3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-generated-actions.h" 37e35fdd936d133bf8a48de140a3c666897588a05shiqian 38e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional> 39387bdd551d4a88383246841ac3f70324b8d42772zhanyong.wan#include <sstream> 40e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string> 4153e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h" 4253e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h" 43e35fdd936d133bf8a48de140a3c666897588a05shiqian 44e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing { 45e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_generated_actions_test { 46e35fdd936d133bf8a48de140a3c666897588a05shiqian 47e35fdd936d133bf8a48de140a3c666897588a05shiqianusing ::std::plus; 48e35fdd936d133bf8a48de140a3c666897588a05shiqianusing ::std::string; 49bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::get; 50bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::make_tuple; 51bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple; 52bd0188320de5aab1b09718e2c466387099d43cfbkosakusing testing::tuple_element; 53e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_; 54e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Action; 55e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ActionInterface; 56e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef; 57e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoAll; 58e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Invoke; 59e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Return; 601c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanusing testing::ReturnNew; 615921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wanusing testing::SetArgPointee; 62326aa564127acf095f6f0952b2f54d149a10d824shiqianusing testing::StaticAssertTypeEq; 63e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Unused; 64e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::WithArgs; 65e35fdd936d133bf8a48de140a3c666897588a05shiqian 6632de5f53763125925e078498250f7e73a88de9edzhanyong.wan// For suppressing compiler warnings on conversion possibly losing precision. 6732de5f53763125925e078498250f7e73a88de9edzhanyong.waninline short Short(short n) { return n; } // NOLINT 6832de5f53763125925e078498250f7e73a88de9edzhanyong.waninline char Char(char ch) { return ch; } 6932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 70a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Sample functions and functors for testing various actions. 71e35fdd936d133bf8a48de140a3c666897588a05shiqianint Nullary() { return 1; } 72e35fdd936d133bf8a48de140a3c666897588a05shiqian 73e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NullaryFunctor { 74e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 75e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()() { return 2; } 76e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 77e35fdd936d133bf8a48de140a3c666897588a05shiqian 78e35fdd936d133bf8a48de140a3c666897588a05shiqianbool g_done = false; 79e35fdd936d133bf8a48de140a3c666897588a05shiqian 80e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Unary(int x) { return x < 0; } 81e35fdd936d133bf8a48de140a3c666897588a05shiqian 82e35fdd936d133bf8a48de140a3c666897588a05shiqianconst char* Plus1(const char* s) { return s + 1; } 83e35fdd936d133bf8a48de140a3c666897588a05shiqian 8409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberbool ByConstRef(const std::string& s) { return s == "Hi"; } 85e35fdd936d133bf8a48de140a3c666897588a05shiqian 86e35fdd936d133bf8a48de140a3c666897588a05shiqianconst double g_double = 0; 87e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesGlobalDouble(const double& x) { return &x == &g_double; } 88e35fdd936d133bf8a48de140a3c666897588a05shiqian 8909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string ByNonConstRef(std::string& s) { return s += "+"; } // NOLINT 90e35fdd936d133bf8a48de140a3c666897588a05shiqian 91e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct UnaryFunctor { 92e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(bool x) { return x ? 1 : -1; } 93e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 94e35fdd936d133bf8a48de140a3c666897588a05shiqian 95e35fdd936d133bf8a48de140a3c666897588a05shiqianconst char* Binary(const char* input, short n) { return input + n; } // NOLINT 96e35fdd936d133bf8a48de140a3c666897588a05shiqian 97e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid VoidBinary(int, char) { g_done = true; } 98e35fdd936d133bf8a48de140a3c666897588a05shiqian 99e35fdd936d133bf8a48de140a3c666897588a05shiqianint Ternary(int x, char y, short z) { return x + y + z; } // NOLINT 100e35fdd936d133bf8a48de140a3c666897588a05shiqian 101e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid VoidTernary(int, char, bool) { g_done = true; } 102e35fdd936d133bf8a48de140a3c666897588a05shiqian 103e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf4(int a, int b, int c, int d) { return a + b + c + d; } 104e35fdd936d133bf8a48de140a3c666897588a05shiqian 10509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat4(const char* s1, const char* s2, const char* s3, 10609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4) { 10709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4; 108e35fdd936d133bf8a48de140a3c666897588a05shiqian} 109e35fdd936d133bf8a48de140a3c666897588a05shiqian 110e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; } 111e35fdd936d133bf8a48de140a3c666897588a05shiqian 112e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct SumOf5Functor { 113e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(int a, int b, int c, int d, int e) { 114e35fdd936d133bf8a48de140a3c666897588a05shiqian return a + b + c + d + e; 115e35fdd936d133bf8a48de140a3c666897588a05shiqian } 116e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 117e35fdd936d133bf8a48de140a3c666897588a05shiqian 11809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat5(const char* s1, const char* s2, const char* s3, 11909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5) { 12009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5; 121e35fdd936d133bf8a48de140a3c666897588a05shiqian} 122e35fdd936d133bf8a48de140a3c666897588a05shiqian 123e35fdd936d133bf8a48de140a3c666897588a05shiqianint SumOf6(int a, int b, int c, int d, int e, int f) { 124e35fdd936d133bf8a48de140a3c666897588a05shiqian return a + b + c + d + e + f; 125e35fdd936d133bf8a48de140a3c666897588a05shiqian} 126e35fdd936d133bf8a48de140a3c666897588a05shiqian 127e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct SumOf6Functor { 128e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(int a, int b, int c, int d, int e, int f) { 129e35fdd936d133bf8a48de140a3c666897588a05shiqian return a + b + c + d + e + f; 130e35fdd936d133bf8a48de140a3c666897588a05shiqian } 131e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 132e35fdd936d133bf8a48de140a3c666897588a05shiqian 13309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat6(const char* s1, const char* s2, const char* s3, 13409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5, const char* s6) { 13509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5 + s6; 136e35fdd936d133bf8a48de140a3c666897588a05shiqian} 137e35fdd936d133bf8a48de140a3c666897588a05shiqian 13809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat7(const char* s1, const char* s2, const char* s3, 13909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5, const char* s6, 14009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s7) { 14109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7; 142e35fdd936d133bf8a48de140a3c666897588a05shiqian} 143e35fdd936d133bf8a48de140a3c666897588a05shiqian 14409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat8(const char* s1, const char* s2, const char* s3, 14509fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5, const char* s6, 14609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s7, const char* s8) { 14709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8; 148e35fdd936d133bf8a48de140a3c666897588a05shiqian} 149e35fdd936d133bf8a48de140a3c666897588a05shiqian 15009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat9(const char* s1, const char* s2, const char* s3, 15109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5, const char* s6, 15209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s7, const char* s8, const char* s9) { 15309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9; 154e35fdd936d133bf8a48de140a3c666897588a05shiqian} 155e35fdd936d133bf8a48de140a3c666897588a05shiqian 15609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weberstd::string Concat10(const char* s1, const char* s2, const char* s3, 15709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s4, const char* s5, const char* s6, 15809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s7, const char* s8, const char* s9, 15909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char* s10) { 16009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10; 161e35fdd936d133bf8a48de140a3c666897588a05shiqian} 162e35fdd936d133bf8a48de140a3c666897588a05shiqian 16390c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan// A helper that turns the type of a C-string literal from const 16490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan// char[N] to const char*. 16590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.waninline const char* CharPtr(const char* s) { return s; } 16690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan 167e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests InvokeArgument<N>(...). 168e35fdd936d133bf8a48de140a3c666897588a05shiqian 169e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a nullary function. 170e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function0) { 171e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int, int(*)())> a = InvokeArgument<1>(); // NOLINT 172e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, a.Perform(make_tuple(2, &Nullary))); 173e35fdd936d133bf8a48de140a3c666897588a05shiqian} 174e35fdd936d133bf8a48de140a3c666897588a05shiqian 175e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a unary function. 176e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor1) { 177e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(UnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT 178e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, a.Perform(make_tuple(UnaryFunctor()))); 179e35fdd936d133bf8a48de140a3c666897588a05shiqian} 180e35fdd936d133bf8a48de140a3c666897588a05shiqian 181e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 5-ary function. 182e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function5) { 183e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int(*)(int, int, int, int, int))> a = // NOLINT 184e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeArgument<0>(10000, 2000, 300, 40, 5); 185e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(12345, a.Perform(make_tuple(&SumOf5))); 186e35fdd936d133bf8a48de140a3c666897588a05shiqian} 187e35fdd936d133bf8a48de140a3c666897588a05shiqian 188e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 5-ary functor. 189e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor5) { 190e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(SumOf5Functor)> a = // NOLINT 191e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeArgument<0>(10000, 2000, 300, 40, 5); 192e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(12345, a.Perform(make_tuple(SumOf5Functor()))); 193e35fdd936d133bf8a48de140a3c666897588a05shiqian} 194e35fdd936d133bf8a48de140a3c666897588a05shiqian 195e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 6-ary function. 196e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function6) { 197e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int(*)(int, int, int, int, int, int))> a = // NOLINT 198e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6); 199e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(123456, a.Perform(make_tuple(&SumOf6))); 200e35fdd936d133bf8a48de140a3c666897588a05shiqian} 201e35fdd936d133bf8a48de140a3c666897588a05shiqian 202e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 6-ary functor. 203e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Functor6) { 204e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(SumOf6Functor)> a = // NOLINT 205e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6); 206e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(123456, a.Perform(make_tuple(SumOf6Functor()))); 207e35fdd936d133bf8a48de140a3c666897588a05shiqian} 208e35fdd936d133bf8a48de140a3c666897588a05shiqian 209e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 7-ary function. 210e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function7) { 21109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(std::string(*)(const char*, const char*, const char*, 21209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*, 21309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*))> 21409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7"); 215e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("1234567", a.Perform(make_tuple(&Concat7))); 216e35fdd936d133bf8a48de140a3c666897588a05shiqian} 217e35fdd936d133bf8a48de140a3c666897588a05shiqian 218e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 8-ary function. 219e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function8) { 22009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(std::string(*)(const char*, const char*, const char*, 22109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*, 22209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*))> 22309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8"); 224e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("12345678", a.Perform(make_tuple(&Concat8))); 225e35fdd936d133bf8a48de140a3c666897588a05shiqian} 226e35fdd936d133bf8a48de140a3c666897588a05shiqian 227e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 9-ary function. 228e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function9) { 22909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(std::string(*)(const char*, const char*, const char*, 23009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*, 23109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*))> 23209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9"); 233e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("123456789", a.Perform(make_tuple(&Concat9))); 234e35fdd936d133bf8a48de140a3c666897588a05shiqian} 235e35fdd936d133bf8a48de140a3c666897588a05shiqian 236e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a 10-ary function. 237e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, Function10) { 23809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(std::string(*)( 23909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*, const char*, const char*, 24009fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*, const char*, const char*, const char*, const char*))> 24109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"); 242e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("1234567890", a.Perform(make_tuple(&Concat10))); 243e35fdd936d133bf8a48de140a3c666897588a05shiqian} 244e35fdd936d133bf8a48de140a3c666897588a05shiqian 245e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a pointer argument. 246e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByPointerFunction) { 247e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<const char*(const char*(*)(const char* input, short n))> a = // NOLINT 24832de5f53763125925e078498250f7e73a88de9edzhanyong.wan InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1)); 249e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_STREQ("i", a.Perform(make_tuple(&Binary))); 250e35fdd936d133bf8a48de140a3c666897588a05shiqian} 251e35fdd936d133bf8a48de140a3c666897588a05shiqian 252e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a const char* 253e35fdd936d133bf8a48de140a3c666897588a05shiqian// by passing it a C-string literal. 254e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, FunctionWithCStringLiteral) { 255e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<const char*(const char*(*)(const char* input, short n))> a = // NOLINT 25632de5f53763125925e078498250f7e73a88de9edzhanyong.wan InvokeArgument<0>("Hi", Short(1)); 257e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_STREQ("i", a.Perform(make_tuple(&Binary))); 258e35fdd936d133bf8a48de140a3c666897588a05shiqian} 259e35fdd936d133bf8a48de140a3c666897588a05shiqian 260e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with a function that takes a const reference. 261e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByConstReferenceFunction) { 26209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<bool(bool (*function)(const std::string& s))> a = // NOLINT 26309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber InvokeArgument<0>(std::string("Hi")); 264e35fdd936d133bf8a48de140a3c666897588a05shiqian // When action 'a' is constructed, it makes a copy of the temporary 265e35fdd936d133bf8a48de140a3c666897588a05shiqian // string object passed to it, so it's OK to use 'a' later, when the 266e35fdd936d133bf8a48de140a3c666897588a05shiqian // temporary object has already died. 267e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a.Perform(make_tuple(&ByConstRef))); 268e35fdd936d133bf8a48de140a3c666897588a05shiqian} 269e35fdd936d133bf8a48de140a3c666897588a05shiqian 270e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using InvokeArgument with ByRef() and a function that takes a 271e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference. 272e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) { 273e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<bool(bool(*)(const double& x))> a = // NOLINT 274e35fdd936d133bf8a48de140a3c666897588a05shiqian InvokeArgument<0>(ByRef(g_double)); 275e35fdd936d133bf8a48de140a3c666897588a05shiqian // The above line calls ByRef() on a const value. 276e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a.Perform(make_tuple(&ReferencesGlobalDouble))); 277e35fdd936d133bf8a48de140a3c666897588a05shiqian 278e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 0; 279e35fdd936d133bf8a48de140a3c666897588a05shiqian a = InvokeArgument<0>(ByRef(x)); // This calls ByRef() on a non-const. 280e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(a.Perform(make_tuple(&ReferencesGlobalDouble))); 281e35fdd936d133bf8a48de140a3c666897588a05shiqian} 282e35fdd936d133bf8a48de140a3c666897588a05shiqian 283a18423e0ee0c5cfe69948e4f4d0826dc8fe15f8czhanyong.wan// Tests using WithArgs and with an action that takes 1 argument. 284e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, OneArg) { 285e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary)); // NOLINT 286e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(a.Perform(make_tuple(1.5, -1))); 287e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(a.Perform(make_tuple(1.5, 1))); 288e35fdd936d133bf8a48de140a3c666897588a05shiqian} 289e35fdd936d133bf8a48de140a3c666897588a05shiqian 290e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 2 arguments. 291e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, TwoArgs) { 29232de5f53763125925e078498250f7e73a88de9edzhanyong.wan Action<const char*(const char* s, double x, short n)> a = 293e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 2>(Invoke(Binary)); 294e35fdd936d133bf8a48de140a3c666897588a05shiqian const char s[] = "Hello"; 29532de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(s + 2, a.Perform(make_tuple(CharPtr(s), 0.5, Short(2)))); 296e35fdd936d133bf8a48de140a3c666897588a05shiqian} 297e35fdd936d133bf8a48de140a3c666897588a05shiqian 298e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 3 arguments. 299e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ThreeArgs) { 300e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int, double, char, short)> a = // NOLINT 301e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 2, 3>(Invoke(Ternary)); 30232de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(123, a.Perform(make_tuple(100, 6.5, Char(20), Short(3)))); 303e35fdd936d133bf8a48de140a3c666897588a05shiqian} 304e35fdd936d133bf8a48de140a3c666897588a05shiqian 305e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 4 arguments. 306e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, FourArgs) { 30709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, double, const char*, 30809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*)> 30909fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = WithArgs<4, 3, 1, 0>(Invoke(Concat4)); 31090c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("4310", a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), 2.5, 31190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3"), CharPtr("4")))); 312e35fdd936d133bf8a48de140a3c666897588a05shiqian} 313e35fdd936d133bf8a48de140a3c666897588a05shiqian 314e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 5 arguments. 315e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, FiveArgs) { 31609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*, const char*, 31709fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber const char*)> 31809fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber a = WithArgs<4, 3, 2, 1, 0>(Invoke(Concat5)); 31990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("43210", 32090c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"), 32190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3"), CharPtr("4")))); 322e35fdd936d133bf8a48de140a3c666897588a05shiqian} 323e35fdd936d133bf8a48de140a3c666897588a05shiqian 324e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 6 arguments. 325e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, SixArgs) { 32609fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*)> a = 327e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2, 2, 1, 0>(Invoke(Concat6)); 32890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("012210", 32990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2")))); 330e35fdd936d133bf8a48de140a3c666897588a05shiqian} 331e35fdd936d133bf8a48de140a3c666897588a05shiqian 332e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 7 arguments. 333e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, SevenArgs) { 33409fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*, const char*)> a = 335e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2, 3, 2, 1, 0>(Invoke(Concat7)); 33690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("0123210", 33790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"), 33890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3")))); 339e35fdd936d133bf8a48de140a3c666897588a05shiqian} 340e35fdd936d133bf8a48de140a3c666897588a05shiqian 341e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 8 arguments. 342e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, EightArgs) { 34309fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*, const char*)> a = 344e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2, 3, 0, 1, 2, 3>(Invoke(Concat8)); 34590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("01230123", 34690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"), 34790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3")))); 348e35fdd936d133bf8a48de140a3c666897588a05shiqian} 349e35fdd936d133bf8a48de140a3c666897588a05shiqian 350e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 9 arguments. 351e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, NineArgs) { 35209fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*, const char*)> a = 353e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2, 3, 1, 2, 3, 2, 3>(Invoke(Concat9)); 35490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("012312323", 35590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"), 35690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3")))); 357e35fdd936d133bf8a48de140a3c666897588a05shiqian} 358e35fdd936d133bf8a48de140a3c666897588a05shiqian 359e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that takes 10 arguments. 360e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, TenArgs) { 36109fd5b3ebfaac10b78bda664ec7f57fac74ef214Nico Weber Action<std::string(const char*, const char*, const char*, const char*)> a = 362e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(Concat10)); 36390c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("0123210123", 36490c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"), 36590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan CharPtr("3")))); 366e35fdd936d133bf8a48de140a3c666897588a05shiqian} 367e35fdd936d133bf8a48de140a3c666897588a05shiqian 368e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that is not Invoke(). 369e35fdd936d133bf8a48de140a3c666897588a05shiqianclass SubstractAction : public ActionInterface<int(int, int)> { // NOLINT 370e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 371e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual int Perform(const tuple<int, int>& args) { 372e35fdd936d133bf8a48de140a3c666897588a05shiqian return get<0>(args) - get<1>(args); 373e35fdd936d133bf8a48de140a3c666897588a05shiqian } 374e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 375e35fdd936d133bf8a48de140a3c666897588a05shiqian 376e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, NonInvokeAction) { 377e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(const string&, int, int)> a = // NOLINT 378e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<2, 1>(MakeAction(new SubstractAction)); 379f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue string s("hello"); 380f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue EXPECT_EQ(8, a.Perform(tuple<const string&, int, int>(s, 2, 10))); 381e35fdd936d133bf8a48de140a3c666897588a05shiqian} 382e35fdd936d133bf8a48de140a3c666897588a05shiqian 383e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs to pass all original arguments in the original order. 384e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, Identity) { 385e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int x, char y, short z)> a = // NOLINT 386e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 2>(Invoke(Ternary)); 38732de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(123, a.Perform(make_tuple(100, Char(20), Short(3)))); 388e35fdd936d133bf8a48de140a3c666897588a05shiqian} 389e35fdd936d133bf8a48de140a3c666897588a05shiqian 390e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with repeated arguments. 391e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, RepeatedArguments) { 392e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(bool, int m, int n)> a = // NOLINT 393e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<1, 1, 1, 1>(Invoke(SumOf4)); 394e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(4, a.Perform(make_tuple(false, 1, 10))); 395e35fdd936d133bf8a48de140a3c666897588a05shiqian} 396e35fdd936d133bf8a48de140a3c666897588a05shiqian 397e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with reversed argument order. 398e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ReversedArgumentOrder) { 399e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<const char*(short n, const char* input)> a = // NOLINT 400e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<1, 0>(Invoke(Binary)); 401e35fdd936d133bf8a48de140a3c666897588a05shiqian const char s[] = "Hello"; 40232de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(s + 2, a.Perform(make_tuple(Short(2), CharPtr(s)))); 403e35fdd936d133bf8a48de140a3c666897588a05shiqian} 404e35fdd936d133bf8a48de140a3c666897588a05shiqian 405e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with compatible, but not identical, argument types. 406e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, ArgsOfCompatibleTypes) { 40732de5f53763125925e078498250f7e73a88de9edzhanyong.wan Action<long(short x, char y, double z, char c)> a = // NOLINT 408e35fdd936d133bf8a48de140a3c666897588a05shiqian WithArgs<0, 1, 3>(Invoke(Ternary)); 40932de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(123, a.Perform(make_tuple(Short(100), Char(20), 5.6, Char(3)))); 410e35fdd936d133bf8a48de140a3c666897588a05shiqian} 411e35fdd936d133bf8a48de140a3c666897588a05shiqian 412e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests using WithArgs with an action that returns void. 413e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(WithArgsTest, VoidAction) { 414e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary)); 415e35fdd936d133bf8a48de140a3c666897588a05shiqian g_done = false; 416e35fdd936d133bf8a48de140a3c666897588a05shiqian a.Perform(make_tuple(1.5, 'a', 3)); 417e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(g_done); 418e35fdd936d133bf8a48de140a3c666897588a05shiqian} 419e35fdd936d133bf8a48de140a3c666897588a05shiqian 420e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2). 421e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, TwoActions) { 422e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 4235921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<int(int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT 424e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(2)); 425e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, a.Perform(make_tuple(&n))); 426e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, n); 427e35fdd936d133bf8a48de140a3c666897588a05shiqian} 428e35fdd936d133bf8a48de140a3c666897588a05shiqian 429e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3). 430e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, ThreeActions) { 431e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 4325921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT 4335921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 434e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 435e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, a.Perform(make_tuple(&m, &n))); 436e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 437e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 438e35fdd936d133bf8a48de140a3c666897588a05shiqian} 439e35fdd936d133bf8a48de140a3c666897588a05shiqian 440e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3, a4). 441e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, FourActions) { 442e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 443e35fdd936d133bf8a48de140a3c666897588a05shiqian char ch = '\0'; 444e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*)> a = // NOLINT 4455921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 4465921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 4475921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 448e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 449e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, a.Perform(make_tuple(&m, &n, &ch))); 450e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 451e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 452e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', ch); 453e35fdd936d133bf8a48de140a3c666897588a05shiqian} 454e35fdd936d133bf8a48de140a3c666897588a05shiqian 455e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, a3, a4, a5). 456e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, FiveActions) { 457e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 458e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0'; 459e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*)> action = // NOLINT 4605921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 4615921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 4625921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 4635921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 464e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 465e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b))); 466e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 467e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 468e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 469e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 470e35fdd936d133bf8a48de140a3c666897588a05shiqian} 471e35fdd936d133bf8a48de140a3c666897588a05shiqian 472e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a6). 473e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, SixActions) { 474e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 475e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0', c = '\0'; 476e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*, char*)> action = // NOLINT 4775921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 4785921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 4795921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 4805921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 4815921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<4>('c'), 482e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 483e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c))); 484e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 485e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 486e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 487e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 488e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('c', c); 489e35fdd936d133bf8a48de140a3c666897588a05shiqian} 490e35fdd936d133bf8a48de140a3c666897588a05shiqian 491e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a7). 492e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, SevenActions) { 493e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 494e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0', c = '\0', d = '\0'; 495e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*, char*, char*)> action = // NOLINT 4965921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 4975921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 4985921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 4995921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 5005921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<4>('c'), 5015921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<5>('d'), 502e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 503e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d))); 504e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 505e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 506e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 507e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 508e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('c', c); 509e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('d', d); 510e35fdd936d133bf8a48de140a3c666897588a05shiqian} 511e35fdd936d133bf8a48de140a3c666897588a05shiqian 512e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a8). 513e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, EightActions) { 514e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 515e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0'; 516e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 517e35fdd936d133bf8a48de140a3c666897588a05shiqian char*)> action = 5185921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 5195921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 5205921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 5215921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 5225921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<4>('c'), 5235921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<5>('d'), 5245921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<6>('e'), 525e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 526e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e))); 527e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 528e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 529e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 530e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 531e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('c', c); 532e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('d', d); 533e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('e', e); 534e35fdd936d133bf8a48de140a3c666897588a05shiqian} 535e35fdd936d133bf8a48de140a3c666897588a05shiqian 536e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a9). 537e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, NineActions) { 538e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 539e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0', f = '\0'; 540e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 541e35fdd936d133bf8a48de140a3c666897588a05shiqian char*, char*)> action = 5425921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 5435921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 5445921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 5455921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 5465921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<4>('c'), 5475921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<5>('d'), 5485921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<6>('e'), 5495921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<7>('f'), 550e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 551e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f))); 552e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 553e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 554e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 555e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 556e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('c', c); 557e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('d', d); 558e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('e', e); 559e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('f', f); 560e35fdd936d133bf8a48de140a3c666897588a05shiqian} 561e35fdd936d133bf8a48de140a3c666897588a05shiqian 562e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests DoAll(a1, a2, ..., a10). 563e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(DoAllTest, TenActions) { 564e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 565e35fdd936d133bf8a48de140a3c666897588a05shiqian char a = '\0', b = '\0', c = '\0', d = '\0'; 566e35fdd936d133bf8a48de140a3c666897588a05shiqian char e = '\0', f = '\0', g = '\0'; 567e35fdd936d133bf8a48de140a3c666897588a05shiqian Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 568e35fdd936d133bf8a48de140a3c666897588a05shiqian char*, char*, char*)> action = 5695921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan DoAll(SetArgPointee<0>(1), 5705921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<1>(2), 5715921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<2>('a'), 5725921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<3>('b'), 5735921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<4>('c'), 5745921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<5>('d'), 5755921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<6>('e'), 5765921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<7>('f'), 5775921483640fed07d8dcfff9cc34fe353fec55f26zhanyong.wan SetArgPointee<8>('g'), 578e35fdd936d133bf8a48de140a3c666897588a05shiqian Return(3)); 579e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g))); 580e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(1, m); 581e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(2, n); 582e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('a', a); 583e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('b', b); 584e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('c', c); 585e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('d', d); 586e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('e', e); 587e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('f', f); 588e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ('g', g); 589e35fdd936d133bf8a48de140a3c666897588a05shiqian} 590e35fdd936d133bf8a48de140a3c666897588a05shiqian 59132de5f53763125925e078498250f7e73a88de9edzhanyong.wan// The ACTION*() macros trigger warning C4100 (unreferenced formal 59232de5f53763125925e078498250f7e73a88de9edzhanyong.wan// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 59332de5f53763125925e078498250f7e73a88de9edzhanyong.wan// the macro definition, as the warnings are generated when the macro 59432de5f53763125925e078498250f7e73a88de9edzhanyong.wan// is expanded and macro expansion cannot contain #pragma. Therefore 59532de5f53763125925e078498250f7e73a88de9edzhanyong.wan// we suppress them here. 59632de5f53763125925e078498250f7e73a88de9edzhanyong.wan#ifdef _MSC_VER 597658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(push) 598658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(disable:4100) 59932de5f53763125925e078498250f7e73a88de9edzhanyong.wan#endif 60032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 601326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests the ACTION*() macro family. 602326aa564127acf095f6f0952b2f54d149a10d824shiqian 603326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can define an action that doesn't reference the 604326aa564127acf095f6f0952b2f54d149a10d824shiqian// mock function arguments. 605326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Return5) { return 5; } 606326aa564127acf095f6f0952b2f54d149a10d824shiqian 607326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksWhenNotReferencingArguments) { 608326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<double()> a1 = Return5(); 609326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_DOUBLE_EQ(5, a1.Perform(make_tuple())); 610326aa564127acf095f6f0952b2f54d149a10d824shiqian 611326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(double, bool)> a2 = Return5(); 612326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(5, a2.Perform(make_tuple(1, true))); 613326aa564127acf095f6f0952b2f54d149a10d824shiqian} 614326aa564127acf095f6f0952b2f54d149a10d824shiqian 615326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can define an action that returns void. 616326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(IncrementArg1) { (*arg1)++; } 617326aa564127acf095f6f0952b2f54d149a10d824shiqian 618326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksWhenReturningVoid) { 619326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<void(int, int*)> a1 = IncrementArg1(); 620326aa564127acf095f6f0952b2f54d149a10d824shiqian int n = 0; 621326aa564127acf095f6f0952b2f54d149a10d824shiqian a1.Perform(make_tuple(5, &n)); 622326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, n); 623326aa564127acf095f6f0952b2f54d149a10d824shiqian} 624326aa564127acf095f6f0952b2f54d149a10d824shiqian 625326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the type of the 626326aa564127acf095f6f0952b2f54d149a10d824shiqian// argument. 627326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(IncrementArg2) { 628326aa564127acf095f6f0952b2f54d149a10d824shiqian StaticAssertTypeEq<int*, arg2_type>(); 629326aa564127acf095f6f0952b2f54d149a10d824shiqian arg2_type temp = arg2; 630326aa564127acf095f6f0952b2f54d149a10d824shiqian (*temp)++; 631326aa564127acf095f6f0952b2f54d149a10d824shiqian} 632326aa564127acf095f6f0952b2f54d149a10d824shiqian 633326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceArgumentType) { 634326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<void(int, bool, int*)> a1 = IncrementArg2(); 635326aa564127acf095f6f0952b2f54d149a10d824shiqian int n = 0; 636326aa564127acf095f6f0952b2f54d149a10d824shiqian a1.Perform(make_tuple(5, false, &n)); 637326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, n); 638326aa564127acf095f6f0952b2f54d149a10d824shiqian} 639326aa564127acf095f6f0952b2f54d149a10d824shiqian 640326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the argument tuple 641326aa564127acf095f6f0952b2f54d149a10d824shiqian// via args_type and args. 642326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Sum2) { 643bd0188320de5aab1b09718e2c466387099d43cfbkosak StaticAssertTypeEq<tuple<int, char, int*>, args_type>(); 644326aa564127acf095f6f0952b2f54d149a10d824shiqian args_type args_copy = args; 645326aa564127acf095f6f0952b2f54d149a10d824shiqian return get<0>(args_copy) + get<1>(args_copy); 646326aa564127acf095f6f0952b2f54d149a10d824shiqian} 647326aa564127acf095f6f0952b2f54d149a10d824shiqian 648326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceArgumentTuple) { 649326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int, char, int*)> a1 = Sum2(); 650326aa564127acf095f6f0952b2f54d149a10d824shiqian int dummy = 0; 65132de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(11, a1.Perform(make_tuple(5, Char(6), &dummy))); 652326aa564127acf095f6f0952b2f54d149a10d824shiqian} 653326aa564127acf095f6f0952b2f54d149a10d824shiqian 654326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the mock function 655326aa564127acf095f6f0952b2f54d149a10d824shiqian// type. 656326aa564127acf095f6f0952b2f54d149a10d824shiqianint Dummy(bool flag) { return flag? 1 : 0; } 657326aa564127acf095f6f0952b2f54d149a10d824shiqian 658326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(InvokeDummy) { 659326aa564127acf095f6f0952b2f54d149a10d824shiqian StaticAssertTypeEq<int(bool), function_type>(); 660326aa564127acf095f6f0952b2f54d149a10d824shiqian function_type* fp = &Dummy; 661326aa564127acf095f6f0952b2f54d149a10d824shiqian return (*fp)(true); 662326aa564127acf095f6f0952b2f54d149a10d824shiqian} 663326aa564127acf095f6f0952b2f54d149a10d824shiqian 664326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceMockFunctionType) { 665326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(bool)> a1 = InvokeDummy(); 666326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, a1.Perform(make_tuple(true))); 667326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, a1.Perform(make_tuple(false))); 668326aa564127acf095f6f0952b2f54d149a10d824shiqian} 669326aa564127acf095f6f0952b2f54d149a10d824shiqian 670326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION() can reference the mock function's 671326aa564127acf095f6f0952b2f54d149a10d824shiqian// return type. 672326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(InvokeDummy2) { 673326aa564127acf095f6f0952b2f54d149a10d824shiqian StaticAssertTypeEq<int, return_type>(); 674326aa564127acf095f6f0952b2f54d149a10d824shiqian return_type result = Dummy(true); 675326aa564127acf095f6f0952b2f54d149a10d824shiqian return result; 676326aa564127acf095f6f0952b2f54d149a10d824shiqian} 677326aa564127acf095f6f0952b2f54d149a10d824shiqian 678326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanReferenceMockFunctionReturnType) { 679326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(bool)> a1 = InvokeDummy2(); 680326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, a1.Perform(make_tuple(true))); 681326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(1, a1.Perform(make_tuple(false))); 682326aa564127acf095f6f0952b2f54d149a10d824shiqian} 683326aa564127acf095f6f0952b2f54d149a10d824shiqian 6847f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan// Tests that ACTION() works for arguments passed by const reference. 6857f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanACTION(ReturnAddrOfConstBoolReferenceArg) { 6867f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan StaticAssertTypeEq<const bool&, arg1_type>(); 6877f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan return &arg1; 6887f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan} 6897f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan 6907f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanTEST(ActionMacroTest, WorksForConstReferenceArg) { 6917f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg(); 6927f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan const bool b = false; 6937f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan EXPECT_EQ(&b, a.Perform(tuple<int, const bool&>(0, b))); 6947f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan} 6957f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan 6967f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan// Tests that ACTION() works for arguments passed by non-const reference. 6977f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanACTION(ReturnAddrOfIntReferenceArg) { 6987f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan StaticAssertTypeEq<int&, arg0_type>(); 6997f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan return &arg0; 7007f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan} 7017f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan 7027f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wanTEST(ActionMacroTest, WorksForNonConstReferenceArg) { 7037f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg(); 7047f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan int n = 0; 7057f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan EXPECT_EQ(&n, a.Perform(tuple<int&, bool, int>(n, true, 1))); 7067f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan} 7077f4c2c0f95a69901175db5edcd07bc26519ef82fzhanyong.wan 708326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION() can be used in a namespace. 709326aa564127acf095f6f0952b2f54d149a10d824shiqiannamespace action_test { 710326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(Sum) { return arg0 + arg1; } 711326aa564127acf095f6f0952b2f54d149a10d824shiqian} // namespace action_test 712326aa564127acf095f6f0952b2f54d149a10d824shiqian 713326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksInNamespace) { 714326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int, int)> a1 = action_test::Sum(); 715326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(3, a1.Perform(make_tuple(1, 2))); 716326aa564127acf095f6f0952b2f54d149a10d824shiqian} 717326aa564127acf095f6f0952b2f54d149a10d824shiqian 718326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the same ACTION definition works for mock functions with 719326aa564127acf095f6f0952b2f54d149a10d824shiqian// different argument numbers. 720326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(PlusTwo) { return arg0 + 2; } 721326aa564127acf095f6f0952b2f54d149a10d824shiqian 722326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, WorksForDifferentArgumentNumbers) { 723326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = PlusTwo(); 724326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(4, a1.Perform(make_tuple(2))); 725326aa564127acf095f6f0952b2f54d149a10d824shiqian 726326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<double(float, void*)> a2 = PlusTwo(); 727326aa564127acf095f6f0952b2f54d149a10d824shiqian int dummy; 728326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_DOUBLE_EQ(6, a2.Perform(make_tuple(4.0f, &dummy))); 729326aa564127acf095f6f0952b2f54d149a10d824shiqian} 730326aa564127acf095f6f0952b2f54d149a10d824shiqian 731326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that ACTION_P can define a parameterized action. 732326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(Plus, n) { return arg0 + n; } 733326aa564127acf095f6f0952b2f54d149a10d824shiqian 734326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, DefinesParameterizedAction) { 735326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int m, bool t)> a1 = Plus(9); 736326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10, a1.Perform(make_tuple(1, true))); 737326aa564127acf095f6f0952b2f54d149a10d824shiqian} 738326aa564127acf095f6f0952b2f54d149a10d824shiqian 739326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the body of ACTION_P can reference the argument types 740326aa564127acf095f6f0952b2f54d149a10d824shiqian// and the parameter type. 741326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(TypedPlus, n) { 742326aa564127acf095f6f0952b2f54d149a10d824shiqian arg0_type t1 = arg0; 743326aa564127acf095f6f0952b2f54d149a10d824shiqian n_type t2 = n; 744326aa564127acf095f6f0952b2f54d149a10d824shiqian return t1 + t2; 745326aa564127acf095f6f0952b2f54d149a10d824shiqian} 746326aa564127acf095f6f0952b2f54d149a10d824shiqian 747326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) { 748326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(char m, bool t)> a1 = TypedPlus(9); 74932de5f53763125925e078498250f7e73a88de9edzhanyong.wan EXPECT_EQ(10, a1.Perform(make_tuple(Char(1), true))); 750326aa564127acf095f6f0952b2f54d149a10d824shiqian} 751326aa564127acf095f6f0952b2f54d149a10d824shiqian 752326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that a parameterized action can be used in any mock function 753326aa564127acf095f6f0952b2f54d149a10d824shiqian// whose type is compatible. 754326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPMacroTest, WorksInCompatibleMockFunction) { 755326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<std::string(const std::string& s)> a1 = Plus("tail"); 756326aa564127acf095f6f0952b2f54d149a10d824shiqian const std::string re = "re"; 757f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue EXPECT_EQ("retail", a1.Perform(tuple<const std::string&>(re))); 758326aa564127acf095f6f0952b2f54d149a10d824shiqian} 759326aa564127acf095f6f0952b2f54d149a10d824shiqian 760326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that we can use ACTION*() to define actions overloaded on the 761326aa564127acf095f6f0952b2f54d149a10d824shiqian// number of parameters. 762326aa564127acf095f6f0952b2f54d149a10d824shiqian 763326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; } 764326aa564127acf095f6f0952b2f54d149a10d824shiqian 765326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(OverloadedAction, default_value) { 766326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 ? arg1 : default_value; 767326aa564127acf095f6f0952b2f54d149a10d824shiqian} 768326aa564127acf095f6f0952b2f54d149a10d824shiqian 769326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(OverloadedAction, true_value, false_value) { 770326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 ? true_value : false_value; 771326aa564127acf095f6f0952b2f54d149a10d824shiqian} 772326aa564127acf095f6f0952b2f54d149a10d824shiqian 773326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionMacroTest, CanDefineOverloadedActions) { 774326aa564127acf095f6f0952b2f54d149a10d824shiqian typedef Action<const char*(bool, const char*)> MyAction; 775326aa564127acf095f6f0952b2f54d149a10d824shiqian 776326aa564127acf095f6f0952b2f54d149a10d824shiqian const MyAction a1 = OverloadedAction(); 77790c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("hello", a1.Perform(make_tuple(false, CharPtr("world")))); 77890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("world", a1.Perform(make_tuple(true, CharPtr("world")))); 779326aa564127acf095f6f0952b2f54d149a10d824shiqian 780326aa564127acf095f6f0952b2f54d149a10d824shiqian const MyAction a2 = OverloadedAction("hi"); 78190c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("hi", a2.Perform(make_tuple(false, CharPtr("world")))); 78290c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("world", a2.Perform(make_tuple(true, CharPtr("world")))); 783326aa564127acf095f6f0952b2f54d149a10d824shiqian 784326aa564127acf095f6f0952b2f54d149a10d824shiqian const MyAction a3 = OverloadedAction("hi", "you"); 78590c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("hi", a3.Perform(make_tuple(true, CharPtr("world")))); 78690c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_STREQ("you", a3.Perform(make_tuple(false, CharPtr("world")))); 787326aa564127acf095f6f0952b2f54d149a10d824shiqian} 788326aa564127acf095f6f0952b2f54d149a10d824shiqian 789326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests ACTION_Pn where n >= 3. 790326aa564127acf095f6f0952b2f54d149a10d824shiqian 791326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; } 792326aa564127acf095f6f0952b2f54d149a10d824shiqian 793326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor3Parameters) { 794326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4); 795326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_DOUBLE_EQ(3123.4, a1.Perform(make_tuple(3000, true))); 796326aa564127acf095f6f0952b2f54d149a10d824shiqian 797326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<std::string(const std::string& s)> a2 = Plus("tail", "-", ">"); 798326aa564127acf095f6f0952b2f54d149a10d824shiqian const std::string re = "re"; 799f19b060075e89ac7ccd1744b30d41b755b92a10aBilly Donahue EXPECT_EQ("retail->", a2.Perform(tuple<const std::string&>(re))); 800326aa564127acf095f6f0952b2f54d149a10d824shiqian} 801326aa564127acf095f6f0952b2f54d149a10d824shiqian 802326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; } 803326aa564127acf095f6f0952b2f54d149a10d824shiqian 804326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor4Parameters) { 805326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4); 806326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(make_tuple(10))); 807326aa564127acf095f6f0952b2f54d149a10d824shiqian} 808326aa564127acf095f6f0952b2f54d149a10d824shiqian 809326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; } 810326aa564127acf095f6f0952b2f54d149a10d824shiqian 811326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor5Parameters) { 812326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5); 813326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(make_tuple(10))); 814326aa564127acf095f6f0952b2f54d149a10d824shiqian} 815326aa564127acf095f6f0952b2f54d149a10d824shiqian 816326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P6(Plus, p0, p1, p2, p3, p4, p5) { 817326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 + p0 + p1 + p2 + p3 + p4 + p5; 818326aa564127acf095f6f0952b2f54d149a10d824shiqian} 819326aa564127acf095f6f0952b2f54d149a10d824shiqian 820326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor6Parameters) { 821326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6); 822326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(make_tuple(10))); 823326aa564127acf095f6f0952b2f54d149a10d824shiqian} 824326aa564127acf095f6f0952b2f54d149a10d824shiqian 825326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) { 826326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6; 827326aa564127acf095f6f0952b2f54d149a10d824shiqian} 828326aa564127acf095f6f0952b2f54d149a10d824shiqian 829326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor7Parameters) { 830326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7); 831326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(make_tuple(10))); 832326aa564127acf095f6f0952b2f54d149a10d824shiqian} 833326aa564127acf095f6f0952b2f54d149a10d824shiqian 834326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) { 835326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7; 836326aa564127acf095f6f0952b2f54d149a10d824shiqian} 837326aa564127acf095f6f0952b2f54d149a10d824shiqian 838326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor8Parameters) { 839326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8); 840326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8, a1.Perform(make_tuple(10))); 841326aa564127acf095f6f0952b2f54d149a10d824shiqian} 842326aa564127acf095f6f0952b2f54d149a10d824shiqian 843326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) { 844326aa564127acf095f6f0952b2f54d149a10d824shiqian return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8; 845326aa564127acf095f6f0952b2f54d149a10d824shiqian} 846326aa564127acf095f6f0952b2f54d149a10d824shiqian 847326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor9Parameters) { 848326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9); 849326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, a1.Perform(make_tuple(10))); 850326aa564127acf095f6f0952b2f54d149a10d824shiqian} 851326aa564127acf095f6f0952b2f54d149a10d824shiqian 852326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) { 853326aa564127acf095f6f0952b2f54d149a10d824shiqian arg0_type t0 = arg0; 854326aa564127acf095f6f0952b2f54d149a10d824shiqian last_param_type t9 = last_param; 855326aa564127acf095f6f0952b2f54d149a10d824shiqian return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9; 856326aa564127acf095f6f0952b2f54d149a10d824shiqian} 857326aa564127acf095f6f0952b2f54d149a10d824shiqian 858326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, WorksFor10Parameters) { 859326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 860326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10, 861326aa564127acf095f6f0952b2f54d149a10d824shiqian a1.Perform(make_tuple(10))); 862326aa564127acf095f6f0952b2f54d149a10d824shiqian} 863326aa564127acf095f6f0952b2f54d149a10d824shiqian 864326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that the action body can promote the parameter types. 865326aa564127acf095f6f0952b2f54d149a10d824shiqian 866326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(PadArgument, prefix, suffix) { 867326aa564127acf095f6f0952b2f54d149a10d824shiqian // The following lines promote the two parameters to desired types. 868326aa564127acf095f6f0952b2f54d149a10d824shiqian std::string prefix_str(prefix); 86932de5f53763125925e078498250f7e73a88de9edzhanyong.wan char suffix_char = static_cast<char>(suffix); 870326aa564127acf095f6f0952b2f54d149a10d824shiqian return prefix_str + arg0 + suffix_char; 871326aa564127acf095f6f0952b2f54d149a10d824shiqian} 872326aa564127acf095f6f0952b2f54d149a10d824shiqian 873326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, SimpleTypePromotion) { 874326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<std::string(const char*)> no_promo = 875326aa564127acf095f6f0952b2f54d149a10d824shiqian PadArgument(std::string("foo"), 'r'); 876326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<std::string(const char*)> promo = 877326aa564127acf095f6f0952b2f54d149a10d824shiqian PadArgument("foo", static_cast<int>('r')); 87890c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("foobar", no_promo.Perform(make_tuple(CharPtr("ba")))); 87990c90f9250f19c3f3a5c2c0887c1d9e414afe41bzhanyong.wan EXPECT_EQ("foobar", promo.Perform(make_tuple(CharPtr("ba")))); 880326aa564127acf095f6f0952b2f54d149a10d824shiqian} 881326aa564127acf095f6f0952b2f54d149a10d824shiqian 882326aa564127acf095f6f0952b2f54d149a10d824shiqian// Tests that we can partially restrict parameter types using a 883326aa564127acf095f6f0952b2f54d149a10d824shiqian// straight-forward pattern. 884326aa564127acf095f6f0952b2f54d149a10d824shiqian 885326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines a generic action that doesn't restrict the types of its 886326aa564127acf095f6f0952b2f54d149a10d824shiqian// parameters. 887326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P3(ConcatImpl, a, b, c) { 888326aa564127acf095f6f0952b2f54d149a10d824shiqian std::stringstream ss; 889326aa564127acf095f6f0952b2f54d149a10d824shiqian ss << a << b << c; 890326aa564127acf095f6f0952b2f54d149a10d824shiqian return ss.str(); 891326aa564127acf095f6f0952b2f54d149a10d824shiqian} 892326aa564127acf095f6f0952b2f54d149a10d824shiqian 893326aa564127acf095f6f0952b2f54d149a10d824shiqian// Next, we try to restrict that either the first parameter is a 894326aa564127acf095f6f0952b2f54d149a10d824shiqian// string, or the second parameter is an int. 895326aa564127acf095f6f0952b2f54d149a10d824shiqian 896326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines a partially specialized wrapper that restricts the first 897326aa564127acf095f6f0952b2f54d149a10d824shiqian// parameter to std::string. 898326aa564127acf095f6f0952b2f54d149a10d824shiqiantemplate <typename T1, typename T2> 899326aa564127acf095f6f0952b2f54d149a10d824shiqian// ConcatImplActionP3 is the class template ACTION_P3 uses to 900326aa564127acf095f6f0952b2f54d149a10d824shiqian// implement ConcatImpl. We shouldn't change the name as this 901326aa564127acf095f6f0952b2f54d149a10d824shiqian// pattern requires the user to use it directly. 902326aa564127acf095f6f0952b2f54d149a10d824shiqianConcatImplActionP3<std::string, T1, T2> 903326aa564127acf095f6f0952b2f54d149a10d824shiqianConcat(const std::string& a, T1 b, T2 c) { 9041f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue GTEST_INTENTIONAL_CONST_COND_PUSH_() 905326aa564127acf095f6f0952b2f54d149a10d824shiqian if (true) { 9061f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue GTEST_INTENTIONAL_CONST_COND_POP_() 907326aa564127acf095f6f0952b2f54d149a10d824shiqian // This branch verifies that ConcatImpl() can be invoked without 908326aa564127acf095f6f0952b2f54d149a10d824shiqian // explicit template arguments. 909326aa564127acf095f6f0952b2f54d149a10d824shiqian return ConcatImpl(a, b, c); 910326aa564127acf095f6f0952b2f54d149a10d824shiqian } else { 911326aa564127acf095f6f0952b2f54d149a10d824shiqian // This branch verifies that ConcatImpl() can also be invoked with 912326aa564127acf095f6f0952b2f54d149a10d824shiqian // explicit template arguments. It doesn't really need to be 913326aa564127acf095f6f0952b2f54d149a10d824shiqian // executed as this is a compile-time verification. 914326aa564127acf095f6f0952b2f54d149a10d824shiqian return ConcatImpl<std::string, T1, T2>(a, b, c); 915326aa564127acf095f6f0952b2f54d149a10d824shiqian } 916326aa564127acf095f6f0952b2f54d149a10d824shiqian} 917326aa564127acf095f6f0952b2f54d149a10d824shiqian 918326aa564127acf095f6f0952b2f54d149a10d824shiqian// Defines another partially specialized wrapper that restricts the 919326aa564127acf095f6f0952b2f54d149a10d824shiqian// second parameter to int. 920326aa564127acf095f6f0952b2f54d149a10d824shiqiantemplate <typename T1, typename T2> 921326aa564127acf095f6f0952b2f54d149a10d824shiqianConcatImplActionP3<T1, int, T2> 922326aa564127acf095f6f0952b2f54d149a10d824shiqianConcat(T1 a, int b, T2 c) { 923326aa564127acf095f6f0952b2f54d149a10d824shiqian return ConcatImpl(a, b, c); 924326aa564127acf095f6f0952b2f54d149a10d824shiqian} 925326aa564127acf095f6f0952b2f54d149a10d824shiqian 926326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) { 927326aa564127acf095f6f0952b2f54d149a10d824shiqian Action<const std::string()> a1 = Concat("Hello", "1", 2); 928326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ("Hello12", a1.Perform(make_tuple())); 929326aa564127acf095f6f0952b2f54d149a10d824shiqian 930326aa564127acf095f6f0952b2f54d149a10d824shiqian a1 = Concat(1, 2, 3); 931326aa564127acf095f6f0952b2f54d149a10d824shiqian EXPECT_EQ("123", a1.Perform(make_tuple())); 932326aa564127acf095f6f0952b2f54d149a10d824shiqian} 933326aa564127acf095f6f0952b2f54d149a10d824shiqian 934326aa564127acf095f6f0952b2f54d149a10d824shiqian// Verifies the type of an ACTION*. 935326aa564127acf095f6f0952b2f54d149a10d824shiqian 936326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION(DoFoo) {} 937326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P(DoFoo, p) {} 938326aa564127acf095f6f0952b2f54d149a10d824shiqianACTION_P2(DoFoo, p0, p1) {} 939326aa564127acf095f6f0952b2f54d149a10d824shiqian 940326aa564127acf095f6f0952b2f54d149a10d824shiqianTEST(ActionPnMacroTest, TypesAreCorrect) { 941326aa564127acf095f6f0952b2f54d149a10d824shiqian // DoFoo() must be assignable to a DoFooAction variable. 942326aa564127acf095f6f0952b2f54d149a10d824shiqian DoFooAction a0 = DoFoo(); 943326aa564127acf095f6f0952b2f54d149a10d824shiqian 944326aa564127acf095f6f0952b2f54d149a10d824shiqian // DoFoo(1) must be assignable to a DoFooActionP variable. 945326aa564127acf095f6f0952b2f54d149a10d824shiqian DoFooActionP<int> a1 = DoFoo(1); 946326aa564127acf095f6f0952b2f54d149a10d824shiqian 947326aa564127acf095f6f0952b2f54d149a10d824shiqian // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk 948326aa564127acf095f6f0952b2f54d149a10d824shiqian // variable, and so on. 949326aa564127acf095f6f0952b2f54d149a10d824shiqian DoFooActionP2<int, char> a2 = DoFoo(1, '2'); 950326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP3<int, int, char> a3 = Plus(1, 2, '3'); 951326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4'); 952326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5'); 953326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6'); 954326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP7<int, int, int, int, int, int, char> a7 = 955326aa564127acf095f6f0952b2f54d149a10d824shiqian Plus(1, 2, 3, 4, 5, 6, '7'); 956326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP8<int, int, int, int, int, int, int, char> a8 = 957326aa564127acf095f6f0952b2f54d149a10d824shiqian Plus(1, 2, 3, 4, 5, 6, 7, '8'); 958326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP9<int, int, int, int, int, int, int, int, char> a9 = 959326aa564127acf095f6f0952b2f54d149a10d824shiqian Plus(1, 2, 3, 4, 5, 6, 7, 8, '9'); 960326aa564127acf095f6f0952b2f54d149a10d824shiqian PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 = 961326aa564127acf095f6f0952b2f54d149a10d824shiqian Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0'); 96229be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan 96329be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan // Avoid "unused variable" warnings. 96429be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a0; 96529be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a1; 96629be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a2; 96729be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a3; 96829be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a4; 96929be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a5; 97029be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a6; 97129be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a7; 97229be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a8; 97329be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a9; 97429be92385e118de1b2ef45daf38dfd1dabbea63fzhanyong.wan (void)a10; 975326aa564127acf095f6f0952b2f54d149a10d824shiqian} 976326aa564127acf095f6f0952b2f54d149a10d824shiqian 977c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan// Tests that an ACTION_P*() action can be explicitly instantiated 978c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan// with reference-typed parameters. 979c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 980c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P(Plus1, x) { return x; } 981c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P2(Plus2, x, y) { return x + y; } 982c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P3(Plus3, x, y, z) { return x + y + z; } 983c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { 984c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9; 985c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan} 986c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 987c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wanTEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) { 988c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan int x = 1, y = 2, z = 3; 989c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan const tuple<> empty = make_tuple(); 990c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 991c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan Action<int()> a = Plus1<int&>(x); 992c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan EXPECT_EQ(1, a.Perform(empty)); 993c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 994c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan a = Plus2<const int&, int&>(x, y); 995c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan EXPECT_EQ(3, a.Perform(empty)); 996c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 997c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan a = Plus3<int&, const int&, int&>(x, y, z); 998c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan EXPECT_EQ(6, a.Perform(empty)); 999c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 1000c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 1001c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&, 1002c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], 1003c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan n[8], n[9]); 1004c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan EXPECT_EQ(55, a.Perform(empty)); 1005c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan} 1006c069d7fe27bfe8cfdaff77ef38455688c453c28dzhanyong.wan 10071c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass NullaryConstructorClass { 10081c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public: 10091c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan NullaryConstructorClass() : value_(123) {} 10101c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan int value_; 10111c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}; 10121c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10131c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a nullary constructor. 10141c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, NoArgs) { 10151c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>(); 10161c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan NullaryConstructorClass* c = a.Perform(make_tuple()); 10171c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan EXPECT_EQ(123, c->value_); 10181c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan delete c; 10191c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan} 10201c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10211c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass UnaryConstructorClass { 10221c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public: 10231c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan explicit UnaryConstructorClass(int value) : value_(value) {} 10241c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan int value_; 10251c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}; 10261c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10271c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a unary constructor. 10281c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, Unary) { 10291c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000); 10301c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan UnaryConstructorClass* c = a.Perform(make_tuple()); 10311c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan EXPECT_EQ(4000, c->value_); 10321c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan delete c; 10331c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan} 10341c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10351c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) { 10361c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan Action<UnaryConstructorClass*(bool, int)> a = 10371c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan ReturnNew<UnaryConstructorClass>(4000); 10381c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan UnaryConstructorClass* c = a.Perform(make_tuple(false, 5)); 10391c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan EXPECT_EQ(4000, c->value_); 10401c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan delete c; 10411c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan} 10421c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10431c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) { 10441c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan Action<const UnaryConstructorClass*()> a = 10451c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan ReturnNew<UnaryConstructorClass>(4000); 10461c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan const UnaryConstructorClass* c = a.Perform(make_tuple()); 10471c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan EXPECT_EQ(4000, c->value_); 10481c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan delete c; 10491c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan} 10501c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10511c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanclass TenArgConstructorClass { 10521c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan public: 10531c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, 10541c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan int a6, int a7, int a8, int a9, int a10) 10551c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) { 10561c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan } 10571c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan int value_; 10581c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan}; 10591c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 10601c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan// Tests using ReturnNew() with a 10-argument constructor. 10611c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wanTEST(ReturnNewTest, ConstructorThatTakes10Arguments) { 10621c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan Action<TenArgConstructorClass*()> a = 10631c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000, 10641c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 4000000, 500000, 60000, 10651c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 7000, 800, 90, 0); 10661c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan TenArgConstructorClass* c = a.Perform(make_tuple()); 10671c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan EXPECT_EQ(1234567890, c->value_); 10681c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan delete c; 10691c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan} 10701c8eb1c059d6727d9fcf45864dc6efa3d844e184zhanyong.wan 107118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works when there is no value parameter. 107218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(CreateNew, 107318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(typename, T), 107418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_0_VALUE_PARAMS()) { 107518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return new T; 107618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 107718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 107818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksWithoutValueParam) { 107918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int*()> a = CreateNew<int>(); 108018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int* p = a.Perform(make_tuple()); 108118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan delete p; 108218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 108318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 108418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works when there are value parameters. 108518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(CreateNew, 108618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(typename, T), 108718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_1_VALUE_PARAMS(a0)) { 108818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return new T(a0); 108918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 109018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 109118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksWithValueParams) { 109218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int*()> a = CreateNew<int>(42); 109318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int* p = a.Perform(make_tuple()); 109418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(42, *p); 109518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan delete p; 109618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 109718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 109818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for integral template parameters. 109918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(MyDeleteArg, 110018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(int, k), 110118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_0_VALUE_PARAMS()) { 1102bd0188320de5aab1b09718e2c466387099d43cfbkosak delete get<k>(args); 110318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 110418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 110518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Resets a bool variable in the destructor. 110618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass BoolResetter { 110718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan public: 110818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan explicit BoolResetter(bool* value) : value_(value) {} 110918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan ~BoolResetter() { *value_ = false; } 111018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan private: 111132de5f53763125925e078498250f7e73a88de9edzhanyong.wan bool* value_; 111218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}; 111318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 111418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksForIntegralTemplateParams) { 111518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>(); 111618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n = 0; 111718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan bool b = true; 111818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan BoolResetter* resetter = new BoolResetter(&b); 111918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan a.Perform(make_tuple(&n, resetter)); 112018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(b); // Verifies that resetter is deleted. 112118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 112218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 112318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATES works for template template parameters. 112418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSmartPointer, 112518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class, 112618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Pointer), 112718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_1_VALUE_PARAMS(pointee)) { 112818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return Pointer<pointee_type>(new pointee_type(pointee)); 112918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 113018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 113118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksForTemplateTemplateParameters) { 113218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan using ::testing::internal::linked_ptr; 113318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42); 113418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan linked_ptr<int> p = a.Perform(make_tuple()); 113518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(42, *p); 113618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 113718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 113818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for 10 template parameters. 113918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wantemplate <typename T1, typename T2, typename T3, int k4, bool k5, 114018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan unsigned int k6, typename T7, typename T8, typename T9> 114118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanstruct GiantTemplate { 114218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan public: 114318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan explicit GiantTemplate(int a_value) : value(a_value) {} 114418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int value; 114518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}; 114618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 114718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnGiant, 114818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_10_TEMPLATE_PARAMS( 114918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan typename, T1, 115018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan typename, T2, 115118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan typename, T3, 115218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int, k4, 115318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan bool, k5, 115418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan unsigned int, k6, 115518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan class, T7, 115618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan class, T8, 115718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan class, T9, 115818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan template <typename T> class, T10), 115918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_1_VALUE_PARAMS(value)) { 116018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value); 116118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 116218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 116318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksFor10TemplateParameters) { 116418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan using ::testing::internal::linked_ptr; 116518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan typedef GiantTemplate<linked_ptr<int>, bool, double, 5, 116618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan true, 6, char, unsigned, int> Giant; 116718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<Giant()> a = ReturnGiant< 116818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42); 116918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Giant giant = a.Perform(make_tuple()); 117018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(42, giant.value); 117118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 117218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 117318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE works for 10 value parameters. 117418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum, 117518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(typename, Number), 117618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) { 117718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10; 117818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 117918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 118018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, WorksFor10ValueParameters) { 118118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 118218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(55, a.Perform(make_tuple())); 118318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 118418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 118518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded 118618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// on the number of value parameters. 118718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 118818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION(ReturnSum) { return 0; } 118918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 119018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_P(ReturnSum, x) { return x; } 119118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 119218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum, 119318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(typename, Number), 119418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_2_VALUE_PARAMS(v1, v2)) { 119518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return static_cast<Number>(v1) + v2; 119618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 119718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 119818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum, 119918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_1_TEMPLATE_PARAMS(typename, Number), 120018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_3_VALUE_PARAMS(v1, v2, v3)) { 120118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return static_cast<Number>(v1) + v2 + v3; 120218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 120318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 120418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanACTION_TEMPLATE(ReturnSum, 120518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan HAS_2_TEMPLATE_PARAMS(typename, Number, int, k), 120618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan AND_4_VALUE_PARAMS(v1, v2, v3, v4)) { 120718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan return static_cast<Number>(v1) + v2 + v3 + v4 + k; 120818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 120918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 121018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) { 121118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a0 = ReturnSum(); 121218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a1 = ReturnSum(1); 121318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a2 = ReturnSum<int>(1, 2); 121418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a3 = ReturnSum<int>(1, 2, 3); 121518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5); 121618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(0, a0.Perform(make_tuple())); 121718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(1, a1.Perform(make_tuple())); 121818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(3, a2.Perform(make_tuple())); 121918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(6, a3.Perform(make_tuple())); 122018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_EQ(12345, a4.Perform(make_tuple())); 122118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 122218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 122332de5f53763125925e078498250f7e73a88de9edzhanyong.wan#ifdef _MSC_VER 1224658ac0b71a350cc833ee4520536b6c4964c7b944zhanyong.wan# pragma warning(pop) 122532de5f53763125925e078498250f7e73a88de9edzhanyong.wan#endif 122632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1227e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace gmock_generated_actions_test 1228e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 1229