Index: Doc/library/test.rst =================================================================== --- Doc/library/test.rst (revision 79022) +++ Doc/library/test.rst (working copy) @@ -284,7 +284,7 @@ This will run all tests defined in the named module. -.. function:: check_warnings(*filters, quiet=False) +.. function:: check_warnings(*filters, quiet=True) A convenience wrapper for ``warnings.catch_warnings()`` that makes it easier to test that a warning was correctly raised with a single @@ -295,7 +295,7 @@ arguments. When the optional keyword argument ``quiet`` is True, it does not fail if a filter catches nothing. Without argument, it defaults to:: - check_warnings(("", Warning), quiet=False) + check_warnings(("", Warning), quiet=True) The main difference is that it verifies the warnings raised. If some filter did not catch any warning, the test fails. If some warnings are not caught, @@ -315,7 +315,7 @@ import warnings - with check_warnings(): + with check_warnings(quiet=False): exec('assert(False, "Hey!")') warnings.warn(UserWarning("Hide me!")) Index: Lib/test/test_warnings.py =================================================================== --- Lib/test/test_warnings.py (revision 79022) +++ Lib/test/test_warnings.py (working copy) @@ -633,19 +633,33 @@ def test_check_warnings(self): # Explicit tests for the test_support convenience wrapper wmod = self.module - if wmod is sys.modules['warnings']: - with test_support.check_warnings() as w: - self.assertEqual(w.warnings, []) - wmod.simplefilter("always") + if wmod is not sys.modules['warnings']: + return + with test_support.check_warnings(quiet=False) as w: + self.assertEqual(w.warnings, []) + wmod.simplefilter("always") + wmod.warn("foo") + self.assertEqual(str(w.message), "foo") + wmod.warn("bar") + self.assertEqual(str(w.message), "bar") + self.assertEqual(str(w.warnings[0].message), "foo") + self.assertEqual(str(w.warnings[1].message), "bar") + w.reset() + self.assertEqual(w.warnings, []) + + with test_support.check_warnings(): + # defaults to quiet=True without argument + pass + with test_support.check_warnings(('foo', UserWarning)): + wmod.warn("foo") + + with self.assertRaises(AssertionError): + with test_support.check_warnings(('', RuntimeWarning)): + # defaults to quiet=False with argument + pass + with self.assertRaises(AssertionError): + with test_support.check_warnings(('foo', RuntimeWarning)): wmod.warn("foo") - self.assertEqual(str(w.message), "foo") - wmod.warn("bar") - self.assertEqual(str(w.message), "bar") - self.assertEqual(str(w.warnings[0].message), "foo") - self.assertEqual(str(w.warnings[1].message), "bar") - w.reset() - self.assertEqual(w.warnings, []) - class CCatchWarningTests(CatchWarningTests): Index: Lib/test/test_io.py =================================================================== --- Lib/test/test_io.py (revision 79022) +++ Lib/test/test_io.py (working copy) @@ -1054,14 +1054,9 @@ self.assertRaises(IOError, bufio.write, b"abcdef") def test_max_buffer_size_deprecation(self): - with support.check_warnings() as w: - warnings.simplefilter("always", DeprecationWarning) + with support.check_warnings(("max_buffer_size is deprecated", + DeprecationWarning)): self.tp(self.MockRawIO(), 8, 12) - self.assertEqual(len(w.warnings), 1) - warning = w.warnings[0] - self.assertTrue(warning.category is DeprecationWarning) - self.assertEqual(str(warning.message), - "max_buffer_size is deprecated") class CBufferedWriterTest(BufferedWriterTest): @@ -1117,14 +1112,9 @@ self.assertRaises(self.UnsupportedOperation, pair.detach) def test_constructor_max_buffer_size_deprecation(self): - with support.check_warnings() as w: - warnings.simplefilter("always", DeprecationWarning) + with support.check_warnings(("max_buffer_size is deprecated", + DeprecationWarning)): self.tp(self.MockRawIO(), self.MockRawIO(), 8, 12) - self.assertEqual(len(w.warnings), 1) - warning = w.warnings[0] - self.assertTrue(warning.category is DeprecationWarning) - self.assertEqual(str(warning.message), - "max_buffer_size is deprecated") def test_constructor_with_not_readable(self): class NotReadable(MockRawIO): Index: Lib/test/test_shutil.py =================================================================== --- Lib/test/test_shutil.py (revision 79022) +++ Lib/test/test_shutil.py (working copy) @@ -462,30 +462,24 @@ old_dir = os.getcwd() os.chdir(tmpdir) try: - with captured_stdout() as s: - with check_warnings() as w: - warnings.simplefilter("always") - _make_tarball(base_name, 'dist', compress='compress') + with captured_stdout() as s, check_warnings(quiet=False): + _make_tarball(base_name, 'dist', compress='compress') finally: os.chdir(old_dir) tarball = base_name + '.tar.Z' self.assertTrue(os.path.exists(tarball)) - self.assertEquals(len(w.warnings), 1) # same test with dry_run os.remove(tarball) old_dir = os.getcwd() os.chdir(tmpdir) try: - with captured_stdout() as s: - with check_warnings() as w: - warnings.simplefilter("always") - _make_tarball(base_name, 'dist', compress='compress', - dry_run=True) + with captured_stdout() as s, check_warnings(quiet=False): + _make_tarball(base_name, 'dist', compress='compress', + dry_run=True) finally: os.chdir(old_dir) - self.assertTrue(not os.path.exists(tarball)) - self.assertEquals(len(w.warnings), 1) + self.assertFalse(os.path.exists(tarball)) @unittest.skipUnless(zlib, "Requires zlib") @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') Index: Lib/test/test_py3kwarn.py =================================================================== --- Lib/test/test_py3kwarn.py (revision 79022) +++ Lib/test/test_py3kwarn.py (working copy) @@ -1,6 +1,6 @@ import unittest import sys -from test.test_support import check_warnings, CleanImport, run_unittest +from test.test_support import check_py3k_warnings, CleanImport, run_unittest import warnings if not sys.py3kwarning: @@ -41,21 +41,19 @@ def test_backquote(self): expected = 'backquote not supported in 3.x; use repr()' - with check_warnings() as w: + with check_py3k_warnings((expected, SyntaxWarning)): exec "`2`" in {} - self.assertWarning(None, w, expected) def test_paren_arg_names(self): expected = 'parenthesized argument names are invalid in 3.x' def check(s): - exec s in {} - self.assertWarning(None, w, expected) - with check_warnings() as w: - check("def f((x)): pass") - check("def f((((x))), (y)): pass") - check("def f((x), (((y))), m=32): pass") - # Something like def f((a, (b))): pass will raise the tuple - # unpacking warning. + with check_py3k_warnings((expected, SyntaxWarning)): + exec s in {} + check("def f((x)): pass") + check("def f((((x))), (y)): pass") + check("def f((x), (((y))), m=32): pass") + # Something like def f((a, (b))): pass will raise the tuple + # unpacking warning. def test_forbidden_names(self): # So we don't screw up our globals @@ -66,7 +64,7 @@ tests = [("True", "assignment to True or False is forbidden in 3.x"), ("False", "assignment to True or False is forbidden in 3.x"), ("nonlocal", "nonlocal is a keyword in 3.x")] - with check_warnings() as w: + with check_py3k_warnings(('', SyntaxWarning)) as w: for keyword, expected in tests: safe_exec("{0} = False".format(keyword)) self.assertWarning(None, w, expected) @@ -90,21 +88,21 @@ def test_type_inequality_comparisons(self): expected = 'type inequality comparisons not supported in 3.x' - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(int < str, w, expected) w.reset() self.assertWarning(type < object, w, expected) def test_object_inequality_comparisons(self): expected = 'comparing unequal types not supported in 3.x' - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(str < [], w, expected) w.reset() self.assertWarning(object() < (1, 2), w, expected) def test_dict_inequality_comparisons(self): expected = 'dict inequality comparisons not supported in 3.x' - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning({} < {2:3}, w, expected) w.reset() self.assertWarning({} <= {}, w, expected) @@ -121,7 +119,7 @@ return g cell0, = f(0).func_closure cell1, = f(1).func_closure - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(cell0 == cell1, w, expected) w.reset() self.assertWarning(cell0 < cell1, w, expected) @@ -132,7 +130,7 @@ pass def g(x): pass - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(f.func_code < g.func_code, w, expected) w.reset() self.assertWarning(f.func_code <= g.func_code, w, expected) @@ -146,7 +144,7 @@ 'order comparisons not supported in 3.x') func = eval meth = {}.get - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(func < meth, w, expected) w.reset() self.assertWarning(func > meth, w, expected) @@ -166,7 +164,7 @@ f = sys._getframe(0) for attr in ("f_exc_traceback", "f_exc_value", "f_exc_type"): expected = template % attr - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(getattr(f, attr), w, expected) w.reset() self.assertWarning(setattr(f, attr, None), w, expected) @@ -176,7 +174,7 @@ lst = range(5) cmp = lambda x,y: -1 - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(lst.sort(cmp=cmp), w, expected) w.reset() self.assertWarning(sorted(lst, cmp=cmp), w, expected) @@ -187,7 +185,7 @@ def test_sys_exc_clear(self): expected = 'sys.exc_clear() not supported in 3.x; use except clauses' - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(sys.exc_clear(), w, expected) def test_methods_members(self): @@ -196,17 +194,17 @@ __methods__ = ['a'] __members__ = ['b'] c = C() - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(dir(c), w, expected) def test_softspace(self): expected = 'file.softspace not supported in 3.x' with file(__file__) as f: - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(f.softspace, w, expected) def set(): f.softspace = 0 - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(set(), w, expected) def test_slice_methods(self): @@ -222,7 +220,7 @@ expected = "in 3.x, __{0}slice__ has been removed; use __{0}item__" for obj in (Spam(), Egg()): - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(obj[1:2], w, expected.format('get')) w.reset() del obj[3:4] @@ -233,24 +231,23 @@ def test_tuple_parameter_unpacking(self): expected = "tuple parameter unpacking has been removed in 3.x" - with check_warnings() as w: + with check_py3k_warnings((expected, SyntaxWarning)): exec "def f((a, b)): pass" - self.assertWarning(None, w, expected) def test_buffer(self): expected = 'buffer() not supported in 3.x' - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(buffer('a'), w, expected) def test_file_xreadlines(self): expected = ("f.xreadlines() not supported in 3.x, " "try 'for line in f' instead") with file(__file__) as f: - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(f.xreadlines(), w, expected) def test_hash_inheritance(self): - with check_warnings() as w: + with check_py3k_warnings() as w: # With object as the base class class WarnOnlyCmp(object): def __cmp__(self, other): pass @@ -313,7 +310,7 @@ "Use hasattr(obj, '__call__').") seq_warn = ("operator.sequenceIncludes() is not supported " "in 3.x. Use operator.contains().") - with check_warnings() as w: + with check_py3k_warnings() as w: self.assertWarning(isCallable(self), w, callable_warn) w.reset() self.assertWarning(sequenceIncludes(range(3), 2), w, seq_warn) @@ -400,7 +397,7 @@ for path_mod in ("ntpath", "macpath", "os2emxpath", "posixpath"): mod = __import__(path_mod) reset_module_registry(mod) - with check_warnings() as w: + with check_py3k_warnings() as w: mod.walk("crashers", dumbo, None) self.assertEquals(str(w.message), msg) Index: Lib/test/test_cgi.py =================================================================== --- Lib/test/test_cgi.py (revision 79022) +++ Lib/test/test_cgi.py (working copy) @@ -340,13 +340,13 @@ self.assertEqual(result, v) def test_deprecated_parse_qs(self): - with check_warnings(): + with check_warnings(quiet=False): # this func is moved to urlparse, this is just a sanity check self.assertEqual({'a': ['A1'], 'B': ['B3'], 'b': ['B2']}, cgi.parse_qs('a=A1&b=B2&B=B3')) def test_deprecated_parse_qsl(self): - with check_warnings(): + with check_warnings(quiet=False): # this func is moved to urlparse, this is just a sanity check self.assertEqual([('a', 'A1'), ('b', 'B2'), ('B', 'B3')], cgi.parse_qsl('a=A1&b=B2&B=B3')) Index: Lib/test/test_ascii_formatd.py =================================================================== --- Lib/test/test_ascii_formatd.py (revision 79022) +++ Lib/test/test_ascii_formatd.py (working copy) @@ -17,7 +17,7 @@ PyOS_ascii_formatd = pythonapi.PyOS_ascii_formatd buf = create_string_buffer(' ' * 100) - with check_warnings(): + with check_warnings(quiet=False): PyOS_ascii_formatd(byref(buf), sizeof(buf), '%+.10f', c_double(10.0)) self.assertEqual(buf.value, '+10.0000000000') @@ -46,7 +46,7 @@ ('%-e', 1.234), ] - with check_warnings(): + with check_warnings(quiet=False): for format, val in tests: PyOS_ascii_formatd(byref(buf), sizeof(buf), format, c_double(val)) Index: Lib/test/test_import.py =================================================================== --- Lib/test/test_import.py (revision 79022) +++ Lib/test/test_import.py (working copy) @@ -432,18 +432,14 @@ # Check relative fails with only __package__ wrong ns = dict(__package__='foo', __name__='test.notarealmodule') - with check_warnings() as w: + with check_warnings(('.*foo', RuntimeWarning)): check_absolute() - self.assertIn('foo', str(w.message)) - self.assertEqual(w.category, RuntimeWarning) self.assertRaises(SystemError, check_relative) # Check relative fails with __package__ and __name__ wrong ns = dict(__package__='foo', __name__='notarealpkg.notarealmodule') - with check_warnings() as w: + with check_warnings(('.*foo', RuntimeWarning)): check_absolute() - self.assertIn('foo', str(w.message)) - self.assertEqual(w.category, RuntimeWarning) self.assertRaises(SystemError, check_relative) # Check both fail with package set to a non-string Index: Lib/test/test_structmembers.py =================================================================== --- Lib/test/test_structmembers.py (revision 79022) +++ Lib/test/test_structmembers.py (working copy) @@ -65,39 +65,30 @@ class TestWarnings(unittest.TestCase): - def has_warned(self, w): - self.assertEqual(w.category, RuntimeWarning) def test_byte_max(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_BYTE = CHAR_MAX+1 - self.has_warned(w) def test_byte_min(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_BYTE = CHAR_MIN-1 - self.has_warned(w) def test_ubyte_max(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_UBYTE = UCHAR_MAX+1 - self.has_warned(w) def test_short_max(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_SHORT = SHRT_MAX+1 - self.has_warned(w) def test_short_min(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_SHORT = SHRT_MIN-1 - self.has_warned(w) def test_ushort_max(self): - with test_support.check_warnings() as w: + with test_support.check_warnings(('', RuntimeWarning)): ts.T_USHORT = USHRT_MAX+1 - self.has_warned(w) - def test_main(verbose=None): Index: Lib/test/test_support.py =================================================================== --- Lib/test/test_support.py (revision 79022) +++ Lib/test/test_support.py (working copy) @@ -577,14 +577,19 @@ Optional argument: - if 'quiet' is True, it does not fail if a filter catches nothing - (default False) + (default True without argument, + default False if some filters are defined) Without argument, it defaults to: - check_warnings(("", Warning), quiet=False) + check_warnings(("", Warning), quiet=True) """ + quiet = kwargs.get('quiet') if not filters: filters = (("", Warning),) - return _filterwarnings(filters, kwargs.get('quiet')) + # Preserve backward compatibility + if quiet is None: + quiet = True + return _filterwarnings(filters, quiet) @contextlib.contextmanager