blob: 6889e3f04849b339e218993c4520e98358cd5958 [file] [log] [blame]
Jeremy Hylton85014662003-07-11 15:37:59 +00001import warnings
Raymond Hettingerdc9dcf12003-07-13 06:15:11 +00002import os
Guido van Rossum61e21b52007-08-20 19:06:03 +00003import sys
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00004import unittest
5from test import test_support
Jeremy Hylton85014662003-07-11 15:37:59 +00006
Guido van Rossum805365e2007-05-07 22:24:25 +00007from test import warning_tests
Jeremy Hylton85014662003-07-11 15:37:59 +00008
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00009class TestModule(unittest.TestCase):
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000010 def setUp(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000011 self.ignored = [w[2].__name__ for w in warnings.filters
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000012 if w[0]=='ignore' and w[1] is None and w[3] is None]
Jeremy Hylton85014662003-07-11 15:37:59 +000013
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000014 def test_warn_default_category(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000015 with test_support.catch_warning() as w:
16 for i in range(4):
17 text = 'multi %d' %i # Different text on each call
18 warnings.warn(text)
19 self.assertEqual(str(w.message), text)
20 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000021
22 def test_warn_specific_category(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000023 with test_support.catch_warning() as w:
24 text = 'None'
25 for category in [DeprecationWarning, FutureWarning,
26 PendingDeprecationWarning, RuntimeWarning,
27 SyntaxWarning, UserWarning, Warning]:
28 if category.__name__ in self.ignored:
29 text = 'filtered out' + category.__name__
30 warnings.warn(text, category)
31 self.assertNotEqual(w.message, text)
32 else:
33 text = 'unfiltered %s' % category.__name__
34 warnings.warn(text, category)
35 self.assertEqual(str(w.message), text)
36 self.assert_(w.category is category)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000037
38 def test_filtering(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000039 with test_support.catch_warning() as w:
40 warnings.filterwarnings("error", "", Warning, "", 0)
41 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000042
Guido van Rossumd8faa362007-04-27 19:54:29 +000043 warnings.resetwarnings()
44 text = 'handle normally'
45 warnings.warn(text)
46 self.assertEqual(str(w.message), text)
47 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000048
Guido van Rossumd8faa362007-04-27 19:54:29 +000049 warnings.filterwarnings("ignore", "", Warning, "", 0)
50 text = 'filtered out'
51 warnings.warn(text)
52 self.assertNotEqual(str(w.message), text)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000053
Guido van Rossumd8faa362007-04-27 19:54:29 +000054 warnings.resetwarnings()
55 warnings.filterwarnings("error", "hex*", Warning, "", 0)
56 self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
57 text = 'nonmatching text'
58 warnings.warn(text)
59 self.assertEqual(str(w.message), text)
60 self.assert_(w.category is UserWarning)
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000061
Thomas Wouters0e3f5912006-08-11 14:57:12 +000062 def test_options(self):
63 # Uses the private _setoption() function to test the parsing
64 # of command-line warning arguments
Guido van Rossumaf554a02007-08-16 23:48:43 +000065 with test_support.catch_warning():
Guido van Rossumd8faa362007-04-27 19:54:29 +000066 self.assertRaises(warnings._OptionError,
67 warnings._setoption, '1:2:3:4:5:6')
68 self.assertRaises(warnings._OptionError,
69 warnings._setoption, 'bogus::Warning')
70 self.assertRaises(warnings._OptionError,
71 warnings._setoption, 'ignore:2::4:-5')
72 warnings._setoption('error::Warning::0')
73 self.assertRaises(UserWarning, warnings.warn, 'convert to error')
74
75 def test_filename(self):
76 with test_support.catch_warning() as w:
77 warning_tests.inner("spam1")
78 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
79 warning_tests.outer("spam2")
80 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
81
82 def test_stacklevel(self):
83 # Test stacklevel argument
84 # make sure all messages are different, so the warning won't be skipped
85 with test_support.catch_warning() as w:
86 warning_tests.inner("spam3", stacklevel=1)
87 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
88 warning_tests.outer("spam4", stacklevel=1)
89 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
90
91 warning_tests.inner("spam5", stacklevel=2)
92 self.assertEqual(os.path.basename(w.filename), "test_warnings.py")
93 warning_tests.outer("spam6", stacklevel=2)
94 self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
95
96 warning_tests.inner("spam7", stacklevel=9999)
97 self.assertEqual(os.path.basename(w.filename), "sys")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000098
99
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000100def test_main(verbose=None):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101 # Obscure hack so that this test passes after reloads or repeated calls
102 # to test_main (regrtest -R).
103 if '__warningregistry__' in globals():
104 del globals()['__warningregistry__']
Guido van Rossum61e21b52007-08-20 19:06:03 +0000105 if hasattr(warning_tests, '__warningregistry__'):
106 del warning_tests.__warningregistry__
107 if hasattr(sys, '__warningregistry__'):
108 del sys.__warningregistry__
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000109 test_support.run_unittest(TestModule)
110
111if __name__ == "__main__":
112 test_main(verbose=True)