Fix test_codecs for Windows: check size of wchar_t, not sys.maxunicode

This commit is contained in:
Victor Stinner 2011-09-29 19:53:55 +02:00
parent 734e159b12
commit 182d90d9ee

View file

@ -3,6 +3,9 @@ import unittest
import codecs import codecs
import locale import locale
import sys, _testcapi, io import sys, _testcapi, io
import ctypes
SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar)
class Queue(object): class Queue(object):
""" """
@ -888,53 +891,53 @@ class PunycodeTest(unittest.TestCase):
self.assertEqual(uni, puny.decode("punycode")) self.assertEqual(uni, puny.decode("punycode"))
class UnicodeInternalTest(unittest.TestCase): class UnicodeInternalTest(unittest.TestCase):
@unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_bug1251300(self): def test_bug1251300(self):
# Decoding with unicode_internal used to not correctly handle "code # Decoding with unicode_internal used to not correctly handle "code
# points" above 0x10ffff on UCS-4 builds. # points" above 0x10ffff on UCS-4 builds.
if sys.maxunicode > 0xffff: ok = [
ok = [ (b"\x00\x10\xff\xff", "\U0010ffff"),
(b"\x00\x10\xff\xff", "\U0010ffff"), (b"\x00\x00\x01\x01", "\U00000101"),
(b"\x00\x00\x01\x01", "\U00000101"), (b"", ""),
(b"", ""), ]
] not_ok = [
not_ok = [ b"\x7f\xff\xff\xff",
b"\x7f\xff\xff\xff", b"\x80\x00\x00\x00",
b"\x80\x00\x00\x00", b"\x81\x00\x00\x00",
b"\x81\x00\x00\x00", b"\x00",
b"\x00", b"\x00\x00\x00\x00\x00",
b"\x00\x00\x00\x00\x00", ]
] for internal, uni in ok:
for internal, uni in ok: if sys.byteorder == "little":
if sys.byteorder == "little": internal = bytes(reversed(internal))
internal = bytes(reversed(internal)) self.assertEqual(uni, internal.decode("unicode_internal"))
self.assertEqual(uni, internal.decode("unicode_internal")) for internal in not_ok:
for internal in not_ok: if sys.byteorder == "little":
if sys.byteorder == "little": internal = bytes(reversed(internal))
internal = bytes(reversed(internal)) self.assertRaises(UnicodeDecodeError, internal.decode,
self.assertRaises(UnicodeDecodeError, internal.decode, "unicode_internal")
"unicode_internal")
@unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_decode_error_attributes(self): def test_decode_error_attributes(self):
if sys.maxunicode > 0xffff: try:
try: b"\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal")
b"\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal") except UnicodeDecodeError as ex:
except UnicodeDecodeError as ex: self.assertEqual("unicode_internal", ex.encoding)
self.assertEqual("unicode_internal", ex.encoding) self.assertEqual(b"\x00\x00\x00\x00\x00\x11\x11\x00", ex.object)
self.assertEqual(b"\x00\x00\x00\x00\x00\x11\x11\x00", ex.object) self.assertEqual(4, ex.start)
self.assertEqual(4, ex.start) self.assertEqual(8, ex.end)
self.assertEqual(8, ex.end) else:
else: self.fail()
self.fail()
@unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_decode_callback(self): def test_decode_callback(self):
if sys.maxunicode > 0xffff: codecs.register_error("UnicodeInternalTest", codecs.ignore_errors)
codecs.register_error("UnicodeInternalTest", codecs.ignore_errors) decoder = codecs.getdecoder("unicode_internal")
decoder = codecs.getdecoder("unicode_internal") ab = "ab".encode("unicode_internal").decode()
ab = "ab".encode("unicode_internal").decode() ignored = decoder(bytes("%s\x22\x22\x22\x22%s" % (ab[:4], ab[4:]),
ignored = decoder(bytes("%s\x22\x22\x22\x22%s" % (ab[:4], ab[4:]), "ascii"),
"ascii"), "UnicodeInternalTest")
"UnicodeInternalTest") self.assertEqual(("ab", 12), ignored)
self.assertEqual(("ab", 12), ignored)
def test_encode_length(self): def test_encode_length(self):
# Issue 3739 # Issue 3739