1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import check_py3k_warnings, CleanImport, run_unittest
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport warnings
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif not sys.py3kwarning:
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    raise unittest.SkipTest('%s must be run with the -3 flag' % __name__)
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry:
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    from test.test_support import __warningregistry__ as _registry
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError:
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def check_deprecated_module(module_name):
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return False
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehelse:
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    past_warnings = _registry.keys()
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    del _registry
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def check_deprecated_module(module_name):
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        """Lookup the past warnings for module already loaded using
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        test_support.import_module(..., deprecated=True)
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        """
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return any(module_name in msg and ' removed' in msg
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   and issubclass(cls, DeprecationWarning)
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   and (' module' in msg or ' package' in msg)
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   for (msg, cls, line) in past_warnings)
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef reset_module_registry(module):
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    try:
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        registry = module.__warningregistry__
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    except AttributeError:
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pass
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    else:
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        registry.clear()
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPy3KWarnings(unittest.TestCase):
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertWarning(self, _, warning, expected_message):
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(str(warning.message), expected_message)
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertNoWarning(self, _, recorder):
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(recorder.warnings), 0)
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_backquote(self):
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'backquote not supported in 3.x; use repr()'
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings((expected, SyntaxWarning)):
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exec "`2`" in {}
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_paren_arg_names(self):
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'parenthesized argument names are invalid in 3.x'
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def check(s):
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings((expected, SyntaxWarning)):
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                exec s in {}
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        check("def f((x)): pass")
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        check("def f((((x))), (y)): pass")
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        check("def f((x), (((y))), m=32): pass")
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Something like def f((a, (b))): pass will raise the tuple
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # unpacking warning.
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_forbidden_names(self):
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # So we don't screw up our globals
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def safe_exec(expr):
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def f(**kwargs): pass
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exec expr in {'f' : f}
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        tests = [("True", "assignment to True or False is forbidden in 3.x"),
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 ("False", "assignment to True or False is forbidden in 3.x"),
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 ("nonlocal", "nonlocal is a keyword in 3.x")]
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings(('', SyntaxWarning)) as w:
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for keyword, expected in tests:
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                safe_exec("{0} = False".format(keyword))
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected)
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                try:
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    safe_exec("obj.{0} = True".format(keyword))
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                except NameError:
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    pass
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected)
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                safe_exec("def {0}(): pass".format(keyword))
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected)
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                safe_exec("class {0}: pass".format(keyword))
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected)
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                safe_exec("def f({0}=43): pass".format(keyword))
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected)
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_type_inequality_comparisons(self):
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'type inequality comparisons not supported in 3.x'
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(int < str, w, expected)
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(type < object, w, expected)
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_object_inequality_comparisons(self):
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'comparing unequal types not supported in 3.x'
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(str < [], w, expected)
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(object() < (1, 2), w, expected)
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dict_inequality_comparisons(self):
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'dict inequality comparisons not supported in 3.x'
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning({} < {2:3}, w, expected)
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning({} <= {}, w, expected)
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning({} > {2:3}, w, expected)
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning({2:3} >= {}, w, expected)
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_cell_inequality_comparisons(self):
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'cell comparisons not supported in 3.x'
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def f(x):
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def g():
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return x
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return g
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        cell0, = f(0).func_closure
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        cell1, = f(1).func_closure
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(cell0 == cell1, w, expected)
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(cell0 < cell1, w, expected)
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_code_inequality_comparisons(self):
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'code inequality comparisons not supported in 3.x'
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def f(x):
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def g(x):
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(f.func_code < g.func_code, w, expected)
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(f.func_code <= g.func_code, w, expected)
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(f.func_code >= g.func_code, w, expected)
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(f.func_code > g.func_code, w, expected)
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_builtin_function_or_method_comparisons(self):
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = ('builtin_function_or_method '
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'order comparisons not supported in 3.x')
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        func = eval
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        meth = {}.get
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(func < meth, w, expected)
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(func > meth, w, expected)
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(meth <= func, w, expected)
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(meth >= func, w, expected)
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNoWarning(meth == func, w)
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNoWarning(meth != func, w)
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            lam = lambda x: x
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNoWarning(lam == func, w)
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertNoWarning(lam != func, w)
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_frame_attributes(self):
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        template = "%s has been removed in 3.x"
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = sys._getframe(0)
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for attr in ("f_exc_traceback", "f_exc_value", "f_exc_type"):
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = template % attr
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(getattr(f, attr), w, expected)
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(setattr(f, attr, None), w, expected)
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_sort_cmp_arg(self):
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = "the cmp argument is not supported in 3.x"
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        lst = range(5)
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        cmp = lambda x,y: -1
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(lst.sort(cmp=cmp), w, expected)
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(sorted(lst, cmp=cmp), w, expected)
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(lst.sort(cmp), w, expected)
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(sorted(lst, cmp), w, expected)
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_sys_exc_clear(self):
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'sys.exc_clear() not supported in 3.x; use except clauses'
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(sys.exc_clear(), w, expected)
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_methods_members(self):
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = '__members__ and __methods__ not supported in 3.x'
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class C:
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __methods__ = ['a']
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __members__ = ['b']
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c = C()
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(dir(c), w, expected)
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_softspace(self):
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'file.softspace not supported in 3.x'
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with file(__file__) as f:
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(f.softspace, w, expected)
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def set():
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                f.softspace = 0
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(set(), w, expected)
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_slice_methods(self):
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Spam(object):
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __getslice__(self, i, j): pass
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __setslice__(self, i, j, what): pass
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __delslice__(self, i, j): pass
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Egg:
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __getslice__(self, i, h): pass
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __setslice__(self, i, j, what): pass
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __delslice__(self, i, j): pass
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = "in 3.x, __{0}slice__ has been removed; use __{0}item__"
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for obj in (Spam(), Egg()):
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(obj[1:2], w, expected.format('get'))
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                del obj[3:4]
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected.format('del'))
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                w.reset()
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                obj[4:5] = "eggs"
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(None, w, expected.format('set'))
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_tuple_parameter_unpacking(self):
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = "tuple parameter unpacking has been removed in 3.x"
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings((expected, SyntaxWarning)):
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exec "def f((a, b)): pass"
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_buffer(self):
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = 'buffer() not supported in 3.x'
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(buffer('a'), w, expected)
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_file_xreadlines(self):
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = ("f.xreadlines() not supported in 3.x, "
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    "try 'for line in f' instead")
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with file(__file__) as f:
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertWarning(f.xreadlines(), w, expected)
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_hash_inheritance(self):
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # With object as the base class
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnOnlyCmp(object):
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __cmp__(self, other): pass
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 0)
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnOnlyEq(object):
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __eq__(self, other): pass
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 1)
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(None, w,
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 "Overriding __eq__ blocks inheritance of __hash__ in 3.x")
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnCmpAndEq(object):
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __cmp__(self, other): pass
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __eq__(self, other): pass
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 1)
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(None, w,
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 "Overriding __eq__ blocks inheritance of __hash__ in 3.x")
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class NoWarningOnlyHash(object):
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __hash__(self): pass
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 0)
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # With an intermediate class in the heirarchy
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class DefinesAllThree(object):
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __cmp__(self, other): pass
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __eq__(self, other): pass
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __hash__(self): pass
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnOnlyCmp(DefinesAllThree):
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __cmp__(self, other): pass
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 0)
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnOnlyEq(DefinesAllThree):
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __eq__(self, other): pass
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 1)
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(None, w,
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 "Overriding __eq__ blocks inheritance of __hash__ in 3.x")
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class WarnCmpAndEq(DefinesAllThree):
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __cmp__(self, other): pass
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __eq__(self, other): pass
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 1)
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(None, w,
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 "Overriding __eq__ blocks inheritance of __hash__ in 3.x")
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            class NoWarningOnlyHash(DefinesAllThree):
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                def __hash__(self): pass
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(len(w.warnings), 0)
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_operator(self):
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        from operator import isCallable, sequenceIncludes
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        callable_warn = ("operator.isCallable() is not supported in 3.x. "
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         "Use hasattr(obj, '__call__').")
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        seq_warn = ("operator.sequenceIncludes() is not supported "
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    "in 3.x. Use operator.contains().")
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with check_py3k_warnings() as w:
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(isCallable(self), w, callable_warn)
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            w.reset()
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertWarning(sequenceIncludes(range(3), 2), w, seq_warn)
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestStdlibRemovals(unittest.TestCase):
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # test.testall not tested as it executes all unit tests as an
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # import side-effect.
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    all_platforms = ('audiodev', 'imputil', 'mutex', 'user', 'new', 'rexec',
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        'Bastion', 'compiler', 'dircache', 'mimetools',
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        'fpformat', 'ihooks', 'mhlib', 'statvfs', 'htmllib',
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        'sgmllib', 'rfc822', 'sunaudio')
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    inclusive_platforms = {'irix' : ('pure', 'AL', 'al', 'CD', 'cd', 'cddb',
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     'cdplayer', 'CL', 'cl', 'DEVICE', 'GL',
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     'gl', 'ERRNO', 'FILE', 'FL', 'flp', 'fl',
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     'fm', 'GET', 'GLWS', 'imgfile', 'IN',
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     'IOCTL', 'jpeg', 'panel', 'panelparser',
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     'readcd', 'SV', 'torgb', 'WAIT'),
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          'darwin' : ('autoGIL', 'Carbon', 'OSATerminology',
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'icglue', 'Nav',
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      # MacOS should (and does) give a Py3kWarning, but one of the
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      # earlier tests already imports the MacOS extension which causes
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      # this test to fail. Disabling the test for 'MacOS' avoids this
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      # spurious test failure.
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      #'MacOS',
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'aepack',
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'aetools', 'aetypes', 'applesingle',
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'appletrawmain', 'appletrunner',
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'argvemulator', 'bgenlocations',
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'EasyDialogs', 'macerrors', 'macostools',
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'findertools', 'FrameWork', 'ic',
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'gensuitemodule', 'icopen', 'macresource',
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'MiniAEFrame', 'pimp', 'PixMapWrapper',
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'terminalcommand', 'videoreader',
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      '_builtinSuites', 'CodeWarrior',
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'Explorer', 'Finder', 'Netscape',
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'StdSuites', 'SystemEvents', 'Terminal',
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'cfmfile', 'bundlebuilder', 'buildtools',
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      'ColorPicker', 'Audio_mac'),
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           'sunos5' : ('sunaudiodev', 'SUNAUDIODEV'),
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          }
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    optional_modules = ('bsddb185', 'Canvas', 'dl', 'linuxaudiodev', 'imageop',
349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        'sv', 'bsddb', 'dbhash')
350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def check_removal(self, module_name, optional=False):
352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        """Make sure the specified module, when imported, raises a
353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DeprecationWarning and specifies itself in the message."""
354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with CleanImport(module_name), warnings.catch_warnings():
355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            warnings.filterwarnings("error", ".+ (module|package) .+ removed",
356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                    DeprecationWarning, __name__)
357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            warnings.filterwarnings("error", ".+ removed .+ (module|package)",
358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                    DeprecationWarning, __name__)
359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                __import__(module_name, level=0)
361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except DeprecationWarning as exc:
362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertIn(module_name, exc.args[0],
363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                              "%s warning didn't contain module name"
364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                              % module_name)
365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except ImportError:
366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if not optional:
367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.fail("Non-optional module {0} raised an "
368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                              "ImportError.".format(module_name))
369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            else:
370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # For extension modules, check the __warningregistry__.
371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # They won't rerun their init code even with CleanImport.
372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if not check_deprecated_module(module_name):
373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.fail("DeprecationWarning not raised for {0}"
374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                              .format(module_name))
375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_platform_independent_removals(self):
377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make sure that the modules that are available on all platforms raise
378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # the proper DeprecationWarning.
379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for module_name in self.all_platforms:
380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.check_removal(module_name)
381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_platform_specific_removals(self):
383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test the removal of platform-specific modules.
384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for module_name in self.inclusive_platforms.get(sys.platform, []):
385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.check_removal(module_name, optional=True)
386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_optional_module_removals(self):
388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test the removal of modules that may or may not be built.
389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for module_name in self.optional_modules:
390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.check_removal(module_name, optional=True)
391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_os_path_walk(self):
393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        msg = "In 3.x, os.path.walk is removed in favor of os.walk."
394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def dumbo(where, names, args): pass
395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for path_mod in ("ntpath", "macpath", "os2emxpath", "posixpath"):
396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            mod = __import__(path_mod)
397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            reset_module_registry(mod)
398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            with check_py3k_warnings() as w:
399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                mod.walk("crashers", dumbo, None)
400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(str(w.message), msg)
401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_reduce_move(self):
403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        from operator import add
404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # reduce tests may have already triggered this warning
405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        reset_module_registry(unittest.case)
406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with warnings.catch_warnings():
407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            warnings.filterwarnings("error", "reduce")
408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(DeprecationWarning, reduce, add, range(10))
409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_mutablestring_removal(self):
411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # UserString.MutableString has been removed in 3.0.
412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import UserString
413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # UserString tests may have already triggered this warning
414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        reset_module_registry(UserString)
415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with warnings.catch_warnings():
416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            warnings.filterwarnings("error", ".*MutableString",
417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                    DeprecationWarning)
418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(DeprecationWarning, UserString.MutableString)
419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    run_unittest(TestPy3KWarnings,
423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 TestStdlibRemovals)
424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == '__main__':
426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
427