Blame googletest/test/gtest-linked_ptr_test.cc

Packit bd1cd8
// Copyright 2003, Google Inc.
Packit bd1cd8
// All rights reserved.
Packit bd1cd8
//
Packit bd1cd8
// Redistribution and use in source and binary forms, with or without
Packit bd1cd8
// modification, are permitted provided that the following conditions are
Packit bd1cd8
// met:
Packit bd1cd8
//
Packit bd1cd8
//     * Redistributions of source code must retain the above copyright
Packit bd1cd8
// notice, this list of conditions and the following disclaimer.
Packit bd1cd8
//     * Redistributions in binary form must reproduce the above
Packit bd1cd8
// copyright notice, this list of conditions and the following disclaimer
Packit bd1cd8
// in the documentation and/or other materials provided with the
Packit bd1cd8
// distribution.
Packit bd1cd8
//     * Neither the name of Google Inc. nor the names of its
Packit bd1cd8
// contributors may be used to endorse or promote products derived from
Packit bd1cd8
// this software without specific prior written permission.
Packit bd1cd8
//
Packit bd1cd8
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit bd1cd8
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit bd1cd8
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit bd1cd8
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit bd1cd8
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit bd1cd8
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit bd1cd8
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit bd1cd8
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit bd1cd8
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit bd1cd8
//
Packit bd1cd8
// Authors: Dan Egnor (egnor@google.com)
Packit bd1cd8
// Ported to Windows: Vadim Berman (vadimb@google.com)
Packit bd1cd8
Packit bd1cd8
#include "gtest/internal/gtest-linked_ptr.h"
Packit bd1cd8
Packit bd1cd8
#include <stdlib.h>
Packit bd1cd8
#include "gtest/gtest.h"
Packit bd1cd8
Packit bd1cd8
namespace {
Packit bd1cd8
Packit bd1cd8
using testing::Message;
Packit bd1cd8
using testing::internal::linked_ptr;
Packit bd1cd8
Packit bd1cd8
int num;
Packit bd1cd8
Message* history = NULL;
Packit bd1cd8
Packit bd1cd8
// Class which tracks allocation/deallocation
Packit bd1cd8
class A {
Packit bd1cd8
 public:
Packit bd1cd8
  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
Packit bd1cd8
  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
Packit bd1cd8
  virtual void Use() { *history << "A" << mynum << " use\n"; }
Packit bd1cd8
 protected:
Packit bd1cd8
  int mynum;
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
// Subclass
Packit bd1cd8
class B : public A {
Packit bd1cd8
 public:
Packit bd1cd8
  B() { *history << "B" << mynum << " ctor\n"; }
Packit bd1cd8
  ~B() { *history << "B" << mynum << " dtor\n"; }
Packit bd1cd8
  virtual void Use() { *history << "B" << mynum << " use\n"; }
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
class LinkedPtrTest : public testing::Test {
Packit bd1cd8
 public:
Packit bd1cd8
  LinkedPtrTest() {
Packit bd1cd8
    num = 0;
Packit bd1cd8
    history = new Message;
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
  virtual ~LinkedPtrTest() {
Packit bd1cd8
    delete history;
Packit bd1cd8
    history = NULL;
Packit bd1cd8
  }
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
TEST_F(LinkedPtrTest, GeneralTest) {
Packit bd1cd8
  {
Packit bd1cd8
    linked_ptr a0, a1, a2;
Packit bd1cd8
    // Use explicit function call notation here to suppress self-assign warning.
Packit bd1cd8
    a0.operator=(a0);
Packit bd1cd8
    a1 = a2;
Packit bd1cd8
    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
Packit bd1cd8
    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
Packit bd1cd8
    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
Packit bd1cd8
    ASSERT_TRUE(a0 == NULL);
Packit bd1cd8
    ASSERT_TRUE(a1 == NULL);
Packit bd1cd8
    ASSERT_TRUE(a2 == NULL);
Packit bd1cd8
Packit bd1cd8
    {
Packit bd1cd8
      linked_ptr a3(new A);
Packit bd1cd8
      a0 = a3;
Packit bd1cd8
      ASSERT_TRUE(a0 == a3);
Packit bd1cd8
      ASSERT_TRUE(a0 != NULL);
Packit bd1cd8
      ASSERT_TRUE(a0.get() == a3);
Packit bd1cd8
      ASSERT_TRUE(a0 == a3.get());
Packit bd1cd8
      linked_ptr a4(a0);
Packit bd1cd8
      a1 = a4;
Packit bd1cd8
      linked_ptr a5(new A);
Packit bd1cd8
      ASSERT_TRUE(a5.get() != a3);
Packit bd1cd8
      ASSERT_TRUE(a5 != a3.get());
Packit bd1cd8
      a2 = a5;
Packit bd1cd8
      linked_ptr b0(new B);
Packit bd1cd8
      linked_ptr a6(b0);
Packit bd1cd8
      ASSERT_TRUE(b0 == a6);
Packit bd1cd8
      ASSERT_TRUE(a6 == b0);
Packit bd1cd8
      ASSERT_TRUE(b0 != NULL);
Packit bd1cd8
      a5 = b0;
Packit bd1cd8
      a5 = b0;
Packit bd1cd8
      a3->Use();
Packit bd1cd8
      a4->Use();
Packit bd1cd8
      a5->Use();
Packit bd1cd8
      a6->Use();
Packit bd1cd8
      b0->Use();
Packit bd1cd8
      (*b0).Use();
Packit bd1cd8
      b0.get()->Use();
Packit bd1cd8
    }
Packit bd1cd8
Packit bd1cd8
    a0->Use();
Packit bd1cd8
    a1->Use();
Packit bd1cd8
    a2->Use();
Packit bd1cd8
Packit bd1cd8
    a1 = a2;
Packit bd1cd8
    a2.reset(new A);
Packit bd1cd8
    a0.reset();
Packit bd1cd8
Packit bd1cd8
    linked_ptr a7;
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
  ASSERT_STREQ(
Packit bd1cd8
    "A0 ctor\n"
Packit bd1cd8
    "A1 ctor\n"
Packit bd1cd8
    "A2 ctor\n"
Packit bd1cd8
    "B2 ctor\n"
Packit bd1cd8
    "A0 use\n"
Packit bd1cd8
    "A0 use\n"
Packit bd1cd8
    "B2 use\n"
Packit bd1cd8
    "B2 use\n"
Packit bd1cd8
    "B2 use\n"
Packit bd1cd8
    "B2 use\n"
Packit bd1cd8
    "B2 use\n"
Packit bd1cd8
    "B2 dtor\n"
Packit bd1cd8
    "A2 dtor\n"
Packit bd1cd8
    "A0 use\n"
Packit bd1cd8
    "A0 use\n"
Packit bd1cd8
    "A1 use\n"
Packit bd1cd8
    "A3 ctor\n"
Packit bd1cd8
    "A0 dtor\n"
Packit bd1cd8
    "A3 dtor\n"
Packit bd1cd8
    "A1 dtor\n",
Packit bd1cd8
    history->GetString().c_str());
Packit bd1cd8
}
Packit bd1cd8
Packit bd1cd8
}  // Unnamed namespace