]> git.saurik.com Git - apple/xnu.git/blobdiff - tests/osptr_dumb.cpp
xnu-6153.11.26.tar.gz
[apple/xnu.git] / tests / osptr_dumb.cpp
diff --git a/tests/osptr_dumb.cpp b/tests/osptr_dumb.cpp
new file mode 100644 (file)
index 0000000..8cb7e4f
--- /dev/null
@@ -0,0 +1,80 @@
+#include <darwintest.h>
+#include <darwintest_utils.h>
+#include <stdio.h>
+#include <assert.h>
+#include <typeinfo>
+
+#if 0
+# define OSPTR_LOG T_LOG
+#elif 0
+# define OSPTR_LOG printf
+#else
+# define OSPTR_LOG(x...)  do { } while(0)
+#endif
+
+T_GLOBAL_META(
+       T_META_NAMESPACE("osptr"),
+       T_META_CHECK_LEAKS(false),
+       T_META_RUN_CONCURRENTLY(true)
+       );
+
+class OSMetaClassBase
+{
+public:
+       virtual void
+       retain() const
+       {
+       }
+       virtual void
+       release() const
+       {
+       }
+       virtual void
+       taggedRetain(void *tag) const
+       {
+       }
+       virtual void
+       taggedRelease(void *tag) const
+       {
+       }
+
+       static void *type_id;
+};
+
+void *OSMetaClassBase::type_id;
+
+#define OSTypeAlloc(T) new T
+#define OSTypeID(T) T::type_id
+
+#include <libkern/c++/OSPtr.h>
+
+class Base : public OSMetaClassBase {
+public:
+       Base() : OSMetaClassBase()
+       {
+       }
+};
+
+class Derived : public Base {
+public:
+       Derived() : Base()
+       {
+       }
+};
+
+typedef OSPtr<Base> BasePtr;
+typedef OSPtr<Derived> DerivedPtr;
+
+T_DECL(dumb_osptr, "Dumb OSPtrs work")
+{
+       BasePtr x = nullptr;
+       T_ASSERT_EQ_PTR(x, nullptr, NULL);
+       T_ASSERT_TRUE(typeid(BasePtr) == typeid(Base *), NULL);
+       T_ASSERT_TRUE(typeid(DerivedPtr) == typeid(Derived *), NULL);
+
+       OSTaggedPtr<Base, Base> y = nullptr;
+       OSTaggedPtr<Derived, Base> z = nullptr;
+       T_ASSERT_EQ_PTR(y, nullptr, NULL);
+       T_ASSERT_TRUE(typeid(y) == typeid(Base *), NULL);
+       T_ASSERT_TRUE(typeid(z) == typeid(Derived *), NULL);
+}