]> git.saurik.com Git - apple/objc4.git/blob - test/arr-weak.m
objc4-532.2.tar.gz
[apple/objc4.git] / test / arr-weak.m
1 // TEST_CONFIG MEM=mrc
2 // TEST_CRASHES
3 /*
4 TEST_RUN_OUTPUT
5 objc\[\d+\]: cannot form weak reference to instance \(0x[0-9a-f]+\) of class Crash
6 CRASHED: SIG(ILL|TRAP)
7 END
8 */
9
10 #include "test.h"
11
12 #include <Foundation/NSObject.h>
13
14 static id weak;
15 static id weak2;
16 static bool did_dealloc;
17
18 @interface Test : NSObject @end
19 @implementation Test
20 -(void)dealloc {
21 testassert(weak == self);
22 testassert(weak2 == self);
23
24 testprintf("Weak references clear during super dealloc\n");
25 testassert(weak2 != NULL);
26 [super dealloc];
27 testassert(weak2 == NULL);
28
29 did_dealloc = true;
30 }
31 @end
32
33 @interface Crash : NSObject @end
34 @implementation Crash
35 -(void)dealloc {
36 testassert(weak == self);
37 testassert(weak2 == self);
38
39 testprintf("Weak store crashes while deallocating\n");
40 objc_storeWeak(&weak, self);
41 fail("objc_storeWeak of deallocating value should have crashed");
42 [super dealloc];
43 }
44 @end
45
46 int main()
47 {
48 Test *obj = [Test new];
49 Test *obj2 = [Test new];
50 id result;
51
52 testprintf("Weak assignment\n");
53 result = objc_storeWeak(&weak, obj);
54 testassert(result == obj);
55 testassert(weak == obj);
56
57 testprintf("Weak assignment to the same value\n");
58 result = objc_storeWeak(&weak, obj);
59 testassert(result == obj);
60 testassert(weak == obj);
61
62 testprintf("Weak assignment to different value\n");
63 result = objc_storeWeak(&weak, obj2);
64 testassert(result == obj2);
65 testassert(weak == obj2);
66
67 testprintf("Weak assignment to NULL\n");
68 result = objc_storeWeak(&weak, NULL);
69 testassert(result == NULL);
70 testassert(weak == NULL);
71
72 testprintf("Weak clear\n");
73
74 result = objc_storeWeak(&weak, obj);
75 testassert(result == obj);
76 testassert(weak == obj);
77
78 result = objc_storeWeak(&weak2, obj);
79 testassert(result == obj);
80 testassert(weak2 == obj);
81
82 did_dealloc = false;
83 [obj release];
84 testassert(did_dealloc);
85 testassert(weak == NULL);
86 testassert(weak2 == NULL);
87
88 Crash *obj3 = [Crash new];
89 result = objc_storeWeak(&weak, obj3);
90 testassert(result == obj3);
91 testassert(weak == obj3);
92
93 result = objc_storeWeak(&weak2, obj3);
94 testassert(result == obj3);
95 testassert(weak2 == obj3);
96
97 [obj3 release];
98 fail("should have crashed in -[Crash dealloc]");
99 }