Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
googletest-param-test-test.cc
Go to the documentation of this file.
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 
36 
37 #include <algorithm>
38 #include <iostream>
39 #include <list>
40 #include <set>
41 #include <sstream>
42 #include <string>
43 #include <tuple>
44 #include <vector>
45 
46 #include "gtest/gtest.h"
47 #include "src/gtest-internal-inl.h" // for UnitTestOptions
48 
49 using ::std::sort;
50 using ::std::vector;
51 
56 using ::testing::Message;
58 using ::testing::TestWithParam;
61 
62 using ::testing::internal::ParamGenerator;
63 using ::testing::internal::UnitTestOptions;
64 
65 // Prints a value to a string.
66 //
67 // FIXME: remove PrintValue() when we move matchers and
68 // EXPECT_THAT() from Google Mock to Google Test. At that time, we
69 // can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
70 // EXPECT_THAT() and the matchers know how to print tuples.
71 template <typename T>
72 ::std::string PrintValue(const T& value) {
73  return testing::PrintToString(value);
74 }
75 
76 // Verifies that a sequence generated by the generator and accessed
77 // via the iterator object matches the expected one using Google Test
78 // assertions.
79 template <typename T, size_t N>
80 void VerifyGenerator(const ParamGenerator<T>& generator,
81  const T (&expected_values)[N]) {
82  typename ParamGenerator<T>::iterator it = generator.begin();
83  for (size_t i = 0; i < N; ++i) {
84  ASSERT_FALSE(it == generator.end())
85  << "At element " << i << " when accessing via an iterator "
86  << "created with the copy constructor.\n";
87  // We cannot use EXPECT_EQ() here as the values may be tuples,
88  // which don't support <<.
89  EXPECT_TRUE(expected_values[i] == *it)
90  << "where i is " << i << ", expected_values[i] is "
91  << PrintValue(expected_values[i]) << ", *it is " << PrintValue(*it)
92  << ", and 'it' is an iterator created with the copy constructor.\n";
93  ++it;
94  }
95  EXPECT_TRUE(it == generator.end())
96  << "At the presumed end of sequence when accessing via an iterator "
97  << "created with the copy constructor.\n";
98 
99  // Test the iterator assignment. The following lines verify that
100  // the sequence accessed via an iterator initialized via the
101  // assignment operator (as opposed to a copy constructor) matches
102  // just the same.
103  it = generator.begin();
104  for (size_t i = 0; i < N; ++i) {
105  ASSERT_FALSE(it == generator.end())
106  << "At element " << i << " when accessing via an iterator "
107  << "created with the assignment operator.\n";
108  EXPECT_TRUE(expected_values[i] == *it)
109  << "where i is " << i << ", expected_values[i] is "
110  << PrintValue(expected_values[i]) << ", *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);
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) value_ = other.value_;
220  return *this;
221  }
222  DogAdder operator+(const DogAdder& other) const {
223  Message msg;
224  msg << value_ << other.value_;
225  return DogAdder(msg.GetString().c_str());
226  }
227  bool operator<(const DogAdder& other) const { return value_ < other.value_; }
228  const std::string& value() const { return value_; }
229 
230  private:
231  std::string value_;
232 };
233 
234 TEST(RangeTest, WorksWithACustomType) {
235  const ParamGenerator<DogAdder> gen =
236  Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
237  ParamGenerator<DogAdder>::iterator it = gen.begin();
238 
239  ASSERT_FALSE(it == gen.end());
240  EXPECT_STREQ("cat", it->value().c_str());
241 
242  ASSERT_FALSE(++it == gen.end());
243  EXPECT_STREQ("catdog", it->value().c_str());
244 
245  EXPECT_TRUE(++it == gen.end());
246 }
247 
248 class IntWrapper {
249  public:
250  explicit IntWrapper(int a_value) : value_(a_value) {}
251  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
252 
254  value_ = other.value_;
255  return *this;
256  }
257  // operator+() adds a different type.
258  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
259  bool operator<(const IntWrapper& other) const {
260  return value_ < other.value_;
261  }
262  int value() const { return value_; }
263 
264  private:
265  int value_;
266 };
267 
268 TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
269  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
270  ParamGenerator<IntWrapper>::iterator it = gen.begin();
271 
272  ASSERT_FALSE(it == gen.end());
273  EXPECT_EQ(0, it->value());
274 
275  ASSERT_FALSE(++it == gen.end());
276  EXPECT_EQ(1, it->value());
277 
278  EXPECT_TRUE(++it == gen.end());
279 }
280 
281 // Tests that ValuesIn() with an array parameter generates
282 // the expected sequence.
283 TEST(ValuesInTest, ValuesInArray) {
284  int array[] = {3, 5, 8};
285  const ParamGenerator<int> gen = ValuesIn(array);
286  VerifyGenerator(gen, array);
287 }
288 
289 // Tests that ValuesIn() with a const array parameter generates
290 // the expected sequence.
291 TEST(ValuesInTest, ValuesInConstArray) {
292  const int array[] = {3, 5, 8};
293  const ParamGenerator<int> gen = ValuesIn(array);
294  VerifyGenerator(gen, array);
295 }
296 
297 // Edge case. Tests that ValuesIn() with an array parameter containing a
298 // single element generates the single element sequence.
299 TEST(ValuesInTest, ValuesInSingleElementArray) {
300  int array[] = {42};
301  const ParamGenerator<int> gen = ValuesIn(array);
302  VerifyGenerator(gen, array);
303 }
304 
305 // Tests that ValuesIn() generates the expected sequence for an STL
306 // container (vector).
307 TEST(ValuesInTest, ValuesInVector) {
308  typedef ::std::vector<int> ContainerType;
309  ContainerType values;
310  values.push_back(3);
311  values.push_back(5);
312  values.push_back(8);
313  const ParamGenerator<int> gen = ValuesIn(values);
314 
315  const int expected_values[] = {3, 5, 8};
316  VerifyGenerator(gen, expected_values);
317 }
318 
319 // Tests that ValuesIn() generates the expected sequence.
320 TEST(ValuesInTest, ValuesInIteratorRange) {
321  typedef ::std::vector<int> ContainerType;
322  ContainerType values;
323  values.push_back(3);
324  values.push_back(5);
325  values.push_back(8);
326  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
327 
328  const int expected_values[] = {3, 5, 8};
329  VerifyGenerator(gen, expected_values);
330 }
331 
332 // Edge case. Tests that ValuesIn() provided with an iterator range specifying a
333 // single value generates a single-element sequence.
334 TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
335  typedef ::std::vector<int> ContainerType;
336  ContainerType values;
337  values.push_back(42);
338  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
339 
340  const int expected_values[] = {42};
341  VerifyGenerator(gen, expected_values);
342 }
343 
344 // Edge case. Tests that ValuesIn() provided with an empty iterator range
345 // generates an empty sequence.
346 TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
347  typedef ::std::vector<int> ContainerType;
348  ContainerType values;
349  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
350 
352 }
353 
354 // Tests that the Values() generates the expected sequence.
355 TEST(ValuesTest, ValuesWorks) {
356  const ParamGenerator<int> gen = Values(3, 5, 8);
357 
358  const int expected_values[] = {3, 5, 8};
359  VerifyGenerator(gen, expected_values);
360 }
361 
362 // Tests that Values() generates the expected sequences from elements of
363 // different types convertible to ParamGenerator's parameter type.
364 TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
365  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
366 
367  const double expected_values[] = {3.0, 5.0, 8.0};
368  VerifyGenerator(gen, expected_values);
369 }
370 
371 TEST(ValuesTest, ValuesWorksForMaxLengthList) {
372  const ParamGenerator<int> gen =
373  Values(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150,
374  160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280,
375  290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410,
376  420, 430, 440, 450, 460, 470, 480, 490, 500);
377 
378  const int expected_values[] = {
379  10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130,
380  140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260,
381  270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390,
382  400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
383  VerifyGenerator(gen, expected_values);
384 }
385 
386 // Edge case test. Tests that single-parameter Values() generates the sequence
387 // with the single value.
388 TEST(ValuesTest, ValuesWithSingleParameter) {
389  const ParamGenerator<int> gen = Values(42);
390 
391  const int expected_values[] = {42};
392  VerifyGenerator(gen, expected_values);
393 }
394 
395 // Tests that Bool() generates sequence (false, true).
396 TEST(BoolTest, BoolWorks) {
397  const ParamGenerator<bool> gen = Bool();
398 
399  const bool expected_values[] = {false, true};
400  VerifyGenerator(gen, expected_values);
401 }
402 
403 // Tests that Combine() with two parameters generates the expected sequence.
404 TEST(CombineTest, CombineWithTwoParameters) {
405  const char* foo = "foo";
406  const char* bar = "bar";
407  const ParamGenerator<std::tuple<const char*, int>> gen =
408  Combine(Values(foo, bar), Values(3, 4));
409 
410  std::tuple<const char*, int> expected_values[] = {
411  std::make_tuple(foo, 3), std::make_tuple(foo, 4), std::make_tuple(bar, 3),
412  std::make_tuple(bar, 4)};
413  VerifyGenerator(gen, expected_values);
414 }
415 
416 // Tests that Combine() with three parameters generates the expected sequence.
417 TEST(CombineTest, CombineWithThreeParameters) {
418  const ParamGenerator<std::tuple<int, int, int>> gen =
419  Combine(Values(0, 1), Values(3, 4), Values(5, 6));
420  std::tuple<int, int, int> expected_values[] = {
421  std::make_tuple(0, 3, 5), std::make_tuple(0, 3, 6),
422  std::make_tuple(0, 4, 5), std::make_tuple(0, 4, 6),
423  std::make_tuple(1, 3, 5), std::make_tuple(1, 3, 6),
424  std::make_tuple(1, 4, 5), std::make_tuple(1, 4, 6)};
425  VerifyGenerator(gen, expected_values);
426 }
427 
428 // Tests that the Combine() with the first parameter generating a single value
429 // sequence generates a sequence with the number of elements equal to the
430 // number of elements in the sequence generated by the second parameter.
431 TEST(CombineTest, CombineWithFirstParameterSingleValue) {
432  const ParamGenerator<std::tuple<int, int>> gen =
433  Combine(Values(42), Values(0, 1));
434 
435  std::tuple<int, int> expected_values[] = {std::make_tuple(42, 0),
436  std::make_tuple(42, 1)};
437  VerifyGenerator(gen, expected_values);
438 }
439 
440 // Tests that the Combine() with the second parameter generating a single value
441 // sequence generates a sequence with the number of elements equal to the
442 // number of elements in the sequence generated by the first parameter.
443 TEST(CombineTest, CombineWithSecondParameterSingleValue) {
444  const ParamGenerator<std::tuple<int, int>> gen =
445  Combine(Values(0, 1), Values(42));
446 
447  std::tuple<int, int> expected_values[] = {std::make_tuple(0, 42),
448  std::make_tuple(1, 42)};
449  VerifyGenerator(gen, expected_values);
450 }
451 
452 // Tests that when the first parameter produces an empty sequence,
453 // Combine() produces an empty sequence, too.
454 TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
455  const ParamGenerator<std::tuple<int, int>> gen =
456  Combine(Range(0, 0), Values(0, 1));
458 }
459 
460 // Tests that when the second parameter produces an empty sequence,
461 // Combine() produces an empty sequence, too.
462 TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
463  const ParamGenerator<std::tuple<int, int>> gen =
464  Combine(Values(0, 1), Range(1, 1));
466 }
467 
468 // Edge case. Tests that combine works with the maximum number
469 // of parameters supported by Google Test (currently 10).
470 TEST(CombineTest, CombineWithMaxNumberOfParameters) {
471  const char* foo = "foo";
472  const char* bar = "bar";
473  const ParamGenerator<
474  std::tuple<const char*, int, int, int, int, int, int, int, int, int>>
475  gen =
476  Combine(Values(foo, bar), Values(1), Values(2), Values(3), Values(4),
477  Values(5), Values(6), Values(7), Values(8), Values(9));
478 
479  std::tuple<const char*, int, int, int, int, int, int, int, int, int>
480  expected_values[] = {std::make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
481  std::make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
482  VerifyGenerator(gen, expected_values);
483 }
484 
486  public:
487  NonDefaultConstructAssignString(const std::string& s) : str_(s) {}
490  default;
492  const NonDefaultConstructAssignString&) = delete;
494 
495  const std::string& str() const { return str_; }
496 
497  private:
498  std::string str_;
499 };
500 
501 TEST(CombineTest, NonDefaultConstructAssign) {
502  const ParamGenerator<std::tuple<int, NonDefaultConstructAssignString>> gen =
505 
506  ParamGenerator<std::tuple<int, NonDefaultConstructAssignString>>::iterator
507  it = gen.begin();
508 
509  EXPECT_EQ(0, std::get<0>(*it));
510  EXPECT_EQ("A", std::get<1>(*it).str());
511  ++it;
512 
513  EXPECT_EQ(0, std::get<0>(*it));
514  EXPECT_EQ("B", std::get<1>(*it).str());
515  ++it;
516 
517  EXPECT_EQ(1, std::get<0>(*it));
518  EXPECT_EQ("A", std::get<1>(*it).str());
519  ++it;
520 
521  EXPECT_EQ(1, std::get<0>(*it));
522  EXPECT_EQ("B", std::get<1>(*it).str());
523  ++it;
524 
525  EXPECT_TRUE(it == gen.end());
526 }
527 
528 template <typename T>
530  public:
531  explicit ConstructFromT(const T& t) : t_(t) {}
532  template <typename... Args,
533  typename std::enable_if<sizeof...(Args) != 1, int>::type = 0>
534  ConstructFromT(Args&&... args) : t_(std::forward<Args>(args)...) {}
535 
536  bool operator==(const ConstructFromT& other) const { return other.t_ == t_; }
537 
538  const T& get() const { return t_; }
539 
540  private:
541  T t_;
542 };
543 
544 TEST(ConvertTest, CombineWithTwoParameters) {
545  const char* foo = "foo";
546  const char* bar = "bar";
547  const ParamGenerator<ConstructFromT<std::tuple<const char*, int>>> gen =
548  ConvertGenerator<std::tuple<const char*, int>>(
549  Combine(Values(foo, bar), Values(3, 4)));
550 
551  ConstructFromT<std::tuple<const char*, int>> expected_values[] = {
552  {foo, 3}, {foo, 4}, {bar, 3}, {bar, 4}};
553  VerifyGenerator(gen, expected_values);
554 }
555 
556 TEST(ConvertTest, NonDefaultConstructAssign) {
557  const ParamGenerator<
559  gen = ConvertGenerator<std::tuple<int, NonDefaultConstructAssignString>>(
562 
563  ParamGenerator<ConstructFromT<
564  std::tuple<int, NonDefaultConstructAssignString>>>::iterator it =
565  gen.begin();
566 
567  EXPECT_EQ(0, std::get<0>(it->get()));
568  EXPECT_EQ("A", std::get<1>(it->get()).str());
569  ++it;
570 
571  EXPECT_EQ(0, std::get<0>(it->get()));
572  EXPECT_EQ("B", std::get<1>(it->get()).str());
573  ++it;
574 
575  EXPECT_EQ(1, std::get<0>(it->get()));
576  EXPECT_EQ("A", std::get<1>(it->get()).str());
577  ++it;
578 
579  EXPECT_EQ(1, std::get<0>(it->get()));
580  EXPECT_EQ("B", std::get<1>(it->get()).str());
581  ++it;
582 
583  EXPECT_TRUE(it == gen.end());
584 }
585 
586 // Tests that an generator produces correct sequence after being
587 // assigned from another generator.
588 TEST(ParamGeneratorTest, AssignmentWorks) {
589  ParamGenerator<int> gen = Values(1, 2);
590  const ParamGenerator<int> gen2 = Values(3, 4);
591  gen = gen2;
592 
593  const int expected_values[] = {3, 4};
594  VerifyGenerator(gen, expected_values);
595 }
596 
597 // This test verifies that the tests are expanded and run as specified:
598 // one test per element from the sequence produced by the generator
599 // specified in INSTANTIATE_TEST_SUITE_P. It also verifies that the test's
600 // fixture constructor, SetUp(), and TearDown() have run and have been
601 // supplied with the correct parameters.
602 
603 // The use of environment object allows detection of the case where no test
604 // case functionality is run at all. In this case TearDownTestSuite will not
605 // be able to detect missing tests, naturally.
606 template <int kExpectedCalls>
608  public:
611  return instance;
612  }
613 
618 
619  void TearDown() override {
620  // If all MultipleTestGenerationTest tests have been de-selected
621  // by the filter flag, the following checks make no sense.
622  bool perform_check = false;
623 
624  for (int i = 0; i < kExpectedCalls; ++i) {
625  Message msg;
626  msg << "TestsExpandedAndRun/" << i;
627  if (UnitTestOptions::FilterMatchesTest(
628  "TestExpansionModule/MultipleTestGenerationTest",
629  msg.GetString().c_str())) {
630  perform_check = true;
631  }
632  }
633  if (perform_check) {
634  EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
635  << "Fixture constructor of ParamTestGenerationTest test case "
636  << "has not been run as expected.";
637  EXPECT_EQ(kExpectedCalls, set_up_count_)
638  << "Fixture SetUp method of ParamTestGenerationTest test case "
639  << "has not been run as expected.";
640  EXPECT_EQ(kExpectedCalls, tear_down_count_)
641  << "Fixture TearDown method of ParamTestGenerationTest test case "
642  << "has not been run as expected.";
643  EXPECT_EQ(kExpectedCalls, test_body_count_)
644  << "Test in ParamTestGenerationTest test case "
645  << "has not been run as expected.";
646  }
647  }
648 
649  private:
652  set_up_count_(0),
653  tear_down_count_(0),
654  test_body_count_(0) {}
655 
660 
663  delete;
664 };
665 
666 const int test_generation_params[] = {36, 42, 72};
667 
668 class TestGenerationTest : public TestWithParam<int> {
669  public:
670  enum {
672  sizeof(test_generation_params) / sizeof(test_generation_params[0])
673  };
674 
676 
679  current_parameter_ = GetParam();
680  }
681  void SetUp() override {
683  EXPECT_EQ(current_parameter_, GetParam());
684  }
685  void TearDown() override {
687  EXPECT_EQ(current_parameter_, GetParam());
688  }
689 
690  static void SetUpTestSuite() {
691  bool all_tests_in_test_case_selected = true;
692 
693  for (int i = 0; i < PARAMETER_COUNT; ++i) {
694  Message test_name;
695  test_name << "TestsExpandedAndRun/" << i;
696  if (!UnitTestOptions::FilterMatchesTest(
697  "TestExpansionModule/MultipleTestGenerationTest",
698  test_name.GetString())) {
699  all_tests_in_test_case_selected = false;
700  }
701  }
702  EXPECT_TRUE(all_tests_in_test_case_selected)
703  << "When running the TestGenerationTest test case all of its tests\n"
704  << "must be selected by the filter flag for the test case to pass.\n"
705  << "If not all of them are enabled, we can't reliably conclude\n"
706  << "that the correct number of tests have been generated.";
707 
708  collected_parameters_.clear();
709  }
710 
711  static void TearDownTestSuite() {
712  vector<int> expected_values(test_generation_params,
713  test_generation_params + PARAMETER_COUNT);
714  // Test execution order is not guaranteed by Google Test,
715  // so the order of values in collected_parameters_ can be
716  // different and we have to sort to compare.
717  sort(expected_values.begin(), expected_values.end());
718  sort(collected_parameters_.begin(), collected_parameters_.end());
719 
720  EXPECT_TRUE(collected_parameters_ == expected_values);
721  }
722 
723  protected:
725  static vector<int> collected_parameters_;
726 
727  private:
728  TestGenerationTest(const TestGenerationTest&) = delete;
730 };
732 
733 TEST_P(TestGenerationTest, TestsExpandedAndRun) {
734  Environment::Instance()->TestBodyExecuted();
735  EXPECT_EQ(current_parameter_, GetParam());
736  collected_parameters_.push_back(GetParam());
737 }
738 INSTANTIATE_TEST_SUITE_P(TestExpansionModule, TestGenerationTest,
739  ValuesIn(test_generation_params));
740 
741 // This test verifies that the element sequence (third parameter of
742 // INSTANTIATE_TEST_SUITE_P) is evaluated in InitGoogleTest() and neither at
743 // the call site of INSTANTIATE_TEST_SUITE_P nor in RUN_ALL_TESTS(). For
744 // that, we declare param_value_ to be a static member of
745 // GeneratorEvaluationTest and initialize it to 0. We set it to 1 in
746 // main(), just before invocation of InitGoogleTest(). After calling
747 // InitGoogleTest(), we set the value to 2. If the sequence is evaluated
748 // before or after InitGoogleTest, INSTANTIATE_TEST_SUITE_P will create a
749 // test with parameter other than 1, and the test body will fail the
750 // assertion.
751 class GeneratorEvaluationTest : public TestWithParam<int> {
752  public:
753  static int param_value() { return param_value_; }
755 
756  private:
757  static int param_value_;
758 };
760 
761 TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
762  EXPECT_EQ(1, GetParam());
763 }
766 
767 // Tests that generators defined in a different translation unit are
768 // functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
769 extern ParamGenerator<int> extern_gen;
770 class ExternalGeneratorTest : public TestWithParam<int> {};
771 TEST_P(ExternalGeneratorTest, ExternalGenerator) {
772  // Sequence produced by extern_gen contains only a single value
773  // which we verify here.
774  EXPECT_EQ(GetParam(), 33);
775 }
776 INSTANTIATE_TEST_SUITE_P(ExternalGeneratorModule, ExternalGeneratorTest,
777  extern_gen);
778 
779 // Tests that a parameterized test case can be defined in one translation
780 // unit and instantiated in another. This test will be instantiated in
781 // gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
782 // defined in gtest-param-test_test.h.
784  EXPECT_EQ(0, GetParam() % 33);
785 }
786 
787 // Tests that a parameterized test case can be instantiated with multiple
788 // generators.
789 class MultipleInstantiationTest : public TestWithParam<int> {};
790 TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {}
793 
794 // Tests that a parameterized test case can be instantiated
795 // in multiple translation units. This test will be instantiated
796 // here and in gtest-param-test_test2.cc.
797 // InstantiationInMultipleTranslationUnitsTest fixture class
798 // is defined in gtest-param-test_test.h.
800  EXPECT_EQ(0, GetParam() % 42);
801 }
803  Values(42, 42 * 2));
804 
805 // Tests that each iteration of parameterized test runs in a separate test
806 // object.
807 class SeparateInstanceTest : public TestWithParam<int> {
808  public:
810 
811  static void TearDownTestSuite() {
813  << "If some (but not all) SeparateInstanceTest tests have been "
814  << "filtered out this test will fail. Make sure that all "
815  << "GeneratorEvaluationTest are selected or de-selected together "
816  << "by the test filter.";
817  }
818 
819  protected:
820  int count_;
821  static int global_count_;
822 };
824 
825 TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
826  EXPECT_EQ(0, count_++);
827  global_count_++;
828 }
829 INSTANTIATE_TEST_SUITE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
830 
831 // Tests that all instantiations of a test have named appropriately. Test
832 // defined with TEST_P(TestSuiteName, TestName) and instantiated with
833 // INSTANTIATE_TEST_SUITE_P(SequenceName, TestSuiteName, generator) must be
834 // named SequenceName/TestSuiteName.TestName/i, where i is the 0-based index of
835 // the sequence element used to instantiate the test.
836 class NamingTest : public TestWithParam<int> {};
837 
838 TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
839  const ::testing::TestInfo* const test_info =
841 
842  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_suite_name());
843 
844  Message index_stream;
845  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
846  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
847 
848  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
849 }
850 
851 INSTANTIATE_TEST_SUITE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
852 
853 // Tests that macros in test names are expanded correctly.
854 class MacroNamingTest : public TestWithParam<int> {};
855 
856 #define PREFIX_WITH_FOO(test_name) Foo##test_name
857 #define PREFIX_WITH_MACRO(test_name) Macro##test_name
858 
860  const ::testing::TestInfo* const test_info =
862 
863  EXPECT_STREQ("FortyTwo/MacroNamingTest", test_info->test_suite_name());
864  EXPECT_STREQ("FooSomeTestName/0", test_info->name());
865 }
866 
868 
869 // Tests the same thing for non-parametrized tests.
871 
872 TEST_F(PREFIX_WITH_MACRO(NamingTestNonParametrized),
873  PREFIX_WITH_FOO(SomeTestName)) {
874  const ::testing::TestInfo* const test_info =
876 
877  EXPECT_STREQ("MacroNamingTestNonParametrized", test_info->test_suite_name());
878  EXPECT_STREQ("FooSomeTestName", test_info->name());
879 }
880 
881 TEST(MacroNameing, LookupNames) {
882  std::set<std::string> know_suite_names, know_test_names;
883 
884  const auto& ins = testing::UnitTest::GetInstance();
885  int ts = 0;
886  while (const testing::TestSuite* suite = ins->GetTestSuite(ts++)) {
887  know_suite_names.insert(suite->name());
888 
889  int ti = 0;
890  while (const testing::TestInfo* info = suite->GetTestInfo(ti++)) {
891  know_test_names.insert(std::string(suite->name()) + "." + info->name());
892  }
893  }
894 
895  // Check that the expected form of the test suit name actually exists.
896  EXPECT_NE( //
897  know_suite_names.find("FortyTwo/MacroNamingTest"),
898  know_suite_names.end());
899  EXPECT_NE(know_suite_names.find("MacroNamingTestNonParametrized"),
900  know_suite_names.end());
901  // Check that the expected form of the test name actually exists.
902  EXPECT_NE( //
903  know_test_names.find("FortyTwo/MacroNamingTest.FooSomeTestName/0"),
904  know_test_names.end());
905  EXPECT_NE(
906  know_test_names.find("MacroNamingTestNonParametrized.FooSomeTestName"),
907  know_test_names.end());
908 }
909 
910 // Tests that user supplied custom parameter names are working correctly.
911 // Runs the test with a builtin helper method which uses PrintToString,
912 // as well as a custom function and custom functor to ensure all possible
913 // uses work correctly.
914 class CustomFunctorNamingTest : public TestWithParam<std::string> {};
915 TEST_P(CustomFunctorNamingTest, CustomTestNames) {}
916 
918  std::string operator()(const ::testing::TestParamInfo<std::string>& inf) {
919  return inf.param;
920  }
921 };
922 
924  Values(std::string("FunctorName")),
926 
928  Values("abcdefghijklmnopqrstuvwxyz",
929  "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "01234567890_"),
931 
932 inline std::string CustomParamNameFunction(
933  const ::testing::TestParamInfo<std::string>& inf) {
934  return inf.param;
935 }
936 
937 class CustomFunctionNamingTest : public TestWithParam<std::string> {};
938 TEST_P(CustomFunctionNamingTest, CustomTestNames) {}
939 
941  Values(std::string("FunctionName")),
943 
944 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunctionP, CustomFunctionNamingTest,
945  Values(std::string("FunctionNameP")),
947 
948 // Test custom naming with a lambda
949 
950 class CustomLambdaNamingTest : public TestWithParam<std::string> {};
951 TEST_P(CustomLambdaNamingTest, CustomTestNames) {}
952 
953 INSTANTIATE_TEST_SUITE_P(CustomParamNameLambda, CustomLambdaNamingTest,
954  Values(std::string("LambdaName")),
955  [](const ::testing::TestParamInfo<std::string>& inf) {
956  return inf.param;
957  });
958 
959 TEST(CustomNamingTest, CheckNameRegistry) {
960  const auto& unit_test = ::testing::UnitTest::GetInstance();
961  std::set<std::string> test_names;
962  for (int suite_num = 0; suite_num < unit_test->total_test_suite_count();
963  ++suite_num) {
964  const ::testing::TestSuite* test_suite = unit_test->GetTestSuite(suite_num);
965  for (int test_num = 0; test_num < test_suite->total_test_count();
966  ++test_num) {
967  const ::testing::TestInfo* test_info = test_suite->GetTestInfo(test_num);
968  test_names.insert(std::string(test_info->name()));
969  }
970  }
971  EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctorName"));
972  EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionName"));
973  EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionNameP"));
974  EXPECT_EQ(1u, test_names.count("CustomTestNames/LambdaName"));
975 }
976 
977 // Test a numeric name to ensure PrintToStringParamName works correctly.
978 
979 class CustomIntegerNamingTest : public TestWithParam<int> {};
980 
981 TEST_P(CustomIntegerNamingTest, TestsReportCorrectNames) {
982  const ::testing::TestInfo* const test_info =
984  Message test_name_stream;
985  test_name_stream << "TestsReportCorrectNames/" << GetParam();
986  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
987 }
988 
991 
992 // Test a custom struct with PrintToString.
993 
994 struct CustomStruct {
995  explicit CustomStruct(int value) : x(value) {}
996  int x;
997 };
998 
999 std::ostream& operator<<(std::ostream& stream, const CustomStruct& val) {
1000  stream << val.x;
1001  return stream;
1002 }
1003 
1004 class CustomStructNamingTest : public TestWithParam<CustomStruct> {};
1005 
1006 TEST_P(CustomStructNamingTest, TestsReportCorrectNames) {
1007  const ::testing::TestInfo* const test_info =
1009  Message test_name_stream;
1010  test_name_stream << "TestsReportCorrectNames/" << GetParam();
1011  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
1012 }
1013 
1017 
1018 // Test that using a stateful parameter naming function works as expected.
1019 
1022  std::string operator()(const ::testing::TestParamInfo<int>& info) {
1023  int value = info.param + sum;
1024  sum += info.param;
1026  }
1027  int sum;
1028 };
1029 
1031  protected:
1033  int sum_;
1034 };
1035 
1036 TEST_P(StatefulNamingTest, TestsReportCorrectNames) {
1037  const ::testing::TestInfo* const test_info =
1039  sum_ += GetParam();
1040  Message test_name_stream;
1041  test_name_stream << "TestsReportCorrectNames/" << sum_;
1042  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
1043 }
1044 
1047 
1048 // Class that cannot be streamed into an ostream. It needs to be copyable
1049 // (and, in case of MSVC, also assignable) in order to be a test parameter
1050 // type. Its default copy constructor and assignment operator do exactly
1051 // what we need.
1053  public:
1054  explicit Unstreamable(int value) : value_(value) {}
1055  // -Wunused-private-field: dummy accessor for `value_`.
1056  const int& dummy_value() const { return value_; }
1057 
1058  private:
1059  int value_;
1060 };
1061 
1062 class CommentTest : public TestWithParam<Unstreamable> {};
1063 
1064 TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
1065  const ::testing::TestInfo* const test_info =
1067 
1068  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
1069 }
1070 
1071 INSTANTIATE_TEST_SUITE_P(InstantiationWithComments, CommentTest,
1072  Values(Unstreamable(1)));
1073 
1074 // Verify that we can create a hierarchy of test fixtures, where the base
1075 // class fixture is not parameterized and the derived class is. In this case
1076 // ParameterizedDerivedTest inherits from NonParameterizedBaseTest. We
1077 // perform simple tests on both.
1079  public:
1081 
1082  protected:
1083  int n_;
1084 };
1085 
1087  public ::testing::WithParamInterface<int> {
1088  protected:
1090  int count_;
1091  static int global_count_;
1092 };
1093 
1095 
1096 TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) { EXPECT_EQ(17, n_); }
1097 
1099  EXPECT_EQ(17, n_);
1100  EXPECT_EQ(0, count_++);
1101  EXPECT_EQ(GetParam(), global_count_++);
1102 }
1103 
1105 
1106 TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
1107  EXPECT_DEATH_IF_SUPPORTED(GetParam(), ".* value-parameterized test .*");
1108 }
1109 
1111  Range(0, 5));
1112 
1113 // Tests param generator working with Enums
1114 enum MyEnums {
1115  ENUM1 = 1,
1116  ENUM2 = 3,
1117  ENUM3 = 8,
1118 };
1119 
1120 class MyEnumTest : public testing::TestWithParam<MyEnums> {};
1121 
1122 TEST_P(MyEnumTest, ChecksParamMoreThanZero) { EXPECT_GE(10, GetParam()); }
1124  ::testing::Values(ENUM1, ENUM2, 0));
1125 
1126 namespace works_here {
1127 // Never used not instantiated, this should work.
1128 class NotUsedTest : public testing::TestWithParam<int> {};
1129 
1131 // Never used not instantiated, this should work.
1132 template <typename T>
1133 class NotUsedTypeTest : public testing::Test {};
1135 
1136 // Used but not instantiated, this would fail. but...
1138 // ... we mark is as allowed.
1140 
1142 
1145 TEST_P(OtherName, Used) {}
1146 
1147 // Used but not instantiated, this would fail. but...
1148 template <typename T>
1151 // ... we mark is as allowed.
1153 
1155 REGISTER_TYPED_TEST_SUITE_P(NotInstantiatedTypeTest, Used);
1156 } // namespace works_here
1157 
1158 int main(int argc, char** argv) {
1159  // Used in TestGenerationTest test suite.
1161  // Used in GeneratorEvaluationTest test suite. Tests that the updated value
1162  // will be picked up for instantiating tests in GeneratorEvaluationTest.
1164 
1165  ::testing::InitGoogleTest(&argc, argv);
1166 
1167  // Used in GeneratorEvaluationTest test suite. Tests that value updated
1168  // here will NOT be used for instantiating tests in
1169  // GeneratorEvaluationTest.
1171 
1172  return RUN_ALL_TESTS();
1173 }
NonDefaultConstructAssignString & operator=(const NonDefaultConstructAssignString &)=delete
internal::ValueArray< T...> Values(T...v)
#define EXPECT_DEATH_IF_SUPPORTED(statement, regex)
Environment * AddGlobalTestEnvironment(Environment *env)
Definition: gtest.h:1345
static TestGenerationEnvironment * Instance()
IntWrapper operator+(int other) const
void f()
#define PREFIX_WITH_FOO(test_name)
const int & dummy_value() const
const int test_generation_params[]
void VerifyGenerator(const ParamGenerator< T > &generator, const T(&expected_values)[N])
::std::string PrintValue(const T &value)
::std::string PrintToString(const T &value)
#define EXPECT_NE(val1, val2)
Definition: gtest.h:1886
internal::ParamGenerator< bool > Bool()
#define TEST_F(test_fixture, test_name)
Definition: gtest.h:2224
internal::ParamConverterGenerator< T > ConvertGenerator(internal::ParamGenerator< T > gen)
#define EXPECT_GE(val1, val2)
Definition: gtest.h:1892
#define TEST(test_suite_name, test_name)
Definition: gtest.h:2192
TestGenerationTest & operator=(const TestGenerationTest &)=delete
NonDefaultConstructAssignString(const std::string &s)
IntWrapper operator=(const IntWrapper &other)
TYPED_TEST_SUITE_P(NotUsedTypeTest)
expr bar
std::string operator()(const ::testing::TestParamInfo< int > &info)
internal::ParamGenerator< T > Range(T start, T end, IncrementT step)
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NotInstantiatedTest)
void VerifyGeneratorIsEmpty(const ParamGenerator< T > &generator)
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
internal::CartesianProductHolder< Generator...> Combine(const Generator &...g)
static vector< int > collected_parameters_
std::ostream & operator<<(std::ostream &os, const Expr< T > &xx)
expr val()
#define T
Definition: Sacado_rad.hpp:553
bool operator<(const DogAdder &other) const
bool operator==(const ConstructFromT &other) const
int main()
Definition: ad_example.cpp:171
ADVar foo(double d, ADVar x, ADVar y)
bool operator<(const IntWrapper &other) const
int value
std::string operator()(const ::testing::TestParamInfo< std::string > &inf)
#define EXPECT_STREQ(s1, s2)
Definition: gtest.h:1953
const int N
DogAdder operator+(const DogAdder &other) const
static void set_param_value(int param_value)
const TestInfo * current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_)
Definition: gtest.cc:5617
TEST_P(NotInstantiatedTest, Used)
ParamGenerator< int > extern_gen
std::string CustomParamNameFunction(const ::testing::TestParamInfo< std::string > &inf)
DogAdder(const DogAdder &other)
#define PREFIX_WITH_MACRO(test_name)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1884
#define TEST_P(test_suite_name, test_name)
IntWrapper(const IntWrapper &other)
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: gtest.h:2334
DogAdder operator=(const DogAdder &other)
TestGenerationEnvironment< PARAMETER_COUNT > Environment
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: gtest.cc:6885
DogAdder(const char *a_value)
#define EXPECT_TRUE(condition)
Definition: gtest.h:1823
static UnitTest * GetInstance()
Definition: gtest.cc:5239
REGISTER_TYPED_TEST_SUITE_P(NotInstantiatedTypeTest, Used)
const std::string & value() const
TYPED_TEST_P(NotInstantiatedTypeTest, Used)
#define EXPECT_FALSE(condition)
Definition: gtest.h:1827
#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name,...)
#define ASSERT_FALSE(condition)
Definition: gtest.h:1835
TestGenerationEnvironment & operator=(const TestGenerationEnvironment &)=delete
ConstructFromT(Args &&...args)