diff options
Diffstat (limited to 'Lib/test/test_array.py')
| -rw-r--r--[-rwxr-xr-x] | Lib/test/test_array.py | 205 | 
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()  | 
