Blame googletest/test/gtest-param-test_test.cc

Packit bd1cd8
// Copyright 2008, Google Inc.
Packit bd1cd8
// All rights reserved.
Packit bd1cd8
//
Packit bd1cd8
// Redistribution and use in source and binary forms, with or without
Packit bd1cd8
// modification, are permitted provided that the following conditions are
Packit bd1cd8
// met:
Packit bd1cd8
//
Packit bd1cd8
//     * Redistributions of source code must retain the above copyright
Packit bd1cd8
// notice, this list of conditions and the following disclaimer.
Packit bd1cd8
//     * Redistributions in binary form must reproduce the above
Packit bd1cd8
// copyright notice, this list of conditions and the following disclaimer
Packit bd1cd8
// in the documentation and/or other materials provided with the
Packit bd1cd8
// distribution.
Packit bd1cd8
//     * Neither the name of Google Inc. nor the names of its
Packit bd1cd8
// contributors may be used to endorse or promote products derived from
Packit bd1cd8
// this software without specific prior written permission.
Packit bd1cd8
//
Packit bd1cd8
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit bd1cd8
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit bd1cd8
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit bd1cd8
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit bd1cd8
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit bd1cd8
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit bd1cd8
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit bd1cd8
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit bd1cd8
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit bd1cd8
//
Packit bd1cd8
// Author: vladl@google.com (Vlad Losev)
Packit bd1cd8
//
Packit bd1cd8
// Tests for Google Test itself. This file verifies that the parameter
Packit bd1cd8
// generators objects produce correct parameter sequences and that
Packit bd1cd8
// Google Test runtime instantiates correct tests from those sequences.
Packit bd1cd8
Packit bd1cd8
#include "gtest/gtest.h"
Packit bd1cd8
Packit bd1cd8
#if GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
# include <algorithm>
Packit bd1cd8
# include <iostream>
Packit bd1cd8
# include <list>
Packit bd1cd8
# include <sstream>
Packit bd1cd8
# include <string>
Packit bd1cd8
# include <vector>
Packit bd1cd8
Packit bd1cd8
// To include gtest-internal-inl.h.
Packit bd1cd8
# define GTEST_IMPLEMENTATION_ 1
Packit bd1cd8
# include "src/gtest-internal-inl.h"  // for UnitTestOptions
Packit bd1cd8
# undef GTEST_IMPLEMENTATION_
Packit bd1cd8
Packit bd1cd8
# include "test/gtest-param-test_test.h"
Packit bd1cd8
Packit bd1cd8
using ::std::vector;
Packit bd1cd8
using ::std::sort;
Packit bd1cd8
Packit bd1cd8
using ::testing::AddGlobalTestEnvironment;
Packit bd1cd8
using ::testing::Bool;
Packit bd1cd8
using ::testing::Message;
Packit bd1cd8
using ::testing::Range;
Packit bd1cd8
using ::testing::TestWithParam;
Packit bd1cd8
using ::testing::Values;
Packit bd1cd8
using ::testing::ValuesIn;
Packit bd1cd8
Packit bd1cd8
# if GTEST_HAS_COMBINE
Packit bd1cd8
using ::testing::Combine;
Packit bd1cd8
using ::testing::get;
Packit bd1cd8
using ::testing::make_tuple;
Packit bd1cd8
using ::testing::tuple;
Packit bd1cd8
# endif  // GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
using ::testing::internal::ParamGenerator;
Packit bd1cd8
using ::testing::internal::UnitTestOptions;
Packit bd1cd8
Packit bd1cd8
// Prints a value to a string.
Packit bd1cd8
//
Packit bd1cd8
// TODO(wan@google.com): remove PrintValue() when we move matchers and
Packit bd1cd8
// EXPECT_THAT() from Google Mock to Google Test.  At that time, we
Packit bd1cd8
// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
Packit bd1cd8
// EXPECT_THAT() and the matchers know how to print tuples.
Packit bd1cd8
template <typename T>
Packit bd1cd8
::std::string PrintValue(const T& value) {
Packit bd1cd8
  ::std::stringstream stream;
Packit bd1cd8
  stream << value;
Packit bd1cd8
  return stream.str();
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
# if GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
// These overloads allow printing tuples in our tests.  We cannot
Packit bd1cd8
// define an operator<< for tuples, as that definition needs to be in
Packit bd1cd8
// the std namespace in order to be picked up by Google Test via
Packit bd1cd8
// Argument-Dependent Lookup, yet defining anything in the std
Packit bd1cd8
// namespace in non-STL code is undefined behavior.
Packit bd1cd8
Packit bd1cd8
template <typename T1, typename T2>
Packit bd1cd8
::std::string PrintValue(const tuple<T1, T2>& value) {
Packit bd1cd8
  ::std::stringstream stream;
Packit bd1cd8
  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
Packit bd1cd8
  return stream.str();
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
template <typename T1, typename T2, typename T3>
Packit bd1cd8
::std::string PrintValue(const tuple<T1, T2, T3>& value) {
Packit bd1cd8
  ::std::stringstream stream;
Packit bd1cd8
  stream << "(" << get<0>(value) << ", " << get<1>(value)
Packit bd1cd8
         << ", "<< get<2>(value) << ")";
Packit bd1cd8
  return stream.str();
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
template 
Packit bd1cd8
          typename T6, typename T7, typename T8, typename T9, typename T10>
Packit bd1cd8
::std::string PrintValue(
Packit bd1cd8
    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
Packit bd1cd8
  ::std::stringstream stream;
Packit bd1cd8
  stream << "(" << get<0>(value) << ", " << get<1>(value)
Packit bd1cd8
         << ", "<< get<2>(value) << ", " << get<3>(value)
Packit bd1cd8
         << ", "<< get<4>(value) << ", " << get<5>(value)
Packit bd1cd8
         << ", "<< get<6>(value) << ", " << get<7>(value)
Packit bd1cd8
         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
Packit bd1cd8
  return stream.str();
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
# endif  // GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
// Verifies that a sequence generated by the generator and accessed
Packit bd1cd8
// via the iterator object matches the expected one using Google Test
Packit bd1cd8
// assertions.
Packit bd1cd8
template <typename T, size_t N>
Packit bd1cd8
void VerifyGenerator(const ParamGenerator<T>& generator,
Packit bd1cd8
                     const T (&expected_values)[N]) {
Packit bd1cd8
  typename ParamGenerator<T>::iterator it = generator.begin();
Packit bd1cd8
  for (size_t i = 0; i < N; ++i) {
Packit bd1cd8
    ASSERT_FALSE(it == generator.end())
Packit bd1cd8
        << "At element " << i << " when accessing via an iterator "
Packit bd1cd8
        << "created with the copy constructor.\n";
Packit bd1cd8
    // We cannot use EXPECT_EQ() here as the values may be tuples,
Packit bd1cd8
    // which don't support <<.
Packit bd1cd8
    EXPECT_TRUE(expected_values[i] == *it)
Packit bd1cd8
        << "where i is " << i
Packit bd1cd8
        << ", expected_values[i] is " << PrintValue(expected_values[i])
Packit bd1cd8
        << ", *it is " << PrintValue(*it)
Packit bd1cd8
        << ", and 'it' is an iterator created with the copy constructor.\n";
Packit bd1cd8
    it++;
Packit bd1cd8
  }
Packit bd1cd8
  EXPECT_TRUE(it == generator.end())
Packit bd1cd8
        << "At the presumed end of sequence when accessing via an iterator "
Packit bd1cd8
        << "created with the copy constructor.\n";
Packit bd1cd8
Packit bd1cd8
  // Test the iterator assignment. The following lines verify that
Packit bd1cd8
  // the sequence accessed via an iterator initialized via the
Packit bd1cd8
  // assignment operator (as opposed to a copy constructor) matches
Packit bd1cd8
  // just the same.
Packit bd1cd8
  it = generator.begin();
Packit bd1cd8
  for (size_t i = 0; i < N; ++i) {
Packit bd1cd8
    ASSERT_FALSE(it == generator.end())
Packit bd1cd8
        << "At element " << i << " when accessing via an iterator "
Packit bd1cd8
        << "created with the assignment operator.\n";
Packit bd1cd8
    EXPECT_TRUE(expected_values[i] == *it)
Packit bd1cd8
        << "where i is " << i
Packit bd1cd8
        << ", expected_values[i] is " << PrintValue(expected_values[i])
Packit bd1cd8
        << ", *it is " << PrintValue(*it)
Packit bd1cd8
        << ", and 'it' is an iterator created with the copy constructor.\n";
Packit bd1cd8
    it++;
Packit bd1cd8
  }
Packit bd1cd8
  EXPECT_TRUE(it == generator.end())
Packit bd1cd8
        << "At the presumed end of sequence when accessing via an iterator "
Packit bd1cd8
        << "created with the assignment operator.\n";
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
template <typename T>
Packit bd1cd8
void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
Packit bd1cd8
  typename ParamGenerator<T>::iterator it = generator.begin();
Packit bd1cd8
  EXPECT_TRUE(it == generator.end());
Packit bd1cd8
Packit bd1cd8
  it = generator.begin();
Packit bd1cd8
  EXPECT_TRUE(it == generator.end());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Generator tests. They test that each of the provided generator functions
Packit bd1cd8
// generates an expected sequence of values. The general test pattern
Packit bd1cd8
// instantiates a generator using one of the generator functions,
Packit bd1cd8
// checks the sequence produced by the generator using its iterator API,
Packit bd1cd8
// and then resets the iterator back to the beginning of the sequence
Packit bd1cd8
// and checks the sequence again.
Packit bd1cd8
Packit bd1cd8
// Tests that iterators produced by generator functions conform to the
Packit bd1cd8
// ForwardIterator concept.
Packit bd1cd8
TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 10);
Packit bd1cd8
  ParamGenerator<int>::iterator it = gen.begin();
Packit bd1cd8
Packit bd1cd8
  // Verifies that iterator initialization works as expected.
Packit bd1cd8
  ParamGenerator<int>::iterator it2 = it;
Packit bd1cd8
  EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
Packit bd1cd8
                           << "element same as its source points to";
Packit bd1cd8
Packit bd1cd8
  // Verifies that iterator assignment works as expected.
Packit bd1cd8
  it++;
Packit bd1cd8
  EXPECT_FALSE(*it == *it2);
Packit bd1cd8
  it2 = it;
Packit bd1cd8
  EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
Packit bd1cd8
                           << "element same as its source points to";
Packit bd1cd8
Packit bd1cd8
  // Verifies that prefix operator++() returns *this.
Packit bd1cd8
  EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
Packit bd1cd8
                          << "refer to the original object";
Packit bd1cd8
Packit bd1cd8
  // Verifies that the result of the postfix operator++ points to the value
Packit bd1cd8
  // pointed to by the original iterator.
Packit bd1cd8
  int original_value = *it;  // Have to compute it outside of macro call to be
Packit bd1cd8
                             // unaffected by the parameter evaluation order.
Packit bd1cd8
  EXPECT_EQ(original_value, *(it++));
Packit bd1cd8
Packit bd1cd8
  // Verifies that prefix and postfix operator++() advance an iterator
Packit bd1cd8
  // all the same.
Packit bd1cd8
  it2 = it;
Packit bd1cd8
  it++;
Packit bd1cd8
  ++it2;
Packit bd1cd8
  EXPECT_TRUE(*it == *it2);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Range() generates the expected sequence.
Packit bd1cd8
TEST(RangeTest, IntRangeWithDefaultStep) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 3);
Packit bd1cd8
  const int expected_values[] = {0, 1, 2};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that Range() generates the single element sequence
Packit bd1cd8
// as expected when provided with range limits that are equal.
Packit bd1cd8
TEST(RangeTest, IntRangeSingleValue) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 1);
Packit bd1cd8
  const int expected_values[] = {0};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that Range() with generates empty sequence when
Packit bd1cd8
// supplied with an empty range.
Packit bd1cd8
TEST(RangeTest, IntRangeEmpty) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 0);
Packit bd1cd8
  VerifyGeneratorIsEmpty(gen);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Range() with custom step (greater then one) generates
Packit bd1cd8
// the expected sequence.
Packit bd1cd8
TEST(RangeTest, IntRangeWithCustomStep) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 9, 3);
Packit bd1cd8
  const int expected_values[] = {0, 3, 6};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Range() with custom step (greater then one) generates
