4 #include <malloc/malloc.h>
5 #include <objc/objc-runtime.h>
8 +(void)SuperMethodClass;
9 +(void)SuperMethodClass2;
10 -(void)SuperMethodInstance;
11 -(void)SuperMethodInstance2;
15 +(void)SubMethodClass;
16 +(void)SubMethodClass2;
17 -(void)SubMethodInstance;
18 -(void)SubMethodInstance2;
21 @protocol SuperOptionalMethods
23 +(void)SuperOptMethodClass;
24 +(void)SuperOptMethodClass2;
25 -(void)SuperOptMethodInstance;
26 -(void)SuperOptMethodInstance2;
29 @protocol SubOptionalMethods <SuperOptionalMethods>
31 +(void)SubOptMethodClass;
32 +(void)SubOptMethodClass2;
33 -(void)SubOptMethodInstance;
34 -(void)SubOptMethodInstance2;
37 @protocol NoMethods @end
39 static int isNamed(struct objc_method_description m, const char *name)
41 return (m.name == sel_registerName(name));
46 struct objc_method_description *methods;
50 proto = @protocol(SubMethods);
53 // Check required methods
55 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
57 testassert(count == 2);
58 testassert((isNamed(methods[0], "SubMethodInstance") &&
59 isNamed(methods[1], "SubMethodInstance2"))
61 (isNamed(methods[1], "SubMethodInstance") &&
62 isNamed(methods[0], "SubMethodInstance2")));
66 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
68 testassert(count == 2);
69 testassert((isNamed(methods[0], "SubMethodClass") &&
70 isNamed(methods[1], "SubMethodClass2"))
72 (isNamed(methods[1], "SubMethodClass") &&
73 isNamed(methods[0], "SubMethodClass2")));
76 // Check lack of optional methods
78 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
80 testassert(count == 0);
82 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
84 testassert(count == 0);
87 proto = @protocol(SubOptionalMethods);
90 // Check optional methods
92 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
94 testassert(count == 2);
95 testassert((isNamed(methods[0], "SubOptMethodInstance") &&
96 isNamed(methods[1], "SubOptMethodInstance2"))
98 (isNamed(methods[1], "SubOptMethodInstance") &&
99 isNamed(methods[0], "SubOptMethodInstance2")));
103 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
105 testassert(count == 2);
106 testassert((isNamed(methods[0], "SubOptMethodClass") &&
107 isNamed(methods[1], "SubOptMethodClass2"))
109 (isNamed(methods[1], "SubOptMethodClass") &&
110 isNamed(methods[0], "SubOptMethodClass2")));
113 // Check lack of required methods
115 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
116 testassert(!methods);
117 testassert(count == 0);
119 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
120 testassert(!methods);
121 testassert(count == 0);
124 // Check NULL protocol parameter
126 methods = protocol_copyMethodDescriptionList(NULL, YES, YES, &count);
127 testassert(!methods);
128 testassert(count == 0);
130 methods = protocol_copyMethodDescriptionList(NULL, YES, NO, &count);
131 testassert(!methods);
132 testassert(count == 0);
134 methods = protocol_copyMethodDescriptionList(NULL, NO, YES, &count);
135 testassert(!methods);
136 testassert(count == 0);
138 methods = protocol_copyMethodDescriptionList(NULL, NO, NO, &count);
139 testassert(!methods);
140 testassert(count == 0);