summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_array.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_array.py')
-rw-r--r--[-rwxr-xr-x]Lib/test/test_array.py205
1 files changed, 113 insertions, 92 deletions
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index e26e9ad..d68284f 100755..100644
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -1,4 +1,3 @@
-#! /usr/bin/env python3
"""Test the arraymodule.
Roger E. Masse
"""
@@ -11,11 +10,22 @@ import operator
import io
import math
import struct
+import sys
import warnings
import array
from array import _array_reconstructor as array_reconstructor
+try:
+ # Try to determine availability of long long independently
+ # of the array module under test
+ struct.calcsize('@q')
+ have_long_long = True
+except struct.error:
+ have_long_long = False
+
+sizeof_wchar = array.array('u').itemsize
+
class ArraySubclass(array.array):
pass
@@ -24,8 +34,9 @@ class ArraySubclassWithKwargs(array.array):
def __init__(self, typecode, newarg=None):
array.array.__init__(self)
-tests = [] # list to accumulate all tests
typecodes = "ubBhHiIlLfd"
+if have_long_long:
+ typecodes += 'qQ'
class BadConstructorTest(unittest.TestCase):
@@ -35,7 +46,6 @@ class BadConstructorTest(unittest.TestCase):
self.assertRaises(TypeError, array.array, 'xx')
self.assertRaises(ValueError, array.array, 'x')
-tests.append(BadConstructorTest)
# Machine format codes.
#
@@ -165,10 +175,7 @@ class ArrayReconstructorTest(unittest.TestCase):
msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
-tests.append(ArrayReconstructorTest)
-
-
-class BaseTest(unittest.TestCase):
+class BaseTest:
# Required class attributes (provided by subclasses
# typecode: the typecode to test
# example: an initializer usable in the constructor for this type
@@ -187,7 +194,7 @@ class BaseTest(unittest.TestCase):
def test_constructor(self):
a = array.array(self.typecode)
self.assertEqual(a.typecode, self.typecode)
- self.assertTrue(a.itemsize>=self.minitemsize)
+ self.assertGreaterEqual(a.itemsize, self.minitemsize)
self.assertRaises(TypeError, array.array, self.typecode, None)
def test_len(self):
@@ -209,10 +216,14 @@ class BaseTest(unittest.TestCase):
self.assertEqual(bi[1], len(a))
def test_byteswap(self):
- a = array.array(self.typecode, self.example)
+ if self.typecode == 'u':
+ example = '\U00100100'
+ else:
+ example = self.example
+ a = array.array(self.typecode, example)
self.assertRaises(TypeError, a.byteswap, 42)
if a.itemsize in (1, 2, 4, 8):
- b = array.array(self.typecode, self.example)
+ b = array.array(self.typecode, example)
b.byteswap()
if a.itemsize==1:
self.assertEqual(a, b)
@@ -272,6 +283,20 @@ class BaseTest(unittest.TestCase):
self.assertEqual(a.x, b.x)
self.assertEqual(type(a), type(b))
+ def test_iterator_pickle(self):
+ data = array.array(self.typecode, self.example)
+ orgit = iter(data)
+ d = pickle.dumps(orgit)
+ it = pickle.loads(d)
+ self.assertEqual(type(orgit), type(it))
+ self.assertEqual(list(it), list(data))
+
+ if len(data):
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(list(it), list(data)[1:])
+
def test_insert(self):
a = array.array(self.typecode, self.example)
a.insert(0, self.example[0])
@@ -416,39 +441,39 @@ class BaseTest(unittest.TestCase):
def test_cmp(self):
a = array.array(self.typecode, self.example)
- self.assertTrue((a == 42) is False)
- self.assertTrue((a != 42) is True)
+ self.assertIs(a == 42, False)
+ self.assertIs(a != 42, True)
- self.assertTrue((a == a) is True)
- self.assertTrue((a != a) is False)
- self.assertTrue((a < a) is False)
- self.assertTrue((a <= a) is True)
- self.assertTrue((a > a) is False)
- self.assertTrue((a >= a) is True)
+ self.assertIs(a == a, True)
+ self.assertIs(a != a, False)
+ self.assertIs(a < a, False)
+ self.assertIs(a <= a, True)
+ self.assertIs(a > a, False)
+ self.assertIs(a >= a, True)
al = array.array(self.typecode, self.smallerexample)
ab = array.array(self.typecode, self.biggerexample)
- self.assertTrue((a == 2*a) is False)
- self.assertTrue((a != 2*a) is True)
- self.assertTrue((a < 2*a) is True)
- self.assertTrue((a <= 2*a) is True)
- self.assertTrue((a > 2*a) is False)
- self.assertTrue((a >= 2*a) is False)
-
- self.assertTrue((a == al) is False)
- self.assertTrue((a != al) is True)
- self.assertTrue((a < al) is False)
- self.assertTrue((a <= al) is False)
- self.assertTrue((a > al) is True)
- self.assertTrue((a >= al) is True)
-
- self.assertTrue((a == ab) is False)
- self.assertTrue((a != ab) is True)
- self.assertTrue((a < ab) is True)
- self.assertTrue((a <= ab) is True)
- self.assertTrue((a > ab) is False)
- self.assertTrue((a >= ab) is False)
+ self.assertIs(a == 2*a, False)
+ self.assertIs(a != 2*a, True)
+ self.assertIs(a < 2*a, True)
+ self.assertIs(a <= 2*a, True)
+ self.assertIs(a > 2*a, False)
+ self.assertIs(a >= 2*a, False)
+
+ self.assertIs(a == al, False)
+ self.assertIs(a != al, True)
+ self.assertIs(a < al, False)
+ self.assertIs(a <= al, False)
+ self.assertIs(a > al, True)
+ self.assertIs(a >= al, True)
+
+ self.assertIs(a == ab, False)
+ self.assertIs(a != ab, True)
+ self.assertIs(a < ab, True)
+ self.assertIs(a <= ab, True)
+ self.assertIs(a > ab, False)
+ self.assertIs(a >= ab, False)
def test_add(self):
a = array.array(self.typecode, self.example) \
@@ -467,7 +492,7 @@ class BaseTest(unittest.TestCase):
a = array.array(self.typecode, self.example[::-1])
b = a
a += array.array(self.typecode, 2*self.example)
- self.assertTrue(a is b)
+ self.assertIs(a, b)
self.assertEqual(
a,
array.array(self.typecode, self.example[::-1]+2*self.example)
@@ -522,22 +547,22 @@ class BaseTest(unittest.TestCase):
b = a
a *= 5
- self.assertTrue(a is b)
+ self.assertIs(a, b)
self.assertEqual(
a,
array.array(self.typecode, 5*self.example)
)
a *= 0
- self.assertTrue(a is b)
+ self.assertIs(a, b)
self.assertEqual(a, array.array(self.typecode))
a *= 1000
- self.assertTrue(a is b)
+ self.assertIs(a, b)
self.assertEqual(a, array.array(self.typecode))
a *= -1
- self.assertTrue(a is b)
+ self.assertIs(a, b)
self.assertEqual(a, array.array(self.typecode))
a = array.array(self.typecode, self.example)
@@ -920,7 +945,7 @@ class BaseTest(unittest.TestCase):
try:
import gc
except ImportError:
- return
+ self.skipTest('gc module not available')
a = array.array(self.typecode)
l = [iter(a)]
l.append(l)
@@ -968,15 +993,15 @@ class BaseTest(unittest.TestCase):
s = None
self.assertRaises(ReferenceError, len, p)
+ @unittest.skipUnless(hasattr(sys, 'getrefcount'),
+ 'test needs sys.getrefcount()')
def test_bug_782369(self):
- import sys
- if hasattr(sys, "getrefcount"):
- for i in range(10):
- b = array.array('B', range(64))
- rc = sys.getrefcount(10)
- for i in range(10):
- b = array.array('B', range(64))
- self.assertEqual(rc, sys.getrefcount(10))
+ for i in range(10):
+ b = array.array('B', range(64))
+ rc = sys.getrefcount(10)
+ for i in range(10):
+ b = array.array('B', range(64))
+ self.assertEqual(rc, sys.getrefcount(10))
def test_subclass_with_kwargs(self):
# SF bug #1486663 -- this used to erroneously raise a TypeError
@@ -991,14 +1016,14 @@ class BaseTest(unittest.TestCase):
@support.cpython_only
def test_sizeof_with_buffer(self):
a = array.array(self.typecode, self.example)
- basesize = support.calcvobjsize('4Pi')
+ basesize = support.calcvobjsize('Pn2Pi')
buffer_size = a.buffer_info()[1] * a.itemsize
support.check_sizeof(self, a, basesize + buffer_size)
@support.cpython_only
def test_sizeof_without_buffer(self):
a = array.array(self.typecode)
- basesize = support.calcvobjsize('4Pi')
+ basesize = support.calcvobjsize('Pn2Pi')
support.check_sizeof(self, a, basesize)
@@ -1009,7 +1034,7 @@ class StringTest(BaseTest):
a = array.array(self.typecode, self.example)
self.assertRaises(TypeError, a.__setitem__, 0, self.example[:2])
-class UnicodeTest(StringTest):
+class UnicodeTest(StringTest, unittest.TestCase):
typecode = 'u'
example = '\x01\u263a\x00\ufeff'
smallerexample = '\x01\u263a\x00\ufefe'
@@ -1027,6 +1052,7 @@ class UnicodeTest(StringTest):
a.fromunicode('\x11abc\xff\u1234')
s = a.tounicode()
self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
+ self.assertEqual(a.itemsize, sizeof_wchar)
s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
a = array.array('u', s)
@@ -1036,7 +1062,17 @@ class UnicodeTest(StringTest):
self.assertRaises(TypeError, a.fromunicode)
-tests.append(UnicodeTest)
+ def test_issue17223(self):
+ # this used to crash
+ if sizeof_wchar == 4:
+ # U+FFFFFFFF is an invalid code point in Unicode 6.0
+ invalid_str = b'\xff\xff\xff\xff'
+ else:
+ # PyUnicode_FromUnicode() cannot fail with 16-bit wchar_t
+ self.skipTest("specific to 32-bit wchar_t")
+ a = array.array('u', invalid_str)
+ self.assertRaises(ValueError, a.tounicode)
+ self.assertRaises(ValueError, str, a)
class NumberTest(BaseTest):
@@ -1178,45 +1214,47 @@ class UnsignedNumberTest(NumberTest):
)
-class ByteTest(SignedNumberTest):
+class ByteTest(SignedNumberTest, unittest.TestCase):
typecode = 'b'
minitemsize = 1
-tests.append(ByteTest)
-class UnsignedByteTest(UnsignedNumberTest):
+class UnsignedByteTest(UnsignedNumberTest, unittest.TestCase):
typecode = 'B'
minitemsize = 1
-tests.append(UnsignedByteTest)
-class ShortTest(SignedNumberTest):
+class ShortTest(SignedNumberTest, unittest.TestCase):
typecode = 'h'
minitemsize = 2
-tests.append(ShortTest)
-class UnsignedShortTest(UnsignedNumberTest):
+class UnsignedShortTest(UnsignedNumberTest, unittest.TestCase):
typecode = 'H'
minitemsize = 2
-tests.append(UnsignedShortTest)
-class IntTest(SignedNumberTest):
+class IntTest(SignedNumberTest, unittest.TestCase):
typecode = 'i'
minitemsize = 2
-tests.append(IntTest)
-class UnsignedIntTest(UnsignedNumberTest):
+class UnsignedIntTest(UnsignedNumberTest, unittest.TestCase):
typecode = 'I'
minitemsize = 2
-tests.append(UnsignedIntTest)
-class LongTest(SignedNumberTest):
+class LongTest(SignedNumberTest, unittest.TestCase):
typecode = 'l'
minitemsize = 4
-tests.append(LongTest)
-class UnsignedLongTest(UnsignedNumberTest):
+class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase):
typecode = 'L'
minitemsize = 4
-tests.append(UnsignedLongTest)
+
+@unittest.skipIf(not have_long_long, 'need long long support')
+class LongLongTest(SignedNumberTest, unittest.TestCase):
+ typecode = 'q'
+ minitemsize = 8
+
+@unittest.skipIf(not have_long_long, 'need long long support')
+class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase):
+ typecode = 'Q'
+ minitemsize = 8
class FPTest(NumberTest):
example = [-42.0, 0, 42, 1e5, -1e10]
@@ -1243,12 +1281,11 @@ class FPTest(NumberTest):
b.byteswap()
self.assertEqual(a, b)
-class FloatTest(FPTest):
+class FloatTest(FPTest, unittest.TestCase):
typecode = 'f'
minitemsize = 4
-tests.append(FloatTest)
-class DoubleTest(FPTest):
+class DoubleTest(FPTest, unittest.TestCase):
typecode = 'd'
minitemsize = 8
@@ -1269,22 +1306,6 @@ class DoubleTest(FPTest):
else:
self.fail("Array of size > maxsize created - MemoryError expected")
-tests.append(DoubleTest)
-
-def test_main(verbose=None):
- import sys
-
- support.run_unittest(*tests)
-
- # verify reference counting
- if verbose and hasattr(sys, "gettotalrefcount"):
- import gc
- counts = [None] * 5
- for i in range(len(counts)):
- support.run_unittest(*tests)
- gc.collect()
- counts[i] = sys.gettotalrefcount()
- print(counts)
if __name__ == "__main__":
- test_main(verbose=True)
+ unittest.main()