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