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