]> git.saurik.com Git - apple/objc4.git/blob - test/runtime.m
objc4-437.3.tar.gz
[apple/objc4.git] / test / runtime.m
1 #include "test.h"
2
3 #include <string.h>
4 #include <dlfcn.h>
5 #include <mach-o/ldsyms.h>
6 #include <objc/objc-runtime.h>
7
8 @interface Super { id isa; } @end
9 @implementation Super
10 +(void)initialize { }
11 +class { return self; }
12 @end
13
14 @interface Sub : Super { } @end
15 @implementation Sub @end
16
17
18 int main()
19 {
20 Class list[100];
21 unsigned int count, count0;
22 unsigned int i;
23 int foundSuper;
24 int foundSub;
25 const char **names;
26 Dl_info info;
27
28 [Super class];
29
30 // This shouldn't touch any classes.
31 dladdr(&_mh_execute_header, &info);
32 names = objc_copyClassNamesForImage(info.dli_fname, &count);
33 testassert(names);
34 testassert(count == 2);
35 testassert(names[count] == NULL);
36 foundSuper = 0;
37 foundSub = 0;
38 for (i = 0; i < count; i++) {
39 if (0 == strcmp(names[i], "Super")) foundSuper++;
40 if (0 == strcmp(names[i], "Sub")) foundSub++;
41 }
42 testassert(foundSuper == 1);
43 testassert(foundSub == 1);
44
45
46 // class Sub hasn't been touched - make sure it's in the class list too
47 count0 = objc_getClassList(NULL, 0);
48 testassert(count0 >= 2 && count0 < 100);
49
50 list[count0-1] = NULL;
51 count = objc_getClassList(list, count0-1);
52 testassert(list[count0-1] == NULL);
53 testassert(count == count0);
54
55 count = objc_getClassList(list, count0);
56 testassert(count == count0);
57 foundSuper = 0;
58 foundSub = 0;
59 for (i = 0; i < count; i++) {
60 if (0 == strcmp(class_getName(list[i]), "Super")) foundSuper++;
61 if (0 == strcmp(class_getName(list[i]), "Sub")) foundSub++;
62 // list should be non-meta classes only
63 testassert(!class_isMetaClass(list[i]));
64 }
65 testassert(foundSuper == 1);
66 testassert(foundSub == 1);
67
68 // fixme check class handler
69 testassert(objc_getClass("Super") == [Super class]);
70 testassert(objc_getClass("DoesNotExist") == nil);
71 testassert(objc_getClass(NULL) == nil);
72
73 testassert(objc_getMetaClass("Super") == [Super class]->isa);
74 testassert(objc_getMetaClass("DoesNotExist") == nil);
75 testassert(objc_getMetaClass(NULL) == nil);
76
77 // fixme check class no handler
78 testassert(objc_lookUpClass("Super") == [Super class]);
79 testassert(objc_lookUpClass("DoesNotExist") == nil);
80 testassert(objc_lookUpClass(NULL) == nil);
81
82 succeed(__FILE__);
83 }