2 #include <malloc/malloc.h>
3 #include <objc/objc-runtime.h>
6 +(void)SuperMethodClass;
7 +(void)SuperMethodClass2;
8 -(void)SuperMethodInstance;
9 -(void)SuperMethodInstance2;
13 +(void)SubMethodClass;
14 +(void)SubMethodClass2;
15 -(void)SubMethodInstance;
16 -(void)SubMethodInstance2;
19 @protocol SuperOptionalMethods
21 +(void)SuperOptMethodClass;
22 +(void)SuperOptMethodClass2;
23 -(void)SuperOptMethodInstance;
24 -(void)SuperOptMethodInstance2;
27 @protocol SubOptionalMethods <SuperOptionalMethods>
29 +(void)SubOptMethodClass;
30 +(void)SubOptMethodClass2;
31 -(void)SubOptMethodInstance;
32 -(void)SubOptMethodInstance2;
35 @protocol NoMethods @end
37 static int isNamed(struct objc_method_description m, const char *name)
39 return (m.name == sel_registerName(name));
44 struct objc_method_description *methods;
48 proto = @protocol(SubMethods);
51 // Check required methods
53 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
55 testassert(count == 2);
56 testassert((isNamed(methods[0], "SubMethodInstance") &&
57 isNamed(methods[1], "SubMethodInstance2"))
59 (isNamed(methods[1], "SubMethodInstance") &&
60 isNamed(methods[0], "SubMethodInstance2")));
64 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
66 testassert(count == 2);
67 testassert((isNamed(methods[0], "SubMethodClass") &&
68 isNamed(methods[1], "SubMethodClass2"))
70 (isNamed(methods[1], "SubMethodClass") &&
71 isNamed(methods[0], "SubMethodClass2")));
74 // Check lack of optional methods
76 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
78 testassert(count == 0);
80 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
82 testassert(count == 0);
85 proto = @protocol(SubOptionalMethods);
88 // Check optional methods
90 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
92 testassert(count == 2);
93 testassert((isNamed(methods[0], "SubOptMethodInstance") &&
94 isNamed(methods[1], "SubOptMethodInstance2"))
96 (isNamed(methods[1], "SubOptMethodInstance") &&
97 isNamed(methods[0], "SubOptMethodInstance2")));
101 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
103 testassert(count == 2);
104 testassert((isNamed(methods[0], "SubOptMethodClass") &&
105 isNamed(methods[1], "SubOptMethodClass2"))
107 (isNamed(methods[1], "SubOptMethodClass") &&
108 isNamed(methods[0], "SubOptMethodClass2")));
111 // Check lack of required methods
113 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
114 testassert(!methods);
115 testassert(count == 0);
117 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
118 testassert(!methods);
119 testassert(count == 0);
122 // Check NULL protocol parameter
124 methods = protocol_copyMethodDescriptionList(NULL, YES, YES, &count);
125 testassert(!methods);
126 testassert(count == 0);
128 methods = protocol_copyMethodDescriptionList(NULL, YES, NO, &count);
129 testassert(!methods);
130 testassert(count == 0);
132 methods = protocol_copyMethodDescriptionList(NULL, NO, YES, &count);
133 testassert(!methods);
134 testassert(count == 0);
136 methods = protocol_copyMethodDescriptionList(NULL, NO, NO, &count);
137 testassert(!methods);
138 testassert(count == 0);