]> git.saurik.com Git - apple/objc4.git/blob - test/runtime.m
objc4-680.tar.gz
[apple/objc4.git] / test / runtime.m
1 /*
2 TEST_RUN_OUTPUT
3 objc\[\d+\]: class `SwiftV1Class\' not linked into application
4 objc\[\d+\]: class `DoesNotExist\' not linked into application
5 OK: runtime.m
6 OR
7 confused by Foundation
8 OK: runtime.m
9 END
10 */
11
12
13 #include "test.h"
14 #include "testroot.i"
15 #include <string.h>
16 #include <dlfcn.h>
17 #include <mach-o/ldsyms.h>
18 #include <objc/objc-runtime.h>
19
20 #if __has_feature(objc_arc)
21
22 int main()
23 {
24 testwarn("rdar://11368528 confused by Foundation");
25 fprintf(stderr, "confused by Foundation\n");
26 succeed(__FILE__);
27 }
28
29 #else
30
31 @interface Sub : TestRoot @end
32 @implementation Sub @end
33
34 #if __OBJC2__
35 # define TEST_SWIFT 1
36 #else
37 # define TEST_SWIFT 0
38 #endif
39
40 #define SwiftV1MangledName "_TtC6Module12SwiftV1Class"
41 #define SwiftV1MangledName2 "_TtC2Sw13SwiftV1Class2"
42 #define SwiftV1MangledName3 "_TtCSs13SwiftV1Class3"
43 #define SwiftV1MangledName4 "_TtC6Swiftt13SwiftV1Class4"
44
45 #if TEST_SWIFT
46 __attribute__((objc_runtime_name(SwiftV1MangledName)))
47 @interface SwiftV1Class : TestRoot @end
48 @implementation SwiftV1Class @end
49
50 __attribute__((objc_runtime_name(SwiftV1MangledName2)))
51 @interface SwiftV1Class2 : TestRoot @end
52 @implementation SwiftV1Class2 @end
53
54 __attribute__((objc_runtime_name(SwiftV1MangledName3)))
55 @interface SwiftV1Class3 : TestRoot @end
56 @implementation SwiftV1Class3 @end
57
58 __attribute__((objc_runtime_name(SwiftV1MangledName4)))
59 @interface SwiftV1Class4 : TestRoot @end
60 @implementation SwiftV1Class4 @end
61 #endif
62
63
64 int main()
65 {
66 Class list[100];
67 Class *list2;
68 unsigned int count, count0, count2;
69 unsigned int i;
70 int foundTestRoot;
71 int foundSub;
72 int foundSwiftV1;
73 int foundSwiftV1class2;
74 int foundSwiftV1class3;
75 int foundSwiftV1class4;
76 const char **names;
77 Dl_info info;
78
79 [TestRoot class];
80
81 // This shouldn't touch any classes.
82 dladdr(&_mh_execute_header, &info);
83 names = objc_copyClassNamesForImage(info.dli_fname, &count);
84 testassert(names);
85 #if TEST_SWIFT
86 testassert(count == 6);
87 #else
88 testassert(count == 2);
89 #endif
90 testassert(names[count] == NULL);
91 foundTestRoot = 0;
92 foundSub = 0;
93 foundSwiftV1 = 0;
94 foundSwiftV1class2 = 0;
95 foundSwiftV1class3 = 0;
96 foundSwiftV1class4 = 0;
97 for (i = 0; i < count; i++) {
98 if (0 == strcmp(names[i], "TestRoot")) foundTestRoot++;
99 if (0 == strcmp(names[i], "Sub")) foundSub++;
100 if (0 == strcmp(names[i], "Module.SwiftV1Class")) foundSwiftV1++;
101 if (0 == strcmp(names[i], "Sw.SwiftV1Class2")) foundSwiftV1class2++;
102 if (0 == strcmp(names[i], "Swift.SwiftV1Class3")) foundSwiftV1class3++;
103 if (0 == strcmp(names[i], "Swiftt.SwiftV1Class4")) foundSwiftV1class4++;
104 }
105 testassert(foundTestRoot == 1);
106 testassert(foundSub == 1);
107 #if TEST_SWIFT
108 testassert(foundSwiftV1 == 1);
109 testassert(foundSwiftV1class2 == 1);
110 testassert(foundSwiftV1class3 == 1);
111 testassert(foundSwiftV1class4 == 1);
112 #endif
113
114
115 // class Sub hasn't been touched - make sure it's in the class list too
116 count0 = objc_getClassList(NULL, 0);
117 testassert(count0 >= 2 && count0 < 100);
118
119 list[count0-1] = NULL;
120 count = objc_getClassList(list, count0-1);
121 testassert(list[count0-1] == NULL);
122 testassert(count == count0);
123
124 count = objc_getClassList(list, count0);
125 testassert(count == count0);
126
127 for (i = 0; i < count; i++) {
128 testprintf("%s\n", class_getName(list[i]));
129 }
130
131 foundTestRoot = 0;
132 foundSub = 0;
133 foundSwiftV1 = 0;
134 foundSwiftV1class2 = 0;
135 foundSwiftV1class3 = 0;
136 foundSwiftV1class4 = 0;
137 for (i = 0; i < count; i++) {
138 if (0 == strcmp(class_getName(list[i]), "TestRoot")) foundTestRoot++;
139 if (0 == strcmp(class_getName(list[i]), "Sub")) foundSub++;
140 if (0 == strcmp(class_getName(list[i]), "Module.SwiftV1Class")) foundSwiftV1++;
141 if (0 == strcmp(class_getName(list[i]), "Sw.SwiftV1Class2")) foundSwiftV1class2++;
142 if (0 == strcmp(class_getName(list[i]), "Swift.SwiftV1Class3")) foundSwiftV1class3++;
143 if (0 == strcmp(class_getName(list[i]), "Swiftt.SwiftV1Class4")) foundSwiftV1class4++;
144 // list should be non-meta classes only
145 testassert(!class_isMetaClass(list[i]));
146 }
147 testassert(foundTestRoot == 1);
148 testassert(foundSub == 1);
149 #if TEST_SWIFT
150 testassert(foundSwiftV1 == 1);
151 testassert(foundSwiftV1class2 == 1);
152 testassert(foundSwiftV1class3 == 1);
153 testassert(foundSwiftV1class4 == 1);
154 #endif
155
156 // fixme check class handler
157 testassert(objc_getClass("TestRoot") == [TestRoot class]);
158 #if TEST_SWIFT
159 testassert(objc_getClass("Module.SwiftV1Class") == [SwiftV1Class class]);
160 testassert(objc_getClass(SwiftV1MangledName) == [SwiftV1Class class]);
161 testassert(objc_getClass("Sw.SwiftV1Class2") == [SwiftV1Class2 class]);
162 testassert(objc_getClass(SwiftV1MangledName2) == [SwiftV1Class2 class]);
163 testassert(objc_getClass("Swift.SwiftV1Class3") == [SwiftV1Class3 class]);
164 testassert(objc_getClass(SwiftV1MangledName3) == [SwiftV1Class3 class]);
165 testassert(objc_getClass("Swiftt.SwiftV1Class4") == [SwiftV1Class4 class]);
166 testassert(objc_getClass(SwiftV1MangledName4) == [SwiftV1Class4 class]);
167 #endif
168 testassert(objc_getClass("SwiftV1Class") == nil);
169 testassert(objc_getClass("DoesNotExist") == nil);
170 testassert(objc_getClass(NULL) == nil);
171
172 testassert(objc_getMetaClass("TestRoot") == object_getClass([TestRoot class]));
173 #if TEST_SWIFT
174 testassert(objc_getMetaClass("Module.SwiftV1Class") == object_getClass([SwiftV1Class class]));
175 testassert(objc_getMetaClass(SwiftV1MangledName) == object_getClass([SwiftV1Class class]));
176 #endif
177 testassert(objc_getMetaClass("SwiftV1Class") == nil);
178 testassert(objc_getMetaClass("DoesNotExist") == nil);
179 testassert(objc_getMetaClass(NULL) == nil);
180
181 // fixme check class no handler
182 testassert(objc_lookUpClass("TestRoot") == [TestRoot class]);
183 #if TEST_SWIFT
184 testassert(objc_lookUpClass("Module.SwiftV1Class") == [SwiftV1Class class]);
185 testassert(objc_lookUpClass(SwiftV1MangledName) == [SwiftV1Class class]);
186 #endif
187 testassert(objc_lookUpClass("SwiftV1Class") == nil);
188 testassert(objc_lookUpClass("DoesNotExist") == nil);
189 testassert(objc_lookUpClass(NULL) == nil);
190
191 testassert(! object_isClass(nil));
192 testassert(! object_isClass([TestRoot new]));
193 testassert(object_isClass([TestRoot class]));
194 testassert(object_isClass(object_getClass([TestRoot class])));
195 testassert(object_isClass([Sub class]));
196 testassert(object_isClass(object_getClass([Sub class])));
197 #if TEST_SWIFT
198 testassert(object_isClass([SwiftV1Class class]));
199 testassert(object_isClass(object_getClass([SwiftV1Class class])));
200 #endif
201
202 list2 = objc_copyClassList(&count2);
203 testassert(count2 == count);
204 testassert(list2);
205 testassert(malloc_size(list2) >= (1+count2) * sizeof(Class));
206 for (i = 0; i < count; i++) {
207 testassert(list[i] == list2[i]);
208 }
209 testassert(list2[count] == NULL);
210 free(list2);
211 free(objc_copyClassList(NULL));
212
213 succeed(__FILE__);
214 }
215
216 #endif