14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUnit tests for refactor.py.
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom __future__ import with_statement
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport codecs
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport operator
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport StringIO
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tempfile
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport shutil
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom lib2to3 import refactor, pygram, fixer_base
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom lib2to3.pgen2 import token
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom . import support
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFIXER_DIR = os.path.join(TEST_DATA_DIR, "fixers")
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.path.append(FIXER_DIR)
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _DEFAULT_FIXERS = refactor.get_fixers_from_package("myfixes")
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally:
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sys.path.pop()
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_2TO3_FIXERS = refactor.get_fixers_from_package("lib2to3.fixes")
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestRefactoringTool(unittest.TestCase):
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def setUp(self):
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.path.append(FIXER_DIR)
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def tearDown(self):
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.path.pop()
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def check_instances(self, instances, classes):
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for inst, cls in zip(instances, classes):
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not isinstance(inst, cls):
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.fail("%s are not instances of %s" % instances, classes)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def rt(self, options=None, fixers=_DEFAULT_FIXERS, explicit=None):
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return refactor.RefactoringTool(fixers, options, explicit)
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_print_function_option(self):
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt({"print_function" : True})
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(rt.grammar is pygram.python_grammar_no_print_statement)
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(rt.driver.grammar is
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        pygram.python_grammar_no_print_statement)
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_fixer_loading_helpers(self):
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        contents = ["explicit", "first", "last", "parrot", "preorder"]
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        non_prefixed = refactor.get_all_fix_names("myfixes")
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prefixed = refactor.get_all_fix_names("myfixes", False)
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        full_names = refactor.get_fixers_from_package("myfixes")
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(prefixed, ["fix_" + name for name in contents])
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(non_prefixed, contents)
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(full_names,
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         ["myfixes.fix_" + name for name in contents])
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_detect_future_features(self):
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        run = refactor._detect_future_features
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fs = frozenset
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        empty = fs()
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(""), empty)
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run("from __future__ import print_function"),
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         fs(("print_function",)))
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run("from __future__ import generators"),
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         fs(("generators",)))
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run("from __future__ import generators, feature"),
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         fs(("generators", "feature")))
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "from __future__ import generators, print_function"
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("generators", "print_function")))
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp ="from __future__ import print_function, generators"
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("print_function", "generators")))
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "from __future__ import (print_function,)"
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("print_function",)))
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "from __future__ import (generators, print_function)"
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("generators", "print_function")))
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "from __future__ import (generators, nested_scopes)"
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("generators", "nested_scopes")))
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = """from __future__ import generators
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom __future__ import print_function"""
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("generators", "print_function")))
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        invalid = ("from",
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from 4",
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from x",
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from x 5",
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from x im",
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from x import",
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   "from x import 4",
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   )
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for inp in invalid:
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(run(inp), empty)
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "'docstring'\nfrom __future__ import print_function"
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("print_function",)))
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "'docstring'\n'somng'\nfrom __future__ import print_function"
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), empty)
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "# comment\nfrom __future__ import print_function"
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("print_function",)))
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "# comment\n'doc'\nfrom __future__ import print_function"
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), fs(("print_function",)))
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inp = "class x: pass\nfrom __future__ import print_function"
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(run(inp), empty)
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_get_headnode_dict(self):
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class NoneFix(fixer_base.BaseFix):
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class FileInputFix(fixer_base.BaseFix):
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PATTERN = "file_input< any * >"
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class SimpleFix(fixer_base.BaseFix):
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PATTERN = "'name'"
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        no_head = NoneFix({}, [])
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with_head = FileInputFix({}, [])
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        simple = SimpleFix({}, [])
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = refactor._get_headnode_dict([no_head, with_head, simple])
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        top_fixes = d.pop(pygram.python_symbols.file_input)
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(top_fixes, [with_head, no_head])
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name_fixes = d.pop(token.NAME)
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(name_fixes, [simple, no_head])
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for fixes in d.itervalues():
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(fixes, [no_head])
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_fixer_loading(self):
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from myfixes.fix_first import FixFirst
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from myfixes.fix_last import FixLast
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from myfixes.fix_parrot import FixParrot
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from myfixes.fix_preorder import FixPreorder
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt()
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pre, post = rt.get_fixers()
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_instances(pre, [FixPreorder])
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_instances(post, [FixFirst, FixParrot, FixLast])
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_naughty_fixers(self):
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ImportError, self.rt, fixers=["not_here"])
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(refactor.FixerError, self.rt, fixers=["no_fixer_cls"])
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(refactor.FixerError, self.rt, fixers=["bad_order"])
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_refactor_string(self):
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt()
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        input = "def parrot(): pass\n\n"
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tree = rt.refactor_string(input, "<test>")
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(str(tree), input)
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        input = "def f(): pass\n\n"
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tree = rt.refactor_string(input, "<test>")
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(str(tree), input)
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_refactor_stdin(self):
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class MyRT(refactor.RefactoringTool):
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def print_output(self, old_text, new_text, filename, equal):
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                results.extend([old_text, new_text, filename, equal])
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        results = []
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = MyRT(_DEFAULT_FIXERS)
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        save = sys.stdin
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdin = StringIO.StringIO("def parrot(): pass\n\n")
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            rt.refactor_stdin()
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdin = save
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = ["def parrot(): pass\n\n",
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "def cheese(): pass\n\n",
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "<stdin>", False]
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(results, expected)
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS):
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def read_file():
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with open(test_file, "rb") as fp:
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return fp.read()
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        old_contents = read_file()
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt(fixers=fixers)
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt.refactor_file(test_file)
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(old_contents, read_file())
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            rt.refactor_file(test_file, True)
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            new_contents = read_file()
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertNotEqual(old_contents, new_contents)
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with open(test_file, "wb") as fp:
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fp.write(old_contents)
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return new_contents
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_refactor_file(self):
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_file = os.path.join(FIXER_DIR, "parrot_example.py")
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_file_refactoring(test_file, _DEFAULT_FIXERS)
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_refactor_dir(self):
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def check(structure, expected):
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def mock_refactor_file(self, f, *args):
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                got.append(f)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            save_func = refactor.RefactoringTool.refactor_file
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            refactor.RefactoringTool.refactor_file = mock_refactor_file
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            rt = self.rt()
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            got = []
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            dir = tempfile.mkdtemp(prefix="2to3-test_refactor")
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                os.mkdir(os.path.join(dir, "a_dir"))
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for fn in structure:
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    open(os.path.join(dir, fn), "wb").close()
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rt.refactor_dir(dir)
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally:
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                refactor.RefactoringTool.refactor_file = save_func
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                shutil.rmtree(dir)
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(got,
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             [os.path.join(dir, path) for path in expected])
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check([], [])
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tree = ["nothing",
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "hi.py",
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ".dumb",
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ".after.py",
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "notpy.npy",
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "sappy"]
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = ["hi.py"]
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check(tree, expected)
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tree = ["hi.py",
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                os.path.join("a_dir", "stuff.py")]
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check(tree, tree)
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_file_encoding(self):
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fn = os.path.join(TEST_DATA_DIR, "different_encoding.py")
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_file_refactoring(fn)
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_bom(self):
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fn = os.path.join(TEST_DATA_DIR, "bom.py")
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        data = self.check_file_refactoring(fn)
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(data.startswith(codecs.BOM_UTF8))
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_crlf_newlines(self):
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        old_sep = os.linesep
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.linesep = "\r\n"
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fn = os.path.join(TEST_DATA_DIR, "crlf.py")
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fixes = refactor.get_fixers_from_package("lib2to3.fixes")
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.check_file_refactoring(fn, fixes)
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            os.linesep = old_sep
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_refactor_docstring(self):
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt()
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        doc = """
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm>>> example()
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm42
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        out = rt.refactor_docstring(doc, "<test>")
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(out, doc)
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        doc = """
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm>>> def parrot():
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm...      return 43
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        out = rt.refactor_docstring(doc, "<test>")
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(out, doc)
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_explicit(self):
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from myfixes.fix_explicit import FixExplicit
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt(fixers=["myfixes.fix_explicit"])
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(rt.post_order), 0)
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rt = self.rt(explicit=["myfixes.fix_explicit"])
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for fix in rt.post_order:
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if isinstance(fix, FixExplicit):
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("explicit fixer not loaded")
282