blob: 8206202846a295c865349d34f82be84ba163b90d [file] [log] [blame]
Jeremy Hylton85014662003-07-11 15:37:59 +00001import warnings
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00002import linecache
Raymond Hettingerdc9dcf12003-07-13 06:15:11 +00003import os
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00004from io import StringIO
Guido van Rossum61e21b52007-08-20 19:06:03 +00005import sys
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00006import unittest
7from test import test_support
Jeremy Hylton85014662003-07-11 15:37:59 +00008
Guido van Rossum805365e2007-05-07 22:24:25 +00009from test import warning_tests
Jeremy Hylton85014662003-07-11 15:37:59 +000010
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000011class TestModule(unittest.TestCase):
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000012 def setUp(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000013 self.ignored = [w[2].__name__ for w in warnings.filters
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000014 if w[0]=='ignore' and w[1] is None and w[3] is None]
Jeremy Hylton85014662003-07-11 15:37:59 +000015
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000016 def test_warn_default_category(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000017 with test_support.catch_warning() as w:
18 for i in range(4):
19 text = 'multi %d' %i # Different text on each call
20 warnings.warn(text)
21 self.assertEqual(str(w.message), text)
22 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000023
24 def test_warn_specific_category(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000025 with test_support.catch_warning() as w:
26 text = 'None'
27 for category in [DeprecationWarning, FutureWarning,
28 PendingDeprecationWarning, RuntimeWarning,
29 SyntaxWarning, UserWarning, Warning]:
30 if category.__name__ in self.ignored:
31 text = 'filtered out' + category.__name__
32 warnings.warn(text, category)
33 self.assertNotEqual(w.message, text)
34 else:
35 text = 'unfiltered %s' % category.__name__
36 warnings.warn(text, category)
37 self.assertEqual(str(w.message), text)
38 self.assert_(w.category is category)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000039
40 def test_filtering(self):
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000041 # Test filterwarnings().
42 # Implicitly also tests resetwarnings().
Guido van Rossumd8faa362007-04-27 19:54:29 +000043 with test_support.catch_warning() as w:
44 warnings.filterwarnings("error", "", Warning, "", 0)
45 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000046
Guido van Rossumd8faa362007-04-27 19:54:29 +000047 warnings.resetwarnings()
48 text = 'handle normally'
49 warnings.warn(text)
50 self.assertEqual(str(w.message), text)
51 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000052
Guido van Rossumd8faa362007-04-27 19:54:29 +000053 warnings.filterwarnings("ignore", "", Warning, "", 0)
54 text = 'filtered out'
55 warnings.warn(text)
56 self.assertNotEqual(str(w.message), text)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000057
Guido van Rossumd8faa362007-04-27 19:54:29 +000058 warnings.resetwarnings()
59 warnings.filterwarnings("error", "hex*", Warning, "", 0)
60 self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
61 text = 'nonmatching text'
62 warnings.warn(text)
63 self.assertEqual(str(w.message), text)
64 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000065
Thomas Wouters0e3f5912006-08-11 14:57:12 +000066 def test_options(self):
67 # Uses the private _setoption() function to test the parsing
68 # of command-line warning arguments
Guido van Rossumaf554a02007-08-16 23:48:43 +000069 with test_support.catch_warning():
Guido van Rossumd8faa362007-04-27 19:54:29 +000070 self.assertRaises(warnings._OptionError,
71 warnings._setoption, '1:2:3:4:5:6')
72 self.assertRaises(warnings._OptionError,
73 warnings._setoption, 'bogus::Warning')
74 self.assertRaises(warnings._OptionError,
75 warnings._setoption, 'ignore:2::4:-5')
76 warnings._setoption('error::Warning::0')
77 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
78
79 def test_filename(self):
80 with test_support.catch_warning() as w:
81 warning_tests.inner("spam1")
82 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
83 warning_tests.outer("spam2")
84 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
85
86 def test_stacklevel(self):
87 # Test stacklevel argument
88 # make sure all messages are different, so the warning won't be skipped
89 with test_support.catch_warning() as w:
90 warning_tests.inner("spam3", stacklevel=1)
91 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
92 warning_tests.outer("spam4", stacklevel=1)
93 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
94
95 warning_tests.inner("spam5", stacklevel=2)
96 self.assertEqual(os.path.basename(w.filename), "test_warnings.py")
97 warning_tests.outer("spam6", stacklevel=2)
98 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
99
100 warning_tests.inner("spam7", stacklevel=9999)
101 self.assertEqual(os.path.basename(w.filename), "sys")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000102
103
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000104class WarningsDisplayTests(unittest.TestCase):
105
106 def test_formatwarning(self):
107 message = "msg"
108 category = Warning
109 file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
110 line_num = 3
111 file_line = linecache.getline(file_name, line_num).strip()
112 expect = "%s:%s: %s: %s\n %s\n" % (file_name, line_num, category.__name__,
113 message, file_line)
114 self.failUnlessEqual(warnings.formatwarning(message, category,
115 file_name, line_num),
116 expect)
117
118 def test_showwarning(self):
119 file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
120 line_num = 3
121 expected_file_line = linecache.getline(file_name, line_num).strip()
122 message = 'msg'
123 category = Warning
124 file_object = StringIO()
125 expect = warnings.formatwarning(message, category, file_name, line_num)
126 warnings.showwarning(message, category, file_name, line_num,
127 file_object)
128 self.failUnlessEqual(file_object.getvalue(), expect)
129
130
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000131def test_main(verbose=None):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000132 # Obscure hack so that this test passes after reloads or repeated calls
133 # to test_main (regrtest -R).
134 if '__warningregistry__' in globals():
135 del globals()['__warningregistry__']
Guido van Rossum61e21b52007-08-20 19:06:03 +0000136 if hasattr(warning_tests, '__warningregistry__'):
137 del warning_tests.__warningregistry__
138 if hasattr(sys, '__warningregistry__'):
139 del sys.__warningregistry__
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000140 test_support.run_unittest(TestModule, WarningsDisplayTests)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000141
142if __name__ == "__main__":
143 test_main(verbose=True)