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