googletest-param-test-test.cc (40998B)
1 // Copyright 2008, 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 // 31 // Tests for Google Test itself. This file verifies that the parameter 32 // generators objects produce correct parameter sequences and that 33 // Google Test runtime instantiates correct tests from those sequences. 34 35 #include "gtest/gtest.h" 36 37 # include <algorithm> 38 # include <iostream> 39 # include <list> 40 # include <set> 41 # include <sstream> 42 # include <string> 43 # include <vector> 44 45 # include "src/gtest-internal-inl.h" // for UnitTestOptions 46 # include "test/googletest-param-test-test.h" 47 48 using ::std::vector; 49 using ::std::sort; 50 51 using ::testing::AddGlobalTestEnvironment; 52 using ::testing::Bool; 53 using ::testing::Combine; 54 using ::testing::Message; 55 using ::testing::Range; 56 using ::testing::TestWithParam; 57 using ::testing::Values; 58 using ::testing::ValuesIn; 59 60 using ::testing::internal::ParamGenerator; 61 using ::testing::internal::UnitTestOptions; 62 63 // Prints a value to a string. 64 // 65 // FIXME: remove PrintValue() when we move matchers and 66 // EXPECT_THAT() from Google Mock to Google Test. At that time, we 67 // can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as 68 // EXPECT_THAT() and the matchers know how to print tuples. 69 template <typename T> 70 ::std::string PrintValue(const T& value) { 71 return testing::PrintToString(value); 72 } 73 74 // Verifies that a sequence generated by the generator and accessed 75 // via the iterator object matches the expected one using Google Test 76 // assertions. 77 template <typename T, size_t N> 78 void VerifyGenerator(const ParamGenerator<T>& generator, 79 const T (&expected_values)[N]) { 80 typename ParamGenerator<T>::iterator it = generator.begin(); 81 for (size_t i = 0; i < N; ++i) { 82 ASSERT_FALSE(it == generator.end()) 83 << "At element " << i << " when accessing via an iterator " 84 << "created with the copy constructor.\n"; 85 // We cannot use EXPECT_EQ() here as the values may be tuples, 86 // which don't support <<. 87 EXPECT_TRUE(expected_values[i] == *it) 88 << "where i is " << i 89 << ", expected_values[i] is " << PrintValue(expected_values[i]) 90 << ", *it is " << PrintValue(*it) 91 << ", and 'it' is an iterator created with the copy constructor.\n"; 92 ++it; 93 } 94 EXPECT_TRUE(it == generator.end()) 95 << "At the presumed end of sequence when accessing via an iterator " 96 << "created with the copy constructor.\n"; 97 98 // Test the iterator assignment. The following lines verify that 99 // the sequence accessed via an iterator initialized via the 100 // assignment operator (as opposed to a copy constructor) matches 101 // just the same. 102 it = generator.begin(); 103 for (size_t i = 0; i < N; ++i) { 104 ASSERT_FALSE(it == generator.end()) 105 << "At element " << i << " when accessing via an iterator " 106 << "created with the assignment operator.\n"; 107 EXPECT_TRUE(expected_values[i] == *it) 108 << "where i is " << i 109 << ", expected_values[i] is " << PrintValue(expected_values[i]) 110 << ", *it is " << PrintValue(*it) 111 << ", and 'it' is an iterator created with the copy constructor.\n"; 112 ++it; 113 } 114 EXPECT_TRUE(it == generator.end()) 115 << "At the presumed end of sequence when accessing via an iterator " 116 << "created with the assignment operator.\n"; 117 } 118 119 template <typename T> 120 void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) { 121 typename ParamGenerator<T>::iterator it = generator.begin(); 122 EXPECT_TRUE(it == generator.end()); 123 124 it = generator.begin(); 125 EXPECT_TRUE(it == generator.end()); 126 } 127 128 // Generator tests. They test that each of the provided generator functions 129 // generates an expected sequence of values. The general test pattern 130 // instantiates a generator using one of the generator functions, 131 // checks the sequence produced by the generator using its iterator API, 132 // and then resets the iterator back to the beginning of the sequence 133 // and checks the sequence again. 134 135 // Tests that iterators produced by generator functions conform to the 136 // ForwardIterator concept. 137 TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) { 138 const ParamGenerator<int> gen = Range(0, 10); 139 ParamGenerator<int>::iterator it = gen.begin(); 140 141 // Verifies that iterator initialization works as expected. 142 ParamGenerator<int>::iterator it2 = it; 143 EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the " 144 << "element same as its source points to"; 145 146 // Verifies that iterator assignment works as expected. 147 ++it; 148 EXPECT_FALSE(*it == *it2); 149 it2 = it; 150 EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the " 151 << "element same as its source points to"; 152 153 // Verifies that prefix operator++() returns *this. 154 EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be " 155 << "refer to the original object"; 156 157 // Verifies that the result of the postfix operator++ points to the value 158 // pointed to by the original iterator. 159 int original_value = *it; // Have to compute it outside of macro call to be 160 // unaffected by the parameter evaluation order. 161 EXPECT_EQ(original_value, *(it++)); 162 163 // Verifies that prefix and postfix operator++() advance an iterator 164 // all the same. 165 it2 = it; 166 ++it; 167 ++it2; 168 EXPECT_TRUE(*it == *it2); 169 } 170 171 // Tests that Range() generates the expected sequence. 172 TEST(RangeTest, IntRangeWithDefaultStep) { 173 const ParamGenerator<int> gen = Range(0, 3); 174 const int expected_values[] = {0, 1, 2}; 175 VerifyGenerator(gen, expected_values); 176 } 177 178 // Edge case. Tests that Range() generates the single element sequence 179 // as expected when provided with range limits that are equal. 180 TEST(RangeTest, IntRangeSingleValue) { 181 const ParamGenerator<int> gen = Range(0, 1); 182 const int expected_values[] = {0}; 183 VerifyGenerator(gen, expected_values); 184 } 185 186 // Edge case. Tests that Range() with generates empty sequence when 187 // supplied with an empty range. 188 TEST(RangeTest, IntRangeEmpty) { 189 const ParamGenerator<int> gen = Range(0, 0); 190 VerifyGeneratorIsEmpty(gen); 191 } 192 193 // Tests that Range() with custom step (greater then one) generates 194 // the expected sequence. 195 TEST(RangeTest, IntRangeWithCustomStep) { 196 const ParamGenerator<int> gen = Range(0, 9, 3); 197 const int expected_values[] = {0, 3, 6}; 198 VerifyGenerator(gen, expected_values); 199 } 200 201 // Tests that Range() with custom step (greater then one) generates 202 // the expected sequence when the last element does not fall on the 203 // upper range limit. Sequences generated by Range() must not have 204 // elements beyond the range limits. 205 TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) { 206 const ParamGenerator<int> gen = Range(0, 4, 3); 207 const int expected_values[] = {0, 3}; 208 VerifyGenerator(gen, expected_values); 209 } 210 211 // Verifies that Range works with user-defined types that define 212 // copy constructor, operator=(), operator+(), and operator<(). 213 class DogAdder { 214 public: 215 explicit DogAdder(const char* a_value) : value_(a_value) {} 216 DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {} 217 218 DogAdder operator=(const DogAdder& other) { 219 if (this != &other) 220 value_ = other.value_; 221 return *this; 222 } 223 DogAdder operator+(const DogAdder& other) const { 224 Message msg; 225 msg << value_.c_str() << other.value_.c_str(); 226 return DogAdder(msg.GetString().c_str()); 227 } 228 bool operator<(const DogAdder& other) const { 229 return value_ < other.value_; 230 } 231 const std::string& value() const { return value_; } 232 233 private: 234 std::string value_; 235 }; 236 237 TEST(RangeTest, WorksWithACustomType) { 238 const ParamGenerator<DogAdder> gen = 239 Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog")); 240 ParamGenerator<DogAdder>::iterator it = gen.begin(); 241 242 ASSERT_FALSE(it == gen.end()); 243 EXPECT_STREQ("cat", it->value().c_str()); 244 245 ASSERT_FALSE(++it == gen.end()); 246 EXPECT_STREQ("catdog", it->value().c_str()); 247 248 EXPECT_TRUE(++it == gen.end()); 249 } 250 251 class IntWrapper { 252 public: 253 explicit IntWrapper(int a_value) : value_(a_value) {} 254 IntWrapper(const IntWrapper& other) : value_(other.value_) {} 255 256 IntWrapper operator=(const IntWrapper& other) { 257 value_ = other.value_; 258 return *this; 259 } 260 // operator+() adds a different type. 261 IntWrapper operator+(int other) const { return IntWrapper(value_ + other); } 262 bool operator<(const IntWrapper& other) const { 263 return value_ < other.value_; 264 } 265 int value() const { return value_; } 266 267 private: 268 int value_; 269 }; 270 271 TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) { 272 const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2)); 273 ParamGenerator<IntWrapper>::iterator it = gen.begin(); 274 275 ASSERT_FALSE(it == gen.end()); 276 EXPECT_EQ(0, it->value()); 277 278 ASSERT_FALSE(++it == gen.end()); 279 EXPECT_EQ(1, it->value()); 280 281 EXPECT_TRUE(++it == gen.end()); 282 } 283 284 // Tests that ValuesIn() with an array parameter generates 285 // the expected sequence. 286 TEST(ValuesInTest, ValuesInArray) { 287 int array[] = {3, 5, 8}; 288 const ParamGenerator<int> gen = ValuesIn(array); 289 VerifyGenerator(gen, array); 290 } 291 292 // Tests that ValuesIn() with a const array parameter generates 293 // the expected sequence. 294 TEST(ValuesInTest, ValuesInConstArray) { 295 const int array[] = {3, 5, 8}; 296 const ParamGenerator<int> gen = ValuesIn(array); 297 VerifyGenerator(gen, array); 298 } 299 300 // Edge case. Tests that ValuesIn() with an array parameter containing a 301 // single element generates the single element sequence. 302 TEST(ValuesInTest, ValuesInSingleElementArray) { 303 int array[] = {42}; 304 const ParamGenerator<int> gen = ValuesIn(array); 305 VerifyGenerator(gen, array); 306 } 307 308 // Tests that ValuesIn() generates the expected sequence for an STL 309 // container (vector). 310 TEST(ValuesInTest, ValuesInVector) { 311 typedef ::std::vector<int> ContainerType; 312 ContainerType values; 313 values.push_back(3); 314 values.push_back(5); 315 values.push_back(8); 316 const ParamGenerator<int> gen = ValuesIn(values); 317 318 const int expected_values[] = {3, 5, 8}; 319 VerifyGenerator(gen, expected_values); 320 } 321 322 // Tests that ValuesIn() generates the expected sequence. 323 TEST(ValuesInTest, ValuesInIteratorRange) { 324 typedef ::std::vector<int> ContainerType; 325 ContainerType values; 326 values.push_back(3); 327 values.push_back(5); 328 values.push_back(8); 329 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 330 331 const int expected_values[] = {3, 5, 8}; 332 VerifyGenerator(gen, expected_values); 333 } 334 335 // Edge case. Tests that ValuesIn() provided with an iterator range specifying a 336 // single value generates a single-element sequence. 337 TEST(ValuesInTest, ValuesInSingleElementIteratorRange) { 338 typedef ::std::vector<int> ContainerType; 339 ContainerType values; 340 values.push_back(42); 341 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 342 343 const int expected_values[] = {42}; 344 VerifyGenerator(gen, expected_values); 345 } 346 347 // Edge case. Tests that ValuesIn() provided with an empty iterator range 348 // generates an empty sequence. 349 TEST(ValuesInTest, ValuesInEmptyIteratorRange) { 350 typedef ::std::vector<int> ContainerType; 351 ContainerType values; 352 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 353 354 VerifyGeneratorIsEmpty(gen); 355 } 356 357 // Tests that the Values() generates the expected sequence. 358 TEST(ValuesTest, ValuesWorks) { 359 const ParamGenerator<int> gen = Values(3, 5, 8); 360 361 const int expected_values[] = {3, 5, 8}; 362 VerifyGenerator(gen, expected_values); 363 } 364 365 // Tests that Values() generates the expected sequences from elements of 366 // different types convertible to ParamGenerator's parameter type. 367 TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) { 368 const ParamGenerator<double> gen = Values(3, 5.0f, 8.0); 369 370 const double expected_values[] = {3.0, 5.0, 8.0}; 371 VerifyGenerator(gen, expected_values); 372 } 373 374 TEST(ValuesTest, ValuesWorksForMaxLengthList) { 375 const ParamGenerator<int> gen = Values( 376 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 377 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 378 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 379 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 380 410, 420, 430, 440, 450, 460, 470, 480, 490, 500); 381 382 const int expected_values[] = { 383 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 384 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 385 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 386 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 387 410, 420, 430, 440, 450, 460, 470, 480, 490, 500}; 388 VerifyGenerator(gen, expected_values); 389 } 390 391 // Edge case test. Tests that single-parameter Values() generates the sequence 392 // with the single value. 393 TEST(ValuesTest, ValuesWithSingleParameter) { 394 const ParamGenerator<int> gen = Values(42); 395 396 const int expected_values[] = {42}; 397 VerifyGenerator(gen, expected_values); 398 } 399 400 // Tests that Bool() generates sequence (false, true). 401 TEST(BoolTest, BoolWorks) { 402 const ParamGenerator<bool> gen = Bool(); 403 404 const bool expected_values[] = {false, true}; 405 VerifyGenerator(gen, expected_values); 406 } 407 408 // Tests that Combine() with two parameters generates the expected sequence. 409 TEST(CombineTest, CombineWithTwoParameters) { 410 const char* foo = "foo"; 411 const char* bar = "bar"; 412 const ParamGenerator<std::tuple<const char*, int> > gen = 413 Combine(Values(foo, bar), Values(3, 4)); 414 415 std::tuple<const char*, int> expected_values[] = { 416 std::make_tuple(foo, 3), std::make_tuple(foo, 4), std::make_tuple(bar, 3), 417 std::make_tuple(bar, 4)}; 418 VerifyGenerator(gen, expected_values); 419 } 420 421 // Tests that Combine() with three parameters generates the expected sequence. 422 TEST(CombineTest, CombineWithThreeParameters) { 423 const ParamGenerator<std::tuple<int, int, int> > gen = 424 Combine(Values(0, 1), Values(3, 4), Values(5, 6)); 425 std::tuple<int, int, int> expected_values[] = { 426 std::make_tuple(0, 3, 5), std::make_tuple(0, 3, 6), 427 std::make_tuple(0, 4, 5), std::make_tuple(0, 4, 6), 428 std::make_tuple(1, 3, 5), std::make_tuple(1, 3, 6), 429 std::make_tuple(1, 4, 5), std::make_tuple(1, 4, 6)}; 430 VerifyGenerator(gen, expected_values); 431 } 432 433 // Tests that the Combine() with the first parameter generating a single value 434 // sequence generates a sequence with the number of elements equal to the 435 // number of elements in the sequence generated by the second parameter. 436 TEST(CombineTest, CombineWithFirstParameterSingleValue) { 437 const ParamGenerator<std::tuple<int, int> > gen = 438 Combine(Values(42), Values(0, 1)); 439 440 std::tuple<int, int> expected_values[] = {std::make_tuple(42, 0), 441 std::make_tuple(42, 1)}; 442 VerifyGenerator(gen, expected_values); 443 } 444 445 // Tests that the Combine() with the second parameter generating a single value 446 // sequence generates a sequence with the number of elements equal to the 447 // number of elements in the sequence generated by the first parameter. 448 TEST(CombineTest, CombineWithSecondParameterSingleValue) { 449 const ParamGenerator<std::tuple<int, int> > gen = 450 Combine(Values(0, 1), Values(42)); 451 452 std::tuple<int, int> expected_values[] = {std::make_tuple(0, 42), 453 std::make_tuple(1, 42)}; 454 VerifyGenerator(gen, expected_values); 455 } 456 457 // Tests that when the first parameter produces an empty sequence, 458 // Combine() produces an empty sequence, too. 459 TEST(CombineTest, CombineWithFirstParameterEmptyRange) { 460 const ParamGenerator<std::tuple<int, int> > gen = 461 Combine(Range(0, 0), Values(0, 1)); 462 VerifyGeneratorIsEmpty(gen); 463 } 464 465 // Tests that when the second parameter produces an empty sequence, 466 // Combine() produces an empty sequence, too. 467 TEST(CombineTest, CombineWithSecondParameterEmptyRange) { 468 const ParamGenerator<std::tuple<int, int> > gen = 469 Combine(Values(0, 1), Range(1, 1)); 470 VerifyGeneratorIsEmpty(gen); 471 } 472 473 // Edge case. Tests that combine works with the maximum number 474 // of parameters supported by Google Test (currently 10). 475 TEST(CombineTest, CombineWithMaxNumberOfParameters) { 476 const char* foo = "foo"; 477 const char* bar = "bar"; 478 const ParamGenerator< 479 std::tuple<const char*, int, int, int, int, int, int, int, int, int> > 480 gen = 481 Combine(Values(foo, bar), Values(1), Values(2), Values(3), Values(4), 482 Values(5), Values(6), Values(7), Values(8), Values(9)); 483 484 std::tuple<const char*, int, int, int, int, int, int, int, int, int> 485 expected_values[] = {std::make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9), 486 std::make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)}; 487 VerifyGenerator(gen, expected_values); 488 } 489 490 class NonDefaultConstructAssignString { 491 public: 492 NonDefaultConstructAssignString(const std::string& s) : str_(s) {} 493 NonDefaultConstructAssignString() = delete; 494 NonDefaultConstructAssignString(const NonDefaultConstructAssignString&) = 495 default; 496 NonDefaultConstructAssignString& operator=( 497 const NonDefaultConstructAssignString&) = delete; 498 ~NonDefaultConstructAssignString() = default; 499 500 const std::string& str() const { return str_; } 501 502 private: 503 std::string str_; 504 }; 505 506 TEST(CombineTest, NonDefaultConstructAssign) { 507 const ParamGenerator<std::tuple<int, NonDefaultConstructAssignString> > gen = 508 Combine(Values(0, 1), Values(NonDefaultConstructAssignString("A"), 509 NonDefaultConstructAssignString("B"))); 510 511 ParamGenerator<std::tuple<int, NonDefaultConstructAssignString> >::iterator 512 it = gen.begin(); 513 514 EXPECT_EQ(0, std::get<0>(*it)); 515 EXPECT_EQ("A", std::get<1>(*it).str()); 516 ++it; 517 518 EXPECT_EQ(0, std::get<0>(*it)); 519 EXPECT_EQ("B", std::get<1>(*it).str()); 520 ++it; 521 522 EXPECT_EQ(1, std::get<0>(*it)); 523 EXPECT_EQ("A", std::get<1>(*it).str()); 524 ++it; 525 526 EXPECT_EQ(1, std::get<0>(*it)); 527 EXPECT_EQ("B", std::get<1>(*it).str()); 528 ++it; 529 530 EXPECT_TRUE(it == gen.end()); 531 } 532 533 534 // Tests that an generator produces correct sequence after being 535 // assigned from another generator. 536 TEST(ParamGeneratorTest, AssignmentWorks) { 537 ParamGenerator<int> gen = Values(1, 2); 538 const ParamGenerator<int> gen2 = Values(3, 4); 539 gen = gen2; 540 541 const int expected_values[] = {3, 4}; 542 VerifyGenerator(gen, expected_values); 543 } 544 545 // This test verifies that the tests are expanded and run as specified: 546 // one test per element from the sequence produced by the generator 547 // specified in INSTANTIATE_TEST_SUITE_P. It also verifies that the test's 548 // fixture constructor, SetUp(), and TearDown() have run and have been 549 // supplied with the correct parameters. 550 551 // The use of environment object allows detection of the case where no test 552 // case functionality is run at all. In this case TearDownTestSuite will not 553 // be able to detect missing tests, naturally. 554 template <int kExpectedCalls> 555 class TestGenerationEnvironment : public ::testing::Environment { 556 public: 557 static TestGenerationEnvironment* Instance() { 558 static TestGenerationEnvironment* instance = new TestGenerationEnvironment; 559 return instance; 560 } 561 562 void FixtureConstructorExecuted() { fixture_constructor_count_++; } 563 void SetUpExecuted() { set_up_count_++; } 564 void TearDownExecuted() { tear_down_count_++; } 565 void TestBodyExecuted() { test_body_count_++; } 566 567 void TearDown() override { 568 // If all MultipleTestGenerationTest tests have been de-selected 569 // by the filter flag, the following checks make no sense. 570 bool perform_check = false; 571 572 for (int i = 0; i < kExpectedCalls; ++i) { 573 Message msg; 574 msg << "TestsExpandedAndRun/" << i; 575 if (UnitTestOptions::FilterMatchesTest( 576 "TestExpansionModule/MultipleTestGenerationTest", 577 msg.GetString().c_str())) { 578 perform_check = true; 579 } 580 } 581 if (perform_check) { 582 EXPECT_EQ(kExpectedCalls, fixture_constructor_count_) 583 << "Fixture constructor of ParamTestGenerationTest test case " 584 << "has not been run as expected."; 585 EXPECT_EQ(kExpectedCalls, set_up_count_) 586 << "Fixture SetUp method of ParamTestGenerationTest test case " 587 << "has not been run as expected."; 588 EXPECT_EQ(kExpectedCalls, tear_down_count_) 589 << "Fixture TearDown method of ParamTestGenerationTest test case " 590 << "has not been run as expected."; 591 EXPECT_EQ(kExpectedCalls, test_body_count_) 592 << "Test in ParamTestGenerationTest test case " 593 << "has not been run as expected."; 594 } 595 } 596 597 private: 598 TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0), 599 tear_down_count_(0), test_body_count_(0) {} 600 601 int fixture_constructor_count_; 602 int set_up_count_; 603 int tear_down_count_; 604 int test_body_count_; 605 606 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment); 607 }; 608 609 const int test_generation_params[] = {36, 42, 72}; 610 611 class TestGenerationTest : public TestWithParam<int> { 612 public: 613 enum { 614 PARAMETER_COUNT = 615 sizeof(test_generation_params)/sizeof(test_generation_params[0]) 616 }; 617 618 typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment; 619 620 TestGenerationTest() { 621 Environment::Instance()->FixtureConstructorExecuted(); 622 current_parameter_ = GetParam(); 623 } 624 void SetUp() override { 625 Environment::Instance()->SetUpExecuted(); 626 EXPECT_EQ(current_parameter_, GetParam()); 627 } 628 void TearDown() override { 629 Environment::Instance()->TearDownExecuted(); 630 EXPECT_EQ(current_parameter_, GetParam()); 631 } 632 633 static void SetUpTestSuite() { 634 bool all_tests_in_test_case_selected = true; 635 636 for (int i = 0; i < PARAMETER_COUNT; ++i) { 637 Message test_name; 638 test_name << "TestsExpandedAndRun/" << i; 639 if ( !UnitTestOptions::FilterMatchesTest( 640 "TestExpansionModule/MultipleTestGenerationTest", 641 test_name.GetString())) { 642 all_tests_in_test_case_selected = false; 643 } 644 } 645 EXPECT_TRUE(all_tests_in_test_case_selected) 646 << "When running the TestGenerationTest test case all of its tests\n" 647 << "must be selected by the filter flag for the test case to pass.\n" 648 << "If not all of them are enabled, we can't reliably conclude\n" 649 << "that the correct number of tests have been generated."; 650 651 collected_parameters_.clear(); 652 } 653 654 static void TearDownTestSuite() { 655 vector<int> expected_values(test_generation_params, 656 test_generation_params + PARAMETER_COUNT); 657 // Test execution order is not guaranteed by Google Test, 658 // so the order of values in collected_parameters_ can be 659 // different and we have to sort to compare. 660 sort(expected_values.begin(), expected_values.end()); 661 sort(collected_parameters_.begin(), collected_parameters_.end()); 662 663 EXPECT_TRUE(collected_parameters_ == expected_values); 664 } 665 666 protected: 667 int current_parameter_; 668 static vector<int> collected_parameters_; 669 670 private: 671 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest); 672 }; 673 vector<int> TestGenerationTest::collected_parameters_; 674 675 TEST_P(TestGenerationTest, TestsExpandedAndRun) { 676 Environment::Instance()->TestBodyExecuted(); 677 EXPECT_EQ(current_parameter_, GetParam()); 678 collected_parameters_.push_back(GetParam()); 679 } 680 INSTANTIATE_TEST_SUITE_P(TestExpansionModule, TestGenerationTest, 681 ValuesIn(test_generation_params)); 682 683 // This test verifies that the element sequence (third parameter of 684 // INSTANTIATE_TEST_SUITE_P) is evaluated in InitGoogleTest() and neither at 685 // the call site of INSTANTIATE_TEST_SUITE_P nor in RUN_ALL_TESTS(). For 686 // that, we declare param_value_ to be a static member of 687 // GeneratorEvaluationTest and initialize it to 0. We set it to 1 in 688 // main(), just before invocation of InitGoogleTest(). After calling 689 // InitGoogleTest(), we set the value to 2. If the sequence is evaluated 690 // before or after InitGoogleTest, INSTANTIATE_TEST_SUITE_P will create a 691 // test with parameter other than 1, and the test body will fail the 692 // assertion. 693 class GeneratorEvaluationTest : public TestWithParam<int> { 694 public: 695 static int param_value() { return param_value_; } 696 static void set_param_value(int param_value) { param_value_ = param_value; } 697 698 private: 699 static int param_value_; 700 }; 701 int GeneratorEvaluationTest::param_value_ = 0; 702 703 TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) { 704 EXPECT_EQ(1, GetParam()); 705 } 706 INSTANTIATE_TEST_SUITE_P(GenEvalModule, GeneratorEvaluationTest, 707 Values(GeneratorEvaluationTest::param_value())); 708 709 // Tests that generators defined in a different translation unit are 710 // functional. Generator extern_gen is defined in gtest-param-test_test2.cc. 711 extern ParamGenerator<int> extern_gen; 712 class ExternalGeneratorTest : public TestWithParam<int> {}; 713 TEST_P(ExternalGeneratorTest, ExternalGenerator) { 714 // Sequence produced by extern_gen contains only a single value 715 // which we verify here. 716 EXPECT_EQ(GetParam(), 33); 717 } 718 INSTANTIATE_TEST_SUITE_P(ExternalGeneratorModule, ExternalGeneratorTest, 719 extern_gen); 720 721 // Tests that a parameterized test case can be defined in one translation 722 // unit and instantiated in another. This test will be instantiated in 723 // gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is 724 // defined in gtest-param-test_test.h. 725 TEST_P(ExternalInstantiationTest, IsMultipleOf33) { 726 EXPECT_EQ(0, GetParam() % 33); 727 } 728 729 // Tests that a parameterized test case can be instantiated with multiple 730 // generators. 731 class MultipleInstantiationTest : public TestWithParam<int> {}; 732 TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) { 733 } 734 INSTANTIATE_TEST_SUITE_P(Sequence1, MultipleInstantiationTest, Values(1, 2)); 735 INSTANTIATE_TEST_SUITE_P(Sequence2, MultipleInstantiationTest, Range(3, 5)); 736 737 // Tests that a parameterized test case can be instantiated 738 // in multiple translation units. This test will be instantiated 739 // here and in gtest-param-test_test2.cc. 740 // InstantiationInMultipleTranslationUnitsTest fixture class 741 // is defined in gtest-param-test_test.h. 742 TEST_P(InstantiationInMultipleTranslationUnitsTest, IsMultipleOf42) { 743 EXPECT_EQ(0, GetParam() % 42); 744 } 745 INSTANTIATE_TEST_SUITE_P(Sequence1, InstantiationInMultipleTranslationUnitsTest, 746 Values(42, 42 * 2)); 747 748 // Tests that each iteration of parameterized test runs in a separate test 749 // object. 750 class SeparateInstanceTest : public TestWithParam<int> { 751 public: 752 SeparateInstanceTest() : count_(0) {} 753 754 static void TearDownTestSuite() { 755 EXPECT_GE(global_count_, 2) 756 << "If some (but not all) SeparateInstanceTest tests have been " 757 << "filtered out this test will fail. Make sure that all " 758 << "GeneratorEvaluationTest are selected or de-selected together " 759 << "by the test filter."; 760 } 761 762 protected: 763 int count_; 764 static int global_count_; 765 }; 766 int SeparateInstanceTest::global_count_ = 0; 767 768 TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) { 769 EXPECT_EQ(0, count_++); 770 global_count_++; 771 } 772 INSTANTIATE_TEST_SUITE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4)); 773 774 // Tests that all instantiations of a test have named appropriately. Test 775 // defined with TEST_P(TestSuiteName, TestName) and instantiated with 776 // INSTANTIATE_TEST_SUITE_P(SequenceName, TestSuiteName, generator) must be 777 // named SequenceName/TestSuiteName.TestName/i, where i is the 0-based index of 778 // the sequence element used to instantiate the test. 779 class NamingTest : public TestWithParam<int> {}; 780 781 TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) { 782 const ::testing::TestInfo* const test_info = 783 ::testing::UnitTest::GetInstance()->current_test_info(); 784 785 EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_suite_name()); 786 787 Message index_stream; 788 index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam(); 789 EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name()); 790 791 EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param()); 792 } 793 794 INSTANTIATE_TEST_SUITE_P(ZeroToFiveSequence, NamingTest, Range(0, 5)); 795 796 // Tests that macros in test names are expanded correctly. 797 class MacroNamingTest : public TestWithParam<int> {}; 798 799 #define PREFIX_WITH_FOO(test_name) Foo##test_name 800 #define PREFIX_WITH_MACRO(test_name) Macro##test_name 801 802 TEST_P(PREFIX_WITH_MACRO(NamingTest), PREFIX_WITH_FOO(SomeTestName)) { 803 const ::testing::TestInfo* const test_info = 804 ::testing::UnitTest::GetInstance()->current_test_info(); 805 806 EXPECT_STREQ("FortyTwo/MacroNamingTest", test_info->test_suite_name()); 807 EXPECT_STREQ("FooSomeTestName/0", test_info->name()); 808 } 809 810 INSTANTIATE_TEST_SUITE_P(FortyTwo, MacroNamingTest, Values(42)); 811 812 // Tests the same thing for non-parametrized tests. 813 class MacroNamingTestNonParametrized : public ::testing::Test {}; 814 815 TEST_F(PREFIX_WITH_MACRO(NamingTestNonParametrized), 816 PREFIX_WITH_FOO(SomeTestName)) { 817 const ::testing::TestInfo* const test_info = 818 ::testing::UnitTest::GetInstance()->current_test_info(); 819 820 EXPECT_STREQ("MacroNamingTestNonParametrized", test_info->test_suite_name()); 821 EXPECT_STREQ("FooSomeTestName", test_info->name()); 822 } 823 824 TEST(MacroNameing, LookupNames) { 825 std::set<std::string> know_suite_names, know_test_names; 826 827 auto ins = testing::UnitTest::GetInstance(); 828 int ts = 0; 829 while (const testing::TestSuite* suite = ins->GetTestSuite(ts++)) { 830 know_suite_names.insert(suite->name()); 831 832 int ti = 0; 833 while (const testing::TestInfo* info = suite->GetTestInfo(ti++)) { 834 know_test_names.insert(std::string(suite->name()) + "." + info->name()); 835 } 836 } 837 838 // Check that the expected form of the test suit name actually exists. 839 EXPECT_NE( // 840 know_suite_names.find("FortyTwo/MacroNamingTest"), 841 know_suite_names.end()); 842 EXPECT_NE( 843 know_suite_names.find("MacroNamingTestNonParametrized"), 844 know_suite_names.end()); 845 // Check that the expected form of the test name actually exists. 846 EXPECT_NE( // 847 know_test_names.find("FortyTwo/MacroNamingTest.FooSomeTestName/0"), 848 know_test_names.end()); 849 EXPECT_NE( 850 know_test_names.find("MacroNamingTestNonParametrized.FooSomeTestName"), 851 know_test_names.end()); 852 } 853 854 // Tests that user supplied custom parameter names are working correctly. 855 // Runs the test with a builtin helper method which uses PrintToString, 856 // as well as a custom function and custom functor to ensure all possible 857 // uses work correctly. 858 class CustomFunctorNamingTest : public TestWithParam<std::string> {}; 859 TEST_P(CustomFunctorNamingTest, CustomTestNames) {} 860 861 struct CustomParamNameFunctor { 862 std::string operator()(const ::testing::TestParamInfo<std::string>& inf) { 863 return inf.param; 864 } 865 }; 866 867 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunctor, CustomFunctorNamingTest, 868 Values(std::string("FunctorName")), 869 CustomParamNameFunctor()); 870 871 INSTANTIATE_TEST_SUITE_P(AllAllowedCharacters, CustomFunctorNamingTest, 872 Values("abcdefghijklmnopqrstuvwxyz", 873 "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "01234567890_"), 874 CustomParamNameFunctor()); 875 876 inline std::string CustomParamNameFunction( 877 const ::testing::TestParamInfo<std::string>& inf) { 878 return inf.param; 879 } 880 881 class CustomFunctionNamingTest : public TestWithParam<std::string> {}; 882 TEST_P(CustomFunctionNamingTest, CustomTestNames) {} 883 884 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunction, CustomFunctionNamingTest, 885 Values(std::string("FunctionName")), 886 CustomParamNameFunction); 887 888 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunctionP, CustomFunctionNamingTest, 889 Values(std::string("FunctionNameP")), 890 &CustomParamNameFunction); 891 892 // Test custom naming with a lambda 893 894 class CustomLambdaNamingTest : public TestWithParam<std::string> {}; 895 TEST_P(CustomLambdaNamingTest, CustomTestNames) {} 896 897 INSTANTIATE_TEST_SUITE_P(CustomParamNameLambda, CustomLambdaNamingTest, 898 Values(std::string("LambdaName")), 899 [](const ::testing::TestParamInfo<std::string>& inf) { 900 return inf.param; 901 }); 902 903 TEST(CustomNamingTest, CheckNameRegistry) { 904 ::testing::UnitTest* unit_test = ::testing::UnitTest::GetInstance(); 905 std::set<std::string> test_names; 906 for (int suite_num = 0; suite_num < unit_test->total_test_suite_count(); 907 ++suite_num) { 908 const ::testing::TestSuite* test_suite = unit_test->GetTestSuite(suite_num); 909 for (int test_num = 0; test_num < test_suite->total_test_count(); 910 ++test_num) { 911 const ::testing::TestInfo* test_info = test_suite->GetTestInfo(test_num); 912 test_names.insert(std::string(test_info->name())); 913 } 914 } 915 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctorName")); 916 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionName")); 917 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionNameP")); 918 EXPECT_EQ(1u, test_names.count("CustomTestNames/LambdaName")); 919 } 920 921 // Test a numeric name to ensure PrintToStringParamName works correctly. 922 923 class CustomIntegerNamingTest : public TestWithParam<int> {}; 924 925 TEST_P(CustomIntegerNamingTest, TestsReportCorrectNames) { 926 const ::testing::TestInfo* const test_info = 927 ::testing::UnitTest::GetInstance()->current_test_info(); 928 Message test_name_stream; 929 test_name_stream << "TestsReportCorrectNames/" << GetParam(); 930 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name()); 931 } 932 933 INSTANTIATE_TEST_SUITE_P(PrintToString, CustomIntegerNamingTest, Range(0, 5), 934 ::testing::PrintToStringParamName()); 935 936 // Test a custom struct with PrintToString. 937 938 struct CustomStruct { 939 explicit CustomStruct(int value) : x(value) {} 940 int x; 941 }; 942 943 std::ostream& operator<<(std::ostream& stream, const CustomStruct& val) { 944 stream << val.x; 945 return stream; 946 } 947 948 class CustomStructNamingTest : public TestWithParam<CustomStruct> {}; 949 950 TEST_P(CustomStructNamingTest, TestsReportCorrectNames) { 951 const ::testing::TestInfo* const test_info = 952 ::testing::UnitTest::GetInstance()->current_test_info(); 953 Message test_name_stream; 954 test_name_stream << "TestsReportCorrectNames/" << GetParam(); 955 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name()); 956 } 957 958 INSTANTIATE_TEST_SUITE_P(PrintToString, CustomStructNamingTest, 959 Values(CustomStruct(0), CustomStruct(1)), 960 ::testing::PrintToStringParamName()); 961 962 // Test that using a stateful parameter naming function works as expected. 963 964 struct StatefulNamingFunctor { 965 StatefulNamingFunctor() : sum(0) {} 966 std::string operator()(const ::testing::TestParamInfo<int>& info) { 967 int value = info.param + sum; 968 sum += info.param; 969 return ::testing::PrintToString(value); 970 } 971 int sum; 972 }; 973 974 class StatefulNamingTest : public ::testing::TestWithParam<int> { 975 protected: 976 StatefulNamingTest() : sum_(0) {} 977 int sum_; 978 }; 979 980 TEST_P(StatefulNamingTest, TestsReportCorrectNames) { 981 const ::testing::TestInfo* const test_info = 982 ::testing::UnitTest::GetInstance()->current_test_info(); 983 sum_ += GetParam(); 984 Message test_name_stream; 985 test_name_stream << "TestsReportCorrectNames/" << sum_; 986 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name()); 987 } 988 989 INSTANTIATE_TEST_SUITE_P(StatefulNamingFunctor, StatefulNamingTest, Range(0, 5), 990 StatefulNamingFunctor()); 991 992 // Class that cannot be streamed into an ostream. It needs to be copyable 993 // (and, in case of MSVC, also assignable) in order to be a test parameter 994 // type. Its default copy constructor and assignment operator do exactly 995 // what we need. 996 class Unstreamable { 997 public: 998 explicit Unstreamable(int value) : value_(value) {} 999 // -Wunused-private-field: dummy accessor for `value_`. 1000 const int& dummy_value() const { return value_; } 1001 1002 private: 1003 int value_; 1004 }; 1005 1006 class CommentTest : public TestWithParam<Unstreamable> {}; 1007 1008 TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) { 1009 const ::testing::TestInfo* const test_info = 1010 ::testing::UnitTest::GetInstance()->current_test_info(); 1011 1012 EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param()); 1013 } 1014 1015 INSTANTIATE_TEST_SUITE_P(InstantiationWithComments, CommentTest, 1016 Values(Unstreamable(1))); 1017 1018 // Verify that we can create a hierarchy of test fixtures, where the base 1019 // class fixture is not parameterized and the derived class is. In this case 1020 // ParameterizedDerivedTest inherits from NonParameterizedBaseTest. We 1021 // perform simple tests on both. 1022 class NonParameterizedBaseTest : public ::testing::Test { 1023 public: 1024 NonParameterizedBaseTest() : n_(17) { } 1025 protected: 1026 int n_; 1027 }; 1028 1029 class ParameterizedDerivedTest : public NonParameterizedBaseTest, 1030 public ::testing::WithParamInterface<int> { 1031 protected: 1032 ParameterizedDerivedTest() : count_(0) { } 1033 int count_; 1034 static int global_count_; 1035 }; 1036 1037 int ParameterizedDerivedTest::global_count_ = 0; 1038 1039 TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) { 1040 EXPECT_EQ(17, n_); 1041 } 1042 1043 TEST_P(ParameterizedDerivedTest, SeesSequence) { 1044 EXPECT_EQ(17, n_); 1045 EXPECT_EQ(0, count_++); 1046 EXPECT_EQ(GetParam(), global_count_++); 1047 } 1048 1049 class ParameterizedDeathTest : public ::testing::TestWithParam<int> { }; 1050 1051 TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) { 1052 EXPECT_DEATH_IF_SUPPORTED(GetParam(), 1053 ".* value-parameterized test .*"); 1054 } 1055 1056 INSTANTIATE_TEST_SUITE_P(RangeZeroToFive, ParameterizedDerivedTest, 1057 Range(0, 5)); 1058 1059 // Tests param generator working with Enums 1060 enum MyEnums { 1061 ENUM1 = 1, 1062 ENUM2 = 3, 1063 ENUM3 = 8, 1064 }; 1065 1066 class MyEnumTest : public testing::TestWithParam<MyEnums> {}; 1067 1068 TEST_P(MyEnumTest, ChecksParamMoreThanZero) { EXPECT_GE(10, GetParam()); } 1069 INSTANTIATE_TEST_SUITE_P(MyEnumTests, MyEnumTest, 1070 ::testing::Values(ENUM1, ENUM2, 0)); 1071 1072 namespace works_here { 1073 // Never used not instantiated, this should work. 1074 class NotUsedTest : public testing::TestWithParam<int> {}; 1075 1076 /////// 1077 // Never used not instantiated, this should work. 1078 template <typename T> 1079 class NotUsedTypeTest : public testing::Test {}; 1080 TYPED_TEST_SUITE_P(NotUsedTypeTest); 1081 1082 // Used but not instantiated, this would fail. but... 1083 class NotInstantiatedTest : public testing::TestWithParam<int> {}; 1084 // ... we mark is as allowed. 1085 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NotInstantiatedTest); 1086 1087 TEST_P(NotInstantiatedTest, Used) { } 1088 1089 using OtherName = NotInstantiatedTest; 1090 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(OtherName); 1091 TEST_P(OtherName, Used) { } 1092 1093 // Used but not instantiated, this would fail. but... 1094 template <typename T> 1095 class NotInstantiatedTypeTest : public testing::Test {}; 1096 TYPED_TEST_SUITE_P(NotInstantiatedTypeTest); 1097 // ... we mark is as allowed. 1098 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NotInstantiatedTypeTest); 1099 1100 TYPED_TEST_P(NotInstantiatedTypeTest, Used) { } 1101 REGISTER_TYPED_TEST_SUITE_P(NotInstantiatedTypeTest, Used); 1102 } // namespace works_here 1103 1104 int main(int argc, char **argv) { 1105 // Used in TestGenerationTest test suite. 1106 AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance()); 1107 // Used in GeneratorEvaluationTest test suite. Tests that the updated value 1108 // will be picked up for instantiating tests in GeneratorEvaluationTest. 1109 GeneratorEvaluationTest::set_param_value(1); 1110 1111 ::testing::InitGoogleTest(&argc, argv); 1112 1113 // Used in GeneratorEvaluationTest test suite. Tests that value updated 1114 // here will NOT be used for instantiating tests in 1115 // GeneratorEvaluationTest. 1116 GeneratorEvaluationTest::set_param_value(2); 1117 1118 return RUN_ALL_TESTS(); 1119 }