(root)/
Python-3.11.7/
Lib/
test/
test_tools/
test_pindent.py
       1  """Tests for the pindent script in the Tools directory."""
       2  
       3  import os
       4  import sys
       5  import unittest
       6  import subprocess
       7  import textwrap
       8  from test import support
       9  from test.support import os_helper
      10  from test.support.script_helper import assert_python_ok
      11  
      12  from test.test_tools import scriptsdir, skip_if_missing
      13  
      14  skip_if_missing()
      15  
      16  
      17  class ESC[4;38;5;81mPindentTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      18      script = os.path.join(scriptsdir, 'pindent.py')
      19  
      20      def assertFileEqual(self, fn1, fn2):
      21          with open(fn1) as f1, open(fn2) as f2:
      22              self.assertEqual(f1.readlines(), f2.readlines())
      23  
      24      def pindent(self, source, *args):
      25          with subprocess.Popen(
      26                  (sys.executable, self.script) + args,
      27                  stdin=subprocess.PIPE, stdout=subprocess.PIPE,
      28                  universal_newlines=True) as proc:
      29              out, err = proc.communicate(source)
      30          self.assertIsNone(err)
      31          return out
      32  
      33      def lstriplines(self, data):
      34          return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n'
      35  
      36      def test_selftest(self):
      37          self.maxDiff = None
      38          with os_helper.temp_dir() as directory:
      39              data_path = os.path.join(directory, '_test.py')
      40              with open(self.script, encoding='utf-8') as f:
      41                  closed = f.read()
      42              with open(data_path, 'w', encoding='utf-8') as f:
      43                  f.write(closed)
      44  
      45              rc, out, err = assert_python_ok(self.script, '-d', data_path)
      46              self.assertEqual(out, b'')
      47              self.assertEqual(err, b'')
      48              backup = data_path + '~'
      49              self.assertTrue(os.path.exists(backup))
      50              with open(backup, encoding='utf-8') as f:
      51                  self.assertEqual(f.read(), closed)
      52              with open(data_path, encoding='utf-8') as f:
      53                  clean = f.read()
      54              compile(clean, '_test.py', 'exec')
      55              self.assertEqual(self.pindent(clean, '-c'), closed)
      56              self.assertEqual(self.pindent(closed, '-d'), clean)
      57  
      58              rc, out, err = assert_python_ok(self.script, '-c', data_path)
      59              self.assertEqual(out, b'')
      60              self.assertEqual(err, b'')
      61              with open(backup, encoding='utf-8') as f:
      62                  self.assertEqual(f.read(), clean)
      63              with open(data_path, encoding='utf-8') as f:
      64                  self.assertEqual(f.read(), closed)
      65  
      66              broken = self.lstriplines(closed)
      67              with open(data_path, 'w', encoding='utf-8') as f:
      68                  f.write(broken)
      69              rc, out, err = assert_python_ok(self.script, '-r', data_path)
      70              self.assertEqual(out, b'')
      71              self.assertEqual(err, b'')
      72              with open(backup, encoding='utf-8') as f:
      73                  self.assertEqual(f.read(), broken)
      74              with open(data_path, encoding='utf-8') as f:
      75                  indented = f.read()
      76              compile(indented, '_test.py', 'exec')
      77              self.assertEqual(self.pindent(broken, '-r'), indented)
      78  
      79      def pindent_test(self, clean, closed):
      80          self.assertEqual(self.pindent(clean, '-c'), closed)
      81          self.assertEqual(self.pindent(closed, '-d'), clean)
      82          broken = self.lstriplines(closed)
      83          self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed)
      84  
      85      def test_statements(self):
      86          clean = textwrap.dedent("""\
      87              if a:
      88                  pass
      89  
      90              if a:
      91                  pass
      92              else:
      93                  pass
      94  
      95              if a:
      96                  pass
      97              elif:
      98                  pass
      99              else:
     100                  pass
     101  
     102              while a:
     103                  break
     104  
     105              while a:
     106                  break
     107              else:
     108                  pass
     109  
     110              for i in a:
     111                  break
     112  
     113              for i in a:
     114                  break
     115              else:
     116                  pass
     117  
     118              try:
     119                  pass
     120              finally:
     121                  pass
     122  
     123              try:
     124                  pass
     125              except TypeError:
     126                  pass
     127              except ValueError:
     128                  pass
     129              else:
     130                  pass
     131  
     132              try:
     133                  pass
     134              except TypeError:
     135                  pass
     136              except ValueError:
     137                  pass
     138              finally:
     139                  pass
     140  
     141              with a:
     142                  pass
     143  
     144              class A:
     145                  pass
     146  
     147              def f():
     148                  pass
     149              """)
     150  
     151          closed = textwrap.dedent("""\
     152              if a:
     153                  pass
     154              # end if
     155  
     156              if a:
     157                  pass
     158              else:
     159                  pass
     160              # end if
     161  
     162              if a:
     163                  pass
     164              elif:
     165                  pass
     166              else:
     167                  pass
     168              # end if
     169  
     170              while a:
     171                  break
     172              # end while
     173  
     174              while a:
     175                  break
     176              else:
     177                  pass
     178              # end while
     179  
     180              for i in a:
     181                  break
     182              # end for
     183  
     184              for i in a:
     185                  break
     186              else:
     187                  pass
     188              # end for
     189  
     190              try:
     191                  pass
     192              finally:
     193                  pass
     194              # end try
     195  
     196              try:
     197                  pass
     198              except TypeError:
     199                  pass
     200              except ValueError:
     201                  pass
     202              else:
     203                  pass
     204              # end try
     205  
     206              try:
     207                  pass
     208              except TypeError:
     209                  pass
     210              except ValueError:
     211                  pass
     212              finally:
     213                  pass
     214              # end try
     215  
     216              with a:
     217                  pass
     218              # end with
     219  
     220              class A:
     221                  pass
     222              # end class A
     223  
     224              def f():
     225                  pass
     226              # end def f
     227              """)
     228          self.pindent_test(clean, closed)
     229  
     230      def test_multilevel(self):
     231          clean = textwrap.dedent("""\
     232              def foobar(a, b):
     233                  if a == b:
     234                      a = a+1
     235                  elif a < b:
     236                      b = b-1
     237                      if b > a: a = a-1
     238                  else:
     239                      print 'oops!'
     240              """)
     241          closed = textwrap.dedent("""\
     242              def foobar(a, b):
     243                  if a == b:
     244                      a = a+1
     245                  elif a < b:
     246                      b = b-1
     247                      if b > a: a = a-1
     248                      # end if
     249                  else:
     250                      print 'oops!'
     251                  # end if
     252              # end def foobar
     253              """)
     254          self.pindent_test(clean, closed)
     255  
     256      def test_preserve_indents(self):
     257          clean = textwrap.dedent("""\
     258              if a:
     259                       if b:
     260                                pass
     261              """)
     262          closed = textwrap.dedent("""\
     263              if a:
     264                       if b:
     265                                pass
     266                       # end if
     267              # end if
     268              """)
     269          self.assertEqual(self.pindent(clean, '-c'), closed)
     270          self.assertEqual(self.pindent(closed, '-d'), clean)
     271          broken = self.lstriplines(closed)
     272          self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed)
     273          clean = textwrap.dedent("""\
     274              if a:
     275              \tif b:
     276              \t\tpass
     277              """)
     278          closed = textwrap.dedent("""\
     279              if a:
     280              \tif b:
     281              \t\tpass
     282              \t# end if
     283              # end if
     284              """)
     285          self.assertEqual(self.pindent(clean, '-c'), closed)
     286          self.assertEqual(self.pindent(closed, '-d'), clean)
     287          broken = self.lstriplines(closed)
     288          self.assertEqual(self.pindent(broken, '-r'), closed)
     289  
     290      def test_escaped_newline(self):
     291          clean = textwrap.dedent("""\
     292              class\\
     293              \\
     294               A:
     295                 def\
     296              \\
     297              f:
     298                    pass
     299              """)
     300          closed = textwrap.dedent("""\
     301              class\\
     302              \\
     303               A:
     304                 def\
     305              \\
     306              f:
     307                    pass
     308                 # end def f
     309              # end class A
     310              """)
     311          self.assertEqual(self.pindent(clean, '-c'), closed)
     312          self.assertEqual(self.pindent(closed, '-d'), clean)
     313  
     314      def test_empty_line(self):
     315          clean = textwrap.dedent("""\
     316              if a:
     317  
     318                  pass
     319              """)
     320          closed = textwrap.dedent("""\
     321              if a:
     322  
     323                  pass
     324              # end if
     325              """)
     326          self.pindent_test(clean, closed)
     327  
     328      def test_oneline(self):
     329          clean = textwrap.dedent("""\
     330              if a: pass
     331              """)
     332          closed = textwrap.dedent("""\
     333              if a: pass
     334              # end if
     335              """)
     336          self.pindent_test(clean, closed)
     337  
     338  
     339  if __name__ == '__main__':
     340      unittest.main()