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