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