@@ -27,7 +27,7 @@ class ArraySubclassWithKwargs(array.array):
2727 def __init__ (self , typecode , newarg = None ):
2828 array .array .__init__ (self )
2929
30- typecodes = 'ubBhHiIlLfdqQ '
30+ typecodes = 'uwbBhHiIlLfdqQ '
3131
3232class MiscTest (unittest .TestCase ):
3333
@@ -186,11 +186,12 @@ def test_unicode(self):
186186 )
187187 for testcase in testcases :
188188 mformat_code , encoding = testcase
189- a = array .array ('u' , teststr )
190- b = array_reconstructor (
191- array .array , 'u' , mformat_code , teststr .encode (encoding ))
192- self .assertEqual (a , b ,
193- msg = "{0!r} != {1!r}; testcase={2!r}" .format (a , b , testcase ))
189+ for c in 'uw' :
190+ a = array .array (c , teststr )
191+ b = array_reconstructor (
192+ array .array , c , mformat_code , teststr .encode (encoding ))
193+ self .assertEqual (a , b ,
194+ msg = "{0!r} != {1!r}; testcase={2!r}" .format (a , b , testcase ))
194195
195196
196197class BaseTest :
@@ -234,7 +235,7 @@ def test_buffer_info(self):
234235 self .assertEqual (bi [1 ], len (a ))
235236
236237 def test_byteswap (self ):
237- if self .typecode == 'u' :
238+ if self .typecode in ( 'u' , 'w' ) :
238239 example = '\U00100100 '
239240 else :
240241 example = self .example
@@ -1079,7 +1080,7 @@ def test_buffer(self):
10791080 self .assertEqual (m .tobytes (), expected )
10801081 self .assertRaises (BufferError , a .frombytes , a .tobytes ())
10811082 self .assertEqual (m .tobytes (), expected )
1082- if self .typecode == 'u' :
1083+ if self .typecode in ( 'u' , 'w' ) :
10831084 self .assertRaises (BufferError , a .fromunicode , a .tounicode ())
10841085 self .assertEqual (m .tobytes (), expected )
10851086 self .assertRaises (BufferError , operator .imul , a , 2 )
@@ -1135,16 +1136,17 @@ def test_sizeof_without_buffer(self):
11351136 support .check_sizeof (self , a , basesize )
11361137
11371138 def test_initialize_with_unicode (self ):
1138- if self .typecode != 'u' :
1139+ if self .typecode not in ( 'u' , 'w' ) :
11391140 with self .assertRaises (TypeError ) as cm :
11401141 a = array .array (self .typecode , 'foo' )
11411142 self .assertIn ("cannot use a str" , str (cm .exception ))
11421143 with self .assertRaises (TypeError ) as cm :
1143- a = array .array (self .typecode , array .array ('u ' , 'foo' ))
1144+ a = array .array (self .typecode , array .array ('w ' , 'foo' ))
11441145 self .assertIn ("cannot use a unicode array" , str (cm .exception ))
11451146 else :
11461147 a = array .array (self .typecode , "foo" )
11471148 a = array .array (self .typecode , array .array ('u' , 'foo' ))
1149+ a = array .array (self .typecode , array .array ('w' , 'foo' ))
11481150
11491151 @support .cpython_only
11501152 def test_obsolete_write_lock (self ):
@@ -1171,40 +1173,45 @@ class UnicodeTest(StringTest, unittest.TestCase):
11711173 smallerexample = '\x01 \u263a \x00 \ufefe '
11721174 biggerexample = '\x01 \u263a \x01 \ufeff '
11731175 outside = str ('\x33 ' )
1174- minitemsize = 2
1176+ minitemsize = sizeof_wchar
11751177
11761178 def test_unicode (self ):
11771179 self .assertRaises (TypeError , array .array , 'b' , 'foo' )
11781180
1179- a = array .array ('u' , '\xa0 \xc2 \u1234 ' )
1181+ a = array .array (self . typecode , '\xa0 \xc2 \u1234 ' )
11801182 a .fromunicode (' ' )
11811183 a .fromunicode ('' )
11821184 a .fromunicode ('' )
11831185 a .fromunicode ('\x11 abc\xff \u1234 ' )
11841186 s = a .tounicode ()
11851187 self .assertEqual (s , '\xa0 \xc2 \u1234 \x11 abc\xff \u1234 ' )
1186- self .assertEqual (a .itemsize , sizeof_wchar )
1188+ self .assertEqual (a .itemsize , self . minitemsize )
11871189
11881190 s = '\x00 ="\' a\\ b\x80 \xff \u0000 \u0001 \u1234 '
1189- a = array .array ('u' , s )
1191+ a = array .array (self . typecode , s )
11901192 self .assertEqual (
11911193 repr (a ),
1192- "array('u ', '\\ x00=\" \\ 'a\\ \\ b\\ x80\xff \\ x00\\ x01\u1234 ')" )
1194+ f "array('{ self . typecode } ', '\\ x00=\" \\ 'a\\ \\ b\\ x80\xff \\ x00\\ x01\u1234 ')" )
11931195
11941196 self .assertRaises (TypeError , a .fromunicode )
11951197
11961198 def test_issue17223 (self ):
1197- # this used to crash
1198- if sizeof_wchar == 4 :
1199- # U+FFFFFFFF is an invalid code point in Unicode 6.0
1200- invalid_str = b'\xff \xff \xff \xff '
1201- else :
1199+ if self .typecode == 'u' and sizeof_wchar == 2 :
12021200 # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
12031201 self .skipTest ("specific to 32-bit wchar_t" )
1204- a = array .array ('u' , invalid_str )
1202+
1203+ # this used to crash
1204+ # U+FFFFFFFF is an invalid code point in Unicode 6.0
1205+ invalid_str = b'\xff \xff \xff \xff '
1206+
1207+ a = array .array (self .typecode , invalid_str )
12051208 self .assertRaises (ValueError , a .tounicode )
12061209 self .assertRaises (ValueError , str , a )
12071210
1211+ class UCS4Test (UnicodeTest ):
1212+ typecode = 'w'
1213+ minitemsize = 4
1214+
12081215class NumberTest (BaseTest ):
12091216
12101217 def test_extslice (self ):
0 commit comments