Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_int.py

    r2 r391  
    22
    33import unittest
     4from test import test_support
    45from test.test_support import run_unittest, have_unicode
     6import math
    57
    68L = [
     
    4446]
    4547
    46 class IntTestCases(unittest.TestCase):
     48class IntLongCommonTests(object):
     49
     50    """Mixin of test cases to share between both test_int and test_long."""
     51
     52    # Change to int or long in the TestCase subclass.
     53    ntype = None
     54
     55    def test_no_args(self):
     56        self.assertEqual(self.ntype(), 0)
     57
     58    def test_keyword_args(self):
     59        # Test invoking constructor using keyword arguments.
     60        self.assertEqual(self.ntype(x=1.2), 1)
     61        self.assertEqual(self.ntype('100', base=2), 4)
     62        self.assertEqual(self.ntype(x='100', base=2), 4)
     63        self.assertRaises(TypeError, self.ntype, base=10)
     64        self.assertRaises(TypeError, self.ntype, base=0)
     65
     66class IntTestCases(IntLongCommonTests, unittest.TestCase):
     67
     68    ntype = int
    4769
    4870    def test_basic(self):
     
    7698        x = int(s)
    7799        self.assertEqual(x+1, -sys.maxint)
    78         self.assert_(isinstance(x, int))
     100        self.assertIsInstance(x, int)
    79101        # should return long
    80102        self.assertEqual(int(s[1:]), sys.maxint+1)
     
    82104        # should return long
    83105        x = int(1e100)
    84         self.assert_(isinstance(x, long))
     106        self.assertIsInstance(x, long)
    85107        x = int(-1e100)
    86         self.assert_(isinstance(x, long))
     108        self.assertIsInstance(x, long)
    87109
    88110
     
    102124
    103125        x = int('1' * 600)
    104         self.assert_(isinstance(x, long))
     126        self.assertIsInstance(x, long)
    105127
    106128        if have_unicode:
    107129            x = int(unichr(0x661) * 600)
    108             self.assert_(isinstance(x, long))
     130            self.assertIsInstance(x, long)
    109131
    110132        self.assertRaises(TypeError, int, 1, 12)
     
    175197        self.assertEqual(int(' 0X123  ', 0), 291)
    176198        self.assertEqual(int(' 0B100 ', 0), 4)
     199        self.assertEqual(int('0', 0), 0)
     200        self.assertEqual(int('+0', 0), 0)
     201        self.assertEqual(int('-0', 0), 0)
     202        self.assertEqual(int('00', 0), 0)
     203        self.assertRaises(ValueError, int, '08', 0)
     204        self.assertRaises(ValueError, int, '-012395', 0)
    177205
    178206        # without base still base 10
     
    241269        self.assertEqual(int('1z141z5', 36), 4294967297L)
    242270
     271    def test_bit_length(self):
     272        tiny = 1e-10
     273        for x in xrange(-65000, 65000):
     274            k = x.bit_length()
     275            # Check equivalence with Python version
     276            self.assertEqual(k, len(bin(x).lstrip('-0b')))
     277            # Behaviour as specified in the docs
     278            if x != 0:
     279                self.assertTrue(2**(k-1) <= abs(x) < 2**k)
     280            else:
     281                self.assertEqual(k, 0)
     282            # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
     283            if x != 0:
     284                # When x is an exact power of 2, numeric errors can
     285                # cause floor(log(x)/log(2)) to be one too small; for
     286                # small x this can be fixed by adding a small quantity
     287                # to the quotient before taking the floor.
     288                self.assertEqual(k, 1 + math.floor(
     289                        math.log(abs(x))/math.log(2) + tiny))
     290
     291        self.assertEqual((0).bit_length(), 0)
     292        self.assertEqual((1).bit_length(), 1)
     293        self.assertEqual((-1).bit_length(), 1)
     294        self.assertEqual((2).bit_length(), 2)
     295        self.assertEqual((-2).bit_length(), 2)
     296        for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64]:
     297            a = 2**i
     298            self.assertEqual((a-1).bit_length(), i)
     299            self.assertEqual((1-a).bit_length(), i)
     300            self.assertEqual((a).bit_length(), i+1)
     301            self.assertEqual((-a).bit_length(), i+1)
     302            self.assertEqual((a+1).bit_length(), i+1)
     303            self.assertEqual((-a-1).bit_length(), i+1)
     304
     305    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
     306                         "test requires IEEE 754 doubles")
     307    def test_float_conversion(self):
     308        # values exactly representable as floats
     309        exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
     310                         2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
     311                         -2**64, 10**20, 10**21, 10**22]
     312        for value in exact_values:
     313            self.assertEqual(int(float(int(value))), value)
     314
     315        # test round-half-to-even
     316        self.assertEqual(int(float(2**53+1)), 2**53)
     317        self.assertEqual(int(float(2**53+2)), 2**53+2)
     318        self.assertEqual(int(float(2**53+3)), 2**53+4)
     319        self.assertEqual(int(float(2**53+5)), 2**53+4)
     320        self.assertEqual(int(float(2**53+6)), 2**53+6)
     321        self.assertEqual(int(float(2**53+7)), 2**53+8)
     322
     323        self.assertEqual(int(float(-2**53-1)), -2**53)
     324        self.assertEqual(int(float(-2**53-2)), -2**53-2)
     325        self.assertEqual(int(float(-2**53-3)), -2**53-4)
     326        self.assertEqual(int(float(-2**53-5)), -2**53-4)
     327        self.assertEqual(int(float(-2**53-6)), -2**53-6)
     328        self.assertEqual(int(float(-2**53-7)), -2**53-8)
     329
     330        self.assertEqual(int(float(2**54-2)), 2**54-2)
     331        self.assertEqual(int(float(2**54-1)), 2**54)
     332        self.assertEqual(int(float(2**54+2)), 2**54)
     333        self.assertEqual(int(float(2**54+3)), 2**54+4)
     334        self.assertEqual(int(float(2**54+5)), 2**54+4)
     335        self.assertEqual(int(float(2**54+6)), 2**54+8)
     336        self.assertEqual(int(float(2**54+10)), 2**54+8)
     337        self.assertEqual(int(float(2**54+11)), 2**54+12)
     338
     339    def test_valid_non_numeric_input_types_for_x(self):
     340        # Test possible valid non-numeric types for x, including subclasses
     341        # of the allowed built-in types.
     342        class CustomStr(str): pass
     343        values = ['100', CustomStr('100')]
     344
     345        if have_unicode:
     346            class CustomUnicode(unicode): pass
     347            values += [unicode('100'), CustomUnicode(unicode('100'))]
     348
     349        for x in values:
     350            msg = 'x has value %s and type %s' % (x, type(x).__name__)
     351            try:
     352                self.assertEqual(int(x), 100, msg=msg)
     353                self.assertEqual(int(x, 2), 4, msg=msg)
     354            except TypeError, err:
     355                raise AssertionError('For %s got TypeError: %s' %
     356                                     (type(x).__name__, err))
     357
     358    def test_error_on_string_float_for_x(self):
     359        self.assertRaises(ValueError, int, '1.2')
     360
     361    def test_error_on_bytearray_for_x(self):
     362        self.assertRaises(TypeError, int, bytearray('100'), 2)
     363
     364    def test_error_on_invalid_int_bases(self):
     365        for base in [-1, 1, 1000]:
     366            self.assertRaises(ValueError, int, '100', base)
     367
     368    def test_error_on_string_base(self):
     369        self.assertRaises(TypeError, int, 100, base='foo')
     370
     371    @test_support.cpython_only
     372    def test_small_ints(self):
     373        self.assertIs(int('10'), 10)
     374        self.assertIs(int('-1'), -1)
     375        if have_unicode:
     376            self.assertIs(int(u'10'), 10)
     377            self.assertIs(int(u'-1'), -1)
     378
    243379    def test_intconversion(self):
    244380        # Test __int__()
     
    318454                    int(TruncReturnsNonIntegral())
    319455                except TypeError as e:
    320                     self.assertEquals(str(e),
     456                    self.assertEqual(str(e),
    321457                                      "__trunc__ returned non-Integral"
    322458                                      " (type NonIntegral)")
Note: See TracChangeset for help on using the changeset viewer.