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 // Author: vladl (at) google.com (Vlad Losev) 31 // 32 // Tests for Google Test itself. This file verifies that the parameter 33 // generators objects produce correct parameter sequences and that 34 // Google Test runtime instantiates correct tests from those sequences. 35 36 #include <gtest/gtest.h> 37 38 #if GTEST_HAS_PARAM_TEST 39 40 #include <algorithm> 41 #include <iostream> 42 #include <list> 43 #include <vector> 44 45 // To include gtest-internal-inl.h. 46 #define GTEST_IMPLEMENTATION_ 1 47 #include "src/gtest-internal-inl.h" // for UnitTestOptions 48 #undef GTEST_IMPLEMENTATION_ 49 50 #include "test/gtest-param-test_test.h" 51 52 using ::std::vector; 53 using ::std::sort; 54 55 using ::testing::AddGlobalTestEnvironment; 56 using ::testing::Bool; 57 using ::testing::Message; 58 using ::testing::Range; 59 using ::testing::TestWithParam; 60 using ::testing::Values; 61 using ::testing::ValuesIn; 62 63 #if GTEST_HAS_COMBINE 64 using ::testing::Combine; 65 using ::std::tr1::get; 66 using ::std::tr1::make_tuple; 67 using ::std::tr1::tuple; 68 #endif // GTEST_HAS_COMBINE 69 70 using ::testing::internal::ParamGenerator; 71 using ::testing::internal::UnitTestOptions; 72 73 // Verifies that a sequence generated by the generator and accessed 74 // via the iterator object matches the expected one using Google Test 75 // assertions. 76 template <typename T, size_t N> 77 void VerifyGenerator(const ParamGenerator<T>& generator, 78 const T (&expected_values)[N]) { 79 typename ParamGenerator<T>::iterator it = generator.begin(); 80 for (size_t i = 0; i < N; ++i) { 81 ASSERT_FALSE(it == generator.end()) 82 << "At element " << i << " when accessing via an iterator " 83 << "created with the copy constructor." << std::endl; 84 EXPECT_EQ(expected_values[i], *it) 85 << "At element " << i << " when accessing via an iterator " 86 << "created with the copy constructor." << std::endl; 87 it++; 88 } 89 EXPECT_TRUE(it == generator.end()) 90 << "At the presumed end of sequence when accessing via an iterator " 91 << "created with the copy constructor." << std::endl; 92 93 // Test the iterator assignment. The following lines verify that 94 // the sequence accessed via an iterator initialized via the 95 // assignment operator (as opposed to a copy constructor) matches 96 // just the same. 97 it = generator.begin(); 98 for (size_t i = 0; i < N; ++i) { 99 ASSERT_FALSE(it == generator.end()) 100 << "At element " << i << " when accessing via an iterator " 101 << "created with the assignment operator." << std::endl; 102 EXPECT_EQ(expected_values[i], *it) 103 << "At element " << i << " when accessing via an iterator " 104 << "created with the assignment operator." << std::endl; 105 it++; 106 } 107 EXPECT_TRUE(it == generator.end()) 108 << "At the presumed end of sequence when accessing via an iterator " 109 << "created with the assignment operator." << std::endl; 110 } 111 112 template <typename T> 113 void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) { 114 typename ParamGenerator<T>::iterator it = generator.begin(); 115 EXPECT_TRUE(it == generator.end()); 116 117 it = generator.begin(); 118 EXPECT_TRUE(it == generator.end()); 119 } 120 121 // Generator tests. They test that each of the provided generator functions 122 // generates an expected sequence of values. The general test pattern 123 // instantiates a generator using one of the generator functions, 124 // checks the sequence produced by the generator using its iterator API, 125 // and then resets the iterator back to the beginning of the sequence 126 // and checks the sequence again. 127 128 // Tests that iterators produced by generator functions conform to the 129 // ForwardIterator concept. 130 TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) { 131 const ParamGenerator<int> gen = Range(0, 10); 132 ParamGenerator<int>::iterator it = gen.begin(); 133 134 // Verifies that iterator initialization works as expected. 135 ParamGenerator<int>::iterator it2 = it; 136 EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the " 137 << "element same as its source points to"; 138 139 // Verifies that iterator assignment works as expected. 140 it++; 141 EXPECT_FALSE(*it == *it2); 142 it2 = it; 143 EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the " 144 << "element same as its source points to"; 145 146 // Verifies that prefix operator++() returns *this. 147 EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be " 148 << "refer to the original object"; 149 150 // Verifies that the result of the postfix operator++ points to the value 151 // pointed to by the original iterator. 152 int original_value = *it; // Have to compute it outside of macro call to be 153 // unaffected by the parameter evaluation order. 154 EXPECT_EQ(original_value, *(it++)); 155 156 // Verifies that prefix and postfix operator++() advance an iterator 157 // all the same. 158 it2 = it; 159 it++; 160 ++it2; 161 EXPECT_TRUE(*it == *it2); 162 } 163 164 // Tests that Range() generates the expected sequence. 165 TEST(RangeTest, IntRangeWithDefaultStep) { 166 const ParamGenerator<int> gen = Range(0, 3); 167 const int expected_values[] = {0, 1, 2}; 168 VerifyGenerator(gen, expected_values); 169 } 170 171 // Edge case. Tests that Range() generates the single element sequence 172 // as expected when provided with range limits that are equal. 173 TEST(RangeTest, IntRangeSingleValue) { 174 const ParamGenerator<int> gen = Range(0, 1); 175 const int expected_values[] = {0}; 176 VerifyGenerator(gen, expected_values); 177 } 178 179 // Edge case. Tests that Range() with generates empty sequence when 180 // supplied with an empty range. 181 TEST(RangeTest, IntRangeEmpty) { 182 const ParamGenerator<int> gen = Range(0, 0); 183 VerifyGeneratorIsEmpty(gen); 184 } 185 186 // Tests that Range() with custom step (greater then one) generates 187 // the expected sequence. 188 TEST(RangeTest, IntRangeWithCustomStep) { 189 const ParamGenerator<int> gen = Range(0, 9, 3); 190 const int expected_values[] = {0, 3, 6}; 191 VerifyGenerator(gen, expected_values); 192 } 193 194 // Tests that Range() with custom step (greater then one) generates 195 // the expected sequence when the last element does not fall on the 196 // upper range limit. Sequences generated by Range() must not have 197 // elements beyond the range limits. 198 TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) { 199 const ParamGenerator<int> gen = Range(0, 4, 3); 200 const int expected_values[] = {0, 3}; 201 VerifyGenerator(gen, expected_values); 202 } 203 204 // Verifies that Range works with user-defined types that define 205 // copy constructor, operator=(), operator+(), and operator<(). 206 class DogAdder { 207 public: 208 explicit DogAdder(const char* value) : value_(value) {} 209 DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {} 210 211 DogAdder operator=(const DogAdder& other) { 212 if (this != &other) 213 value_ = other.value_; 214 return *this; 215 } 216 DogAdder operator+(const DogAdder& other) const { 217 Message msg; 218 msg << value_.c_str() << other.value_.c_str(); 219 return DogAdder(msg.GetString().c_str()); 220 } 221 bool operator<(const DogAdder& other) const { 222 return value_ < other.value_; 223 } 224 const ::testing::internal::String& value() const { return value_; } 225 226 private: 227 ::testing::internal::String value_; 228 }; 229 230 TEST(RangeTest, WorksWithACustomType) { 231 const ParamGenerator<DogAdder> gen = 232 Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog")); 233 ParamGenerator<DogAdder>::iterator it = gen.begin(); 234 235 ASSERT_FALSE(it == gen.end()); 236 EXPECT_STREQ("cat", it->value().c_str()); 237 238 ASSERT_FALSE(++it == gen.end()); 239 EXPECT_STREQ("catdog", it->value().c_str()); 240 241 EXPECT_TRUE(++it == gen.end()); 242 } 243 244 class IntWrapper { 245 public: 246 explicit IntWrapper(int value) : value_(value) {} 247 IntWrapper(const IntWrapper& other) : value_(other.value_) {} 248 249 IntWrapper operator=(const IntWrapper& other) { 250 value_ = other.value_; 251 return *this; 252 } 253 // operator+() adds a different type. 254 IntWrapper operator+(int other) const { return IntWrapper(value_ + other); } 255 bool operator<(const IntWrapper& other) const { 256 return value_ < other.value_; 257 } 258 int value() const { return value_; } 259 260 private: 261 int value_; 262 }; 263 264 TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) { 265 const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2)); 266 ParamGenerator<IntWrapper>::iterator it = gen.begin(); 267 268 ASSERT_FALSE(it == gen.end()); 269 EXPECT_EQ(0, it->value()); 270 271 ASSERT_FALSE(++it == gen.end()); 272 EXPECT_EQ(1, it->value()); 273 274 EXPECT_TRUE(++it == gen.end()); 275 } 276 277 // Tests that ValuesIn() with an array parameter generates 278 // the expected sequence. 279 TEST(ValuesInTest, ValuesInArray) { 280 int array[] = {3, 5, 8}; 281 const ParamGenerator<int> gen = ValuesIn(array); 282 VerifyGenerator(gen, array); 283 } 284 285 // Tests that ValuesIn() with a const array parameter generates 286 // the expected sequence. 287 TEST(ValuesInTest, ValuesInConstArray) { 288 const int array[] = {3, 5, 8}; 289 const ParamGenerator<int> gen = ValuesIn(array); 290 VerifyGenerator(gen, array); 291 } 292 293 // Edge case. Tests that ValuesIn() with an array parameter containing a 294 // single element generates the single element sequence. 295 TEST(ValuesInTest, ValuesInSingleElementArray) { 296 int array[] = {42}; 297 const ParamGenerator<int> gen = ValuesIn(array); 298 VerifyGenerator(gen, array); 299 } 300 301 // Tests that ValuesIn() generates the expected sequence for an STL 302 // container (vector). 303 TEST(ValuesInTest, ValuesInVector) { 304 typedef ::std::vector<int> ContainerType; 305 ContainerType values; 306 values.push_back(3); 307 values.push_back(5); 308 values.push_back(8); 309 const ParamGenerator<int> gen = ValuesIn(values); 310 311 const int expected_values[] = {3, 5, 8}; 312 VerifyGenerator(gen, expected_values); 313 } 314 315 // Tests that ValuesIn() generates the expected sequence. 316 TEST(ValuesInTest, ValuesInIteratorRange) { 317 typedef ::std::vector<int> ContainerType; 318 ContainerType values; 319 values.push_back(3); 320 values.push_back(5); 321 values.push_back(8); 322 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 323 324 const int expected_values[] = {3, 5, 8}; 325 VerifyGenerator(gen, expected_values); 326 } 327 328 // Edge case. Tests that ValuesIn() provided with an iterator range specifying a 329 // single value generates a single-element sequence. 330 TEST(ValuesInTest, ValuesInSingleElementIteratorRange) { 331 typedef ::std::vector<int> ContainerType; 332 ContainerType values; 333 values.push_back(42); 334 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 335 336 const int expected_values[] = {42}; 337 VerifyGenerator(gen, expected_values); 338 } 339 340 // Edge case. Tests that ValuesIn() provided with an empty iterator range 341 // generates an empty sequence. 342 TEST(ValuesInTest, ValuesInEmptyIteratorRange) { 343 typedef ::std::vector<int> ContainerType; 344 ContainerType values; 345 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end()); 346 347 VerifyGeneratorIsEmpty(gen); 348 } 349 350 // Tests that the Values() generates the expected sequence. 351 TEST(ValuesTest, ValuesWorks) { 352 const ParamGenerator<int> gen = Values(3, 5, 8); 353 354 const int expected_values[] = {3, 5, 8}; 355 VerifyGenerator(gen, expected_values); 356 } 357 358 // Tests that Values() generates the expected sequences from elements of 359 // different types convertible to ParamGenerator's parameter type. 360 TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) { 361 const ParamGenerator<double> gen = Values(3, 5.0f, 8.0); 362 363 const double expected_values[] = {3.0, 5.0, 8.0}; 364 VerifyGenerator(gen, expected_values); 365 } 366 367 TEST(ValuesTest, ValuesWorksForMaxLengthList) { 368 const ParamGenerator<int> gen = Values( 369 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 370 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 371 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 372 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 373 410, 420, 430, 440, 450, 460, 470, 480, 490, 500); 374 375 const int expected_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 VerifyGenerator(gen, expected_values); 382 } 383 384 // Edge case test. Tests that single-parameter Values() generates the sequence 385 // with the single value. 386 TEST(ValuesTest, ValuesWithSingleParameter) { 387 const ParamGenerator<int> gen = Values(42); 388 389 const int expected_values[] = {42}; 390 VerifyGenerator(gen, expected_values); 391 } 392 393 // Tests that Bool() generates sequence (false, true). 394 TEST(BoolTest, BoolWorks) { 395 const ParamGenerator<bool> gen = Bool(); 396 397 const bool expected_values[] = {false, true}; 398 VerifyGenerator(gen, expected_values); 399 } 400 401 #if GTEST_HAS_COMBINE 402 403 template <typename T1, typename T2> 404 ::std::ostream& operator<<(::std::ostream& stream, const tuple<T1, T2>& value) { 405 stream << "(" << get<0>(value) << ", " << get<1>(value) << ")"; 406 return stream; 407 } 408 409 template <typename T1, typename T2, typename T3> 410 ::std::ostream& operator<<(::std::ostream& stream, 411 const tuple<T1, T2, T3>& value) { 412 stream << "(" << get<0>(value) << ", " << get<1>(value) 413 << ", "<< get<2>(value) << ")"; 414 return stream; 415 } 416 417 template <typename T1, typename T2, typename T3, typename T4, typename T5, 418 typename T6, typename T7, typename T8, typename T9, typename T10> 419 ::std::ostream& operator<<( 420 ::std::ostream& stream, 421 const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) { 422 stream << "(" << get<0>(value) << ", " << get<1>(value) 423 << ", "<< get<2>(value) << ", " << get<3>(value) 424 << ", "<< get<4>(value) << ", " << get<5>(value) 425 << ", "<< get<6>(value) << ", " << get<7>(value) 426 << ", "<< get<8>(value) << ", " << get<9>(value) << ")"; 427 return stream; 428 } 429 430 // Tests that Combine() with two parameters generates the expected sequence. 431 TEST(CombineTest, CombineWithTwoParameters) { 432 const char* foo = "foo"; 433 const char* bar = "bar"; 434 const ParamGenerator<tuple<const char*, int> > gen = 435 Combine(Values(foo, bar), Values(3, 4)); 436 437 tuple<const char*, int> expected_values[] = { 438 make_tuple(foo, 3), make_tuple(foo, 4), 439 make_tuple(bar, 3), make_tuple(bar, 4)}; 440 VerifyGenerator(gen, expected_values); 441 } 442 443 // Tests that Combine() with three parameters generates the expected sequence. 444 TEST(CombineTest, CombineWithThreeParameters) { 445 const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1), 446 Values(3, 4), 447 Values(5, 6)); 448 tuple<int, int, int> expected_values[] = { 449 make_tuple(0, 3, 5), make_tuple(0, 3, 6), 450 make_tuple(0, 4, 5), make_tuple(0, 4, 6), 451 make_tuple(1, 3, 5), make_tuple(1, 3, 6), 452 make_tuple(1, 4, 5), make_tuple(1, 4, 6)}; 453 VerifyGenerator(gen, expected_values); 454 } 455 456 // Tests that the Combine() with the first parameter generating a single value 457 // sequence generates a sequence with the number of elements equal to the 458 // number of elements in the sequence generated by the second parameter. 459 TEST(CombineTest, CombineWithFirstParameterSingleValue) { 460 const ParamGenerator<tuple<int, int> > gen = Combine(Values(42), 461 Values(0, 1)); 462 463 tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)}; 464 VerifyGenerator(gen, expected_values); 465 } 466 467 // Tests that the Combine() with the second parameter generating a single value 468 // sequence generates a sequence with the number of elements equal to the 469 // number of elements in the sequence generated by the first parameter. 470 TEST(CombineTest, CombineWithSecondParameterSingleValue) { 471 const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1), 472 Values(42)); 473 474 tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)}; 475 VerifyGenerator(gen, expected_values); 476 } 477 478 // Tests that when the first parameter produces an empty sequence, 479 // Combine() produces an empty sequence, too. 480 TEST(CombineTest, CombineWithFirstParameterEmptyRange) { 481 const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0), 482 Values(0, 1)); 483 VerifyGeneratorIsEmpty(gen); 484 } 485 486 // Tests that when the second parameter produces an empty sequence, 487 // Combine() produces an empty sequence, too. 488 TEST(CombineTest, CombineWithSecondParameterEmptyRange) { 489 const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1), 490 Range(1, 1)); 491 VerifyGeneratorIsEmpty(gen); 492 } 493 494 // Edge case. Tests that combine works with the maximum number 495 // of parameters supported by Google Test (currently 10). 496 TEST(CombineTest, CombineWithMaxNumberOfParameters) { 497 const char* foo = "foo"; 498 const char* bar = "bar"; 499 const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int, 500 int, int> > gen = Combine(Values(foo, bar), 501 Values(1), Values(2), 502 Values(3), Values(4), 503 Values(5), Values(6), 504 Values(7), Values(8), 505 Values(9)); 506 507 tuple<const char*, int, int, int, int, int, int, int, int, int> 508 expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9), 509 make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)}; 510 VerifyGenerator(gen, expected_values); 511 } 512 513 #endif // GTEST_HAS_COMBINE 514 515 // Tests that an generator produces correct sequence after being 516 // assigned from another generator. 517 TEST(ParamGeneratorTest, AssignmentWorks) { 518 ParamGenerator<int> gen = Values(1, 2); 519 const ParamGenerator<int> gen2 = Values(3, 4); 520 gen = gen2; 521 522 const int expected_values[] = {3, 4}; 523 VerifyGenerator(gen, expected_values); 524 } 525 526 // This test verifies that the tests are expanded and run as specified: 527 // one test per element from the sequence produced by the generator 528 // specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's 529 // fixture constructor, SetUp(), and TearDown() have run and have been 530 // supplied with the correct parameters. 531 532 // The use of environment object allows detection of the case where no test 533 // case functionality is run at all. In this case TestCaseTearDown will not 534 // be able to detect missing tests, naturally. 535 template <int kExpectedCalls> 536 class TestGenerationEnvironment : public ::testing::Environment { 537 public: 538 static TestGenerationEnvironment* Instance() { 539 static TestGenerationEnvironment* instance = new TestGenerationEnvironment; 540 return instance; 541 } 542 543 void FixtureConstructorExecuted() { fixture_constructor_count_++; } 544 void SetUpExecuted() { set_up_count_++; } 545 void TearDownExecuted() { tear_down_count_++; } 546 void TestBodyExecuted() { test_body_count_++; } 547 548 virtual void TearDown() { 549 // If all MultipleTestGenerationTest tests have been de-selected 550 // by the filter flag, the following checks make no sense. 551 bool perform_check = false; 552 553 for (int i = 0; i < kExpectedCalls; ++i) { 554 Message msg; 555 msg << "TestsExpandedAndRun/" << i; 556 if (UnitTestOptions::FilterMatchesTest( 557 "TestExpansionModule/MultipleTestGenerationTest", 558 msg.GetString().c_str())) { 559 perform_check = true; 560 } 561 } 562 if (perform_check) { 563 EXPECT_EQ(kExpectedCalls, fixture_constructor_count_) 564 << "Fixture constructor of ParamTestGenerationTest test case " 565 << "has not been run as expected."; 566 EXPECT_EQ(kExpectedCalls, set_up_count_) 567 << "Fixture SetUp method of ParamTestGenerationTest test case " 568 << "has not been run as expected."; 569 EXPECT_EQ(kExpectedCalls, tear_down_count_) 570 << "Fixture TearDown method of ParamTestGenerationTest test case " 571 << "has not been run as expected."; 572 EXPECT_EQ(kExpectedCalls, test_body_count_) 573 << "Test in ParamTestGenerationTest test case " 574 << "has not been run as expected."; 575 } 576 } 577 private: 578 TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0), 579 tear_down_count_(0), test_body_count_(0) {} 580 581 int fixture_constructor_count_; 582 int set_up_count_; 583 int tear_down_count_; 584 int test_body_count_; 585 586 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment); 587 }; 588 589 const int test_generation_params[] = {36, 42, 72}; 590 591 class TestGenerationTest : public TestWithParam<int> { 592 public: 593 enum { 594 PARAMETER_COUNT = 595 sizeof(test_generation_params)/sizeof(test_generation_params[0]) 596 }; 597 598 typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment; 599 600 TestGenerationTest() { 601 Environment::Instance()->FixtureConstructorExecuted(); 602 current_parameter_ = GetParam(); 603 } 604 virtual void SetUp() { 605 Environment::Instance()->SetUpExecuted(); 606 EXPECT_EQ(current_parameter_, GetParam()); 607 } 608 virtual void TearDown() { 609 Environment::Instance()->TearDownExecuted(); 610 EXPECT_EQ(current_parameter_, GetParam()); 611 } 612 613 static void SetUpTestCase() { 614 bool all_tests_in_test_case_selected = true; 615 616 for (int i = 0; i < PARAMETER_COUNT; ++i) { 617 Message test_name; 618 test_name << "TestsExpandedAndRun/" << i; 619 if ( !UnitTestOptions::FilterMatchesTest( 620 "TestExpansionModule/MultipleTestGenerationTest", 621 test_name.GetString())) { 622 all_tests_in_test_case_selected = false; 623 } 624 } 625 EXPECT_TRUE(all_tests_in_test_case_selected) 626 << "When running the TestGenerationTest test case all of its tests\n" 627 << "must be selected by the filter flag for the test case to pass.\n" 628 << "If not all of them are enabled, we can't reliably conclude\n" 629 << "that the correct number of tests have been generated."; 630 631 collected_parameters_.clear(); 632 } 633 634 static void TearDownTestCase() { 635 vector<int> expected_values(test_generation_params, 636 test_generation_params + PARAMETER_COUNT); 637 // Test execution order is not guaranteed by Google Test, 638 // so the order of values in collected_parameters_ can be 639 // different and we have to sort to compare. 640 sort(expected_values.begin(), expected_values.end()); 641 sort(collected_parameters_.begin(), collected_parameters_.end()); 642 643 EXPECT_TRUE(collected_parameters_ == expected_values); 644 } 645 protected: 646 int current_parameter_; 647 static vector<int> collected_parameters_; 648 649 private: 650 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest); 651 }; 652 vector<int> TestGenerationTest::collected_parameters_; 653 654 TEST_P(TestGenerationTest, TestsExpandedAndRun) { 655 Environment::Instance()->TestBodyExecuted(); 656 EXPECT_EQ(current_parameter_, GetParam()); 657 collected_parameters_.push_back(GetParam()); 658 } 659 INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest, 660 ValuesIn(test_generation_params)); 661 662 // This test verifies that the element sequence (third parameter of 663 // INSTANTIATE_TEST_CASE_P) is evaluated in RUN_ALL_TESTS and not at the call 664 // site of INSTANTIATE_TEST_CASE_P. 665 // For that, we declare param_value_ to be a static member of 666 // GeneratorEvaluationTest and initialize it to 0. We set it to 1 in main(), 667 // just before invocation of RUN_ALL_TESTS. If the sequence is evaluated 668 // before that moment, INSTANTIATE_TEST_CASE_P will create a test with 669 // parameter 0, and the test body will fail the assertion. 670 class GeneratorEvaluationTest : public TestWithParam<int> { 671 public: 672 static int param_value() { return param_value_; } 673 static void set_param_value(int param_value) { param_value_ = param_value; } 674 675 private: 676 static int param_value_; 677 }; 678 int GeneratorEvaluationTest::param_value_ = 0; 679 680 TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) { 681 EXPECT_EQ(1, GetParam()); 682 } 683 INSTANTIATE_TEST_CASE_P(GenEvalModule, 684 GeneratorEvaluationTest, 685 Values(GeneratorEvaluationTest::param_value())); 686 687 // Tests that generators defined in a different translation unit are 688 // functional. Generator extern_gen is defined in gtest-param-test_test2.cc. 689 extern ParamGenerator<int> extern_gen; 690 class ExternalGeneratorTest : public TestWithParam<int> {}; 691 TEST_P(ExternalGeneratorTest, ExternalGenerator) { 692 // Sequence produced by extern_gen contains only a single value 693 // which we verify here. 694 EXPECT_EQ(GetParam(), 33); 695 } 696 INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule, 697 ExternalGeneratorTest, 698 extern_gen); 699 700 // Tests that a parameterized test case can be defined in one translation 701 // unit and instantiated in another. This test will be instantiated in 702 // gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is 703 // defined in gtest-param-test_test.h. 704 TEST_P(ExternalInstantiationTest, IsMultipleOf33) { 705 EXPECT_EQ(0, GetParam() % 33); 706 } 707 708 // Tests that a parameterized test case can be instantiated with multiple 709 // generators. 710 class MultipleInstantiationTest : public TestWithParam<int> {}; 711 TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) { 712 } 713 INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2)); 714 INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5)); 715 716 // Tests that a parameterized test case can be instantiated 717 // in multiple translation units. This test will be instantiated 718 // here and in gtest-param-test_test2.cc. 719 // InstantiationInMultipleTranslationUnitsTest fixture class 720 // is defined in gtest-param-test_test.h. 721 TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) { 722 EXPECT_EQ(0, GetParam() % 42); 723 } 724 INSTANTIATE_TEST_CASE_P(Sequence1, 725 InstantiationInMultipleTranslaionUnitsTest, 726 Values(42, 42*2)); 727 728 // Tests that each iteration of parameterized test runs in a separate test 729 // object. 730 class SeparateInstanceTest : public TestWithParam<int> { 731 public: 732 SeparateInstanceTest() : count_(0) {} 733 734 static void TearDownTestCase() { 735 EXPECT_GE(global_count_, 2) 736 << "If some (but not all) SeparateInstanceTest tests have been " 737 << "filtered out this test will fail. Make sure that all " 738 << "GeneratorEvaluationTest are selected or de-selected together " 739 << "by the test filter."; 740 } 741 742 protected: 743 int count_; 744 static int global_count_; 745 }; 746 int SeparateInstanceTest::global_count_ = 0; 747 748 TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) { 749 EXPECT_EQ(0, count_++); 750 global_count_++; 751 } 752 INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4)); 753 754 // Tests that all instantiations of a test have named appropriately. Test 755 // defined with TEST_P(TestCaseName, TestName) and instantiated with 756 // INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named 757 // SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the 758 // sequence element used to instantiate the test. 759 class NamingTest : public TestWithParam<int> {}; 760 761 TEST_P(NamingTest, TestsAreNamedAppropriately) { 762 const ::testing::TestInfo* const test_info = 763 ::testing::UnitTest::GetInstance()->current_test_info(); 764 765 EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name()); 766 767 Message msg; 768 msg << "TestsAreNamedAppropriately/" << GetParam(); 769 EXPECT_STREQ(msg.GetString().c_str(), test_info->name()); 770 } 771 772 INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5)); 773 774 #endif // GTEST_HAS_PARAM_TEST 775 776 TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) { 777 #if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST 778 FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n" 779 #endif 780 } 781 782 int main(int argc, char **argv) { 783 #if GTEST_HAS_PARAM_TEST 784 // Used in TestGenerationTest test case. 785 AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance()); 786 // Used in GeneratorEvaluationTest test case. 787 GeneratorEvaluationTest::set_param_value(1); 788 #endif // GTEST_HAS_PARAM_TEST 789 790 testing::InitGoogleTest(&argc, argv); 791 return RUN_ALL_TESTS(); 792 } 793