1from Foundation import *
2from PyObjCTools.TestSupport import *
3import Foundation
4
5class TestHelper (NSObject):
6    def incFoo_(self, foo):
7        foo[0] += 1
8
9class TestNSUndoManager(TestCase):
10    def testUndoManager(self):
11        x = TestHelper.new()
12        m = NSUndoManager.new()
13        l = [ 0 ]
14
15        m.prepareWithInvocationTarget_(x).incFoo_(l)
16        m.undo()
17
18        self.assertEquals(l[0], 1)
19
20    def __del__(self, objc=objc):
21        objc.recycleAutoreleasePool()
22
23## Undo Integer test
24## From David Eppstein
25# test ability of int argument to pass through undo and then
26# be used as parameter to another routine expecting an int
27#
28# the actual routine I want to use is
29# NSTableView.editColumn_row_withEvent_select_
30# but that involves setting up a UI; instead use NSIndexSpecifier
31
32if hasattr(Foundation, 'NSIndexSpecifier'):
33    class TestUndoInt(TestCase):
34        class UndoInt(NSObject):
35            undo = NSUndoManager.alloc().init()
36            idx = NSIndexSpecifier.alloc().init()
37            idx.setIndex_(0)
38
39            def test_(self,i):
40                self.undo.prepareWithInvocationTarget_(self).test_(self.idx.index())
41                self.idx.setIndex_(i)
42
43        def testUndoInt(self):
44            # test that undo works
45            x = TestUndoInt.UndoInt.alloc().init()
46            x.test_(3)
47            assert(x.idx.index() == 3)
48            x.undo.undo()
49            assert(x.idx.index() == 0)
50## end Undo Integer test
51
52
53class TestSubclassingUndo(TestCase):
54    # Bugreport: 678759 Subclassing NSUndoManager fails
55
56    def testSubclass(self):
57        class UndoSubclass (NSUndoManager):
58            pass
59
60        x = TestHelper.new()
61        m = UndoSubclass.new()
62        l = [ 0 ]
63
64        m.prepareWithInvocationTarget_(x).incFoo_(l)
65        m.undo()
66
67        self.assertEquals(l[0], 1)
68
69    def testConstants(self):
70        self.failUnless(isinstance(NSUndoManagerCheckpointNotification, unicode))
71        self.failUnless(isinstance(NSUndoManagerWillUndoChangeNotification, unicode))
72        self.failUnless(isinstance(NSUndoManagerWillRedoChangeNotification, unicode))
73
74        self.failUnless(isinstance(NSUndoManagerDidUndoChangeNotification, unicode))
75        self.failUnless(isinstance(NSUndoManagerDidRedoChangeNotification, unicode))
76
77        self.failUnless(isinstance(NSUndoManagerDidOpenUndoGroupNotification, unicode))
78        self.failUnless(isinstance(NSUndoManagerWillCloseUndoGroupNotification, unicode))
79
80        self.failUnlessEqual(NSUndoCloseGroupingRunLoopOrdering, 350000)
81
82    def testMethods(self):
83        self.failUnlessResultIsBOOL(NSUndoManager.isUndoRegistrationEnabled)
84        self.failUnlessResultIsBOOL(NSUndoManager.groupsByEvent)
85        self.failUnlessArgIsBOOL(NSUndoManager.setGroupsByEvent_, 0)
86        self.failUnlessResultIsBOOL(NSUndoManager.canUndo)
87        self.failUnlessResultIsBOOL(NSUndoManager.canRedo)
88        self.failUnlessResultIsBOOL(NSUndoManager.isUndoing)
89        self.failUnlessResultIsBOOL(NSUndoManager.isRedoing)
90        self.failUnlessArgIsSEL(NSUndoManager.registerUndoWithTarget_selector_object_, 1, 'v@:@')
91
92if __name__ == '__main__':
93    main( )
94