023aa46d69f939cfa853ca022725982cbf14d55f
[platform/upstream/gtest.git] / googletest / test / googletest-param-test-test.cc
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 }