OLD | NEW |
---|---|
(Empty) | |
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 #include "base/memory/pass_scoped_ptr.h" | |
6 | |
7 #include "base/basictypes.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace base { | |
11 | |
12 namespace { | |
13 | |
14 class ConDecLogger { | |
15 public: | |
16 ConDecLogger() : ptr_(NULL) { } | |
17 explicit ConDecLogger(int* ptr) { set_ptr(ptr); } | |
18 ~ConDecLogger() { --*ptr_; } | |
19 | |
20 private: | |
21 void set_ptr(int* ptr) { ptr_ = ptr; ++*ptr_; } | |
22 | |
23 int* ptr_; | |
24 DISALLOW_COPY_AND_ASSIGN(ConDecLogger); | |
25 }; | |
26 | |
27 } // namespace | |
28 | |
29 TEST(PassScopedPtrTest, BasicMethods) { | |
30 int constructed = 0; | |
31 | |
32 { | |
33 ConDecLogger* logger = new ConDecLogger(&constructed); | |
34 PassScopedPtr<ConDecLogger> pass_scoped_ptr(logger); | |
35 EXPECT_EQ(1, constructed); | |
36 EXPECT_EQ(logger, pass_scoped_ptr.value_.raw_ptr); | |
37 EXPECT_TRUE(pass_scoped_ptr.is_valid()); | |
38 } | |
39 EXPECT_EQ(0, constructed); | |
40 | |
41 // Test ToScopedPtr(); | |
42 { | |
43 ConDecLogger* logger = new ConDecLogger(&constructed); | |
44 PassScopedPtr<ConDecLogger> pass_scoped_ptr(logger); | |
45 EXPECT_EQ(1, constructed); | |
46 | |
47 scoped_ptr<ConDecLogger> scoped; | |
48 pass_scoped_ptr.ToScopedPtr(&scoped); | |
49 EXPECT_EQ(logger, scoped.get()); | |
50 EXPECT_TRUE(pass_scoped_ptr.value_.raw_ptr == NULL); | |
51 EXPECT_FALSE(pass_scoped_ptr.is_valid()); | |
52 EXPECT_EQ(1, constructed); | |
53 } | |
54 EXPECT_EQ(0, constructed); | |
55 } | |
56 | |
57 TEST(PassScopedPtrTest, PassBehavior) { | |
58 int constructed = 0; | |
59 // Test Pass constructor; | |
60 { | |
61 ConDecLogger* logger = new ConDecLogger(&constructed); | |
62 PassScopedPtr<ConDecLogger> pass_scoped_ptr(logger); | |
63 EXPECT_EQ(1, constructed); | |
64 | |
65 PassScopedPtr<ConDecLogger> pass_scoped_ptr2(pass_scoped_ptr.Pass()); | |
66 EXPECT_EQ(1, constructed); | |
67 EXPECT_FALSE(pass_scoped_ptr.is_valid()); | |
68 EXPECT_TRUE(pass_scoped_ptr2.is_valid()); | |
69 } | |
70 EXPECT_EQ(0, constructed); | |
71 } | |
72 | |
73 TEST(PassScopedPtrTest, AnchorBehavior) { | |
74 int constructed = 0; | |
75 // Test destruction semantics when anchored. | |
76 { | |
77 ConDecLogger* logger = new ConDecLogger(&constructed); | |
78 subtle::PassScopedPtrAnchor<ConDecLogger> anchor( | |
79 MakePassScopedPtr(logger)); | |
levin
2011/11/02 00:51:30
If I call MakePassScopedPtr on a scoped_ptr, will
awong
2011/11/11 00:21:58
I like that you have explicitly tell the scoped_pt
| |
80 EXPECT_EQ(1, constructed); | |
81 { | |
82 // Deletion of PassScopedPtr when anchored does nothing. | |
83 PassScopedPtr<ConDecLogger> pass_scoped_ptr(&anchor); | |
84 EXPECT_EQ(1, constructed); | |
85 } | |
86 EXPECT_EQ(1, constructed); | |
87 | |
88 PassScopedPtr<ConDecLogger> pass_scoped_ptr(&anchor); | |
89 pass_scoped_ptr.Pass(); | |
90 EXPECT_EQ(0, constructed); | |
91 EXPECT_FALSE(pass_scoped_ptr.is_valid()); | |
92 | |
93 // A second PassScopedPtr for an anchor should be immediately invalid. | |
94 PassScopedPtr<ConDecLogger> pass_scoped_ptr2(&anchor); | |
95 EXPECT_FALSE(pass_scoped_ptr2.is_valid()); | |
96 } | |
97 EXPECT_EQ(0, constructed); | |
98 } | |
99 | |
levin
2011/11/02 00:51:30
Why doesn't returntype need to be used/tested here
awong
2011/11/11 00:21:58
...cause I forgot to do it? :P
Added unittest.
| |
100 } // namespace base | |
OLD | NEW |