github.com/grumpyhome/grumpy@v0.3.1-0.20201208125205-7b775405bdf1/grumpy-runtime-src/third_party/stdlib/test/test_quopri.py (about)

     1  from test import test_support
     2  import unittest
     3  
     4  import sys, cStringIO #, subprocess
     5  import quopri
     6  
     7  
     8  
     9  ENCSAMPLE = """\
    10  Here's a bunch of special=20
    11  
    12  =A1=A2=A3=A4=A5=A6=A7=A8=A9
    13  =AA=AB=AC=AD=AE=AF=B0=B1=B2=B3
    14  =B4=B5=B6=B7=B8=B9=BA=BB=BC=BD=BE
    15  =BF=C0=C1=C2=C3=C4=C5=C6
    16  =C7=C8=C9=CA=CB=CC=CD=CE=CF
    17  =D0=D1=D2=D3=D4=D5=D6=D7
    18  =D8=D9=DA=DB=DC=DD=DE=DF
    19  =E0=E1=E2=E3=E4=E5=E6=E7
    20  =E8=E9=EA=EB=EC=ED=EE=EF
    21  =F0=F1=F2=F3=F4=F5=F6=F7
    22  =F8=F9=FA=FB=FC=FD=FE=FF
    23  
    24  characters... have fun!
    25  """
    26  
    27  # First line ends with a space
    28  DECSAMPLE = "Here's a bunch of special \n" + \
    29  """\
    30  
    31  \xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9
    32  \xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3
    33  \xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe
    34  \xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6
    35  \xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf
    36  \xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7
    37  \xd8\xd9\xda\xdb\xdc\xdd\xde\xdf
    38  \xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7
    39  \xe8\xe9\xea\xeb\xec\xed\xee\xef
    40  \xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7
    41  \xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
    42  
    43  characters... have fun!
    44  """
    45  
    46  
    47  def withpythonimplementation(testfunc):
    48      def newtest(self):
    49          # Test default implementation
    50          testfunc(self)
    51          # Test Python implementation
    52          if quopri.b2a_qp is not None or quopri.a2b_qp is not None:
    53              oldencode = quopri.b2a_qp
    54              olddecode = quopri.a2b_qp
    55              try:
    56                  quopri.b2a_qp = None
    57                  quopri.a2b_qp = None
    58                  testfunc(self)
    59              finally:
    60                  quopri.b2a_qp = oldencode
    61                  quopri.a2b_qp = olddecode
    62      #newtest.__name__ = testfunc.__name__
    63      return newtest
    64  
    65  class QuopriTestCase(unittest.TestCase):
    66      # Each entry is a tuple of (plaintext, encoded string).  These strings are
    67      # used in the "quotetabs=0" tests.
    68      STRINGS = (
    69          # Some normal strings
    70          ('hello', 'hello'),
    71          ('''hello
    72          there
    73          world''', '''hello
    74          there
    75          world'''),
    76          ('''hello
    77          there
    78          world
    79  ''', '''hello
    80          there
    81          world
    82  '''),
    83          ('\201\202\203', '=81=82=83'),
    84          # Add some trailing MUST QUOTE strings
    85          ('hello ', 'hello=20'),
    86          ('hello\t', 'hello=09'),
    87          # Some long lines.  First, a single line of 108 characters
    88          ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    89           '''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=D8=D9=DA=DB=DC=DD=DE=DFx=
    90  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'''),
    91          # A line of exactly 76 characters, no soft line break should be needed
    92          ('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    93          'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'),
    94          # A line of 77 characters, forcing a soft line break at position 75,
    95          # and a second line of exactly 2 characters (because the soft line
    96          # break `=' sign counts against the line length limit).
    97          ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
    98           '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
    99  zz'''),
   100          # A line of 151 characters, forcing a soft line break at position 75,
   101          # with a second line of exactly 76 characters and no trailing =
   102          ('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
   103           '''zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
   104  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''),
   105          # A string containing a hard line break, but which the first line is
   106          # 151 characters and the second line is exactly 76 characters.  This
   107          # should leave us with three lines, the first which has a soft line
   108          # break, and which the second and third do not.
   109          ('''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
   110  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz''',
   111           '''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
   112  yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
   113  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'''),
   114          # Now some really complex stuff ;)
   115          (DECSAMPLE, ENCSAMPLE),
   116          )
   117  
   118      # These are used in the "quotetabs=1" tests.
   119      ESTRINGS = (
   120          ('hello world', 'hello=20world'),
   121          ('hello\tworld', 'hello=09world'),
   122          )
   123  
   124      # These are used in the "header=1" tests.
   125      HSTRINGS = (
   126          ('hello world', 'hello_world'),
   127          ('hello_world', 'hello=5Fworld'),
   128          )
   129  
   130      @withpythonimplementation
   131      def test_encodestring(self):
   132          for p, e in self.STRINGS:
   133              self.assertTrue(quopri.encodestring(p) == e)
   134  
   135      @withpythonimplementation
   136      def test_decodestring(self):
   137          for p, e in self.STRINGS:
   138              self.assertTrue(quopri.decodestring(e) == p)
   139  
   140      @withpythonimplementation
   141      def test_idempotent_string(self):
   142          for p, e in self.STRINGS:
   143              self.assertTrue(quopri.decodestring(quopri.encodestring(e)) == e)
   144  
   145      @withpythonimplementation
   146      def test_encode(self):
   147          for p, e in self.STRINGS:
   148              infp = cStringIO.StringIO(p)
   149              outfp = cStringIO.StringIO()
   150              quopri.encode(infp, outfp, quotetabs=False)
   151              self.assertTrue(outfp.getvalue() == e)
   152  
   153      @withpythonimplementation
   154      def test_decode(self):
   155          for p, e in self.STRINGS:
   156              infp = cStringIO.StringIO(e)
   157              outfp = cStringIO.StringIO()
   158              quopri.decode(infp, outfp)
   159              self.assertTrue(outfp.getvalue() == p)
   160  
   161      @withpythonimplementation
   162      def test_embedded_ws(self):
   163          for p, e in self.ESTRINGS:
   164              self.assertTrue(quopri.encodestring(p, quotetabs=True) == e)
   165              self.assertTrue(quopri.decodestring(e) == p)
   166  
   167      @withpythonimplementation
   168      def test_encode_header(self):
   169          for p, e in self.HSTRINGS:
   170              self.assertTrue(quopri.encodestring(p, header=True) == e)
   171  
   172      @withpythonimplementation
   173      def test_decode_header(self):
   174          for p, e in self.HSTRINGS:
   175              self.assertTrue(quopri.decodestring(e, header=True) == p)
   176  
   177      @unittest.expectedFailure
   178      def test_scriptencode(self):
   179          (p, e) = self.STRINGS[-1]
   180          process = subprocess.Popen([sys.executable, "-mquopri"],
   181                                     stdin=subprocess.PIPE, stdout=subprocess.PIPE)
   182          self.addCleanup(process.stdout.close)
   183          cout, cerr = process.communicate(p)
   184          # On Windows, Python will output the result to stdout using
   185          # CRLF, as the mode of stdout is text mode. To compare this
   186          # with the expected result, we need to do a line-by-line comparison.
   187          self.assertEqual(cout.splitlines(), e.splitlines())
   188  
   189      @unittest.expectedFailure
   190      def test_scriptdecode(self):
   191          (p, e) = self.STRINGS[-1]
   192          process = subprocess.Popen([sys.executable, "-mquopri", "-d"],
   193                                     stdin=subprocess.PIPE, stdout=subprocess.PIPE)
   194          self.addCleanup(process.stdout.close)
   195          cout, cerr = process.communicate(e)
   196          self.assertEqual(cout.splitlines(), p.splitlines())
   197  
   198  def test_main():
   199      test_support.run_unittest(QuopriTestCase)
   200  
   201  
   202  if __name__ == "__main__":
   203      test_main()