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#include <set> 33d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <vector> 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "test/gtest-typed-test_test.h" 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing testing::Test; 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type-parameterized test. 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CommonTest : public Test { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For some technical reason, SetUpTestCase() and TearDownTestCase() 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // must be public. 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetUpTestCase() { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shared_ = new T(5); 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void TearDownTestCase() { 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete shared_; 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville shared_ = NULL; 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This 'protected:' is optional. There's no harm in making all 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // members of this fixture class template public. 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 60d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // We used to use std::list here, but switched to std::vector since 61d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // MSVC's <list> doesn't compile cleanly with /W4. 62d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville typedef std::vector<T> Vector; 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef std::set<int> IntSet; 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CommonTest() : value_(1) {} 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~CommonTest() { EXPECT_EQ(3, value_); } 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, value_); 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value_++; 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void TearDown() { 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, value_); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value_++; 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville T value_; 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static T* shared_; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleT* CommonTest<T>::shared_ = NULL; 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This #ifdef block tests typed tests. 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_TYPED_TEST 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing testing::Types; 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and SetUp()/TearDown() work correctly in typed tests 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Types<char, int> TwoTypes; 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE(CommonTest, TwoTypes); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(CommonTest, ValuesAreCorrect) { 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Static members of the fixture class template can be visited via 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the TestFixture:: prefix. 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, *TestFixture::shared_); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Typedefs in the fixture class template can be visited via the 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "typename TestFixture::" prefix. 104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville typename TestFixture::Vector empty; 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0U, empty.size()); 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typename TestFixture::IntSet empty2; 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0U, empty2.size()); 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-static members of the fixture class must be visited via 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 'this', as required by C++ for class templates. 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, this->value_); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The second test makes sure shared_ is not deleted after the first 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test. 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(CommonTest, ValuesAreStillCorrect) { 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Static members of the fixture class template can also be visited 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // via 'this'. 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(this->shared_ != NULL); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, *this->shared_); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TypeParam can be used to refer to the type parameter. 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(static_cast<TypeParam>(2), this->value_); 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that multiple TYPED_TEST_CASE's can be defined in the same 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// translation unit. 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TypedTest1 : public Test { 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Verifies that the second argument of TYPED_TEST_CASE can be a 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// single type. 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE(TypedTest1, int); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(TypedTest1, A) {} 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TypedTest2 : public Test { 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Verifies that the second argument of TYPED_TEST_CASE can be a 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Types<...> type list. 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE(TypedTest2, Types<int>); 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This also verifies that tests from different typed test cases can 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// share the same name. 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(TypedTest2, A) {} 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that a typed test case can be defined in a namespace. 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace library1 { 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass NumericTest : public Test { 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Types<int, long> NumericTypes; 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE(NumericTest, NumericTypes); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST(NumericTest, DefaultIsZero) { 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, TypeParam()); 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace library1 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GTEST_HAS_TYPED_TEST 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This #ifdef block tests type-parameterized tests. 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_TYPED_TEST_P 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing testing::Types; 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing testing::internal::TypedTestCasePState; 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests TypedTestCasePState. 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TypedTestCasePStateTest : public Test { 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.AddTestName("foo.cc", 0, "FooTest", "A"); 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.AddTestName("foo.cc", 0, "FooTest", "B"); 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.AddTestName("foo.cc", 0, "FooTest", "C"); 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TypedTestCasePState state_; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) { 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* tests = "A, B, C"; 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(tests, 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Makes sure that the order of the tests and spaces around the names 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// don't matter. 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) { 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* tests = "A,C, B"; 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(tests, 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest; 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) { 206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_DEATH_IF_SUPPORTED( 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"), 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo\\.cc.1.?: Test A is listed more than once\\."); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) { 212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_DEATH_IF_SUPPORTED( 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"), 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo\\.cc.1.?: No test named D can be found in this test case\\."); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) { 218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_DEATH_IF_SUPPORTED( 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"), 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo\\.cc.1.?: You forgot to list test B\\."); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that defining a test for a parameterized test case generates 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a run-time error if the test case has been registered. 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) { 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C"); 227d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_DEATH_IF_SUPPORTED( 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville state_.AddTestName("foo.cc", 2, "FooTest", "D"), 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P" 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\\(FooTest, \\.\\.\\.\\)\\."); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and SetUp()/TearDown() work correctly in type-parameterized tests. 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DerivedTest : public CommonTest<T> { 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE_P(DerivedTest); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(DerivedTest, ValuesAreCorrect) { 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Static members of the fixture class template can be visited via 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the TestFixture:: prefix. 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, *TestFixture::shared_); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-static members of the fixture class must be visited via 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 'this', as required by C++ for class templates. 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, this->value_); 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The second test makes sure shared_ is not deleted after the first 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test. 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) { 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Static members of the fixture class template can also be visited 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // via 'this'. 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(this->shared_ != NULL); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, *this->shared_); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, this->value_); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleREGISTER_TYPED_TEST_CASE_P(DerivedTest, 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ValuesAreCorrect, ValuesAreStillCorrect); 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Types<short, long> MyTwoTypes; 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// translation unit. 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TypedTestP1 : public Test { 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE_P(TypedTestP1); 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For testing that the code between TYPED_TEST_CASE_P() and 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TYPED_TEST_P() is not enclosed in a namespace. 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int IntAfterTypedTestCaseP; 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(TypedTestP1, A) {} 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(TypedTestP1, B) {} 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For testing that the code between TYPED_TEST_P() and 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef int IntBeforeRegisterTypedTestCaseP; 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TypedTestP2 : public Test { 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE_P(TypedTestP2); 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This also verifies that tests from different type-parameterized 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test cases can share the same name. 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(TypedTestP2, A) {} 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Verifies that the code between TYPED_TEST_CASE_P() and 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIntAfterTypedTestCaseP after = 0; 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIntBeforeRegisterTypedTestCaseP before = 0; 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P() 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// can be either a single type or a Types<...> type list. 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int); 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that the same type-parameterized test case can be 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// instantiated more than once in the same translation unit. 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>); 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that the same type-parameterized test case can be 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// instantiated in different translation units linked together. 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (ContainerTest is also instantiated in gtest-typed-test_test.cc.) 319d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletypedef Types<std::vector<double>, std::set<char> > MyContainers; 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers); 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that a type-parameterized test case can be defined and 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// instantiated in a namespace. 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace library2 { 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename T> 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass NumericTest : public Test { 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_CASE_P(NumericTest); 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(NumericTest, DefaultIsZero) { 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, TypeParam()); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) { 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_LT(TypeParam(0), TypeParam(1)); 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleREGISTER_TYPED_TEST_CASE_P(NumericTest, 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DefaultIsZero, ZeroIsLessThanOne); 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Types<int, double> NumericTypes; 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes); 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace library2 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GTEST_HAS_TYPED_TEST_P 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test may not support type-parameterized tests with some 3530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// compilers. If we use conditional compilation to compile out all 3540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// code referring to the gtest_main library, MSVC linker will not link 3550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that library at all and consequently complain about missing entry 3560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// point defined in that library (fatal error LNK1561: entry point 3570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// must be defined). This dummy test keeps gtest_main linked in. 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {} 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 361