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