move sections
[python/dscho.git] / Lib / test / test_atexit.py
blobbf85b75253617426f043d3ffef8e23b8d487d322
1 import sys
2 import unittest
3 import StringIO
4 import atexit
5 from imp import reload
6 from test import test_support
8 class TestCase(unittest.TestCase):
9 def setUp(self):
10 s = StringIO.StringIO()
11 self.save_stdout = sys.stdout
12 self.save_stderr = sys.stderr
13 sys.stdout = sys.stderr = self.subst_io = s
14 self.save_handlers = atexit._exithandlers
15 atexit._exithandlers = []
17 def tearDown(self):
18 sys.stdout = self.save_stdout
19 sys.stderr = self.save_stderr
20 atexit._exithandlers = self.save_handlers
22 def test_args(self):
23 atexit.register(self.h1)
24 atexit.register(self.h4)
25 atexit.register(self.h4, 4, kw="abc")
26 atexit._run_exitfuncs()
27 self.assertEqual(self.subst_io.getvalue(),
28 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
30 def test_badargs(self):
31 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
32 self.assertRaises(TypeError, atexit._run_exitfuncs)
34 def test_order(self):
35 atexit.register(self.h1)
36 atexit.register(self.h2)
37 atexit.register(self.h3)
38 atexit._run_exitfuncs()
39 self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n")
41 def test_sys_override(self):
42 # be sure a preset sys.exitfunc is handled properly
43 exfunc = sys.exitfunc
44 sys.exitfunc = self.h1
45 reload(atexit)
46 try:
47 atexit.register(self.h2)
48 atexit._run_exitfuncs()
49 finally:
50 sys.exitfunc = exfunc
51 self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n")
53 def test_raise(self):
54 atexit.register(self.raise1)
55 atexit.register(self.raise2)
56 self.assertRaises(TypeError, atexit._run_exitfuncs)
58 ### helpers
59 def h1(self):
60 print "h1"
62 def h2(self):
63 print "h2"
65 def h3(self):
66 print "h3"
68 def h4(self, *args, **kwargs):
69 print "h4", args, kwargs
71 def raise1(self):
72 raise TypeError
74 def raise2(self):
75 raise SystemError
77 def test_main():
78 test_support.run_unittest(TestCase)
81 if __name__ == "__main__":
82 test_main()