1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2005, Google Inc. 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: wan@google.com (Zhanyong Wan) 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This sample teaches how to reuse a test fixture in multiple test 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// cases by deriving sub-fixtures from it. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// When you define a test fixture, you specify the name of the test 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// case that will use this fixture. Therefore, a test fixture can 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be used by only one test case. 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sometimes, more than one test cases may want to use the same or 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// slightly different test fixtures. For example, you may want to 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// make sure that all tests for a GUI library don't leak important 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// system resources like fonts and brushes. In Google Test, you do 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this by putting the shared logic in a super (as in "super class") 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test fixture, and then have each test case use a fixture derived 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from this super fixture. 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <limits.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <time.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "sample3-inl.h" 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "sample1.h" 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// In this sample, we want to ensure that every test finishes within 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ~5 seconds. If a test takes longer to run, we consider it a 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// failure. 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We put the code for timing a test in a test fixture called 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "QuickTest". QuickTest is intended to be the super fixture that 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// other fixtures derive from, therefore there is no test case with 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the name "QuickTest". This is OK. 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Later, we will derive multiple test fixtures from QuickTest. 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass QuickTest : public testing::Test { 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Remember that SetUp() is run immediately before a test starts. 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is a good place to record the start time. 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville start_time_ = time(NULL); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TearDown() is invoked immediately after a test finishes. Here we 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // check if the test was too slow. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void TearDown() { 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets the time when the test finishes 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const time_t end_time = time(NULL); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Asserts that the test took no more than ~5 seconds. Did you 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // know that you can use assertions in SetUp() and TearDown() as 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // well? 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long."; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The UTC time (in seconds) when the test starts 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville time_t start_time_; 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We derive a fixture named IntegerFunctionTest from the QuickTest 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fixture. All tests using this fixture will be automatically 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// required to be quick. 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass IntegerFunctionTest : public QuickTest { 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We don't need any more logic than already in the QuickTest fixture. 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Therefore the body is empty. 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Now we can write tests in the IntegerFunctionTest test case. 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests Factorial() 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(IntegerFunctionTest, Factorial) { 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests factorial of negative numbers. 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, Factorial(-5)); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, Factorial(-1)); 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(Factorial(-10) > 0); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests factorial of 0. 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, Factorial(0)); 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests factorial of positive numbers. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, Factorial(1)); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, Factorial(2)); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(6, Factorial(3)); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(40320, Factorial(8)); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests IsPrime() 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(IntegerFunctionTest, IsPrime) { 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests negative input. 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(-1)); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(-2)); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(INT_MIN)); 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests some trivial cases. 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(0)); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(1)); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsPrime(2)); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsPrime(3)); 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests positive input. 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(4)); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsPrime(5)); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(!IsPrime(6)); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsPrime(23)); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The next test case (named "QueueTest") also needs to be quick, so 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we derive another fixture from QuickTest. 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The QueueTest test fixture has some logic and shared objects in 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// addition to what's in QuickTest already. We define the additional 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// stuff inside the body of the test fixture, as usual. 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass QueueTest : public QuickTest { 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // First, we need to set up the super fixture (QuickTest). 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville QuickTest::SetUp(); 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Second, some additional setup for this fixture. 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q1_.Enqueue(1); 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q2_.Enqueue(2); 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q2_.Enqueue(3); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // By default, TearDown() inherits the behavior of 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // QuickTest::TearDown(). As we have no additional cleaning work 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for QueueTest, we omit it here. 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // virtual void TearDown() { 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // QuickTest::TearDown(); 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q0_; 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q1_; 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q2_; 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Now, let's write tests using the QueueTest fixture. 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the default constructor. 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(QueueTest, DefaultConstructor) { 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, q0_.Size()); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests Dequeue(). 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(QueueTest, Dequeue) { 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int * n = q0_.Dequeue(); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(n == NULL); 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n = q1_.Dequeue(); 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(n != NULL); 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, *n); 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, q1_.Size()); 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete n; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n = q2_.Dequeue(); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(n != NULL); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *n); 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, q2_.Size()); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete n; 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If necessary, you can derive further test fixtures from a derived 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fixture itself. For example, you can derive another fixture from 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// QueueTest. Google Test imposes no limit on how deep the hierarchy 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// can be. In practice, however, you probably don't want it to be too 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// deep as to be confusing. 200