Changeset 391 for python/trunk/Lib/test/test_int.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_int.py
r2 r391 2 2 3 3 import unittest 4 from test import test_support 4 5 from test.test_support import run_unittest, have_unicode 6 import math 5 7 6 8 L = [ … … 44 46 ] 45 47 46 class IntTestCases(unittest.TestCase): 48 class 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 66 class IntTestCases(IntLongCommonTests, unittest.TestCase): 67 68 ntype = int 47 69 48 70 def test_basic(self): … … 76 98 x = int(s) 77 99 self.assertEqual(x+1, -sys.maxint) 78 self.assert _(isinstance(x, int))100 self.assertIsInstance(x, int) 79 101 # should return long 80 102 self.assertEqual(int(s[1:]), sys.maxint+1) … … 82 104 # should return long 83 105 x = int(1e100) 84 self.assert _(isinstance(x, long))106 self.assertIsInstance(x, long) 85 107 x = int(-1e100) 86 self.assert _(isinstance(x, long))108 self.assertIsInstance(x, long) 87 109 88 110 … … 102 124 103 125 x = int('1' * 600) 104 self.assert _(isinstance(x, long))126 self.assertIsInstance(x, long) 105 127 106 128 if have_unicode: 107 129 x = int(unichr(0x661) * 600) 108 self.assert _(isinstance(x, long))130 self.assertIsInstance(x, long) 109 131 110 132 self.assertRaises(TypeError, int, 1, 12) … … 175 197 self.assertEqual(int(' 0X123 ', 0), 291) 176 198 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) 177 205 178 206 # without base still base 10 … … 241 269 self.assertEqual(int('1z141z5', 36), 4294967297L) 242 270 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 243 379 def test_intconversion(self): 244 380 # Test __int__() … … 318 454 int(TruncReturnsNonIntegral()) 319 455 except TypeError as e: 320 self.assertEqual s(str(e),456 self.assertEqual(str(e), 321 457 "__trunc__ returned non-Integral" 322 458 " (type NonIntegral)")
Note:
See TracChangeset
for help on using the changeset viewer.