1from PyObjCTools.TestSupport import *
2
3from Foundation import *
4
5try:
6    long
7except NameError:
8    long = int
9
10
11class TestNSObjectHelper (NSObject):
12    def copyWithZone_(self, zn): return None
13    def mutableCopyWithZone_(self, zn): return None
14    def isContentDiscarded(self): return 1
15    def beginContentAccess(self): return 1
16
17    def retainWeakReference(self): return 0
18    def allowsWeakReference(self): return 0
19
20
21class TestNSObjectFunctions (TestCase):
22    def testAllocation(self):
23        o = NSAllocateObject(NSObject, 0, None)
24        self.assertIsInstance(o, NSObject)
25        o = NSAllocateObject(NSObject, 50, None)
26        self.assertIsInstance(o, NSObject)
27        NSDeallocateObject(None)
28
29    def testCopy(self):
30        o = NSObject.alloc().init()
31        self.assertIsInstance(o, NSObject)
32        o2 = NSCopyObject(o, 50, None)
33        self.assertIsInstance(o2, NSObject)
34
35    def testShouldRetain(self):
36        o = NSObject.alloc().init()
37        self.assertIsInstance(o, NSObject)
38        v = NSShouldRetainWithZone(o, None)
39        self.assertTrue((v is True) or (v is False))
40
41    def testRefCounts(self):
42        o = NSObject.alloc().init()
43
44        cnt = NSExtraRefCount(o)
45        self.assertIsInstance(cnt, (int, long))
46        NSIncrementExtraRefCount(o)
47        v = NSExtraRefCount(o)
48        self.assertEqual(v, cnt+1)
49
50        v = NSDecrementExtraRefCountWasZero(o)
51        self.assertIs(v, False)
52        v = NSExtraRefCount(o)
53        self.assertEqual(v, cnt)
54
55
56
57class TestNSObjectInteraction(TestCase):
58    def testCallingInstanceMethodWithClassSelf(self):
59        self.assertRaises(TypeError, NSObject.description, NSObject)
60        self.assertRaises(TypeError, NSObject.description, "hello")
61
62    def testNSObjectClassMethod(self):
63        # Check that -class is accesible as 'class__' and 'class' (the latter
64        # only through getattr because it is a Python keyword)
65        self.assert_(hasattr(NSObject, 'class__'))
66        self.assert_(isinstance(NSObject.class__, objc.selector))
67        o = NSObject.alloc().init()
68        self.assert_(o.class__() is o.__class__)
69
70        self.assert_(hasattr(NSObject, 'class'))
71        self.assert_(isinstance(getattr(NSObject, 'class'), objc.selector))
72        self.assert_(getattr(o, 'class')() is o.__class__)
73
74    def testNSObjectClass(self):
75        self.assert_( NSObject.instancesRespondToSelector_( "description" ), "NSObject class claims it doesn't respond to a selector that it does." )
76        self.assert_( hasattr(NSObject, "description"), "NSObject class claims it doesn't respond to a selector that it does." )
77        # self.assert_( NSObject.description(), "NSObject class failed to respond to +description selector." )
78
79    def testNSObjectInstance(self):
80        instance = NSObject.new()
81
82        self.assert_( instance, "Failed to instantiate an instance" )
83        self.assert_( instance.description(), "NSObject instance didn't respond to -description selector." )
84        self.assert_( not instance.isProxy(), "Instance of NSObject claimed it was a proxy.   That seems odd." )
85        self.assert_( isinstance( instance, NSObject ), "Instantiated object not an instance of NSObject." )
86        self.assertEqual( instance, instance, "Python identity check failed." )
87        self.assert_( instance.isEqual_( instance ), "Obj-C identity check failed." )
88
89    def testRepeatedAllocInit(self):
90        for i in range(1,1000):
91            a = NSObject.alloc().init()
92
93    def testMethods(self):
94        self.assertResultIsBOOL(NSObject.isEqual_)
95        self.assertResultIsBOOL(NSObject.isProxy)
96        self.assertResultIsBOOL(NSObject.isKindOfClass_)
97        self.assertResultIsBOOL(NSObject.isMemberOfClass_)
98        self.assertResultIsBOOL(NSObject.conformsToProtocol_)
99        self.assertResultIsBOOL(NSObject.respondsToSelector_)
100        self.assertResultIsBOOL(NSObject.instancesRespondToSelector_)
101        self.assertResultIsBOOL(NSObject.isSubclassOfClass_)
102        self.assertResultIsBOOL(NSObject.resolveClassMethod_)
103        self.assertResultIsBOOL(NSObject.resolveInstanceMethod_)
104
105
106        o = NSObject.alloc().init()
107        self.assertResultIsBOOL(o.isEqual_)
108        self.assertResultIsBOOL(o.isProxy)
109        self.assertResultIsBOOL(o.isKindOfClass_)
110        self.assertResultIsBOOL(o.isMemberOfClass_)
111        self.assertResultIsBOOL(o.conformsToProtocol_)
112        self.assertResultIsBOOL(o.respondsToSelector_)
113
114
115        a = TestNSObjectHelper.alloc().init()
116        self.assertArgHasType(a.copyWithZone_, 0, b'^{_NSZone=}')
117        self.assertArgHasType(a.mutableCopyWithZone_, 0, b'^{_NSZone=}')
118
119    @min_os_level('10.6')
120    def testMethods10_6(self):
121        self.assertResultIsBOOL(TestNSObjectHelper.beginContentAccess)
122        self.assertResultIsBOOL(TestNSObjectHelper.isContentDiscarded)
123
124    @min_os_level('10.7')
125    def testMethods10_7(self):
126        self.assertResultIsBOOL(TestNSObjectHelper.allowsWeakReference)
127        self.assertResultIsBOOL(TestNSObjectHelper.retainWeakReference)
128
129if __name__ == '__main__':
130    main( )
131