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