]> git.saurik.com Git - apple/objc4.git/blob - test/protocol.m
objc4-437.3.tar.gz
[apple/objc4.git] / test / protocol.m
1 #include "test.h"
2
3 #include <string.h>
4 #include <objc/Protocol.h>
5 #include <objc/objc-runtime.h>
6
7 @protocol Proto1
8 +proto1ClassMethod;
9 -proto1InstanceMethod;
10 @end
11
12 @protocol Proto2
13 +proto2ClassMethod;
14 -proto2InstanceMethod;
15 @end
16
17 @protocol Proto3 <Proto2>
18 +proto3ClassMethod;
19 -proto3InstanceMethod;
20 @end
21
22 @protocol Proto4
23 @property int i;
24 @end
25
26 @protocol ProtoEmpty
27 @end
28
29 @interface Super <Proto1> { id isa; } @end
30 @implementation Super
31 +class { return self; }
32 +(void)initialize { }
33 +proto1ClassMethod { return self; }
34 -proto1InstanceMethod { return self; }
35 @end
36
37 @interface SubNoProtocols : Super { } @end
38 @implementation SubNoProtocols @end
39
40 @interface SuperNoProtocols { id isa; } @end
41 @implementation SuperNoProtocols
42 +class { return self; }
43 +(void)initialize { }
44 @end
45
46 @interface SubProp : Super <Proto4> { int i; } @end
47 @implementation SubProp
48 @synthesize i;
49 @end
50
51
52 int main()
53 {
54 Class cls;
55 Protocol **list;
56 Protocol *protocol, *empty;
57 #if !__OBJC2__
58 struct objc_method_description *desc;
59 #endif
60 struct objc_method_description desc2;
61 objc_property_t *proplist;
62 unsigned int count;
63
64 protocol = @protocol(Proto3);
65 empty = @protocol(ProtoEmpty);
66 testassert(protocol);
67 testassert(empty);
68
69 #if !__OBJC2__
70 testassert([protocol isKindOf:[Protocol class]]);
71 testassert([empty isKindOf:[Protocol class]]);
72 testassert(0 == strcmp([protocol name], "Proto3"));
73 testassert(0 == strcmp([empty name], "ProtoEmpty"));
74 #endif
75 testassert(0 == strcmp(protocol_getName(protocol), "Proto3"));
76 testassert(0 == strcmp(protocol_getName(empty), "ProtoEmpty"));
77
78 testassert(class_conformsToProtocol([Super class], @protocol(Proto1)));
79 testassert(!class_conformsToProtocol([SubProp class], @protocol(Proto1)));
80 testassert(class_conformsToProtocol([SubProp class], @protocol(Proto4)));
81 testassert(!class_conformsToProtocol([SubProp class], @protocol(Proto3)));
82 testassert(!class_conformsToProtocol([Super class], @protocol(Proto3)));
83
84 testassert(!protocol_conformsToProtocol(@protocol(Proto1), @protocol(Proto2)));
85 testassert(protocol_conformsToProtocol(@protocol(Proto3), @protocol(Proto2)));
86 testassert(!protocol_conformsToProtocol(@protocol(Proto2), @protocol(Proto3)));
87
88 #if !__OBJC2__
89 testassert([@protocol(Proto1) isEqual:@protocol(Proto1)]);
90 testassert(! [@protocol(Proto1) isEqual:@protocol(Proto2)]);
91 #endif
92 testassert(protocol_isEqual(@protocol(Proto1), @protocol(Proto1)));
93 testassert(! protocol_isEqual(@protocol(Proto1), @protocol(Proto2)));
94
95 #if !__OBJC2__
96 desc = [protocol descriptionForInstanceMethod:@selector(proto3InstanceMethod)];
97 testassert(desc);
98 testassert(desc->name == @selector(proto3InstanceMethod));
99 desc = [protocol descriptionForClassMethod:@selector(proto3ClassMethod)];
100 testassert(desc);
101 testassert(desc->name == @selector(proto3ClassMethod));
102 desc = [protocol descriptionForInstanceMethod:@selector(proto3ClassMethod)];
103 testassert(!desc);
104 desc = [protocol descriptionForClassMethod:@selector(proto3InstanceMethod)];
105 testassert(!desc);
106 desc = [empty descriptionForInstanceMethod:@selector(proto3ClassMethod)];
107 testassert(!desc);
108 desc = [empty descriptionForClassMethod:@selector(proto3InstanceMethod)];
109 testassert(!desc);
110 #endif
111 desc2 = protocol_getMethodDescription(protocol, @selector(proto3InstanceMethod), YES, YES);
112 testassert(desc2.name && desc2.types);
113 testassert(desc2.name == @selector(proto3InstanceMethod));
114 desc2 = protocol_getMethodDescription(protocol, @selector(proto3ClassMethod), YES, NO);
115 testassert(desc2.name && desc2.types);
116 testassert(desc2.name == @selector(proto3ClassMethod));
117
118 desc2 = protocol_getMethodDescription(protocol, @selector(proto3ClassMethod), YES, YES);
119 testassert(!desc2.name && !desc2.types);
120 desc2 = protocol_getMethodDescription(protocol, @selector(proto3InstanceMethod), YES, NO);
121 testassert(!desc2.name && !desc2.types);
122 desc2 = protocol_getMethodDescription(empty, @selector(proto3ClassMethod), YES, YES);
123 testassert(!desc2.name && !desc2.types);
124 desc2 = protocol_getMethodDescription(empty, @selector(proto3InstanceMethod), YES, NO);
125 testassert(!desc2.name && !desc2.types);
126
127 count = 100;
128 list = protocol_copyProtocolList(@protocol(Proto2), &count);
129 testassert(!list);
130 testassert(count == 0);
131 count = 100;
132 list = protocol_copyProtocolList(@protocol(Proto3), &count);
133 testassert(list);
134 testassert(count == 1);
135 testassert(protocol_isEqual(list[0], @protocol(Proto2)));
136 testassert(!list[1]);
137 free(list);
138
139 count = 100;
140 cls = objc_getClass("Super");
141 testassert(cls);
142 list = class_copyProtocolList(cls, &count);
143 testassert(list);
144 testassert(list[count] == NULL);
145 testassert(count == 1);
146 testassert(0 == strcmp(protocol_getName(list[0]), "Proto1"));
147 free(list);
148
149 count = 100;
150 cls = objc_getClass("SuperNoProtocols");
151 testassert(cls);
152 list = class_copyProtocolList(cls, &count);
153 testassert(!list);
154 testassert(count == 0);
155
156 count = 100;
157 cls = objc_getClass("SubNoProtocols");
158 testassert(cls);
159 list = class_copyProtocolList(cls, &count);
160 testassert(!list);
161 testassert(count == 0);
162
163
164 cls = objc_getClass("SuperNoProtocols");
165 testassert(cls);
166 list = class_copyProtocolList(cls, NULL);
167 testassert(!list);
168
169 cls = objc_getClass("Super");
170 testassert(cls);
171 list = class_copyProtocolList(cls, NULL);
172 testassert(list);
173 free(list);
174
175 count = 100;
176 list = class_copyProtocolList(NULL, &count);
177 testassert(!list);
178 testassert(count == 0);
179
180
181 // Check property added by protocol
182 cls = objc_getClass("SubProp");
183 testassert(cls);
184
185 count = 100;
186 list = class_copyProtocolList(cls, &count);
187 testassert(list);
188 testassert(count == 1);
189 testassert(0 == strcmp(protocol_getName(list[0]), "Proto4"));
190 testassert(list[1] == NULL);
191 free(list);
192
193 count = 100;
194 proplist = class_copyPropertyList(cls, &count);
195 testassert(proplist);
196 testassert(count == 1);
197 testassert(0 == strcmp(property_getName(proplist[0]), "i"));
198 testassert(proplist[1] == NULL);
199 free(proplist);
200
201 succeed(__FILE__);
202 }