]> granicus.if.org Git - python/commitdiff
Add tests for issue #18183.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 12 Jun 2013 06:28:20 +0000 (09:28 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 12 Jun 2013 06:28:20 +0000 (09:28 +0300)
1  2 
Lib/test/test_unicode.py

index bc346115f2bfc8f58cc79f4cf27debe13a8cef9a,2e3014541437f4a1a144732491b3222dd19cdbbc..382b4630934d3b8f005bff9a6a5d60b82288bae0
@@@ -2036,179 -2022,45 +2044,182 @@@ class UnicodeTest(string_tests.CommonTe
              PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
  
          # test "%c"
 -        self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0xabcd)), '\uabcd')
 -        self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0x10ffff)), '\U0010ffff')
 +        check_format('\uabcd',
 +                     b'%c', c_int(0xabcd))
 +        check_format('\U0010ffff',
 +                     b'%c', c_int(0x10ffff))
+         # Issue #18183
 -        self.assertEqual(
 -            PyUnicode_FromFormat(b'%c%c', c_int(0x10000), c_int(0x100000)),
 -            '\U00010000\U00100000')
++        check_format('\U00010000\U00100000',
++                     b'%c%c', c_int(0x10000), c_int(0x100000))
  
          # test "%"
 -        self.assertEqual(PyUnicode_FromFormat(b'%'), '%')
 -        self.assertEqual(PyUnicode_FromFormat(b'%%'), '%')
 -        self.assertEqual(PyUnicode_FromFormat(b'%%s'), '%s')
 -        self.assertEqual(PyUnicode_FromFormat(b'[%%]'), '[%]')
 -        self.assertEqual(PyUnicode_FromFormat(b'%%%s', b'abc'), '%abc')
 +        check_format('%',
 +                     b'%')
 +        check_format('%',
 +                     b'%%')
 +        check_format('%s',
 +                     b'%%s')
 +        check_format('[%]',
 +                     b'[%%]')
 +        check_format('%abc',
 +                     b'%%%s', b'abc')
 +
 +        # truncated string
 +        check_format('abc',
 +                     b'%.3s', b'abcdef')
 +        check_format('abc[\ufffd',
 +                     b'%.5s', 'abc[\u20ac]'.encode('utf8'))
 +        check_format("'\\u20acABC'",
 +                     b'%A', '\u20acABC')
 +        check_format("'\\u20",
 +                     b'%.5A', '\u20acABCDEF')
 +        check_format("'\u20acABC'",
 +                     b'%R', '\u20acABC')
 +        check_format("'\u20acA",
 +                     b'%.3R', '\u20acABCDEF')
 +        check_format('\u20acAB',
 +                     b'%.3S', '\u20acABCDEF')
 +        check_format('\u20acAB',
 +                     b'%.3U', '\u20acABCDEF')
 +        check_format('\u20acAB',
 +                     b'%.3V', '\u20acABCDEF', None)
 +        check_format('abc[\ufffd',
 +                     b'%.5V', None, 'abc[\u20ac]'.encode('utf8'))
 +
 +        # following tests comes from #7330
 +        # test width modifier and precision modifier with %S
 +        check_format("repr=  abc",
 +                     b'repr=%5S', 'abc')
 +        check_format("repr=ab",
 +                     b'repr=%.2S', 'abc')
 +        check_format("repr=   ab",
 +                     b'repr=%5.2S', 'abc')
 +
 +        # test width modifier and precision modifier with %R
 +        check_format("repr=   'abc'",
 +                     b'repr=%8R', 'abc')
 +        check_format("repr='ab",
 +                     b'repr=%.3R', 'abc')
 +        check_format("repr=  'ab",
 +                     b'repr=%5.3R', 'abc')
 +
 +        # test width modifier and precision modifier with %A
 +        check_format("repr=   'abc'",
 +                     b'repr=%8A', 'abc')
 +        check_format("repr='ab",
 +                     b'repr=%.3A', 'abc')
 +        check_format("repr=  'ab",
 +                     b'repr=%5.3A', 'abc')
 +
 +        # test width modifier and precision modifier with %s
 +        check_format("repr=  abc",
 +                     b'repr=%5s', b'abc')
 +        check_format("repr=ab",
 +                     b'repr=%.2s', b'abc')
 +        check_format("repr=   ab",
 +                     b'repr=%5.2s', b'abc')
 +
 +        # test width modifier and precision modifier with %U
 +        check_format("repr=  abc",
 +                     b'repr=%5U', 'abc')
 +        check_format("repr=ab",
 +                     b'repr=%.2U', 'abc')
 +        check_format("repr=   ab",
 +                     b'repr=%5.2U', 'abc')
 +
 +        # test width modifier and precision modifier with %V
 +        check_format("repr=  abc",
 +                     b'repr=%5V', 'abc', b'123')
 +        check_format("repr=ab",
 +                     b'repr=%.2V', 'abc', b'123')
 +        check_format("repr=   ab",
 +                     b'repr=%5.2V', 'abc', b'123')
 +        check_format("repr=  123",
 +                     b'repr=%5V', None, b'123')
 +        check_format("repr=12",
 +                     b'repr=%.2V', None, b'123')
 +        check_format("repr=   12",
 +                     b'repr=%5.2V', None, b'123')
  
          # test integer formats (%i, %d, %u)
 -        self.assertEqual(PyUnicode_FromFormat(b'%03i', c_int(10)), '010')
 -        self.assertEqual(PyUnicode_FromFormat(b'%0.4i', c_int(10)), '0010')
 -        self.assertEqual(PyUnicode_FromFormat(b'%i', c_int(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%li', c_long(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%lli', c_longlong(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%zi', c_ssize_t(-123)), '-123')
 -
 -        self.assertEqual(PyUnicode_FromFormat(b'%d', c_int(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%ld', c_long(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%lld', c_longlong(-123)), '-123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%zd', c_ssize_t(-123)), '-123')
 -
 -        self.assertEqual(PyUnicode_FromFormat(b'%u', c_uint(123)), '123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%lu', c_ulong(123)), '123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%llu', c_ulonglong(123)), '123')
 -        self.assertEqual(PyUnicode_FromFormat(b'%zu', c_size_t(123)), '123')
 +        check_format('010',
 +                     b'%03i', c_int(10))
 +        check_format('0010',
 +                     b'%0.4i', c_int(10))
 +        check_format('-123',
 +                     b'%i', c_int(-123))
 +        check_format('-123',
 +                     b'%li', c_long(-123))
 +        check_format('-123',
 +                     b'%lli', c_longlong(-123))
 +        check_format('-123',
 +                     b'%zi', c_ssize_t(-123))
 +
 +        check_format('-123',
 +                     b'%d', c_int(-123))
 +        check_format('-123',
 +                     b'%ld', c_long(-123))
 +        check_format('-123',
 +                     b'%lld', c_longlong(-123))
 +        check_format('-123',
 +                     b'%zd', c_ssize_t(-123))
 +
 +        check_format('123',
 +                     b'%u', c_uint(123))
 +        check_format('123',
 +                     b'%lu', c_ulong(123))
 +        check_format('123',
 +                     b'%llu', c_ulonglong(123))
 +        check_format('123',
 +                     b'%zu', c_size_t(123))
 +
 +        # test long output
 +        min_longlong = -(2 ** (8 * sizeof(c_longlong) - 1))
 +        max_longlong = -min_longlong - 1
 +        check_format(str(min_longlong),
 +                     b'%lld', c_longlong(min_longlong))
 +        check_format(str(max_longlong),
 +                     b'%lld', c_longlong(max_longlong))
 +        max_ulonglong = 2 ** (8 * sizeof(c_ulonglong)) - 1
 +        check_format(str(max_ulonglong),
 +                     b'%llu', c_ulonglong(max_ulonglong))
 +        PyUnicode_FromFormat(b'%p', c_void_p(-1))
 +
 +        # test padding (width and/or precision)
 +        check_format('123'.rjust(10, '0'),
 +                     b'%010i', c_int(123))
 +        check_format('123'.rjust(100),
 +                     b'%100i', c_int(123))
 +        check_format('123'.rjust(100, '0'),
 +                     b'%.100i', c_int(123))
 +        check_format('123'.rjust(80, '0').rjust(100),
 +                     b'%100.80i', c_int(123))
 +
 +        check_format('123'.rjust(10, '0'),
 +                     b'%010u', c_uint(123))
 +        check_format('123'.rjust(100),
 +                     b'%100u', c_uint(123))
 +        check_format('123'.rjust(100, '0'),
 +                     b'%.100u', c_uint(123))
 +        check_format('123'.rjust(80, '0').rjust(100),
 +                     b'%100.80u', c_uint(123))
 +
 +        check_format('123'.rjust(10, '0'),
 +                     b'%010x', c_int(0x123))
 +        check_format('123'.rjust(100),
 +                     b'%100x', c_int(0x123))
 +        check_format('123'.rjust(100, '0'),
 +                     b'%.100x', c_int(0x123))
 +        check_format('123'.rjust(80, '0').rjust(100),
 +                     b'%100.80x', c_int(0x123))
  
          # test %A
 -        text = PyUnicode_FromFormat(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
 -        self.assertEqual(text, r"%A:'abc\xe9\uabcd\U0010ffff'")
 +        check_format(r"%A:'abc\xe9\uabcd\U0010ffff'",
 +                     b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
  
          # test %V
 -        text = PyUnicode_FromFormat(b'repr=%V', 'abc', b'xyz')
 -        self.assertEqual(text, 'repr=abc')
 +        check_format('repr=abc',
 +                     b'repr=%V', 'abc', b'xyz')
  
          # Test string decode from parameter of %s using utf-8.
          # b'\xe4\xba\xba\xe6\xb0\x91' is utf-8 encoded byte sequence of