111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright 2008 Google Inc. 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// All Rights Reserved. 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Redistribution and use in source and binary forms, with or without 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// modification, are permitted provided that the following conditions are 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// met: 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions of source code must retain the above copyright 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// notice, this list of conditions and the following disclaimer. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions in binary form must reproduce the above 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// copyright notice, this list of conditions and the following disclaimer 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in the documentation and/or other materials provided with the 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// distribution. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Neither the name of Google Inc. nor the names of its 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// contributors may be used to endorse or promote products derived from 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// this software without specific prior written permission. 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Author: wan@google.com (Zhanyong Wan) 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <set> 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <vector> 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test/gtest-typed-test_test.h" 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "gtest/gtest.h" 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing testing::Test; 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// type-parameterized test. 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass CommonTest : public Test { 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // For some technical reason, SetUpTestCase() and TearDownTestCase() 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // must be public. 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static void SetUpTestCase() { 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert shared_ = new T(5); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static void TearDownTestCase() { 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete shared_; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert shared_ = NULL; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // This 'protected:' is optional. There's no harm in making all 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // members of this fixture class template public. 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // We used to use std::list here, but switched to std::vector since 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // MSVC's <list> doesn't compile cleanly with /W4. 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::vector<T> Vector; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::set<int> IntSet; 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert CommonTest() : value_(1) {} 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual ~CommonTest() { EXPECT_EQ(3, value_); } 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void SetUp() { 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(1, value_); 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert value_++; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void TearDown() { 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(2, value_); 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert value_++; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert T value_; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static T* shared_; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 8411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertT* CommonTest<T>::shared_ = NULL; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This #ifdef block tests typed tests. 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if GTEST_HAS_TYPED_TEST 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing testing::Types; 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// and SetUp()/TearDown() work correctly in typed tests 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef Types<char, int> TwoTypes; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE(CommonTest, TwoTypes); 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST(CommonTest, ValuesAreCorrect) { 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Static members of the fixture class template can be visited via 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // the TestFixture:: prefix. 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(5, *TestFixture::shared_); 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Typedefs in the fixture class template can be visited via the 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // "typename TestFixture::" prefix. 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename TestFixture::Vector empty; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(0U, empty.size()); 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename TestFixture::IntSet empty2; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(0U, empty2.size()); 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Non-static members of the fixture class must be visited via 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 'this', as required by C++ for class templates. 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(2, this->value_); 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The second test makes sure shared_ is not deleted after the first 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// test. 11711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST(CommonTest, ValuesAreStillCorrect) { 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Static members of the fixture class template can also be visited 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // via 'this'. 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ASSERT_TRUE(this->shared_ != NULL); 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(5, *this->shared_); 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // TypeParam can be used to refer to the type parameter. 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(static_cast<TypeParam>(2), this->value_); 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that multiple TYPED_TEST_CASE's can be defined in the same 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// translation unit. 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass TypedTest1 : public Test { 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Verifies that the second argument of TYPED_TEST_CASE can be a 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// single type. 13611cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE(TypedTest1, int); 13711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST(TypedTest1, A) {} 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass TypedTest2 : public Test { 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Verifies that the second argument of TYPED_TEST_CASE can be a 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Types<...> type list. 14511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE(TypedTest2, Types<int>); 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This also verifies that tests from different typed test cases can 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// share the same name. 14911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST(TypedTest2, A) {} 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that a typed test case can be defined in a namespace. 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace library1 { 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass NumericTest : public Test { 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef Types<int, long> NumericTypes; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE(NumericTest, NumericTypes); 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST(NumericTest, DefaultIsZero) { 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(0, TypeParam()); 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace library1 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // GTEST_HAS_TYPED_TEST 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This #ifdef block tests type-parameterized tests. 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if GTEST_HAS_TYPED_TEST_P 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing testing::Types; 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing testing::internal::TypedTestCasePState; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests TypedTestCasePState. 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass TypedTestCasePStateTest : public Test { 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void SetUp() { 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.AddTestName("foo.cc", 0, "FooTest", "A"); 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.AddTestName("foo.cc", 0, "FooTest", "B"); 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.AddTestName("foo.cc", 0, "FooTest", "C"); 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TypedTestCasePState state_; 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) { 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* tests = "A, B, C"; 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(tests, 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Makes sure that the order of the tests and spaces around the names 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// don't matter. 19711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) { 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* tests = "A,C, B"; 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(tests, 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest; 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) { 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_DEATH_IF_SUPPORTED( 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"), 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "foo\\.cc.1.?: Test A is listed more than once\\."); 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) { 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_DEATH_IF_SUPPORTED( 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"), 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "foo\\.cc.1.?: No test named D can be found in this test case\\."); 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) { 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_DEATH_IF_SUPPORTED( 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"), 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "foo\\.cc.1.?: You forgot to list test B\\."); 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that defining a test for a parameterized test case generates 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a run-time error if the test case has been registered. 22511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) { 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C"); 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_DEATH_IF_SUPPORTED( 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert state_.AddTestName("foo.cc", 2, "FooTest", "D"), 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P" 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "\\(FooTest, \\.\\.\\.\\)\\."); 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// and SetUp()/TearDown() work correctly in type-parameterized tests. 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass DerivedTest : public CommonTest<T> { 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE_P(DerivedTest); 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(DerivedTest, ValuesAreCorrect) { 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Static members of the fixture class template can be visited via 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // the TestFixture:: prefix. 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(5, *TestFixture::shared_); 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Non-static members of the fixture class must be visited via 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 'this', as required by C++ for class templates. 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(2, this->value_); 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The second test makes sure shared_ is not deleted after the first 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// test. 25411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) { 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Static members of the fixture class template can also be visited 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // via 'this'. 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ASSERT_TRUE(this->shared_ != NULL); 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(5, *this->shared_); 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(2, this->value_); 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertREGISTER_TYPED_TEST_CASE_P(DerivedTest, 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ValuesAreCorrect, ValuesAreStillCorrect); 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef Types<short, long> MyTwoTypes; 26611cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes); 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// translation unit. 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass TypedTestP1 : public Test { 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE_P(TypedTestP1); 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// For testing that the code between TYPED_TEST_CASE_P() and 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// TYPED_TEST_P() is not enclosed in a namespace. 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int IntAfterTypedTestCaseP; 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(TypedTestP1, A) {} 28211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(TypedTestP1, B) {} 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// For testing that the code between TYPED_TEST_P() and 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int IntBeforeRegisterTypedTestCaseP; 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28811cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B); 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass TypedTestP2 : public Test { 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE_P(TypedTestP2); 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This also verifies that tests from different type-parameterized 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// test cases can share the same name. 29811cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(TypedTestP2, A) {} 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A); 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Verifies that the code between TYPED_TEST_CASE_P() and 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. 30411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertIntAfterTypedTestCaseP after = 0; 30511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertIntBeforeRegisterTypedTestCaseP before = 0; 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P() 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// can be either a single type or a Types<...> type list. 30911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int); 31011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>); 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that the same type-parameterized test case can be 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// instantiated more than once in the same translation unit. 31411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>); 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that the same type-parameterized test case can be 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// instantiated in different translation units linked together. 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// (ContainerTest is also instantiated in gtest-typed-test_test.cc.) 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef Types<std::vector<double>, std::set<char> > MyContainers; 32011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers); 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Tests that a type-parameterized test case can be defined and 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// instantiated in a namespace. 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace library2 { 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T> 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass NumericTest : public Test { 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_CASE_P(NumericTest); 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(NumericTest, DefaultIsZero) { 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(0, TypeParam()); 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) { 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_LT(TypeParam(0), TypeParam(1)); 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertREGISTER_TYPED_TEST_CASE_P(NumericTest, 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert DefaultIsZero, ZeroIsLessThanOne); 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef Types<int, double> NumericTypes; 34411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes); 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace library2 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // GTEST_HAS_TYPED_TEST_P 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Google Test may not support type-parameterized tests with some 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compilers. If we use conditional compilation to compile out all 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// code referring to the gtest_main library, MSVC linker will not link 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// that library at all and consequently complain about missing entry 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// point defined in that library (fatal error LNK1561: entry point 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// must be defined). This dummy test keeps gtest_main linked in. 35811cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {} 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) 361