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>
PrintValue(const T & value)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>
VerifyGenerator(const ParamGenerator<T> & generator,const T (& expected_values)[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>
VerifyGeneratorIsEmpty(const ParamGenerator<T> & generator)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.
TEST(IteratorTest,ParamIteratorConformsToForwardIteratorConcept)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.
TEST(RangeTest,IntRangeWithDefaultStep)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.
TEST(RangeTest,IntRangeSingleValue)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.
TEST(RangeTest,IntRangeEmpty)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.
TEST(RangeTest,IntRangeWithCustomStep)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.
TEST(RangeTest,IntRangeWithCustomStepOverUpperBound)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:
DogAdder(const char * a_value)215   explicit DogAdder(const char* a_value) : value_(a_value) {}
DogAdder(const DogAdder & other)216   DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
217 
operator =(const DogAdder & other)218   DogAdder operator=(const DogAdder& other) {
219     if (this != &other)
220       value_ = other.value_;
221     return *this;
222   }
operator +(const DogAdder & other) const223   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   }
operator <(const DogAdder & other) const228   bool operator<(const DogAdder& other) const {
229     return value_ < other.value_;
230   }
value() const231   const std::string& value() const { return value_; }
232 
233  private:
234   std::string value_;
235 };
236 
TEST(RangeTest,WorksWithACustomType)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:
IntWrapper(int a_value)253   explicit IntWrapper(int a_value) : value_(a_value) {}
IntWrapper(const IntWrapper & other)254   IntWrapper(const IntWrapper& other) : value_(other.value_) {}
255 
operator =(const IntWrapper & other)256   IntWrapper operator=(const IntWrapper& other) {
257     value_ = other.value_;
258     return *this;
259   }
260   // operator+() adds a different type.
operator +(int other) const261   IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
operator <(const IntWrapper & other) const262   bool operator<(const IntWrapper& other) const {
263     return value_ < other.value_;
264   }
value() const265   int value() const { return value_; }
266 
267  private:
268   int value_;
269 };
270 
TEST(RangeTest,WorksWithACustomTypeWithDifferentIncrementType)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.
TEST(ValuesInTest,ValuesInArray)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.
TEST(ValuesInTest,ValuesInConstArray)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.
TEST(ValuesInTest,ValuesInSingleElementArray)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).
TEST(ValuesInTest,ValuesInVector)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.
TEST(ValuesInTest,ValuesInIteratorRange)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.
TEST(ValuesInTest,ValuesInSingleElementIteratorRange)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.
TEST(ValuesInTest,ValuesInEmptyIteratorRange)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.
TEST(ValuesTest,ValuesWorks)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.
TEST(ValuesTest,ValuesWorksForValuesOfCompatibleTypes)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 
TEST(ValuesTest,ValuesWorksForMaxLengthList)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.
TEST(ValuesTest,ValuesWithSingleParameter)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).
TEST(BoolTest,BoolWorks)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.
TEST(CombineTest,CombineWithTwoParameters)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.
TEST(CombineTest,CombineWithThreeParameters)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.
TEST(CombineTest,CombineWithFirstParameterSingleValue)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.
TEST(CombineTest,CombineWithSecondParameterSingleValue)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.
TEST(CombineTest,CombineWithFirstParameterEmptyRange)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.
TEST(CombineTest,CombineWithSecondParameterEmptyRange)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).
TEST(CombineTest,CombineWithMaxNumberOfParameters)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:
NonDefaultConstructAssignString(const std::string & s)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 
str() const500   const std::string& str() const { return str_; }
501 
502  private:
503   std::string str_;
504 };
505 
TEST(CombineTest,NonDefaultConstructAssign)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.
TEST(ParamGeneratorTest,AssignmentWorks)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:
Instance()557   static TestGenerationEnvironment* Instance() {
558     static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
559     return instance;
560   }
561 
FixtureConstructorExecuted()562   void FixtureConstructorExecuted() { fixture_constructor_count_++; }
SetUpExecuted()563   void SetUpExecuted() { set_up_count_++; }
TearDownExecuted()564   void TearDownExecuted() { tear_down_count_++; }
TestBodyExecuted()565   void TestBodyExecuted() { test_body_count_++; }
566 
TearDown()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:
TestGenerationEnvironment()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 
TestGenerationTest()620   TestGenerationTest() {
621     Environment::Instance()->FixtureConstructorExecuted();
622     current_parameter_ = GetParam();
623   }
SetUp()624   void SetUp() override {
625     Environment::Instance()->SetUpExecuted();
626     EXPECT_EQ(current_parameter_, GetParam());
627   }
TearDown()628   void TearDown() override {
629     Environment::Instance()->TearDownExecuted();
630     EXPECT_EQ(current_parameter_, GetParam());
631   }
632 
SetUpTestSuite()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 
TearDownTestSuite()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 
TEST_P(TestGenerationTest,TestsExpandedAndRun)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:
param_value()695   static int param_value() { return param_value_; }
set_param_value(int 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 
TEST_P(GeneratorEvaluationTest,GeneratorsEvaluatedInMain)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> {};
TEST_P(ExternalGeneratorTest,ExternalGenerator)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.
TEST_P(ExternalInstantiationTest,IsMultipleOf33)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> {};
TEST_P(MultipleInstantiationTest,AllowsMultipleInstances)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.
TEST_P(InstantiationInMultipleTranslationUnitsTest,IsMultipleOf42)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:
SeparateInstanceTest()752   SeparateInstanceTest() : count_(0) {}
753 
TearDownTestSuite()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 
TEST_P(SeparateInstanceTest,TestsRunInSeparateInstances)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 
TEST_P(NamingTest,TestsReportCorrectNamesAndParameters)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 
TEST_P(PREFIX_WITH_MACRO (NamingTest),PREFIX_WITH_FOO (SomeTestName))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 
TEST_F(PREFIX_WITH_MACRO (NamingTestNonParametrized),PREFIX_WITH_FOO (SomeTestName))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 
TEST(MacroNameing,LookupNames)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> {};
TEST_P(CustomFunctorNamingTest,CustomTestNames)859 TEST_P(CustomFunctorNamingTest, CustomTestNames) {}
860 
861 struct CustomParamNameFunctor {
operator ()CustomParamNameFunctor862   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 
CustomParamNameFunction(const::testing::TestParamInfo<std::string> & inf)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> {};
TEST_P(CustomFunctionNamingTest,CustomTestNames)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> {};
TEST_P(CustomLambdaNamingTest,CustomTestNames)895 TEST_P(CustomLambdaNamingTest, CustomTestNames) {}
896 
897 INSTANTIATE_TEST_SUITE_P(CustomParamNameLambda, CustomLambdaNamingTest,
898                          Values(std::string("LambdaName")),
__anon719bbd480202(const ::testing::TestParamInfo<std::string>& inf) 899                          [](const ::testing::TestParamInfo<std::string>& inf) {
900                            return inf.param;
901                          });
902 
TEST(CustomNamingTest,CheckNameRegistry)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 
TEST_P(CustomIntegerNamingTest,TestsReportCorrectNames)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 {
CustomStructCustomStruct939   explicit CustomStruct(int value) : x(value) {}
940   int x;
941 };
942 
operator <<(std::ostream & stream,const CustomStruct & val)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 
TEST_P(CustomStructNamingTest,TestsReportCorrectNames)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 {
StatefulNamingFunctorStatefulNamingFunctor965   StatefulNamingFunctor() : sum(0) {}
operator ()StatefulNamingFunctor966   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:
StatefulNamingTest()976   StatefulNamingTest() : sum_(0) {}
977   int sum_;
978 };
979 
TEST_P(StatefulNamingTest,TestsReportCorrectNames)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:
Unstreamable(int value)998   explicit Unstreamable(int value) : value_(value) {}
999   // -Wunused-private-field: dummy accessor for `value_`.
dummy_value() const1000   const int& dummy_value() const { return value_; }
1001 
1002  private:
1003   int value_;
1004 };
1005 
1006 class CommentTest : public TestWithParam<Unstreamable> {};
1007 
TEST_P(CommentTest,TestsCorrectlyReportUnstreamableParams)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:
NonParameterizedBaseTest()1024   NonParameterizedBaseTest() : n_(17) { }
1025  protected:
1026   int n_;
1027 };
1028 
1029 class ParameterizedDerivedTest : public NonParameterizedBaseTest,
1030                                  public ::testing::WithParamInterface<int> {
1031  protected:
ParameterizedDerivedTest()1032   ParameterizedDerivedTest() : count_(0) { }
1033   int count_;
1034   static int global_count_;
1035 };
1036 
1037 int ParameterizedDerivedTest::global_count_ = 0;
1038 
TEST_F(NonParameterizedBaseTest,FixtureIsInitialized)1039 TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
1040   EXPECT_EQ(17, n_);
1041 }
1042 
TEST_P(ParameterizedDerivedTest,SeesSequence)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 
TEST_F(ParameterizedDeathTest,GetParamDiesFromTestF)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 
TEST_P(MyEnumTest,ChecksParamMoreThanZero)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 
TEST_P(NotInstantiatedTest,Used)1087 TEST_P(NotInstantiatedTest, Used) { }
1088 
1089 using OtherName = NotInstantiatedTest;
1090 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(OtherName);
TEST_P(OtherName,Used)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 
TYPED_TEST_P(NotInstantiatedTypeTest,Used)1100 TYPED_TEST_P(NotInstantiatedTypeTest, Used) { }
1101 REGISTER_TYPED_TEST_SUITE_P(NotInstantiatedTypeTest, Used);
1102 }  // namespace works_here
1103 
main(int argc,char ** argv)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 }
1120