python (3.11.7)
       1  """Tests for distutils.log"""
       2  
       3  import io
       4  import sys
       5  import unittest
       6  from test.support import swap_attr
       7  
       8  from distutils import log
       9  
      10  class ESC[4;38;5;81mTestLog(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      11      def test_non_ascii(self):
      12          # Issues #8663, #34421: test that non-encodable text is escaped with
      13          # backslashreplace error handler and encodable non-ASCII text is
      14          # output as is.
      15          for errors in ('strict', 'backslashreplace', 'surrogateescape',
      16                         'replace', 'ignore'):
      17              with self.subTest(errors=errors):
      18                  stdout = io.TextIOWrapper(io.BytesIO(),
      19                                            encoding='cp437', errors=errors)
      20                  stderr = io.TextIOWrapper(io.BytesIO(),
      21                                            encoding='cp437', errors=errors)
      22                  old_threshold = log.set_threshold(log.DEBUG)
      23                  try:
      24                      with swap_attr(sys, 'stdout', stdout), \
      25                           swap_attr(sys, 'stderr', stderr):
      26                          log.debug('Dεbug\tMėssãge')
      27                          log.fatal('Fαtal\tÈrrōr')
      28                  finally:
      29                      log.set_threshold(old_threshold)
      30  
      31                  stdout.seek(0)
      32                  self.assertEqual(stdout.read().rstrip(),
      33                          'Dεbug\tM?ss?ge' if errors == 'replace' else
      34                          'Dεbug\tMssge' if errors == 'ignore' else
      35                          'Dεbug\tM\\u0117ss\\xe3ge')
      36                  stderr.seek(0)
      37                  self.assertEqual(stderr.read().rstrip(),
      38                          'Fαtal\t?rr?r' if errors == 'replace' else
      39                          'Fαtal\trrr' if errors == 'ignore' else
      40                          'Fαtal\t\\xc8rr\\u014dr')
      41  
      42  if __name__ == "__main__":
      43      unittest.main()