In OwnedPtrDeleter<T>, store a vptr for a behavior function.
[zcpointer.git] / test.cc
diff --git a/test.cc b/test.cc
index e8cbdf295c6d009e2f821eef65b29120c821ef2c..d28d5912be1adfd582126a9585286cd432529d3d 100644 (file)
--- a/test.cc
+++ b/test.cc
 #include <stdexcept>
 #include <vector>
 
+#include "test_helpers.h"
 #include "zcpointer.h"
 
-class C {
- public:
-  ~C() {}
-
-  void DoThing() {}
-};
-
 class TestFailure : public std::logic_error {
  public:
   using std::logic_error::logic_error;
@@ -69,10 +63,13 @@ void TestReset() {
 template <typename T>
 void TestUnwrap() {
   zc::owned<T> t(new T());
-  //T* unwrap = t.get();
+  T* unwrap = t.get();
 
   zc::ref<T> ref = t.get();
   T* unwrap2 = ref;
+
+  zc::member<T> tm;
+  T* tp = &tm;
 }
 
 void TestMove() {
@@ -169,6 +166,40 @@ void TestVector() {
   EXPECT_UAF(ref->DoThing());
 }
 
+void TestStack() {
+  zc::ref<C> rc;
+  {
+    zc::member<C> c;
+    rc = &c;
+    EXPECT(rc == &c);
+    c.DoThing();
+  }
+  EXPECT_UAF(rc->DoThing());
+}
+
+void TestMember() {
+  zc::ref<C> ref;
+  zc::ref<std::vector<C>> vec_ref;
+  {
+    X x("hello world");
+    ref = x.c();
+    vec_ref = x.vec_c();
+
+    vec_ref->push_back(C());
+    vec_ref->push_back(C());
+
+    vec_ref->at(1).DoThing();
+  }
+  EXPECT_UAF(ref->DoThing());
+  EXPECT_UAF(vec_ref->at(1).DoThing());
+
+  {
+    zc::member<X> x("foo bar");
+    ref = x.c();
+  }
+  EXPECT_UAF(ref->DoThing());
+}
+
 #define TEST_FUNC(fn) { #fn , Test##fn }
 
 int main() {
@@ -182,6 +213,8 @@ int main() {
     TEST_FUNC(Equality),
     TEST_FUNC(Nulls),
     TEST_FUNC(Vector),
+    TEST_FUNC(Stack),
+    TEST_FUNC(Member),
   };
 
   bool passed = true;