]> git.saurik.com Git - apple/objc4.git/blob - test/copyIvarList.m
objc4-532.2.tar.gz
[apple/objc4.git] / test / copyIvarList.m
1 // TEST_CONFIG
2
3 #include "test.h"
4 #include <string.h>
5 #include <malloc/malloc.h>
6 #include <objc/objc-runtime.h>
7
8 @interface SuperIvars {
9 id isa;
10 int ivar1;
11 int ivar2;
12 } @end
13 @implementation SuperIvars @end
14
15 @interface SubIvars : SuperIvars {
16 int ivar3;
17 int ivar4;
18 } @end
19 @implementation SubIvars @end
20
21
22 @interface FourIvars {
23 int ivar1;
24 int ivar2;
25 int ivar3;
26 int ivar4;
27 } @end
28 @implementation FourIvars @end
29
30 @interface NoIvars { } @end
31 @implementation NoIvars @end
32
33 static int isNamed(Ivar iv, const char *name)
34 {
35 return (0 == strcmp(name, ivar_getName(iv)));
36 }
37
38 int main()
39 {
40 Ivar *ivars;
41 unsigned int count;
42 Class cls;
43
44 cls = objc_getClass("SubIvars");
45 testassert(cls);
46
47 count = 100;
48 ivars = class_copyIvarList(cls, &count);
49 testassert(ivars);
50 testassert(count == 2);
51 testassert(isNamed(ivars[0], "ivar3"));
52 testassert(isNamed(ivars[1], "ivar4"));
53 // ivars[] should be null-terminated
54 testassert(ivars[2] == NULL);
55 free(ivars);
56
57 cls = objc_getClass("SuperIvars");
58 testassert(cls);
59
60 count = 100;
61 ivars = class_copyIvarList(cls, &count);
62 testassert(ivars);
63 testassert(count == 3);
64 testassert(isNamed(ivars[0], "isa"));
65 testassert(isNamed(ivars[1], "ivar1"));
66 testassert(isNamed(ivars[2], "ivar2"));
67 // ivars[] should be null-terminated
68 testassert(ivars[3] == NULL);
69 free(ivars);
70
71 // Check null-termination - this ivar list block would be 16 bytes
72 // if it weren't for the terminator
73 cls = objc_getClass("FourIvars");
74 testassert(cls);
75
76 count = 100;
77 ivars = class_copyIvarList(cls, &count);
78 testassert(ivars);
79 testassert(count == 4);
80 testassert(malloc_size(ivars) >= 5 * sizeof(Ivar));
81 testassert(ivars[3] != NULL);
82 testassert(ivars[4] == NULL);
83 free(ivars);
84
85 // Check NULL count parameter
86 ivars = class_copyIvarList(cls, NULL);
87 testassert(ivars);
88 testassert(ivars[4] == NULL);
89 testassert(ivars[3] != NULL);
90 free(ivars);
91
92 // Check NULL class parameter
93 count = 100;
94 ivars = class_copyIvarList(NULL, &count);
95 testassert(!ivars);
96 testassert(count == 0);
97
98 // Check NULL class and count
99 ivars = class_copyIvarList(NULL, NULL);
100 testassert(!ivars);
101
102 // Check class with no ivars
103 cls = objc_getClass("NoIvars");
104 testassert(cls);
105
106 count = 100;
107 ivars = class_copyIvarList(cls, &count);
108 testassert(!ivars);
109 testassert(count == 0);
110
111 succeed(__FILE__);
112 return 0;
113 }