Added llvm into exceptions as we can't add README.chromium into 3rd party repository
[chromium-blink-merge.git] / base / memory / ref_counted_unittest.cc
blobf75cd38f19c86d530237200e37792a2cde9480eb
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/ref_counted.h"
7 #include "base/test/opaque_ref_counted.h"
8 #include "testing/gtest/include/gtest/gtest.h"
10 namespace {
12 class SelfAssign : public base::RefCounted<SelfAssign> {
13 protected:
14 virtual ~SelfAssign() {}
16 private:
17 friend class base::RefCounted<SelfAssign>;
20 class Derived : public SelfAssign {
21 protected:
22 ~Derived() override {}
24 private:
25 friend class base::RefCounted<Derived>;
28 class CheckDerivedMemberAccess : public scoped_refptr<SelfAssign> {
29 public:
30 CheckDerivedMemberAccess() {
31 // This shouldn't compile if we don't have access to the member variable.
32 SelfAssign** pptr = &ptr_;
33 EXPECT_EQ(*pptr, ptr_);
37 class ScopedRefPtrToSelf : public base::RefCounted<ScopedRefPtrToSelf> {
38 public:
39 ScopedRefPtrToSelf() : self_ptr_(this) {}
41 static bool was_destroyed() { return was_destroyed_; }
43 void SelfDestruct() { self_ptr_ = NULL; }
45 private:
46 friend class base::RefCounted<ScopedRefPtrToSelf>;
47 ~ScopedRefPtrToSelf() { was_destroyed_ = true; }
49 static bool was_destroyed_;
51 scoped_refptr<ScopedRefPtrToSelf> self_ptr_;
54 bool ScopedRefPtrToSelf::was_destroyed_ = false;
56 } // end namespace
58 TEST(RefCountedUnitTest, TestSelfAssignment) {
59 SelfAssign* p = new SelfAssign;
60 scoped_refptr<SelfAssign> var(p);
61 var = var;
62 EXPECT_EQ(var.get(), p);
65 TEST(RefCountedUnitTest, ScopedRefPtrMemberAccess) {
66 CheckDerivedMemberAccess check;
69 TEST(RefCountedUnitTest, ScopedRefPtrToSelf) {
70 ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf();
71 EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed());
72 check->SelfDestruct();
73 EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed());
76 TEST(RefCountedUnitTest, ScopedRefPtrToOpaque) {
77 scoped_refptr<base::OpaqueRefCounted> p = base::MakeOpaqueRefCounted();
78 base::TestOpaqueRefCounted(p);
80 scoped_refptr<base::OpaqueRefCounted> q;
81 q = p;
82 base::TestOpaqueRefCounted(p);
83 base::TestOpaqueRefCounted(q);
86 TEST(RefCountedUnitTest, BooleanTesting) {
87 scoped_refptr<SelfAssign> p;
88 EXPECT_FALSE(p);
89 p = new SelfAssign;
90 EXPECT_TRUE(p);
93 TEST(RefCountedUnitTest, Equality) {
94 scoped_refptr<SelfAssign> p1(new SelfAssign);
95 scoped_refptr<SelfAssign> p2(new SelfAssign);
97 EXPECT_EQ(p1, p1);
98 EXPECT_EQ(p2, p2);
100 EXPECT_NE(p1, p2);
101 EXPECT_NE(p2, p1);
104 TEST(RefCountedUnitTest, ConvertibleEquality) {
105 scoped_refptr<Derived> p1(new Derived);
106 scoped_refptr<SelfAssign> p2;
108 EXPECT_NE(p1, p2);
109 EXPECT_NE(p2, p1);
111 p2 = p1;
113 EXPECT_EQ(p1, p2);
114 EXPECT_EQ(p2, p1);