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