Packit bd1cd8
// the expected sequence when the last element does not fall on the
Packit bd1cd8
// upper range limit. Sequences generated by Range() must not have
Packit bd1cd8
// elements beyond the range limits.
Packit bd1cd8
TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
Packit bd1cd8
  const ParamGenerator<int> gen = Range(0, 4, 3);
Packit bd1cd8
  const int expected_values[] = {0, 3};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Verifies that Range works with user-defined types that define
Packit bd1cd8
// copy constructor, operator=(), operator+(), and operator<().
Packit bd1cd8
class DogAdder {
Packit bd1cd8
 public:
Packit bd1cd8
  explicit DogAdder(const char* a_value) : value_(a_value) {}
Packit bd1cd8
  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
Packit bd1cd8
Packit bd1cd8
  DogAdder operator=(const DogAdder& other) {
Packit bd1cd8
    if (this != &other)
Packit bd1cd8
      value_ = other.value_;
Packit bd1cd8
    return *this;
Packit bd1cd8
  }
Packit bd1cd8
  DogAdder operator+(const DogAdder& other) const {
Packit bd1cd8
    Message msg;
Packit bd1cd8
    msg << value_.c_str() << other.value_.c_str();
Packit bd1cd8
    return DogAdder(msg.GetString().c_str());
Packit bd1cd8
  }
Packit bd1cd8
  bool operator<(const DogAdder& other) const {
Packit bd1cd8
    return value_ < other.value_;
Packit bd1cd8
  }
Packit bd1cd8
  const std::string& value() const { return value_; }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  std::string value_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
TEST(RangeTest, WorksWithACustomType) {
Packit bd1cd8
  const ParamGenerator<DogAdder> gen =
Packit bd1cd8
      Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
Packit bd1cd8
  ParamGenerator<DogAdder>::iterator it = gen.begin();
Packit bd1cd8
Packit bd1cd8
  ASSERT_FALSE(it == gen.end());
Packit bd1cd8
  EXPECT_STREQ("cat", it->value().c_str());
Packit bd1cd8
Packit bd1cd8
  ASSERT_FALSE(++it == gen.end());
Packit bd1cd8
  EXPECT_STREQ("catdog", it->value().c_str());
Packit bd1cd8
Packit bd1cd8
  EXPECT_TRUE(++it == gen.end());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
class IntWrapper {
Packit bd1cd8
 public:
Packit bd1cd8
  explicit IntWrapper(int a_value) : value_(a_value) {}
Packit bd1cd8
  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
Packit bd1cd8
Packit bd1cd8
  IntWrapper operator=(const IntWrapper& other) {
Packit bd1cd8
    value_ = other.value_;
Packit bd1cd8
    return *this;
Packit bd1cd8
  }
Packit bd1cd8
  // operator+() adds a different type.
Packit bd1cd8
  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
Packit bd1cd8
  bool operator<(const IntWrapper& other) const {
Packit bd1cd8
    return value_ < other.value_;
Packit bd1cd8
  }
Packit bd1cd8
  int value() const { return value_; }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  int value_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
Packit bd1cd8
  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
Packit bd1cd8
  ParamGenerator<IntWrapper>::iterator it = gen.begin();
Packit bd1cd8
Packit bd1cd8
  ASSERT_FALSE(it == gen.end());
Packit bd1cd8
  EXPECT_EQ(0, it->value());
Packit bd1cd8
Packit bd1cd8
  ASSERT_FALSE(++it == gen.end());
Packit bd1cd8
  EXPECT_EQ(1, it->value());
Packit bd1cd8
Packit bd1cd8
  EXPECT_TRUE(++it == gen.end());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that ValuesIn() with an array parameter generates
Packit bd1cd8
// the expected sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInArray) {
Packit bd1cd8
  int array[] = {3, 5, 8};
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(array);
Packit bd1cd8
  VerifyGenerator(gen, array);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that ValuesIn() with a const array parameter generates
Packit bd1cd8
// the expected sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInConstArray) {
Packit bd1cd8
  const int array[] = {3, 5, 8};
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(array);
Packit bd1cd8
  VerifyGenerator(gen, array);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that ValuesIn() with an array parameter containing a
Packit bd1cd8
// single element generates the single element sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInSingleElementArray) {
Packit bd1cd8
  int array[] = {42};
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(array);
Packit bd1cd8
  VerifyGenerator(gen, array);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that ValuesIn() generates the expected sequence for an STL
Packit bd1cd8
// container (vector).
Packit bd1cd8
TEST(ValuesInTest, ValuesInVector) {
Packit bd1cd8
  typedef ::std::vector<int> ContainerType;
Packit bd1cd8
  ContainerType values;
Packit bd1cd8
  values.push_back(3);
Packit bd1cd8
  values.push_back(5);
Packit bd1cd8
  values.push_back(8);
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(values);
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {3, 5, 8};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that ValuesIn() generates the expected sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInIteratorRange) {
Packit bd1cd8
  typedef ::std::vector<int> ContainerType;
Packit bd1cd8
  ContainerType values;
Packit bd1cd8
  values.push_back(3);
Packit bd1cd8
  values.push_back(5);
Packit bd1cd8
  values.push_back(8);
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {3, 5, 8};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
Packit bd1cd8
// single value generates a single-element sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
Packit bd1cd8
  typedef ::std::vector<int> ContainerType;
Packit bd1cd8
  ContainerType values;
Packit bd1cd8
  values.push_back(42);
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {42};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that ValuesIn() provided with an empty iterator range
Packit bd1cd8
// generates an empty sequence.
Packit bd1cd8
TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
Packit bd1cd8
  typedef ::std::vector<int> ContainerType;
Packit bd1cd8
  ContainerType values;
Packit bd1cd8
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
Packit bd1cd8
Packit bd1cd8
  VerifyGeneratorIsEmpty(gen);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that the Values() generates the expected sequence.
Packit bd1cd8
TEST(ValuesTest, ValuesWorks) {
Packit bd1cd8
  const ParamGenerator<int> gen = Values(3, 5, 8);
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {3, 5, 8};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Values() generates the expected sequences from elements of
Packit bd1cd8
// different types convertible to ParamGenerator's parameter type.
Packit bd1cd8
TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
Packit bd1cd8
  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
Packit bd1cd8
Packit bd1cd8
  const double expected_values[] = {3.0, 5.0, 8.0};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
TEST(ValuesTest, ValuesWorksForMaxLengthList) {
Packit bd1cd8
  const ParamGenerator<int> gen = Values(
Packit bd1cd8
      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
Packit bd1cd8
      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
Packit bd1cd8
      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
Packit bd1cd8
      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
Packit bd1cd8
      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {
Packit bd1cd8
      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
Packit bd1cd8
      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
Packit bd1cd8
      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
Packit bd1cd8
      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
Packit bd1cd8
      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case test. Tests that single-parameter Values() generates the sequence
Packit bd1cd8
// with the single value.
Packit bd1cd8
TEST(ValuesTest, ValuesWithSingleParameter) {
Packit bd1cd8
  const ParamGenerator<int> gen = Values(42);
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {42};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Bool() generates sequence (false, true).
Packit bd1cd8
TEST(BoolTest, BoolWorks) {
Packit bd1cd8
  const ParamGenerator<bool> gen = Bool();
Packit bd1cd8
Packit bd1cd8
  const bool expected_values[] = {false, true};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
# if GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
// Tests that Combine() with two parameters generates the expected sequence.
Packit bd1cd8
TEST(CombineTest, CombineWithTwoParameters) {
Packit bd1cd8
  const char* foo = "foo";
Packit bd1cd8
  const char* bar = "bar";
Packit bd1cd8
  const ParamGenerator<tuple<const char*, int> > gen =
Packit bd1cd8
      Combine(Values(foo, bar), Values(3, 4));
Packit bd1cd8
Packit bd1cd8
  tuple<const char*, int> expected_values[] = {
Packit bd1cd8
    make_tuple(foo, 3), make_tuple(foo, 4),
Packit bd1cd8
    make_tuple(bar, 3), make_tuple(bar, 4)};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that Combine() with three parameters generates the expected sequence.
Packit bd1cd8
TEST(CombineTest, CombineWithThreeParameters) {
Packit bd1cd8
  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
Packit bd1cd8
                                                            Values(3, 4),
Packit bd1cd8
                                                            Values(5, 6));
Packit bd1cd8
  tuple<int, int, int> expected_values[] = {
Packit bd1cd8
    make_tuple(0, 3, 5), make_tuple(0, 3, 6),
Packit bd1cd8
    make_tuple(0, 4, 5), make_tuple(0, 4, 6),
Packit bd1cd8
    make_tuple(1, 3, 5), make_tuple(1, 3, 6),
Packit bd1cd8
    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that the Combine() with the first parameter generating a single value
Packit bd1cd8
// sequence generates a sequence with the number of elements equal to the
Packit bd1cd8
// number of elements in the sequence generated by the second parameter.
Packit bd1cd8
TEST(CombineTest, CombineWithFirstParameterSingleValue) {
Packit bd1cd8
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
Packit bd1cd8
                                                       Values(0, 1));
Packit bd1cd8
Packit bd1cd8
  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that the Combine() with the second parameter generating a single value
Packit bd1cd8
// sequence generates a sequence with the number of elements equal to the
Packit bd1cd8
// number of elements in the sequence generated by the first parameter.
Packit bd1cd8
TEST(CombineTest, CombineWithSecondParameterSingleValue) {
Packit bd1cd8
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
Packit bd1cd8
                                                       Values(42));
Packit bd1cd8
Packit bd1cd8
  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that when the first parameter produces an empty sequence,
Packit bd1cd8
// Combine() produces an empty sequence, too.
Packit bd1cd8
TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
Packit bd1cd8
  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
Packit bd1cd8
                                                       Values(0, 1));
Packit bd1cd8
  VerifyGeneratorIsEmpty(gen);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that when the second parameter produces an empty sequence,
Packit bd1cd8
// Combine() produces an empty sequence, too.
Packit bd1cd8
TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
Packit bd1cd8
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
Packit bd1cd8
                                                       Range(1, 1));
Packit bd1cd8
  VerifyGeneratorIsEmpty(gen);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Edge case. Tests that combine works with the maximum number
Packit bd1cd8
// of parameters supported by Google Test (currently 10).
Packit bd1cd8
TEST(CombineTest, CombineWithMaxNumberOfParameters) {
Packit bd1cd8
  const char* foo = "foo";
Packit bd1cd8
  const char* bar = "bar";
Packit bd1cd8
  const ParamGenerator
Packit bd1cd8
                             int, int> > gen = Combine(Values(foo, bar),
Packit bd1cd8
                                                       Values(1), Values(2),
Packit bd1cd8
                                                       Values(3), Values(4),
Packit bd1cd8
                                                       Values(5), Values(6),
Packit bd1cd8
                                                       Values(7), Values(8),
Packit bd1cd8
                                                       Values(9));
Packit bd1cd8
Packit bd1cd8
  tuple<const char*, int, int, int, int, int, int, int, int, int>
Packit bd1cd8
      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
Packit bd1cd8
                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
# endif  // GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
// Tests that an generator produces correct sequence after being
Packit bd1cd8
// assigned from another generator.
Packit bd1cd8
TEST(ParamGeneratorTest, AssignmentWorks) {
Packit bd1cd8
  ParamGenerator<int> gen = Values(1, 2);
Packit bd1cd8
  const ParamGenerator<int> gen2 = Values(3, 4);
Packit bd1cd8
  gen = gen2;
Packit bd1cd8
Packit bd1cd8
  const int expected_values[] = {3, 4};
Packit bd1cd8
  VerifyGenerator(gen, expected_values);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// This test verifies that the tests are expanded and run as specified:
Packit bd1cd8
// one test per element from the sequence produced by the generator
Packit bd1cd8
// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
Packit bd1cd8
// fixture constructor, SetUp(), and TearDown() have run and have been
Packit bd1cd8
// supplied with the correct parameters.
Packit bd1cd8
Packit bd1cd8
// The use of environment object allows detection of the case where no test
Packit bd1cd8
// case functionality is run at all. In this case TestCaseTearDown will not
Packit bd1cd8
// be able to detect missing tests, naturally.
Packit bd1cd8
template <int kExpectedCalls>
Packit bd1cd8
class TestGenerationEnvironment : public ::testing::Environment {
Packit bd1cd8
 public:
Packit bd1cd8
  static TestGenerationEnvironment* Instance() {
Packit bd1cd8
    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
Packit bd1cd8
    return instance;
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
Packit bd1cd8
  void SetUpExecuted() { set_up_count_++; }
Packit bd1cd8
  void TearDownExecuted() { tear_down_count_++; }
Packit bd1cd8
  void TestBodyExecuted() { test_body_count_++; }
Packit bd1cd8
Packit bd1cd8
  virtual void TearDown() {
Packit bd1cd8
    // If all MultipleTestGenerationTest tests have been de-selected
Packit bd1cd8
    // by the filter flag, the following checks make no sense.
Packit bd1cd8
    bool perform_check = false;
Packit bd1cd8
Packit bd1cd8
    for (int i = 0; i < kExpectedCalls; ++i) {
Packit bd1cd8
      Message msg;
Packit bd1cd8
      msg << "TestsExpandedAndRun/" << i;
Packit bd1cd8
      if (UnitTestOptions::FilterMatchesTest(
Packit bd1cd8
             "TestExpansionModule/MultipleTestGenerationTest",
Packit bd1cd8
              msg.GetString().c_str())) {
Packit bd1cd8
        perform_check = true;
Packit bd1cd8
      }
Packit bd1cd8
    }
Packit bd1cd8
    if (perform_check) {
Packit bd1cd8
      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
Packit bd1cd8
          << "Fixture constructor of ParamTestGenerationTest test case "
Packit bd1cd8
          << "has not been run as expected.";
Packit bd1cd8
      EXPECT_EQ(kExpectedCalls, set_up_count_)
Packit bd1cd8
          << "Fixture SetUp method of ParamTestGenerationTest test case "
Packit bd1cd8
          << "has not been run as expected.";
Packit bd1cd8
      EXPECT_EQ(kExpectedCalls, tear_down_count_)
Packit bd1cd8
          << "Fixture TearDown method of ParamTestGenerationTest test case "
Packit bd1cd8
          << "has not been run as expected.";
Packit bd1cd8
      EXPECT_EQ(kExpectedCalls, test_body_count_)
Packit bd1cd8
          << "Test in ParamTestGenerationTest test case "
Packit bd1cd8
          << "has not been run as expected.";
Packit bd1cd8
    }
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
Packit bd1cd8
                                tear_down_count_(0), test_body_count_(0) {}
Packit bd1cd8
Packit bd1cd8
  int fixture_constructor_count_;
Packit bd1cd8
  int set_up_count_;
Packit bd1cd8
  int tear_down_count_;
Packit bd1cd8
  int test_body_count_;
Packit bd1cd8
Packit bd1cd8
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
const int test_generation_params[] = {36, 42, 72};
Packit bd1cd8
Packit bd1cd8
class TestGenerationTest : public TestWithParam<int> {
Packit bd1cd8
 public:
Packit bd1cd8
  enum {
Packit bd1cd8
    PARAMETER_COUNT =
Packit bd1cd8
        sizeof(test_generation_params)/sizeof(test_generation_params[0])
Packit bd1cd8
  };
Packit bd1cd8
Packit bd1cd8
  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
Packit bd1cd8
Packit bd1cd8
  TestGenerationTest() {
Packit bd1cd8
    Environment::Instance()->FixtureConstructorExecuted();
Packit bd1cd8
    current_parameter_ = GetParam();
Packit bd1cd8
  }
Packit bd1cd8
  virtual void SetUp() {
Packit bd1cd8
    Environment::Instance()->SetUpExecuted();
Packit bd1cd8
    EXPECT_EQ(current_parameter_, GetParam());
Packit bd1cd8
  }
Packit bd1cd8
  virtual void TearDown() {
Packit bd1cd8
    Environment::Instance()->TearDownExecuted();
Packit bd1cd8
    EXPECT_EQ(current_parameter_, GetParam());
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
  static void SetUpTestCase() {
Packit bd1cd8
    bool all_tests_in_test_case_selected = true;
Packit bd1cd8
Packit bd1cd8
    for (int i = 0; i < PARAMETER_COUNT; ++i) {
Packit bd1cd8
      Message test_name;
Packit bd1cd8
      test_name << "TestsExpandedAndRun/" << i;
Packit bd1cd8
      if ( !UnitTestOptions::FilterMatchesTest(
Packit bd1cd8
                "TestExpansionModule/MultipleTestGenerationTest",
Packit bd1cd8
                test_name.GetString())) {
Packit bd1cd8
        all_tests_in_test_case_selected = false;
Packit bd1cd8
      }
Packit bd1cd8
    }
Packit bd1cd8
    EXPECT_TRUE(all_tests_in_test_case_selected)
Packit bd1cd8
        << "When running the TestGenerationTest test case all of its tests\n"
Packit bd1cd8
        << "must be selected by the filter flag for the test case to pass.\n"
Packit bd1cd8
        << "If not all of them are enabled, we can't reliably conclude\n"
Packit bd1cd8
        << "that the correct number of tests have been generated.";
Packit bd1cd8
Packit bd1cd8
    collected_parameters_.clear();
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
  static void TearDownTestCase() {
Packit bd1cd8
    vector<int> expected_values(test_generation_params,
Packit bd1cd8
                                test_generation_params + PARAMETER_COUNT);
Packit bd1cd8
    // Test execution order is not guaranteed by Google Test,
Packit bd1cd8
    // so the order of values in collected_parameters_ can be
Packit bd1cd8
    // different and we have to sort to compare.
Packit bd1cd8
    sort(expected_values.begin(), expected_values.end());
Packit bd1cd8
    sort(collected_parameters_.begin(), collected_parameters_.end());
Packit bd1cd8
Packit bd1cd8
    EXPECT_TRUE(collected_parameters_ == expected_values);
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 protected:
Packit bd1cd8
  int current_parameter_;
Packit bd1cd8
  static vector<int> collected_parameters_;
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
Packit bd1cd8
};
Packit bd1cd8
vector<int> TestGenerationTest::collected_parameters_;
Packit bd1cd8
Packit bd1cd8
TEST_P(TestGenerationTest, TestsExpandedAndRun) {
Packit bd1cd8
  Environment::Instance()->TestBodyExecuted();
Packit bd1cd8
  EXPECT_EQ(current_parameter_, GetParam());
Packit bd1cd8
  collected_parameters_.push_back(GetParam());
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
Packit bd1cd8
                        ValuesIn(test_generation_params));
Packit bd1cd8
Packit bd1cd8
// This test verifies that the element sequence (third parameter of
Packit bd1cd8
// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
Packit bd1cd8
// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For
Packit bd1cd8
// that, we declare param_value_ to be a static member of
Packit bd1cd8
// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in
Packit bd1cd8
// main(), just before invocation of InitGoogleTest().  After calling
Packit bd1cd8
// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated
Packit bd1cd8
// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
Packit bd1cd8
// test with parameter other than 1, and the test body will fail the
Packit bd1cd8
// assertion.
Packit bd1cd8
class GeneratorEvaluationTest : public TestWithParam<int> {
Packit bd1cd8
 public:
Packit bd1cd8
  static int param_value() { return param_value_; }
Packit bd1cd8
  static void set_param_value(int param_value) { param_value_ = param_value; }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  static int param_value_;
Packit bd1cd8
};
Packit bd1cd8
int GeneratorEvaluationTest::param_value_ = 0;
Packit bd1cd8
Packit bd1cd8
TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
Packit bd1cd8
  EXPECT_EQ(1, GetParam());
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(GenEvalModule,
Packit bd1cd8
                        GeneratorEvaluationTest,
Packit bd1cd8
                        Values(GeneratorEvaluationTest::param_value()));
Packit bd1cd8
Packit bd1cd8
// Tests that generators defined in a different translation unit are
Packit bd1cd8
// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
Packit bd1cd8
extern ParamGenerator<int> extern_gen;
Packit bd1cd8
class ExternalGeneratorTest : public TestWithParam<int> {};
Packit bd1cd8
TEST_P(ExternalGeneratorTest, ExternalGenerator) {
Packit bd1cd8
  // Sequence produced by extern_gen contains only a single value
Packit bd1cd8
  // which we verify here.
Packit bd1cd8
  EXPECT_EQ(GetParam(), 33);
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
Packit bd1cd8
                        ExternalGeneratorTest,
Packit bd1cd8
                        extern_gen);
Packit bd1cd8
Packit bd1cd8
// Tests that a parameterized test case can be defined in one translation
Packit bd1cd8
// unit and instantiated in another. This test will be instantiated in
Packit bd1cd8
// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
Packit bd1cd8
// defined in gtest-param-test_test.h.
Packit bd1cd8
TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
Packit bd1cd8
  EXPECT_EQ(0, GetParam() % 33);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Tests that a parameterized test case can be instantiated with multiple
Packit bd1cd8
// generators.
Packit bd1cd8
class MultipleInstantiationTest : public TestWithParam<int> {};
Packit bd1cd8
TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
Packit bd1cd8
Packit bd1cd8
// Tests that a parameterized test case can be instantiated
Packit bd1cd8
// in multiple translation units. This test will be instantiated
Packit bd1cd8
// here and in gtest-param-test_test2.cc.
Packit bd1cd8
// InstantiationInMultipleTranslationUnitsTest fixture class
Packit bd1cd8
// is defined in gtest-param-test_test.h.
Packit bd1cd8
TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
Packit bd1cd8
  EXPECT_EQ(0, GetParam() % 42);
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(Sequence1,
Packit bd1cd8
                        InstantiationInMultipleTranslaionUnitsTest,
Packit bd1cd8
                        Values(42, 42*2));
Packit bd1cd8
Packit bd1cd8
// Tests that each iteration of parameterized test runs in a separate test
Packit bd1cd8
// object.
Packit bd1cd8
class SeparateInstanceTest : public TestWithParam<int> {
Packit bd1cd8
 public:
Packit bd1cd8
  SeparateInstanceTest() : count_(0) {}
Packit bd1cd8
Packit bd1cd8
  static void TearDownTestCase() {
Packit bd1cd8
    EXPECT_GE(global_count_, 2)
Packit bd1cd8
        << "If some (but not all) SeparateInstanceTest tests have been "
Packit bd1cd8
        << "filtered out this test will fail. Make sure that all "
Packit bd1cd8
        << "GeneratorEvaluationTest are selected or de-selected together "
Packit bd1cd8
        << "by the test filter.";
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 protected:
Packit bd1cd8
  int count_;
Packit bd1cd8
  static int global_count_;
Packit bd1cd8
};
Packit bd1cd8
int SeparateInstanceTest::global_count_ = 0;
Packit bd1cd8
Packit bd1cd8
TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
Packit bd1cd8
  EXPECT_EQ(0, count_++);
Packit bd1cd8
  global_count_++;
Packit bd1cd8
}
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
Packit bd1cd8
Packit bd1cd8
// Tests that all instantiations of a test have named appropriately. Test
Packit bd1cd8
// defined with TEST_P(TestCaseName, TestName) and instantiated with
Packit bd1cd8
// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
Packit bd1cd8
// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
Packit bd1cd8
// sequence element used to instantiate the test.
Packit bd1cd8
class NamingTest : public TestWithParam<int> {};
Packit bd1cd8
Packit bd1cd8
TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
Packit bd1cd8
  const ::testing::TestInfo* const test_info =
Packit bd1cd8
     ::testing::UnitTest::GetInstance()->current_test_info();
Packit bd1cd8
Packit bd1cd8
  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
Packit bd1cd8
Packit bd1cd8
  Message index_stream;
Packit bd1cd8
  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
Packit bd1cd8
  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
Packit bd1cd8
Packit bd1cd8
  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
Packit bd1cd8
Packit bd1cd8
// Tests that user supplied custom parameter names are working correctly.
Packit bd1cd8
// Runs the test with a builtin helper method which uses PrintToString,
Packit bd1cd8
// as well as a custom function and custom functor to ensure all possible
Packit bd1cd8
// uses work correctly.
Packit bd1cd8
class CustomFunctorNamingTest : public TestWithParam<std::string> {};
Packit bd1cd8
TEST_P(CustomFunctorNamingTest, CustomTestNames) {}
Packit bd1cd8
Packit bd1cd8
struct CustomParamNameFunctor {
Packit bd1cd8
  std::string operator()(const ::testing::TestParamInfo<std::string>& info) {
Packit bd1cd8
    return info.param;
Packit bd1cd8
  }
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(CustomParamNameFunctor,
Packit bd1cd8
                        CustomFunctorNamingTest,
Packit bd1cd8
                        Values(std::string("FunctorName")),
Packit bd1cd8
                        CustomParamNameFunctor());
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(AllAllowedCharacters,
Packit bd1cd8
                        CustomFunctorNamingTest,
Packit bd1cd8
                        Values("abcdefghijklmnopqrstuvwxyz",
Packit bd1cd8
                               "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
Packit bd1cd8
                               "01234567890_"),
Packit bd1cd8
                        CustomParamNameFunctor());
Packit bd1cd8
Packit bd1cd8
inline std::string CustomParamNameFunction(
Packit bd1cd8
    const ::testing::TestParamInfo<std::string>& info) {
Packit bd1cd8
  return info.param;
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
class CustomFunctionNamingTest : public TestWithParam<std::string> {};
Packit bd1cd8
TEST_P(CustomFunctionNamingTest, CustomTestNames) {}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(CustomParamNameFunction,
Packit bd1cd8
                        CustomFunctionNamingTest,
Packit bd1cd8
                        Values(std::string("FunctionName")),
Packit bd1cd8
                        CustomParamNameFunction);
Packit bd1cd8
Packit bd1cd8
#if GTEST_LANG_CXX11
Packit bd1cd8
Packit bd1cd8
// Test custom naming with a lambda
Packit bd1cd8
Packit bd1cd8
class CustomLambdaNamingTest : public TestWithParam<std::string> {};
Packit bd1cd8
TEST_P(CustomLambdaNamingTest, CustomTestNames) {}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(CustomParamNameLambda,
Packit bd1cd8
                        CustomLambdaNamingTest,
Packit bd1cd8
                        Values(std::string("LambdaName")),
Packit bd1cd8
                        [](const ::testing::TestParamInfo<std::string>& info) {
Packit bd1cd8
                          return info.param;
Packit bd1cd8
                        });
Packit bd1cd8
Packit bd1cd8
#endif  // GTEST_LANG_CXX11
Packit bd1cd8
Packit bd1cd8
TEST(CustomNamingTest, CheckNameRegistry) {
Packit bd1cd8
  ::testing::UnitTest* unit_test = ::testing::UnitTest::GetInstance();
Packit bd1cd8
  std::set<std::string> test_names;
Packit bd1cd8
  for (int case_num = 0;
Packit bd1cd8
       case_num < unit_test->total_test_case_count();
Packit bd1cd8
       ++case_num) {
Packit bd1cd8
    const ::testing::TestCase* test_case = unit_test->GetTestCase(case_num);
Packit bd1cd8
    for (int test_num = 0;
Packit bd1cd8
         test_num < test_case->total_test_count();
Packit bd1cd8
         ++test_num) {
Packit bd1cd8
      const ::testing::TestInfo* test_info = test_case->GetTestInfo(test_num);
Packit bd1cd8
      test_names.insert(std::string(test_info->name()));
Packit bd1cd8
    }
Packit bd1cd8
  }
Packit bd1cd8
  EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctorName"));
Packit bd1cd8
  EXPECT_EQ(1u, test_names.count("CustomTestNames/FunctionName"));
Packit bd1cd8
#if GTEST_LANG_CXX11
Packit bd1cd8
  EXPECT_EQ(1u, test_names.count("CustomTestNames/LambdaName"));
Packit bd1cd8
#endif  // GTEST_LANG_CXX11
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
// Test a numeric name to ensure PrintToStringParamName works correctly.
Packit bd1cd8
Packit bd1cd8
class CustomIntegerNamingTest : public TestWithParam<int> {};
Packit bd1cd8
Packit bd1cd8
TEST_P(CustomIntegerNamingTest, TestsReportCorrectNames) {
Packit bd1cd8
  const ::testing::TestInfo* const test_info =
Packit bd1cd8
     ::testing::UnitTest::GetInstance()->current_test_info();
Packit bd1cd8
  Message test_name_stream;
Packit bd1cd8
  test_name_stream << "TestsReportCorrectNames/" << GetParam();
Packit bd1cd8
  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(PrintToString,
Packit bd1cd8
                        CustomIntegerNamingTest,
Packit bd1cd8
                        Range(0, 5),
Packit bd1cd8
                        ::testing::PrintToStringParamName());
Packit bd1cd8
Packit bd1cd8
// Test a custom struct with PrintToString.
Packit bd1cd8
Packit bd1cd8
struct CustomStruct {
Packit bd1cd8
  explicit CustomStruct(int value) : x(value) {}
Packit bd1cd8
  int x;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
std::ostream& operator<<(std::ostream& stream, const CustomStruct& val) {
Packit bd1cd8
  stream << val.x;
Packit bd1cd8
  return stream;
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
class CustomStructNamingTest : public TestWithParam<CustomStruct> {};
Packit bd1cd8
Packit bd1cd8
TEST_P(CustomStructNamingTest, TestsReportCorrectNames) {
Packit bd1cd8
  const ::testing::TestInfo* const test_info =
Packit bd1cd8
     ::testing::UnitTest::GetInstance()->current_test_info();
Packit bd1cd8
  Message test_name_stream;
Packit bd1cd8
  test_name_stream << "TestsReportCorrectNames/" << GetParam();
Packit bd1cd8
  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(PrintToString,
Packit bd1cd8
                        CustomStructNamingTest,
Packit bd1cd8
                        Values(CustomStruct(0), CustomStruct(1)),
Packit bd1cd8
                        ::testing::PrintToStringParamName());
Packit bd1cd8
Packit bd1cd8
// Test that using a stateful parameter naming function works as expected.
Packit bd1cd8
Packit bd1cd8
struct StatefulNamingFunctor {
Packit bd1cd8
  StatefulNamingFunctor() : sum(0) {}
Packit bd1cd8
  std::string operator()(const ::testing::TestParamInfo<int>& info) {
Packit bd1cd8
    int value = info.param + sum;
Packit bd1cd8
    sum += info.param;
Packit bd1cd8
    return ::testing::PrintToString(value);
Packit bd1cd8
  }
Packit bd1cd8
  int sum;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
class StatefulNamingTest : public ::testing::TestWithParam<int> {
Packit bd1cd8
 protected:
Packit bd1cd8
  StatefulNamingTest() : sum_(0) {}
Packit bd1cd8
  int sum_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
TEST_P(StatefulNamingTest, TestsReportCorrectNames) {
Packit bd1cd8
  const ::testing::TestInfo* const test_info =
Packit bd1cd8
     ::testing::UnitTest::GetInstance()->current_test_info();
Packit bd1cd8
  sum_ += GetParam();
Packit bd1cd8
  Message test_name_stream;
Packit bd1cd8
  test_name_stream << "TestsReportCorrectNames/" << sum_;
Packit bd1cd8
  EXPECT_STREQ(test_name_stream.GetString().c_str(), test_info->name());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(StatefulNamingFunctor,
Packit bd1cd8
                        StatefulNamingTest,
Packit bd1cd8
                        Range(0, 5),
Packit bd1cd8
                        StatefulNamingFunctor());
Packit bd1cd8
Packit bd1cd8
// Class that cannot be streamed into an ostream.  It needs to be copyable
Packit bd1cd8
// (and, in case of MSVC, also assignable) in order to be a test parameter
Packit bd1cd8
// type.  Its default copy constructor and assignment operator do exactly
Packit bd1cd8
// what we need.
Packit bd1cd8
class Unstreamable {
Packit bd1cd8
 public:
Packit bd1cd8
  explicit Unstreamable(int value) : value_(value) {}
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  int value_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
class CommentTest : public TestWithParam<Unstreamable> {};
Packit bd1cd8
Packit bd1cd8
TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
Packit bd1cd8
  const ::testing::TestInfo* const test_info =
Packit bd1cd8
     ::testing::UnitTest::GetInstance()->current_test_info();
Packit bd1cd8
Packit bd1cd8
  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
Packit bd1cd8
                        CommentTest,
Packit bd1cd8
                        Values(Unstreamable(1)));
Packit bd1cd8
Packit bd1cd8
// Verify that we can create a hierarchy of test fixtures, where the base
Packit bd1cd8
// class fixture is not parameterized and the derived class is. In this case
Packit bd1cd8
// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We
Packit bd1cd8
// perform simple tests on both.
Packit bd1cd8
class NonParameterizedBaseTest : public ::testing::Test {
Packit bd1cd8
 public:
Packit bd1cd8
  NonParameterizedBaseTest() : n_(17) { }
Packit bd1cd8
 protected:
Packit bd1cd8
  int n_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
class ParameterizedDerivedTest : public NonParameterizedBaseTest,
Packit bd1cd8
                                 public ::testing::WithParamInterface<int> {
Packit bd1cd8
 protected:
Packit bd1cd8
  ParameterizedDerivedTest() : count_(0) { }
Packit bd1cd8
  int count_;
Packit bd1cd8
  static int global_count_;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
int ParameterizedDerivedTest::global_count_ = 0;
Packit bd1cd8
Packit bd1cd8
TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
Packit bd1cd8
  EXPECT_EQ(17, n_);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
TEST_P(ParameterizedDerivedTest, SeesSequence) {
Packit bd1cd8
  EXPECT_EQ(17, n_);
Packit bd1cd8
  EXPECT_EQ(0, count_++);
Packit bd1cd8
  EXPECT_EQ(GetParam(), global_count_++);
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
Packit bd1cd8
Packit bd1cd8
TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
Packit bd1cd8
  EXPECT_DEATH_IF_SUPPORTED(GetParam(),
Packit bd1cd8
                            ".* value-parameterized test .*");
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
Packit bd1cd8
Packit bd1cd8
#endif  // GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
Packit bd1cd8
#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
Packit bd1cd8
  FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
Packit bd1cd8
#endif
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
int main(int argc, char **argv) {
Packit bd1cd8
#if GTEST_HAS_PARAM_TEST
Packit bd1cd8
  // Used in TestGenerationTest test case.
Packit bd1cd8
  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
Packit bd1cd8
  // Used in GeneratorEvaluationTest test case. Tests that the updated value
Packit bd1cd8
  // will be picked up for instantiating tests in GeneratorEvaluationTest.
Packit bd1cd8
  GeneratorEvaluationTest::set_param_value(1);
Packit bd1cd8
#endif  // GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
  ::testing::InitGoogleTest(&argc, argv);
Packit bd1cd8
Packit bd1cd8
#if GTEST_HAS_PARAM_TEST
Packit bd1cd8
  // Used in GeneratorEvaluationTest test case. Tests that value updated
Packit bd1cd8
  // here will NOT be used for instantiating tests in
Packit bd1cd8
  // GeneratorEvaluationTest.
Packit bd1cd8
  GeneratorEvaluationTest::set_param_value(2);
Packit bd1cd8
#endif  // GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
  return RUN_ALL_TESTS();
Packit bd1cd8
}