blob: 0ad83edb19bf151e11827635fc063cb94e96f234 [file] [log] [blame]
Jeremy Hylton85014662003-07-11 15:37:59 +00001import warnings
Raymond Hettingerdc9dcf12003-07-13 06:15:11 +00002import os
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00003import unittest
4from test import test_support
Jeremy Hylton85014662003-07-11 15:37:59 +00005
6# The warnings module isn't easily tested, because it relies on module
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00007# globals to store configuration information. setUp() and tearDown()
8# preserve the current settings to avoid bashing them while running tests.
Jeremy Hylton85014662003-07-11 15:37:59 +00009
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000010# To capture the warning messages, a replacement for showwarning() is
11# used to save warning information in a global variable.
12
13class WarningMessage:
14 "Holds results of latest showwarning() call"
15 pass
Jeremy Hylton85014662003-07-11 15:37:59 +000016
17def showwarning(message, category, filename, lineno, file=None):
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000018 msg.message = str(message)
19 msg.category = category.__name__
20 msg.filename = os.path.basename(filename)
21 msg.lineno = lineno
Jeremy Hylton85014662003-07-11 15:37:59 +000022
Walter Dörwaldd815d352007-04-03 16:08:10 +000023class CatchWarningTest(unittest.TestCase):
Jeremy Hylton85014662003-07-11 15:37:59 +000024
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000025 def setUp(self):
26 global msg
27 msg = WarningMessage()
28 self._filters = warnings.filters[:]
29 self._showwarning = warnings.showwarning
30 warnings.showwarning = showwarning
31 self.ignored = [w[2].__name__ for w in self._filters
32 if w[0]=='ignore' and w[1] is None and w[3] is None]
Jeremy Hylton85014662003-07-11 15:37:59 +000033
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000034 def tearDown(self):
35 warnings.filters = self._filters[:]
36 warnings.showwarning = self._showwarning
Jeremy Hylton85014662003-07-11 15:37:59 +000037
Walter Dörwaldd815d352007-04-03 16:08:10 +000038class TestModule(CatchWarningTest):
39
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000040 def test_warn_default_category(self):
41 for i in range(4):
42 text = 'multi %d' %i # Different text on each call
43 warnings.warn(text)
44 self.assertEqual(msg.message, text)
45 self.assertEqual(msg.category, 'UserWarning')
46
47 def test_warn_specific_category(self):
48 text = 'None'
Brett Cannonbe66e942006-02-27 20:03:56 +000049 for category in [DeprecationWarning, FutureWarning,
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000050 PendingDeprecationWarning, RuntimeWarning,
51 SyntaxWarning, UserWarning, Warning]:
52 if category.__name__ in self.ignored:
53 text = 'filtered out' + category.__name__
54 warnings.warn(text, category)
55 self.assertNotEqual(msg.message, text)
56 else:
57 text = 'unfiltered %s' % category.__name__
58 warnings.warn(text, category)
59 self.assertEqual(msg.message, text)
60 self.assertEqual(msg.category, category.__name__)
61
62 def test_filtering(self):
63
64 warnings.filterwarnings("error", "", Warning, "", 0)
65 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
66
67 warnings.resetwarnings()
68 text = 'handle normally'
69 warnings.warn(text)
70 self.assertEqual(msg.message, text)
71 self.assertEqual(msg.category, 'UserWarning')
72
73 warnings.filterwarnings("ignore", "", Warning, "", 0)
74 text = 'filtered out'
75 warnings.warn(text)
76 self.assertNotEqual(msg.message, text)
77
78 warnings.resetwarnings()
79 warnings.filterwarnings("error", "hex*", Warning, "", 0)
80 self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
81 text = 'nonmatching text'
82 warnings.warn(text)
83 self.assertEqual(msg.message, text)
84 self.assertEqual(msg.category, 'UserWarning')
85
Brett Cannon53ab5b72006-06-22 16:49:14 +000086 def test_options(self):
87 # Uses the private _setoption() function to test the parsing
88 # of command-line warning arguments
89 self.assertRaises(warnings._OptionError,
90 warnings._setoption, '1:2:3:4:5:6')
91 self.assertRaises(warnings._OptionError,
92 warnings._setoption, 'bogus::Warning')
93 self.assertRaises(warnings._OptionError,
94 warnings._setoption, 'ignore:2::4:-5')
95 warnings._setoption('error::Warning::0')
96 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
Tim Peters3249d002006-06-27 11:52:49 +000097
Brett Cannon53ab5b72006-06-22 16:49:14 +000098
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000099def test_main(verbose=None):
Thomas Wouters767833d2006-04-16 15:43:39 +0000100 # Obscure hack so that this test passes after reloads or repeated calls
101 # to test_main (regrtest -R).
102 if '__warningregistry__' in globals():
103 del globals()['__warningregistry__']
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000104 test_support.run_unittest(TestModule)
105
106if __name__ == "__main__":
107 test_main(verbose=True)