test_array.py 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  1. """Test the arraymodule.
  2. Roger E. Masse
  3. """
  4. import collections.abc
  5. import unittest
  6. from test import support
  7. from test.support import import_helper
  8. from test.support import os_helper
  9. from test.support import _2G
  10. import weakref
  11. import pickle
  12. import operator
  13. import struct
  14. import sys
  15. import array
  16. from array import _array_reconstructor as array_reconstructor
  17. sizeof_wchar = array.array('u').itemsize
  18. class ArraySubclass(array.array):
  19. pass
  20. class ArraySubclassWithKwargs(array.array):
  21. def __init__(self, typecode, newarg=None):
  22. array.array.__init__(self)
  23. typecodes = 'ubBhHiIlLfdqQ'
  24. class MiscTest(unittest.TestCase):
  25. def test_array_is_sequence(self):
  26. self.assertIsInstance(array.array("B"), collections.abc.MutableSequence)
  27. self.assertIsInstance(array.array("B"), collections.abc.Reversible)
  28. def test_bad_constructor(self):
  29. self.assertRaises(TypeError, array.array)
  30. self.assertRaises(TypeError, array.array, spam=42)
  31. self.assertRaises(TypeError, array.array, 'xx')
  32. self.assertRaises(ValueError, array.array, 'x')
  33. @support.cpython_only
  34. def test_disallow_instantiation(self):
  35. my_array = array.array("I")
  36. support.check_disallow_instantiation(
  37. self, type(iter(my_array)), my_array
  38. )
  39. @support.cpython_only
  40. def test_immutable(self):
  41. # bpo-43908: check that array.array is immutable
  42. with self.assertRaises(TypeError):
  43. array.array.foo = 1
  44. def test_empty(self):
  45. # Exercise code for handling zero-length arrays
  46. a = array.array('B')
  47. a[:] = a
  48. self.assertEqual(len(a), 0)
  49. self.assertEqual(len(a + a), 0)
  50. self.assertEqual(len(a * 3), 0)
  51. a += a
  52. self.assertEqual(len(a), 0)
  53. # Machine format codes.
  54. #
  55. # Search for "enum machine_format_code" in Modules/arraymodule.c to get the
  56. # authoritative values.
  57. UNKNOWN_FORMAT = -1
  58. UNSIGNED_INT8 = 0
  59. SIGNED_INT8 = 1
  60. UNSIGNED_INT16_LE = 2
  61. UNSIGNED_INT16_BE = 3
  62. SIGNED_INT16_LE = 4
  63. SIGNED_INT16_BE = 5
  64. UNSIGNED_INT32_LE = 6
  65. UNSIGNED_INT32_BE = 7
  66. SIGNED_INT32_LE = 8
  67. SIGNED_INT32_BE = 9
  68. UNSIGNED_INT64_LE = 10
  69. UNSIGNED_INT64_BE = 11
  70. SIGNED_INT64_LE = 12
  71. SIGNED_INT64_BE = 13
  72. IEEE_754_FLOAT_LE = 14
  73. IEEE_754_FLOAT_BE = 15
  74. IEEE_754_DOUBLE_LE = 16
  75. IEEE_754_DOUBLE_BE = 17
  76. UTF16_LE = 18
  77. UTF16_BE = 19
  78. UTF32_LE = 20
  79. UTF32_BE = 21
  80. class ArrayReconstructorTest(unittest.TestCase):
  81. def test_error(self):
  82. self.assertRaises(TypeError, array_reconstructor,
  83. "", "b", 0, b"")
  84. self.assertRaises(TypeError, array_reconstructor,
  85. str, "b", 0, b"")
  86. self.assertRaises(TypeError, array_reconstructor,
  87. array.array, "b", '', b"")
  88. self.assertRaises(TypeError, array_reconstructor,
  89. array.array, "b", 0, "")
  90. self.assertRaises(ValueError, array_reconstructor,
  91. array.array, "?", 0, b"")
  92. self.assertRaises(ValueError, array_reconstructor,
  93. array.array, "b", UNKNOWN_FORMAT, b"")
  94. self.assertRaises(ValueError, array_reconstructor,
  95. array.array, "b", 22, b"")
  96. self.assertRaises(ValueError, array_reconstructor,
  97. array.array, "d", 16, b"a")
  98. def test_numbers(self):
  99. testcases = (
  100. (['B', 'H', 'I', 'L'], UNSIGNED_INT8, '=BBBB',
  101. [0x80, 0x7f, 0, 0xff]),
  102. (['b', 'h', 'i', 'l'], SIGNED_INT8, '=bbb',
  103. [-0x80, 0x7f, 0]),
  104. (['H', 'I', 'L'], UNSIGNED_INT16_LE, '<HHHH',
  105. [0x8000, 0x7fff, 0, 0xffff]),
  106. (['H', 'I', 'L'], UNSIGNED_INT16_BE, '>HHHH',
  107. [0x8000, 0x7fff, 0, 0xffff]),
  108. (['h', 'i', 'l'], SIGNED_INT16_LE, '<hhh',
  109. [-0x8000, 0x7fff, 0]),
  110. (['h', 'i', 'l'], SIGNED_INT16_BE, '>hhh',
  111. [-0x8000, 0x7fff, 0]),
  112. (['I', 'L'], UNSIGNED_INT32_LE, '<IIII',
  113. [1<<31, (1<<31)-1, 0, (1<<32)-1]),
  114. (['I', 'L'], UNSIGNED_INT32_BE, '>IIII',
  115. [1<<31, (1<<31)-1, 0, (1<<32)-1]),
  116. (['i', 'l'], SIGNED_INT32_LE, '<iii',
  117. [-1<<31, (1<<31)-1, 0]),
  118. (['i', 'l'], SIGNED_INT32_BE, '>iii',
  119. [-1<<31, (1<<31)-1, 0]),
  120. (['L'], UNSIGNED_INT64_LE, '<QQQQ',
  121. [1<<31, (1<<31)-1, 0, (1<<32)-1]),
  122. (['L'], UNSIGNED_INT64_BE, '>QQQQ',
  123. [1<<31, (1<<31)-1, 0, (1<<32)-1]),
  124. (['l'], SIGNED_INT64_LE, '<qqq',
  125. [-1<<31, (1<<31)-1, 0]),
  126. (['l'], SIGNED_INT64_BE, '>qqq',
  127. [-1<<31, (1<<31)-1, 0]),
  128. # The following tests for INT64 will raise an OverflowError
  129. # when run on a 32-bit machine. The tests are simply skipped
  130. # in that case.
  131. (['L'], UNSIGNED_INT64_LE, '<QQQQ',
  132. [1<<63, (1<<63)-1, 0, (1<<64)-1]),
  133. (['L'], UNSIGNED_INT64_BE, '>QQQQ',
  134. [1<<63, (1<<63)-1, 0, (1<<64)-1]),
  135. (['l'], SIGNED_INT64_LE, '<qqq',
  136. [-1<<63, (1<<63)-1, 0]),
  137. (['l'], SIGNED_INT64_BE, '>qqq',
  138. [-1<<63, (1<<63)-1, 0]),
  139. (['f'], IEEE_754_FLOAT_LE, '<ffff',
  140. [16711938.0, float('inf'), float('-inf'), -0.0]),
  141. (['f'], IEEE_754_FLOAT_BE, '>ffff',
  142. [16711938.0, float('inf'), float('-inf'), -0.0]),
  143. (['d'], IEEE_754_DOUBLE_LE, '<dddd',
  144. [9006104071832581.0, float('inf'), float('-inf'), -0.0]),
  145. (['d'], IEEE_754_DOUBLE_BE, '>dddd',
  146. [9006104071832581.0, float('inf'), float('-inf'), -0.0])
  147. )
  148. for testcase in testcases:
  149. valid_typecodes, mformat_code, struct_fmt, values = testcase
  150. arraystr = struct.pack(struct_fmt, *values)
  151. for typecode in valid_typecodes:
  152. try:
  153. a = array.array(typecode, values)
  154. except OverflowError:
  155. continue # Skip this test case.
  156. b = array_reconstructor(
  157. array.array, typecode, mformat_code, arraystr)
  158. self.assertEqual(a, b,
  159. msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
  160. def test_unicode(self):
  161. teststr = "Bonne Journ\xe9e \U0002030a\U00020347"
  162. testcases = (
  163. (UTF16_LE, "UTF-16-LE"),
  164. (UTF16_BE, "UTF-16-BE"),
  165. (UTF32_LE, "UTF-32-LE"),
  166. (UTF32_BE, "UTF-32-BE")
  167. )
  168. for testcase in testcases:
  169. mformat_code, encoding = testcase
  170. a = array.array('u', teststr)
  171. b = array_reconstructor(
  172. array.array, 'u', mformat_code, teststr.encode(encoding))
  173. self.assertEqual(a, b,
  174. msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
  175. class BaseTest:
  176. # Required class attributes (provided by subclasses
  177. # typecode: the typecode to test
  178. # example: an initializer usable in the constructor for this type
  179. # smallerexample: the same length as example, but smaller
  180. # biggerexample: the same length as example, but bigger
  181. # outside: An entry that is not in example
  182. # minitemsize: the minimum guaranteed itemsize
  183. def assertEntryEqual(self, entry1, entry2):
  184. self.assertEqual(entry1, entry2)
  185. def badtypecode(self):
  186. # Return a typecode that is different from our own
  187. return typecodes[(typecodes.index(self.typecode)+1) % len(typecodes)]
  188. def test_constructor(self):
  189. a = array.array(self.typecode)
  190. self.assertEqual(a.typecode, self.typecode)
  191. self.assertGreaterEqual(a.itemsize, self.minitemsize)
  192. self.assertRaises(TypeError, array.array, self.typecode, None)
  193. def test_len(self):
  194. a = array.array(self.typecode)
  195. a.append(self.example[0])
  196. self.assertEqual(len(a), 1)
  197. a = array.array(self.typecode, self.example)
  198. self.assertEqual(len(a), len(self.example))
  199. def test_buffer_info(self):
  200. a = array.array(self.typecode, self.example)
  201. self.assertRaises(TypeError, a.buffer_info, 42)
  202. bi = a.buffer_info()
  203. self.assertIsInstance(bi, tuple)
  204. self.assertEqual(len(bi), 2)
  205. self.assertIsInstance(bi[0], int)
  206. self.assertIsInstance(bi[1], int)
  207. self.assertEqual(bi[1], len(a))
  208. def test_byteswap(self):
  209. if self.typecode == 'u':
  210. example = '\U00100100'
  211. else:
  212. example = self.example
  213. a = array.array(self.typecode, example)
  214. self.assertRaises(TypeError, a.byteswap, 42)
  215. if a.itemsize in (1, 2, 4, 8):
  216. b = array.array(self.typecode, example)
  217. b.byteswap()
  218. if a.itemsize==1:
  219. self.assertEqual(a, b)
  220. else:
  221. self.assertNotEqual(a, b)
  222. b.byteswap()
  223. self.assertEqual(a, b)
  224. def test_copy(self):
  225. import copy
  226. a = array.array(self.typecode, self.example)
  227. b = copy.copy(a)
  228. self.assertNotEqual(id(a), id(b))
  229. self.assertEqual(a, b)
  230. def test_deepcopy(self):
  231. import copy
  232. a = array.array(self.typecode, self.example)
  233. b = copy.deepcopy(a)
  234. self.assertNotEqual(id(a), id(b))
  235. self.assertEqual(a, b)
  236. def test_reduce_ex(self):
  237. a = array.array(self.typecode, self.example)
  238. for protocol in range(3):
  239. self.assertIs(a.__reduce_ex__(protocol)[0], array.array)
  240. for protocol in range(3, pickle.HIGHEST_PROTOCOL + 1):
  241. self.assertIs(a.__reduce_ex__(protocol)[0], array_reconstructor)
  242. def test_pickle(self):
  243. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  244. a = array.array(self.typecode, self.example)
  245. b = pickle.loads(pickle.dumps(a, protocol))
  246. self.assertNotEqual(id(a), id(b))
  247. self.assertEqual(a, b)
  248. a = ArraySubclass(self.typecode, self.example)
  249. a.x = 10
  250. b = pickle.loads(pickle.dumps(a, protocol))
  251. self.assertNotEqual(id(a), id(b))
  252. self.assertEqual(a, b)
  253. self.assertEqual(a.x, b.x)
  254. self.assertEqual(type(a), type(b))
  255. def test_pickle_for_empty_array(self):
  256. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  257. a = array.array(self.typecode)
  258. b = pickle.loads(pickle.dumps(a, protocol))
  259. self.assertNotEqual(id(a), id(b))
  260. self.assertEqual(a, b)
  261. a = ArraySubclass(self.typecode)
  262. a.x = 10
  263. b = pickle.loads(pickle.dumps(a, protocol))
  264. self.assertNotEqual(id(a), id(b))
  265. self.assertEqual(a, b)
  266. self.assertEqual(a.x, b.x)
  267. self.assertEqual(type(a), type(b))
  268. def test_iterator_pickle(self):
  269. orig = array.array(self.typecode, self.example)
  270. data = list(orig)
  271. data2 = data[::-1]
  272. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  273. # initial iterator
  274. itorig = iter(orig)
  275. d = pickle.dumps((itorig, orig), proto)
  276. it, a = pickle.loads(d)
  277. a.fromlist(data2)
  278. self.assertEqual(type(it), type(itorig))
  279. self.assertEqual(list(it), data + data2)
  280. # running iterator
  281. next(itorig)
  282. d = pickle.dumps((itorig, orig), proto)
  283. it, a = pickle.loads(d)
  284. a.fromlist(data2)
  285. self.assertEqual(type(it), type(itorig))
  286. self.assertEqual(list(it), data[1:] + data2)
  287. # empty iterator
  288. for i in range(1, len(data)):
  289. next(itorig)
  290. d = pickle.dumps((itorig, orig), proto)
  291. it, a = pickle.loads(d)
  292. a.fromlist(data2)
  293. self.assertEqual(type(it), type(itorig))
  294. self.assertEqual(list(it), data2)
  295. # exhausted iterator
  296. self.assertRaises(StopIteration, next, itorig)
  297. d = pickle.dumps((itorig, orig), proto)
  298. it, a = pickle.loads(d)
  299. a.fromlist(data2)
  300. self.assertEqual(list(it), [])
  301. def test_exhausted_iterator(self):
  302. a = array.array(self.typecode, self.example)
  303. self.assertEqual(list(a), list(self.example))
  304. exhit = iter(a)
  305. empit = iter(a)
  306. for x in exhit: # exhaust the iterator
  307. next(empit) # not exhausted
  308. a.append(self.outside)
  309. self.assertEqual(list(exhit), [])
  310. self.assertEqual(list(empit), [self.outside])
  311. self.assertEqual(list(a), list(self.example) + [self.outside])
  312. def test_reverse_iterator(self):
  313. a = array.array(self.typecode, self.example)
  314. self.assertEqual(list(a), list(self.example))
  315. self.assertEqual(list(reversed(a)), list(iter(a))[::-1])
  316. def test_reverse_iterator_picking(self):
  317. orig = array.array(self.typecode, self.example)
  318. data = list(orig)
  319. data2 = [self.outside] + data
  320. rev_data = data[len(data)-2::-1] + [self.outside]
  321. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  322. # initial iterator
  323. itorig = reversed(orig)
  324. d = pickle.dumps((itorig, orig), proto)
  325. it, a = pickle.loads(d)
  326. a.insert(0, self.outside)
  327. self.assertEqual(type(it), type(itorig))
  328. self.assertEqual(list(it), rev_data)
  329. self.assertEqual(list(a), data2)
  330. # running iterator
  331. next(itorig)
  332. d = pickle.dumps((itorig, orig), proto)
  333. it, a = pickle.loads(d)
  334. a.insert(0, self.outside)
  335. self.assertEqual(type(it), type(itorig))
  336. self.assertEqual(list(it), rev_data[1:])
  337. self.assertEqual(list(a), data2)
  338. # empty iterator
  339. for i in range(1, len(data)):
  340. next(itorig)
  341. d = pickle.dumps((itorig, orig), proto)
  342. it, a = pickle.loads(d)
  343. a.insert(0, self.outside)
  344. self.assertEqual(type(it), type(itorig))
  345. self.assertEqual(list(it), [])
  346. self.assertEqual(list(a), data2)
  347. # exhausted iterator
  348. self.assertRaises(StopIteration, next, itorig)
  349. d = pickle.dumps((itorig, orig), proto)
  350. it, a = pickle.loads(d)
  351. a.insert(0, self.outside)
  352. self.assertEqual(list(it), [])
  353. self.assertEqual(list(a), data2)
  354. def test_exhausted_reverse_iterator(self):
  355. a = array.array(self.typecode, self.example)
  356. self.assertEqual(list(a), list(self.example))
  357. exhit = reversed(a)
  358. empit = reversed(a)
  359. for x in exhit: # exhaust the iterator
  360. next(empit) # Pointing past the 0th position.
  361. a.insert(0, self.outside)
  362. self.assertEqual(list(exhit), [])
  363. # The iterator index points past the 0th position so inserting
  364. # an element in the beginning does not make it appear.
  365. self.assertEqual(list(empit), [])
  366. self.assertEqual(list(a), [self.outside] + list(self.example))
  367. def test_insert(self):
  368. a = array.array(self.typecode, self.example)
  369. a.insert(0, self.example[0])
  370. self.assertEqual(len(a), 1+len(self.example))
  371. self.assertEqual(a[0], a[1])
  372. self.assertRaises(TypeError, a.insert)
  373. self.assertRaises(TypeError, a.insert, None)
  374. self.assertRaises(TypeError, a.insert, 0, None)
  375. a = array.array(self.typecode, self.example)
  376. a.insert(-1, self.example[0])
  377. self.assertEqual(
  378. a,
  379. array.array(
  380. self.typecode,
  381. self.example[:-1] + self.example[:1] + self.example[-1:]
  382. )
  383. )
  384. a = array.array(self.typecode, self.example)
  385. a.insert(-1000, self.example[0])
  386. self.assertEqual(
  387. a,
  388. array.array(self.typecode, self.example[:1] + self.example)
  389. )
  390. a = array.array(self.typecode, self.example)
  391. a.insert(1000, self.example[0])
  392. self.assertEqual(
  393. a,
  394. array.array(self.typecode, self.example + self.example[:1])
  395. )
  396. def test_tofromfile(self):
  397. a = array.array(self.typecode, 2*self.example)
  398. self.assertRaises(TypeError, a.tofile)
  399. os_helper.unlink(os_helper.TESTFN)
  400. f = open(os_helper.TESTFN, 'wb')
  401. try:
  402. a.tofile(f)
  403. f.close()
  404. b = array.array(self.typecode)
  405. f = open(os_helper.TESTFN, 'rb')
  406. self.assertRaises(TypeError, b.fromfile)
  407. b.fromfile(f, len(self.example))
  408. self.assertEqual(b, array.array(self.typecode, self.example))
  409. self.assertNotEqual(a, b)
  410. self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1)
  411. self.assertEqual(a, b)
  412. f.close()
  413. finally:
  414. if not f.closed:
  415. f.close()
  416. os_helper.unlink(os_helper.TESTFN)
  417. def test_fromfile_ioerror(self):
  418. # Issue #5395: Check if fromfile raises a proper OSError
  419. # instead of EOFError.
  420. a = array.array(self.typecode)
  421. f = open(os_helper.TESTFN, 'wb')
  422. try:
  423. self.assertRaises(OSError, a.fromfile, f, len(self.example))
  424. finally:
  425. f.close()
  426. os_helper.unlink(os_helper.TESTFN)
  427. def test_filewrite(self):
  428. a = array.array(self.typecode, 2*self.example)
  429. f = open(os_helper.TESTFN, 'wb')
  430. try:
  431. f.write(a)
  432. f.close()
  433. b = array.array(self.typecode)
  434. f = open(os_helper.TESTFN, 'rb')
  435. b.fromfile(f, len(self.example))
  436. self.assertEqual(b, array.array(self.typecode, self.example))
  437. self.assertNotEqual(a, b)
  438. b.fromfile(f, len(self.example))
  439. self.assertEqual(a, b)
  440. f.close()
  441. finally:
  442. if not f.closed:
  443. f.close()
  444. os_helper.unlink(os_helper.TESTFN)
  445. def test_tofromlist(self):
  446. a = array.array(self.typecode, 2*self.example)
  447. b = array.array(self.typecode)
  448. self.assertRaises(TypeError, a.tolist, 42)
  449. self.assertRaises(TypeError, b.fromlist)
  450. self.assertRaises(TypeError, b.fromlist, 42)
  451. self.assertRaises(TypeError, b.fromlist, [None])
  452. b.fromlist(a.tolist())
  453. self.assertEqual(a, b)
  454. def test_tofrombytes(self):
  455. a = array.array(self.typecode, 2*self.example)
  456. b = array.array(self.typecode)
  457. self.assertRaises(TypeError, a.tobytes, 42)
  458. self.assertRaises(TypeError, b.frombytes)
  459. self.assertRaises(TypeError, b.frombytes, 42)
  460. b.frombytes(a.tobytes())
  461. c = array.array(self.typecode, bytearray(a.tobytes()))
  462. self.assertEqual(a, b)
  463. self.assertEqual(a, c)
  464. if a.itemsize>1:
  465. self.assertRaises(ValueError, b.frombytes, b"x")
  466. def test_fromarray(self):
  467. a = array.array(self.typecode, self.example)
  468. b = array.array(self.typecode, a)
  469. self.assertEqual(a, b)
  470. def test_repr(self):
  471. a = array.array(self.typecode, 2*self.example)
  472. self.assertEqual(a, eval(repr(a), {"array": array.array}))
  473. a = array.array(self.typecode)
  474. self.assertEqual(repr(a), "array('%s')" % self.typecode)
  475. def test_str(self):
  476. a = array.array(self.typecode, 2*self.example)
  477. str(a)
  478. def test_cmp(self):
  479. a = array.array(self.typecode, self.example)
  480. self.assertIs(a == 42, False)
  481. self.assertIs(a != 42, True)
  482. self.assertIs(a == a, True)
  483. self.assertIs(a != a, False)
  484. self.assertIs(a < a, False)
  485. self.assertIs(a <= a, True)
  486. self.assertIs(a > a, False)
  487. self.assertIs(a >= a, True)
  488. al = array.array(self.typecode, self.smallerexample)
  489. ab = array.array(self.typecode, self.biggerexample)
  490. self.assertIs(a == 2*a, False)
  491. self.assertIs(a != 2*a, True)
  492. self.assertIs(a < 2*a, True)
  493. self.assertIs(a <= 2*a, True)
  494. self.assertIs(a > 2*a, False)
  495. self.assertIs(a >= 2*a, False)
  496. self.assertIs(a == al, False)
  497. self.assertIs(a != al, True)
  498. self.assertIs(a < al, False)
  499. self.assertIs(a <= al, False)
  500. self.assertIs(a > al, True)
  501. self.assertIs(a >= al, True)
  502. self.assertIs(a == ab, False)
  503. self.assertIs(a != ab, True)
  504. self.assertIs(a < ab, True)
  505. self.assertIs(a <= ab, True)
  506. self.assertIs(a > ab, False)
  507. self.assertIs(a >= ab, False)
  508. def test_add(self):
  509. a = array.array(self.typecode, self.example) \
  510. + array.array(self.typecode, self.example[::-1])
  511. self.assertEqual(
  512. a,
  513. array.array(self.typecode, self.example + self.example[::-1])
  514. )
  515. b = array.array(self.badtypecode())
  516. self.assertRaises(TypeError, a.__add__, b)
  517. self.assertRaises(TypeError, a.__add__, "bad")
  518. def test_iadd(self):
  519. a = array.array(self.typecode, self.example[::-1])
  520. b = a
  521. a += array.array(self.typecode, 2*self.example)
  522. self.assertIs(a, b)
  523. self.assertEqual(
  524. a,
  525. array.array(self.typecode, self.example[::-1]+2*self.example)
  526. )
  527. a = array.array(self.typecode, self.example)
  528. a += a
  529. self.assertEqual(
  530. a,
  531. array.array(self.typecode, self.example + self.example)
  532. )
  533. b = array.array(self.badtypecode())
  534. self.assertRaises(TypeError, a.__add__, b)
  535. self.assertRaises(TypeError, a.__iadd__, "bad")
  536. def test_mul(self):
  537. a = 5*array.array(self.typecode, self.example)
  538. self.assertEqual(
  539. a,
  540. array.array(self.typecode, 5*self.example)
  541. )
  542. a = array.array(self.typecode, self.example)*5
  543. self.assertEqual(
  544. a,
  545. array.array(self.typecode, self.example*5)
  546. )
  547. a = 0*array.array(self.typecode, self.example)
  548. self.assertEqual(
  549. a,
  550. array.array(self.typecode)
  551. )
  552. a = (-1)*array.array(self.typecode, self.example)
  553. self.assertEqual(
  554. a,
  555. array.array(self.typecode)
  556. )
  557. a = 5 * array.array(self.typecode, self.example[:1])
  558. self.assertEqual(
  559. a,
  560. array.array(self.typecode, [a[0]] * 5)
  561. )
  562. self.assertRaises(TypeError, a.__mul__, "bad")
  563. def test_imul(self):
  564. a = array.array(self.typecode, self.example)
  565. b = a
  566. a *= 5
  567. self.assertIs(a, b)
  568. self.assertEqual(
  569. a,
  570. array.array(self.typecode, 5*self.example)
  571. )
  572. a *= 0
  573. self.assertIs(a, b)
  574. self.assertEqual(a, array.array(self.typecode))
  575. a *= 1000
  576. self.assertIs(a, b)
  577. self.assertEqual(a, array.array(self.typecode))
  578. a *= -1
  579. self.assertIs(a, b)
  580. self.assertEqual(a, array.array(self.typecode))
  581. a = array.array(self.typecode, self.example)
  582. a *= -1
  583. self.assertEqual(a, array.array(self.typecode))
  584. self.assertRaises(TypeError, a.__imul__, "bad")
  585. def test_getitem(self):
  586. a = array.array(self.typecode, self.example)
  587. self.assertEntryEqual(a[0], self.example[0])
  588. self.assertEntryEqual(a[0], self.example[0])
  589. self.assertEntryEqual(a[-1], self.example[-1])
  590. self.assertEntryEqual(a[-1], self.example[-1])
  591. self.assertEntryEqual(a[len(self.example)-1], self.example[-1])
  592. self.assertEntryEqual(a[-len(self.example)], self.example[0])
  593. self.assertRaises(TypeError, a.__getitem__)
  594. self.assertRaises(IndexError, a.__getitem__, len(self.example))
  595. self.assertRaises(IndexError, a.__getitem__, -len(self.example)-1)
  596. def test_setitem(self):
  597. a = array.array(self.typecode, self.example)
  598. a[0] = a[-1]
  599. self.assertEntryEqual(a[0], a[-1])
  600. a = array.array(self.typecode, self.example)
  601. a[0] = a[-1]
  602. self.assertEntryEqual(a[0], a[-1])
  603. a = array.array(self.typecode, self.example)
  604. a[-1] = a[0]
  605. self.assertEntryEqual(a[0], a[-1])
  606. a = array.array(self.typecode, self.example)
  607. a[-1] = a[0]
  608. self.assertEntryEqual(a[0], a[-1])
  609. a = array.array(self.typecode, self.example)
  610. a[len(self.example)-1] = a[0]
  611. self.assertEntryEqual(a[0], a[-1])
  612. a = array.array(self.typecode, self.example)
  613. a[-len(self.example)] = a[-1]
  614. self.assertEntryEqual(a[0], a[-1])
  615. self.assertRaises(TypeError, a.__setitem__)
  616. self.assertRaises(TypeError, a.__setitem__, None)
  617. self.assertRaises(TypeError, a.__setitem__, 0, None)
  618. self.assertRaises(
  619. IndexError,
  620. a.__setitem__,
  621. len(self.example), self.example[0]
  622. )
  623. self.assertRaises(
  624. IndexError,
  625. a.__setitem__,
  626. -len(self.example)-1, self.example[0]
  627. )
  628. def test_delitem(self):
  629. a = array.array(self.typecode, self.example)
  630. del a[0]
  631. self.assertEqual(
  632. a,
  633. array.array(self.typecode, self.example[1:])
  634. )
  635. a = array.array(self.typecode, self.example)
  636. del a[-1]
  637. self.assertEqual(
  638. a,
  639. array.array(self.typecode, self.example[:-1])
  640. )
  641. a = array.array(self.typecode, self.example)
  642. del a[len(self.example)-1]
  643. self.assertEqual(
  644. a,
  645. array.array(self.typecode, self.example[:-1])
  646. )
  647. a = array.array(self.typecode, self.example)
  648. del a[-len(self.example)]
  649. self.assertEqual(
  650. a,
  651. array.array(self.typecode, self.example[1:])
  652. )
  653. self.assertRaises(TypeError, a.__delitem__)
  654. self.assertRaises(TypeError, a.__delitem__, None)
  655. self.assertRaises(IndexError, a.__delitem__, len(self.example))
  656. self.assertRaises(IndexError, a.__delitem__, -len(self.example)-1)
  657. def test_getslice(self):
  658. a = array.array(self.typecode, self.example)
  659. self.assertEqual(a[:], a)
  660. self.assertEqual(
  661. a[1:],
  662. array.array(self.typecode, self.example[1:])
  663. )
  664. self.assertEqual(
  665. a[:1],
  666. array.array(self.typecode, self.example[:1])
  667. )
  668. self.assertEqual(
  669. a[:-1],
  670. array.array(self.typecode, self.example[:-1])
  671. )
  672. self.assertEqual(
  673. a[-1:],
  674. array.array(self.typecode, self.example[-1:])
  675. )
  676. self.assertEqual(
  677. a[-1:-1],
  678. array.array(self.typecode)
  679. )
  680. self.assertEqual(
  681. a[2:1],
  682. array.array(self.typecode)
  683. )
  684. self.assertEqual(
  685. a[1000:],
  686. array.array(self.typecode)
  687. )
  688. self.assertEqual(a[-1000:], a)
  689. self.assertEqual(a[:1000], a)
  690. self.assertEqual(
  691. a[:-1000],
  692. array.array(self.typecode)
  693. )
  694. self.assertEqual(a[-1000:1000], a)
  695. self.assertEqual(
  696. a[2000:1000],
  697. array.array(self.typecode)
  698. )
  699. def test_extended_getslice(self):
  700. # Test extended slicing by comparing with list slicing
  701. # (Assumes list conversion works correctly, too)
  702. a = array.array(self.typecode, self.example)
  703. indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
  704. for start in indices:
  705. for stop in indices:
  706. # Everything except the initial 0 (invalid step)
  707. for step in indices[1:]:
  708. self.assertEqual(list(a[start:stop:step]),
  709. list(a)[start:stop:step])
  710. def test_setslice(self):
  711. a = array.array(self.typecode, self.example)
  712. a[:1] = a
  713. self.assertEqual(
  714. a,
  715. array.array(self.typecode, self.example + self.example[1:])
  716. )
  717. a = array.array(self.typecode, self.example)
  718. a[:-1] = a
  719. self.assertEqual(
  720. a,
  721. array.array(self.typecode, self.example + self.example[-1:])
  722. )
  723. a = array.array(self.typecode, self.example)
  724. a[-1:] = a
  725. self.assertEqual(
  726. a,
  727. array.array(self.typecode, self.example[:-1] + self.example)
  728. )
  729. a = array.array(self.typecode, self.example)
  730. a[1:] = a
  731. self.assertEqual(
  732. a,
  733. array.array(self.typecode, self.example[:1] + self.example)
  734. )
  735. a = array.array(self.typecode, self.example)
  736. a[1:-1] = a
  737. self.assertEqual(
  738. a,
  739. array.array(
  740. self.typecode,
  741. self.example[:1] + self.example + self.example[-1:]
  742. )
  743. )
  744. a = array.array(self.typecode, self.example)
  745. a[1000:] = a
  746. self.assertEqual(
  747. a,
  748. array.array(self.typecode, 2*self.example)
  749. )
  750. a = array.array(self.typecode, self.example)
  751. a[-1000:] = a
  752. self.assertEqual(
  753. a,
  754. array.array(self.typecode, self.example)
  755. )
  756. a = array.array(self.typecode, self.example)
  757. a[:1000] = a
  758. self.assertEqual(
  759. a,
  760. array.array(self.typecode, self.example)
  761. )
  762. a = array.array(self.typecode, self.example)
  763. a[:-1000] = a
  764. self.assertEqual(
  765. a,
  766. array.array(self.typecode, 2*self.example)
  767. )
  768. a = array.array(self.typecode, self.example)
  769. a[1:0] = a
  770. self.assertEqual(
  771. a,
  772. array.array(self.typecode, self.example[:1] + self.example + self.example[1:])
  773. )
  774. a = array.array(self.typecode, self.example)
  775. a[2000:1000] = a
  776. self.assertEqual(
  777. a,
  778. array.array(self.typecode, 2*self.example)
  779. )
  780. a = array.array(self.typecode, self.example)
  781. self.assertRaises(TypeError, a.__setitem__, slice(0, 0), None)
  782. self.assertRaises(TypeError, a.__setitem__, slice(0, 1), None)
  783. b = array.array(self.badtypecode())
  784. self.assertRaises(TypeError, a.__setitem__, slice(0, 0), b)
  785. self.assertRaises(TypeError, a.__setitem__, slice(0, 1), b)
  786. def test_extended_set_del_slice(self):
  787. indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
  788. for start in indices:
  789. for stop in indices:
  790. # Everything except the initial 0 (invalid step)
  791. for step in indices[1:]:
  792. a = array.array(self.typecode, self.example)
  793. L = list(a)
  794. # Make sure we have a slice of exactly the right length,
  795. # but with (hopefully) different data.
  796. data = L[start:stop:step]
  797. data.reverse()
  798. L[start:stop:step] = data
  799. a[start:stop:step] = array.array(self.typecode, data)
  800. self.assertEqual(a, array.array(self.typecode, L))
  801. del L[start:stop:step]
  802. del a[start:stop:step]
  803. self.assertEqual(a, array.array(self.typecode, L))
  804. def test_index(self):
  805. example = 2*self.example
  806. a = array.array(self.typecode, example)
  807. self.assertRaises(TypeError, a.index)
  808. for x in example:
  809. self.assertEqual(a.index(x), example.index(x))
  810. self.assertRaises(ValueError, a.index, None)
  811. self.assertRaises(ValueError, a.index, self.outside)
  812. a = array.array('i', [-2, -1, 0, 0, 1, 2])
  813. self.assertEqual(a.index(0), 2)
  814. self.assertEqual(a.index(0, 2), 2)
  815. self.assertEqual(a.index(0, -4), 2)
  816. self.assertEqual(a.index(-2, -10), 0)
  817. self.assertEqual(a.index(0, 3), 3)
  818. self.assertEqual(a.index(0, -3), 3)
  819. self.assertEqual(a.index(0, 3, 4), 3)
  820. self.assertEqual(a.index(0, -3, -2), 3)
  821. self.assertRaises(ValueError, a.index, 2, 0, -10)
  822. def test_count(self):
  823. example = 2*self.example
  824. a = array.array(self.typecode, example)
  825. self.assertRaises(TypeError, a.count)
  826. for x in example:
  827. self.assertEqual(a.count(x), example.count(x))
  828. self.assertEqual(a.count(self.outside), 0)
  829. self.assertEqual(a.count(None), 0)
  830. def test_remove(self):
  831. for x in self.example:
  832. example = 2*self.example
  833. a = array.array(self.typecode, example)
  834. pos = example.index(x)
  835. example2 = example[:pos] + example[pos+1:]
  836. a.remove(x)
  837. self.assertEqual(a, array.array(self.typecode, example2))
  838. a = array.array(self.typecode, self.example)
  839. self.assertRaises(ValueError, a.remove, self.outside)
  840. self.assertRaises(ValueError, a.remove, None)
  841. def test_pop(self):
  842. a = array.array(self.typecode)
  843. self.assertRaises(IndexError, a.pop)
  844. a = array.array(self.typecode, 2*self.example)
  845. self.assertRaises(TypeError, a.pop, 42, 42)
  846. self.assertRaises(TypeError, a.pop, None)
  847. self.assertRaises(IndexError, a.pop, len(a))
  848. self.assertRaises(IndexError, a.pop, -len(a)-1)
  849. self.assertEntryEqual(a.pop(0), self.example[0])
  850. self.assertEqual(
  851. a,
  852. array.array(self.typecode, self.example[1:]+self.example)
  853. )
  854. self.assertEntryEqual(a.pop(1), self.example[2])
  855. self.assertEqual(
  856. a,
  857. array.array(self.typecode, self.example[1:2]+self.example[3:]+self.example)
  858. )
  859. self.assertEntryEqual(a.pop(0), self.example[1])
  860. self.assertEntryEqual(a.pop(), self.example[-1])
  861. self.assertEqual(
  862. a,
  863. array.array(self.typecode, self.example[3:]+self.example[:-1])
  864. )
  865. def test_reverse(self):
  866. a = array.array(self.typecode, self.example)
  867. self.assertRaises(TypeError, a.reverse, 42)
  868. a.reverse()
  869. self.assertEqual(
  870. a,
  871. array.array(self.typecode, self.example[::-1])
  872. )
  873. def test_extend(self):
  874. a = array.array(self.typecode, self.example)
  875. self.assertRaises(TypeError, a.extend)
  876. a.extend(array.array(self.typecode, self.example[::-1]))
  877. self.assertEqual(
  878. a,
  879. array.array(self.typecode, self.example+self.example[::-1])
  880. )
  881. a = array.array(self.typecode, self.example)
  882. a.extend(a)
  883. self.assertEqual(
  884. a,
  885. array.array(self.typecode, self.example+self.example)
  886. )
  887. b = array.array(self.badtypecode())
  888. self.assertRaises(TypeError, a.extend, b)
  889. a = array.array(self.typecode, self.example)
  890. a.extend(self.example[::-1])
  891. self.assertEqual(
  892. a,
  893. array.array(self.typecode, self.example+self.example[::-1])
  894. )
  895. def test_constructor_with_iterable_argument(self):
  896. a = array.array(self.typecode, iter(self.example))
  897. b = array.array(self.typecode, self.example)
  898. self.assertEqual(a, b)
  899. # non-iterable argument
  900. self.assertRaises(TypeError, array.array, self.typecode, 10)
  901. # pass through errors raised in __iter__
  902. class A:
  903. def __iter__(self):
  904. raise UnicodeError
  905. self.assertRaises(UnicodeError, array.array, self.typecode, A())
  906. # pass through errors raised in next()
  907. def B():
  908. raise UnicodeError
  909. yield None
  910. self.assertRaises(UnicodeError, array.array, self.typecode, B())
  911. def test_coveritertraverse(self):
  912. try:
  913. import gc
  914. except ImportError:
  915. self.skipTest('gc module not available')
  916. a = array.array(self.typecode)
  917. l = [iter(a)]
  918. l.append(l)
  919. gc.collect()
  920. def test_buffer(self):
  921. a = array.array(self.typecode, self.example)
  922. m = memoryview(a)
  923. expected = m.tobytes()
  924. self.assertEqual(a.tobytes(), expected)
  925. self.assertEqual(a.tobytes()[0], expected[0])
  926. # Resizing is forbidden when there are buffer exports.
  927. # For issue 4509, we also check after each error that
  928. # the array was not modified.
  929. self.assertRaises(BufferError, a.append, a[0])
  930. self.assertEqual(m.tobytes(), expected)
  931. self.assertRaises(BufferError, a.extend, a[0:1])
  932. self.assertEqual(m.tobytes(), expected)
  933. self.assertRaises(BufferError, a.remove, a[0])
  934. self.assertEqual(m.tobytes(), expected)
  935. self.assertRaises(BufferError, a.pop, 0)
  936. self.assertEqual(m.tobytes(), expected)
  937. self.assertRaises(BufferError, a.fromlist, a.tolist())
  938. self.assertEqual(m.tobytes(), expected)
  939. self.assertRaises(BufferError, a.frombytes, a.tobytes())
  940. self.assertEqual(m.tobytes(), expected)
  941. if self.typecode == 'u':
  942. self.assertRaises(BufferError, a.fromunicode, a.tounicode())
  943. self.assertEqual(m.tobytes(), expected)
  944. self.assertRaises(BufferError, operator.imul, a, 2)
  945. self.assertEqual(m.tobytes(), expected)
  946. self.assertRaises(BufferError, operator.imul, a, 0)
  947. self.assertEqual(m.tobytes(), expected)
  948. self.assertRaises(BufferError, operator.setitem, a, slice(0, 0), a)
  949. self.assertEqual(m.tobytes(), expected)
  950. self.assertRaises(BufferError, operator.delitem, a, 0)
  951. self.assertEqual(m.tobytes(), expected)
  952. self.assertRaises(BufferError, operator.delitem, a, slice(0, 1))
  953. self.assertEqual(m.tobytes(), expected)
  954. def test_weakref(self):
  955. s = array.array(self.typecode, self.example)
  956. p = weakref.proxy(s)
  957. self.assertEqual(p.tobytes(), s.tobytes())
  958. s = None
  959. support.gc_collect() # For PyPy or other GCs.
  960. self.assertRaises(ReferenceError, len, p)
  961. @unittest.skipUnless(hasattr(sys, 'getrefcount'),
  962. 'test needs sys.getrefcount()')
  963. def test_bug_782369(self):
  964. for i in range(10):
  965. b = array.array('B', range(64))
  966. rc = sys.getrefcount(10)
  967. for i in range(10):
  968. b = array.array('B', range(64))
  969. self.assertEqual(rc, sys.getrefcount(10))
  970. def test_subclass_with_kwargs(self):
  971. # SF bug #1486663 -- this used to erroneously raise a TypeError
  972. ArraySubclassWithKwargs('b', newarg=1)
  973. def test_create_from_bytes(self):
  974. # XXX This test probably needs to be moved in a subclass or
  975. # generalized to use self.typecode.
  976. a = array.array('H', b"1234")
  977. self.assertEqual(len(a) * a.itemsize, 4)
  978. @support.cpython_only
  979. def test_sizeof_with_buffer(self):
  980. a = array.array(self.typecode, self.example)
  981. basesize = support.calcvobjsize('Pn2Pi')
  982. buffer_size = a.buffer_info()[1] * a.itemsize
  983. support.check_sizeof(self, a, basesize + buffer_size)
  984. @support.cpython_only
  985. def test_sizeof_without_buffer(self):
  986. a = array.array(self.typecode)
  987. basesize = support.calcvobjsize('Pn2Pi')
  988. support.check_sizeof(self, a, basesize)
  989. def test_initialize_with_unicode(self):
  990. if self.typecode != 'u':
  991. with self.assertRaises(TypeError) as cm:
  992. a = array.array(self.typecode, 'foo')
  993. self.assertIn("cannot use a str", str(cm.exception))
  994. with self.assertRaises(TypeError) as cm:
  995. a = array.array(self.typecode, array.array('u', 'foo'))
  996. self.assertIn("cannot use a unicode array", str(cm.exception))
  997. else:
  998. a = array.array(self.typecode, "foo")
  999. a = array.array(self.typecode, array.array('u', 'foo'))
  1000. @support.cpython_only
  1001. def test_obsolete_write_lock(self):
  1002. _testcapi = import_helper.import_module('_testcapi')
  1003. a = array.array('B', b"")
  1004. self.assertRaises(BufferError, _testcapi.getbuffer_with_null_view, a)
  1005. def test_free_after_iterating(self):
  1006. support.check_free_after_iterating(self, iter, array.array,
  1007. (self.typecode,))
  1008. support.check_free_after_iterating(self, reversed, array.array,
  1009. (self.typecode,))
  1010. class StringTest(BaseTest):
  1011. def test_setitem(self):
  1012. super().test_setitem()
  1013. a = array.array(self.typecode, self.example)
  1014. self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
  1015. class UnicodeTest(StringTest, unittest.TestCase):
  1016. typecode = 'u'
  1017. example = '\x01\u263a\x00\ufeff'
  1018. smallerexample = '\x01\u263a\x00\ufefe'
  1019. biggerexample = '\x01\u263a\x01\ufeff'
  1020. outside = str('\x33')
  1021. minitemsize = 2
  1022. def test_unicode(self):
  1023. self.assertRaises(TypeError, array.array, 'b', 'foo')
  1024. a = array.array('u', '\xa0\xc2\u1234')
  1025. a.fromunicode(' ')
  1026. a.fromunicode('')
  1027. a.fromunicode('')
  1028. a.fromunicode('\x11abc\xff\u1234')
  1029. s = a.tounicode()
  1030. self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
  1031. self.assertEqual(a.itemsize, sizeof_wchar)
  1032. s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
  1033. a = array.array('u', s)
  1034. self.assertEqual(
  1035. repr(a),
  1036. "array('u', '\\x00=\"\\'a\\\\b\\x80\xff\\x00\\x01\u1234')")
  1037. self.assertRaises(TypeError, a.fromunicode)
  1038. def test_issue17223(self):
  1039. # this used to crash
  1040. if sizeof_wchar == 4:
  1041. # U+FFFFFFFF is an invalid code point in Unicode 6.0
  1042. invalid_str = b'\xff\xff\xff\xff'
  1043. else:
  1044. # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
  1045. self.skipTest("specific to 32-bit wchar_t")
  1046. a = array.array('u', invalid_str)
  1047. self.assertRaises(ValueError, a.tounicode)
  1048. self.assertRaises(ValueError, str, a)
  1049. class NumberTest(BaseTest):
  1050. def test_extslice(self):
  1051. a = array.array(self.typecode, range(5))
  1052. self.assertEqual(a[::], a)
  1053. self.assertEqual(a[::2], array.array(self.typecode, [0,2,4]))
  1054. self.assertEqual(a[1::2], array.array(self.typecode, [1,3]))
  1055. self.assertEqual(a[::-1], array.array(self.typecode, [4,3,2,1,0]))
  1056. self.assertEqual(a[::-2], array.array(self.typecode, [4,2,0]))
  1057. self.assertEqual(a[3::-2], array.array(self.typecode, [3,1]))
  1058. self.assertEqual(a[-100:100:], a)
  1059. self.assertEqual(a[100:-100:-1], a[::-1])
  1060. self.assertEqual(a[-100:100:2], array.array(self.typecode, [0,2,4]))
  1061. self.assertEqual(a[1000:2000:2], array.array(self.typecode, []))
  1062. self.assertEqual(a[-1000:-2000:-2], array.array(self.typecode, []))
  1063. def test_delslice(self):
  1064. a = array.array(self.typecode, range(5))
  1065. del a[::2]
  1066. self.assertEqual(a, array.array(self.typecode, [1,3]))
  1067. a = array.array(self.typecode, range(5))
  1068. del a[1::2]
  1069. self.assertEqual(a, array.array(self.typecode, [0,2,4]))
  1070. a = array.array(self.typecode, range(5))
  1071. del a[1::-2]
  1072. self.assertEqual(a, array.array(self.typecode, [0,2,3,4]))
  1073. a = array.array(self.typecode, range(10))
  1074. del a[::1000]
  1075. self.assertEqual(a, array.array(self.typecode, [1,2,3,4,5,6,7,8,9]))
  1076. # test issue7788
  1077. a = array.array(self.typecode, range(10))
  1078. del a[9::1<<333]
  1079. def test_assignment(self):
  1080. a = array.array(self.typecode, range(10))
  1081. a[::2] = array.array(self.typecode, [42]*5)
  1082. self.assertEqual(a, array.array(self.typecode, [42, 1, 42, 3, 42, 5, 42, 7, 42, 9]))
  1083. a = array.array(self.typecode, range(10))
  1084. a[::-4] = array.array(self.typecode, [10]*3)
  1085. self.assertEqual(a, array.array(self.typecode, [0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
  1086. a = array.array(self.typecode, range(4))
  1087. a[::-1] = a
  1088. self.assertEqual(a, array.array(self.typecode, [3, 2, 1, 0]))
  1089. a = array.array(self.typecode, range(10))
  1090. b = a[:]
  1091. c = a[:]
  1092. ins = array.array(self.typecode, range(2))
  1093. a[2:3] = ins
  1094. b[slice(2,3)] = ins
  1095. c[2:3:] = ins
  1096. def test_iterationcontains(self):
  1097. a = array.array(self.typecode, range(10))
  1098. self.assertEqual(list(a), list(range(10)))
  1099. b = array.array(self.typecode, [20])
  1100. self.assertEqual(a[-1] in a, True)
  1101. self.assertEqual(b[0] not in a, True)
  1102. def check_overflow(self, lower, upper):
  1103. # method to be used by subclasses
  1104. # should not overflow assigning lower limit
  1105. a = array.array(self.typecode, [lower])
  1106. a[0] = lower
  1107. # should overflow assigning less than lower limit
  1108. self.assertRaises(OverflowError, array.array, self.typecode, [lower-1])
  1109. self.assertRaises(OverflowError, a.__setitem__, 0, lower-1)
  1110. # should not overflow assigning upper limit
  1111. a = array.array(self.typecode, [upper])
  1112. a[0] = upper
  1113. # should overflow assigning more than upper limit
  1114. self.assertRaises(OverflowError, array.array, self.typecode, [upper+1])
  1115. self.assertRaises(OverflowError, a.__setitem__, 0, upper+1)
  1116. def test_subclassing(self):
  1117. typecode = self.typecode
  1118. class ExaggeratingArray(array.array):
  1119. __slots__ = ['offset']
  1120. def __new__(cls, typecode, data, offset):
  1121. return array.array.__new__(cls, typecode, data)
  1122. def __init__(self, typecode, data, offset):
  1123. self.offset = offset
  1124. def __getitem__(self, i):
  1125. return array.array.__getitem__(self, i) + self.offset
  1126. a = ExaggeratingArray(self.typecode, [3, 6, 7, 11], 4)
  1127. self.assertEntryEqual(a[0], 7)
  1128. self.assertRaises(AttributeError, setattr, a, "color", "blue")
  1129. def test_frombytearray(self):
  1130. a = array.array('b', range(10))
  1131. b = array.array(self.typecode, a)
  1132. self.assertEqual(a, b)
  1133. class IntegerNumberTest(NumberTest):
  1134. def test_type_error(self):
  1135. a = array.array(self.typecode)
  1136. a.append(42)
  1137. with self.assertRaises(TypeError):
  1138. a.append(42.0)
  1139. with self.assertRaises(TypeError):
  1140. a[0] = 42.0
  1141. class Intable:
  1142. def __init__(self, num):
  1143. self._num = num
  1144. def __index__(self):
  1145. return self._num
  1146. def __int__(self):
  1147. return self._num
  1148. def __sub__(self, other):
  1149. return Intable(int(self) - int(other))
  1150. def __add__(self, other):
  1151. return Intable(int(self) + int(other))
  1152. class SignedNumberTest(IntegerNumberTest):
  1153. example = [-1, 0, 1, 42, 0x7f]
  1154. smallerexample = [-1, 0, 1, 42, 0x7e]
  1155. biggerexample = [-1, 0, 1, 43, 0x7f]
  1156. outside = 23
  1157. def test_overflow(self):
  1158. a = array.array(self.typecode)
  1159. lower = -1 * int(pow(2, a.itemsize * 8 - 1))
  1160. upper = int(pow(2, a.itemsize * 8 - 1)) - 1
  1161. self.check_overflow(lower, upper)
  1162. self.check_overflow(Intable(lower), Intable(upper))
  1163. class UnsignedNumberTest(IntegerNumberTest):
  1164. example = [0, 1, 17, 23, 42, 0xff]
  1165. smallerexample = [0, 1, 17, 23, 42, 0xfe]
  1166. biggerexample = [0, 1, 17, 23, 43, 0xff]
  1167. outside = 0xaa
  1168. def test_overflow(self):
  1169. a = array.array(self.typecode)
  1170. lower = 0
  1171. upper = int(pow(2, a.itemsize * 8)) - 1
  1172. self.check_overflow(lower, upper)
  1173. self.check_overflow(Intable(lower), Intable(upper))
  1174. def test_bytes_extend(self):
  1175. s = bytes(self.example)
  1176. a = array.array(self.typecode, self.example)
  1177. a.extend(s)
  1178. self.assertEqual(
  1179. a,
  1180. array.array(self.typecode, self.example+self.example)
  1181. )
  1182. a = array.array(self.typecode, self.example)
  1183. a.extend(bytearray(reversed(s)))
  1184. self.assertEqual(
  1185. a,
  1186. array.array(self.typecode, self.example+self.example[::-1])
  1187. )
  1188. class ByteTest(SignedNumberTest, unittest.TestCase):
  1189. typecode = 'b'
  1190. minitemsize = 1
  1191. class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
  1192. typecode = 'B'
  1193. minitemsize = 1
  1194. class ShortTest(SignedNumberTest, unittest.TestCase):
  1195. typecode = 'h'
  1196. minitemsize = 2
  1197. class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
  1198. typecode = 'H'
  1199. minitemsize = 2
  1200. class IntTest(SignedNumberTest, unittest.TestCase):
  1201. typecode = 'i'
  1202. minitemsize = 2
  1203. class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
  1204. typecode = 'I'
  1205. minitemsize = 2
  1206. class LongTest(SignedNumberTest, unittest.TestCase):
  1207. typecode = 'l'
  1208. minitemsize = 4
  1209. class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
  1210. typecode = 'L'
  1211. minitemsize = 4
  1212. class LongLongTest(SignedNumberTest, unittest.TestCase):
  1213. typecode = 'q'
  1214. minitemsize = 8
  1215. class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
  1216. typecode = 'Q'
  1217. minitemsize = 8
  1218. class FPTest(NumberTest):
  1219. example = [-42.0, 0, 42, 1e5, -1e10]
  1220. smallerexample = [-42.0, 0, 42, 1e5, -2e10]
  1221. biggerexample = [-42.0, 0, 42, 1e5, 1e10]
  1222. outside = 23
  1223. def assertEntryEqual(self, entry1, entry2):
  1224. self.assertAlmostEqual(entry1, entry2)
  1225. def test_nan(self):
  1226. a = array.array(self.typecode, [float('nan')])
  1227. b = array.array(self.typecode, [float('nan')])
  1228. self.assertIs(a != b, True)
  1229. self.assertIs(a == b, False)
  1230. self.assertIs(a > b, False)
  1231. self.assertIs(a >= b, False)
  1232. self.assertIs(a < b, False)
  1233. self.assertIs(a <= b, False)
  1234. def test_byteswap(self):
  1235. a = array.array(self.typecode, self.example)
  1236. self.assertRaises(TypeError, a.byteswap, 42)
  1237. if a.itemsize in (1, 2, 4, 8):
  1238. b = array.array(self.typecode, self.example)
  1239. b.byteswap()
  1240. if a.itemsize==1:
  1241. self.assertEqual(a, b)
  1242. else:
  1243. # On alphas treating the byte swapped bit patters as
  1244. # floats/doubles results in floating point exceptions
  1245. # => compare the 8bit string values instead
  1246. self.assertNotEqual(a.tobytes(), b.tobytes())
  1247. b.byteswap()
  1248. self.assertEqual(a, b)
  1249. class FloatTest(FPTest, unittest.TestCase):
  1250. typecode = 'f'
  1251. minitemsize = 4
  1252. class DoubleTest(FPTest, unittest.TestCase):
  1253. typecode = 'd'
  1254. minitemsize = 8
  1255. def test_alloc_overflow(self):
  1256. from sys import maxsize
  1257. a = array.array('d', [-1]*65536)
  1258. try:
  1259. a *= maxsize//65536 + 1
  1260. except MemoryError:
  1261. pass
  1262. else:
  1263. self.fail("Array of size > maxsize created - MemoryError expected")
  1264. b = array.array('d', [ 2.71828183, 3.14159265, -1])
  1265. try:
  1266. b * (maxsize//3 + 1)
  1267. except MemoryError:
  1268. pass
  1269. else:
  1270. self.fail("Array of size > maxsize created - MemoryError expected")
  1271. class LargeArrayTest(unittest.TestCase):
  1272. typecode = 'b'
  1273. def example(self, size):
  1274. # We assess a base memuse of <=2.125 for constructing this array
  1275. base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8)
  1276. base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11])
  1277. return base
  1278. @support.bigmemtest(_2G, memuse=2.125)
  1279. def test_example_data(self, size):
  1280. example = self.example(size)
  1281. self.assertEqual(len(example), size+4)
  1282. @support.bigmemtest(_2G, memuse=2.125)
  1283. def test_access(self, size):
  1284. example = self.example(size)
  1285. self.assertEqual(example[0], 0)
  1286. self.assertEqual(example[-(size+4)], 0)
  1287. self.assertEqual(example[size], 8)
  1288. self.assertEqual(example[-4], 8)
  1289. self.assertEqual(example[size+3], 11)
  1290. self.assertEqual(example[-1], 11)
  1291. @support.bigmemtest(_2G, memuse=2.125+1)
  1292. def test_slice(self, size):
  1293. example = self.example(size)
  1294. self.assertEqual(list(example[:4]), [0, 1, 2, 3])
  1295. self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
  1296. part = example[1:-1]
  1297. self.assertEqual(len(part), size+2)
  1298. self.assertEqual(part[0], 1)
  1299. self.assertEqual(part[-1], 10)
  1300. del part
  1301. part = example[::2]
  1302. self.assertEqual(len(part), (size+5)//2)
  1303. self.assertEqual(list(part[:4]), [0, 2, 4, 6])
  1304. if size % 2:
  1305. self.assertEqual(list(part[-2:]), [9, 11])
  1306. else:
  1307. self.assertEqual(list(part[-2:]), [8, 10])
  1308. @support.bigmemtest(_2G, memuse=2.125)
  1309. def test_count(self, size):
  1310. example = self.example(size)
  1311. self.assertEqual(example.count(0), size//8)
  1312. self.assertEqual(example.count(11), 1)
  1313. @support.bigmemtest(_2G, memuse=2.125)
  1314. def test_append(self, size):
  1315. example = self.example(size)
  1316. example.append(12)
  1317. self.assertEqual(example[-1], 12)
  1318. @support.bigmemtest(_2G, memuse=2.125)
  1319. def test_extend(self, size):
  1320. example = self.example(size)
  1321. example.extend(iter([12, 13, 14, 15]))
  1322. self.assertEqual(len(example), size+8)
  1323. self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
  1324. @support.bigmemtest(_2G, memuse=2.125)
  1325. def test_frombytes(self, size):
  1326. example = self.example(size)
  1327. example.frombytes(b'abcd')
  1328. self.assertEqual(len(example), size+8)
  1329. self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd'))
  1330. @support.bigmemtest(_2G, memuse=2.125)
  1331. def test_fromlist(self, size):
  1332. example = self.example(size)
  1333. example.fromlist([12, 13, 14, 15])
  1334. self.assertEqual(len(example), size+8)
  1335. self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15])
  1336. @support.bigmemtest(_2G, memuse=2.125)
  1337. def test_index(self, size):
  1338. example = self.example(size)
  1339. self.assertEqual(example.index(0), 0)
  1340. self.assertEqual(example.index(1), 1)
  1341. self.assertEqual(example.index(7), 7)
  1342. self.assertEqual(example.index(11), size+3)
  1343. @support.bigmemtest(_2G, memuse=2.125)
  1344. def test_insert(self, size):
  1345. example = self.example(size)
  1346. example.insert(0, 12)
  1347. example.insert(10, 13)
  1348. example.insert(size+1, 14)
  1349. self.assertEqual(len(example), size+7)
  1350. self.assertEqual(example[0], 12)
  1351. self.assertEqual(example[10], 13)
  1352. self.assertEqual(example[size+1], 14)
  1353. @support.bigmemtest(_2G, memuse=2.125)
  1354. def test_pop(self, size):
  1355. example = self.example(size)
  1356. self.assertEqual(example.pop(0), 0)
  1357. self.assertEqual(example[0], 1)
  1358. self.assertEqual(example.pop(size+1), 10)
  1359. self.assertEqual(example[size+1], 11)
  1360. self.assertEqual(example.pop(1), 2)
  1361. self.assertEqual(example[1], 3)
  1362. self.assertEqual(len(example), size+1)
  1363. self.assertEqual(example.pop(), 11)
  1364. self.assertEqual(len(example), size)
  1365. @support.bigmemtest(_2G, memuse=2.125)
  1366. def test_remove(self, size):
  1367. example = self.example(size)
  1368. example.remove(0)
  1369. self.assertEqual(len(example), size+3)
  1370. self.assertEqual(example[0], 1)
  1371. example.remove(10)
  1372. self.assertEqual(len(example), size+2)
  1373. self.assertEqual(example[size], 9)
  1374. self.assertEqual(example[size+1], 11)
  1375. @support.bigmemtest(_2G, memuse=2.125)
  1376. def test_reverse(self, size):
  1377. example = self.example(size)
  1378. example.reverse()
  1379. self.assertEqual(len(example), size+4)
  1380. self.assertEqual(example[0], 11)
  1381. self.assertEqual(example[3], 8)
  1382. self.assertEqual(example[-1], 0)
  1383. example.reverse()
  1384. self.assertEqual(len(example), size+4)
  1385. self.assertEqual(list(example[:4]), [0, 1, 2, 3])
  1386. self.assertEqual(list(example[-4:]), [8, 9, 10, 11])
  1387. # list takes about 9 bytes per element
  1388. @support.bigmemtest(_2G, memuse=2.125+9)
  1389. def test_tolist(self, size):
  1390. example = self.example(size)
  1391. ls = example.tolist()
  1392. self.assertEqual(len(ls), len(example))
  1393. self.assertEqual(ls[:8], list(example[:8]))
  1394. self.assertEqual(ls[-8:], list(example[-8:]))
  1395. if __name__ == "__main__":
  1396. unittest.main()