Home | History | Annotate | Download | only in memory
      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