Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | import warnings |
2 | import os | |
3 | import unittest | |
4 | from test import test_support | |
5 | ||
6 | # The warnings module isn't easily tested, because it relies on module | |
7 | # globals to store configuration information. setUp() and tearDown() | |
8 | # preserve the current settings to avoid bashing them while running tests. | |
9 | ||
10 | # To capture the warning messages, a replacement for showwarning() is | |
11 | # used to save warning information in a global variable. | |
12 | ||
13 | class WarningMessage: | |
14 | "Holds results of latest showwarning() call" | |
15 | pass | |
16 | ||
17 | def showwarning(message, category, filename, lineno, file=None): | |
18 | msg.message = str(message) | |
19 | msg.category = category.__name__ | |
20 | msg.filename = os.path.basename(filename) | |
21 | msg.lineno = lineno | |
22 | ||
23 | class TestModule(unittest.TestCase): | |
24 | ||
25 | 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] | |
33 | ||
34 | def tearDown(self): | |
35 | warnings.filters = self._filters[:] | |
36 | warnings.showwarning = self._showwarning | |
37 | ||
38 | def test_warn_default_category(self): | |
39 | for i in range(4): | |
40 | text = 'multi %d' %i # Different text on each call | |
41 | warnings.warn(text) | |
42 | self.assertEqual(msg.message, text) | |
43 | self.assertEqual(msg.category, 'UserWarning') | |
44 | ||
45 | def test_warn_specific_category(self): | |
46 | text = 'None' | |
47 | # XXX OverflowWarning should go away for Python 2.5. | |
48 | for category in [DeprecationWarning, FutureWarning, OverflowWarning, | |
49 | PendingDeprecationWarning, RuntimeWarning, | |
50 | SyntaxWarning, UserWarning, Warning]: | |
51 | if category.__name__ in self.ignored: | |
52 | text = 'filtered out' + category.__name__ | |
53 | warnings.warn(text, category) | |
54 | self.assertNotEqual(msg.message, text) | |
55 | else: | |
56 | text = 'unfiltered %s' % category.__name__ | |
57 | warnings.warn(text, category) | |
58 | self.assertEqual(msg.message, text) | |
59 | self.assertEqual(msg.category, category.__name__) | |
60 | ||
61 | def test_filtering(self): | |
62 | ||
63 | warnings.filterwarnings("error", "", Warning, "", 0) | |
64 | self.assertRaises(UserWarning, warnings.warn, 'convert to error') | |
65 | ||
66 | warnings.resetwarnings() | |
67 | text = 'handle normally' | |
68 | warnings.warn(text) | |
69 | self.assertEqual(msg.message, text) | |
70 | self.assertEqual(msg.category, 'UserWarning') | |
71 | ||
72 | warnings.filterwarnings("ignore", "", Warning, "", 0) | |
73 | text = 'filtered out' | |
74 | warnings.warn(text) | |
75 | self.assertNotEqual(msg.message, text) | |
76 | ||
77 | warnings.resetwarnings() | |
78 | warnings.filterwarnings("error", "hex*", Warning, "", 0) | |
79 | self.assertRaises(UserWarning, warnings.warn, 'hex/oct') | |
80 | text = 'nonmatching text' | |
81 | warnings.warn(text) | |
82 | self.assertEqual(msg.message, text) | |
83 | self.assertEqual(msg.category, 'UserWarning') | |
84 | ||
85 | def test_main(verbose=None): | |
86 | test_support.run_unittest(TestModule) | |
87 | ||
88 | if __name__ == "__main__": | |
89 | test_main(verbose=True) |