4 #include <objc/Protocol.h>
5 #include <objc/objc-runtime.h>
14 -proto2InstanceMethod;
17 @protocol Proto3 <Proto2>
19 -proto3InstanceMethod;
29 @interface Super <Proto1> { id isa; } @end
31 +class { return self; }
33 +proto1ClassMethod { return self; }
34 -proto1InstanceMethod { return self; }
37 @interface SubNoProtocols : Super { } @end
38 @implementation SubNoProtocols @end
40 @interface SuperNoProtocols { id isa; } @end
41 @implementation SuperNoProtocols
42 +class { return self; }
46 @interface SubProp : Super <Proto4> { int i; } @end
47 @implementation SubProp
56 Protocol *protocol, *empty;
58 struct objc_method_description *desc;
60 struct objc_method_description desc2;
61 objc_property_t *proplist;
64 protocol = @protocol(Proto3);
65 empty = @protocol(ProtoEmpty);
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"));
75 testassert(0 == strcmp(protocol_getName(protocol), "Proto3"));
76 testassert(0 == strcmp(protocol_getName(empty), "ProtoEmpty"));
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)));
84 testassert(!protocol_conformsToProtocol(@protocol(Proto1), @protocol(Proto2)));
85 testassert(protocol_conformsToProtocol(@protocol(Proto3), @protocol(Proto2)));
86 testassert(!protocol_conformsToProtocol(@protocol(Proto2), @protocol(Proto3)));
89 testassert([@protocol(Proto1) isEqual:@protocol(Proto1)]);
90 testassert(! [@protocol(Proto1) isEqual:@protocol(Proto2)]);
92 testassert(protocol_isEqual(@protocol(Proto1), @protocol(Proto1)));
93 testassert(! protocol_isEqual(@protocol(Proto1), @protocol(Proto2)));
96 desc = [protocol descriptionForInstanceMethod:@selector(proto3InstanceMethod)];
98 testassert(desc->name == @selector(proto3InstanceMethod));
99 desc = [protocol descriptionForClassMethod:@selector(proto3ClassMethod)];
101 testassert(desc->name == @selector(proto3ClassMethod));
102 desc = [protocol descriptionForInstanceMethod:@selector(proto3ClassMethod)];
104 desc = [protocol descriptionForClassMethod:@selector(proto3InstanceMethod)];
106 desc = [empty descriptionForInstanceMethod:@selector(proto3ClassMethod)];
108 desc = [empty descriptionForClassMethod:@selector(proto3InstanceMethod)];
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));
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);
128 list = protocol_copyProtocolList(@protocol(Proto2), &count);
130 testassert(count == 0);
132 list = protocol_copyProtocolList(@protocol(Proto3), &count);
134 testassert(count == 1);
135 testassert(protocol_isEqual(list[0], @protocol(Proto2)));
136 testassert(!list[1]);
140 cls = objc_getClass("Super");
142 list = class_copyProtocolList(cls, &count);
144 testassert(list[count] == NULL);
145 testassert(count == 1);
146 testassert(0 == strcmp(protocol_getName(list[0]), "Proto1"));
150 cls = objc_getClass("SuperNoProtocols");
152 list = class_copyProtocolList(cls, &count);
154 testassert(count == 0);
157 cls = objc_getClass("SubNoProtocols");
159 list = class_copyProtocolList(cls, &count);
161 testassert(count == 0);
164 cls = objc_getClass("SuperNoProtocols");
166 list = class_copyProtocolList(cls, NULL);
169 cls = objc_getClass("Super");
171 list = class_copyProtocolList(cls, NULL);
176 list = class_copyProtocolList(NULL, &count);
178 testassert(count == 0);
181 // Check property added by protocol
182 cls = objc_getClass("SubProp");
186 list = class_copyProtocolList(cls, &count);
188 testassert(count == 1);
189 testassert(0 == strcmp(protocol_getName(list[0]), "Proto4"));
190 testassert(list[1] == NULL);
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);