Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/test/ref_ptr_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/test/ref_ptr_test.cpp')
-rw-r--r--source/test/ref_ptr_test.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/source/test/ref_ptr_test.cpp b/source/test/ref_ptr_test.cpp
new file mode 100644
index 0000000..cc585f2
--- /dev/null
+++ b/source/test/ref_ptr_test.cpp
@@ -0,0 +1,83 @@
+#include "StarRefPtr.hpp"
+#include "StarCasting.hpp"
+
+#include "gtest/gtest.h"
+
+using namespace Star;
+
+int g_test1Count = 0;
+int g_test2Count = 0;
+
+struct Base : RefCounter {};
+
+struct Test1 : Base {
+ Test1() {
+ ++g_test1Count;
+ }
+
+ ~Test1() {
+ --g_test1Count;
+ }
+};
+
+struct Test2 : Base {
+ Test2() {
+ ++g_test2Count;
+ }
+
+ ~Test2() {
+ --g_test2Count;
+ }
+};
+
+TEST(IntrusivePtr, All) {
+ {
+ RefPtr<Base> p1 = make_ref<Test1>();
+ RefPtr<Base> p2 = make_ref<Test2>();
+
+ EXPECT_TRUE(is<Test1>(p1));
+ EXPECT_FALSE(is<Test2>(p1));
+ EXPECT_TRUE(is<Test2>(p2));
+ EXPECT_FALSE(is<Test1>(p2));
+
+ RefPtr<Base> p3 = p1;
+ RefPtr<Base> p4 = p2;
+
+ p3 = p3;
+ swap(p3, p4);
+
+ EXPECT_TRUE(is<Test1>(p4));
+ EXPECT_FALSE(is<Test2>(p4));
+ EXPECT_TRUE(is<Test2>(p3));
+ EXPECT_FALSE(is<Test1>(p3));
+
+ EXPECT_EQ(p3, p2);
+ EXPECT_EQ(p4, p1);
+
+ swap(p3, p4);
+
+ EXPECT_EQ(p3, p1);
+ EXPECT_EQ(p4, p2);
+
+ RefPtr<Base> p5;
+ EXPECT_FALSE(p5);
+
+ EXPECT_NE(p4, p1);
+ EXPECT_NE(p3, p2);
+ EXPECT_NE(p3, p5);
+
+ p5 = p2;
+ p2 = move(p5);
+ EXPECT_TRUE(is<Test2>(p2));
+
+ RefPtr<Test1> p6 = as<Test1>(p1);
+ RefPtr<Test2> p7 = as<Test2>(p2);
+ RefPtr<Test2> p8 = as<Test2>(p1);
+ EXPECT_TRUE((bool)p6);
+ EXPECT_TRUE((bool)p7);
+ EXPECT_FALSE((bool)p8);
+ }
+
+ EXPECT_EQ(0, g_test1Count);
+ EXPECT_EQ(0, g_test2Count);
+}