|
1 | 1 | # -*- coding: iso-8859-1 -*- |
2 | 2 | import unittest, test.support |
3 | | -import sys, io |
| 3 | +import sys, io, os |
4 | 4 |
|
5 | 5 | class SysModuleTest(unittest.TestCase): |
6 | 6 |
|
@@ -369,8 +369,141 @@ def test_ioencoding(self): |
369 | 369 | self.assertEqual(out, b'?') |
370 | 370 |
|
371 | 371 |
|
| 372 | +class SizeofTest(unittest.TestCase): |
| 373 | + |
| 374 | + def setUp(self): |
| 375 | + import struct |
| 376 | + self.i = len(struct.pack('i', 0)) |
| 377 | + self.l = len(struct.pack('l', 0)) |
| 378 | + self.p = len(struct.pack('P', 0)) |
| 379 | + self.headersize = self.l + self.p |
| 380 | + if hasattr(sys, "gettotalrefcount"): |
| 381 | + self.headersize += 2 * self.p |
| 382 | + self.file = open(test.support.TESTFN, 'wb') |
| 383 | + |
| 384 | + def tearDown(self): |
| 385 | + self.file.close() |
| 386 | + test.support.unlink(test.support.TESTFN) |
| 387 | + |
| 388 | + def check_sizeof(self, o, size): |
| 389 | + result = sys.getsizeof(o) |
| 390 | + msg = 'wrong size for %s: got %d, expected %d' \ |
| 391 | + % (type(o), result, size) |
| 392 | + self.assertEqual(result, size, msg) |
| 393 | + |
| 394 | + def align(self, value): |
| 395 | + mod = value % self.p |
| 396 | + if mod != 0: |
| 397 | + return value - mod + self.p |
| 398 | + else: |
| 399 | + return value |
| 400 | + |
| 401 | + def test_align(self): |
| 402 | + self.assertEqual(self.align(0) % self.p, 0) |
| 403 | + self.assertEqual(self.align(1) % self.p, 0) |
| 404 | + self.assertEqual(self.align(3) % self.p, 0) |
| 405 | + self.assertEqual(self.align(4) % self.p, 0) |
| 406 | + self.assertEqual(self.align(7) % self.p, 0) |
| 407 | + self.assertEqual(self.align(8) % self.p, 0) |
| 408 | + self.assertEqual(self.align(9) % self.p, 0) |
| 409 | + |
| 410 | + def test_standardtypes(self): |
| 411 | + i = self.i |
| 412 | + l = self.l |
| 413 | + p = self.p |
| 414 | + h = self.headersize |
| 415 | + # bool |
| 416 | + self.check_sizeof(True, h + 2*l) |
| 417 | + # bytearray |
| 418 | + self.check_sizeof(bytes(), h + self.align(i) + l + p) |
| 419 | + # cell |
| 420 | + def get_cell(): |
| 421 | + x = 42 |
| 422 | + def inner(): |
| 423 | + return x |
| 424 | + return inner |
| 425 | + self.check_sizeof(get_cell().__closure__[0], h + p) |
| 426 | + # code XXX wrong size |
| 427 | + # self.check_sizeof(get_cell().__code__, h + self.align(4*i) + 8*p +\ |
| 428 | + # self.align(i) + 2*p) |
| 429 | + # complex |
| 430 | + self.check_sizeof(complex(0,1), h + 2*8) |
| 431 | + # enumerate |
| 432 | + self.check_sizeof(enumerate([]), h + l + 3*p) |
| 433 | + # reverse |
| 434 | + self.check_sizeof(reversed(''), h + l + p ) |
| 435 | + # file XXX wrong size |
| 436 | + #self.check_sizeof(self.file, h + 4*p + self.align(2*i) + 4*p +\ |
| 437 | + # self.align(3*i) + 3*p + self.align(i)) |
| 438 | + # float |
| 439 | + self.check_sizeof(float(0), h + 8) |
| 440 | + # function |
| 441 | + def func(): pass |
| 442 | + self.check_sizeof(func, h + 11 * p) |
| 443 | + class c(): |
| 444 | + @staticmethod |
| 445 | + def foo(): |
| 446 | + pass |
| 447 | + @classmethod |
| 448 | + def bar(cls): |
| 449 | + pass |
| 450 | + # staticmethod |
| 451 | + self.check_sizeof(foo, h + l) |
| 452 | + # classmethod |
| 453 | + self.check_sizeof(bar, h + l) |
| 454 | + # generator |
| 455 | + def get_gen(): yield 1 |
| 456 | + self.check_sizeof(get_gen(), h + p + self.align(i) + 2*p) |
| 457 | + # builtin_function_or_method |
| 458 | + self.check_sizeof(abs, h + 3*p) |
| 459 | + # module |
| 460 | + self.check_sizeof(unittest, h + p) |
| 461 | + # range |
| 462 | + self.check_sizeof(range(1), h + 3*p) |
| 463 | + # slice |
| 464 | + self.check_sizeof(slice(0), h + 3*p) |
| 465 | + |
| 466 | + h += l |
| 467 | + # new-style class |
| 468 | + class class_newstyle(object): |
| 469 | + def method(): |
| 470 | + pass |
| 471 | + # type (PyTypeObject + PyNumberMethods + PyMappingMethods + |
| 472 | + # PySequenceMethods + PyBufferProcs) |
| 473 | + # XXX wrong size |
| 474 | + # len_typeobject = p + 2*l + 15*p + l + 4*p + l + 9*p + l + 11*p |
| 475 | + # self.check_sizeof(class_newstyle, |
| 476 | + # h + len_typeobject + 42*p + 10*p + 3*p + 6*p) |
| 477 | + |
| 478 | + |
| 479 | + def test_specialtypes(self): |
| 480 | + i = self.i |
| 481 | + l = self.l |
| 482 | + p = self.p |
| 483 | + h = self.headersize |
| 484 | + # dict |
| 485 | + self.check_sizeof({}, h + 3*l + 3*p + 8*(l + 2*p)) |
| 486 | + longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} |
| 487 | + self.check_sizeof(longdict, h + 3*l + 3*p + 8*(l + 2*p) + 16*(l + 2*p)) |
| 488 | + # list |
| 489 | + self.check_sizeof([], h + l + p + l) |
| 490 | + self.check_sizeof([1, 2, 3], h + l + p + l + 3*l) |
| 491 | + |
| 492 | + h += l |
| 493 | + # long |
| 494 | + self.check_sizeof(0, h + self.align(2)) |
| 495 | + self.check_sizeof(1, h + self.align(2)) |
| 496 | + self.check_sizeof(-1, h + self.align(2)) |
| 497 | + self.check_sizeof(32768, h + self.align(2) + 2) |
| 498 | + self.check_sizeof(32768*32768-1, h + self.align(2) + 2) |
| 499 | + self.check_sizeof(32768*32768, h + self.align(2) + 4) |
| 500 | + # XXX add Unicode support |
| 501 | + # self.check_sizeof('', h + l + self.align(i + 1)) |
| 502 | + # self.check_sizeof('abc', h + l + self.align(i + 1) + 3) |
| 503 | + |
| 504 | + |
372 | 505 | def test_main(): |
373 | | - test.support.run_unittest(SysModuleTest) |
| 506 | + test.support.run_unittest(SysModuleTest, SizeofTest) |
374 | 507 |
|
375 | 508 | if __name__ == "__main__": |
376 | 509 | test_main() |
0 commit comments