1 /*
2 * Copyright 2011 Google Inc. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "gtest/gtest.h"
18 #define ENABLE_OBJECT_COUNTER
19 #include "sfntly/port/refcount.h"
20
21 using sfntly::RefCounted;
22 using sfntly::Ptr;
23
24 class Foo : public RefCounted<Foo> {
25 public: // put in something to make sure it's not empty
26 int foo_;
foo()27 int foo() { return foo_; }
28 };
29
TestSmartPointer()30 bool TestSmartPointer() {
31 // scope out allocation
32 {
33 Ptr<Foo> p1;
34 p1 = new Foo();
35 EXPECT_EQ(size_t(1), p1->ref_count_);
36 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
37
38 Ptr<Foo> p2;
39 p2 = p1;
40 EXPECT_EQ(size_t(2), p1->ref_count_);
41 EXPECT_EQ(size_t(2), p2->ref_count_);
42 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
43
44 Ptr<Foo> p3;
45 p3 = p1;
46 EXPECT_EQ(size_t(3), p1->ref_count_);
47 EXPECT_EQ(size_t(3), p2->ref_count_);
48 EXPECT_EQ(size_t(3), p3->ref_count_);
49 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
50
51 p2 = new Foo();
52 EXPECT_EQ(size_t(2), p1->ref_count_);
53 EXPECT_EQ(size_t(1), p2->ref_count_);
54 EXPECT_EQ(size_t(2), p3->ref_count_);
55 EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
56
57 p3.Release();
58 EXPECT_EQ(size_t(1), p1->ref_count_);
59 EXPECT_EQ(NULL, p3.p_);
60 EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
61
62 p2 = NULL;
63 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
64
65 p1 = p1;
66 EXPECT_EQ(size_t(1), p1->ref_count_);
67 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
68
69 p1 = &(*p1);
70 EXPECT_EQ(size_t(1), p1->ref_count_);
71 EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
72 }
73 EXPECT_EQ(size_t(0), RefCounted<Foo>::object_counter_);
74 return true;
75 }
76
TEST(SmartPointer,All)77 TEST(SmartPointer, All) {
78 ASSERT_TRUE(TestSmartPointer());
79 }
80