Home | History | Annotate | Download | only in util
      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 
     16 namespace {
     17 
     18 using i18n::addressinput::scoped_ptr;
     19 
     20 class 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 
     35 TEST(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