1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008 Google Inc.
2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <set>
33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector>
34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "test/gtest-typed-test_test.h"
36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/gtest.h"
37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::Test;
39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type-parameterized test.
43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CommonTest : public Test {
45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // For some technical reason, SetUpTestCase() and TearDownTestCase()
46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // must be public.
47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void SetUpTestCase() {
49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    shared_ = new T(5);
50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void TearDownTestCase() {
53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    delete shared_;
54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    shared_ = NULL;
55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This 'protected:' is optional.  There's no harm in making all
58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // members of this fixture class template public.
59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter protected:
60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We used to use std::list here, but switched to std::vector since
61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // MSVC's <list> doesn't compile cleanly with /W4.
62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef std::vector<T> Vector;
63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef std::set<int> IntSet;
64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CommonTest() : value_(1) {}
66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CommonTest() { EXPECT_EQ(3, value_); }
68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void SetUp() {
70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_EQ(1, value_);
71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    value_++;
72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TearDown() {
75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_EQ(2, value_);
76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    value_++;
77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T value_;
80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static T* shared_;
81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterT* CommonTest<T>::shared_ = NULL;
85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This #ifdef block tests typed tests.
87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST
88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::Types;
90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and SetUp()/TearDown() work correctly in typed tests
93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef Types<char, int> TwoTypes;
95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE(CommonTest, TwoTypes);
96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(CommonTest, ValuesAreCorrect) {
98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static members of the fixture class template can be visited via
99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the TestFixture:: prefix.
100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(5, *TestFixture::shared_);
101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Typedefs in the fixture class template can be visited via the
103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // "typename TestFixture::" prefix.
104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typename TestFixture::Vector empty;
105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(0U, empty.size());
106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typename TestFixture::IntSet empty2;
108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(0U, empty2.size());
109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Non-static members of the fixture class must be visited via
111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 'this', as required by C++ for class templates.
112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(2, this->value_);
113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The second test makes sure shared_ is not deleted after the first
116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test.
117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(CommonTest, ValuesAreStillCorrect) {
118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static members of the fixture class template can also be visited
119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // via 'this'.
120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_TRUE(this->shared_ != NULL);
121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(5, *this->shared_);
122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TypeParam can be used to refer to the type parameter.
124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that multiple TYPED_TEST_CASE's can be defined in the same
128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// translation unit.
129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypedTest1 : public Test {
132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Verifies that the second argument of TYPED_TEST_CASE can be a
135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// single type.
136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE(TypedTest1, int);
137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(TypedTest1, A) {}
138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypedTest2 : public Test {
141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Verifies that the second argument of TYPED_TEST_CASE can be a
144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Types<...> type list.
145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE(TypedTest2, Types<int>);
146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This also verifies that tests from different typed test cases can
148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// share the same name.
149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(TypedTest2, A) {}
150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that a typed test case can be defined in a namespace.
152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace library1 {
154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass NumericTest : public Test {
157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef Types<int, long> NumericTypes;
160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE(NumericTest, NumericTypes);
161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(NumericTest, DefaultIsZero) {
163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(0, TypeParam());
164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace library1
167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST
169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This #ifdef block tests type-parameterized tests.
171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST_P
172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::Types;
174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::internal::TypedTestCasePState;
175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests TypedTestCasePState.
177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypedTestCasePStateTest : public Test {
179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter protected:
180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void SetUp() {
181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    state_.AddTestName("foo.cc", 0, "FooTest", "A");
182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    state_.AddTestName("foo.cc", 0, "FooTest", "B");
183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    state_.AddTestName("foo.cc", 0, "FooTest", "C");
184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TypedTestCasePState state_;
187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* tests = "A, B, C";
191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(tests,
192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Makes sure that the order of the tests and spaces around the names
196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// don't matter.
197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* tests = "A,C,   B";
199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(tests,
200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(
207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      "foo\\.cc.1.?: Test A is listed more than once\\.");
209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(
213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      "foo\\.cc.1.?: No test named D can be found in this test case\\.");
215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(
219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      "foo\\.cc.1.?: You forgot to list test B\\.");
221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that defining a test for a parameterized test case generates
224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a run-time error if the test case has been registered.
225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(
228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      state_.AddTestName("foo.cc", 2, "FooTest", "D"),
229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      "\\(FooTest, \\.\\.\\.\\)\\.");
231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and SetUp()/TearDown() work correctly in type-parameterized tests.
235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DerivedTest : public CommonTest<T> {
238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE_P(DerivedTest);
241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static members of the fixture class template can be visited via
244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the TestFixture:: prefix.
245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(5, *TestFixture::shared_);
246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Non-static members of the fixture class must be visited via
248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 'this', as required by C++ for class templates.
249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(2, this->value_);
250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The second test makes sure shared_ is not deleted after the first
253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test.
254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static members of the fixture class template can also be visited
256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // via 'this'.
257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_TRUE(this->shared_ != NULL);
258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(5, *this->shared_);
259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(2, this->value_);
260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterREGISTER_TYPED_TEST_CASE_P(DerivedTest,
263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           ValuesAreCorrect, ValuesAreStillCorrect);
264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef Types<short, long> MyTwoTypes;
266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// translation unit.
270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypedTestP1 : public Test {
273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE_P(TypedTestP1);
276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For testing that the code between TYPED_TEST_CASE_P() and
278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TYPED_TEST_P() is not enclosed in a namespace.
279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef int IntAfterTypedTestCaseP;
280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(TypedTestP1, A) {}
282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(TypedTestP1, B) {}
283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For testing that the code between TYPED_TEST_P() and
285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef int IntBeforeRegisterTypedTestCaseP;
287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypedTestP2 : public Test {
292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE_P(TypedTestP2);
295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This also verifies that tests from different type-parameterized
297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test cases can share the same name.
298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(TypedTestP2, A) {}
299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Verifies that the code between TYPED_TEST_CASE_P() and
303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterIntAfterTypedTestCaseP after = 0;
305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterIntBeforeRegisterTypedTestCaseP before = 0;
306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can be either a single type or a Types<...> type list.
309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that the same type-parameterized test case can be
313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instantiated more than once in the same translation unit.
314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that the same type-parameterized test case can be
317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instantiated in different translation units linked together.
318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef Types<std::vector<double>, std::set<char> > MyContainers;
320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that a type-parameterized test case can be defined and
323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instantiated in a namespace.
324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace library2 {
326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass NumericTest : public Test {
329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE_P(NumericTest);
332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(NumericTest, DefaultIsZero) {
334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(0, TypeParam());
335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_LT(TypeParam(0), TypeParam(1));
339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterREGISTER_TYPED_TEST_CASE_P(NumericTest,
342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           DefaultIsZero, ZeroIsLessThanOne);
343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef Types<int, double> NumericTypes;
344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace library2
347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST_P
349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test may not support type-parameterized tests with some
353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compilers. If we use conditional compilation to compile out all
354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// code referring to the gtest_main library, MSVC linker will not link
355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that library at all and consequently complain about missing entry
356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// point defined in that library (fatal error LNK1561: entry point
357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// must be defined). This dummy test keeps gtest_main linked in.
358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
361