]> git.saurik.com Git - apple/objc4.git/blobdiff - test/duplicateProtocols.m
objc4-779.1.tar.gz
[apple/objc4.git] / test / duplicateProtocols.m
diff --git a/test/duplicateProtocols.m b/test/duplicateProtocols.m
new file mode 100644 (file)
index 0000000..1cb5a76
--- /dev/null
@@ -0,0 +1,42 @@
+
+#include "test.h"
+
+// This test assumes
+// - that on launch we don't have NSCoding, NSSecureCoding, or NSDictionary, ie, libSystem doesn't contain those
+// - that after dlopening CF, we get NSDictionary and it conforms to NSSecureCoding which conforms to NSCoding
+// - that our NSCoding will be used if we ask either NSSecureCoding or NSDictionary if they conform to our test protocol
+
+@protocol NewNSCodingSuperProto
+@end
+
+@protocol NSCoding <NewNSCodingSuperProto>
+@end
+
+int main()
+{
+       // Before we dlopen, make sure we are using our NSCoding, not the shared cache version
+       Protocol* codingSuperProto = objc_getProtocol("NewNSCodingSuperProto");
+       Protocol* codingProto = objc_getProtocol("NSCoding");
+       if (@protocol(NewNSCodingSuperProto) != codingSuperProto) fail("Protocol mismatch");
+       if (@protocol(NSCoding) != codingProto) fail("Protocol mismatch");
+       if (!protocol_conformsToProtocol(codingProto, codingSuperProto)) fail("Our NSCoding should conform to NewNSCodingSuperProto");
+
+       // Also make sure we don't yet have an NSSecureCoding or NSDictionary
+       if (objc_getProtocol("NSSecureCoding")) fail("Test assumes we don't have NSSecureCoding yet");
+       if (objc_getClass("NSDictionary")) fail("Test assumes we don't have NSDictionary yet");
+
+    void *dl = dlopen("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", RTLD_LAZY);
+    if (!dl) fail("couldn't open CoreFoundation");
+    
+    // We should now have NSSecureCoding and NSDictionary
+    Protocol* secureCodingProto = objc_getProtocol("NSSecureCoding");
+    id dictionaryClass = objc_getClass("NSDictionary");
+    if (!secureCodingProto) fail("Should have got NSSecureCoding from CoreFoundation");
+    if (!dictionaryClass) fail("Should have got NSDictionary from CoreFoundation");
+
+    // Now make sure that NSDictionary and NSSecureCoding find our new protocols
+    if (!protocol_conformsToProtocol(secureCodingProto, codingProto)) fail("NSSecureCoding should conform to our NSCoding");
+    if (!protocol_conformsToProtocol(secureCodingProto, codingSuperProto)) fail("NSSecureCoding should conform to our NewNSCodingSuperProto");
+    if (!class_conformsToProtocol(dictionaryClass, codingProto)) fail("NSDictionary should conform to our NSCoding");
+    if (!class_conformsToProtocol(dictionaryClass, codingSuperProto)) fail("NSDictionary should conform to our NewNSCodingSuperProto");
+}