15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int num = 0;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string history;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class which tracks allocation/deallocation
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A(): mynum(num++) { history += base::StringPrintf("A%d ctor\n", mynum); }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~A() { history += base::StringPrintf("A%d dtor\n", mynum); }
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Use() { history += base::StringPrintf("A%d use\n", mynum); }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mynum;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B: public A {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  B() { history += base::StringPrintf("B%d ctor\n", mynum); }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~B() { history += base::StringPrintf("B%d dtor\n", mynum); }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Use() OVERRIDE {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history += base::StringPrintf("B%d use\n", mynum);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LinkedPtrTest, Test) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    linked_ptr<A> a0, a1, a2;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a0 = a0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a1 = a2;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(a0 == NULL);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(a1 == NULL);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(a2 == NULL);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      linked_ptr<A> a3(new A);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a0 = a3;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a0 == a3);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a0 != NULL);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a0.get() == a3);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a0 == a3.get());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      linked_ptr<A> a4(a0);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a1 = a4;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      linked_ptr<A> a5(new A);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a5.get() != a3);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a5 != a3.get());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a2 = a5;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      linked_ptr<B> b0(new B);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      linked_ptr<A> a6(b0);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(b0 == a6);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(a6 == b0);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(b0 != NULL);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a5 = b0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a5 = b0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a3->Use();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a4->Use();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a5->Use();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      a6->Use();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      b0->Use();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*b0).Use();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      b0.get()->Use();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a0->Use();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a1->Use();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a2->Use();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a1 = a2;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a2.reset(new A);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a0.reset();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    linked_ptr<A> a7;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(history,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 ctor\n"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A1 ctor\n"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A2 ctor\n"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 ctor\n"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 use\n"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 use\n"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 use\n"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 use\n"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 use\n"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 use\n"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 use\n"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "B2 dtor\n"
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A2 dtor\n"
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 use\n"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 use\n"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A1 use\n"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A3 ctor\n"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A0 dtor\n"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A3 dtor\n"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A1 dtor\n"
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
111