blob: 671ed02a6129ce828d2d135701f96b3cdb6d78fd [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):
Walter Dörwald8bd65002007-04-03 16:16:24 +000024 # base class used for catching warnings issued by the
25 # warning framework (this is reused by test_structmembers.py)
Jeremy Hylton85014662003-07-11 15:37:59 +000026
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000027 def setUp(self):
28 global msg
29 msg = WarningMessage()
30 self._filters = warnings.filters[:]
31 self._showwarning = warnings.showwarning
32 warnings.showwarning = showwarning
33 self.ignored = [w[2].__name__ for w in self._filters
34 if w[0]=='ignore' and w[1] is None and w[3] is None]
Jeremy Hylton85014662003-07-11 15:37:59 +000035
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000036 def tearDown(self):
37 warnings.filters = self._filters[:]
38 warnings.showwarning = self._showwarning
Jeremy Hylton85014662003-07-11 15:37:59 +000039
Walter Dörwaldd815d352007-04-03 16:08:10 +000040class TestModule(CatchWarningTest):
41
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000042 def test_warn_default_category(self):
43 for i in range(4):
44 text = 'multi %d' %i # Different text on each call
45 warnings.warn(text)
46 self.assertEqual(msg.message, text)
47 self.assertEqual(msg.category, 'UserWarning')
48
49 def test_warn_specific_category(self):
50 text = 'None'
Brett Cannonbe66e942006-02-27 20:03:56 +000051 for category in [DeprecationWarning, FutureWarning,
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000052 PendingDeprecationWarning, RuntimeWarning,
53 SyntaxWarning, UserWarning, Warning]:
54 if category.__name__ in self.ignored:
55 text = 'filtered out' + category.__name__
56 warnings.warn(text, category)
57 self.assertNotEqual(msg.message, text)
58 else:
59 text = 'unfiltered %s' % category.__name__
60 warnings.warn(text, category)
61 self.assertEqual(msg.message, text)
62 self.assertEqual(msg.category, category.__name__)
63
64 def test_filtering(self):
65
66 warnings.filterwarnings("error", "", Warning, "", 0)
67 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
68
69 warnings.resetwarnings()
70 text = 'handle normally'
71 warnings.warn(text)
72 self.assertEqual(msg.message, text)
73 self.assertEqual(msg.category, 'UserWarning')
74
75 warnings.filterwarnings("ignore", "", Warning, "", 0)
76 text = 'filtered out'
77 warnings.warn(text)
78 self.assertNotEqual(msg.message, text)
79
80 warnings.resetwarnings()
81 warnings.filterwarnings("error", "hex*", Warning, "", 0)
82 self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
83 text = 'nonmatching text'
84 warnings.warn(text)
85 self.assertEqual(msg.message, text)
86 self.assertEqual(msg.category, 'UserWarning')
87
Brett Cannon53ab5b72006-06-22 16:49:14 +000088 def test_options(self):
89 # Uses the private _setoption() function to test the parsing
90 # of command-line warning arguments
91 self.assertRaises(warnings._OptionError,
92 warnings._setoption, '1:2:3:4:5:6')
93 self.assertRaises(warnings._OptionError,
94 warnings._setoption, 'bogus::Warning')
95 self.assertRaises(warnings._OptionError,
96 warnings._setoption, 'ignore:2::4:-5')
97 warnings._setoption('error::Warning::0')
98 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
Tim Peters3249d002006-06-27 11:52:49 +000099
Brett Cannon53ab5b72006-06-22 16:49:14 +0000100
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000101def test_main(verbose=None):
Thomas Wouters767833d2006-04-16 15:43:39 +0000102 # Obscure hack so that this test passes after reloads or repeated calls
103 # to test_main (regrtest -R).
104 if '__warningregistry__' in globals():
105 del globals()['__warningregistry__']
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000106 test_support.run_unittest(TestModule)
107
108if __name__ == "__main__":
109 test_main(verbose=True)