text: import sys
  import unittest
  import StringIO
  import atexit
  from imp import reload
  from test import test_support
  
  class TestCase(unittest.TestCase):
      def setUp(self):
          s = StringIO.StringIO()
          self.save_stdout = sys.stdout
          self.save_stderr = sys.stderr
          sys.stdout = sys.stderr = self.subst_io = s
          self.save_handlers = atexit._exithandlers
          atexit._exithandlers = []
  
      def tearDown(self):
          sys.stdout = self.save_stdout
          sys.stderr = self.save_stderr
          atexit._exithandlers = self.save_handlers
  
      def test_args(self):
          atexit.register(self.h1)
          atexit.register(self.h4)
          atexit.register(self.h4, 4, kw="abc")
          atexit._run_exitfuncs()
          self.assertEqual(self.subst_io.getvalue(),
                           "h4 (4,) {'kw': 'abc'}\nh4 () {}\nh1\n")
  
      def test_badargs(self):
          atexit.register(lambda: 1, 0, 0, (x for x in (1,2)), 0, 0)
          self.assertRaises(TypeError, atexit._run_exitfuncs)
  
      def test_order(self):
          atexit.register(self.h1)
          atexit.register(self.h2)
          atexit.register(self.h3)
          atexit._run_exitfuncs()
          self.assertEqual(self.subst_io.getvalue(), "h3\nh2\nh1\n")
  
      def test_sys_override(self):
          # be sure a preset sys.exitfunc is handled properly
          exfunc = sys.exitfunc
          sys.exitfunc = self.h1
          reload(atexit)
          try:
              atexit.register(self.h2)
              atexit._run_exitfuncs()
          finally:
              sys.exitfunc = exfunc
          self.assertEqual(self.subst_io.getvalue(), "h2\nh1\n")
  
      def test_raise(self):
          atexit.register(self.raise1)
          atexit.register(self.raise2)
          self.assertRaises(TypeError, atexit._run_exitfuncs)
  
      ### helpers
      def h1(self):
          print "h1"
  
      def h2(self):
          print "h2"
  
      def h3(self):
          print "h3"
  
      def h4(self, *args, **kwargs):
          print "h4", args, kwargs
  
      def raise1(self):
          raise TypeError
  
      def raise2(self):
          raise SystemError
  
  def test_main():
      test_support.run_unittest(TestCase)
  
  
  if __name__ == "__main__":
      test_main()
  