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