1acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Copyright 2008 Google Inc.
2acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// All Rights Reserved.
3acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
4acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Redistribution and use in source and binary forms, with or without
5acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// modification, are permitted provided that the following conditions are
6acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// met:
7acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
8acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//     * Redistributions of source code must retain the above copyright
9acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// notice, this list of conditions and the following disclaimer.
10acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//     * Redistributions in binary form must reproduce the above
11acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// copyright notice, this list of conditions and the following disclaimer
12acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// in the documentation and/or other materials provided with the
13acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// distribution.
14acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//     * Neither the name of Google Inc. nor the names of its
15acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// contributors may be used to endorse or promote products derived from
16acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// this software without specific prior written permission.
17acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
18acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
30acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Author: wan@google.com (Zhanyong Wan)
31acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
32acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
33acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
34acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
35acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// This header implements typed tests and type-parameterized tests.
36acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
37acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Typed (aka type-driven) tests repeat the same test for types in a
38acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// list.  You must know which types you want to test with when writing
39acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// typed tests. Here's how you do it:
40acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
41acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#if 0
42acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
43acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// First, define a fixture class template.  It should be parameterized
44acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// by a type.  Remember to derive it from testing::Test.
45acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqiantemplate <typename T>
46acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianclass FooTest : public testing::Test {
47acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian public:
48acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  ...
49acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  typedef std::list<T> List;
50acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  static T shared_;
51acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  T value_;
52acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian};
53acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
54acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Next, associate a list of types with the test case, which will be
55acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// repeated for each type in the list.  The typedef is necessary for
56acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// the macro to parse correctly.
57acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqiantypedef testing::Types<char, int, unsigned int> MyTypes;
58acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST_CASE(FooTest, MyTypes);
59acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
60acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// If the type list contains only one type, you can write that type
61acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// directly without Types<...>:
62acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//   TYPED_TEST_CASE(FooTest, int);
63acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
64acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
65acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// tests for this test case as you want.
66acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST(FooTest, DoesBlah) {
67acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // Inside a test, refer to TypeParam to get the type parameter.
68acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // Since we are inside a derived class template, C++ requires use to
69acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // visit the members of FooTest via 'this'.
70acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  TypeParam n = this->value_;
71acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
72acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // To visit static members of the fixture, add the TestFixture::
73acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // prefix.
74acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  n += TestFixture::shared_;
75acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
76acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // To refer to typedefs in the fixture, add the "typename
77acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // TestFixture::" prefix.
78acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  typename TestFixture::List values;
79acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  values.push_back(n);
80acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  ...
81acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian}
82acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
83acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST(FooTest, HasPropertyA) { ... }
84acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
85acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#endif  // 0
86acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
87acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Type-parameterized tests are abstract test patterns parameterized
88acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// by a type.  Compared with typed tests, type-parameterized tests
89acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// allow you to define the test pattern without knowing what the type
90acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// parameters are.  The defined pattern can be instantiated with
91acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// different types any number of times, in any number of translation
92acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// units.
93acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
94acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// If you are designing an interface or concept, you can define a
95acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// suite of type-parameterized tests to verify properties that any
96acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// valid implementation of the interface/concept should have.  Then,
97acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// each implementation can easily instantiate the test suite to verify
98acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// that it conforms to the requirements, without having to write
99acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// similar tests repeatedly.  Here's an example:
100acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
101acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#if 0
102acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
103acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// First, define a fixture class template.  It should be parameterized
104acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// by a type.  Remember to derive it from testing::Test.
105acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqiantemplate <typename T>
106acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianclass FooTest : public testing::Test {
107acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  ...
108acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian};
109acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
110acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Next, declare that you will define a type-parameterized test case
111acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// (the _P suffix is for "parameterized" or "pattern", whichever you
112acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// prefer):
113acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST_CASE_P(FooTest);
114acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
115acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Then, use TYPED_TEST_P() to define as many type-parameterized tests
116acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// for this type-parameterized test case as you want.
117acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST_P(FooTest, DoesBlah) {
118acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  // Inside a test, refer to TypeParam to get the type parameter.
119acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  TypeParam n = 0;
120acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  ...
121acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian}
122acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
123acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianTYPED_TEST_P(FooTest, HasPropertyA) { ... }
124acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
125acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Now the tricky part: you need to register all test patterns before
126acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// you can instantiate them.  The first argument of the macro is the
127acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// test case name; the rest are the names of the tests in this test
128acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// case.
129acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianREGISTER_TYPED_TEST_CASE_P(FooTest,
130acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian                           DoesBlah, HasPropertyA);
131acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
132acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Finally, you are free to instantiate the pattern with the types you
133acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// want.  If you put the above code in a header file, you can #include
134acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// it in multiple C++ source files and instantiate it multiple times.
135acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
136acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// To distinguish different instances of the pattern, the first
137acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// argument to the INSTANTIATE_* macro is a prefix that will be added
138acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// to the actual test case name.  Remember to pick unique prefixes for
139acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// different instances.
140acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqiantypedef testing::Types<char, int, unsigned int> MyTypes;
141acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqianINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
142acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
143acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// If the type list contains only one type, you can write that type
144acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// directly without Types<...>:
145acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
146acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
147acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#endif  // 0
148acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
1492620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-port.h"
1502620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-type-util.h"
151acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
152acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Implements typed tests.
153acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
1544cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST
155acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
156acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
157acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
158acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Expands to the name of the typedef for the type parameters of the
159acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// given test case.
160733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
161acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
162673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// The 'Types' template argument below must have spaces around it
163673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// since some compilers may choke on '>>' when passing a template
164673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// instance (e.g. Types<int>)
165733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define TYPED_TEST_CASE(CaseName, Types) \
166673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  typedef ::testing::internal::TypeList< Types >::type \
167acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      GTEST_TYPE_PARAMS_(CaseName)
168acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
169733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define TYPED_TEST(CaseName, TestName) \
170acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  template <typename gtest_TypeParam_> \
171acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
172acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      : public CaseName<gtest_TypeParam_> { \
173acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian   private: \
174acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    typedef CaseName<gtest_TypeParam_> TestFixture; \
175acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    typedef gtest_TypeParam_ TypeParam; \
176acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    virtual void TestBody(); \
177acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  }; \
1785e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
179acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      ::testing::internal::TypeParameterizedTest< \
180acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          CaseName, \
181acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          ::testing::internal::TemplateSel< \
182acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
183acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
184acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian              "", #CaseName, #TestName, 0); \
185acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  template <typename gtest_TypeParam_> \
186acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
187acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
188acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#endif  // GTEST_HAS_TYPED_TEST
189acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
190acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Implements type-parameterized tests.
191acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
1924cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST_P
193acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
194acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
195acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
196acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Expands to the namespace name that the type-parameterized tests for
197acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// the given type-parameterized test case are defined in.  The exact
198acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// name of the namespace is subject to change without notice.
199733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_CASE_NAMESPACE_(TestCaseName) \
200acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  gtest_case_##TestCaseName##_
201acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
202acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
203acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
204acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Expands to the name of the variable used to remember the names of
205acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// the defined tests in the given test case.
206733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
207acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  gtest_typed_test_case_p_state_##TestCaseName##_
208acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
209acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
210acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian//
211acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// Expands to the name of the variable used to remember the names of
212acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// the registered tests in the given test case.
213733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
214acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  gtest_registered_test_names_##TestCaseName##_
215acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
216acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// The variables defined in the type-parameterized test macros are
217acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// static as typically these macros are used in a .h file that can be
218acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian// #included in multiple translation units linked together.
219733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define TYPED_TEST_CASE_P(CaseName) \
220acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  static ::testing::internal::TypedTestCasePState \
221acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
222acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
223733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define TYPED_TEST_P(CaseName, TestName) \
224acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
225acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  template <typename gtest_TypeParam_> \
226acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  class TestName : public CaseName<gtest_TypeParam_> { \
227acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian   private: \
228acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    typedef CaseName<gtest_TypeParam_> TestFixture; \
229acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    typedef gtest_TypeParam_ TypeParam; \
230acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian    virtual void TestBody(); \
231acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  }; \
2325e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
233acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
234acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          __FILE__, __LINE__, #CaseName, #TestName); \
235acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  } \
236acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  template <typename gtest_TypeParam_> \
237acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
238acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
239733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
240acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
241acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
242acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  } \
243acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
244acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
245acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          __FILE__, __LINE__, #__VA_ARGS__)
246acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
247673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// The 'Types' template argument below must have spaces around it
248673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// since some compilers may choke on '>>' when passing a template
249673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev// instance (e.g. Types<int>)
250733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
2515e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
252acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian      ::testing::internal::TypeParameterizedTestCase<CaseName, \
253acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
254673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev          ::testing::internal::TypeList< Types >::type>::Register(\
255acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
256acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
257acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#endif  // GTEST_HAS_TYPED_TEST_P
258acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian
259acc68fa2ae88d0ab46bff0afdccd2554350f1b5fshiqian#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
260