113481Sgiacomo.travaglini@arm.com// Copyright 2003, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Authors: Dan Egnor (egnor@google.com)
3113481Sgiacomo.travaglini@arm.com// Ported to Windows: Vadim Berman (vadimb@google.com)
3213481Sgiacomo.travaglini@arm.com
3313481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-linked_ptr.h"
3413481Sgiacomo.travaglini@arm.com
3513481Sgiacomo.travaglini@arm.com#include <stdlib.h>
3613481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.comnamespace {
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.comusing testing::Message;
4113481Sgiacomo.travaglini@arm.comusing testing::internal::linked_ptr;
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.comint num;
4413481Sgiacomo.travaglini@arm.comMessage* history = NULL;
4513481Sgiacomo.travaglini@arm.com
4613481Sgiacomo.travaglini@arm.com// Class which tracks allocation/deallocation
4713481Sgiacomo.travaglini@arm.comclass A {
4813481Sgiacomo.travaglini@arm.com public:
4913481Sgiacomo.travaglini@arm.com  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
5013481Sgiacomo.travaglini@arm.com  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
5113481Sgiacomo.travaglini@arm.com  virtual void Use() { *history << "A" << mynum << " use\n"; }
5213481Sgiacomo.travaglini@arm.com protected:
5313481Sgiacomo.travaglini@arm.com  int mynum;
5413481Sgiacomo.travaglini@arm.com};
5513481Sgiacomo.travaglini@arm.com
5613481Sgiacomo.travaglini@arm.com// Subclass
5713481Sgiacomo.travaglini@arm.comclass B : public A {
5813481Sgiacomo.travaglini@arm.com public:
5913481Sgiacomo.travaglini@arm.com  B() { *history << "B" << mynum << " ctor\n"; }
6013481Sgiacomo.travaglini@arm.com  ~B() { *history << "B" << mynum << " dtor\n"; }
6113481Sgiacomo.travaglini@arm.com  virtual void Use() { *history << "B" << mynum << " use\n"; }
6213481Sgiacomo.travaglini@arm.com};
6313481Sgiacomo.travaglini@arm.com
6413481Sgiacomo.travaglini@arm.comclass LinkedPtrTest : public testing::Test {
6513481Sgiacomo.travaglini@arm.com public:
6613481Sgiacomo.travaglini@arm.com  LinkedPtrTest() {
6713481Sgiacomo.travaglini@arm.com    num = 0;
6813481Sgiacomo.travaglini@arm.com    history = new Message;
6913481Sgiacomo.travaglini@arm.com  }
7013481Sgiacomo.travaglini@arm.com
7113481Sgiacomo.travaglini@arm.com  virtual ~LinkedPtrTest() {
7213481Sgiacomo.travaglini@arm.com    delete history;
7313481Sgiacomo.travaglini@arm.com    history = NULL;
7413481Sgiacomo.travaglini@arm.com  }
7513481Sgiacomo.travaglini@arm.com};
7613481Sgiacomo.travaglini@arm.com
7713481Sgiacomo.travaglini@arm.comTEST_F(LinkedPtrTest, GeneralTest) {
7813481Sgiacomo.travaglini@arm.com  {
7913481Sgiacomo.travaglini@arm.com    linked_ptr<A> a0, a1, a2;
8013481Sgiacomo.travaglini@arm.com    // Use explicit function call notation here to suppress self-assign warning.
8113481Sgiacomo.travaglini@arm.com    a0.operator=(a0);
8213481Sgiacomo.travaglini@arm.com    a1 = a2;
8313481Sgiacomo.travaglini@arm.com    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
8413481Sgiacomo.travaglini@arm.com    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
8513481Sgiacomo.travaglini@arm.com    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
8613481Sgiacomo.travaglini@arm.com    ASSERT_TRUE(a0 == NULL);
8713481Sgiacomo.travaglini@arm.com    ASSERT_TRUE(a1 == NULL);
8813481Sgiacomo.travaglini@arm.com    ASSERT_TRUE(a2 == NULL);
8913481Sgiacomo.travaglini@arm.com
9013481Sgiacomo.travaglini@arm.com    {
9113481Sgiacomo.travaglini@arm.com      linked_ptr<A> a3(new A);
9213481Sgiacomo.travaglini@arm.com      a0 = a3;
9313481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a0 == a3);
9413481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a0 != NULL);
9513481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a0.get() == a3);
9613481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a0 == a3.get());
9713481Sgiacomo.travaglini@arm.com      linked_ptr<A> a4(a0);
9813481Sgiacomo.travaglini@arm.com      a1 = a4;
9913481Sgiacomo.travaglini@arm.com      linked_ptr<A> a5(new A);
10013481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a5.get() != a3);
10113481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a5 != a3.get());
10213481Sgiacomo.travaglini@arm.com      a2 = a5;
10313481Sgiacomo.travaglini@arm.com      linked_ptr<B> b0(new B);
10413481Sgiacomo.travaglini@arm.com      linked_ptr<A> a6(b0);
10513481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(b0 == a6);
10613481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(a6 == b0);
10713481Sgiacomo.travaglini@arm.com      ASSERT_TRUE(b0 != NULL);
10813481Sgiacomo.travaglini@arm.com      a5 = b0;
10913481Sgiacomo.travaglini@arm.com      a5 = b0;
11013481Sgiacomo.travaglini@arm.com      a3->Use();
11113481Sgiacomo.travaglini@arm.com      a4->Use();
11213481Sgiacomo.travaglini@arm.com      a5->Use();
11313481Sgiacomo.travaglini@arm.com      a6->Use();
11413481Sgiacomo.travaglini@arm.com      b0->Use();
11513481Sgiacomo.travaglini@arm.com      (*b0).Use();
11613481Sgiacomo.travaglini@arm.com      b0.get()->Use();
11713481Sgiacomo.travaglini@arm.com    }
11813481Sgiacomo.travaglini@arm.com
11913481Sgiacomo.travaglini@arm.com    a0->Use();
12013481Sgiacomo.travaglini@arm.com    a1->Use();
12113481Sgiacomo.travaglini@arm.com    a2->Use();
12213481Sgiacomo.travaglini@arm.com
12313481Sgiacomo.travaglini@arm.com    a1 = a2;
12413481Sgiacomo.travaglini@arm.com    a2.reset(new A);
12513481Sgiacomo.travaglini@arm.com    a0.reset();
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.com    linked_ptr<A> a7;
12813481Sgiacomo.travaglini@arm.com  }
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com  ASSERT_STREQ(
13113481Sgiacomo.travaglini@arm.com    "A0 ctor\n"
13213481Sgiacomo.travaglini@arm.com    "A1 ctor\n"
13313481Sgiacomo.travaglini@arm.com    "A2 ctor\n"
13413481Sgiacomo.travaglini@arm.com    "B2 ctor\n"
13513481Sgiacomo.travaglini@arm.com    "A0 use\n"
13613481Sgiacomo.travaglini@arm.com    "A0 use\n"
13713481Sgiacomo.travaglini@arm.com    "B2 use\n"
13813481Sgiacomo.travaglini@arm.com    "B2 use\n"
13913481Sgiacomo.travaglini@arm.com    "B2 use\n"
14013481Sgiacomo.travaglini@arm.com    "B2 use\n"
14113481Sgiacomo.travaglini@arm.com    "B2 use\n"
14213481Sgiacomo.travaglini@arm.com    "B2 dtor\n"
14313481Sgiacomo.travaglini@arm.com    "A2 dtor\n"
14413481Sgiacomo.travaglini@arm.com    "A0 use\n"
14513481Sgiacomo.travaglini@arm.com    "A0 use\n"
14613481Sgiacomo.travaglini@arm.com    "A1 use\n"
14713481Sgiacomo.travaglini@arm.com    "A3 ctor\n"
14813481Sgiacomo.travaglini@arm.com    "A0 dtor\n"
14913481Sgiacomo.travaglini@arm.com    "A3 dtor\n"
15013481Sgiacomo.travaglini@arm.com    "A1 dtor\n",
15113481Sgiacomo.travaglini@arm.com    history->GetString().c_str());
15213481Sgiacomo.travaglini@arm.com}
15313481Sgiacomo.travaglini@arm.com
15413481Sgiacomo.travaglini@arm.com}  // Unnamed namespace
155