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