1 // Copyright 2007, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 // Google Mock - a framework for writing C++ mock classes. 31 // 32 // This file tests the built-in actions in gmock-actions.h. 33 34 #include "gmock/gmock-more-actions.h" 35 36 #include <algorithm> 37 #include <functional> 38 #include <iterator> 39 #include <memory> 40 #include <sstream> 41 #include <string> 42 #include <tuple> 43 #include <vector> 44 45 #include "gmock/gmock.h" 46 #include "gtest/gtest-spi.h" 47 #include "gtest/gtest.h" 48 49 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4577) 50 51 namespace testing { 52 namespace gmock_more_actions_test { 53 54 using ::std::plus; 55 using ::std::string; 56 using testing::Action; 57 using testing::DeleteArg; 58 using testing::Invoke; 59 using testing::ReturnArg; 60 using testing::ReturnPointee; 61 using testing::SaveArg; 62 using testing::SaveArgPointee; 63 using testing::SetArgReferee; 64 using testing::Unused; 65 using testing::WithArg; 66 using testing::WithoutArgs; 67 68 // For suppressing compiler warnings on conversion possibly losing precision. 69 inline short Short(short n) { return n; } // NOLINT 70 inline char Char(char ch) { return ch; } 71 72 // Sample functions and functors for testing Invoke() and etc. 73 int Nullary() { return 1; } 74 75 bool g_done = false; 76 77 bool Unary(int x) { return x < 0; } 78 79 bool ByConstRef(const std::string& s) { return s == "Hi"; } 80 81 const double g_double = 0; 82 bool ReferencesGlobalDouble(const double& x) { return &x == &g_double; } 83 84 struct UnaryFunctor { 85 int operator()(bool x) { return x ? 1 : -1; } 86 }; 87 88 struct UnaryMoveOnlyFunctor : UnaryFunctor { 89 UnaryMoveOnlyFunctor() = default; 90 UnaryMoveOnlyFunctor(const UnaryMoveOnlyFunctor&) = delete; 91 UnaryMoveOnlyFunctor(UnaryMoveOnlyFunctor&&) = default; 92 }; 93 94 struct OneShotUnaryFunctor { 95 int operator()(bool x) && { return x ? 1 : -1; } 96 }; 97 98 const char* Binary(const char* input, short n) { return input + n; } // NOLINT 99 100 int Ternary(int x, char y, short z) { return x + y + z; } // NOLINT 101 102 int SumOf4(int a, int b, int c, int d) { return a + b + c + d; } 103 104 int SumOfFirst2(int a, int b, Unused, Unused) { return a + b; } 105 106 int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; } 107 108 struct SumOf5Functor { 109 int operator()(int a, int b, int c, int d, int e) { 110 return a + b + c + d + e; 111 } 112 }; 113 114 int SumOf6(int a, int b, int c, int d, int e, int f) { 115 return a + b + c + d + e + f; 116 } 117 118 struct SumOf6Functor { 119 int operator()(int a, int b, int c, int d, int e, int f) { 120 return a + b + c + d + e + f; 121 } 122 }; 123 124 std::string Concat7(const char* s1, const char* s2, const char* s3, 125 const char* s4, const char* s5, const char* s6, 126 const char* s7) { 127 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7; 128 } 129 130 std::string Concat8(const char* s1, const char* s2, const char* s3, 131 const char* s4, const char* s5, const char* s6, 132 const char* s7, const char* s8) { 133 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8; 134 } 135 136 std::string Concat9(const char* s1, const char* s2, const char* s3, 137 const char* s4, const char* s5, const char* s6, 138 const char* s7, const char* s8, const char* s9) { 139 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9; 140 } 141 142 std::string Concat10(const char* s1, const char* s2, const char* s3, 143 const char* s4, const char* s5, const char* s6, 144 const char* s7, const char* s8, const char* s9, 145 const char* s10) { 146 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10; 147 } 148 149 class Foo { 150 public: 151 Foo() : value_(123) {} 152 153 int Nullary() const { return value_; } 154 155 short Unary(long x) { return static_cast<short>(value_ + x); } // NOLINT 156 157 std::string Binary(const std::string& str, char c) const { return str + c; } 158 159 int Ternary(int x, bool y, char z) { return value_ + x + y * z; } 160 161 int SumOf4(int a, int b, int c, int d) const { 162 return a + b + c + d + value_; 163 } 164 165 int SumOfLast2(Unused, Unused, int a, int b) const { return a + b; } 166 167 int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; } 168 169 int SumOf6(int a, int b, int c, int d, int e, int f) { 170 return a + b + c + d + e + f; 171 } 172 173 std::string Concat7(const char* s1, const char* s2, const char* s3, 174 const char* s4, const char* s5, const char* s6, 175 const char* s7) { 176 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7; 177 } 178 179 std::string Concat8(const char* s1, const char* s2, const char* s3, 180 const char* s4, const char* s5, const char* s6, 181 const char* s7, const char* s8) { 182 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8; 183 } 184 185 std::string Concat9(const char* s1, const char* s2, const char* s3, 186 const char* s4, const char* s5, const char* s6, 187 const char* s7, const char* s8, const char* s9) { 188 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9; 189 } 190 191 std::string Concat10(const char* s1, const char* s2, const char* s3, 192 const char* s4, const char* s5, const char* s6, 193 const char* s7, const char* s8, const char* s9, 194 const char* s10) { 195 return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10; 196 } 197 198 private: 199 int value_; 200 }; 201 202 // Tests using Invoke() with a nullary function. 203 TEST(InvokeTest, Nullary) { 204 Action<int()> a = Invoke(Nullary); // NOLINT 205 EXPECT_EQ(1, a.Perform(std::make_tuple())); 206 } 207 208 // Tests using Invoke() with a unary function. 209 TEST(InvokeTest, Unary) { 210 Action<bool(int)> a = Invoke(Unary); // NOLINT 211 EXPECT_FALSE(a.Perform(std::make_tuple(1))); 212 EXPECT_TRUE(a.Perform(std::make_tuple(-1))); 213 } 214 215 // Tests using Invoke() with a binary function. 216 TEST(InvokeTest, Binary) { 217 Action<const char*(const char*, short)> a = Invoke(Binary); // NOLINT 218 const char* p = "Hello"; 219 EXPECT_EQ(p + 2, a.Perform(std::make_tuple(p, Short(2)))); 220 } 221 222 // Tests using Invoke() with a ternary function. 223 TEST(InvokeTest, Ternary) { 224 Action<int(int, char, short)> a = Invoke(Ternary); // NOLINT 225 EXPECT_EQ(6, a.Perform(std::make_tuple(1, '\2', Short(3)))); 226 } 227 228 // Tests using Invoke() with a 4-argument function. 229 TEST(InvokeTest, FunctionThatTakes4Arguments) { 230 Action<int(int, int, int, int)> a = Invoke(SumOf4); // NOLINT 231 EXPECT_EQ(1234, a.Perform(std::make_tuple(1000, 200, 30, 4))); 232 } 233 234 // Tests using Invoke() with a 5-argument function. 235 TEST(InvokeTest, FunctionThatTakes5Arguments) { 236 Action<int(int, int, int, int, int)> a = Invoke(SumOf5); // NOLINT 237 EXPECT_EQ(12345, a.Perform(std::make_tuple(10000, 2000, 300, 40, 5))); 238 } 239 240 // Tests using Invoke() with a 6-argument function. 241 TEST(InvokeTest, FunctionThatTakes6Arguments) { 242 Action<int(int, int, int, int, int, int)> a = Invoke(SumOf6); // NOLINT 243 EXPECT_EQ(123456, 244 a.Perform(std::make_tuple(100000, 20000, 3000, 400, 50, 6))); 245 } 246 247 // A helper that turns the type of a C-string literal from const 248 // char[N] to const char*. 249 inline const char* CharPtr(const char* s) { return s; } 250 251 // Tests using Invoke() with a 7-argument function. 252 TEST(InvokeTest, FunctionThatTakes7Arguments) { 253 Action<std::string(const char*, const char*, const char*, const char*, 254 const char*, const char*, const char*)> 255 a = Invoke(Concat7); 256 EXPECT_EQ("1234567", 257 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 258 CharPtr("4"), CharPtr("5"), CharPtr("6"), 259 CharPtr("7")))); 260 } 261 262 // Tests using Invoke() with a 8-argument function. 263 TEST(InvokeTest, FunctionThatTakes8Arguments) { 264 Action<std::string(const char*, const char*, const char*, const char*, 265 const char*, const char*, const char*, const char*)> 266 a = Invoke(Concat8); 267 EXPECT_EQ("12345678", 268 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 269 CharPtr("4"), CharPtr("5"), CharPtr("6"), 270 CharPtr("7"), CharPtr("8")))); 271 } 272 273 // Tests using Invoke() with a 9-argument function. 274 TEST(InvokeTest, FunctionThatTakes9Arguments) { 275 Action<std::string(const char*, const char*, const char*, const char*, 276 const char*, const char*, const char*, const char*, 277 const char*)> 278 a = Invoke(Concat9); 279 EXPECT_EQ("123456789", a.Perform(std::make_tuple( 280 CharPtr("1"), CharPtr("2"), CharPtr("3"), 281 CharPtr("4"), CharPtr("5"), CharPtr("6"), 282 CharPtr("7"), CharPtr("8"), CharPtr("9")))); 283 } 284 285 // Tests using Invoke() with a 10-argument function. 286 TEST(InvokeTest, FunctionThatTakes10Arguments) { 287 Action<std::string(const char*, const char*, const char*, const char*, 288 const char*, const char*, const char*, const char*, 289 const char*, const char*)> 290 a = Invoke(Concat10); 291 EXPECT_EQ("1234567890", 292 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 293 CharPtr("4"), CharPtr("5"), CharPtr("6"), 294 CharPtr("7"), CharPtr("8"), CharPtr("9"), 295 CharPtr("0")))); 296 } 297 298 // Tests using Invoke() with functions with parameters declared as Unused. 299 TEST(InvokeTest, FunctionWithUnusedParameters) { 300 Action<int(int, int, double, const std::string&)> a1 = Invoke(SumOfFirst2); 301 std::tuple<int, int, double, std::string> dummy = 302 std::make_tuple(10, 2, 5.6, std::string("hi")); 303 EXPECT_EQ(12, a1.Perform(dummy)); 304 305 Action<int(int, int, bool, int*)> a2 = Invoke(SumOfFirst2); 306 EXPECT_EQ( 307 23, a2.Perform(std::make_tuple(20, 3, true, static_cast<int*>(nullptr)))); 308 } 309 310 // Tests using Invoke() with methods with parameters declared as Unused. 311 TEST(InvokeTest, MethodWithUnusedParameters) { 312 Foo foo; 313 Action<int(std::string, bool, int, int)> a1 = Invoke(&foo, &Foo::SumOfLast2); 314 EXPECT_EQ(12, a1.Perform(std::make_tuple(CharPtr("hi"), true, 10, 2))); 315 316 Action<int(char, double, int, int)> a2 = Invoke(&foo, &Foo::SumOfLast2); 317 EXPECT_EQ(23, a2.Perform(std::make_tuple('a', 2.5, 20, 3))); 318 } 319 320 // Tests using Invoke() with a functor. 321 TEST(InvokeTest, Functor) { 322 Action<long(long, int)> a = Invoke(plus<long>()); // NOLINT 323 EXPECT_EQ(3L, a.Perform(std::make_tuple(1, 2))); 324 } 325 326 // Tests using Invoke(f) as an action of a compatible type. 327 TEST(InvokeTest, FunctionWithCompatibleType) { 328 Action<long(int, short, char, bool)> a = Invoke(SumOf4); // NOLINT 329 EXPECT_EQ(4321, a.Perform(std::make_tuple(4000, Short(300), Char(20), true))); 330 } 331 332 // Tests using Invoke() with an object pointer and a method pointer. 333 334 // Tests using Invoke() with a nullary method. 335 TEST(InvokeMethodTest, Nullary) { 336 Foo foo; 337 Action<int()> a = Invoke(&foo, &Foo::Nullary); // NOLINT 338 EXPECT_EQ(123, a.Perform(std::make_tuple())); 339 } 340 341 // Tests using Invoke() with a unary method. 342 TEST(InvokeMethodTest, Unary) { 343 Foo foo; 344 Action<short(long)> a = Invoke(&foo, &Foo::Unary); // NOLINT 345 EXPECT_EQ(4123, a.Perform(std::make_tuple(4000))); 346 } 347 348 // Tests using Invoke() with a binary method. 349 TEST(InvokeMethodTest, Binary) { 350 Foo foo; 351 Action<std::string(const std::string&, char)> a = Invoke(&foo, &Foo::Binary); 352 std::string s("Hell"); 353 std::tuple<std::string, char> dummy = std::make_tuple(s, 'o'); 354 EXPECT_EQ("Hello", a.Perform(dummy)); 355 } 356 357 // Tests using Invoke() with a ternary method. 358 TEST(InvokeMethodTest, Ternary) { 359 Foo foo; 360 Action<int(int, bool, char)> a = Invoke(&foo, &Foo::Ternary); // NOLINT 361 EXPECT_EQ(1124, a.Perform(std::make_tuple(1000, true, Char(1)))); 362 } 363 364 // Tests using Invoke() with a 4-argument method. 365 TEST(InvokeMethodTest, MethodThatTakes4Arguments) { 366 Foo foo; 367 Action<int(int, int, int, int)> a = Invoke(&foo, &Foo::SumOf4); // NOLINT 368 EXPECT_EQ(1357, a.Perform(std::make_tuple(1000, 200, 30, 4))); 369 } 370 371 // Tests using Invoke() with a 5-argument method. 372 TEST(InvokeMethodTest, MethodThatTakes5Arguments) { 373 Foo foo; 374 Action<int(int, int, int, int, int)> a = 375 Invoke(&foo, &Foo::SumOf5); // NOLINT 376 EXPECT_EQ(12345, a.Perform(std::make_tuple(10000, 2000, 300, 40, 5))); 377 } 378 379 // Tests using Invoke() with a 6-argument method. 380 TEST(InvokeMethodTest, MethodThatTakes6Arguments) { 381 Foo foo; 382 Action<int(int, int, int, int, int, int)> a = // NOLINT 383 Invoke(&foo, &Foo::SumOf6); 384 EXPECT_EQ(123456, 385 a.Perform(std::make_tuple(100000, 20000, 3000, 400, 50, 6))); 386 } 387 388 // Tests using Invoke() with a 7-argument method. 389 TEST(InvokeMethodTest, MethodThatTakes7Arguments) { 390 Foo foo; 391 Action<std::string(const char*, const char*, const char*, const char*, 392 const char*, const char*, const char*)> 393 a = Invoke(&foo, &Foo::Concat7); 394 EXPECT_EQ("1234567", 395 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 396 CharPtr("4"), CharPtr("5"), CharPtr("6"), 397 CharPtr("7")))); 398 } 399 400 // Tests using Invoke() with a 8-argument method. 401 TEST(InvokeMethodTest, MethodThatTakes8Arguments) { 402 Foo foo; 403 Action<std::string(const char*, const char*, const char*, const char*, 404 const char*, const char*, const char*, const char*)> 405 a = Invoke(&foo, &Foo::Concat8); 406 EXPECT_EQ("12345678", 407 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 408 CharPtr("4"), CharPtr("5"), CharPtr("6"), 409 CharPtr("7"), CharPtr("8")))); 410 } 411 412 // Tests using Invoke() with a 9-argument method. 413 TEST(InvokeMethodTest, MethodThatTakes9Arguments) { 414 Foo foo; 415 Action<std::string(const char*, const char*, const char*, const char*, 416 const char*, const char*, const char*, const char*, 417 const char*)> 418 a = Invoke(&foo, &Foo::Concat9); 419 EXPECT_EQ("123456789", a.Perform(std::make_tuple( 420 CharPtr("1"), CharPtr("2"), CharPtr("3"), 421 CharPtr("4"), CharPtr("5"), CharPtr("6"), 422 CharPtr("7"), CharPtr("8"), CharPtr("9")))); 423 } 424 425 // Tests using Invoke() with a 10-argument method. 426 TEST(InvokeMethodTest, MethodThatTakes10Arguments) { 427 Foo foo; 428 Action<std::string(const char*, const char*, const char*, const char*, 429 const char*, const char*, const char*, const char*, 430 const char*, const char*)> 431 a = Invoke(&foo, &Foo::Concat10); 432 EXPECT_EQ("1234567890", 433 a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"), 434 CharPtr("4"), CharPtr("5"), CharPtr("6"), 435 CharPtr("7"), CharPtr("8"), CharPtr("9"), 436 CharPtr("0")))); 437 } 438 439 // Tests using Invoke(f) as an action of a compatible type. 440 TEST(InvokeMethodTest, MethodWithCompatibleType) { 441 Foo foo; 442 Action<long(int, short, char, bool)> a = // NOLINT 443 Invoke(&foo, &Foo::SumOf4); 444 EXPECT_EQ(4444, a.Perform(std::make_tuple(4000, Short(300), Char(20), true))); 445 } 446 447 // Tests using WithoutArgs with an action that takes no argument. 448 TEST(WithoutArgsTest, NoArg) { 449 Action<int(int n)> a = WithoutArgs(Invoke(Nullary)); // NOLINT 450 EXPECT_EQ(1, a.Perform(std::make_tuple(2))); 451 } 452 453 // Tests using WithArg with an action that takes 1 argument. 454 TEST(WithArgTest, OneArg) { 455 Action<bool(double x, int n)> b = WithArg<1>(Invoke(Unary)); // NOLINT 456 EXPECT_TRUE(b.Perform(std::make_tuple(1.5, -1))); 457 EXPECT_FALSE(b.Perform(std::make_tuple(1.5, 1))); 458 } 459 460 TEST(ReturnArgActionTest, WorksForOneArgIntArg0) { 461 const Action<int(int)> a = ReturnArg<0>(); 462 EXPECT_EQ(5, a.Perform(std::make_tuple(5))); 463 } 464 465 TEST(ReturnArgActionTest, WorksForMultiArgBoolArg0) { 466 const Action<bool(bool, bool, bool)> a = ReturnArg<0>(); 467 EXPECT_TRUE(a.Perform(std::make_tuple(true, false, false))); 468 } 469 470 TEST(ReturnArgActionTest, WorksForMultiArgStringArg2) { 471 const Action<std::string(int, int, std::string, int)> a = ReturnArg<2>(); 472 EXPECT_EQ("seven", a.Perform(std::make_tuple(5, 6, std::string("seven"), 8))); 473 } 474 475 TEST(ReturnArgActionTest, WorksForNonConstRefArg0) { 476 const Action<std::string&(std::string&)> a = ReturnArg<0>(); 477 std::string s = "12345"; 478 EXPECT_EQ(&s, &a.Perform(std::forward_as_tuple(s))); 479 } 480 481 TEST(SaveArgActionTest, WorksForSameType) { 482 int result = 0; 483 const Action<void(int n)> a1 = SaveArg<0>(&result); 484 a1.Perform(std::make_tuple(5)); 485 EXPECT_EQ(5, result); 486 } 487 488 TEST(SaveArgActionTest, WorksForCompatibleType) { 489 int result = 0; 490 const Action<void(bool, char)> a1 = SaveArg<1>(&result); 491 a1.Perform(std::make_tuple(true, 'a')); 492 EXPECT_EQ('a', result); 493 } 494 495 TEST(SaveArgPointeeActionTest, WorksForSameType) { 496 int result = 0; 497 const int value = 5; 498 const Action<void(const int*)> a1 = SaveArgPointee<0>(&result); 499 a1.Perform(std::make_tuple(&value)); 500 EXPECT_EQ(5, result); 501 } 502 503 TEST(SaveArgPointeeActionTest, WorksForCompatibleType) { 504 int result = 0; 505 char value = 'a'; 506 const Action<void(bool, char*)> a1 = SaveArgPointee<1>(&result); 507 a1.Perform(std::make_tuple(true, &value)); 508 EXPECT_EQ('a', result); 509 } 510 511 TEST(SetArgRefereeActionTest, WorksForSameType) { 512 int value = 0; 513 const Action<void(int&)> a1 = SetArgReferee<0>(1); 514 a1.Perform(std::tuple<int&>(value)); 515 EXPECT_EQ(1, value); 516 } 517 518 TEST(SetArgRefereeActionTest, WorksForCompatibleType) { 519 int value = 0; 520 const Action<void(int, int&)> a1 = SetArgReferee<1>('a'); 521 a1.Perform(std::tuple<int, int&>(0, value)); 522 EXPECT_EQ('a', value); 523 } 524 525 TEST(SetArgRefereeActionTest, WorksWithExtraArguments) { 526 int value = 0; 527 const Action<void(bool, int, int&, const char*)> a1 = SetArgReferee<2>('a'); 528 a1.Perform(std::tuple<bool, int, int&, const char*>(true, 0, value, "hi")); 529 EXPECT_EQ('a', value); 530 } 531 532 // A class that can be used to verify that its destructor is called: it will set 533 // the bool provided to the constructor to true when destroyed. 534 class DeletionTester { 535 public: 536 explicit DeletionTester(bool* is_deleted) : is_deleted_(is_deleted) { 537 // Make sure the bit is set to false. 538 *is_deleted_ = false; 539 } 540 541 ~DeletionTester() { *is_deleted_ = true; } 542 543 private: 544 bool* is_deleted_; 545 }; 546 547 TEST(DeleteArgActionTest, OneArg) { 548 bool is_deleted = false; 549 DeletionTester* t = new DeletionTester(&is_deleted); 550 const Action<void(DeletionTester*)> a1 = DeleteArg<0>(); // NOLINT 551 EXPECT_FALSE(is_deleted); 552 a1.Perform(std::make_tuple(t)); 553 EXPECT_TRUE(is_deleted); 554 } 555 556 TEST(DeleteArgActionTest, TenArgs) { 557 bool is_deleted = false; 558 DeletionTester* t = new DeletionTester(&is_deleted); 559 const Action<void(bool, int, int, const char*, bool, int, int, int, int, 560 DeletionTester*)> 561 a1 = DeleteArg<9>(); 562 EXPECT_FALSE(is_deleted); 563 a1.Perform(std::make_tuple(true, 5, 6, CharPtr("hi"), false, 7, 8, 9, 10, t)); 564 EXPECT_TRUE(is_deleted); 565 } 566 567 #if GTEST_HAS_EXCEPTIONS 568 569 TEST(ThrowActionTest, ThrowsGivenExceptionInVoidFunction) { 570 const Action<void(int n)> a = Throw('a'); 571 EXPECT_THROW(a.Perform(std::make_tuple(0)), char); 572 } 573 574 class MyException {}; 575 576 TEST(ThrowActionTest, ThrowsGivenExceptionInNonVoidFunction) { 577 const Action<double(char ch)> a = Throw(MyException()); 578 EXPECT_THROW(a.Perform(std::make_tuple('0')), MyException); 579 } 580 581 TEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) { 582 const Action<double()> a = Throw(MyException()); 583 EXPECT_THROW(a.Perform(std::make_tuple()), MyException); 584 } 585 586 class Object { 587 public: 588 virtual ~Object() {} 589 virtual void Func() {} 590 }; 591 592 class MockObject : public Object { 593 public: 594 ~MockObject() override {} 595 MOCK_METHOD(void, Func, (), (override)); 596 }; 597 598 TEST(ThrowActionTest, Times0) { 599 EXPECT_NONFATAL_FAILURE( 600 [] { 601 try { 602 MockObject m; 603 ON_CALL(m, Func()).WillByDefault([] { throw "something"; }); 604 EXPECT_CALL(m, Func()).Times(0); 605 m.Func(); 606 } catch (...) { 607 // Exception is caught but Times(0) still triggers a failure. 608 } 609 }(), 610 ""); 611 } 612 613 #endif // GTEST_HAS_EXCEPTIONS 614 615 // Tests that SetArrayArgument<N>(first, last) sets the elements of the array 616 // pointed to by the N-th (0-based) argument to values in range [first, last). 617 TEST(SetArrayArgumentTest, SetsTheNthArray) { 618 using MyFunction = void(bool, int*, char*); 619 int numbers[] = {1, 2, 3}; 620 Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers + 3); 621 622 int n[4] = {}; 623 int* pn = n; 624 char ch[4] = {}; 625 char* pch = ch; 626 a.Perform(std::make_tuple(true, pn, pch)); 627 EXPECT_EQ(1, n[0]); 628 EXPECT_EQ(2, n[1]); 629 EXPECT_EQ(3, n[2]); 630 EXPECT_EQ(0, n[3]); 631 EXPECT_EQ('\0', ch[0]); 632 EXPECT_EQ('\0', ch[1]); 633 EXPECT_EQ('\0', ch[2]); 634 EXPECT_EQ('\0', ch[3]); 635 636 // Tests first and last are iterators. 637 std::string letters = "abc"; 638 a = SetArrayArgument<2>(letters.begin(), letters.end()); 639 std::fill_n(n, 4, 0); 640 std::fill_n(ch, 4, '\0'); 641 a.Perform(std::make_tuple(true, pn, pch)); 642 EXPECT_EQ(0, n[0]); 643 EXPECT_EQ(0, n[1]); 644 EXPECT_EQ(0, n[2]); 645 EXPECT_EQ(0, n[3]); 646 EXPECT_EQ('a', ch[0]); 647 EXPECT_EQ('b', ch[1]); 648 EXPECT_EQ('c', ch[2]); 649 EXPECT_EQ('\0', ch[3]); 650 } 651 652 // Tests SetArrayArgument<N>(first, last) where first == last. 653 TEST(SetArrayArgumentTest, SetsTheNthArrayWithEmptyRange) { 654 using MyFunction = void(bool, int*); 655 int numbers[] = {1, 2, 3}; 656 Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers); 657 658 int n[4] = {}; 659 int* pn = n; 660 a.Perform(std::make_tuple(true, pn)); 661 EXPECT_EQ(0, n[0]); 662 EXPECT_EQ(0, n[1]); 663 EXPECT_EQ(0, n[2]); 664 EXPECT_EQ(0, n[3]); 665 } 666 667 // Tests SetArrayArgument<N>(first, last) where *first is convertible 668 // (but not equal) to the argument type. 669 TEST(SetArrayArgumentTest, SetsTheNthArrayWithConvertibleType) { 670 using MyFunction = void(bool, int*); 671 char chars[] = {97, 98, 99}; 672 Action<MyFunction> a = SetArrayArgument<1>(chars, chars + 3); 673 674 int codes[4] = {111, 222, 333, 444}; 675 int* pcodes = codes; 676 a.Perform(std::make_tuple(true, pcodes)); 677 EXPECT_EQ(97, codes[0]); 678 EXPECT_EQ(98, codes[1]); 679 EXPECT_EQ(99, codes[2]); 680 EXPECT_EQ(444, codes[3]); 681 } 682 683 // Test SetArrayArgument<N>(first, last) with iterator as argument. 684 TEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) { 685 using MyFunction = void(bool, std::back_insert_iterator<std::string>); 686 std::string letters = "abc"; 687 Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end()); 688 689 std::string s; 690 a.Perform(std::make_tuple(true, std::back_inserter(s))); 691 EXPECT_EQ(letters, s); 692 } 693 694 TEST(ReturnPointeeTest, Works) { 695 int n = 42; 696 const Action<int()> a = ReturnPointee(&n); 697 EXPECT_EQ(42, a.Perform(std::make_tuple())); 698 699 n = 43; 700 EXPECT_EQ(43, a.Perform(std::make_tuple())); 701 } 702 703 // Tests InvokeArgument<N>(...). 704 705 // Tests using InvokeArgument with a nullary function. 706 TEST(InvokeArgumentTest, Function0) { 707 Action<int(int, int (*)())> a = InvokeArgument<1>(); // NOLINT 708 EXPECT_EQ(1, a.Perform(std::make_tuple(2, &Nullary))); 709 } 710 711 // Tests using InvokeArgument with a unary functor. 712 TEST(InvokeArgumentTest, Functor1) { 713 Action<int(UnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT 714 EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryFunctor()))); 715 } 716 717 // Tests using InvokeArgument with a unary move-only functor. 718 TEST(InvokeArgumentTest, Functor1MoveOnly) { 719 Action<int(UnaryMoveOnlyFunctor)> a = InvokeArgument<0>(true); // NOLINT 720 EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryMoveOnlyFunctor()))); 721 } 722 723 // Tests using InvokeArgument with a one-shot unary functor. 724 TEST(InvokeArgumentTest, OneShotFunctor1) { 725 Action<int(OneShotUnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT 726 EXPECT_EQ(1, a.Perform(std::make_tuple(OneShotUnaryFunctor()))); 727 } 728 729 // Tests using InvokeArgument with a 5-ary function. 730 TEST(InvokeArgumentTest, Function5) { 731 Action<int(int (*)(int, int, int, int, int))> a = // NOLINT 732 InvokeArgument<0>(10000, 2000, 300, 40, 5); 733 EXPECT_EQ(12345, a.Perform(std::make_tuple(&SumOf5))); 734 } 735 736 // Tests using InvokeArgument with a 5-ary functor. 737 TEST(InvokeArgumentTest, Functor5) { 738 Action<int(SumOf5Functor)> a = // NOLINT 739 InvokeArgument<0>(10000, 2000, 300, 40, 5); 740 EXPECT_EQ(12345, a.Perform(std::make_tuple(SumOf5Functor()))); 741 } 742 743 // Tests using InvokeArgument with a 6-ary function. 744 TEST(InvokeArgumentTest, Function6) { 745 Action<int(int (*)(int, int, int, int, int, int))> a = // NOLINT 746 InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6); 747 EXPECT_EQ(123456, a.Perform(std::make_tuple(&SumOf6))); 748 } 749 750 // Tests using InvokeArgument with a 6-ary functor. 751 TEST(InvokeArgumentTest, Functor6) { 752 Action<int(SumOf6Functor)> a = // NOLINT 753 InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6); 754 EXPECT_EQ(123456, a.Perform(std::make_tuple(SumOf6Functor()))); 755 } 756 757 // Tests using InvokeArgument with a 7-ary function. 758 TEST(InvokeArgumentTest, Function7) { 759 Action<std::string(std::string(*)(const char*, const char*, const char*, 760 const char*, const char*, const char*, 761 const char*))> 762 a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7"); 763 EXPECT_EQ("1234567", a.Perform(std::make_tuple(&Concat7))); 764 } 765 766 // Tests using InvokeArgument with a 8-ary function. 767 TEST(InvokeArgumentTest, Function8) { 768 Action<std::string(std::string(*)(const char*, const char*, const char*, 769 const char*, const char*, const char*, 770 const char*, const char*))> 771 a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8"); 772 EXPECT_EQ("12345678", a.Perform(std::make_tuple(&Concat8))); 773 } 774 775 // Tests using InvokeArgument with a 9-ary function. 776 TEST(InvokeArgumentTest, Function9) { 777 Action<std::string(std::string(*)(const char*, const char*, const char*, 778 const char*, const char*, const char*, 779 const char*, const char*, const char*))> 780 a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9"); 781 EXPECT_EQ("123456789", a.Perform(std::make_tuple(&Concat9))); 782 } 783 784 // Tests using InvokeArgument with a 10-ary function. 785 TEST(InvokeArgumentTest, Function10) { 786 Action<std::string(std::string(*)( 787 const char*, const char*, const char*, const char*, const char*, 788 const char*, const char*, const char*, const char*, const char*))> 789 a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"); 790 EXPECT_EQ("1234567890", a.Perform(std::make_tuple(&Concat10))); 791 } 792 793 // Tests using InvokeArgument with a function that takes a pointer argument. 794 TEST(InvokeArgumentTest, ByPointerFunction) { 795 Action<const char*(const char* (*)(const char* input, short n))> // NOLINT 796 a = InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1)); 797 EXPECT_STREQ("i", a.Perform(std::make_tuple(&Binary))); 798 } 799 800 // Tests using InvokeArgument with a function that takes a const char* 801 // by passing it a C-string literal. 802 TEST(InvokeArgumentTest, FunctionWithCStringLiteral) { 803 Action<const char*(const char* (*)(const char* input, short n))> // NOLINT 804 a = InvokeArgument<0>("Hi", Short(1)); 805 EXPECT_STREQ("i", a.Perform(std::make_tuple(&Binary))); 806 } 807 808 // Tests using InvokeArgument with a function that takes a const reference. 809 TEST(InvokeArgumentTest, ByConstReferenceFunction) { 810 Action<bool(bool (*function)(const std::string& s))> a = // NOLINT 811 InvokeArgument<0>(std::string("Hi")); 812 // When action 'a' is constructed, it makes a copy of the temporary 813 // string object passed to it, so it's OK to use 'a' later, when the 814 // temporary object has already died. 815 EXPECT_TRUE(a.Perform(std::make_tuple(&ByConstRef))); 816 } 817 818 // Tests using InvokeArgument with ByRef() and a function that takes a 819 // const reference. 820 TEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) { 821 Action<bool(bool (*)(const double& x))> a = // NOLINT 822 InvokeArgument<0>(ByRef(g_double)); 823 // The above line calls ByRef() on a const value. 824 EXPECT_TRUE(a.Perform(std::make_tuple(&ReferencesGlobalDouble))); 825 826 double x = 0; 827 a = InvokeArgument<0>(ByRef(x)); // This calls ByRef() on a non-const. 828 EXPECT_FALSE(a.Perform(std::make_tuple(&ReferencesGlobalDouble))); 829 } 830 831 TEST(InvokeArgumentTest, MoveOnlyType) { 832 struct Marker {}; 833 struct { 834 // Method takes a unique_ptr (to a type we don't care about), and an 835 // invocable type. 836 MOCK_METHOD(bool, MockMethod, 837 (std::unique_ptr<Marker>, std::function<int()>), ()); 838 } mock; 839 840 ON_CALL(mock, MockMethod(_, _)).WillByDefault(InvokeArgument<1>()); 841 842 // This compiles, but is a little opaque as a workaround: 843 ON_CALL(mock, MockMethod(_, _)) 844 .WillByDefault(WithArg<1>(InvokeArgument<0>())); 845 } 846 847 // Tests DoAll(a1, a2). 848 TEST(DoAllTest, TwoActions) { 849 int n = 0; 850 Action<int(int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT 851 Return(2)); 852 EXPECT_EQ(2, a.Perform(std::make_tuple(&n))); 853 EXPECT_EQ(1, n); 854 } 855 856 // Tests DoAll(a1, a2, a3). 857 TEST(DoAllTest, ThreeActions) { 858 int m = 0, n = 0; 859 Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT 860 SetArgPointee<1>(2), Return(3)); 861 EXPECT_EQ(3, a.Perform(std::make_tuple(&m, &n))); 862 EXPECT_EQ(1, m); 863 EXPECT_EQ(2, n); 864 } 865 866 // Tests DoAll(a1, a2, a3, a4). 867 TEST(DoAllTest, FourActions) { 868 int m = 0, n = 0; 869 char ch = '\0'; 870 Action<int(int*, int*, char*)> a = // NOLINT 871 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 872 Return(3)); 873 EXPECT_EQ(3, a.Perform(std::make_tuple(&m, &n, &ch))); 874 EXPECT_EQ(1, m); 875 EXPECT_EQ(2, n); 876 EXPECT_EQ('a', ch); 877 } 878 879 // Tests DoAll(a1, a2, a3, a4, a5). 880 TEST(DoAllTest, FiveActions) { 881 int m = 0, n = 0; 882 char a = '\0', b = '\0'; 883 Action<int(int*, int*, char*, char*)> action = // NOLINT 884 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 885 SetArgPointee<3>('b'), Return(3)); 886 EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b))); 887 EXPECT_EQ(1, m); 888 EXPECT_EQ(2, n); 889 EXPECT_EQ('a', a); 890 EXPECT_EQ('b', b); 891 } 892 893 // Tests DoAll(a1, a2, ..., a6). 894 TEST(DoAllTest, SixActions) { 895 int m = 0, n = 0; 896 char a = '\0', b = '\0', c = '\0'; 897 Action<int(int*, int*, char*, char*, char*)> action = // NOLINT 898 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 899 SetArgPointee<3>('b'), SetArgPointee<4>('c'), Return(3)); 900 EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c))); 901 EXPECT_EQ(1, m); 902 EXPECT_EQ(2, n); 903 EXPECT_EQ('a', a); 904 EXPECT_EQ('b', b); 905 EXPECT_EQ('c', c); 906 } 907 908 // Tests DoAll(a1, a2, ..., a7). 909 TEST(DoAllTest, SevenActions) { 910 int m = 0, n = 0; 911 char a = '\0', b = '\0', c = '\0', d = '\0'; 912 Action<int(int*, int*, char*, char*, char*, char*)> action = // NOLINT 913 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 914 SetArgPointee<3>('b'), SetArgPointee<4>('c'), SetArgPointee<5>('d'), 915 Return(3)); 916 EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d))); 917 EXPECT_EQ(1, m); 918 EXPECT_EQ(2, n); 919 EXPECT_EQ('a', a); 920 EXPECT_EQ('b', b); 921 EXPECT_EQ('c', c); 922 EXPECT_EQ('d', d); 923 } 924 925 // Tests DoAll(a1, a2, ..., a8). 926 TEST(DoAllTest, EightActions) { 927 int m = 0, n = 0; 928 char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0'; 929 Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 930 char*)> 931 action = 932 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 933 SetArgPointee<3>('b'), SetArgPointee<4>('c'), 934 SetArgPointee<5>('d'), SetArgPointee<6>('e'), Return(3)); 935 EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e))); 936 EXPECT_EQ(1, m); 937 EXPECT_EQ(2, n); 938 EXPECT_EQ('a', a); 939 EXPECT_EQ('b', b); 940 EXPECT_EQ('c', c); 941 EXPECT_EQ('d', d); 942 EXPECT_EQ('e', e); 943 } 944 945 // Tests DoAll(a1, a2, ..., a9). 946 TEST(DoAllTest, NineActions) { 947 int m = 0, n = 0; 948 char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0', f = '\0'; 949 Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 950 char*, char*)> 951 action = DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), 952 SetArgPointee<2>('a'), SetArgPointee<3>('b'), 953 SetArgPointee<4>('c'), SetArgPointee<5>('d'), 954 SetArgPointee<6>('e'), SetArgPointee<7>('f'), Return(3)); 955 EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e, &f))); 956 EXPECT_EQ(1, m); 957 EXPECT_EQ(2, n); 958 EXPECT_EQ('a', a); 959 EXPECT_EQ('b', b); 960 EXPECT_EQ('c', c); 961 EXPECT_EQ('d', d); 962 EXPECT_EQ('e', e); 963 EXPECT_EQ('f', f); 964 } 965 966 // Tests DoAll(a1, a2, ..., a10). 967 TEST(DoAllTest, TenActions) { 968 int m = 0, n = 0; 969 char a = '\0', b = '\0', c = '\0', d = '\0'; 970 char e = '\0', f = '\0', g = '\0'; 971 Action<int(int*, int*, char*, char*, char*, char*, // NOLINT 972 char*, char*, char*)> 973 action = 974 DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'), 975 SetArgPointee<3>('b'), SetArgPointee<4>('c'), 976 SetArgPointee<5>('d'), SetArgPointee<6>('e'), 977 SetArgPointee<7>('f'), SetArgPointee<8>('g'), Return(3)); 978 EXPECT_EQ( 979 3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g))); 980 EXPECT_EQ(1, m); 981 EXPECT_EQ(2, n); 982 EXPECT_EQ('a', a); 983 EXPECT_EQ('b', b); 984 EXPECT_EQ('c', c); 985 EXPECT_EQ('d', d); 986 EXPECT_EQ('e', e); 987 EXPECT_EQ('f', f); 988 EXPECT_EQ('g', g); 989 } 990 991 TEST(DoAllTest, NoArgs) { 992 bool ran_first = false; 993 Action<bool()> a = 994 DoAll([&] { ran_first = true; }, [&] { return ran_first; }); 995 EXPECT_TRUE(a.Perform({})); 996 } 997 998 TEST(DoAllTest, MoveOnlyArgs) { 999 bool ran_first = false; 1000 Action<int(std::unique_ptr<int>)> a = 1001 DoAll(InvokeWithoutArgs([&] { ran_first = true; }), 1002 [](std::unique_ptr<int> p) { return *p; }); 1003 EXPECT_EQ(7, a.Perform(std::make_tuple(std::unique_ptr<int>(new int(7))))); 1004 EXPECT_TRUE(ran_first); 1005 } 1006 1007 TEST(DoAllTest, ImplicitlyConvertsActionArguments) { 1008 bool ran_first = false; 1009 // Action<void(std::vector<int>)> isn't an 1010 // Action<void(const std::vector<int>&) but can be converted. 1011 Action<void(std::vector<int>)> first = [&] { ran_first = true; }; 1012 Action<int(std::vector<int>)> a = 1013 DoAll(first, [](std::vector<int> arg) { return arg.front(); }); 1014 EXPECT_EQ(7, a.Perform(std::make_tuple(std::vector<int>{7}))); 1015 EXPECT_TRUE(ran_first); 1016 } 1017 1018 // The ACTION*() macros trigger warning C4100 (unreferenced formal 1019 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 1020 // the macro definition, as the warnings are generated when the macro 1021 // is expanded and macro expansion cannot contain #pragma. Therefore 1022 // we suppress them here. 1023 // Also suppress C4503 decorated name length exceeded, name was truncated 1024 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4503) 1025 // Tests the ACTION*() macro family. 1026 1027 // Tests that ACTION() can define an action that doesn't reference the 1028 // mock function arguments. 1029 ACTION(Return5) { return 5; } 1030 1031 TEST(ActionMacroTest, WorksWhenNotReferencingArguments) { 1032 Action<double()> a1 = Return5(); 1033 EXPECT_DOUBLE_EQ(5, a1.Perform(std::make_tuple())); 1034 1035 Action<int(double, bool)> a2 = Return5(); 1036 EXPECT_EQ(5, a2.Perform(std::make_tuple(1, true))); 1037 } 1038 1039 // Tests that ACTION() can define an action that returns void. 1040 ACTION(IncrementArg1) { (*arg1)++; } 1041 1042 TEST(ActionMacroTest, WorksWhenReturningVoid) { 1043 Action<void(int, int*)> a1 = IncrementArg1(); 1044 int n = 0; 1045 a1.Perform(std::make_tuple(5, &n)); 1046 EXPECT_EQ(1, n); 1047 } 1048 1049 // Tests that the body of ACTION() can reference the type of the 1050 // argument. 1051 ACTION(IncrementArg2) { 1052 StaticAssertTypeEq<int*, arg2_type>(); 1053 arg2_type temp = arg2; 1054 (*temp)++; 1055 } 1056 1057 TEST(ActionMacroTest, CanReferenceArgumentType) { 1058 Action<void(int, bool, int*)> a1 = IncrementArg2(); 1059 int n = 0; 1060 a1.Perform(std::make_tuple(5, false, &n)); 1061 EXPECT_EQ(1, n); 1062 } 1063 1064 // Tests that the body of ACTION() can reference the argument tuple 1065 // via args_type and args. 1066 ACTION(Sum2) { 1067 StaticAssertTypeEq<std::tuple<int, char, int*>, args_type>(); 1068 args_type args_copy = args; 1069 return std::get<0>(args_copy) + std::get<1>(args_copy); 1070 } 1071 1072 TEST(ActionMacroTest, CanReferenceArgumentTuple) { 1073 Action<int(int, char, int*)> a1 = Sum2(); 1074 int dummy = 0; 1075 EXPECT_EQ(11, a1.Perform(std::make_tuple(5, Char(6), &dummy))); 1076 } 1077 1078 namespace { 1079 1080 // Tests that the body of ACTION() can reference the mock function 1081 // type. 1082 int Dummy(bool flag) { return flag ? 1 : 0; } 1083 1084 } // namespace 1085 1086 ACTION(InvokeDummy) { 1087 StaticAssertTypeEq<int(bool), function_type>(); 1088 function_type* fp = &Dummy; 1089 return (*fp)(true); 1090 } 1091 1092 TEST(ActionMacroTest, CanReferenceMockFunctionType) { 1093 Action<int(bool)> a1 = InvokeDummy(); 1094 EXPECT_EQ(1, a1.Perform(std::make_tuple(true))); 1095 EXPECT_EQ(1, a1.Perform(std::make_tuple(false))); 1096 } 1097 1098 // Tests that the body of ACTION() can reference the mock function's 1099 // return type. 1100 ACTION(InvokeDummy2) { 1101 StaticAssertTypeEq<int, return_type>(); 1102 return_type result = Dummy(true); 1103 return result; 1104 } 1105 1106 TEST(ActionMacroTest, CanReferenceMockFunctionReturnType) { 1107 Action<int(bool)> a1 = InvokeDummy2(); 1108 EXPECT_EQ(1, a1.Perform(std::make_tuple(true))); 1109 EXPECT_EQ(1, a1.Perform(std::make_tuple(false))); 1110 } 1111 1112 // Tests that ACTION() works for arguments passed by const reference. 1113 ACTION(ReturnAddrOfConstBoolReferenceArg) { 1114 StaticAssertTypeEq<const bool&, arg1_type>(); 1115 return &arg1; 1116 } 1117 1118 TEST(ActionMacroTest, WorksForConstReferenceArg) { 1119 Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg(); 1120 const bool b = false; 1121 EXPECT_EQ(&b, a.Perform(std::tuple<int, const bool&>(0, b))); 1122 } 1123 1124 // Tests that ACTION() works for arguments passed by non-const reference. 1125 ACTION(ReturnAddrOfIntReferenceArg) { 1126 StaticAssertTypeEq<int&, arg0_type>(); 1127 return &arg0; 1128 } 1129 1130 TEST(ActionMacroTest, WorksForNonConstReferenceArg) { 1131 Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg(); 1132 int n = 0; 1133 EXPECT_EQ(&n, a.Perform(std::tuple<int&, bool, int>(n, true, 1))); 1134 } 1135 1136 // Tests that ACTION() can be used in a namespace. 1137 namespace action_test { 1138 ACTION(Sum) { return arg0 + arg1; } 1139 } // namespace action_test 1140 1141 TEST(ActionMacroTest, WorksInNamespace) { 1142 Action<int(int, int)> a1 = action_test::Sum(); 1143 EXPECT_EQ(3, a1.Perform(std::make_tuple(1, 2))); 1144 } 1145 1146 // Tests that the same ACTION definition works for mock functions with 1147 // different argument numbers. 1148 ACTION(PlusTwo) { return arg0 + 2; } 1149 1150 TEST(ActionMacroTest, WorksForDifferentArgumentNumbers) { 1151 Action<int(int)> a1 = PlusTwo(); 1152 EXPECT_EQ(4, a1.Perform(std::make_tuple(2))); 1153 1154 Action<double(float, void*)> a2 = PlusTwo(); 1155 int dummy; 1156 EXPECT_DOUBLE_EQ(6, a2.Perform(std::make_tuple(4.0f, &dummy))); 1157 } 1158 1159 // Tests that ACTION_P can define a parameterized action. 1160 ACTION_P(Plus, n) { return arg0 + n; } 1161 1162 TEST(ActionPMacroTest, DefinesParameterizedAction) { 1163 Action<int(int m, bool t)> a1 = Plus(9); 1164 EXPECT_EQ(10, a1.Perform(std::make_tuple(1, true))); 1165 } 1166 1167 // Tests that the body of ACTION_P can reference the argument types 1168 // and the parameter type. 1169 ACTION_P(TypedPlus, n) { 1170 arg0_type t1 = arg0; 1171 n_type t2 = n; 1172 return t1 + t2; 1173 } 1174 1175 TEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) { 1176 Action<int(char m, bool t)> a1 = TypedPlus(9); 1177 EXPECT_EQ(10, a1.Perform(std::make_tuple(Char(1), true))); 1178 } 1179 1180 // Tests that a parameterized action can be used in any mock function 1181 // whose type is compatible. 1182 TEST(ActionPMacroTest, WorksInCompatibleMockFunction) { 1183 Action<std::string(const std::string& s)> a1 = Plus("tail"); 1184 const std::string re = "re"; 1185 std::tuple<const std::string> dummy = std::make_tuple(re); 1186 EXPECT_EQ("retail", a1.Perform(dummy)); 1187 } 1188 1189 // Tests that we can use ACTION*() to define actions overloaded on the 1190 // number of parameters. 1191 1192 ACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; } 1193 1194 ACTION_P(OverloadedAction, default_value) { 1195 return arg0 ? arg1 : default_value; 1196 } 1197 1198 ACTION_P2(OverloadedAction, true_value, false_value) { 1199 return arg0 ? true_value : false_value; 1200 } 1201 1202 TEST(ActionMacroTest, CanDefineOverloadedActions) { 1203 using MyAction = Action<const char*(bool, const char*)>; 1204 1205 const MyAction a1 = OverloadedAction(); 1206 EXPECT_STREQ("hello", a1.Perform(std::make_tuple(false, CharPtr("world")))); 1207 EXPECT_STREQ("world", a1.Perform(std::make_tuple(true, CharPtr("world")))); 1208 1209 const MyAction a2 = OverloadedAction("hi"); 1210 EXPECT_STREQ("hi", a2.Perform(std::make_tuple(false, CharPtr("world")))); 1211 EXPECT_STREQ("world", a2.Perform(std::make_tuple(true, CharPtr("world")))); 1212 1213 const MyAction a3 = OverloadedAction("hi", "you"); 1214 EXPECT_STREQ("hi", a3.Perform(std::make_tuple(true, CharPtr("world")))); 1215 EXPECT_STREQ("you", a3.Perform(std::make_tuple(false, CharPtr("world")))); 1216 } 1217 1218 // Tests ACTION_Pn where n >= 3. 1219 1220 ACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; } 1221 1222 TEST(ActionPnMacroTest, WorksFor3Parameters) { 1223 Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4); 1224 EXPECT_DOUBLE_EQ(3123.4, a1.Perform(std::make_tuple(3000, true))); 1225 1226 Action<std::string(const std::string& s)> a2 = Plus("tail", "-", ">"); 1227 const std::string re = "re"; 1228 std::tuple<const std::string> dummy = std::make_tuple(re); 1229 EXPECT_EQ("retail->", a2.Perform(dummy)); 1230 } 1231 1232 ACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; } 1233 1234 TEST(ActionPnMacroTest, WorksFor4Parameters) { 1235 Action<int(int)> a1 = Plus(1, 2, 3, 4); 1236 EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(std::make_tuple(10))); 1237 } 1238 1239 ACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; } 1240 1241 TEST(ActionPnMacroTest, WorksFor5Parameters) { 1242 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5); 1243 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(std::make_tuple(10))); 1244 } 1245 1246 ACTION_P6(Plus, p0, p1, p2, p3, p4, p5) { 1247 return arg0 + p0 + p1 + p2 + p3 + p4 + p5; 1248 } 1249 1250 TEST(ActionPnMacroTest, WorksFor6Parameters) { 1251 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6); 1252 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(std::make_tuple(10))); 1253 } 1254 1255 ACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) { 1256 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6; 1257 } 1258 1259 TEST(ActionPnMacroTest, WorksFor7Parameters) { 1260 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7); 1261 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(std::make_tuple(10))); 1262 } 1263 1264 ACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) { 1265 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7; 1266 } 1267 1268 TEST(ActionPnMacroTest, WorksFor8Parameters) { 1269 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8); 1270 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8, 1271 a1.Perform(std::make_tuple(10))); 1272 } 1273 1274 ACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) { 1275 return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8; 1276 } 1277 1278 TEST(ActionPnMacroTest, WorksFor9Parameters) { 1279 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9); 1280 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, 1281 a1.Perform(std::make_tuple(10))); 1282 } 1283 1284 ACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) { 1285 arg0_type t0 = arg0; 1286 last_param_type t9 = last_param; 1287 return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9; 1288 } 1289 1290 TEST(ActionPnMacroTest, WorksFor10Parameters) { 1291 Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 1292 EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10, 1293 a1.Perform(std::make_tuple(10))); 1294 } 1295 1296 // Tests that the action body can promote the parameter types. 1297 1298 ACTION_P2(PadArgument, prefix, suffix) { 1299 // The following lines promote the two parameters to desired types. 1300 std::string prefix_str(prefix); 1301 char suffix_char = static_cast<char>(suffix); 1302 return prefix_str + arg0 + suffix_char; 1303 } 1304 1305 TEST(ActionPnMacroTest, SimpleTypePromotion) { 1306 Action<std::string(const char*)> no_promo = 1307 PadArgument(std::string("foo"), 'r'); 1308 Action<std::string(const char*)> promo = 1309 PadArgument("foo", static_cast<int>('r')); 1310 EXPECT_EQ("foobar", no_promo.Perform(std::make_tuple(CharPtr("ba")))); 1311 EXPECT_EQ("foobar", promo.Perform(std::make_tuple(CharPtr("ba")))); 1312 } 1313 1314 // Tests that we can partially restrict parameter types using a 1315 // straight-forward pattern. 1316 1317 // Defines a generic action that doesn't restrict the types of its 1318 // parameters. 1319 ACTION_P3(ConcatImpl, a, b, c) { 1320 std::stringstream ss; 1321 ss << a << b << c; 1322 return ss.str(); 1323 } 1324 1325 // Next, we try to restrict that either the first parameter is a 1326 // string, or the second parameter is an int. 1327 1328 // Defines a partially specialized wrapper that restricts the first 1329 // parameter to std::string. 1330 template <typename T1, typename T2> 1331 // ConcatImplActionP3 is the class template ACTION_P3 uses to 1332 // implement ConcatImpl. We shouldn't change the name as this 1333 // pattern requires the user to use it directly. 1334 ConcatImplActionP3<std::string, T1, T2> Concat(const std::string& a, T1 b, 1335 T2 c) { 1336 GTEST_INTENTIONAL_CONST_COND_PUSH_() 1337 if (true) { 1338 GTEST_INTENTIONAL_CONST_COND_POP_() 1339 // This branch verifies that ConcatImpl() can be invoked without 1340 // explicit template arguments. 1341 return ConcatImpl(a, b, c); 1342 } else { 1343 // This branch verifies that ConcatImpl() can also be invoked with 1344 // explicit template arguments. It doesn't really need to be 1345 // executed as this is a compile-time verification. 1346 return ConcatImpl<std::string, T1, T2>(a, b, c); 1347 } 1348 } 1349 1350 // Defines another partially specialized wrapper that restricts the 1351 // second parameter to int. 1352 template <typename T1, typename T2> 1353 ConcatImplActionP3<T1, int, T2> Concat(T1 a, int b, T2 c) { 1354 return ConcatImpl(a, b, c); 1355 } 1356 1357 TEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) { 1358 Action<const std::string()> a1 = Concat("Hello", "1", 2); 1359 EXPECT_EQ("Hello12", a1.Perform(std::make_tuple())); 1360 1361 a1 = Concat(1, 2, 3); 1362 EXPECT_EQ("123", a1.Perform(std::make_tuple())); 1363 } 1364 1365 // Verifies the type of an ACTION*. 1366 1367 ACTION(DoFoo) {} 1368 ACTION_P(DoFoo, p) {} 1369 ACTION_P2(DoFoo, p0, p1) {} 1370 1371 TEST(ActionPnMacroTest, TypesAreCorrect) { 1372 // DoFoo() must be assignable to a DoFooAction variable. 1373 DoFooAction a0 = DoFoo(); 1374 1375 // DoFoo(1) must be assignable to a DoFooActionP variable. 1376 DoFooActionP<int> a1 = DoFoo(1); 1377 1378 // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk 1379 // variable, and so on. 1380 DoFooActionP2<int, char> a2 = DoFoo(1, '2'); 1381 PlusActionP3<int, int, char> a3 = Plus(1, 2, '3'); 1382 PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4'); 1383 PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5'); 1384 PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6'); 1385 PlusActionP7<int, int, int, int, int, int, char> a7 = 1386 Plus(1, 2, 3, 4, 5, 6, '7'); 1387 PlusActionP8<int, int, int, int, int, int, int, char> a8 = 1388 Plus(1, 2, 3, 4, 5, 6, 7, '8'); 1389 PlusActionP9<int, int, int, int, int, int, int, int, char> a9 = 1390 Plus(1, 2, 3, 4, 5, 6, 7, 8, '9'); 1391 PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 = 1392 Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0'); 1393 1394 // Avoid "unused variable" warnings. 1395 (void)a0; 1396 (void)a1; 1397 (void)a2; 1398 (void)a3; 1399 (void)a4; 1400 (void)a5; 1401 (void)a6; 1402 (void)a7; 1403 (void)a8; 1404 (void)a9; 1405 (void)a10; 1406 } 1407 1408 // Tests that an ACTION_P*() action can be explicitly instantiated 1409 // with reference-typed parameters. 1410 1411 ACTION_P(Plus1, x) { return x; } 1412 ACTION_P2(Plus2, x, y) { return x + y; } 1413 ACTION_P3(Plus3, x, y, z) { return x + y + z; } 1414 ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { 1415 return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9; 1416 } 1417 1418 TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) { 1419 int x = 1, y = 2, z = 3; 1420 const std::tuple<> empty = std::make_tuple(); 1421 1422 Action<int()> a = Plus1<int&>(x); 1423 EXPECT_EQ(1, a.Perform(empty)); 1424 1425 a = Plus2<const int&, int&>(x, y); 1426 EXPECT_EQ(3, a.Perform(empty)); 1427 1428 a = Plus3<int&, const int&, int&>(x, y, z); 1429 EXPECT_EQ(6, a.Perform(empty)); 1430 1431 int n[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 1432 a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&, 1433 int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], 1434 n[7], n[8], n[9]); 1435 EXPECT_EQ(55, a.Perform(empty)); 1436 } 1437 1438 class TenArgConstructorClass { 1439 public: 1440 TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7, 1441 int a8, int a9, int a10) 1442 : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {} 1443 int value_; 1444 }; 1445 1446 // Tests that ACTION_TEMPLATE works when there is no value parameter. 1447 ACTION_TEMPLATE(CreateNew, HAS_1_TEMPLATE_PARAMS(typename, T), 1448 AND_0_VALUE_PARAMS()) { 1449 return new T; 1450 } 1451 1452 TEST(ActionTemplateTest, WorksWithoutValueParam) { 1453 const Action<int*()> a = CreateNew<int>(); 1454 int* p = a.Perform(std::make_tuple()); 1455 delete p; 1456 } 1457 1458 // Tests that ACTION_TEMPLATE works when there are value parameters. 1459 ACTION_TEMPLATE(CreateNew, HAS_1_TEMPLATE_PARAMS(typename, T), 1460 AND_1_VALUE_PARAMS(a0)) { 1461 return new T(a0); 1462 } 1463 1464 TEST(ActionTemplateTest, WorksWithValueParams) { 1465 const Action<int*()> a = CreateNew<int>(42); 1466 int* p = a.Perform(std::make_tuple()); 1467 EXPECT_EQ(42, *p); 1468 delete p; 1469 } 1470 1471 // Tests that ACTION_TEMPLATE works for integral template parameters. 1472 ACTION_TEMPLATE(MyDeleteArg, HAS_1_TEMPLATE_PARAMS(int, k), 1473 AND_0_VALUE_PARAMS()) { 1474 delete std::get<k>(args); 1475 } 1476 1477 // Resets a bool variable in the destructor. 1478 class BoolResetter { 1479 public: 1480 explicit BoolResetter(bool* value) : value_(value) {} 1481 ~BoolResetter() { *value_ = false; } 1482 1483 private: 1484 bool* value_; 1485 }; 1486 1487 TEST(ActionTemplateTest, WorksForIntegralTemplateParams) { 1488 const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>(); 1489 int n = 0; 1490 bool b = true; 1491 auto* resetter = new BoolResetter(&b); 1492 a.Perform(std::make_tuple(&n, resetter)); 1493 EXPECT_FALSE(b); // Verifies that resetter is deleted. 1494 } 1495 1496 // Tests that ACTION_TEMPLATES works for template template parameters. 1497 ACTION_TEMPLATE(ReturnSmartPointer, 1498 HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class, 1499 Pointer), 1500 AND_1_VALUE_PARAMS(pointee)) { 1501 return Pointer<pointee_type>(new pointee_type(pointee)); 1502 } 1503 1504 TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) { 1505 const Action<std::shared_ptr<int>()> a = 1506 ReturnSmartPointer<std::shared_ptr>(42); 1507 std::shared_ptr<int> p = a.Perform(std::make_tuple()); 1508 EXPECT_EQ(42, *p); 1509 } 1510 1511 // Tests that ACTION_TEMPLATE works for 10 template parameters. 1512 template <typename T1, typename T2, typename T3, int k4, bool k5, 1513 unsigned int k6, typename T7, typename T8, typename T9> 1514 struct GiantTemplate { 1515 public: 1516 explicit GiantTemplate(int a_value) : value(a_value) {} 1517 int value; 1518 }; 1519 1520 ACTION_TEMPLATE(ReturnGiant, 1521 HAS_10_TEMPLATE_PARAMS(typename, T1, typename, T2, typename, T3, 1522 int, k4, bool, k5, unsigned int, k6, 1523 class, T7, class, T8, class, T9, 1524 template <typename T> class, T10), 1525 AND_1_VALUE_PARAMS(value)) { 1526 return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value); 1527 } 1528 1529 TEST(ActionTemplateTest, WorksFor10TemplateParameters) { 1530 using Giant = GiantTemplate<std::shared_ptr<int>, bool, double, 5, true, 6, 1531 char, unsigned, int>; 1532 const Action<Giant()> a = ReturnGiant<int, bool, double, 5, true, 6, char, 1533 unsigned, int, std::shared_ptr>(42); 1534 Giant giant = a.Perform(std::make_tuple()); 1535 EXPECT_EQ(42, giant.value); 1536 } 1537 1538 // Tests that ACTION_TEMPLATE works for 10 value parameters. 1539 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number), 1540 AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) { 1541 return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10; 1542 } 1543 1544 TEST(ActionTemplateTest, WorksFor10ValueParameters) { 1545 const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 1546 EXPECT_EQ(55, a.Perform(std::make_tuple())); 1547 } 1548 1549 // Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded 1550 // on the number of value parameters. 1551 1552 ACTION(ReturnSum) { return 0; } 1553 1554 ACTION_P(ReturnSum, x) { return x; } 1555 1556 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number), 1557 AND_2_VALUE_PARAMS(v1, v2)) { 1558 return static_cast<Number>(v1) + v2; 1559 } 1560 1561 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number), 1562 AND_3_VALUE_PARAMS(v1, v2, v3)) { 1563 return static_cast<Number>(v1) + v2 + v3; 1564 } 1565 1566 ACTION_TEMPLATE(ReturnSum, HAS_2_TEMPLATE_PARAMS(typename, Number, int, k), 1567 AND_4_VALUE_PARAMS(v1, v2, v3, v4)) { 1568 return static_cast<Number>(v1) + v2 + v3 + v4 + k; 1569 } 1570 1571 TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) { 1572 const Action<int()> a0 = ReturnSum(); 1573 const Action<int()> a1 = ReturnSum(1); 1574 const Action<int()> a2 = ReturnSum<int>(1, 2); 1575 const Action<int()> a3 = ReturnSum<int>(1, 2, 3); 1576 const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5); 1577 EXPECT_EQ(0, a0.Perform(std::make_tuple())); 1578 EXPECT_EQ(1, a1.Perform(std::make_tuple())); 1579 EXPECT_EQ(3, a2.Perform(std::make_tuple())); 1580 EXPECT_EQ(6, a3.Perform(std::make_tuple())); 1581 EXPECT_EQ(12345, a4.Perform(std::make_tuple())); 1582 } 1583 1584 } // namespace gmock_more_actions_test 1585 } // namespace testing 1586 1587 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 4503 1588 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4577 1589