diff options
| author | Enji Cooper <ngie@FreeBSD.org> | 2019-02-13 02:16:52 +0000 | 
|---|---|---|
| committer | Enji Cooper <ngie@FreeBSD.org> | 2019-02-13 02:16:52 +0000 | 
| commit | 83481c8c5c0cd0b3fc86f39b2985efd4e300200a (patch) | |
| tree | 784fc9b3c98d0e853336f1fb982fd243162c922c /googletest/samples/sample5_unittest.cc | |
Diffstat (limited to 'googletest/samples/sample5_unittest.cc')
| -rw-r--r-- | googletest/samples/sample5_unittest.cc | 198 | 
1 files changed, 198 insertions, 0 deletions
| diff --git a/googletest/samples/sample5_unittest.cc b/googletest/samples/sample5_unittest.cc new file mode 100644 index 0000000000000..d8a8788c6d0fd --- /dev/null +++ b/googletest/samples/sample5_unittest.cc @@ -0,0 +1,198 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +//     * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +//     * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +//     * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// This sample teaches how to reuse a test fixture in multiple test +// cases by deriving sub-fixtures from it. +// +// When you define a test fixture, you specify the name of the test +// case that will use this fixture.  Therefore, a test fixture can +// be used by only one test case. +// +// Sometimes, more than one test cases may want to use the same or +// slightly different test fixtures.  For example, you may want to +// make sure that all tests for a GUI library don't leak important +// system resources like fonts and brushes.  In Google Test, you do +// this by putting the shared logic in a super (as in "super class") +// test fixture, and then have each test case use a fixture derived +// from this super fixture. + +#include <limits.h> +#include <time.h> +#include "gtest/gtest.h" +#include "sample1.h" +#include "sample3-inl.h" +namespace { +// In this sample, we want to ensure that every test finishes within +// ~5 seconds.  If a test takes longer to run, we consider it a +// failure. +// +// We put the code for timing a test in a test fixture called +// "QuickTest".  QuickTest is intended to be the super fixture that +// other fixtures derive from, therefore there is no test case with +// the name "QuickTest".  This is OK. +// +// Later, we will derive multiple test fixtures from QuickTest. +class QuickTest : public testing::Test { + protected: +  // Remember that SetUp() is run immediately before a test starts. +  // This is a good place to record the start time. +  virtual void SetUp() { +    start_time_ = time(NULL); +  } + +  // TearDown() is invoked immediately after a test finishes.  Here we +  // check if the test was too slow. +  virtual void TearDown() { +    // Gets the time when the test finishes +    const time_t end_time = time(NULL); + +    // Asserts that the test took no more than ~5 seconds.  Did you +    // know that you can use assertions in SetUp() and TearDown() as +    // well? +    EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long."; +  } + +  // The UTC time (in seconds) when the test starts +  time_t start_time_; +}; + + +// We derive a fixture named IntegerFunctionTest from the QuickTest +// fixture.  All tests using this fixture will be automatically +// required to be quick. +class IntegerFunctionTest : public QuickTest { +  // We don't need any more logic than already in the QuickTest fixture. +  // Therefore the body is empty. +}; + + +// Now we can write tests in the IntegerFunctionTest test case. + +// Tests Factorial() +TEST_F(IntegerFunctionTest, Factorial) { +  // Tests factorial of negative numbers. +  EXPECT_EQ(1, Factorial(-5)); +  EXPECT_EQ(1, Factorial(-1)); +  EXPECT_GT(Factorial(-10), 0); + +  // Tests factorial of 0. +  EXPECT_EQ(1, Factorial(0)); + +  // Tests factorial of positive numbers. +  EXPECT_EQ(1, Factorial(1)); +  EXPECT_EQ(2, Factorial(2)); +  EXPECT_EQ(6, Factorial(3)); +  EXPECT_EQ(40320, Factorial(8)); +} + + +// Tests IsPrime() +TEST_F(IntegerFunctionTest, IsPrime) { +  // Tests negative input. +  EXPECT_FALSE(IsPrime(-1)); +  EXPECT_FALSE(IsPrime(-2)); +  EXPECT_FALSE(IsPrime(INT_MIN)); + +  // Tests some trivial cases. +  EXPECT_FALSE(IsPrime(0)); +  EXPECT_FALSE(IsPrime(1)); +  EXPECT_TRUE(IsPrime(2)); +  EXPECT_TRUE(IsPrime(3)); + +  // Tests positive input. +  EXPECT_FALSE(IsPrime(4)); +  EXPECT_TRUE(IsPrime(5)); +  EXPECT_FALSE(IsPrime(6)); +  EXPECT_TRUE(IsPrime(23)); +} + + +// The next test case (named "QueueTest") also needs to be quick, so +// we derive another fixture from QuickTest. +// +// The QueueTest test fixture has some logic and shared objects in +// addition to what's in QuickTest already.  We define the additional +// stuff inside the body of the test fixture, as usual. +class QueueTest : public QuickTest { + protected: +  virtual void SetUp() { +    // First, we need to set up the super fixture (QuickTest). +    QuickTest::SetUp(); + +    // Second, some additional setup for this fixture. +    q1_.Enqueue(1); +    q2_.Enqueue(2); +    q2_.Enqueue(3); +  } + +  // By default, TearDown() inherits the behavior of +  // QuickTest::TearDown().  As we have no additional cleaning work +  // for QueueTest, we omit it here. +  // +  // virtual void TearDown() { +  //   QuickTest::TearDown(); +  // } + +  Queue<int> q0_; +  Queue<int> q1_; +  Queue<int> q2_; +}; + + +// Now, let's write tests using the QueueTest fixture. + +// Tests the default constructor. +TEST_F(QueueTest, DefaultConstructor) { +  EXPECT_EQ(0u, q0_.Size()); +} + +// Tests Dequeue(). +TEST_F(QueueTest, Dequeue) { +  int* n = q0_.Dequeue(); +  EXPECT_TRUE(n == NULL); + +  n = q1_.Dequeue(); +  EXPECT_TRUE(n != NULL); +  EXPECT_EQ(1, *n); +  EXPECT_EQ(0u, q1_.Size()); +  delete n; + +  n = q2_.Dequeue(); +  EXPECT_TRUE(n != NULL); +  EXPECT_EQ(2, *n); +  EXPECT_EQ(1u, q2_.Size()); +  delete n; +} +}  // namespace +// If necessary, you can derive further test fixtures from a derived +// fixture itself.  For example, you can derive another fixture from +// QueueTest.  Google Test imposes no limit on how deep the hierarchy +// can be.  In practice, however, you probably don't want it to be too +// deep as to be confusing. | 
