1'''Test warnings replacement in pyshell.py and run.py. 2 3This file could be expanded to include traceback overrides 4(in same two modules). If so, change name. 5Revise if output destination changes (http://bugs.python.org/issue18318). 6Make sure warnings module is left unaltered (http://bugs.python.org/issue18081). 7''' 8 9import unittest 10from test.support import captured_stderr 11 12import warnings 13# Try to capture default showwarning before Idle modules are imported. 14showwarning = warnings.showwarning 15# But if we run this file within idle, we are in the middle of the run.main loop 16# and default showwarnings has already been replaced. 17running_in_idle = 'idle' in showwarning.__name__ 18 19from idlelib import run 20from idlelib import pyshell as shell 21 22# The following was generated from pyshell.idle_formatwarning 23# and checked as matching expectation. 24idlemsg = ''' 25Warning (from warnings module): 26 File "test_warning.py", line 99 27 Line of code 28UserWarning: Test 29''' 30shellmsg = idlemsg + ">>> " 31 32class RunWarnTest(unittest.TestCase): 33 34 @unittest.skipIf(running_in_idle, "Does not work when run within Idle.") 35 def test_showwarnings(self): 36 self.assertIs(warnings.showwarning, showwarning) 37 run.capture_warnings(True) 38 self.assertIs(warnings.showwarning, run.idle_showwarning_subproc) 39 run.capture_warnings(False) 40 self.assertIs(warnings.showwarning, showwarning) 41 42 def test_run_show(self): 43 with captured_stderr() as f: 44 run.idle_showwarning_subproc( 45 'Test', UserWarning, 'test_warning.py', 99, f, 'Line of code') 46 # The following uses .splitlines to erase line-ending differences 47 self.assertEqual(idlemsg.splitlines(), f.getvalue().splitlines()) 48 49class ShellWarnTest(unittest.TestCase): 50 51 @unittest.skipIf(running_in_idle, "Does not work when run within Idle.") 52 def test_showwarnings(self): 53 self.assertIs(warnings.showwarning, showwarning) 54 shell.capture_warnings(True) 55 self.assertIs(warnings.showwarning, shell.idle_showwarning) 56 shell.capture_warnings(False) 57 self.assertIs(warnings.showwarning, showwarning) 58 59 def test_idle_formatter(self): 60 # Will fail if format changed without regenerating idlemsg 61 s = shell.idle_formatwarning( 62 'Test', UserWarning, 'test_warning.py', 99, 'Line of code') 63 self.assertEqual(idlemsg, s) 64 65 def test_shell_show(self): 66 with captured_stderr() as f: 67 shell.idle_showwarning( 68 'Test', UserWarning, 'test_warning.py', 99, f, 'Line of code') 69 self.assertEqual(shellmsg.splitlines(), f.getvalue().splitlines()) 70 71 72if __name__ == '__main__': 73 unittest.main(verbosity=2, exit=False) 74