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