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