]> git.saurik.com Git - apple/objc4.git/blob - test/protocol_copyMethodList.m
objc4-437.3.tar.gz
[apple/objc4.git] / test / protocol_copyMethodList.m
1 #include "test.h"
2 #include <malloc/malloc.h>
3 #include <objc/objc-runtime.h>
4
5 @protocol SuperMethods
6 +(void)SuperMethodClass;
7 +(void)SuperMethodClass2;
8 -(void)SuperMethodInstance;
9 -(void)SuperMethodInstance2;
10 @end
11
12 @protocol SubMethods
13 +(void)SubMethodClass;
14 +(void)SubMethodClass2;
15 -(void)SubMethodInstance;
16 -(void)SubMethodInstance2;
17 @end
18
19 @protocol SuperOptionalMethods
20 @optional
21 +(void)SuperOptMethodClass;
22 +(void)SuperOptMethodClass2;
23 -(void)SuperOptMethodInstance;
24 -(void)SuperOptMethodInstance2;
25 @end
26
27 @protocol SubOptionalMethods <SuperOptionalMethods>
28 @optional
29 +(void)SubOptMethodClass;
30 +(void)SubOptMethodClass2;
31 -(void)SubOptMethodInstance;
32 -(void)SubOptMethodInstance2;
33 @end
34
35 @protocol NoMethods @end
36
37 static int isNamed(struct objc_method_description m, const char *name)
38 {
39 return (m.name == sel_registerName(name));
40 }
41
42 int main()
43 {
44 struct objc_method_description *methods;
45 unsigned int count;
46 Protocol *proto;
47
48 proto = @protocol(SubMethods);
49 testassert(proto);
50
51 // Check required methods
52 count = 999;
53 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
54 testassert(methods);
55 testassert(count == 2);
56 testassert((isNamed(methods[0], "SubMethodInstance") &&
57 isNamed(methods[1], "SubMethodInstance2"))
58 ||
59 (isNamed(methods[1], "SubMethodInstance") &&
60 isNamed(methods[0], "SubMethodInstance2")));
61 free(methods);
62
63 count = 999;
64 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
65 testassert(methods);
66 testassert(count == 2);
67 testassert((isNamed(methods[0], "SubMethodClass") &&
68 isNamed(methods[1], "SubMethodClass2"))
69 ||
70 (isNamed(methods[1], "SubMethodClass") &&
71 isNamed(methods[0], "SubMethodClass2")));
72 free(methods);
73
74 // Check lack of optional methods
75 count = 999;
76 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
77 testassert(!methods);
78 testassert(count == 0);
79 count = 999;
80 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
81 testassert(!methods);
82 testassert(count == 0);
83
84
85 proto = @protocol(SubOptionalMethods);
86 testassert(proto);
87
88 // Check optional methods
89 count = 999;
90 methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count);
91 testassert(methods);
92 testassert(count == 2);
93 testassert((isNamed(methods[0], "SubOptMethodInstance") &&
94 isNamed(methods[1], "SubOptMethodInstance2"))
95 ||
96 (isNamed(methods[1], "SubOptMethodInstance") &&
97 isNamed(methods[0], "SubOptMethodInstance2")));
98 free(methods);
99
100 count = 999;
101 methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count);
102 testassert(methods);
103 testassert(count == 2);
104 testassert((isNamed(methods[0], "SubOptMethodClass") &&
105 isNamed(methods[1], "SubOptMethodClass2"))
106 ||
107 (isNamed(methods[1], "SubOptMethodClass") &&
108 isNamed(methods[0], "SubOptMethodClass2")));
109 free(methods);
110
111 // Check lack of required methods
112 count = 999;
113 methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count);
114 testassert(!methods);
115 testassert(count == 0);
116 count = 999;
117 methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count);
118 testassert(!methods);
119 testassert(count == 0);
120
121
122 // Check NULL protocol parameter
123 count = 999;
124 methods = protocol_copyMethodDescriptionList(NULL, YES, YES, &count);
125 testassert(!methods);
126 testassert(count == 0);
127 count = 999;
128 methods = protocol_copyMethodDescriptionList(NULL, YES, NO, &count);
129 testassert(!methods);
130 testassert(count == 0);
131 count = 999;
132 methods = protocol_copyMethodDescriptionList(NULL, NO, YES, &count);
133 testassert(!methods);
134 testassert(count == 0);
135 count = 999;
136 methods = protocol_copyMethodDescriptionList(NULL, NO, NO, &count);
137 testassert(!methods);
138 testassert(count == 0);
139
140 succeed(__FILE__);
141 }