]> git.proxmox.com Git - ceph.git/blob - ceph/src/googletest/googletest/test/googletest-param-test-test.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / googletest / googletest / test / googletest-param-test-test.cc
1 // Copyright 2008, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 //
31 // Tests for Google Test itself. This file verifies that the parameter
32 // generators objects produce correct parameter sequences and that
33 // Google Test runtime instantiates correct tests from those sequences.
34
35 #include "gtest/gtest.h"
36
37 # include <algorithm>
38 # include <iostream>
39 # include <list>
40 # include <set>
41 # include <sstream>
42 # include <string>
43 # include <vector>
44
45 # include "src/gtest-internal-inl.h" // for UnitTestOptions
46 # include "test/googletest-param-test-test.h"
47
48 using ::std::vector;
49 using ::std::sort;
50
51 using ::testing::AddGlobalTestEnvironment;
52 using ::testing::Bool;
53 using ::testing::Combine;
54 using ::testing::Message;
55 using ::testing::Range;
56 using ::testing::TestWithParam;
57 using ::testing::Values;
58 using ::testing::ValuesIn;
59
60 using ::testing::internal::ParamGenerator;
61 using ::testing::internal::UnitTestOptions;
62
63 // Prints a value to a string.
64 //
65 // FIXME: remove PrintValue() when we move matchers and
66 // EXPECT_THAT() from Google Mock to Google Test. At that time, we
67 // can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
68 // EXPECT_THAT() and the matchers know how to print tuples.
69 template <typename T>
70 ::std::string PrintValue(const T& value) {
71 return testing::PrintToString(value);
72 }
73
74 // Verifies that a sequence generated by the generator and accessed
75 // via the iterator object matches the expected one using Google Test
76 // assertions.
77 template <typename T, size_t N>
78 void VerifyGenerator(const ParamGenerator<T>& generator,
79 const T (&expected_values)[N]) {
80 typename ParamGenerator<T>::iterator it = generator.begin();
81 for (size_t i = 0; i < N; ++i) {
82 ASSERT_FALSE(it == generator.end())
83 << "At element " << i << " when accessing via an iterator "
84 << "created with the copy constructor.\n";
85 // We cannot use EXPECT_EQ() here as the values may be tuples,
86 // which don't support <<.
87 EXPECT_TRUE(expected_values[i] == *it)
88 << "where i is " << i
89 << ", expected_values[i] is " << PrintValue(expected_values[i])
90 << ", *it is " << PrintValue(*it)
91 << ", and 'it' is an iterator created with the copy constructor.\n";
92 ++it;
93 }
94 EXPECT_TRUE(it == generator.end())
95 << "At the presumed end of sequence when accessing via an iterator "
96 << "created with the copy constructor.\n";
97
98 // Test the iterator assignment. The following lines verify that
99 // the sequence accessed via an iterator initialized via the
100 // assignment operator (as opposed to a copy constructor) matches
101 // just the same.
102 it = generator.begin();
103 for (size_t i = 0; i < N; ++i) {
104 ASSERT_FALSE(it == generator.end())
105 << "At element " << i << " when accessing via an iterator "
106 << "created with the assignment operator.\n";
107 EXPECT_TRUE(expected_values[i] == *it)
108 << "where i is " << i
109 << ", expected_values[i] is " << PrintValue(expected_values[i])
110 << ", *it is " << PrintValue(*it)
111 << ", and 'it' is an iterator created with the copy constructor.\n";
112 ++it;
113 }
114 EXPECT_TRUE(it == generator.end())
115 << "At the presumed end of sequence when accessing via an iterator "
116 << "created with the assignment operator.\n";
117 }
118
119 template <typename T>
120 void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
121 typename ParamGenerator<T>::iterator it = generator.begin();
122 EXPECT_TRUE(it == generator.end());
123
124 it = generator.begin();
125 EXPECT_TRUE(it == generator.end());
126 }
127
128 // Generator tests. They test that each of the provided generator functions
129 // generates an expected sequence of values. The general test pattern
130 // instantiates a generator using one of the generator functions,
131 // checks the sequence produced by the generator using its iterator API,
132 // and then resets the iterator back to the beginning of the sequence
133 // and checks the sequence again.
134
135 // Tests that iterators produced by generator functions conform to the
136 // ForwardIterator concept.
137 TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
138 const ParamGenerator<int> gen = Range(0, 10);
139 ParamGenerator<int>::iterator it = gen.begin();
140
141 // Verifies that iterator initialization works as expected.
142 ParamGenerator<int>::iterator it2 = it;
143 EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
144 << "element same as its source points to";
145
146 // Verifies that iterator assignment works as expected.
147 ++it;
148 EXPECT_FALSE(*it == *it2);
149 it2 = it;
150 EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
151 << "element same as its source points to";
152
153 // Verifies that prefix operator++() returns *this.
154 EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
155 << "refer to the original object";
156
157 // Verifies that the result of the postfix operator++ points to the value
158 // pointed to by the original iterator.
159 int original_value = *it; // Have to compute it outside of macro call to be
160 // unaffected by the parameter evaluation order.
161 EXPECT_EQ(original_value, *(it++));
162
163 // Verifies that prefix and postfix operator++() advance an iterator
164 // all the same.
165 it2 = it;
166 ++it;
167 ++it2;
168 EXPECT_TRUE(*it == *it2);
169 }
170
171 // Tests that Range() generates the expected sequence.
172 TEST(RangeTest, IntRangeWithDefaultStep) {
173 const ParamGenerator<int> gen = Range(0, 3);
174 const int expected_values[] = {0, 1, 2};
175 VerifyGenerator(gen, expected_values);
176 }
177
178 // Edge case. Tests that Range() generates the single element sequence
179 // as expected when provided with range limits that are equal.
180 TEST(RangeTest, IntRangeSingleValue) {
181 const ParamGenerator<int> gen = Range(0, 1);
182 const int expected_values[] = {0};
183 VerifyGenerator(gen, expected_values);
184 }
185
186 // Edge case. Tests that Range() with generates empty sequence when
187 // supplied with an empty range.
188 TEST(RangeTest, IntRangeEmpty) {
189 const ParamGenerator<int> gen = Range(0, 0);
190 VerifyGeneratorIsEmpty(gen);
191 }
192
193 // Tests that Range() with custom step (greater then one) generates
194 // the expected sequence.
195 TEST(RangeTest, IntRangeWithCustomStep) {
196 const ParamGenerator<int> gen = Range(0, 9, 3);
197 const int expected_values[] = {0, 3, 6};
198 VerifyGenerator(gen, expected_values);
199 }
200
201 // Tests that Range() with custom step (greater then one) generates
202 // the expected sequence when the last element does not fall on the
203 // upper range limit. Sequences generated by Range() must not have
204 // elements beyond the range limits.
205 TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
206 const ParamGenerator<int> gen = Range(0, 4, 3);
207 const int expected_values[] = {0, 3};
208 VerifyGenerator(gen, expected_values);
209 }
210
211 // Verifies that Range works with user-defined types that define
212 // copy constructor, operator=(), operator+(), and operator<().
213 class DogAdder {
214 public:
215 explicit DogAdder(const char* a_value) : value_(a_value) {}
216 DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
217
218 DogAdder operator=(const DogAdder& other) {
219 if (this != &other)
220 value_ = other.value_;
221 return *this;
222 }
223 DogAdder operator+(const DogAdder& other) const {
224 Message msg;
225 msg << value_.c_str() << other.value_.c_str();
226 return DogAdder(msg.GetString().c_str());
227 }
228 bool operator<(const DogAdder& other) const {
229 return value_ < other.value_;
230 }
231 const std::string& value() const { return value_; }
232
233 private:
234 std::string value_;
235 };
236
237 TEST(RangeTest, WorksWithACustomType) {
238 const ParamGenerator<DogAdder> gen =
239 Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
240 ParamGenerator<DogAdder>::iterator it = gen.begin();
241
242 ASSERT_FALSE(it == gen.end());
243 EXPECT_STREQ("cat", it->value().c_str());
244
245 ASSERT_FALSE(++it == gen.end());
246 EXPECT_STREQ("catdog", it->value().c_str());
247
248 EXPECT_TRUE(++it == gen.end());
249 }
250
251 class IntWrapper {
252 public:
253 explicit IntWrapper(int a_value) : value_(a_value) {}
254 IntWrapper(const IntWrapper& other) : value_(other.value_) {}
255
256 IntWrapper operator=(const IntWrapper& other) {
257 value_ = other.value_;
258 return *this;
259 }
260 // operator+() adds a different type.
261 IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
262 bool operator<(const IntWrapper& other) const {
263 return value_ < other.value_;
264 }
265 int value() const { return value_; }
266
267 private:
268 int value_;
269 };
270
271 TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
272 const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
273 ParamGenerator<IntWrapper>::iterator it = gen.begin();
274
275 ASSERT_FALSE(it == gen.end());
276 EXPECT_EQ(0, it->value());
277
278 ASSERT_FALSE(++it == gen.end());
279 EXPECT_EQ(1, it->value());
280
281 EXPECT_TRUE(++it == gen.end());
282 }
283
284 // Tests that ValuesIn() with an array parameter generates
285 // the expected sequence.
286 TEST(ValuesInTest, ValuesInArray) {
287 int array[] = {3, 5, 8};
288 const ParamGenerator<int> gen = ValuesIn(array);
289 VerifyGenerator(gen, array);
290 }
291
292 // Tests that ValuesIn() with a const array parameter generates
293 // the expected sequence.
294 TEST(ValuesInTest, ValuesInConstArray) {
295 const int array[] = {3, 5, 8};
296 const ParamGenerator<int> gen = ValuesIn(array);
297 VerifyGenerator(gen, array);
298 }
299
300 // Edge case. Tests that ValuesIn() with an array parameter containing a
301 // single element generates the single element sequence.
302 TEST(ValuesInTest, ValuesInSingleElementArray) {
303 int array[] = {42};
304 const ParamGenerator<int> gen = ValuesIn(array);
305 VerifyGenerator(gen, array);
306 }
307
308 // Tests that ValuesIn() generates the expected sequence for an STL
309 // container (vector).
310 TEST(ValuesInTest, ValuesInVector) {
311 typedef ::std::vector<int> ContainerType;
312 ContainerType values;
313 values.push_back(3);
314 values.push_back(5);
315 values.push_back(8);
316 const ParamGenerator<int> gen = ValuesIn(values);
317
318 const int expected_values[] = {3, 5, 8};
319 VerifyGenerator(gen, expected_values);
320 }
321
322 // Tests that ValuesIn() generates the expected sequence.
323 TEST(ValuesInTest, ValuesInIteratorRange) {
324 typedef ::std::vector<int> ContainerType;
325 ContainerType values;
326 values.push_back(3);
327 values.push_back(5);
328 values.push_back(8);
329 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
330
331 const int expected_values[] = {3, 5, 8};
332 VerifyGenerator(gen, expected_values);
333 }
334
335 // Edge case. Tests that ValuesIn() provided with an iterator range specifying a
336 // single value generates a single-element sequence.
337 TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
338 typedef ::std::vector<int> ContainerType;
339 ContainerType values;
340 values.push_back(42);
341 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
342
343 const int expected_values[] = {42};
344 VerifyGenerator(gen, expected_values);
345 }
346
347 // Edge case. Tests that ValuesIn() provided with an empty iterator range
348 // generates an empty sequence.
349 TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
350 typedef ::std::vector<int> ContainerType;
351 ContainerType values;
352 const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
353
354 VerifyGeneratorIsEmpty(gen);
355 }
356
357 // Tests that the Values() generates the expected sequence.
358 TEST(ValuesTest, ValuesWorks) {
359 const ParamGenerator<int> gen = Values(3, 5, 8);
360
361 const int expected_values[] = {3, 5, 8};
362 VerifyGenerator(gen, expected_values);
363 }
364
365 // Tests that Values() generates the expected sequences from elements of
366 // different types convertible to ParamGenerator's parameter type.
367 TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
368 const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
369
370 const double expected_values[] = {3.0, 5.0, 8.0};
371 VerifyGenerator(gen, expected_values);
372 }
373
374 TEST(ValuesTest, ValuesWorksForMaxLengthList) {
375 const ParamGenerator<int> gen = Values(
376 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
377 110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
378 210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
379 310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
380 410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
381
382 const int expected_values[] = {
383 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
384 110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
385 210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
386 310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
387 410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
388 VerifyGenerator(gen, expected_values);
389 }
390
391 // Edge case test. Tests that single-parameter Values() generates the sequence
392 // with the single value.
393 TEST(ValuesTest, ValuesWithSingleParameter) {
394 const ParamGenerator<int> gen = Values(42);
395
396 const int expected_values[] = {42};
397 VerifyGenerator(gen, expected_values);
398 }
399
400 // Tests that Bool() generates sequence (false, true).
401 TEST(BoolTest, BoolWorks) {
402 const ParamGenerator<bool> gen = Bool();
403
404 const bool expected_values[] = {false, true};
405 VerifyGenerator(gen, expected_values);
406 }
407
408 // Tests that Combine() with two parameters generates the expected sequence.
409 TEST(CombineTest, CombineWithTwoParameters) {
410 const char* foo = "foo";
411 const char* bar = "bar";
412 const ParamGenerator<std::tuple<const char*, int> > gen =
413 Combine(Values(foo, bar), Values(3, 4));
414
415 std::tuple<const char*, int> expected_values[] = {
416 std::make_tuple(foo, 3), std::make_tuple(foo, 4), std::make_tuple(bar, 3),
417 std::make_tuple(bar, 4)};
418 VerifyGenerator(gen, expected_values);
419 }
420
421 // Tests that Combine() with three parameters generates the expected sequence.
422 TEST(CombineTest, CombineWithThreeParameters) {
423 const ParamGenerator<std::tuple<int, int, int> > gen =
424 Combine(Values(0, 1), Values(3, 4), Values(5, 6));
425 std::tuple<int, int, int> expected_values[] = {
426 std::make_tuple(0, 3, 5), std::make_tuple(0, 3, 6),
427 std::make_tuple(0, 4, 5), std::make_tuple(0, 4, 6),
428 std::make_tuple(1, 3, 5), std::make_tuple(1, 3, 6),
429 std::make_tuple(1, 4, 5), std::make_tuple(1, 4, 6)};
430 VerifyGenerator(gen, expected_values);
431 }
432
433 // Tests that the Combine() with the first parameter generating a single value
434 // sequence generates a sequence with the number of elements equal to the
435 // number of elements in the sequence generated by the second parameter.
436 TEST(CombineTest, CombineWithFirstParameterSingleValue) {
437 const ParamGenerator<std::tuple<int, int> > gen =
438 Combine(Values(42), Values(0, 1));
439
440 std::tuple<int, int> expected_values[] = {std::make_tuple(42, 0),
441 std::make_tuple(42, 1)};
442 VerifyGenerator(gen, expected_values);
443 }
444
445 // Tests that the Combine() with the second parameter generating a single value
446 // sequence generates a sequence with the number of elements equal to the
447 // number of elements in the sequence generated by the first parameter.
448 TEST(CombineTest, CombineWithSecondParameterSingleValue) {
449 const ParamGenerator<std::tuple<int, int> > gen =
450 Combine(Values(0, 1), Values(42));
451
452 std::tuple<int, int> expected_values[] = {std::make_tuple(0, 42),
453 std::make_tuple(1, 42)};
454 VerifyGenerator(gen, expected_values);
455 }
456
457 // Tests that when the first parameter produces an empty sequence,
458 // Combine() produces an empty sequence, too.
459 TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
460 const ParamGenerator<std::tuple<int, int> > gen =
461 Combine(Range(0, 0), Values(0, 1));
462 VerifyGeneratorIsEmpty(gen);
463 }
464
465 // Tests that when the second parameter produces an empty sequence,
466 // Combine() produces an empty sequence, too.
467 TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
468 const ParamGenerator<std::tuple<int, int> > gen =
469 Combine(Values(0, 1), Range(1, 1));
470 VerifyGeneratorIsEmpty(gen);
471 }
472
473 // Edge case. Tests that combine works with the maximum number
474 // of parameters supported by Google Test (currently 10).
475 TEST(CombineTest, CombineWithMaxNumberOfParameters) {
476 const char* foo = "foo";
477 const char* bar = "bar";
478 const ParamGenerator<
479 std::tuple<const char*, int, int, int, int, int, int, int, int, int> >
480 gen =
481 Combine(Values(foo, bar), Values(1), Values(2), Values(3), Values(4),
482 Values(5), Values(6), Values(7), Values(8), Values(9));
483
484 std::tuple<const char*, int, int, int, int, int, int, int, int, int>
485 expected_values[] = {std::make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
486 std::make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
487 VerifyGenerator(gen, expected_values);
488 }
489
490 class NonDefaultConstructAssignString {
491 public:
492 NonDefaultConstructAssignString(const std::string& s) : str_(s) {}
493 NonDefaultConstructAssignString() = delete;
494 NonDefaultConstructAssignString(const NonDefaultConstructAssignString&) =
495 default;
496 NonDefaultConstructAssignString& operator=(
497 const NonDefaultConstructAssignString&) = delete;
498 ~NonDefaultConstructAssignString() = default;
499
500 const std::string& str() const { return str_; }
501
502 private:
503 std::string str_;
504 };
505
506 TEST(CombineTest, NonDefaultConstructAssign) {
507 const ParamGenerator<std::tuple<int, NonDefaultConstructAssignString> > gen =
508 Combine(Values(0, 1), Values(NonDefaultConstructAssignString("A"),
509 NonDefaultConstructAssignString("B")));
510
511 ParamGenerator<std::tuple<int, NonDefaultConstructAssignString> >::iterator
512 it = gen.begin();
513
514 EXPECT_EQ(0, std::get<0>(*it));
515 EXPECT_EQ("A", std::get<1>(*it).str());
516 ++it;
517
518 EXPECT_EQ(0, std::get<0>(*it));
519 EXPECT_EQ("B", std::get<1>(*it).str());
520 ++it;
521
522 EXPECT_EQ(1, std::get<0>(*it));
523 EXPECT_EQ("A", std::get<1>(*it).str());
524 ++it;
525
526 EXPECT_EQ(1, std::get<0>(*it));
527 EXPECT_EQ("B", std::get<1>(*it).str());
528 ++it;
529
530 EXPECT_TRUE(it == gen.end());
531 }
532
533
534 // Tests that an generator produces correct sequence after being
535 // assigned from another generator.
536 TEST(ParamGeneratorTest, AssignmentWorks) {
537 ParamGenerator<int> gen = Values(1, 2);
538 const ParamGenerator<int> gen2 = Values(3, 4);
539 gen = gen2;
540
541 const int expected_values[] = {3, 4};
542 VerifyGenerator(gen, expected_values);
543 }
544
545 // This test verifies that the tests are expanded and run as specified:
546 // one test per element from the sequence produced by the generator
547 // specified in INSTANTIATE_TEST_SUITE_P. It also verifies that the test's
548 // fixture constructor, SetUp(), and TearDown() have run and have been
549 // supplied with the correct parameters.
550
551 // The use of environment object allows detection of the case where no test
552 // case functionality is run at all. In this case TearDownTestSuite will not
553 // be able to detect missing tests, naturally.
554 template <int kExpectedCalls>
555 class TestGenerationEnvironment : public ::testing::Environment {
556 public:
557 static TestGenerationEnvironment* Instance() {
558 static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
559 return instance;
560 }
561
562 void FixtureConstructorExecuted() { fixture_constructor_count_++; }
563 void SetUpExecuted() { set_up_count_++; }
564 void TearDownExecuted() { tear_down_count_++; }
565 void TestBodyExecuted() { test_body_count_++; }
566
567 void TearDown() override {
568 // If all MultipleTestGenerationTest tests have been de-selected
569 // by the filter flag, the following checks make no sense.
570 bool perform_check = false;
571
572 for (int i = 0; i < kExpectedCalls; ++i) {
573 Message msg;
574 msg << "TestsExpandedAndRun/" << i;
575 if (UnitTestOptions::FilterMatchesTest(
576 "TestExpansionModule/MultipleTestGenerationTest",
577 msg.GetString().c_str())) {
578 perform_check = true;
579 }
580 }
581 if (perform_check) {
582 EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
583 << "Fixture constructor of ParamTestGenerationTest test case "
584 << "has not been run as expected.";
585 EXPECT_EQ(kExpectedCalls, set_up_count_)
586 << "Fixture SetUp method of ParamTestGenerationTest test case "
587 << "has not been run as expected.";
588 EXPECT_EQ(kExpectedCalls, tear_down_count_)
589 << "Fixture TearDown method of ParamTestGenerationTest test case "
590 << "has not been run as expected.";
591 EXPECT_EQ(kExpectedCalls, test_body_count_)
592 << "Test in ParamTestGenerationTest test case "
593 << "has not been run as expected.";
594 }
595 }
596
597 private:
598 TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
599 tear_down_count_(0), test_body_count_(0) {}
600
601 int fixture_constructor_count_;
602 int set_up_count_;
603 int tear_down_count_;
604 int test_body_count_;
605
606 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
607 };
608
609 const int test_generation_params[] = {36, 42, 72};
610
611 class TestGenerationTest : public TestWithParam<int> {
612 public:
613 enum {
614 PARAMETER_COUNT =
615 sizeof(test_generation_params)/sizeof(test_generation_params[0])
616 };
617
618 typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
619
620 TestGenerationTest() {
621 Environment::Instance()->FixtureConstructorExecuted();
622 current_parameter_ = GetParam();
623 }
624 void SetUp() override {
625 Environment::Instance()->SetUpExecuted();
626 EXPECT_EQ(current_parameter_, GetParam());
627 }
628 void TearDown() override {
629 Environment::Instance()->TearDownExecuted();
630 EXPECT_EQ(current_parameter_, GetParam());
631 }
632
633 static void SetUpTestSuite() {
634 bool all_tests_in_test_case_selected = true;
635
636 for (int i = 0; i < PARAMETER_COUNT; ++i) {
637 Message test_name;
638 test_name << "TestsExpandedAndRun/" << i;
639 if ( !UnitTestOptions::FilterMatchesTest(
640 "TestExpansionModule/MultipleTestGenerationTest",
641 test_name.GetString())) {
642 all_tests_in_test_case_selected = false;
643 }
644 }
645 EXPECT_TRUE(all_tests_in_test_case_selected)
646 << "When running the TestGenerationTest test case all of its tests\n"
647 << "must be selected by the filter flag for the test case to pass.\n"
648 << "If not all of them are enabled, we can't reliably conclude\n"
649 << "that the correct number of tests have been generated.";
650
651 collected_parameters_.clear();
652 }
653
654 static void TearDownTestSuite() {
655 vector<int> expected_values(test_generation_params,
656 test_generation_params + PARAMETER_COUNT);
657 // Test execution order is not guaranteed by Google Test,
658 // so the order of values in collected_parameters_ can be
659 // different and we have to sort to compare.
660 sort(expected_values.begin(), expected_values.end());
661 sort(collected_parameters_.begin(), collected_parameters_.end());
662
663 EXPECT_TRUE(collected_parameters_ == expected_values);
664 }
665
666 protected:
667 int current_parameter_;
668 static vector<int> collected_parameters_;
669
670 private:
671 GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
672 };
673 vector<int> TestGenerationTest::collected_parameters_;
674
675 TEST_P(TestGenerationTest, TestsExpandedAndRun) {
676 Environment::Instance()->TestBodyExecuted();
677 EXPECT_EQ(current_parameter_, GetParam());
678 collected_parameters_.push_back(GetParam());
679 }
680 INSTANTIATE_TEST_SUITE_P(TestExpansionModule, TestGenerationTest,
681 ValuesIn(test_generation_params));
682
683 // This test verifies that the element sequence (third parameter of
684 // INSTANTIATE_TEST_SUITE_P) is evaluated in InitGoogleTest() and neither at
685 // the call site of INSTANTIATE_TEST_SUITE_P nor in RUN_ALL_TESTS(). For
686 // that, we declare param_value_ to be a static member of
687 // GeneratorEvaluationTest and initialize it to 0. We set it to 1 in
688 // main(), just before invocation of InitGoogleTest(). After calling
689 // InitGoogleTest(), we set the value to 2. If the sequence is evaluated
690 // before or after InitGoogleTest, INSTANTIATE_TEST_SUITE_P will create a
691 // test with parameter other than 1, and the test body will fail the
692 // assertion.
693 class GeneratorEvaluationTest : public TestWithParam<int> {
694 public:
695 static int param_value() { return param_value_; }
696 static void set_param_value(int param_value) { param_value_ = param_value; }
697
698 private:
699 static int param_value_;
700 };
701 int GeneratorEvaluationTest::param_value_ = 0;
702
703 TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
704 EXPECT_EQ(1, GetParam());
705 }
706 INSTANTIATE_TEST_SUITE_P(GenEvalModule, GeneratorEvaluationTest,
707 Values(GeneratorEvaluationTest::param_value()));
708
709 // Tests that generators defined in a different translation unit are
710 // functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
711 extern ParamGenerator<int> extern_gen;
712 class ExternalGeneratorTest : public TestWithParam<int> {};
713 TEST_P(ExternalGeneratorTest, ExternalGenerator) {
714 // Sequence produced by extern_gen contains only a single value
715 // which we verify here.
716 EXPECT_EQ(GetParam(), 33);
717 }
718 INSTANTIATE_TEST_SUITE_P(ExternalGeneratorModule, ExternalGeneratorTest,
719 extern_gen);
720
721 // Tests that a parameterized test case can be defined in one translation
722 // unit and instantiated in another. This test will be instantiated in
723 // gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
724 // defined in gtest-param-test_test.h.
725 TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
726 EXPECT_EQ(0, GetParam() % 33);
727 }
728
729 // Tests that a parameterized test case can be instantiated with multiple
730 // generators.
731 class MultipleInstantiationTest : public TestWithParam<int> {};
732 TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
733 }
734 INSTANTIATE_TEST_SUITE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
735 INSTANTIATE_TEST_SUITE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
736
737 // Tests that a parameterized test case can be instantiated
738 // in multiple translation units. This test will be instantiated
739 // here and in gtest-param-test_test2.cc.
740 // InstantiationInMultipleTranslationUnitsTest fixture class
741 // is defined in gtest-param-test_test.h.
742 TEST_P(InstantiationInMultipleTranslationUnitsTest, IsMultipleOf42) {
743 EXPECT_EQ(0, GetParam() % 42);
744 }
745 INSTANTIATE_TEST_SUITE_P(Sequence1, InstantiationInMultipleTranslationUnitsTest,
746 Values(42, 42 * 2));
747
748 // Tests that each iteration of parameterized test runs in a separate test
749 // object.
750 class SeparateInstanceTest : public TestWithParam<int> {
751 public:
752 SeparateInstanceTest() : count_(0) {}
753
754 static void TearDownTestSuite() {
755 EXPECT_GE(global_count_, 2)
756 << "If some (but not all) SeparateInstanceTest tests have been "
757 << "filtered out this test will fail. Make sure that all "
758 << "GeneratorEvaluationTest are selected or de-selected together "
759 << "by the test filter.";
760 }
761
762 protected:
763 int count_;
764 static int global_count_;
765 };
766 int SeparateInstanceTest::global_count_ = 0;
767
768 TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
769 EXPECT_EQ(0, count_++);
770 global_count_++;
771 }
772 INSTANTIATE_TEST_SUITE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
773
774 // Tests that all instantiations of a test have named appropriately. Test
775 // defined with TEST_P(TestSuiteName, TestName) and instantiated with
776 // INSTANTIATE_TEST_SUITE_P(SequenceName, TestSuiteName, generator) must be
777 // named SequenceName/TestSuiteName.TestName/i, where i is the 0-based index of
778 // the sequence element used to instantiate the test.
779 class NamingTest : public TestWithParam<int> {};
780
781 TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
782 const ::testing::TestInfo* const test_info =
783 ::testing::UnitTest::GetInstance()->current_test_info();
784
785 EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_suite_name());
786
787 Message index_stream;
788 index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
789 EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
790
791 EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
792 }
793
794 INSTANTIATE_TEST_SUITE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
795
796 // Tests that macros in test names are expanded correctly.
797 class MacroNamingTest : public TestWithParam<int> {};
798
799 #define PREFIX_WITH_FOO(test_name) Foo##test_name
800 #define PREFIX_WITH_MACRO(test_name) Macro##test_name
801
802 TEST_P(PREFIX_WITH_MACRO(NamingTest), PREFIX_WITH_FOO(SomeTestName)) {
803 const ::testing::TestInfo* const test_info =
804 ::testing::UnitTest::GetInstance()->current_test_info();
805
806 EXPECT_STREQ("FortyTwo/MacroNamingTest", test_info->test_suite_name());
807 EXPECT_STREQ("FooSomeTestName/0", test_info->name());
808 }
809
810 INSTANTIATE_TEST_SUITE_P(FortyTwo, MacroNamingTest, Values(42));
811
812 // Tests the same thing for non-parametrized tests.
813 class MacroNamingTestNonParametrized : public ::testing::Test {};
814
815 TEST_F(PREFIX_WITH_MACRO(NamingTestNonParametrized),
816 PREFIX_WITH_FOO(SomeTestName)) {
817 const ::testing::TestInfo* const test_info =
818 ::testing::UnitTest::GetInstance()->current_test_info();
819
820 EXPECT_STREQ("MacroNamingTestNonParametrized", test_info->test_suite_name());
821 EXPECT_STREQ("FooSomeTestName", test_info->name());
822 }
823
824 TEST(MacroNameing, LookupNames) {
825 std::set<std::string> know_suite_names, know_test_names;
826
827 auto ins = testing::UnitTest::GetInstance();
828 int ts = 0;
829 while (const testing::TestSuite* suite = ins->GetTestSuite(ts++)) {
830 know_suite_names.insert(suite->name());
831
832 int ti = 0;
833 while (const testing::TestInfo* info = suite->GetTestInfo(ti++)) {
834 know_test_names.insert(std::string(suite->name()) + "." + info->name());
835 }
836 }
837
838 // Check that the expected form of the test suit name actualy exists.
839 EXPECT_NE( //
840 know_suite_names.find("FortyTwo/MacroNamingTest"),
841 know_suite_names.end());
842 EXPECT_NE(
843 know_suite_names.find("MacroNamingTestNonParametrized"),
844 know_suite_names.end());
845 // Check that the expected form of the test name actualy exists.
846 EXPECT_NE( //
847 know_test_names.find("FortyTwo/MacroNamingTest.FooSomeTestName/0"),
848 know_test_names.end());
849 EXPECT_NE(
850 know_test_names.find("MacroNamingTestNonParametrized.FooSomeTestName"),
851 know_test_names.end());
852 }
853
854 // Tests that user supplied custom parameter names are working correctly.
855 // Runs the test with a builtin helper method which uses PrintToString,
856 // as well as a custom function and custom functor to ensure all possible
857 // uses work correctly.
858 class CustomFunctorNamingTest : public TestWithParam<std::string> {};
859 TEST_P(CustomFunctorNamingTest, CustomTestNames) {}
860
861 struct CustomParamNameFunctor {
862 std::string operator()(const ::testing::TestParamInfo<std::string>& inf) {
863 return inf.param;
864 }
865 };
866
867 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunctor, CustomFunctorNamingTest,
868 Values(std::string("FunctorName")),
869 CustomParamNameFunctor());
870
871 INSTANTIATE_TEST_SUITE_P(AllAllowedCharacters, CustomFunctorNamingTest,
872 Values("abcdefghijklmnopqrstuvwxyz",
873 "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "01234567890_"),
874 CustomParamNameFunctor());
875
876 inline std::string CustomParamNameFunction(
877 const ::testing::TestParamInfo<std::string>& inf) {
878 return inf.param;
879 }
880
881 class CustomFunctionNamingTest : public TestWithParam<std::string> {};
882 TEST_P(CustomFunctionNamingTest, CustomTestNames) {}
883
884 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunction, CustomFunctionNamingTest,
885 Values(std::string("FunctionName")),
886 CustomParamNameFunction);
887
888 INSTANTIATE_TEST_SUITE_P(CustomParamNameFunctionP, CustomFunctionNamingTest,
889 Values(std::string("FunctionNameP")),
890 &CustomParamNameFunction);
891
892 // Test custom naming with a lambda
893
894 class CustomLambdaNamingTest : public TestWithParam<std::string> {};
895 TEST_P(CustomLambdaNamingTest, CustomTestNames) {}
896
897 INSTANTIATE_TEST_SUITE_P(CustomParamNameLambda, CustomLambdaNamingTest,
898 Values(std::string("LambdaName")),
899 [](const ::testing::TestParamInfo<std::string>& inf) {
900 return inf.param;
901 });
902
903 TEST(CustomNamingTest, CheckNameRegistry) {
904 ::testing::UnitTest* unit_test = ::testing::UnitTest::GetInstance();
905 std::set<std::string> test_names;
906 for (int suite_num = 0; suite_num < unit_test->total_test_suite_count();
907 ++suite_num) {
908 const ::testing::TestSuite* test_suite = unit_test->GetTestSuite(suite_num);
909 for (int test_num = 0; test_num < test_suite->total_test_count();
910 ++test_num) {
911 const ::testing::TestInfo* test_info = test_suite->GetTestInfo(test_num);
912 test_names.insert(std::string(test_info->name()));
913 }
914 }
915 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctorName"));
916 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionName"));
917 EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionNameP"));
918 EXPECT_EQ(1u, test_names.count("CustomTestNames/LambdaName"));
919 }
920
921 // Test a numeric name to ensure PrintToStringParamName works correctly.
922
923 class CustomIntegerNamingTest : public TestWithParam<int> {};
924
925 TEST_P(CustomIntegerNamingTest, TestsReportCorrectNames) {
926 const ::testing::TestInfo* const test_info =
927 ::testing::UnitTest::GetInstance()->current_test_info();
928 Message test_name_stream;
929 test_name_stream << "TestsReportCorrectNames/" << GetParam();
930 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
931 }
932
933 INSTANTIATE_TEST_SUITE_P(PrintToString, CustomIntegerNamingTest, Range(0, 5),
934 ::testing::PrintToStringParamName());
935
936 // Test a custom struct with PrintToString.
937
938 struct CustomStruct {
939 explicit CustomStruct(int value) : x(value) {}
940 int x;
941 };
942
943 std::ostream& operator<<(std::ostream& stream, const CustomStruct& val) {
944 stream << val.x;
945 return stream;
946 }
947
948 class CustomStructNamingTest : public TestWithParam<CustomStruct> {};
949
950 TEST_P(CustomStructNamingTest, TestsReportCorrectNames) {
951 const ::testing::TestInfo* const test_info =
952 ::testing::UnitTest::GetInstance()->current_test_info();
953 Message test_name_stream;
954 test_name_stream << "TestsReportCorrectNames/" << GetParam();
955 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
956 }
957
958 INSTANTIATE_TEST_SUITE_P(PrintToString, CustomStructNamingTest,
959 Values(CustomStruct(0), CustomStruct(1)),
960 ::testing::PrintToStringParamName());
961
962 // Test that using a stateful parameter naming function works as expected.
963
964 struct StatefulNamingFunctor {
965 StatefulNamingFunctor() : sum(0) {}
966 std::string operator()(const ::testing::TestParamInfo<int>& info) {
967 int value = info.param + sum;
968 sum += info.param;
969 return ::testing::PrintToString(value);
970 }
971 int sum;
972 };
973
974 class StatefulNamingTest : public ::testing::TestWithParam<int> {
975 protected:
976 StatefulNamingTest() : sum_(0) {}
977 int sum_;
978 };
979
980 TEST_P(StatefulNamingTest, TestsReportCorrectNames) {
981 const ::testing::TestInfo* const test_info =
982 ::testing::UnitTest::GetInstance()->current_test_info();
983 sum_ += GetParam();
984 Message test_name_stream;
985 test_name_stream << "TestsReportCorrectNames/" << sum_;
986 EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
987 }
988
989 INSTANTIATE_TEST_SUITE_P(StatefulNamingFunctor, StatefulNamingTest, Range(0, 5),
990 StatefulNamingFunctor());
991
992 // Class that cannot be streamed into an ostream. It needs to be copyable
993 // (and, in case of MSVC, also assignable) in order to be a test parameter
994 // type. Its default copy constructor and assignment operator do exactly
995 // what we need.
996 class Unstreamable {
997 public:
998 explicit Unstreamable(int value) : value_(value) {}
999 // -Wunused-private-field: dummy accessor for `value_`.
1000 const int& dummy_value() const { return value_; }
1001
1002 private:
1003 int value_;
1004 };
1005
1006 class CommentTest : public TestWithParam<Unstreamable> {};
1007
1008 TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
1009 const ::testing::TestInfo* const test_info =
1010 ::testing::UnitTest::GetInstance()->current_test_info();
1011
1012 EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
1013 }
1014
1015 INSTANTIATE_TEST_SUITE_P(InstantiationWithComments, CommentTest,
1016 Values(Unstreamable(1)));
1017
1018 // Verify that we can create a hierarchy of test fixtures, where the base
1019 // class fixture is not parameterized and the derived class is. In this case
1020 // ParameterizedDerivedTest inherits from NonParameterizedBaseTest. We
1021 // perform simple tests on both.
1022 class NonParameterizedBaseTest : public ::testing::Test {
1023 public:
1024 NonParameterizedBaseTest() : n_(17) { }
1025 protected:
1026 int n_;
1027 };
1028
1029 class ParameterizedDerivedTest : public NonParameterizedBaseTest,
1030 public ::testing::WithParamInterface<int> {
1031 protected:
1032 ParameterizedDerivedTest() : count_(0) { }
1033 int count_;
1034 static int global_count_;
1035 };
1036
1037 int ParameterizedDerivedTest::global_count_ = 0;
1038
1039 TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
1040 EXPECT_EQ(17, n_);
1041 }
1042
1043 TEST_P(ParameterizedDerivedTest, SeesSequence) {
1044 EXPECT_EQ(17, n_);
1045 EXPECT_EQ(0, count_++);
1046 EXPECT_EQ(GetParam(), global_count_++);
1047 }
1048
1049 class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
1050
1051 TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
1052 EXPECT_DEATH_IF_SUPPORTED(GetParam(),
1053 ".* value-parameterized test .*");
1054 }
1055
1056 INSTANTIATE_TEST_SUITE_P(RangeZeroToFive, ParameterizedDerivedTest,
1057 Range(0, 5));
1058
1059 // Tests param generator working with Enums
1060 enum MyEnums {
1061 ENUM1 = 1,
1062 ENUM2 = 3,
1063 ENUM3 = 8,
1064 };
1065
1066 class MyEnumTest : public testing::TestWithParam<MyEnums> {};
1067
1068 TEST_P(MyEnumTest, ChecksParamMoreThanZero) { EXPECT_GE(10, GetParam()); }
1069 INSTANTIATE_TEST_SUITE_P(MyEnumTests, MyEnumTest,
1070 ::testing::Values(ENUM1, ENUM2, 0));
1071
1072 namespace works_here {
1073 // Never used not instantiated, this should work.
1074 class NotUsedTest : public testing::TestWithParam<int> {};
1075
1076 ///////
1077 // Never used not instantiated, this should work.
1078 template <typename T>
1079 class NotUsedTypeTest : public testing::Test {};
1080 TYPED_TEST_SUITE_P(NotUsedTypeTest);
1081
1082 // Used but not instantiated, this would fail. but...
1083 class NotInstantiatedTest : public testing::TestWithParam<int> {};
1084 // ... we mark is as allowed.
1085 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NotInstantiatedTest);
1086
1087 TEST_P(NotInstantiatedTest, Used) { }
1088
1089 using OtherName = NotInstantiatedTest;
1090 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(OtherName);
1091 TEST_P(OtherName, Used) { }
1092
1093 // Used but not instantiated, this would fail. but...
1094 template <typename T>
1095 class NotInstantiatedTypeTest : public testing::Test {};
1096 TYPED_TEST_SUITE_P(NotInstantiatedTypeTest);
1097 // ... we mark is as allowed.
1098 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NotInstantiatedTypeTest);
1099
1100 TYPED_TEST_P(NotInstantiatedTypeTest, Used) { }
1101 REGISTER_TYPED_TEST_SUITE_P(NotInstantiatedTypeTest, Used);
1102 } // namespace works_here
1103
1104 int main(int argc, char **argv) {
1105 // Used in TestGenerationTest test suite.
1106 AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
1107 // Used in GeneratorEvaluationTest test suite. Tests that the updated value
1108 // will be picked up for instantiating tests in GeneratorEvaluationTest.
1109 GeneratorEvaluationTest::set_param_value(1);
1110
1111 ::testing::InitGoogleTest(&argc, argv);
1112
1113 // Used in GeneratorEvaluationTest test suite. Tests that value updated
1114 // here will NOT be used for instantiating tests in
1115 // GeneratorEvaluationTest.
1116 GeneratorEvaluationTest::set_param_value(2);
1117
1118 return RUN_ALL_TESTS();
1119 }