blob: f6c933962fae05837c44eccfdda968300a9e183f [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
Walter Dörwalde1a9b422007-04-03 16:53:43 +00006import warning_tests
7
Jeremy Hylton85014662003-07-11 15:37:59 +00008# The warnings module isn't easily tested, because it relies on module
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00009# globals to store configuration information. setUp() and tearDown()
10# preserve the current settings to avoid bashing them while running tests.
Jeremy Hylton85014662003-07-11 15:37:59 +000011
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000012# To capture the warning messages, a replacement for showwarning() is
13# used to save warning information in a global variable.
14
15class WarningMessage:
16 "Holds results of latest showwarning() call"
17 pass
Jeremy Hylton85014662003-07-11 15:37:59 +000018
19def showwarning(message, category, filename, lineno, file=None):
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000020 msg.message = str(message)
21 msg.category = category.__name__
22 msg.filename = os.path.basename(filename)
23 msg.lineno = lineno
Jeremy Hylton85014662003-07-11 15:37:59 +000024
Walter Dörwaldd815d352007-04-03 16:08:10 +000025class CatchWarningTest(unittest.TestCase):
Walter Dörwald8bd65002007-04-03 16:16:24 +000026 # base class used for catching warnings issued by the
27 # warning framework (this is reused by test_structmembers.py)
Jeremy Hylton85014662003-07-11 15:37:59 +000028
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000029 def setUp(self):
30 global msg
31 msg = WarningMessage()
32 self._filters = warnings.filters[:]
33 self._showwarning = warnings.showwarning
34 warnings.showwarning = showwarning
35 self.ignored = [w[2].__name__ for w in self._filters
36 if w[0]=='ignore' and w[1] is None and w[3] is None]
Jeremy Hylton85014662003-07-11 15:37:59 +000037
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000038 def tearDown(self):
39 warnings.filters = self._filters[:]
40 warnings.showwarning = self._showwarning
Jeremy Hylton85014662003-07-11 15:37:59 +000041
Walter Dörwaldd815d352007-04-03 16:08:10 +000042class TestModule(CatchWarningTest):
43
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000044 def test_warn_default_category(self):
45 for i in range(4):
46 text = 'multi %d' %i # Different text on each call
47 warnings.warn(text)
48 self.assertEqual(msg.message, text)
49 self.assertEqual(msg.category, 'UserWarning')
50
51 def test_warn_specific_category(self):
52 text = 'None'
Brett Cannonbe66e942006-02-27 20:03:56 +000053 for category in [DeprecationWarning, FutureWarning,
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000054 PendingDeprecationWarning, RuntimeWarning,
55 SyntaxWarning, UserWarning, Warning]:
56 if category.__name__ in self.ignored:
57 text = 'filtered out' + category.__name__
58 warnings.warn(text, category)
59 self.assertNotEqual(msg.message, text)
60 else:
61 text = 'unfiltered %s' % category.__name__
62 warnings.warn(text, category)
63 self.assertEqual(msg.message, text)
64 self.assertEqual(msg.category, category.__name__)
65
66 def test_filtering(self):
67
68 warnings.filterwarnings("error", "", Warning, "", 0)
69 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
70
71 warnings.resetwarnings()
72 text = 'handle normally'
73 warnings.warn(text)
74 self.assertEqual(msg.message, text)
75 self.assertEqual(msg.category, 'UserWarning')
76
77 warnings.filterwarnings("ignore", "", Warning, "", 0)
78 text = 'filtered out'
79 warnings.warn(text)
80 self.assertNotEqual(msg.message, text)
81
82 warnings.resetwarnings()
83 warnings.filterwarnings("error", "hex*", Warning, "", 0)
84 self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
85 text = 'nonmatching text'
86 warnings.warn(text)
87 self.assertEqual(msg.message, text)
88 self.assertEqual(msg.category, 'UserWarning')
89
Brett Cannon53ab5b72006-06-22 16:49:14 +000090 def test_options(self):
91 # Uses the private _setoption() function to test the parsing
92 # of command-line warning arguments
93 self.assertRaises(warnings._OptionError,
94 warnings._setoption, '1:2:3:4:5:6')
95 self.assertRaises(warnings._OptionError,
96 warnings._setoption, 'bogus::Warning')
97 self.assertRaises(warnings._OptionError,
98 warnings._setoption, 'ignore:2::4:-5')
99 warnings._setoption('error::Warning::0')
100 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
Tim Peters3249d002006-06-27 11:52:49 +0000101
Walter Dörwalde1a9b422007-04-03 16:53:43 +0000102 def test_filename(self):
103 warning_tests.inner("spam1")
104 self.assertEqual(msg.filename, "warning_tests.py")
105 warning_tests.outer("spam2")
106 self.assertEqual(msg.filename, "warning_tests.py")
107
108 def test_stacklevel(self):
109 # Test stacklevel argument
110 # make sure all messages are different, so the warning won't be skipped
111 warning_tests.inner("spam3", stacklevel=1)
112 self.assertEqual(msg.filename, "warning_tests.py")
113 warning_tests.outer("spam4", stacklevel=1)
114 self.assertEqual(msg.filename, "warning_tests.py")
115
116 warning_tests.inner("spam5", stacklevel=2)
117 self.assertEqual(msg.filename, "test_warnings.py")
118 warning_tests.outer("spam6", stacklevel=2)
119 self.assertEqual(msg.filename, "warning_tests.py")
120
121 warning_tests.inner("spam7", stacklevel=9999)
122 self.assertEqual(msg.filename, "sys")
123
Brett Cannon53ab5b72006-06-22 16:49:14 +0000124
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000125def test_main(verbose=None):
Thomas Wouters767833d2006-04-16 15:43:39 +0000126 # Obscure hack so that this test passes after reloads or repeated calls
127 # to test_main (regrtest -R).
128 if '__warningregistry__' in globals():
129 del globals()['__warningregistry__']
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000130 test_support.run_unittest(TestModule)
131
132if __name__ == "__main__":
133 test_main(verbose=True)