Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 1 | import warnings |
Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 2 | import linecache |
Raymond Hettinger | dc9dcf1 | 2003-07-13 06:15:11 +0000 | [diff] [blame] | 3 | import os |
Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 4 | from io import StringIO |
Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 5 | import sys |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 6 | import unittest |
| 7 | from test import test_support |
Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 8 | |
Guido van Rossum | 805365e | 2007-05-07 22:24:25 +0000 | [diff] [blame] | 9 | from test import warning_tests |
Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 10 | |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 11 | class TestModule(unittest.TestCase): |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 12 | def setUp(self): |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 13 | self.ignored = [w[2].__name__ for w in warnings.filters |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 14 | if w[0]=='ignore' and w[1] is None and w[3] is None] |
Jeremy Hylton | 8501466 | 2003-07-11 15:37:59 +0000 | [diff] [blame] | 15 | |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 16 | def test_warn_default_category(self): |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 17 | with test_support.catch_warning() as w: |
| 18 | for i in range(4): |
| 19 | text = 'multi %d' %i # Different text on each call |
| 20 | warnings.warn(text) |
| 21 | self.assertEqual(str(w.message), text) |
| 22 | self.assert_(w.category is UserWarning) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 23 | |
| 24 | def test_warn_specific_category(self): |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 25 | with test_support.catch_warning() as w: |
| 26 | text = 'None' |
| 27 | for category in [DeprecationWarning, FutureWarning, |
| 28 | PendingDeprecationWarning, RuntimeWarning, |
| 29 | SyntaxWarning, UserWarning, Warning]: |
| 30 | if category.__name__ in self.ignored: |
| 31 | text = 'filtered out' + category.__name__ |
| 32 | warnings.warn(text, category) |
| 33 | self.assertNotEqual(w.message, text) |
| 34 | else: |
| 35 | text = 'unfiltered %s' % category.__name__ |
| 36 | warnings.warn(text, category) |
| 37 | self.assertEqual(str(w.message), text) |
| 38 | self.assert_(w.category is category) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 39 | |
| 40 | def test_filtering(self): |
Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 41 | # Test filterwarnings(). |
| 42 | # Implicitly also tests resetwarnings(). |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 43 | with test_support.catch_warning() as w: |
| 44 | warnings.filterwarnings("error", "", Warning, "", 0) |
| 45 | self.assertRaises(UserWarning, warnings.warn, 'convert to error') |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 46 | |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 47 | warnings.resetwarnings() |
| 48 | text = 'handle normally' |
| 49 | warnings.warn(text) |
| 50 | self.assertEqual(str(w.message), text) |
| 51 | self.assert_(w.category is UserWarning) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 52 | |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 53 | warnings.filterwarnings("ignore", "", Warning, "", 0) |
| 54 | text = 'filtered out' |
| 55 | warnings.warn(text) |
| 56 | self.assertNotEqual(str(w.message), text) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 57 | |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 58 | warnings.resetwarnings() |
| 59 | warnings.filterwarnings("error", "hex*", Warning, "", 0) |
| 60 | self.assertRaises(UserWarning, warnings.warn, 'hex/oct') |
| 61 | text = 'nonmatching text' |
| 62 | warnings.warn(text) |
| 63 | self.assertEqual(str(w.message), text) |
| 64 | self.assert_(w.category is UserWarning) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 65 | |
Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 66 | def test_options(self): |
| 67 | # Uses the private _setoption() function to test the parsing |
| 68 | # of command-line warning arguments |
Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 69 | with test_support.catch_warning(): |
Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 70 | self.assertRaises(warnings._OptionError, |
| 71 | warnings._setoption, '1:2:3:4:5:6') |
| 72 | self.assertRaises(warnings._OptionError, |
| 73 | warnings._setoption, 'bogus::Warning') |
| 74 | self.assertRaises(warnings._OptionError, |
| 75 | warnings._setoption, 'ignore:2::4:-5') |
| 76 | warnings._setoption('error::Warning::0') |
| 77 | self.assertRaises(UserWarning, warnings.warn, 'convert to error') |
| 78 | |
| 79 | def test_filename(self): |
| 80 | with test_support.catch_warning() as w: |
| 81 | warning_tests.inner("spam1") |
| 82 | self.assertEqual(os.path.basename(w.filename), "warning_tests.py") |
| 83 | warning_tests.outer("spam2") |
| 84 | self.assertEqual(os.path.basename(w.filename), "warning_tests.py") |
| 85 | |
| 86 | def test_stacklevel(self): |
| 87 | # Test stacklevel argument |
| 88 | # make sure all messages are different, so the warning won't be skipped |
| 89 | with test_support.catch_warning() as w: |
| 90 | warning_tests.inner("spam3", stacklevel=1) |
| 91 | self.assertEqual(os.path.basename(w.filename), "warning_tests.py") |
| 92 | warning_tests.outer("spam4", stacklevel=1) |
| 93 | self.assertEqual(os.path.basename(w.filename), "warning_tests.py") |
| 94 | |
| 95 | warning_tests.inner("spam5", stacklevel=2) |
| 96 | self.assertEqual(os.path.basename(w.filename), "test_warnings.py") |
| 97 | warning_tests.outer("spam6", stacklevel=2) |
| 98 | self.assertEqual(os.path.basename(w.filename), "warning_tests.py") |
| 99 | |
| 100 | warning_tests.inner("spam7", stacklevel=9999) |
| 101 | self.assertEqual(os.path.basename(w.filename), "sys") |
Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 102 | |
| 103 | |
Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 104 | class WarningsDisplayTests(unittest.TestCase): |
| 105 | |
| 106 | def test_formatwarning(self): |
| 107 | message = "msg" |
| 108 | category = Warning |
| 109 | file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' |
| 110 | line_num = 3 |
| 111 | file_line = linecache.getline(file_name, line_num).strip() |
| 112 | expect = "%s:%s: %s: %s\n %s\n" % (file_name, line_num, category.__name__, |
| 113 | message, file_line) |
| 114 | self.failUnlessEqual(warnings.formatwarning(message, category, |
| 115 | file_name, line_num), |
| 116 | expect) |
| 117 | |
| 118 | def test_showwarning(self): |
| 119 | file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' |
| 120 | line_num = 3 |
| 121 | expected_file_line = linecache.getline(file_name, line_num).strip() |
| 122 | message = 'msg' |
| 123 | category = Warning |
| 124 | file_object = StringIO() |
| 125 | expect = warnings.formatwarning(message, category, file_name, line_num) |
| 126 | warnings.showwarning(message, category, file_name, line_num, |
| 127 | file_object) |
| 128 | self.failUnlessEqual(file_object.getvalue(), expect) |
| 129 | |
| 130 | |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 131 | def test_main(verbose=None): |
Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 132 | # Obscure hack so that this test passes after reloads or repeated calls |
| 133 | # to test_main (regrtest -R). |
| 134 | if '__warningregistry__' in globals(): |
| 135 | del globals()['__warningregistry__'] |
Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 136 | if hasattr(warning_tests, '__warningregistry__'): |
| 137 | del warning_tests.__warningregistry__ |
| 138 | if hasattr(sys, '__warningregistry__'): |
| 139 | del sys.__warningregistry__ |
Christian Heimes | 5fb7c2a | 2007-12-24 08:52:31 +0000 | [diff] [blame] | 140 | test_support.run_unittest(TestModule, WarningsDisplayTests) |
Raymond Hettinger | d6f6e50 | 2003-07-13 08:37:40 +0000 | [diff] [blame] | 141 | |
| 142 | if __name__ == "__main__": |
| 143 | test_main(verbose=True) |