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