17db96d56Sopenharmony_ci"""Tests for the pindent script in the Tools directory."""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport os
47db96d56Sopenharmony_ciimport sys
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_ciimport subprocess
77db96d56Sopenharmony_ciimport textwrap
87db96d56Sopenharmony_cifrom test import support
97db96d56Sopenharmony_cifrom test.support import os_helper
107db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_ok
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cifrom test.test_tools import scriptsdir, skip_if_missing
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciskip_if_missing()
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciclass PindentTests(unittest.TestCase):
187db96d56Sopenharmony_ci    script = os.path.join(scriptsdir, 'pindent.py')
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    def assertFileEqual(self, fn1, fn2):
217db96d56Sopenharmony_ci        with open(fn1) as f1, open(fn2) as f2:
227db96d56Sopenharmony_ci            self.assertEqual(f1.readlines(), f2.readlines())
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    def pindent(self, source, *args):
257db96d56Sopenharmony_ci        with subprocess.Popen(
267db96d56Sopenharmony_ci                (sys.executable, self.script) + args,
277db96d56Sopenharmony_ci                stdin=subprocess.PIPE, stdout=subprocess.PIPE,
287db96d56Sopenharmony_ci                universal_newlines=True) as proc:
297db96d56Sopenharmony_ci            out, err = proc.communicate(source)
307db96d56Sopenharmony_ci        self.assertIsNone(err)
317db96d56Sopenharmony_ci        return out
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def lstriplines(self, data):
347db96d56Sopenharmony_ci        return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n'
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci    def test_selftest(self):
377db96d56Sopenharmony_ci        self.maxDiff = None
387db96d56Sopenharmony_ci        with os_helper.temp_dir() as directory:
397db96d56Sopenharmony_ci            data_path = os.path.join(directory, '_test.py')
407db96d56Sopenharmony_ci            with open(self.script, encoding='utf-8') as f:
417db96d56Sopenharmony_ci                closed = f.read()
427db96d56Sopenharmony_ci            with open(data_path, 'w', encoding='utf-8') as f:
437db96d56Sopenharmony_ci                f.write(closed)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci            rc, out, err = assert_python_ok(self.script, '-d', data_path)
467db96d56Sopenharmony_ci            self.assertEqual(out, b'')
477db96d56Sopenharmony_ci            self.assertEqual(err, b'')
487db96d56Sopenharmony_ci            backup = data_path + '~'
497db96d56Sopenharmony_ci            self.assertTrue(os.path.exists(backup))
507db96d56Sopenharmony_ci            with open(backup, encoding='utf-8') as f:
517db96d56Sopenharmony_ci                self.assertEqual(f.read(), closed)
527db96d56Sopenharmony_ci            with open(data_path, encoding='utf-8') as f:
537db96d56Sopenharmony_ci                clean = f.read()
547db96d56Sopenharmony_ci            compile(clean, '_test.py', 'exec')
557db96d56Sopenharmony_ci            self.assertEqual(self.pindent(clean, '-c'), closed)
567db96d56Sopenharmony_ci            self.assertEqual(self.pindent(closed, '-d'), clean)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci            rc, out, err = assert_python_ok(self.script, '-c', data_path)
597db96d56Sopenharmony_ci            self.assertEqual(out, b'')
607db96d56Sopenharmony_ci            self.assertEqual(err, b'')
617db96d56Sopenharmony_ci            with open(backup, encoding='utf-8') as f:
627db96d56Sopenharmony_ci                self.assertEqual(f.read(), clean)
637db96d56Sopenharmony_ci            with open(data_path, encoding='utf-8') as f:
647db96d56Sopenharmony_ci                self.assertEqual(f.read(), closed)
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci            broken = self.lstriplines(closed)
677db96d56Sopenharmony_ci            with open(data_path, 'w', encoding='utf-8') as f:
687db96d56Sopenharmony_ci                f.write(broken)
697db96d56Sopenharmony_ci            rc, out, err = assert_python_ok(self.script, '-r', data_path)
707db96d56Sopenharmony_ci            self.assertEqual(out, b'')
717db96d56Sopenharmony_ci            self.assertEqual(err, b'')
727db96d56Sopenharmony_ci            with open(backup, encoding='utf-8') as f:
737db96d56Sopenharmony_ci                self.assertEqual(f.read(), broken)
747db96d56Sopenharmony_ci            with open(data_path, encoding='utf-8') as f:
757db96d56Sopenharmony_ci                indented = f.read()
767db96d56Sopenharmony_ci            compile(indented, '_test.py', 'exec')
777db96d56Sopenharmony_ci            self.assertEqual(self.pindent(broken, '-r'), indented)
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    def pindent_test(self, clean, closed):
807db96d56Sopenharmony_ci        self.assertEqual(self.pindent(clean, '-c'), closed)
817db96d56Sopenharmony_ci        self.assertEqual(self.pindent(closed, '-d'), clean)
827db96d56Sopenharmony_ci        broken = self.lstriplines(closed)
837db96d56Sopenharmony_ci        self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed)
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    def test_statements(self):
867db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
877db96d56Sopenharmony_ci            if a:
887db96d56Sopenharmony_ci                pass
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci            if a:
917db96d56Sopenharmony_ci                pass
927db96d56Sopenharmony_ci            else:
937db96d56Sopenharmony_ci                pass
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci            if a:
967db96d56Sopenharmony_ci                pass
977db96d56Sopenharmony_ci            elif:
987db96d56Sopenharmony_ci                pass
997db96d56Sopenharmony_ci            else:
1007db96d56Sopenharmony_ci                pass
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci            while a:
1037db96d56Sopenharmony_ci                break
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci            while a:
1067db96d56Sopenharmony_ci                break
1077db96d56Sopenharmony_ci            else:
1087db96d56Sopenharmony_ci                pass
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci            for i in a:
1117db96d56Sopenharmony_ci                break
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci            for i in a:
1147db96d56Sopenharmony_ci                break
1157db96d56Sopenharmony_ci            else:
1167db96d56Sopenharmony_ci                pass
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci            try:
1197db96d56Sopenharmony_ci                pass
1207db96d56Sopenharmony_ci            finally:
1217db96d56Sopenharmony_ci                pass
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci            try:
1247db96d56Sopenharmony_ci                pass
1257db96d56Sopenharmony_ci            except TypeError:
1267db96d56Sopenharmony_ci                pass
1277db96d56Sopenharmony_ci            except ValueError:
1287db96d56Sopenharmony_ci                pass
1297db96d56Sopenharmony_ci            else:
1307db96d56Sopenharmony_ci                pass
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci            try:
1337db96d56Sopenharmony_ci                pass
1347db96d56Sopenharmony_ci            except TypeError:
1357db96d56Sopenharmony_ci                pass
1367db96d56Sopenharmony_ci            except ValueError:
1377db96d56Sopenharmony_ci                pass
1387db96d56Sopenharmony_ci            finally:
1397db96d56Sopenharmony_ci                pass
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci            with a:
1427db96d56Sopenharmony_ci                pass
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci            class A:
1457db96d56Sopenharmony_ci                pass
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci            def f():
1487db96d56Sopenharmony_ci                pass
1497db96d56Sopenharmony_ci            """)
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
1527db96d56Sopenharmony_ci            if a:
1537db96d56Sopenharmony_ci                pass
1547db96d56Sopenharmony_ci            # end if
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci            if a:
1577db96d56Sopenharmony_ci                pass
1587db96d56Sopenharmony_ci            else:
1597db96d56Sopenharmony_ci                pass
1607db96d56Sopenharmony_ci            # end if
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci            if a:
1637db96d56Sopenharmony_ci                pass
1647db96d56Sopenharmony_ci            elif:
1657db96d56Sopenharmony_ci                pass
1667db96d56Sopenharmony_ci            else:
1677db96d56Sopenharmony_ci                pass
1687db96d56Sopenharmony_ci            # end if
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci            while a:
1717db96d56Sopenharmony_ci                break
1727db96d56Sopenharmony_ci            # end while
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci            while a:
1757db96d56Sopenharmony_ci                break
1767db96d56Sopenharmony_ci            else:
1777db96d56Sopenharmony_ci                pass
1787db96d56Sopenharmony_ci            # end while
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci            for i in a:
1817db96d56Sopenharmony_ci                break
1827db96d56Sopenharmony_ci            # end for
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci            for i in a:
1857db96d56Sopenharmony_ci                break
1867db96d56Sopenharmony_ci            else:
1877db96d56Sopenharmony_ci                pass
1887db96d56Sopenharmony_ci            # end for
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci            try:
1917db96d56Sopenharmony_ci                pass
1927db96d56Sopenharmony_ci            finally:
1937db96d56Sopenharmony_ci                pass
1947db96d56Sopenharmony_ci            # end try
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci            try:
1977db96d56Sopenharmony_ci                pass
1987db96d56Sopenharmony_ci            except TypeError:
1997db96d56Sopenharmony_ci                pass
2007db96d56Sopenharmony_ci            except ValueError:
2017db96d56Sopenharmony_ci                pass
2027db96d56Sopenharmony_ci            else:
2037db96d56Sopenharmony_ci                pass
2047db96d56Sopenharmony_ci            # end try
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci            try:
2077db96d56Sopenharmony_ci                pass
2087db96d56Sopenharmony_ci            except TypeError:
2097db96d56Sopenharmony_ci                pass
2107db96d56Sopenharmony_ci            except ValueError:
2117db96d56Sopenharmony_ci                pass
2127db96d56Sopenharmony_ci            finally:
2137db96d56Sopenharmony_ci                pass
2147db96d56Sopenharmony_ci            # end try
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci            with a:
2177db96d56Sopenharmony_ci                pass
2187db96d56Sopenharmony_ci            # end with
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci            class A:
2217db96d56Sopenharmony_ci                pass
2227db96d56Sopenharmony_ci            # end class A
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci            def f():
2257db96d56Sopenharmony_ci                pass
2267db96d56Sopenharmony_ci            # end def f
2277db96d56Sopenharmony_ci            """)
2287db96d56Sopenharmony_ci        self.pindent_test(clean, closed)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def test_multilevel(self):
2317db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
2327db96d56Sopenharmony_ci            def foobar(a, b):
2337db96d56Sopenharmony_ci                if a == b:
2347db96d56Sopenharmony_ci                    a = a+1
2357db96d56Sopenharmony_ci                elif a < b:
2367db96d56Sopenharmony_ci                    b = b-1
2377db96d56Sopenharmony_ci                    if b > a: a = a-1
2387db96d56Sopenharmony_ci                else:
2397db96d56Sopenharmony_ci                    print 'oops!'
2407db96d56Sopenharmony_ci            """)
2417db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
2427db96d56Sopenharmony_ci            def foobar(a, b):
2437db96d56Sopenharmony_ci                if a == b:
2447db96d56Sopenharmony_ci                    a = a+1
2457db96d56Sopenharmony_ci                elif a < b:
2467db96d56Sopenharmony_ci                    b = b-1
2477db96d56Sopenharmony_ci                    if b > a: a = a-1
2487db96d56Sopenharmony_ci                    # end if
2497db96d56Sopenharmony_ci                else:
2507db96d56Sopenharmony_ci                    print 'oops!'
2517db96d56Sopenharmony_ci                # end if
2527db96d56Sopenharmony_ci            # end def foobar
2537db96d56Sopenharmony_ci            """)
2547db96d56Sopenharmony_ci        self.pindent_test(clean, closed)
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    def test_preserve_indents(self):
2577db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
2587db96d56Sopenharmony_ci            if a:
2597db96d56Sopenharmony_ci                     if b:
2607db96d56Sopenharmony_ci                              pass
2617db96d56Sopenharmony_ci            """)
2627db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
2637db96d56Sopenharmony_ci            if a:
2647db96d56Sopenharmony_ci                     if b:
2657db96d56Sopenharmony_ci                              pass
2667db96d56Sopenharmony_ci                     # end if
2677db96d56Sopenharmony_ci            # end if
2687db96d56Sopenharmony_ci            """)
2697db96d56Sopenharmony_ci        self.assertEqual(self.pindent(clean, '-c'), closed)
2707db96d56Sopenharmony_ci        self.assertEqual(self.pindent(closed, '-d'), clean)
2717db96d56Sopenharmony_ci        broken = self.lstriplines(closed)
2727db96d56Sopenharmony_ci        self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed)
2737db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
2747db96d56Sopenharmony_ci            if a:
2757db96d56Sopenharmony_ci            \tif b:
2767db96d56Sopenharmony_ci            \t\tpass
2777db96d56Sopenharmony_ci            """)
2787db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
2797db96d56Sopenharmony_ci            if a:
2807db96d56Sopenharmony_ci            \tif b:
2817db96d56Sopenharmony_ci            \t\tpass
2827db96d56Sopenharmony_ci            \t# end if
2837db96d56Sopenharmony_ci            # end if
2847db96d56Sopenharmony_ci            """)
2857db96d56Sopenharmony_ci        self.assertEqual(self.pindent(clean, '-c'), closed)
2867db96d56Sopenharmony_ci        self.assertEqual(self.pindent(closed, '-d'), clean)
2877db96d56Sopenharmony_ci        broken = self.lstriplines(closed)
2887db96d56Sopenharmony_ci        self.assertEqual(self.pindent(broken, '-r'), closed)
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    def test_escaped_newline(self):
2917db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
2927db96d56Sopenharmony_ci            class\\
2937db96d56Sopenharmony_ci            \\
2947db96d56Sopenharmony_ci             A:
2957db96d56Sopenharmony_ci               def\
2967db96d56Sopenharmony_ci            \\
2977db96d56Sopenharmony_ci            f:
2987db96d56Sopenharmony_ci                  pass
2997db96d56Sopenharmony_ci            """)
3007db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
3017db96d56Sopenharmony_ci            class\\
3027db96d56Sopenharmony_ci            \\
3037db96d56Sopenharmony_ci             A:
3047db96d56Sopenharmony_ci               def\
3057db96d56Sopenharmony_ci            \\
3067db96d56Sopenharmony_ci            f:
3077db96d56Sopenharmony_ci                  pass
3087db96d56Sopenharmony_ci               # end def f
3097db96d56Sopenharmony_ci            # end class A
3107db96d56Sopenharmony_ci            """)
3117db96d56Sopenharmony_ci        self.assertEqual(self.pindent(clean, '-c'), closed)
3127db96d56Sopenharmony_ci        self.assertEqual(self.pindent(closed, '-d'), clean)
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci    def test_empty_line(self):
3157db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
3167db96d56Sopenharmony_ci            if a:
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci                pass
3197db96d56Sopenharmony_ci            """)
3207db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
3217db96d56Sopenharmony_ci            if a:
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci                pass
3247db96d56Sopenharmony_ci            # end if
3257db96d56Sopenharmony_ci            """)
3267db96d56Sopenharmony_ci        self.pindent_test(clean, closed)
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci    def test_oneline(self):
3297db96d56Sopenharmony_ci        clean = textwrap.dedent("""\
3307db96d56Sopenharmony_ci            if a: pass
3317db96d56Sopenharmony_ci            """)
3327db96d56Sopenharmony_ci        closed = textwrap.dedent("""\
3337db96d56Sopenharmony_ci            if a: pass
3347db96d56Sopenharmony_ci            # end if
3357db96d56Sopenharmony_ci            """)
3367db96d56Sopenharmony_ci        self.pindent_test(clean, closed)
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ciif __name__ == '__main__':
3407db96d56Sopenharmony_ci    unittest.main()
341