2008-03-18 14:26:10 -03:00
|
|
|
import unittest
|
2008-03-19 14:37:43 -03:00
|
|
|
import sys
|
2010-03-17 16:15:56 -03:00
|
|
|
from test.test_support import check_py3k_warnings, CleanImport, run_unittest
|
2008-03-18 14:26:10 -03:00
|
|
|
import warnings
|
2015-09-03 05:46:17 -03:00
|
|
|
from test import test_support
|
2008-03-18 14:26:10 -03:00
|
|
|
|
2008-03-19 14:37:43 -03:00
|
|
|
if not sys.py3kwarning:
|
2009-03-26 18:10:30 -03:00
|
|
|
raise unittest.SkipTest('%s must be run with the -3 flag' % __name__)
|
2008-03-19 14:37:43 -03:00
|
|
|
|
2010-03-09 15:57:01 -04:00
|
|
|
try:
|
|
|
|
from test.test_support import __warningregistry__ as _registry
|
|
|
|
except ImportError:
|
|
|
|
def check_deprecated_module(module_name):
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
past_warnings = _registry.keys()
|
|
|
|
del _registry
|
|
|
|
def check_deprecated_module(module_name):
|
|
|
|
"""Lookup the past warnings for module already loaded using
|
|
|
|
test_support.import_module(..., deprecated=True)
|
|
|
|
"""
|
|
|
|
return any(module_name in msg and ' removed' in msg
|
|
|
|
and issubclass(cls, DeprecationWarning)
|
|
|
|
and (' module' in msg or ' package' in msg)
|
|
|
|
for (msg, cls, line) in past_warnings)
|
|
|
|
|
2008-09-11 09:11:06 -03:00
|
|
|
def reset_module_registry(module):
|
|
|
|
try:
|
|
|
|
registry = module.__warningregistry__
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
registry.clear()
|
2008-03-18 14:26:10 -03:00
|
|
|
|
|
|
|
class TestPy3KWarnings(unittest.TestCase):
|
|
|
|
|
2008-08-11 12:45:58 -03:00
|
|
|
def assertWarning(self, _, warning, expected_message):
|
2008-09-11 09:11:06 -03:00
|
|
|
self.assertEqual(str(warning.message), expected_message)
|
2008-08-11 12:45:58 -03:00
|
|
|
|
2009-07-02 14:06:17 -03:00
|
|
|
def assertNoWarning(self, _, recorder):
|
|
|
|
self.assertEqual(len(recorder.warnings), 0)
|
|
|
|
|
2008-06-07 23:05:33 -03:00
|
|
|
def test_backquote(self):
|
|
|
|
expected = 'backquote not supported in 3.x; use repr()'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings((expected, SyntaxWarning)):
|
2008-06-07 23:05:33 -03:00
|
|
|
exec "`2`" in {}
|
|
|
|
|
2009-11-19 18:54:57 -04:00
|
|
|
def test_paren_arg_names(self):
|
|
|
|
expected = 'parenthesized argument names are invalid in 3.x'
|
|
|
|
def check(s):
|
2010-03-17 16:15:56 -03:00
|
|
|
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.
|
2009-11-19 18:54:57 -04:00
|
|
|
|
2008-10-24 23:53:28 -03:00
|
|
|
def test_forbidden_names(self):
|
2008-06-08 19:52:37 -03:00
|
|
|
# So we don't screw up our globals
|
|
|
|
def safe_exec(expr):
|
|
|
|
def f(**kwargs): pass
|
|
|
|
exec expr in {'f' : f}
|
|
|
|
|
2008-10-24 23:53:28 -03:00
|
|
|
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")]
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings(('', SyntaxWarning)) as w:
|
2008-10-24 23:53:28 -03:00
|
|
|
for keyword, expected in tests:
|
|
|
|
safe_exec("{0} = False".format(keyword))
|
|
|
|
self.assertWarning(None, w, expected)
|
|
|
|
w.reset()
|
|
|
|
try:
|
|
|
|
safe_exec("obj.{0} = True".format(keyword))
|
|
|
|
except NameError:
|
|
|
|
pass
|
|
|
|
self.assertWarning(None, w, expected)
|
|
|
|
w.reset()
|
|
|
|
safe_exec("def {0}(): pass".format(keyword))
|
|
|
|
self.assertWarning(None, w, expected)
|
|
|
|
w.reset()
|
|
|
|
safe_exec("class {0}: pass".format(keyword))
|
|
|
|
self.assertWarning(None, w, expected)
|
|
|
|
w.reset()
|
|
|
|
safe_exec("def f({0}=43): pass".format(keyword))
|
|
|
|
self.assertWarning(None, w, expected)
|
|
|
|
w.reset()
|
2008-06-08 19:52:37 -03:00
|
|
|
|
|
|
|
|
2008-03-18 14:26:10 -03:00
|
|
|
def test_type_inequality_comparisons(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'type inequality comparisons not supported in 3.x'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(int < str, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(type < object, w, expected)
|
|
|
|
|
|
|
|
def test_object_inequality_comparisons(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'comparing unequal types not supported in 3.x'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(str < [], w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(object() < (1, 2), w, expected)
|
|
|
|
|
|
|
|
def test_dict_inequality_comparisons(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'dict inequality comparisons not supported in 3.x'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning({} < {2:3}, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning({} <= {}, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning({} > {2:3}, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning({2:3} >= {}, w, expected)
|
|
|
|
|
|
|
|
def test_cell_inequality_comparisons(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'cell comparisons not supported in 3.x'
|
2008-03-18 14:26:10 -03:00
|
|
|
def f(x):
|
|
|
|
def g():
|
|
|
|
return x
|
|
|
|
return g
|
|
|
|
cell0, = f(0).func_closure
|
|
|
|
cell1, = f(1).func_closure
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(cell0 == cell1, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 14:26:10 -03:00
|
|
|
self.assertWarning(cell0 < cell1, w, expected)
|
|
|
|
|
2008-03-18 19:08:20 -03:00
|
|
|
def test_code_inequality_comparisons(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'code inequality comparisons not supported in 3.x'
|
2008-03-18 19:08:20 -03:00
|
|
|
def f(x):
|
|
|
|
pass
|
|
|
|
def g(x):
|
|
|
|
pass
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(f.func_code < g.func_code, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(f.func_code <= g.func_code, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(f.func_code >= g.func_code, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(f.func_code > g.func_code, w, expected)
|
|
|
|
|
|
|
|
def test_builtin_function_or_method_comparisons(self):
|
|
|
|
expected = ('builtin_function_or_method '
|
2009-07-02 14:06:17 -03:00
|
|
|
'order comparisons not supported in 3.x')
|
2008-03-18 19:08:20 -03:00
|
|
|
func = eval
|
|
|
|
meth = {}.get
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(func < meth, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(func > meth, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(meth <= func, w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-18 19:08:20 -03:00
|
|
|
self.assertWarning(meth >= func, w, expected)
|
2009-07-02 14:06:17 -03:00
|
|
|
w.reset()
|
|
|
|
self.assertNoWarning(meth == func, w)
|
|
|
|
self.assertNoWarning(meth != func, w)
|
|
|
|
lam = lambda x: x
|
|
|
|
self.assertNoWarning(lam == func, w)
|
|
|
|
self.assertNoWarning(lam != func, w)
|
2008-03-18 19:08:20 -03:00
|
|
|
|
2008-12-22 16:16:25 -04:00
|
|
|
def test_frame_attributes(self):
|
|
|
|
template = "%s has been removed in 3.x"
|
|
|
|
f = sys._getframe(0)
|
|
|
|
for attr in ("f_exc_traceback", "f_exc_value", "f_exc_type"):
|
|
|
|
expected = template % attr
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-12-22 16:16:25 -04:00
|
|
|
self.assertWarning(getattr(f, attr), w, expected)
|
|
|
|
w.reset()
|
|
|
|
self.assertWarning(setattr(f, attr, None), w, expected)
|
|
|
|
|
2008-03-19 14:45:19 -03:00
|
|
|
def test_sort_cmp_arg(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = "the cmp argument is not supported in 3.x"
|
2008-03-19 14:45:19 -03:00
|
|
|
lst = range(5)
|
|
|
|
cmp = lambda x,y: -1
|
|
|
|
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-19 14:45:19 -03:00
|
|
|
self.assertWarning(lst.sort(cmp=cmp), w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-19 14:45:19 -03:00
|
|
|
self.assertWarning(sorted(lst, cmp=cmp), w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-19 14:45:19 -03:00
|
|
|
self.assertWarning(lst.sort(cmp), w, expected)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-03-19 14:45:19 -03:00
|
|
|
self.assertWarning(sorted(lst, cmp), w, expected)
|
|
|
|
|
2008-03-21 17:11:46 -03:00
|
|
|
def test_sys_exc_clear(self):
|
2008-03-25 05:29:14 -03:00
|
|
|
expected = 'sys.exc_clear() not supported in 3.x; use except clauses'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-21 17:11:46 -03:00
|
|
|
self.assertWarning(sys.exc_clear(), w, expected)
|
|
|
|
|
2008-03-21 17:21:46 -03:00
|
|
|
def test_methods_members(self):
|
|
|
|
expected = '__members__ and __methods__ not supported in 3.x'
|
|
|
|
class C:
|
|
|
|
__methods__ = ['a']
|
|
|
|
__members__ = ['b']
|
|
|
|
c = C()
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-21 17:21:46 -03:00
|
|
|
self.assertWarning(dir(c), w, expected)
|
|
|
|
|
2008-03-21 17:38:24 -03:00
|
|
|
def test_softspace(self):
|
|
|
|
expected = 'file.softspace not supported in 3.x'
|
|
|
|
with file(__file__) as f:
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-21 17:38:24 -03:00
|
|
|
self.assertWarning(f.softspace, w, expected)
|
|
|
|
def set():
|
|
|
|
f.softspace = 0
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-21 17:38:24 -03:00
|
|
|
self.assertWarning(set(), w, expected)
|
|
|
|
|
2008-08-24 15:10:20 -03:00
|
|
|
def test_slice_methods(self):
|
|
|
|
class Spam(object):
|
|
|
|
def __getslice__(self, i, j): pass
|
|
|
|
def __setslice__(self, i, j, what): pass
|
|
|
|
def __delslice__(self, i, j): pass
|
|
|
|
class Egg:
|
|
|
|
def __getslice__(self, i, h): pass
|
|
|
|
def __setslice__(self, i, j, what): pass
|
|
|
|
def __delslice__(self, i, j): pass
|
|
|
|
|
|
|
|
expected = "in 3.x, __{0}slice__ has been removed; use __{0}item__"
|
|
|
|
|
|
|
|
for obj in (Spam(), Egg()):
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-08-24 15:10:20 -03:00
|
|
|
self.assertWarning(obj[1:2], w, expected.format('get'))
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-24 15:10:20 -03:00
|
|
|
del obj[3:4]
|
|
|
|
self.assertWarning(None, w, expected.format('del'))
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-24 15:10:20 -03:00
|
|
|
obj[4:5] = "eggs"
|
|
|
|
self.assertWarning(None, w, expected.format('set'))
|
|
|
|
|
2008-06-08 20:00:00 -03:00
|
|
|
def test_tuple_parameter_unpacking(self):
|
|
|
|
expected = "tuple parameter unpacking has been removed in 3.x"
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings((expected, SyntaxWarning)):
|
2008-06-08 20:00:00 -03:00
|
|
|
exec "def f((a, b)): pass"
|
|
|
|
|
2008-03-25 04:56:27 -03:00
|
|
|
def test_buffer(self):
|
2008-08-11 12:45:58 -03:00
|
|
|
expected = 'buffer() not supported in 3.x'
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-03-25 04:56:27 -03:00
|
|
|
self.assertWarning(buffer('a'), w, expected)
|
2008-05-17 19:11:54 -03:00
|
|
|
|
|
|
|
def test_file_xreadlines(self):
|
|
|
|
expected = ("f.xreadlines() not supported in 3.x, "
|
|
|
|
"try 'for line in f' instead")
|
|
|
|
with file(__file__) as f:
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-05-17 19:11:54 -03:00
|
|
|
self.assertWarning(f.xreadlines(), w, expected)
|
2008-03-25 04:56:27 -03:00
|
|
|
|
2008-08-11 12:45:58 -03:00
|
|
|
def test_hash_inheritance(self):
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-08-11 12:45:58 -03:00
|
|
|
# With object as the base class
|
|
|
|
class WarnOnlyCmp(object):
|
|
|
|
def __cmp__(self, other): pass
|
2010-06-05 10:18:33 -03:00
|
|
|
self.assertEqual(len(w.warnings), 0)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class WarnOnlyEq(object):
|
|
|
|
def __eq__(self, other): pass
|
2008-09-11 09:11:06 -03:00
|
|
|
self.assertEqual(len(w.warnings), 1)
|
2008-08-11 12:45:58 -03:00
|
|
|
self.assertWarning(None, w,
|
|
|
|
"Overriding __eq__ blocks inheritance of __hash__ in 3.x")
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class WarnCmpAndEq(object):
|
|
|
|
def __cmp__(self, other): pass
|
|
|
|
def __eq__(self, other): pass
|
2010-06-05 10:18:33 -03:00
|
|
|
self.assertEqual(len(w.warnings), 1)
|
2008-08-11 12:45:58 -03:00
|
|
|
self.assertWarning(None, w,
|
|
|
|
"Overriding __eq__ blocks inheritance of __hash__ in 3.x")
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class NoWarningOnlyHash(object):
|
|
|
|
def __hash__(self): pass
|
2008-09-11 09:11:06 -03:00
|
|
|
self.assertEqual(len(w.warnings), 0)
|
2008-08-11 12:45:58 -03:00
|
|
|
# With an intermediate class in the heirarchy
|
|
|
|
class DefinesAllThree(object):
|
|
|
|
def __cmp__(self, other): pass
|
|
|
|
def __eq__(self, other): pass
|
|
|
|
def __hash__(self): pass
|
|
|
|
class WarnOnlyCmp(DefinesAllThree):
|
|
|
|
def __cmp__(self, other): pass
|
2010-06-05 10:18:33 -03:00
|
|
|
self.assertEqual(len(w.warnings), 0)
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class WarnOnlyEq(DefinesAllThree):
|
|
|
|
def __eq__(self, other): pass
|
2008-09-11 09:11:06 -03:00
|
|
|
self.assertEqual(len(w.warnings), 1)
|
2008-08-11 12:45:58 -03:00
|
|
|
self.assertWarning(None, w,
|
|
|
|
"Overriding __eq__ blocks inheritance of __hash__ in 3.x")
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class WarnCmpAndEq(DefinesAllThree):
|
|
|
|
def __cmp__(self, other): pass
|
|
|
|
def __eq__(self, other): pass
|
2010-06-05 10:18:33 -03:00
|
|
|
self.assertEqual(len(w.warnings), 1)
|
2008-08-11 12:45:58 -03:00
|
|
|
self.assertWarning(None, w,
|
|
|
|
"Overriding __eq__ blocks inheritance of __hash__ in 3.x")
|
2008-09-11 09:11:06 -03:00
|
|
|
w.reset()
|
2008-08-11 12:45:58 -03:00
|
|
|
class NoWarningOnlyHash(DefinesAllThree):
|
|
|
|
def __hash__(self): pass
|
2008-09-11 09:11:06 -03:00
|
|
|
self.assertEqual(len(w.warnings), 0)
|
2008-08-11 12:45:58 -03:00
|
|
|
|
2009-07-05 01:22:40 -03:00
|
|
|
def test_operator(self):
|
|
|
|
from operator import isCallable, sequenceIncludes
|
|
|
|
|
2009-07-05 01:25:46 -03:00
|
|
|
callable_warn = ("operator.isCallable() is not supported in 3.x. "
|
|
|
|
"Use hasattr(obj, '__call__').")
|
2009-07-05 01:22:40 -03:00
|
|
|
seq_warn = ("operator.sequenceIncludes() is not supported "
|
|
|
|
"in 3.x. Use operator.contains().")
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2009-07-05 01:22:40 -03:00
|
|
|
self.assertWarning(isCallable(self), w, callable_warn)
|
|
|
|
w.reset()
|
|
|
|
self.assertWarning(sequenceIncludes(range(3), 2), w, seq_warn)
|
|
|
|
|
2014-06-01 16:13:39 -03:00
|
|
|
def test_nonascii_bytes_literals(self):
|
|
|
|
expected = "non-ascii bytes literals not supported in 3.x"
|
|
|
|
with check_py3k_warnings((expected, SyntaxWarning)):
|
|
|
|
exec "b'\xbd'"
|
|
|
|
|
2008-03-21 17:21:46 -03:00
|
|
|
|
2008-05-06 20:23:34 -03:00
|
|
|
class TestStdlibRemovals(unittest.TestCase):
|
|
|
|
|
2008-05-09 02:25:37 -03:00
|
|
|
# test.testall not tested as it executes all unit tests as an
|
|
|
|
# import side-effect.
|
2008-05-09 23:27:04 -03:00
|
|
|
all_platforms = ('audiodev', 'imputil', 'mutex', 'user', 'new', 'rexec',
|
2008-07-18 16:30:22 -03:00
|
|
|
'Bastion', 'compiler', 'dircache', 'mimetools',
|
|
|
|
'fpformat', 'ihooks', 'mhlib', 'statvfs', 'htmllib',
|
|
|
|
'sgmllib', 'rfc822', 'sunaudio')
|
2008-05-14 18:08:41 -03:00
|
|
|
inclusive_platforms = {'irix' : ('pure', 'AL', 'al', 'CD', 'cd', 'cddb',
|
2008-05-14 23:33:55 -03:00
|
|
|
'cdplayer', 'CL', 'cl', 'DEVICE', 'GL',
|
2008-05-15 00:23:17 -03:00
|
|
|
'gl', 'ERRNO', 'FILE', 'FL', 'flp', 'fl',
|
2008-05-15 00:41:55 -03:00
|
|
|
'fm', 'GET', 'GLWS', 'imgfile', 'IN',
|
2008-05-15 00:51:21 -03:00
|
|
|
'IOCTL', 'jpeg', 'panel', 'panelparser',
|
2008-05-15 01:17:35 -03:00
|
|
|
'readcd', 'SV', 'torgb', 'WAIT'),
|
2008-05-12 18:42:13 -03:00
|
|
|
'darwin' : ('autoGIL', 'Carbon', 'OSATerminology',
|
2010-06-22 06:18:28 -03:00
|
|
|
'icglue', 'Nav',
|
|
|
|
# MacOS should (and does) give a Py3kWarning, but one of the
|
|
|
|
# earlier tests already imports the MacOS extension which causes
|
|
|
|
# this test to fail. Disabling the test for 'MacOS' avoids this
|
|
|
|
# spurious test failure.
|
|
|
|
#'MacOS',
|
|
|
|
'aepack',
|
2008-05-13 22:09:40 -03:00
|
|
|
'aetools', 'aetypes', 'applesingle',
|
|
|
|
'appletrawmain', 'appletrunner',
|
|
|
|
'argvemulator', 'bgenlocations',
|
2008-05-12 18:42:13 -03:00
|
|
|
'EasyDialogs', 'macerrors', 'macostools',
|
|
|
|
'findertools', 'FrameWork', 'ic',
|
|
|
|
'gensuitemodule', 'icopen', 'macresource',
|
|
|
|
'MiniAEFrame', 'pimp', 'PixMapWrapper',
|
2008-05-13 22:09:40 -03:00
|
|
|
'terminalcommand', 'videoreader',
|
|
|
|
'_builtinSuites', 'CodeWarrior',
|
|
|
|
'Explorer', 'Finder', 'Netscape',
|
|
|
|
'StdSuites', 'SystemEvents', 'Terminal',
|
|
|
|
'cfmfile', 'bundlebuilder', 'buildtools',
|
2008-07-14 14:42:17 -03:00
|
|
|
'ColorPicker', 'Audio_mac'),
|
2008-05-15 21:10:24 -03:00
|
|
|
'sunos5' : ('sunaudiodev', 'SUNAUDIODEV'),
|
|
|
|
}
|
2008-05-12 00:45:59 -03:00
|
|
|
optional_modules = ('bsddb185', 'Canvas', 'dl', 'linuxaudiodev', 'imageop',
|
2010-01-08 15:20:17 -04:00
|
|
|
'sv', 'bsddb', 'dbhash')
|
2008-05-06 20:23:34 -03:00
|
|
|
|
2008-05-09 19:51:58 -03:00
|
|
|
def check_removal(self, module_name, optional=False):
|
2008-05-06 20:23:34 -03:00
|
|
|
"""Make sure the specified module, when imported, raises a
|
|
|
|
DeprecationWarning and specifies itself in the message."""
|
2015-09-03 05:46:17 -03:00
|
|
|
if module_name in sys.modules:
|
|
|
|
mod = sys.modules[module_name]
|
|
|
|
filename = getattr(mod, '__file__', '')
|
|
|
|
mod = None
|
|
|
|
# the module is not implemented in C?
|
|
|
|
if not filename.endswith(('.py', '.pyc', '.pyo')):
|
|
|
|
# Issue #23375: If the module was already loaded, reimporting
|
|
|
|
# the module will not emit again the warning. The warning is
|
|
|
|
# emited when the module is loaded, but C modules cannot
|
|
|
|
# unloaded.
|
|
|
|
if test_support.verbose:
|
|
|
|
print("Cannot test the Python 3 DeprecationWarning of the "
|
|
|
|
"%s module, the C module is already loaded"
|
|
|
|
% module_name)
|
|
|
|
return
|
2010-03-09 15:57:01 -04:00
|
|
|
with CleanImport(module_name), warnings.catch_warnings():
|
|
|
|
warnings.filterwarnings("error", ".+ (module|package) .+ removed",
|
|
|
|
DeprecationWarning, __name__)
|
|
|
|
warnings.filterwarnings("error", ".+ removed .+ (module|package)",
|
2008-07-14 14:42:17 -03:00
|
|
|
DeprecationWarning, __name__)
|
|
|
|
try:
|
|
|
|
__import__(module_name, level=0)
|
|
|
|
except DeprecationWarning as exc:
|
2010-01-23 19:04:36 -04:00
|
|
|
self.assertIn(module_name, exc.args[0],
|
|
|
|
"%s warning didn't contain module name"
|
|
|
|
% module_name)
|
2008-07-14 14:42:17 -03:00
|
|
|
except ImportError:
|
|
|
|
if not optional:
|
|
|
|
self.fail("Non-optional module {0} raised an "
|
|
|
|
"ImportError.".format(module_name))
|
|
|
|
else:
|
2010-03-09 15:57:01 -04:00
|
|
|
# For extension modules, check the __warningregistry__.
|
|
|
|
# They won't rerun their init code even with CleanImport.
|
|
|
|
if not check_deprecated_module(module_name):
|
|
|
|
self.fail("DeprecationWarning not raised for {0}"
|
|
|
|
.format(module_name))
|
2008-05-06 20:23:34 -03:00
|
|
|
|
|
|
|
def test_platform_independent_removals(self):
|
|
|
|
# Make sure that the modules that are available on all platforms raise
|
|
|
|
# the proper DeprecationWarning.
|
|
|
|
for module_name in self.all_platforms:
|
|
|
|
self.check_removal(module_name)
|
|
|
|
|
2008-05-09 19:51:58 -03:00
|
|
|
def test_platform_specific_removals(self):
|
|
|
|
# Test the removal of platform-specific modules.
|
|
|
|
for module_name in self.inclusive_platforms.get(sys.platform, []):
|
|
|
|
self.check_removal(module_name, optional=True)
|
|
|
|
|
2008-05-09 23:47:54 -03:00
|
|
|
def test_optional_module_removals(self):
|
|
|
|
# Test the removal of modules that may or may not be built.
|
|
|
|
for module_name in self.optional_modules:
|
|
|
|
self.check_removal(module_name, optional=True)
|
|
|
|
|
2008-05-08 21:27:01 -03:00
|
|
|
def test_os_path_walk(self):
|
|
|
|
msg = "In 3.x, os.path.walk is removed in favor of os.walk."
|
|
|
|
def dumbo(where, names, args): pass
|
|
|
|
for path_mod in ("ntpath", "macpath", "os2emxpath", "posixpath"):
|
|
|
|
mod = __import__(path_mod)
|
2008-09-11 09:11:06 -03:00
|
|
|
reset_module_registry(mod)
|
2010-03-17 16:15:56 -03:00
|
|
|
with check_py3k_warnings() as w:
|
2008-05-26 22:42:29 -03:00
|
|
|
mod.walk("crashers", dumbo, None)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(str(w.message), msg)
|
2008-05-26 16:41:53 -03:00
|
|
|
|
2008-08-17 23:12:23 -03:00
|
|
|
def test_reduce_move(self):
|
|
|
|
from operator import add
|
2008-09-11 09:11:06 -03:00
|
|
|
# reduce tests may have already triggered this warning
|
2010-03-09 15:57:01 -04:00
|
|
|
reset_module_registry(unittest.case)
|
2008-09-08 21:49:16 -03:00
|
|
|
with warnings.catch_warnings():
|
2008-08-17 23:12:23 -03:00
|
|
|
warnings.filterwarnings("error", "reduce")
|
|
|
|
self.assertRaises(DeprecationWarning, reduce, add, range(10))
|
|
|
|
|
2008-05-29 02:08:50 -03:00
|
|
|
def test_mutablestring_removal(self):
|
|
|
|
# UserString.MutableString has been removed in 3.0.
|
|
|
|
import UserString
|
2008-09-11 09:11:06 -03:00
|
|
|
# UserString tests may have already triggered this warning
|
|
|
|
reset_module_registry(UserString)
|
2008-09-08 21:49:16 -03:00
|
|
|
with warnings.catch_warnings():
|
2008-05-29 02:08:50 -03:00
|
|
|
warnings.filterwarnings("error", ".*MutableString",
|
|
|
|
DeprecationWarning)
|
|
|
|
self.assertRaises(DeprecationWarning, UserString.MutableString)
|
|
|
|
|
2008-05-06 20:23:34 -03:00
|
|
|
|
2008-03-18 14:26:10 -03:00
|
|
|
def test_main():
|
2010-03-09 15:57:01 -04:00
|
|
|
run_unittest(TestPy3KWarnings,
|
|
|
|
TestStdlibRemovals)
|
2008-03-18 14:26:10 -03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|