blob: 56077e76b9ed23a0c6244777316ba49dce4d6e83 [file] [log] [blame]
Tim Petersc7b6bed2002-07-17 00:34:26 +00001import sys
Skip Montanaro599bd5e2004-11-04 04:31:30 +00002import unittest
3import StringIO
Fred Drakec19425d2000-06-28 15:07:31 +00004import atexit
Skip Montanaro599bd5e2004-11-04 04:31:30 +00005from test import test_support
Fred Drakec19425d2000-06-28 15:07:31 +00006
Collin Winter670e6922007-03-21 02:57:17 +00007### helpers
8def h1():
9 print("h1")
10
11def h2():
12 print("h2")
13
14def h3():
15 print("h3")
16
17def h4(*args, **kwargs):
18 print("h4", args, kwargs)
19
20def raise1():
21 raise TypeError
22
23def raise2():
24 raise SystemError
25
Skip Montanaro599bd5e2004-11-04 04:31:30 +000026class TestCase(unittest.TestCase):
Collin Winter670e6922007-03-21 02:57:17 +000027 def setUp(self):
28 self.stream = StringIO.StringIO()
29 sys.stdout = sys.stderr = self.stream
30 atexit._clear()
31
32 def tearDown(self):
33 sys.stdout = sys.__stdout__
34 sys.stderr = sys.__stderr__
35 atexit._clear()
36
Skip Montanaro599bd5e2004-11-04 04:31:30 +000037 def test_args(self):
38 # be sure args are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000039 atexit.register(h1)
40 atexit.register(h4)
41 atexit.register(h4, 4, kw="abc")
42 atexit._run_exitfuncs()
43
44 self.assertEqual(self.stream.getvalue(),
45 "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000046
Skip Montanaro599bd5e2004-11-04 04:31:30 +000047 def test_order(self):
48 # be sure handlers are executed in reverse order
Collin Winter670e6922007-03-21 02:57:17 +000049 atexit.register(h1)
50 atexit.register(h2)
51 atexit.register(h3)
52 atexit._run_exitfuncs()
53
54 self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000055
Skip Montanaro599bd5e2004-11-04 04:31:30 +000056 def test_raise(self):
57 # be sure raises are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000058 atexit.register(raise1)
59 atexit.register(raise2)
60
61 self.assertRaises(TypeError, atexit._run_exitfuncs)
62
63 def test_stress(self):
64 a = [0]
65 def inc():
66 a[0] += 1
67
68 for i in range(128):
69 atexit.register(inc)
70 atexit._run_exitfuncs()
71
72 self.assertEqual(a[0], 128)
73
74 def test_clear(self):
75 a = [0]
76 def inc():
77 a[0] += 1
78
79 atexit.register(inc)
80 atexit._clear()
81 atexit._run_exitfuncs()
82
83 self.assertEqual(a[0], 0)
84
85 def test_unregister(self):
86 a = [0]
87 def inc():
88 a[0] += 1
89 def dec():
90 a[0] -= 1
91
92 for i in range(4):
93 atexit.register(inc)
94 atexit.register(dec)
95 atexit.unregister(inc)
96 atexit._run_exitfuncs()
97
98 self.assertEqual(a[0], -1)
99
100 def test_bound_methods(self):
101 l = []
102 atexit.register(l.append, 5)
103 atexit._run_exitfuncs()
104 self.assertEqual(l, [5])
105
106 atexit.unregister(l.append)
107 atexit._run_exitfuncs()
108 self.assertEqual(l, [5])
109
Tim Peters012b69c2002-07-16 19:30:59 +0000110
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000111def test_main():
112 test_support.run_unittest(TestCase)
Tim Peters012b69c2002-07-16 19:30:59 +0000113
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000114if __name__ == "__main__":
115 test_main()