blob: 04af9fb143d0312ea17cf7705915ef03a45b3822 [file] [log] [blame]
Tim Petersc7b6bed2002-07-17 00:34:26 +00001import sys
Skip Montanaro599bd5e2004-11-04 04:31:30 +00002import unittest
Guido van Rossum34d19282007-08-09 01:03:29 +00003import io
Fred Drakec19425d2000-06-28 15:07:31 +00004import atexit
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import 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):
Guido van Rossum34d19282007-08-09 01:03:29 +000028 self.stream = io.StringIO()
Collin Winter670e6922007-03-21 02:57:17 +000029 sys.stdout = sys.stderr = self.stream
30 atexit._clear()
Guido van Rossumd8faa362007-04-27 19:54:29 +000031
Collin Winter670e6922007-03-21 02:57:17 +000032 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
Benjamin Petersonb8401c72008-09-23 03:14:49 +000047 def test_badargs(self):
48 atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
49 self.assertRaises(TypeError, atexit._run_exitfuncs)
50
Skip Montanaro599bd5e2004-11-04 04:31:30 +000051 def test_order(self):
52 # be sure handlers are executed in reverse order
Collin Winter670e6922007-03-21 02:57:17 +000053 atexit.register(h1)
54 atexit.register(h2)
55 atexit.register(h3)
56 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000057
Collin Winter670e6922007-03-21 02:57:17 +000058 self.assertEqual(self.stream.getvalue(), "h3\nh2\nh1\n")
Fred Drakec19425d2000-06-28 15:07:31 +000059
Skip Montanaro599bd5e2004-11-04 04:31:30 +000060 def test_raise(self):
61 # be sure raises are handled properly
Collin Winter670e6922007-03-21 02:57:17 +000062 atexit.register(raise1)
63 atexit.register(raise2)
Guido van Rossumd8faa362007-04-27 19:54:29 +000064
Collin Winter670e6922007-03-21 02:57:17 +000065 self.assertRaises(TypeError, atexit._run_exitfuncs)
Guido van Rossumd8faa362007-04-27 19:54:29 +000066
Collin Winter670e6922007-03-21 02:57:17 +000067 def test_stress(self):
68 a = [0]
69 def inc():
70 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +000071
Collin Winter670e6922007-03-21 02:57:17 +000072 for i in range(128):
73 atexit.register(inc)
74 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000075
Collin Winter670e6922007-03-21 02:57:17 +000076 self.assertEqual(a[0], 128)
Guido van Rossumd8faa362007-04-27 19:54:29 +000077
Collin Winter670e6922007-03-21 02:57:17 +000078 def test_clear(self):
79 a = [0]
80 def inc():
81 a[0] += 1
Guido van Rossumd8faa362007-04-27 19:54:29 +000082
Collin Winter670e6922007-03-21 02:57:17 +000083 atexit.register(inc)
84 atexit._clear()
85 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +000086
Collin Winter670e6922007-03-21 02:57:17 +000087 self.assertEqual(a[0], 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +000088
Collin Winter670e6922007-03-21 02:57:17 +000089 def test_unregister(self):
90 a = [0]
91 def inc():
92 a[0] += 1
93 def dec():
94 a[0] -= 1
Guido van Rossumd8faa362007-04-27 19:54:29 +000095
96 for i in range(4):
Collin Winter670e6922007-03-21 02:57:17 +000097 atexit.register(inc)
98 atexit.register(dec)
99 atexit.unregister(inc)
100 atexit._run_exitfuncs()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000101
Collin Winter670e6922007-03-21 02:57:17 +0000102 self.assertEqual(a[0], -1)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000103
Collin Winter670e6922007-03-21 02:57:17 +0000104 def test_bound_methods(self):
105 l = []
106 atexit.register(l.append, 5)
107 atexit._run_exitfuncs()
108 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000109
Collin Winter670e6922007-03-21 02:57:17 +0000110 atexit.unregister(l.append)
111 atexit._run_exitfuncs()
112 self.assertEqual(l, [5])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000113
Tim Peters012b69c2002-07-16 19:30:59 +0000114
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000115def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000116 support.run_unittest(TestCase)
Tim Peters012b69c2002-07-16 19:30:59 +0000117
Skip Montanaro599bd5e2004-11-04 04:31:30 +0000118if __name__ == "__main__":
119 test_main()