make file closing more robust
[python/dscho.git] / Lib / test / test_atexit.py
blob8a71036fde077f5c2b59c48db39bb108665cb17d
1 import sys
2 import unittest
3 import io
4 import atexit
5 from test import support
7 ### helpers
8 def h1():
9 print("h1")
11 def h2():
12 print("h2")
14 def h3():
15 print("h3")
17 def h4(*args, **kwargs):
18 print("h4", args, kwargs)
20 def raise1():
21 raise TypeError
23 def raise2():
24 raise SystemError
26 class TestCase(unittest.TestCase):
27 def setUp(self):
28 self.stream = io.StringIO()
29 self.save_stdout, self.save_stderr = sys.stderr, sys.stdout
30 sys.stdout = sys.stderr = self.stream
31 atexit._clear()
33 def tearDown(self):
34 sys.stdout = self.save_stdout
35 sys.stderr = self.save_stderr
36 atexit._clear()
38 def test_args(self):
39 # be sure args are handled properly
40 atexit.register(h1)
41 atexit.register(h4)
42 atexit.register(h4, 4, kw="abc")
43 atexit._run_exitfuncs()
45 self.assertEqual(self.stream.getvalue(),
46 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
48 def test_badargs(self):
49 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
50 self.assertRaises(TypeError, atexit._run_exitfuncs)
52 def test_order(self):
53 # be sure handlers are executed in reverse order
54 atexit.register(h1)
55 atexit.register(h2)
56 atexit.register(h3)
57 atexit._run_exitfuncs()
59 self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
61 def test_raise(self):
62 # be sure raises are handled properly
63 atexit.register(raise1)
64 atexit.register(raise2)
66 self.assertRaises(TypeError, atexit._run_exitfuncs)
68 def test_stress(self):
69 a = [0]
70 def inc():
71 a[0] += 1
73 for i in range(128):
74 atexit.register(inc)
75 atexit._run_exitfuncs()
77 self.assertEqual(a[0], 128)
79 def test_clear(self):
80 a = [0]
81 def inc():
82 a[0] += 1
84 atexit.register(inc)
85 atexit._clear()
86 atexit._run_exitfuncs()
88 self.assertEqual(a[0], 0)
90 def test_unregister(self):
91 a = [0]
92 def inc():
93 a[0] += 1
94 def dec():
95 a[0] -= 1
97 for i in range(4):
98 atexit.register(inc)
99 atexit.register(dec)
100 atexit.unregister(inc)
101 atexit._run_exitfuncs()
103 self.assertEqual(a[0], -1)
105 def test_bound_methods(self):
106 l = []
107 atexit.register(l.append, 5)
108 atexit._run_exitfuncs()
109 self.assertEqual(l, [5])
111 atexit.unregister(l.append)
112 atexit._run_exitfuncs()
113 self.assertEqual(l, [5])
116 def test_main():
117 support.run_unittest(TestCase)
119 if __name__ == "__main__":
120 test_main()