123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- """Tests for scripts in the Tools directory.
- This file contains regression tests for some of the scripts found in the
- Tools directory of a Python checkout or tarball, such as reindent.py.
- """
- import os
- import sys
- import unittest
- import shutil
- import subprocess
- import sysconfig
- import tempfile
- import textwrap
- from test import test_support
- from test.script_helper import assert_python_ok, temp_dir
- if not sysconfig.is_python_build():
- # XXX some installers do contain the tools, should we detect that
- # and run the tests in that case too?
- raise unittest.SkipTest('test irrelevant for an installed Python')
- basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
- 'Tools')
- scriptsdir = os.path.join(basepath, 'scripts')
- class ReindentTests(unittest.TestCase):
- script = os.path.join(scriptsdir, 'reindent.py')
- def test_noargs(self):
- assert_python_ok(self.script)
- def test_help(self):
- rc, out, err = assert_python_ok(self.script, '-h')
- self.assertEqual(out, b'')
- self.assertGreater(err, b'')
- class PindentTests(unittest.TestCase):
- script = os.path.join(scriptsdir, 'pindent.py')
- def assertFileEqual(self, fn1, fn2):
- with open(fn1) as f1, open(fn2) as f2:
- self.assertEqual(f1.readlines(), f2.readlines())
- def pindent(self, source, *args):
- proc = subprocess.Popen(
- (sys.executable, self.script) + args,
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- universal_newlines=True)
- out, err = proc.communicate(source)
- self.assertIsNone(err)
- return out
- def lstriplines(self, data):
- return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n'
- def test_selftest(self):
- self.maxDiff = None
- with temp_dir() as directory:
- data_path = os.path.join(directory, '_test.py')
- with open(self.script) as f:
- closed = f.read()
- with open(data_path, 'w') as f:
- f.write(closed)
- rc, out, err = assert_python_ok(self.script, '-d', data_path)
- self.assertEqual(out, b'')
- self.assertEqual(err, b'')
- backup = data_path + '~'
- self.assertTrue(os.path.exists(backup))
- with open(backup) as f:
- self.assertEqual(f.read(), closed)
- with open(data_path) as f:
- clean = f.read()
- compile(clean, '_test.py', 'exec')
- self.assertEqual(self.pindent(clean, '-c'), closed)
- self.assertEqual(self.pindent(closed, '-d'), clean)
- rc, out, err = assert_python_ok(self.script, '-c', data_path)
- self.assertEqual(out, b'')
- self.assertEqual(err, b'')
- with open(backup) as f:
- self.assertEqual(f.read(), clean)
- with open(data_path) as f:
- self.assertEqual(f.read(), closed)
- broken = self.lstriplines(closed)
- with open(data_path, 'w') as f:
- f.write(broken)
- rc, out, err = assert_python_ok(self.script, '-r', data_path)
- self.assertEqual(out, b'')
- self.assertEqual(err, b'')
- with open(backup) as f:
- self.assertEqual(f.read(), broken)
- with open(data_path) as f:
- indented = f.read()
- compile(indented, '_test.py', 'exec')
- self.assertEqual(self.pindent(broken, '-r'), indented)
- def pindent_test(self, clean, closed):
- self.assertEqual(self.pindent(clean, '-c'), closed)
- self.assertEqual(self.pindent(closed, '-d'), clean)
- broken = self.lstriplines(closed)
- self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed)
- def test_statements(self):
- clean = textwrap.dedent("""\
- if a:
- pass
- if a:
- pass
- else:
- pass
- if a:
- pass
- elif:
- pass
- else:
- pass
- while a:
- break
- while a:
- break
- else:
- pass
- for i in a:
- break
- for i in a:
- break
- else:
- pass
- try:
- pass
- finally:
- pass
- try:
- pass
- except TypeError:
- pass
- except ValueError:
- pass
- else:
- pass
- try:
- pass
- except TypeError:
- pass
- except ValueError:
- pass
- finally:
- pass
- with a:
- pass
- class A:
- pass
- def f():
- pass
- """)
- closed = textwrap.dedent("""\
- if a:
- pass
- # end if
- if a:
- pass
- else:
- pass
- # end if
- if a:
- pass
- elif:
- pass
- else:
- pass
- # end if
- while a:
- break
- # end while
- while a:
- break
- else:
- pass
- # end while
- for i in a:
- break
- # end for
- for i in a:
- break
- else:
- pass
- # end for
- try:
- pass
- finally:
- pass
- # end try
- try:
- pass
- except TypeError:
- pass
- except ValueError:
- pass
- else:
- pass
- # end try
- try:
- pass
- except TypeError:
- pass
- except ValueError:
- pass
- finally:
- pass
- # end try
- with a:
- pass
- # end with
- class A:
- pass
- # end class A
- def f():
- pass
- # end def f
- """)
- self.pindent_test(clean, closed)
- def test_multilevel(self):
- clean = textwrap.dedent("""\
- def foobar(a, b):
- if a == b:
- a = a+1
- elif a < b:
- b = b-1
- if b > a: a = a-1
- else:
- print 'oops!'
- """)
- closed = textwrap.dedent("""\
- def foobar(a, b):
- if a == b:
- a = a+1
- elif a < b:
- b = b-1
- if b > a: a = a-1
- # end if
- else:
- print 'oops!'
- # end if
- # end def foobar
- """)
- self.pindent_test(clean, closed)
- def test_preserve_indents(self):
- clean = textwrap.dedent("""\
- if a:
- if b:
- pass
- """)
- closed = textwrap.dedent("""\
- if a:
- if b:
- pass
- # end if
- # end if
- """)
- self.assertEqual(self.pindent(clean, '-c'), closed)
- self.assertEqual(self.pindent(closed, '-d'), clean)
- broken = self.lstriplines(closed)
- self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed)
- clean = textwrap.dedent("""\
- if a:
- \tif b:
- \t\tpass
- """)
- closed = textwrap.dedent("""\
- if a:
- \tif b:
- \t\tpass
- \t# end if
- # end if
- """)
- self.assertEqual(self.pindent(clean, '-c'), closed)
- self.assertEqual(self.pindent(closed, '-d'), clean)
- broken = self.lstriplines(closed)
- self.assertEqual(self.pindent(broken, '-r'), closed)
- def test_escaped_newline(self):
- clean = textwrap.dedent("""\
- class\\
- \\
- A:
- def\
- \\
- f:
- pass
- """)
- closed = textwrap.dedent("""\
- class\\
- \\
- A:
- def\
- \\
- f:
- pass
- # end def f
- # end class A
- """)
- self.assertEqual(self.pindent(clean, '-c'), closed)
- self.assertEqual(self.pindent(closed, '-d'), clean)
- def test_empty_line(self):
- clean = textwrap.dedent("""\
- if a:
- pass
- """)
- closed = textwrap.dedent("""\
- if a:
- pass
- # end if
- """)
- self.pindent_test(clean, closed)
- def test_oneline(self):
- clean = textwrap.dedent("""\
- if a: pass
- """)
- closed = textwrap.dedent("""\
- if a: pass
- # end if
- """)
- self.pindent_test(clean, closed)
- def test_main():
- test_support.run_unittest(*[obj for obj in globals().values()
- if isinstance(obj, type)])
- if __name__ == '__main__':
- unittest.main()
|