• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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.
4 
5 #include "base/basictypes.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 
9 namespace {
10 
11 class ConDecLogger {
12  public:
ConDecLogger()13   ConDecLogger() : ptr_(NULL) { }
ConDecLogger(int * ptr)14   explicit ConDecLogger(int* ptr) { set_ptr(ptr); }
~ConDecLogger()15   ~ConDecLogger() { --*ptr_; }
16 
set_ptr(int * ptr)17   void set_ptr(int* ptr) { ptr_ = ptr; ++*ptr_; }
18 
SomeMeth(int x)19   int SomeMeth(int x) { return x; }
20 
21  private:
22   int* ptr_;
23   DISALLOW_COPY_AND_ASSIGN(ConDecLogger);
24 };
25 
26 }  // namespace
27 
TEST(ScopedPtrTest,ScopedPtr)28 TEST(ScopedPtrTest, ScopedPtr) {
29   int constructed = 0;
30 
31   {
32     scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed));
33     EXPECT_EQ(1, constructed);
34     EXPECT_TRUE(scoper.get());
35 
36     EXPECT_EQ(10, scoper->SomeMeth(10));
37     EXPECT_EQ(10, scoper.get()->SomeMeth(10));
38     EXPECT_EQ(10, (*scoper).SomeMeth(10));
39   }
40   EXPECT_EQ(0, constructed);
41 
42   // Test reset() and release()
43   {
44     scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed));
45     EXPECT_EQ(1, constructed);
46     EXPECT_TRUE(scoper.get());
47 
48     scoper.reset(new ConDecLogger(&constructed));
49     EXPECT_EQ(1, constructed);
50     EXPECT_TRUE(scoper.get());
51 
52     scoper.reset();
53     EXPECT_EQ(0, constructed);
54     EXPECT_FALSE(scoper.get());
55 
56     scoper.reset(new ConDecLogger(&constructed));
57     EXPECT_EQ(1, constructed);
58     EXPECT_TRUE(scoper.get());
59 
60     ConDecLogger* take = scoper.release();
61     EXPECT_EQ(1, constructed);
62     EXPECT_FALSE(scoper.get());
63     delete take;
64     EXPECT_EQ(0, constructed);
65 
66     scoper.reset(new ConDecLogger(&constructed));
67     EXPECT_EQ(1, constructed);
68     EXPECT_TRUE(scoper.get());
69   }
70   EXPECT_EQ(0, constructed);
71 
72   // Test swap(), == and !=
73   {
74     scoped_ptr<ConDecLogger> scoper1;
75     scoped_ptr<ConDecLogger> scoper2;
76     EXPECT_TRUE(scoper1 == scoper2.get());
77     EXPECT_FALSE(scoper1 != scoper2.get());
78 
79     ConDecLogger* logger = new ConDecLogger(&constructed);
80     scoper1.reset(logger);
81     EXPECT_EQ(logger, scoper1.get());
82     EXPECT_FALSE(scoper2.get());
83     EXPECT_FALSE(scoper1 == scoper2.get());
84     EXPECT_TRUE(scoper1 != scoper2.get());
85 
86     scoper2.swap(scoper1);
87     EXPECT_EQ(logger, scoper2.get());
88     EXPECT_FALSE(scoper1.get());
89     EXPECT_FALSE(scoper1 == scoper2.get());
90     EXPECT_TRUE(scoper1 != scoper2.get());
91   }
92   EXPECT_EQ(0, constructed);
93 }
94 
TEST(ScopedPtrTest,ScopedArray)95 TEST(ScopedPtrTest, ScopedArray) {
96   static const int kNumLoggers = 12;
97 
98   int constructed = 0;
99 
100   {
101     scoped_array<ConDecLogger> scoper(new ConDecLogger[kNumLoggers]);
102     EXPECT_TRUE(scoper.get());
103     EXPECT_EQ(&scoper[0], scoper.get());
104     for (int i = 0; i < kNumLoggers; ++i) {
105       scoper[i].set_ptr(&constructed);
106     }
107     EXPECT_EQ(12, constructed);
108 
109     EXPECT_EQ(10, scoper.get()->SomeMeth(10));
110     EXPECT_EQ(10, scoper[2].SomeMeth(10));
111   }
112   EXPECT_EQ(0, constructed);
113 
114   // Test reset() and release()
115   {
116     scoped_array<ConDecLogger> scoper;
117     EXPECT_FALSE(scoper.get());
118     EXPECT_FALSE(scoper.release());
119     EXPECT_FALSE(scoper.get());
120     scoper.reset();
121     EXPECT_FALSE(scoper.get());
122 
123     scoper.reset(new ConDecLogger[kNumLoggers]);
124     for (int i = 0; i < kNumLoggers; ++i) {
125       scoper[i].set_ptr(&constructed);
126     }
127     EXPECT_EQ(12, constructed);
128     scoper.reset();
129     EXPECT_EQ(0, constructed);
130 
131     scoper.reset(new ConDecLogger[kNumLoggers]);
132     for (int i = 0; i < kNumLoggers; ++i) {
133       scoper[i].set_ptr(&constructed);
134     }
135     EXPECT_EQ(12, constructed);
136     ConDecLogger* ptr = scoper.release();
137     EXPECT_EQ(12, constructed);
138     delete[] ptr;
139     EXPECT_EQ(0, constructed);
140   }
141   EXPECT_EQ(0, constructed);
142 
143   // Test swap(), == and !=
144   {
145     scoped_array<ConDecLogger> scoper1;
146     scoped_array<ConDecLogger> scoper2;
147     EXPECT_TRUE(scoper1 == scoper2.get());
148     EXPECT_FALSE(scoper1 != scoper2.get());
149 
150     ConDecLogger* loggers = new ConDecLogger[kNumLoggers];
151     for (int i = 0; i < kNumLoggers; ++i) {
152       loggers[i].set_ptr(&constructed);
153     }
154     scoper1.reset(loggers);
155     EXPECT_EQ(loggers, scoper1.get());
156     EXPECT_FALSE(scoper2.get());
157     EXPECT_FALSE(scoper1 == scoper2.get());
158     EXPECT_TRUE(scoper1 != scoper2.get());
159 
160     scoper2.swap(scoper1);
161     EXPECT_EQ(loggers, scoper2.get());
162     EXPECT_FALSE(scoper1.get());
163     EXPECT_FALSE(scoper1 == scoper2.get());
164     EXPECT_TRUE(scoper1 != scoper2.get());
165   }
166   EXPECT_EQ(0, constructed);
167 }
168 
169 // TODO scoped_ptr_malloc
170