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// A sample program demonstrating using Google C++ testing framework. 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: wan@google.com (Zhanyong Wan) 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// In this example, we use a more advanced feature of Google Test called 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test fixture. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A test fixture is a place to hold objects and functions shared by 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// all tests in a test case. Using a test fixture avoids duplicating 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the test code necessary to initialize and cleanup those common 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// objects for each test. It is also useful for defining sub-routines 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// that your tests need to invoke a lot. 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// <TechnicalDetails> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The tests share the test fixture in the sense of code sharing, not 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// data sharing. Each test is given its own fresh copy of the 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fixture. You cannot expect the data modified by one test to be 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// passed on to another test, which is a bad idea. 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The reason for this design is that tests should be independent and 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// repeatable. In particular, a test should not fail as the result of 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// another test's failure. If one test depends on info produced by 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// another test, then the two tests should really be one big test. 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The macros for indicating the success/failure of a test 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (EXPECT_TRUE, FAIL, etc) need to know what the current test is 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (when Google Test prints the test result, it tells you which test 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// each failure belongs to). Technically, these macros invoke a 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// member function of the Test class. Therefore, you cannot use them 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in a global function. That's why you should put test sub-routines 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in a test fixture. 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// </TechnicalDetails> 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "sample3-inl.h" 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To use a test fixture, derive a class from testing::Test. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass QueueTest : public testing::Test { 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: // You should make the members protected s.t. they can be 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // accessed from sub-classes. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // virtual void SetUp() will be called before each test is run. You 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // should define it if you need to initialize the varaibles. 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Otherwise, this can be skipped. 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q1_.Enqueue(1); 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q2_.Enqueue(2); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville q2_.Enqueue(3); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // virtual void TearDown() will be called after each test is run. 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // You should define it if there is cleanup work to do. Otherwise, 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // you don't have to provide it. 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // virtual void TearDown() { 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A helper function that some test uses. 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int Double(int n) { 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 2*n; 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A helper function for testing Queue::Map(). 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void MapTester(const Queue<int> * q) { 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Creates a new queue, where each element is twice as big as the 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // corresponding one in q. 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Queue<int> * const new_q = q->Map(Double); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Verifies that the new queue has the same size as q. 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(q->Size(), new_q->Size()); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Verifies the relationship between the elements of the two queues. 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head(); 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n1 != NULL; n1 = n1->next(), n2 = n2->next() ) { 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2 * n1->element(), n2->element()); 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete new_q; 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Declares the variables your tests want to use. 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q0_; 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q1_; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Queue<int> q2_; 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// When you have a test fixture, you define a test using TEST_F 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// instead of TEST. 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the default c'tor. 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(QueueTest, DefaultConstructor) { 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // You can access data in the test fixture here. 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, q0_.Size()); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests Dequeue(). 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(QueueTest, Dequeue) { 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int * n = q0_.Dequeue(); 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(n == NULL); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n = q1_.Dequeue(); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(n != NULL); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, *n); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, q1_.Size()); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete n; 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n = q2_.Dequeue(); 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(n != NULL); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *n); 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, q2_.Size()); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville delete n; 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the Queue::Map() function. 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(QueueTest, Map) { 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MapTester(&q0_); 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MapTester(&q1_); 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MapTester(&q2_); 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 152