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
52using ::std::vector;
53using ::std::sort;
54
55using ::testing::AddGlobalTestEnvironment;
56using ::testing::Bool;
57using ::testing::Message;
58using ::testing::Range;
59using ::testing::TestWithParam;
60using ::testing::Values;
61using ::testing::ValuesIn;
62
63#if GTEST_HAS_COMBINE
64using ::testing::Combine;
65using ::std::tr1::get;
66using ::std::tr1::make_tuple;
67using ::std::tr1::tuple;
68#endif  // GTEST_HAS_COMBINE
69
70using ::testing::internal::ParamGenerator;
71using ::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.
76template <typename T, size_t N>
77void 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
112template <typename T>
113void 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.
130TEST(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.
165TEST(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.
173TEST(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.
181TEST(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.
188TEST(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.
198TEST(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<().
206class DogAdder {
207 public:
208  explicit DogAdder(const char* value) : value_(value) {}
209  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
210
211  DogAdder operator=(const DogAdder& other) {
212    if (this != &other)
213      value_ = other.value_;
214    return *this;
215  }
216  DogAdder operator+(const DogAdder& other) const {
217    Message msg;
218    msg << value_.c_str() << other.value_.c_str();
219    return DogAdder(msg.GetString().c_str());
220  }
221  bool operator<(const DogAdder& other) const {
222    return value_ < other.value_;
223  }
224  const ::testing::internal::String& value() const { return value_; }
225
226 private:
227  ::testing::internal::String value_;
228};
229
230TEST(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
244class IntWrapper {
245 public:
246  explicit IntWrapper(int value) : value_(value) {}
247  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
248
249  IntWrapper operator=(const IntWrapper& other) {
250    value_ = other.value_;
251    return *this;
252  }
253  // operator+() adds a different type.
254  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
255  bool operator<(const IntWrapper& other) const {
256    return value_ < other.value_;
257  }
258  int value() const { return value_; }
259
260 private:
261  int value_;
262};
263
264TEST(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.
279TEST(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.
287TEST(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.
295TEST(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).
303TEST(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.
316TEST(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.
330TEST(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.
342TEST(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.
351TEST(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.
360TEST(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
367TEST(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.
386TEST(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).
394TEST(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
403template <typename T1, typename T2>
404::std::ostream& operator<<(::std::ostream& stream, const tuple<T1, T2>& value) {
405  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
406  return stream;
407}
408
409template <typename T1, typename T2, typename T3>
410::std::ostream& operator<<(::std::ostream& stream,
411                           const tuple<T1, T2, T3>& value) {
412  stream << "(" << get<0>(value) << ", " << get<1>(value)
413         << ", "<< get<2>(value) << ")";
414  return stream;
415}
416
417template <typename T1, typename T2, typename T3, typename T4, typename T5,
418          typename T6, typename T7, typename T8, typename T9, typename T10>
419::std::ostream& operator<<(
420    ::std::ostream& stream,
421    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
422  stream << "(" << get<0>(value) << ", " << get<1>(value)
423         << ", "<< get<2>(value) << ", " << get<3>(value)
424         << ", "<< get<4>(value) << ", " << get<5>(value)
425         << ", "<< get<6>(value) << ", " << get<7>(value)
426         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
427  return stream;
428}
429
430// Tests that Combine() with two parameters generates the expected sequence.
431TEST(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.
444TEST(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.
459TEST(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.
470TEST(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.
480TEST(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.
488TEST(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).
496TEST(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.
517TEST(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.
535template <int kExpectedCalls>
536class TestGenerationEnvironment : public ::testing::Environment {
537 public:
538  static TestGenerationEnvironment* Instance() {
539    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
540    return instance;
541  }
542
543  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
544  void SetUpExecuted() { set_up_count_++; }
545  void TearDownExecuted() { tear_down_count_++; }
546  void TestBodyExecuted() { test_body_count_++; }
547
548  virtual void TearDown() {
549    // If all MultipleTestGenerationTest tests have been de-selected
550    // by the filter flag, the following checks make no sense.
551    bool perform_check = false;
552
553    for (int i = 0; i < kExpectedCalls; ++i) {
554      Message msg;
555      msg << "TestsExpandedAndRun/" << i;
556      if (UnitTestOptions::FilterMatchesTest(
557             "TestExpansionModule/MultipleTestGenerationTest",
558              msg.GetString().c_str())) {
559        perform_check = true;
560      }
561    }
562    if (perform_check) {
563      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
564          << "Fixture constructor of ParamTestGenerationTest test case "
565          << "has not been run as expected.";
566      EXPECT_EQ(kExpectedCalls, set_up_count_)
567          << "Fixture SetUp method of ParamTestGenerationTest test case "
568          << "has not been run as expected.";
569      EXPECT_EQ(kExpectedCalls, tear_down_count_)
570          << "Fixture TearDown method of ParamTestGenerationTest test case "
571          << "has not been run as expected.";
572      EXPECT_EQ(kExpectedCalls, test_body_count_)
573          << "Test in ParamTestGenerationTest test case "
574          << "has not been run as expected.";
575    }
576  }
577 private:
578  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
579                                tear_down_count_(0), test_body_count_(0) {}
580
581  int fixture_constructor_count_;
582  int set_up_count_;
583  int tear_down_count_;
584  int test_body_count_;
585
586  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
587};
588
589const int test_generation_params[] = {36, 42, 72};
590
591class TestGenerationTest : public TestWithParam<int> {
592 public:
593  enum {
594    PARAMETER_COUNT =
595        sizeof(test_generation_params)/sizeof(test_generation_params[0])
596  };
597
598  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
599
600  TestGenerationTest() {
601    Environment::Instance()->FixtureConstructorExecuted();
602    current_parameter_ = GetParam();
603  }
604  virtual void SetUp() {
605    Environment::Instance()->SetUpExecuted();
606    EXPECT_EQ(current_parameter_, GetParam());
607  }
608  virtual void TearDown() {
609    Environment::Instance()->TearDownExecuted();
610    EXPECT_EQ(current_parameter_, GetParam());
611  }
612
613  static void SetUpTestCase() {
614    bool all_tests_in_test_case_selected = true;
615
616    for (int i = 0; i < PARAMETER_COUNT; ++i) {
617      Message test_name;
618      test_name << "TestsExpandedAndRun/" << i;
619      if ( !UnitTestOptions::FilterMatchesTest(
620                "TestExpansionModule/MultipleTestGenerationTest",
621                test_name.GetString())) {
622        all_tests_in_test_case_selected = false;
623      }
624    }
625    EXPECT_TRUE(all_tests_in_test_case_selected)
626        << "When running the TestGenerationTest test case all of its tests\n"
627        << "must be selected by the filter flag for the test case to pass.\n"
628        << "If not all of them are enabled, we can't reliably conclude\n"
629        << "that the correct number of tests have been generated.";
630
631    collected_parameters_.clear();
632  }
633
634  static void TearDownTestCase() {
635    vector<int> expected_values(test_generation_params,
636                                test_generation_params + PARAMETER_COUNT);
637    // Test execution order is not guaranteed by Google Test,
638    // so the order of values in collected_parameters_ can be
639    // different and we have to sort to compare.
640    sort(expected_values.begin(), expected_values.end());
641    sort(collected_parameters_.begin(), collected_parameters_.end());
642
643    EXPECT_TRUE(collected_parameters_ == expected_values);
644  }
645 protected:
646  int current_parameter_;
647  static vector<int> collected_parameters_;
648
649 private:
650  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
651};
652vector<int> TestGenerationTest::collected_parameters_;
653
654TEST_P(TestGenerationTest, TestsExpandedAndRun) {
655  Environment::Instance()->TestBodyExecuted();
656  EXPECT_EQ(current_parameter_, GetParam());
657  collected_parameters_.push_back(GetParam());
658}
659INSTANTIATE_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.
670class GeneratorEvaluationTest : public TestWithParam<int> {
671 public:
672  static int param_value() { return param_value_; }
673  static void set_param_value(int param_value) { param_value_ = param_value; }
674
675 private:
676  static int param_value_;
677};
678int GeneratorEvaluationTest::param_value_ = 0;
679
680TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
681  EXPECT_EQ(1, GetParam());
682}
683INSTANTIATE_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.
689extern ParamGenerator<int> extern_gen;
690class ExternalGeneratorTest : public TestWithParam<int> {};
691TEST_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}
696INSTANTIATE_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.
704TEST_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.
710class MultipleInstantiationTest : public TestWithParam<int> {};
711TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
712}
713INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
714INSTANTIATE_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.
721TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
722  EXPECT_EQ(0, GetParam() % 42);
723}
724INSTANTIATE_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.
730class SeparateInstanceTest : public TestWithParam<int> {
731 public:
732  SeparateInstanceTest() : count_(0) {}
733
734  static void TearDownTestCase() {
735    EXPECT_GE(global_count_, 2)
736        << "If some (but not all) SeparateInstanceTest tests have been "
737        << "filtered out this test will fail. Make sure that all "
738        << "GeneratorEvaluationTest are selected or de-selected together "
739        << "by the test filter.";
740  }
741
742 protected:
743  int count_;
744  static int global_count_;
745};
746int SeparateInstanceTest::global_count_ = 0;
747
748TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
749  EXPECT_EQ(0, count_++);
750  global_count_++;
751}
752INSTANTIATE_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.
759class NamingTest : public TestWithParam<int> {};
760
761TEST_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
772INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
773
774#endif  // GTEST_HAS_PARAM_TEST
775
776TEST(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
782int 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