tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }