1 // Copyright 2014 The Android Open Source Project 2 // 3 // This software is licensed under the terms of the GNU General Public 4 // License version 2, as published by the Free Software Foundation, and 5 // may be copied, distributed, and modified under those terms. 6 // 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License for more details. 11 12 #include "android/base/memory/ScopedPtr.h" 13 14 #include <gtest/gtest.h> 15 16 namespace android { 17 namespace base { 18 19 class Foo { 20 public: 21 Foo(int* countPtr) : mCountPtr(countPtr) {} 22 23 void DoIncrement() { 24 (*mCountPtr)++; 25 } 26 27 ~Foo() { 28 DoIncrement(); 29 } 30 private: 31 int* mCountPtr; 32 }; 33 34 class ScopedPtrTest : public testing::Test { 35 public: 36 ScopedPtrTest() : mDestroyCount(0) {} 37 38 Foo* NewFoo() { 39 return new Foo(&mDestroyCount); 40 } 41 42 protected: 43 int mDestroyCount; 44 }; 45 46 TEST_F(ScopedPtrTest, EmptyConstructor) { 47 ScopedPtr<Foo> foo; 48 EXPECT_FALSE(foo.get()); 49 } 50 51 TEST_F(ScopedPtrTest, SimpleConstructor) { 52 ScopedPtr<Foo> foo(NewFoo()); 53 EXPECT_TRUE(foo.get()); 54 } 55 56 TEST_F(ScopedPtrTest, DestroyOnScopeExit) { 57 { 58 ScopedPtr<Foo> foo(NewFoo()); 59 EXPECT_EQ(0, mDestroyCount); 60 } 61 EXPECT_EQ(1, mDestroyCount); 62 } 63 64 TEST_F(ScopedPtrTest, Release) { 65 Foo* savedFoo = NULL; 66 { 67 ScopedPtr<Foo> foo(NewFoo()); 68 EXPECT_EQ(0, mDestroyCount); 69 savedFoo = foo.release(); 70 EXPECT_EQ(0, mDestroyCount); 71 EXPECT_FALSE(foo.get()); 72 EXPECT_TRUE(savedFoo); 73 } 74 EXPECT_EQ(0, mDestroyCount); 75 delete savedFoo; 76 } 77 78 TEST_F(ScopedPtrTest, ArrowOperator) { 79 ScopedPtr<Foo> foo(NewFoo()); 80 foo->DoIncrement(); 81 EXPECT_EQ(1, mDestroyCount); 82 } 83 84 TEST_F(ScopedPtrTest, StarOperator) { 85 ScopedPtr<Foo> foo(NewFoo()); 86 (*foo).DoIncrement(); 87 EXPECT_EQ(1, mDestroyCount); 88 } 89 90 } // namespace base 91 } // namespace android