blob: 66246cfd2e68de38da55a889e7149650cb893cf1 [file] [log] [blame]
Jeremy Hylton85014662003-07-11 15:37:59 +00001import warnings
Raymond Hettingerdc9dcf12003-07-13 06:15:11 +00002import os
Brett Cannon855da6c2007-08-17 20:16:15 +00003import sys
Raymond Hettingerd6f6e502003-07-13 08:37:40 +00004import unittest
5from test import test_support
Jeremy Hylton85014662003-07-11 15:37:59 +00006
Walter Dörwalde1a9b422007-04-03 16:53:43 +00007import warning_tests
8
Walter Dörwalde6dae6c2007-04-03 18:33:29 +00009class TestModule(unittest.TestCase):
Raymond Hettingerd6f6e502003-07-13 08:37:40 +000010 def setUp(self):
Walter Dörwalde6dae6c2007-04-03 18:33: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):
Walter Dörwalde6dae6c2007-04-03 18:33: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):
Walter Dörwalde6dae6c2007-04-03 18:33: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):
Walter Dörwalde6dae6c2007-04-03 18:33: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
Walter Dörwalde6dae6c2007-04-03 18:33: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
Walter Dörwalde6dae6c2007-04-03 18:33: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
Walter Dörwalde6dae6c2007-04-03 18:33: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
Brett Cannon53ab5b72006-06-22 16:49:14 +000062 def test_options(self):
63 # Uses the private _setoption() function to test the parsing
64 # of command-line warning arguments
Brett Cannon2ee41282007-08-14 05:51:06 +000065 with test_support.catch_warning():
Walter Dörwalde6dae6c2007-04-03 18:33: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')
Tim Peters3249d002006-06-27 11:52:49 +000074
Walter Dörwalde1a9b422007-04-03 16:53:43 +000075 def test_filename(self):
Walter Dörwalde6dae6c2007-04-03 18:33:29 +000076 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")
Walter Dörwalde1a9b422007-04-03 16:53:43 +000081
82 def test_stacklevel(self):
83 # Test stacklevel argument
84 # make sure all messages are different, so the warning won't be skipped
Walter Dörwalde6dae6c2007-04-03 18:33:29 +000085 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")
Walter Dörwalde1a9b422007-04-03 16:53:43 +000090
Walter Dörwalde6dae6c2007-04-03 18:33:29 +000091 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")
Walter Dörwalde1a9b422007-04-03 16:53:43 +000095
Walter Dörwalde6dae6c2007-04-03 18:33:29 +000096 warning_tests.inner("spam7", stacklevel=9999)
97 self.assertEqual(os.path.basename(w.filename), "sys")
Walter Dörwalde1a9b422007-04-03 16:53:43 +000098
Brett Cannon53ab5b72006-06-22 16:49:14 +000099
Raymond Hettingerd6f6e502003-07-13 08:37:40 +0000100def test_main(verbose=None):
Thomas Wouters767833d2006-04-16 15:43:39 +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__']
Brett Cannon855da6c2007-08-17 20:16:15 +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)