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#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This header implements typed tests and type-parameterized tests.
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Typed (aka type-driven) tests repeat the same test for types in a
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// list.  You must know which types you want to test with when writing
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// typed tests. Here's how you do it:
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if 0
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// First, define a fixture class template.  It should be parameterized
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by a type.  Remember to derive it from testing::Test.
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FooTest : public testing::Test {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ...
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef std::list<T> List;
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static T shared_;
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  T value_;
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Next, associate a list of types with the test case, which will be
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// repeated for each type in the list.  The typedef is necessary for
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the macro to parse correctly.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef testing::Types<char, int, unsigned int> MyTypes;
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE(FooTest, MyTypes);
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If the type list contains only one type, you can write that type
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// directly without Types<...>:
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   TYPED_TEST_CASE(FooTest, int);
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// tests for this test case as you want.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(FooTest, DoesBlah) {
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Inside a test, refer to TypeParam to get the type parameter.
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Since we are inside a derived class template, C++ requires use to
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // visit the members of FooTest via 'this'.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TypeParam n = this->value_;
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // To visit static members of the fixture, add the TestFixture::
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // prefix.
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  n += TestFixture::shared_;
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // To refer to typedefs in the fixture, add the "typename
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // TestFixture::" prefix.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typename TestFixture::List values;
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  values.push_back(n);
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ...
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(FooTest, HasPropertyA) { ... }
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // 0
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Type-parameterized tests are abstract test patterns parameterized
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by a type.  Compared with typed tests, type-parameterized tests
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// allow you to define the test pattern without knowing what the type
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// parameters are.  The defined pattern can be instantiated with
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// different types any number of times, in any number of translation
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// units.
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If you are designing an interface or concept, you can define a
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// suite of type-parameterized tests to verify properties that any
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// valid implementation of the interface/concept should have.  Then,
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// each implementation can easily instantiate the test suite to verify
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// that it conforms to the requirements, without having to write
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// similar tests repeatedly.  Here's an example:
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if 0
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// First, define a fixture class template.  It should be parameterized
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by a type.  Remember to derive it from testing::Test.
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T>
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FooTest : public testing::Test {
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ...
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Next, declare that you will define a type-parameterized test case
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (the _P suffix is for "parameterized" or "pattern", whichever you
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// prefer):
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE_P(FooTest);
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Then, use TYPED_TEST_P() to define as many type-parameterized tests
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for this type-parameterized test case as you want.
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(FooTest, DoesBlah) {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Inside a test, refer to TypeParam to get the type parameter.
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TypeParam n = 0;
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ...
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(FooTest, HasPropertyA) { ... }
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Now the tricky part: you need to register all test patterns before
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you can instantiate them.  The first argument of the macro is the
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test case name; the rest are the names of the tests in this test
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// case.
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleREGISTER_TYPED_TEST_CASE_P(FooTest,
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           DoesBlah, HasPropertyA);
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Finally, you are free to instantiate the pattern with the types you
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// want.  If you put the above code in a header file, you can #include
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// it in multiple C++ source files and instantiate it multiple times.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To distinguish different instances of the pattern, the first
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// argument to the INSTANTIATE_* macro is a prefix that will be added
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to the actual test case name.  Remember to pick unique prefixes for
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// different instances.
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef testing::Types<char, int, unsigned int> MyTypes;
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If the type list contains only one type, you can write that type
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// directly without Types<...>:
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // 0
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/internal/gtest-port.h>
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/internal/gtest-type-util.h>
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Implements typed tests.
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_TYPED_TEST
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Expands to the name of the typedef for the type parameters of the
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// given test case.
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define TYPED_TEST_CASE(CaseName, Types) \
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::testing::internal::TypeList<Types>::type \
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_TYPE_PARAMS_(CaseName)
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define TYPED_TEST(CaseName, TestName) \
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename gtest_TypeParam_> \
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      : public CaseName<gtest_TypeParam_> { \
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private: \
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typedef CaseName<gtest_TypeParam_> TestFixture; \
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typedef gtest_TypeParam_ TypeParam; \
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void TestBody(); \
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }; \
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool gtest_##CaseName##_##TestName##_registered_ = \
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ::testing::internal::TypeParameterizedTest< \
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          CaseName, \
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          ::testing::internal::TemplateSel< \
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              "", #CaseName, #TestName, 0); \
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename gtest_TypeParam_> \
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_HAS_TYPED_TEST
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Implements type-parameterized tests.
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_TYPED_TEST_P
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Expands to the namespace name that the type-parameterized tests for
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the given type-parameterized test case are defined in.  The exact
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// name of the namespace is subject to change without notice.
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_CASE_NAMESPACE_(TestCaseName) \
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gtest_case_##TestCaseName##_
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Expands to the name of the variable used to remember the names of
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the defined tests in the given test case.
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gtest_typed_test_case_p_state_##TestCaseName##_
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Expands to the name of the variable used to remember the names of
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the registered tests in the given test case.
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gtest_registered_test_names_##TestCaseName##_
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The variables defined in the type-parameterized test macros are
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static as typically these macros are used in a .h file that can be
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// #included in multiple translation units linked together.
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define TYPED_TEST_CASE_P(CaseName) \
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static ::testing::internal::TypedTestCasePState \
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define TYPED_TEST_P(CaseName, TestName) \
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename gtest_TypeParam_> \
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class TestName : public CaseName<gtest_TypeParam_> { \
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private: \
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typedef CaseName<gtest_TypeParam_> TestFixture; \
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    typedef gtest_TypeParam_ TypeParam; \
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    virtual void TestBody(); \
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }; \
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool gtest_##TestName##_defined_ = \
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          __FILE__, __LINE__, #CaseName, #TestName); \
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } \
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename gtest_TypeParam_> \
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } \
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          __FILE__, __LINE__, #__VA_ARGS__)
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool gtest_##Prefix##_##CaseName = \
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ::testing::internal::TypeParameterizedTestCase<CaseName, \
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          ::testing::internal::TypeList<Types>::type>::Register(\
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_HAS_TYPED_TEST_P
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
254