1from PyObjCTools.TestSupport import *
2import gc
3
4from objc import *
5from Foundation import *
6
7class PythonClass (object):
8    def __init__(self):
9        self.fireCount = 0
10
11    def fire_(self, timer):
12        self.fireCount += 1
13
14
15class TestNSTimer(TestCase):
16
17    def _testHelp(self):
18        obj = PythonClass()
19        pool = NSAutoreleasePool.alloc().init()
20        self.assertArgIsBOOL(NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_, 4)
21        timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(
22                0.1, obj, 'fire:', None, False)
23        NSRunLoop.currentRunLoop().addTimer_forMode_(
24                timer, NSDefaultRunLoopMode)
25        NSRunLoop.currentRunLoop().runUntilDate_(
26                NSDate.dateWithTimeIntervalSinceNow_(0.5))
27        timer.invalidate()
28        self.assertEqual(obj.fireCount, 1)
29
30        del timer
31        del pool
32
33    def testPythonLeakage(self):
34
35        # Ignore first run, this has some side-effects that would
36        # taint the result.
37        self._testHelp()
38
39        # Now run the test again in a loop to detect leakage
40        gc.collect()
41        before = len(gc.get_objects())
42
43        for i in range(10):
44            self._testHelp()
45
46        gc.collect()
47        after = len(gc.get_objects())
48
49        for i in range(10):
50            self._testHelp()
51
52        gc.collect()
53        after2 = len(gc.get_objects())
54
55        self.assertEqual(after, before, "%d - %d - %d"%(before, after, after2))
56
57    def testMethods(self):
58        self.assertArgIsBOOL(NSTimer.timerWithTimeInterval_invocation_repeats_, 2)
59        self.assertArgIsBOOL(NSTimer.scheduledTimerWithTimeInterval_invocation_repeats_, 2)
60        self.assertArgIsBOOL(NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_, 4)
61        self.assertArgIsSEL(NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_, 2, b'v@:@')
62        self.assertArgIsBOOL(NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_, 4)
63        self.assertArgIsSEL(NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_, 2, b'v@:@')
64
65        self.assertArgIsBOOL(NSTimer.initWithFireDate_interval_target_selector_userInfo_repeats_, 5)
66        self.assertArgIsSEL(NSTimer.initWithFireDate_interval_target_selector_userInfo_repeats_, 3, b'v@:@')
67
68        self.assertResultIsBOOL(NSTimer.isValid)
69
70if __name__ == '__main__':
71    main( )
72