1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2003, Google Inc.
2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// All rights reserved.
3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Redistribution and use in source and binary forms, with or without
5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// modification, are permitted provided that the following conditions are
6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// met:
7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions of source code must retain the above copyright
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// notice, this list of conditions and the following disclaimer.
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions in binary form must reproduce the above
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// in the documentation and/or other materials provided with the
13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// distribution.
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// contributors may be used to endorse or promote products derived from
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// this software without specific prior written permission.
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Authors: Dan Egnor (egnor@google.com)
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Ported to Windows: Vadim Berman (vadimb@google.com)
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/internal/gtest-linked_ptr.h"
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdlib.h>
36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest.h"
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace {
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::Message;
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::internal::linked_ptr;
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint num;
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMessage* history = NULL;
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Class which tracks allocation/deallocation
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass A {
48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void Use() { *history << "A" << mynum << " use\n"; }
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int mynum;
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Subclass
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass B : public A {
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  B() { *history << "B" << mynum << " ctor\n"; }
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~B() { *history << "B" << mynum << " dtor\n"; }
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void Use() { *history << "B" << mynum << " use\n"; }
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass LinkedPtrTest : public testing::Test {
65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  LinkedPtrTest() {
67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    num = 0;
68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    history = new Message;
69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual ~LinkedPtrTest() {
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    delete history;
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    history = NULL;
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(LinkedPtrTest, GeneralTest) {
78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {
79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    linked_ptr<A> a0, a1, a2;
80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Use explicit function call notation here to suppress self-assign warning.
81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a0.operator=(a0);
82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a1 = a2;
83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_TRUE(a0 == NULL);
87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_TRUE(a1 == NULL);
88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ASSERT_TRUE(a2 == NULL);
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    {
91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      linked_ptr<A> a3(new A);
92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a0 = a3;
93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a0 == a3);
94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a0 != NULL);
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a0.get() == a3);
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a0 == a3.get());
97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      linked_ptr<A> a4(a0);
98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a1 = a4;
99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      linked_ptr<A> a5(new A);
100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a5.get() != a3);
101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a5 != a3.get());
102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a2 = a5;
103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      linked_ptr<B> b0(new B);
104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      linked_ptr<A> a6(b0);
105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(b0 == a6);
106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(a6 == b0);
107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ASSERT_TRUE(b0 != NULL);
108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a5 = b0;
109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a5 = b0;
110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a3->Use();
111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a4->Use();
112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a5->Use();
113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      a6->Use();
114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      b0->Use();
115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      (*b0).Use();
116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      b0.get()->Use();
117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a0->Use();
120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a1->Use();
121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a2->Use();
122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a1 = a2;
124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a2.reset(new A);
125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    a0.reset();
126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    linked_ptr<A> a7;
128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ASSERT_STREQ(
131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 ctor\n"
132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A1 ctor\n"
133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A2 ctor\n"
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 ctor\n"
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 use\n"
136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 use\n"
137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 use\n"
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 use\n"
139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 use\n"
140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 use\n"
141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 use\n"
142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "B2 dtor\n"
143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A2 dtor\n"
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 use\n"
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 use\n"
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A1 use\n"
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A3 ctor\n"
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A0 dtor\n"
149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A3 dtor\n"
150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    "A1 dtor\n",
151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    history->GetString().c_str());
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // Unnamed namespace
155