blob: 8fd5586e17cf943afee925488ca3143b80eaac6c [file] [log] [blame]
Steven Bethardae42f332008-03-18 17:26:10 +00001import unittest
Brett Cannon977eb022008-03-19 17:37:43 +00002import sys
Alexandre Vassalottieb83f702008-05-11 07:06:04 +00003from test.test_support import (catch_warning, CleanImport,
4 TestSkipped, run_unittest)
Steven Bethardae42f332008-03-18 17:26:10 +00005import warnings
6
Brett Cannon977eb022008-03-19 17:37:43 +00007if not sys.py3kwarning:
8 raise TestSkipped('%s must be run with the -3 flag' % __name__)
9
Steven Bethardae42f332008-03-18 17:26:10 +000010
11class TestPy3KWarnings(unittest.TestCase):
12
13 def test_type_inequality_comparisons(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000014 expected = 'type inequality comparisons not supported in 3.x'
Steven Bethardae42f332008-03-18 17:26:10 +000015 with catch_warning() as w:
16 self.assertWarning(int < str, w, expected)
17 with catch_warning() as w:
18 self.assertWarning(type < object, w, expected)
19
20 def test_object_inequality_comparisons(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000021 expected = 'comparing unequal types not supported in 3.x'
Steven Bethardae42f332008-03-18 17:26:10 +000022 with catch_warning() as w:
23 self.assertWarning(str < [], w, expected)
24 with catch_warning() as w:
25 self.assertWarning(object() < (1, 2), w, expected)
26
27 def test_dict_inequality_comparisons(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000028 expected = 'dict inequality comparisons not supported in 3.x'
Steven Bethardae42f332008-03-18 17:26:10 +000029 with catch_warning() as w:
30 self.assertWarning({} < {2:3}, w, expected)
31 with catch_warning() as w:
32 self.assertWarning({} <= {}, w, expected)
33 with catch_warning() as w:
34 self.assertWarning({} > {2:3}, w, expected)
35 with catch_warning() as w:
36 self.assertWarning({2:3} >= {}, w, expected)
37
38 def test_cell_inequality_comparisons(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000039 expected = 'cell comparisons not supported in 3.x'
Steven Bethardae42f332008-03-18 17:26:10 +000040 def f(x):
41 def g():
42 return x
43 return g
44 cell0, = f(0).func_closure
45 cell1, = f(1).func_closure
46 with catch_warning() as w:
47 self.assertWarning(cell0 == cell1, w, expected)
48 with catch_warning() as w:
49 self.assertWarning(cell0 < cell1, w, expected)
50
Steven Bethard6a644f92008-03-18 22:08:20 +000051 def test_code_inequality_comparisons(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000052 expected = 'code inequality comparisons not supported in 3.x'
Steven Bethard6a644f92008-03-18 22:08:20 +000053 def f(x):
54 pass
55 def g(x):
56 pass
57 with catch_warning() as w:
58 self.assertWarning(f.func_code < g.func_code, w, expected)
59 with catch_warning() as w:
60 self.assertWarning(f.func_code <= g.func_code, w, expected)
61 with catch_warning() as w:
62 self.assertWarning(f.func_code >= g.func_code, w, expected)
63 with catch_warning() as w:
64 self.assertWarning(f.func_code > g.func_code, w, expected)
65
66 def test_builtin_function_or_method_comparisons(self):
67 expected = ('builtin_function_or_method '
Georg Brandld5b635f2008-03-25 08:29:14 +000068 'inequality comparisons not supported in 3.x')
Steven Bethard6a644f92008-03-18 22:08:20 +000069 func = eval
70 meth = {}.get
71 with catch_warning() as w:
72 self.assertWarning(func < meth, w, expected)
73 with catch_warning() as w:
74 self.assertWarning(func > meth, w, expected)
75 with catch_warning() as w:
76 self.assertWarning(meth <= func, w, expected)
77 with catch_warning() as w:
78 self.assertWarning(meth >= func, w, expected)
79
Steven Bethardae42f332008-03-18 17:26:10 +000080 def assertWarning(self, _, warning, expected_message):
81 self.assertEqual(str(warning.message), expected_message)
82
Raymond Hettinger05387862008-03-19 17:45:19 +000083 def test_sort_cmp_arg(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000084 expected = "the cmp argument is not supported in 3.x"
Raymond Hettinger05387862008-03-19 17:45:19 +000085 lst = range(5)
86 cmp = lambda x,y: -1
87
88 with catch_warning() as w:
89 self.assertWarning(lst.sort(cmp=cmp), w, expected)
90 with catch_warning() as w:
91 self.assertWarning(sorted(lst, cmp=cmp), w, expected)
92 with catch_warning() as w:
93 self.assertWarning(lst.sort(cmp), w, expected)
94 with catch_warning() as w:
95 self.assertWarning(sorted(lst, cmp), w, expected)
96
Georg Brandl5a444242008-03-21 20:11:46 +000097 def test_sys_exc_clear(self):
Georg Brandld5b635f2008-03-25 08:29:14 +000098 expected = 'sys.exc_clear() not supported in 3.x; use except clauses'
Georg Brandl5a444242008-03-21 20:11:46 +000099 with catch_warning() as w:
100 self.assertWarning(sys.exc_clear(), w, expected)
101
Georg Brandl07e56812008-03-21 20:21:46 +0000102 def test_methods_members(self):
103 expected = '__members__ and __methods__ not supported in 3.x'
104 class C:
105 __methods__ = ['a']
106 __members__ = ['b']
107 c = C()
108 with catch_warning() as w:
109 self.assertWarning(dir(c), w, expected)
110
Georg Brandl65bb42d2008-03-21 20:38:24 +0000111 def test_softspace(self):
112 expected = 'file.softspace not supported in 3.x'
113 with file(__file__) as f:
114 with catch_warning() as w:
115 self.assertWarning(f.softspace, w, expected)
116 def set():
117 f.softspace = 0
118 with catch_warning() as w:
119 self.assertWarning(set(), w, expected)
120
Georg Brandl80055f62008-03-25 07:56:27 +0000121 def test_buffer(self):
Georg Brandld5b635f2008-03-25 08:29:14 +0000122 expected = 'buffer() not supported in 3.x; use memoryview()'
Georg Brandl80055f62008-03-25 07:56:27 +0000123 with catch_warning() as w:
124 self.assertWarning(buffer('a'), w, expected)
125
Georg Brandl07e56812008-03-21 20:21:46 +0000126
Brett Cannone5d2cba2008-05-06 23:23:34 +0000127class TestStdlibRemovals(unittest.TestCase):
128
Brett Cannon3c759142008-05-09 05:25:37 +0000129 # test.testall not tested as it executes all unit tests as an
130 # import side-effect.
Brett Cannon4c1f8812008-05-10 02:27:04 +0000131 all_platforms = ('audiodev', 'imputil', 'mutex', 'user', 'new', 'rexec',
Brett Cannon27508d42008-05-10 22:45:07 +0000132 'Bastion', 'compiler', 'dircache', 'fpformat',
Brett Cannon2a869132008-05-11 03:01:47 +0000133 'ihooks', 'mhlib')
Benjamin Peterson23681932008-05-12 21:42:13 +0000134 inclusive_platforms = {'irix' : ('pure',),
135 'darwin' : ('autoGIL', 'Carbon', 'OSATerminology',
136 'icglue', 'Nav', 'MacOS', 'aepack', 'aetools'
137 'aetypes', 'applesingle', 'appletrawmain',
138 'appletrunner', 'argvemulator', 'bgenlocations',
139 'EasyDialogs', 'macerrors', 'macostools',
140 'findertools', 'FrameWork', 'ic',
141 'gensuitemodule', 'icopen', 'macresource',
142 'MiniAEFrame', 'pimp', 'PixMapWrapper',
143 'terminalcommand', 'videoreader', '_builtinSuites',
144 'CodeWarrior', 'Explorer', 'Finder', 'Netscape',
145 'StdSuites', 'SystemEvents', 'Terminal', 'cfmfile',
146 'bundlebuilder', 'buildtools', 'ColorPicker')}
Brett Cannonac861b52008-05-12 03:45:59 +0000147 optional_modules = ('bsddb185', 'Canvas', 'dl', 'linuxaudiodev', 'imageop',
148 'sv')
Brett Cannone5d2cba2008-05-06 23:23:34 +0000149
Brett Cannon9ac39742008-05-09 22:51:58 +0000150 def check_removal(self, module_name, optional=False):
Brett Cannone5d2cba2008-05-06 23:23:34 +0000151 """Make sure the specified module, when imported, raises a
152 DeprecationWarning and specifies itself in the message."""
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000153 with CleanImport(module_name):
Brett Cannonddf7a422008-05-10 03:16:38 +0000154 with catch_warning(record=False) as w:
Brett Cannone5d2cba2008-05-06 23:23:34 +0000155 warnings.filterwarnings("error", ".+ removed",
156 DeprecationWarning)
157 try:
158 __import__(module_name, level=0)
159 except DeprecationWarning as exc:
Benjamin Petersonab1fb9f2008-05-12 22:26:05 +0000160 self.assert_(module_name in exc.args[0],
161 "%s warning didn't contain module name"
162 % module_name)
Brett Cannon9ac39742008-05-09 22:51:58 +0000163 except ImportError:
164 if not optional:
Benjamin Petersonab1fb9f2008-05-12 22:26:05 +0000165 self.fail("Non-optional module %s raised an "
166 "ImportError." % module_name)
Brett Cannone5d2cba2008-05-06 23:23:34 +0000167 else:
168 self.fail("DeprecationWarning not raised for %s" %
169 module_name)
Brett Cannone5d2cba2008-05-06 23:23:34 +0000170
171 def test_platform_independent_removals(self):
172 # Make sure that the modules that are available on all platforms raise
173 # the proper DeprecationWarning.
174 for module_name in self.all_platforms:
175 self.check_removal(module_name)
176
Brett Cannon9ac39742008-05-09 22:51:58 +0000177 def test_platform_specific_removals(self):
178 # Test the removal of platform-specific modules.
179 for module_name in self.inclusive_platforms.get(sys.platform, []):
180 self.check_removal(module_name, optional=True)
181
Brett Cannon768d44f2008-05-10 02:47:54 +0000182 def test_optional_module_removals(self):
183 # Test the removal of modules that may or may not be built.
184 for module_name in self.optional_modules:
185 self.check_removal(module_name, optional=True)
186
Benjamin Peterson0893a0a2008-05-09 00:27:01 +0000187 def test_os_path_walk(self):
188 msg = "In 3.x, os.path.walk is removed in favor of os.walk."
189 def dumbo(where, names, args): pass
190 for path_mod in ("ntpath", "macpath", "os2emxpath", "posixpath"):
191 mod = __import__(path_mod)
192 with catch_warning() as w:
193 # Since os3exmpath just imports it from ntpath
194 warnings.simplefilter("always")
195 mod.walk(".", dumbo, None)
196 self.assertEquals(str(w.message), msg)
197
Brett Cannone5d2cba2008-05-06 23:23:34 +0000198
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000199class TestStdlibRenames(unittest.TestCase):
200
Alexandre Vassalottifb9ce652008-05-12 01:37:10 +0000201 renames = {'copy_reg': 'copyreg', 'Queue': 'queue',
202 'SocketServer': 'socketserver'}
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000203
Alexandre Vassalotti1fcaa772008-05-11 23:12:38 +0000204 def check_rename(self, module_name, new_module_name):
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000205 """Make sure that:
206 - A DeprecationWarning is raised when importing using the
207 old 2.x module name.
208 - The module can be imported using the new 3.x name.
209 - The warning message specify both names.
210 """
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000211 with CleanImport(module_name):
212 with catch_warning(record=False) as w:
213 warnings.filterwarnings("error", ".+ renamed to",
214 DeprecationWarning)
215 try:
216 __import__(module_name, level=0)
217 except DeprecationWarning as exc:
218 self.assert_(module_name in exc.args[0])
219 self.assert_(new_module_name in exc.args[0])
220 else:
221 self.fail("DeprecationWarning not raised for %s" %
222 module_name)
223 with CleanImport(new_module_name):
224 try:
225 __import__(new_module_name, level=0)
Alexandre Vassalotti1fcaa772008-05-11 23:12:38 +0000226 except ImportError:
227 self.fail("cannot import %s with its 3.x name, %s" %
228 module_name, new_module_name)
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000229 except DeprecationWarning:
230 self.fail("unexpected DeprecationWarning raised for %s" %
231 module_name)
232
Alexandre Vassalotti1fcaa772008-05-11 23:12:38 +0000233 def test_module_renames(self):
234 for module_name, new_module_name in self.renames.items():
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000235 self.check_rename(module_name, new_module_name)
236
237
Steven Bethardae42f332008-03-18 17:26:10 +0000238def test_main():
Alexandre Vassalottieb83f702008-05-11 07:06:04 +0000239 run_unittest(TestPy3KWarnings,
240 TestStdlibRemovals,
241 TestStdlibRenames)
Steven Bethardae42f332008-03-18 17:26:10 +0000242
243if __name__ == '__main__':
244 test_main()