1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008 Google Inc. 2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All Rights Reserved. 3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without 5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are 6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met: 7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions of source code must retain the above copyright 9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer. 10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions in binary form must reproduce the above 11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer 12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the 13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution. 14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Neither the name of Google Inc. nor the names of its 15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from 16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission. 17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan) 31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <set> 3346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include <vector> 34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include "test/gtest-typed-test_test.h" 3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h" 37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Test; 39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture 41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and 42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type-parameterized test. 43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CommonTest : public Test { 45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // For some technical reason, SetUpTestCase() and TearDownTestCase() 46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // must be public. 47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static void SetUpTestCase() { 49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter shared_ = new T(5); 50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static void TearDownTestCase() { 53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter delete shared_; 54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter shared_ = NULL; 55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // This 'protected:' is optional. There's no harm in making all 58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // members of this fixture class template public. 59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected: 6046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // We used to use std::list here, but switched to std::vector since 6146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // MSVC's <list> doesn't compile cleanly with /W4. 6246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef std::vector<T> Vector; 63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef std::set<int> IntSet; 64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter CommonTest() : value_(1) {} 66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual ~CommonTest() { EXPECT_EQ(3, value_); } 68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void SetUp() { 70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(1, value_); 71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter value_++; 72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void TearDown() { 75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, value_); 76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter value_++; 77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter T value_; 80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static T* shared_; 81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterT* CommonTest<T>::shared_ = NULL; 85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This #ifdef block tests typed tests. 87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_TYPED_TEST 88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Types; 90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and SetUp()/TearDown() work correctly in typed tests 93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef Types<char, int> TwoTypes; 95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE(CommonTest, TwoTypes); 96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(CommonTest, ValuesAreCorrect) { 98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Static members of the fixture class template can be visited via 99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // the TestFixture:: prefix. 100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(5, *TestFixture::shared_); 101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Typedefs in the fixture class template can be visited via the 103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // "typename TestFixture::" prefix. 10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename TestFixture::Vector empty; 10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(0U, empty.size()); 106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typename TestFixture::IntSet empty2; 10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(0U, empty2.size()); 109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Non-static members of the fixture class must be visited via 111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 'this', as required by C++ for class templates. 112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, this->value_); 113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The second test makes sure shared_ is not deleted after the first 116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test. 117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(CommonTest, ValuesAreStillCorrect) { 118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Static members of the fixture class template can also be visited 119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // via 'this'. 120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_TRUE(this->shared_ != NULL); 121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(5, *this->shared_); 122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // TypeParam can be used to refer to the type parameter. 124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(static_cast<TypeParam>(2), this->value_); 125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that multiple TYPED_TEST_CASE's can be defined in the same 128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// translation unit. 129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypedTest1 : public Test { 132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that the second argument of TYPED_TEST_CASE can be a 135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// single type. 136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE(TypedTest1, int); 137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(TypedTest1, A) {} 138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypedTest2 : public Test { 141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that the second argument of TYPED_TEST_CASE can be a 144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Types<...> type list. 145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE(TypedTest2, Types<int>); 146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This also verifies that tests from different typed test cases can 148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// share the same name. 149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(TypedTest2, A) {} 150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a typed test case can be defined in a namespace. 152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace library1 { 154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass NumericTest : public Test { 157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef Types<int, long> NumericTypes; 160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE(NumericTest, NumericTypes); 161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(NumericTest, DefaultIsZero) { 163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, TypeParam()); 164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace library1 167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_TYPED_TEST 169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This #ifdef block tests type-parameterized tests. 171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_TYPED_TEST_P 172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Types; 174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::TypedTestCasePState; 175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests TypedTestCasePState. 177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypedTestCasePStateTest : public Test { 179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected: 180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void SetUp() { 181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.AddTestName("foo.cc", 0, "FooTest", "A"); 182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.AddTestName("foo.cc", 0, "FooTest", "B"); 183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.AddTestName("foo.cc", 0, "FooTest", "C"); 184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypedTestCasePState state_; 187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) { 190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* tests = "A, B, C"; 191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(tests, 192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Makes sure that the order of the tests and spaces around the names 196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// don't matter. 197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) { 198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* tests = "A,C, B"; 199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(tests, 200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest; 204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) { 20646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED( 207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"), 208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "foo\\.cc.1.?: Test A is listed more than once\\."); 209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) { 21246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED( 213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"), 214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "foo\\.cc.1.?: No test named D can be found in this test case\\."); 215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) { 21846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED( 219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"), 220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "foo\\.cc.1.?: You forgot to list test B\\."); 221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that defining a test for a parameterized test case generates 224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a run-time error if the test case has been registered. 225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) { 226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C"); 22746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED( 228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter state_.AddTestName("foo.cc", 2, "FooTest", "D"), 229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P" 230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "\\(FooTest, \\.\\.\\.\\)\\."); 231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and SetUp()/TearDown() work correctly in type-parameterized tests. 235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DerivedTest : public CommonTest<T> { 238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE_P(DerivedTest); 241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(DerivedTest, ValuesAreCorrect) { 243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Static members of the fixture class template can be visited via 244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // the TestFixture:: prefix. 245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(5, *TestFixture::shared_); 246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Non-static members of the fixture class must be visited via 248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 'this', as required by C++ for class templates. 249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, this->value_); 250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The second test makes sure shared_ is not deleted after the first 253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test. 254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) { 255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Static members of the fixture class template can also be visited 256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // via 'this'. 257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_TRUE(this->shared_ != NULL); 258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(5, *this->shared_); 259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, this->value_); 260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterREGISTER_TYPED_TEST_CASE_P(DerivedTest, 263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ValuesAreCorrect, ValuesAreStillCorrect); 264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef Types<short, long> MyTwoTypes; 266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes); 267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same 269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// translation unit. 270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypedTestP1 : public Test { 273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE_P(TypedTestP1); 276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For testing that the code between TYPED_TEST_CASE_P() and 278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TYPED_TEST_P() is not enclosed in a namespace. 279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef int IntAfterTypedTestCaseP; 280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(TypedTestP1, A) {} 282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(TypedTestP1, B) {} 283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For testing that the code between TYPED_TEST_P() and 285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef int IntBeforeRegisterTypedTestCaseP; 287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B); 289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypedTestP2 : public Test { 292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE_P(TypedTestP2); 295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This also verifies that tests from different type-parameterized 297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test cases can share the same name. 298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(TypedTestP2, A) {} 299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A); 301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that the code between TYPED_TEST_CASE_P() and 303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterIntAfterTypedTestCaseP after = 0; 305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterIntBeforeRegisterTypedTestCaseP before = 0; 306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P() 308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// can be either a single type or a Types<...> type list. 309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int); 310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>); 311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the same type-parameterized test case can be 313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// instantiated more than once in the same translation unit. 314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>); 315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the same type-parameterized test case can be 317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// instantiated in different translation units linked together. 318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (ContainerTest is also instantiated in gtest-typed-test_test.cc.) 31946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantypedef Types<std::vector<double>, std::set<char> > MyContainers; 320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers); 321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a type-parameterized test case can be defined and 323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// instantiated in a namespace. 324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace library2 { 326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass NumericTest : public Test { 329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE_P(NumericTest); 332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(NumericTest, DefaultIsZero) { 334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, TypeParam()); 335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) { 338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_LT(TypeParam(0), TypeParam(1)); 339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterREGISTER_TYPED_TEST_CASE_P(NumericTest, 342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DefaultIsZero, ZeroIsLessThanOne); 343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef Types<int, double> NumericTypes; 344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes); 345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace library2 347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_TYPED_TEST_P 349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 35246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Google Test may not support type-parameterized tests with some 35346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// compilers. If we use conditional compilation to compile out all 35446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// code referring to the gtest_main library, MSVC linker will not link 35546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// that library at all and consequently complain about missing entry 35646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// point defined in that library (fatal error LNK1561: entry point 35746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// must be defined). This dummy test keeps gtest_main linked in. 358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {} 359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 361