diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-09-27 22:17:35 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-09-27 22:17:35 (GMT) |
commit | d61de7f18db0eb9763a046f547053ccc59f2bfc5 (patch) | |
tree | 5e4f509b05a4cbe7699cae5226bd7552909e513d /Lib/lib2to3/tests | |
parent | 027951f16d6e635312e01926a8875033d57e0ee2 (diff) | |
download | cpython-d61de7f18db0eb9763a046f547053ccc59f2bfc5.zip cpython-d61de7f18db0eb9763a046f547053ccc59f2bfc5.tar.gz cpython-d61de7f18db0eb9763a046f547053ccc59f2bfc5.tar.bz2 |
Merged revisions 66653-66654 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
r66653 | benjamin.peterson | 2008-09-27 16:09:10 -0500 (Sat, 27 Sep 2008) | 49 lines
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
........
r66511 | benjamin.peterson | 2008-09-18 21:49:27 -0500 (Thu, 18 Sep 2008) | 1 line
remove a useless if __name__ == '__main__'
........
r66548 | benjamin.peterson | 2008-09-21 21:14:14 -0500 (Sun, 21 Sep 2008) | 1 line
avoid the perils of mutable default arguments
........
r66549 | benjamin.peterson | 2008-09-21 21:26:11 -0500 (Sun, 21 Sep 2008) | 1 line
some places in RefactoringTool should raise an error instead of logging it
........
r66644 | benjamin.peterson | 2008-09-27 10:45:10 -0500 (Sat, 27 Sep 2008) | 1 line
fix doctest refactoring
........
r66646 | benjamin.peterson | 2008-09-27 11:40:13 -0500 (Sat, 27 Sep 2008) | 1 line
don't print to stdout when 2to3 is used as a library
........
r66647 | benjamin.peterson | 2008-09-27 12:28:28 -0500 (Sat, 27 Sep 2008) | 1 line
let fixer modules and classes have different prefixes
........
r66648 | benjamin.peterson | 2008-09-27 14:02:13 -0500 (Sat, 27 Sep 2008) | 1 line
raise errors when 2to3 is used as a library
........
r66649 | benjamin.peterson | 2008-09-27 14:03:38 -0500 (Sat, 27 Sep 2008) | 1 line
fix docstring
........
r66650 | benjamin.peterson | 2008-09-27 14:22:21 -0500 (Sat, 27 Sep 2008) | 1 line
make use of enumerate
........
r66651 | benjamin.peterson | 2008-09-27 14:24:13 -0500 (Sat, 27 Sep 2008) | 1 line
revert last revision; it breaks things
........
r66652 | benjamin.peterson | 2008-09-27 16:03:06 -0500 (Sat, 27 Sep 2008) | 1 line
add tests for lib2to3.refactor
........
................
r66654 | benjamin.peterson | 2008-09-27 16:12:20 -0500 (Sat, 27 Sep 2008) | 1 line
enable refactor tests
................
Diffstat (limited to 'Lib/lib2to3/tests')
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/bad_order.py | 5 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/__init__.py | 0 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/fix_explicit.py | 6 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/fix_first.py | 6 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/fix_last.py | 7 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/fix_parrot.py | 13 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/myfixes/fix_preorder.py | 6 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/no_fixer_cls.py | 1 | ||||
-rw-r--r-- | Lib/lib2to3/tests/data/fixers/parrot_example.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/tests/test_refactor.py | 175 |
10 files changed, 221 insertions, 0 deletions
diff --git a/Lib/lib2to3/tests/data/fixers/bad_order.py b/Lib/lib2to3/tests/data/fixers/bad_order.py new file mode 100644 index 0000000..061bbf2 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/bad_order.py @@ -0,0 +1,5 @@ +from lib2to3.fixer_base import BaseFix + +class FixBadOrder(BaseFix): + + order = "crazy" diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/__init__.py b/Lib/lib2to3/tests/data/fixers/myfixes/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/__init__.py diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/fix_explicit.py b/Lib/lib2to3/tests/data/fixers/myfixes/fix_explicit.py new file mode 100644 index 0000000..cbe16f6 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/fix_explicit.py @@ -0,0 +1,6 @@ +from lib2to3.fixer_base import BaseFix + +class FixExplicit(BaseFix): + explicit = True + + def match(self): return False diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/fix_first.py b/Lib/lib2to3/tests/data/fixers/myfixes/fix_first.py new file mode 100644 index 0000000..a88821f --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/fix_first.py @@ -0,0 +1,6 @@ +from lib2to3.fixer_base import BaseFix + +class FixFirst(BaseFix): + run_order = 1 + + def match(self, node): return False diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/fix_last.py b/Lib/lib2to3/tests/data/fixers/myfixes/fix_last.py new file mode 100644 index 0000000..9a077d4 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/fix_last.py @@ -0,0 +1,7 @@ +from lib2to3.fixer_base import BaseFix + +class FixLast(BaseFix): + + run_order = 10 + + def match(self, node): return False diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/fix_parrot.py b/Lib/lib2to3/tests/data/fixers/myfixes/fix_parrot.py new file mode 100644 index 0000000..6bd2f49 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/fix_parrot.py @@ -0,0 +1,13 @@ +from lib2to3.fixer_base import BaseFix +from lib2to3.fixer_util import Name + +class FixParrot(BaseFix): + """ + Change functions named 'parrot' to 'cheese'. + """ + + PATTERN = """funcdef < 'def' name='parrot' any* >""" + + def transform(self, node, results): + name = results["name"] + name.replace(Name("cheese", name.get_prefix())) diff --git a/Lib/lib2to3/tests/data/fixers/myfixes/fix_preorder.py b/Lib/lib2to3/tests/data/fixers/myfixes/fix_preorder.py new file mode 100644 index 0000000..b9bfbba --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/myfixes/fix_preorder.py @@ -0,0 +1,6 @@ +from lib2to3.fixer_base import BaseFix + +class FixPreorder(BaseFix): + order = "pre" + + def match(self, node): return False diff --git a/Lib/lib2to3/tests/data/fixers/no_fixer_cls.py b/Lib/lib2to3/tests/data/fixers/no_fixer_cls.py new file mode 100644 index 0000000..506f794 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/no_fixer_cls.py @@ -0,0 +1 @@ +# This is empty so trying to fetch the fixer class gives an AttributeError diff --git a/Lib/lib2to3/tests/data/fixers/parrot_example.py b/Lib/lib2to3/tests/data/fixers/parrot_example.py new file mode 100644 index 0000000..0852928 --- /dev/null +++ b/Lib/lib2to3/tests/data/fixers/parrot_example.py @@ -0,0 +1,2 @@ +def parrot(): + pass diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py new file mode 100644 index 0000000..0717479 --- /dev/null +++ b/Lib/lib2to3/tests/test_refactor.py @@ -0,0 +1,175 @@ +""" +Unit tests for refactor.py. +""" + +import sys +import os +import operator +import io +import tempfile +import unittest + +from lib2to3 import refactor, pygram, fixer_base + +from . import support + + +FIXER_DIR = os.path.join(os.path.dirname(__file__), "data/fixers") + +sys.path.append(FIXER_DIR) +try: + _DEFAULT_FIXERS = refactor.get_fixers_from_package("myfixes") +finally: + sys.path.pop() + +class TestRefactoringTool(unittest.TestCase): + + def setUp(self): + sys.path.append(FIXER_DIR) + + def tearDown(self): + sys.path.pop() + + def check_instances(self, instances, classes): + for inst, cls in zip(instances, classes): + if not isinstance(inst, cls): + self.fail("%s are not instances of %s" % instances, classes) + + def rt(self, options=None, fixers=_DEFAULT_FIXERS, explicit=None): + return refactor.RefactoringTool(fixers, options, explicit) + + def test_print_function_option(self): + gram = pygram.python_grammar + save = gram.keywords["print"] + try: + rt = self.rt({"print_function" : True}) + self.assertRaises(KeyError, operator.itemgetter("print"), + gram.keywords) + finally: + gram.keywords["print"] = save + + def test_fixer_loading_helpers(self): + contents = ["explicit", "first", "last", "parrot", "preorder"] + non_prefixed = refactor.get_all_fix_names("myfixes") + prefixed = refactor.get_all_fix_names("myfixes", False) + full_names = refactor.get_fixers_from_package("myfixes") + self.assertEqual(prefixed, ["fix_" + name for name in contents]) + self.assertEqual(non_prefixed, contents) + self.assertEqual(full_names, + ["myfixes.fix_" + name for name in contents]) + + def test_get_headnode_dict(self): + class NoneFix(fixer_base.BaseFix): + PATTERN = None + + class FileInputFix(fixer_base.BaseFix): + PATTERN = "file_input< any * >" + + no_head = NoneFix({}, []) + with_head = FileInputFix({}, []) + d = refactor.get_headnode_dict([no_head, with_head]) + expected = {None: [no_head], + pygram.python_symbols.file_input : [with_head]} + self.assertEqual(d, expected) + + def test_fixer_loading(self): + from myfixes.fix_first import FixFirst + from myfixes.fix_last import FixLast + from myfixes.fix_parrot import FixParrot + from myfixes.fix_preorder import FixPreorder + + rt = self.rt() + pre, post = rt.get_fixers() + + self.check_instances(pre, [FixPreorder]) + self.check_instances(post, [FixFirst, FixParrot, FixLast]) + + def test_naughty_fixers(self): + self.assertRaises(ImportError, self.rt, fixers=["not_here"]) + self.assertRaises(refactor.FixerError, self.rt, fixers=["no_fixer_cls"]) + self.assertRaises(refactor.FixerError, self.rt, fixers=["bad_order"]) + + def test_refactor_string(self): + rt = self.rt() + input = "def parrot(): pass\n\n" + tree = rt.refactor_string(input, "<test>") + self.assertNotEqual(str(tree), input) + + input = "def f(): pass\n\n" + tree = rt.refactor_string(input, "<test>") + self.assertEqual(str(tree), input) + + def test_refactor_stdin(self): + + class MyRT(refactor.RefactoringTool): + + def print_output(self, lines): + diff_lines.extend(lines) + + diff_lines = [] + rt = MyRT(_DEFAULT_FIXERS) + save = sys.stdin + sys.stdin = io.StringIO("def parrot(): pass\n\n") + try: + rt.refactor_stdin() + finally: + sys.stdin = save + expected = """--- <stdin> (original) ++++ <stdin> (refactored) +@@ -1,2 +1,2 @@ +-def parrot(): pass ++def cheese(): pass""".splitlines() + self.assertEqual(diff_lines[:-1], expected) + + def test_refactor_file(self): + test_file = os.path.join(FIXER_DIR, "parrot_example.py") + backup = test_file + ".bak" + old_contents = open(test_file, "r").read() + rt = self.rt() + + rt.refactor_file(test_file) + self.assertEqual(old_contents, open(test_file, "r").read()) + + rt.refactor_file(test_file, True) + try: + self.assertNotEqual(old_contents, open(test_file, "r").read()) + self.assertTrue(os.path.exists(backup)) + self.assertEqual(old_contents, open(backup, "r").read()) + finally: + open(test_file, "w").write(old_contents) + try: + os.unlink(backup) + except OSError: + pass + + def test_refactor_docstring(self): + rt = self.rt() + + def example(): + """ + >>> example() + 42 + """ + out = rt.refactor_docstring(example.__doc__, "<test>") + self.assertEqual(out, example.__doc__) + + def parrot(): + """ + >>> def parrot(): + ... return 43 + """ + out = rt.refactor_docstring(parrot.__doc__, "<test>") + self.assertNotEqual(out, parrot.__doc__) + + def test_explicit(self): + from myfixes.fix_explicit import FixExplicit + + rt = self.rt(fixers=["myfixes.fix_explicit"]) + self.assertEqual(len(rt.post_order), 0) + + rt = self.rt(explicit=["myfixes.fix_explicit"]) + for fix in rt.post_order[None]: + if isinstance(fix, FixExplicit): + break + else: + self.fail("explicit fixer not loaded") |