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