17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2008 Google Inc.
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All Rights Reserved.
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: wan@google.com (Zhanyong Wan)
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This header implements typed tests and type-parameterized tests.
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Typed (aka type-driven) tests repeat the same test for types in a
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// list.  You must know which types you want to test with when writing
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// typed tests. Here's how you do it:
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if 0
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// First, define a fixture class template.  It should be parameterized
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// by a type.  Remember to derive it from testing::Test.
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass FooTest : public testing::Test {
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef std::list<T> List;
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static T shared_;
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  T value_;
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Next, associate a list of types with the test case, which will be
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// repeated for each type in the list.  The typedef is necessary for
567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the macro to parse correctly.
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef testing::Types<char, int, unsigned int> MyTypes;
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST_CASE(FooTest, MyTypes);
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If the type list contains only one type, you can write that type
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// directly without Types<...>:
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TYPED_TEST_CASE(FooTest, int);
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// tests for this test case as you want.
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST(FooTest, DoesBlah) {
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Inside a test, refer to TypeParam to get the type parameter.
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Since we are inside a derived class template, C++ requires use to
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // visit the members of FooTest via 'this'.
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TypeParam n = this->value_;
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // To visit static members of the fixture, add the TestFixture::
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // prefix.
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  n += TestFixture::shared_;
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // To refer to typedefs in the fixture, add the "typename
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // TestFixture::" prefix.
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typename TestFixture::List values;
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  values.push_back(n);
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST(FooTest, HasPropertyA) { ... }
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // 0
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Type-parameterized tests are abstract test patterns parameterized
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// by a type.  Compared with typed tests, type-parameterized tests
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// allow you to define the test pattern without knowing what the type
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameters are.  The defined pattern can be instantiated with
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// different types any number of times, in any number of translation
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// units.
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If you are designing an interface or concept, you can define a
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// suite of type-parameterized tests to verify properties that any
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// valid implementation of the interface/concept should have.  Then,
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each implementation can easily instantiate the test suite to verify
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// that it conforms to the requirements, without having to write
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// similar tests repeatedly.  Here's an example:
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if 0
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// First, define a fixture class template.  It should be parameterized
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// by a type.  Remember to derive it from testing::Test.
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass FooTest : public testing::Test {
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Next, declare that you will define a type-parameterized test case
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (the _P suffix is for "parameterized" or "pattern", whichever you
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// prefer):
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST_CASE_P(FooTest);
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Then, use TYPED_TEST_P() to define as many type-parameterized tests
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for this type-parameterized test case as you want.
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST_P(FooTest, DoesBlah) {
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Inside a test, refer to TypeParam to get the type parameter.
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TypeParam n = 0;
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ...
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanTYPED_TEST_P(FooTest, HasPropertyA) { ... }
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Now the tricky part: you need to register all test patterns before
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// you can instantiate them.  The first argument of the macro is the
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// test case name; the rest are the names of the tests in this test
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// case.
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanREGISTER_TYPED_TEST_CASE_P(FooTest,
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                           DoesBlah, HasPropertyA);
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Finally, you are free to instantiate the pattern with the types you
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// want.  If you put the above code in a header file, you can #include
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// it in multiple C++ source files and instantiate it multiple times.
1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// To distinguish different instances of the pattern, the first
1377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// argument to the INSTANTIATE_* macro is a prefix that will be added
1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to the actual test case name.  Remember to pick unique prefixes for
1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// different instances.
1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantypedef testing::Types<char, int, unsigned int> MyTypes;
1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If the type list contains only one type, you can write that type
1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// directly without Types<...>:
1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // 0
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
149b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-port.h"
150b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-type-util.h"
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements typed tests.
1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
154e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_TYPED_TEST
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Expands to the name of the typedef for the type parameters of the
1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// given test case.
160b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// The 'Types' template argument below must have spaces around it
16357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// since some compilers may choke on '>>' when passing a template
16457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// instance (e.g. Types<int>)
165b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TYPED_TEST_CASE(CaseName, Types) \
16657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  typedef ::testing::internal::TypeList< Types >::type \
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTEST_TYPE_PARAMS_(CaseName)
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
169b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TYPED_TEST(CaseName, TestName) \
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename gtest_TypeParam_> \
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      : public CaseName<gtest_TypeParam_> { \
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman   private: \
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typedef CaseName<gtest_TypeParam_> TestFixture; \
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typedef gtest_TypeParam_ TypeParam; \
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    virtual void TestBody(); \
1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }; \
178b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::internal::TypeParameterizedTest< \
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          CaseName, \
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::internal::TemplateSel< \
1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              "", #CaseName, #TestName, 0); \
1857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename gtest_TypeParam_> \
1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_TYPED_TEST
1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements type-parameterized tests.
1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
192e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_TYPED_TEST_P
1937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
1957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Expands to the namespace name that the type-parameterized tests for
1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the given type-parameterized test case are defined in.  The exact
1987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// name of the namespace is subject to change without notice.
199b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define GTEST_CASE_NAMESPACE_(TestCaseName) \
2007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  gtest_case_##TestCaseName##_
2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Expands to the name of the variable used to remember the names of
2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the defined tests in the given test case.
206b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  gtest_typed_test_case_p_state_##TestCaseName##_
2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Expands to the name of the variable used to remember the names of
2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the registered tests in the given test case.
213b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  gtest_registered_test_names_##TestCaseName##_
2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The variables defined in the type-parameterized test macros are
2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// static as typically these macros are used in a .h file that can be
2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// #included in multiple translation units linked together.
219b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TYPED_TEST_CASE_P(CaseName) \
2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static ::testing::internal::TypedTestCasePState \
2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
223b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TYPED_TEST_P(CaseName, TestName) \
2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename gtest_TypeParam_> \
2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  class TestName : public CaseName<gtest_TypeParam_> { \
2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman   private: \
2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typedef CaseName<gtest_TypeParam_> TestFixture; \
2297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    typedef gtest_TypeParam_ TypeParam; \
2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    virtual void TestBody(); \
2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }; \
232b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
2347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          __FILE__, __LINE__, #CaseName, #TestName); \
2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  } \
2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename gtest_TypeParam_> \
2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Silencing C99 build warnings
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#if 0
241b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
2427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
2437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
2447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  } \
2457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
2467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          __FILE__, __LINE__, #__VA_ARGS__)
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
25057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// The 'Types' template argument below must have spaces around it
25157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// since some compilers may choke on '>>' when passing a template
25257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// instance (e.g. Types<int>)
253b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
254b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::internal::TypeParameterizedTestCase<CaseName, \
2567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
25757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer          ::testing::internal::TypeList< Types >::type>::Register(\
2587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_TYPED_TEST_P
2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
263