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// The original source code is from: 6// http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr_unittest.cc?revision=79524 7 8#include <libaddressinput/util/scoped_ptr.h> 9 10#include <libaddressinput/util/basictypes.h> 11 12#include <cstddef> 13 14#include <gtest/gtest.h> 15 16namespace { 17 18using i18n::addressinput::scoped_ptr; 19 20class ConDecLogger { 21 public: 22 ConDecLogger() : ptr_(NULL) { } 23 explicit ConDecLogger(int* ptr) { set_ptr(ptr); } 24 ~ConDecLogger() { --*ptr_; } 25 26 void set_ptr(int* ptr) { ptr_ = ptr; ++*ptr_; } 27 28 int SomeMeth(int x) { return x; } 29 30 private: 31 int* ptr_; 32 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); 33}; 34 35TEST(ScopedPtrTest, ScopedPtr) { 36 int constructed = 0; 37 38 { 39 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); 40 EXPECT_EQ(1, constructed); 41 EXPECT_TRUE(scoper.get()); 42 43 EXPECT_EQ(10, scoper->SomeMeth(10)); 44 EXPECT_EQ(10, scoper.get()->SomeMeth(10)); 45 EXPECT_EQ(10, (*scoper).SomeMeth(10)); 46 } 47 EXPECT_EQ(0, constructed); 48 49 // Test reset() and release() 50 { 51 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); 52 EXPECT_EQ(1, constructed); 53 EXPECT_TRUE(scoper.get()); 54 55 scoper.reset(new ConDecLogger(&constructed)); 56 EXPECT_EQ(1, constructed); 57 EXPECT_TRUE(scoper.get()); 58 59 scoper.reset(); 60 EXPECT_EQ(0, constructed); 61 EXPECT_FALSE(scoper.get()); 62 63 scoper.reset(new ConDecLogger(&constructed)); 64 EXPECT_EQ(1, constructed); 65 EXPECT_TRUE(scoper.get()); 66 67 ConDecLogger* take = scoper.release(); 68 EXPECT_EQ(1, constructed); 69 EXPECT_FALSE(scoper.get()); 70 delete take; 71 EXPECT_EQ(0, constructed); 72 73 scoper.reset(new ConDecLogger(&constructed)); 74 EXPECT_EQ(1, constructed); 75 EXPECT_TRUE(scoper.get()); 76 } 77 EXPECT_EQ(0, constructed); 78 79 // Test swap(), == and != 80 { 81 scoped_ptr<ConDecLogger> scoper1; 82 scoped_ptr<ConDecLogger> scoper2; 83 EXPECT_TRUE(scoper1 == scoper2.get()); 84 EXPECT_FALSE(scoper1 != scoper2.get()); 85 86 ConDecLogger* logger = new ConDecLogger(&constructed); 87 scoper1.reset(logger); 88 EXPECT_EQ(logger, scoper1.get()); 89 EXPECT_FALSE(scoper2.get()); 90 EXPECT_FALSE(scoper1 == scoper2.get()); 91 EXPECT_TRUE(scoper1 != scoper2.get()); 92 93 scoper2.swap(scoper1); 94 EXPECT_EQ(logger, scoper2.get()); 95 EXPECT_FALSE(scoper1.get()); 96 EXPECT_FALSE(scoper1 == scoper2.get()); 97 EXPECT_TRUE(scoper1 != scoper2.get()); 98 } 99 EXPECT_EQ(0, constructed); 100} 101 102} // namespace 103