]> git.saurik.com Git - apple/objc4.git/blob - test/taggedNSPointers.m
c7216f290e4365c7d334b92adbd6417729ceaaf6
[apple/objc4.git] / test / taggedNSPointers.m
1 // TEST_CFLAGS -framework Foundation
2
3 #include "test.h"
4 #include <objc/runtime.h>
5 #import <Foundation/Foundation.h>
6
7 #if __OBJC2__ && __LP64__
8
9 void testTaggedNumber()
10 {
11 NSNumber *taggedNS = [NSNumber numberWithInt: 1234];
12 CFNumberRef taggedCF = (CFNumberRef)objc_unretainedPointer(taggedNS);
13 uintptr_t taggedAddress = (uintptr_t)taggedCF;
14 int result;
15
16 testassert( CFGetTypeID(taggedCF) == CFNumberGetTypeID() );
17
18 CFNumberGetValue(taggedCF, kCFNumberIntType, &result);
19 testassert(result == 1234);
20
21 testassert(taggedAddress & 0x1); // make sure it is really tagged
22
23 // do some generic object-y things to the taggedPointer instance
24 CFRetain(taggedCF);
25 CFRelease(taggedCF);
26
27 NSMutableDictionary *dict = [NSMutableDictionary dictionary];
28 [dict setObject: taggedNS forKey: @"fred"];
29 testassert(taggedNS == [dict objectForKey: @"fred"]);
30 [dict setObject: @"bob" forKey: taggedNS];
31 testassert([@"bob" isEqualToString: [dict objectForKey: taggedNS]]);
32
33 NSNumber *i12345 = [NSNumber numberWithInt: 12345];
34 NSNumber *i12346 = [NSNumber numberWithInt: 12346];
35 NSNumber *i12347 = [NSNumber numberWithInt: 12347];
36
37 NSArray *anArray = [NSArray arrayWithObjects: i12345, i12346, i12347, nil];
38 testassert([anArray count] == 3);
39 testassert([anArray indexOfObject: i12346] == 1);
40
41 NSSet *aSet = [NSSet setWithObjects: i12345, i12346, i12347, nil];
42 testassert([aSet count] == 3);
43 testassert([aSet containsObject: i12346]);
44
45 [taggedNS performSelector: @selector(intValue)];
46 testassert(![taggedNS isProxy]);
47 testassert([taggedNS isKindOfClass: [NSNumber class]]);
48 testassert([taggedNS respondsToSelector: @selector(intValue)]);
49
50 [taggedNS description];
51 }
52
53 int main()
54 {
55 PUSH_POOL {
56 testTaggedNumber(); // should be tested by CF... our tests are wrong, wrong, wrong.
57 } POP_POOL;
58
59 succeed(__FILE__);
60 }
61
62 // OBJC2 && __LP64__
63 #else
64 // not (OBJC2 && __LP64__)
65
66 // Tagged pointers not supported. Crash if an NSNumber actually
67 // is a tagged pointer (which means this test is out of date).
68
69 int main()
70 {
71 PUSH_POOL {
72 testassert(*(void **)objc_unretainedPointer([NSNumber numberWithInt:1234]));
73 } POP_POOL;
74
75 succeed(__FILE__);
76 }
77
78 #endif