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