summaryrefslogtreecommitdiffstats
path: root/gfx/sfntly/cpp/src/test/smart_pointer_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/sfntly/cpp/src/test/smart_pointer_test.cc')
-rw-r--r--gfx/sfntly/cpp/src/test/smart_pointer_test.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/gfx/sfntly/cpp/src/test/smart_pointer_test.cc b/gfx/sfntly/cpp/src/test/smart_pointer_test.cc
new file mode 100644
index 0000000000..9e81baaba6
--- /dev/null
+++ b/gfx/sfntly/cpp/src/test/smart_pointer_test.cc
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2011 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gtest/gtest.h"
+#define ENABLE_OBJECT_COUNTER
+#include "sfntly/port/refcount.h"
+
+using sfntly::RefCounted;
+using sfntly::Ptr;
+
+class Foo : public RefCounted<Foo> {
+public: // put in something to make sure it's not empty
+ int foo_;
+ int foo() { return foo_; }
+};
+
+bool TestSmartPointer() {
+ // scope out allocation
+ {
+ Ptr<Foo> p1;
+ p1 = new Foo();
+ EXPECT_EQ(size_t(1), p1->ref_count_);
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+
+ Ptr<Foo> p2;
+ p2 = p1;
+ EXPECT_EQ(size_t(2), p1->ref_count_);
+ EXPECT_EQ(size_t(2), p2->ref_count_);
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+
+ Ptr<Foo> p3;
+ p3 = p1;
+ EXPECT_EQ(size_t(3), p1->ref_count_);
+ EXPECT_EQ(size_t(3), p2->ref_count_);
+ EXPECT_EQ(size_t(3), p3->ref_count_);
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+
+ p2 = new Foo();
+ EXPECT_EQ(size_t(2), p1->ref_count_);
+ EXPECT_EQ(size_t(1), p2->ref_count_);
+ EXPECT_EQ(size_t(2), p3->ref_count_);
+ EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
+
+ p3.Release();
+ EXPECT_EQ(size_t(1), p1->ref_count_);
+ EXPECT_EQ(NULL, p3.p_);
+ EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
+
+ p2 = NULL;
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+
+ p1 = p1;
+ EXPECT_EQ(size_t(1), p1->ref_count_);
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+
+ p1 = &(*p1);
+ EXPECT_EQ(size_t(1), p1->ref_count_);
+ EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
+ }
+ EXPECT_EQ(size_t(0), RefCounted<Foo>::object_counter_);
+ return true;
+}
+
+TEST(SmartPointer, All) {
+ ASSERT_TRUE(TestSmartPointer());
+}