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