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