~pythonregexp2.7/python/issue2636

« back to all changes in this revision

Viewing changes to Lib/test/test_sys.py

  • Committer: Jeffrey C. "The TimeHorse" Jacobs
  • Date: 2008-06-09 14:36:32 UTC
  • mfrom: (39021.1.402 Regexp-2.6)
  • Revision ID: darklord@timehorse.com-20080609143632-wwwkx92u1t5l7yd3
Merged in changes from the latest python source snapshot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# -*- coding: iso-8859-1 -*-
2
2
import unittest, test.test_support
3
 
import sys, cStringIO
 
3
import sys, cStringIO, os
4
4
 
5
5
class SysModuleTest(unittest.TestCase):
6
6
 
385
385
##        self.assert_(r[0][2] > 100, r[0][2])
386
386
##        self.assert_(r[1][2] > 100, r[1][2])
387
387
 
 
388
    def test_ioencoding(self):
 
389
        import subprocess,os
 
390
        env = dict(os.environ)
 
391
 
 
392
        # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424,
 
393
        # not representable in ASCII.
 
394
 
 
395
        env["PYTHONIOENCODING"] = "cp424"
 
396
        p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'],
 
397
                             stdout = subprocess.PIPE, env=env)
 
398
        out = p.stdout.read().strip()
 
399
        self.assertEqual(out, unichr(0xa2).encode("cp424"))
 
400
 
 
401
        env["PYTHONIOENCODING"] = "ascii:replace"
 
402
        p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'],
 
403
                             stdout = subprocess.PIPE, env=env)
 
404
        out = p.stdout.read().strip()
 
405
        self.assertEqual(out, '?')
 
406
 
 
407
 
 
408
class SizeofTest(unittest.TestCase):
 
409
 
 
410
    def setUp(self):
 
411
        import struct
 
412
        self.i = len(struct.pack('i', 0))
 
413
        self.l = len(struct.pack('l', 0))
 
414
        self.p = len(struct.pack('P', 0))
 
415
        self.headersize = self.l + self.p
 
416
        if hasattr(sys, "gettotalrefcount"):
 
417
            self.headersize += 2 * self.p
 
418
        self.file = open(test.test_support.TESTFN, 'wb')
 
419
 
 
420
    def tearDown(self):
 
421
        self.file.close()
 
422
        test.test_support.unlink(test.test_support.TESTFN)
 
423
 
 
424
    def check_sizeof(self, o, size):
 
425
        result = sys.getsizeof(o)
 
426
        msg = 'wrong size for %s: got %d, expected %d' \
 
427
            % (type(o), result, size)
 
428
        self.assertEqual(result, size, msg)
 
429
 
 
430
    def align(self, value):
 
431
        mod = value % self.p
 
432
        if mod != 0:
 
433
            return value - mod + self.p
 
434
        else:
 
435
            return value
 
436
 
 
437
    def test_align(self):
 
438
        self.assertEqual(self.align(0) % self.p, 0)
 
439
        self.assertEqual(self.align(1) % self.p, 0)
 
440
        self.assertEqual(self.align(3) % self.p, 0)
 
441
        self.assertEqual(self.align(4) % self.p, 0)
 
442
        self.assertEqual(self.align(7) % self.p, 0)
 
443
        self.assertEqual(self.align(8) % self.p, 0)
 
444
        self.assertEqual(self.align(9) % self.p, 0)
 
445
 
 
446
    def test_standardtypes(self):
 
447
        i = self.i
 
448
        l = self.l
 
449
        p = self.p
 
450
        h = self.headersize
 
451
        # bool
 
452
        self.check_sizeof(True, h + l)
 
453
        # buffer
 
454
        self.check_sizeof(buffer(''), h + 2*p + 2*l + self.align(i) +l)
 
455
        # cell
 
456
        def get_cell():
 
457
            x = 42
 
458
            def inner():
 
459
                return x
 
460
            return inner
 
461
        self.check_sizeof(get_cell().func_closure[0], h + p)
 
462
        # old-style class
 
463
        class class_oldstyle():
 
464
            def method():
 
465
                pass
 
466
        self.check_sizeof(class_oldstyle, h + 6*p)
 
467
        # instance
 
468
        self.check_sizeof(class_oldstyle(), h + 3*p)
 
469
        # method
 
470
        self.check_sizeof(class_oldstyle().method, h + 4*p)
 
471
        # code
 
472
        self.check_sizeof(get_cell().func_code, h + self.align(4*i) + 8*p +\
 
473
                            self.align(i) + 2*p)
 
474
        # complex
 
475
        self.check_sizeof(complex(0,1), h + 2*8)
 
476
        # enumerate
 
477
        self.check_sizeof(enumerate([]), h + l + 3*p)
 
478
        # reverse
 
479
        self.check_sizeof(reversed(''), h + l + p )
 
480
        # file
 
481
        self.check_sizeof(self.file, h + 4*p + self.align(2*i) + 4*p +\
 
482
                            self.align(3*i) + 3*p + self.align(i))
 
483
        # float
 
484
        self.check_sizeof(float(0), h + 8)
 
485
        # function
 
486
        def func(): pass
 
487
        self.check_sizeof(func, h + 9 * l)
 
488
        class c():
 
489
            @staticmethod
 
490
            def foo():
 
491
                pass
 
492
            @classmethod
 
493
            def bar(cls):
 
494
                pass
 
495
            # staticmethod
 
496
            self.check_sizeof(foo, h + l)
 
497
            # classmethod
 
498
            self.check_sizeof(bar, h + l)
 
499
        # generator
 
500
        def get_gen(): yield 1
 
501
        self.check_sizeof(get_gen(), h + p + self.align(i) + 2*p)
 
502
        # integer
 
503
        self.check_sizeof(1, h + l)
 
504
        # builtin_function_or_method
 
505
        self.check_sizeof(abs, h + 3*p)
 
506
        # module
 
507
        self.check_sizeof(unittest, h + p)
 
508
        # xrange
 
509
        self.check_sizeof(xrange(1), h + 3*p)
 
510
        # slice
 
511
        self.check_sizeof(slice(0), h + 3*p)
 
512
 
 
513
        h += l
 
514
        # new-style class
 
515
        class class_newstyle(object):
 
516
            def method():
 
517
                pass
 
518
        # type (PyTypeObject + PyNumberMethods +  PyMappingMethods +
 
519
        #       PySequenceMethods +  PyBufferProcs)
 
520
        len_typeobject = p + 2*l + 15*p + l + 4*p + l + 9*p + l + 11*p
 
521
        self.check_sizeof(class_newstyle,
 
522
                          h + len_typeobject + 42*p + 10*p + 3*p + 6*p)
 
523
 
 
524
 
 
525
    def test_specialtypes(self):
 
526
        i = self.i
 
527
        l = self.l
 
528
        p = self.p
 
529
        h = self.headersize
 
530
        # dict
 
531
        self.check_sizeof({}, h + 3*l + 3*p + 8*(l + 2*p))
 
532
        longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8}
 
533
        self.check_sizeof(longdict, h + 3*l + 3*p + 8*(l + 2*p) + 16*(l + 2*p))
 
534
        # list
 
535
        self.check_sizeof([], h + l + p + l)
 
536
        self.check_sizeof([1, 2, 3], h + l + p + l + 3*l)
 
537
 
 
538
        h += l
 
539
        # long
 
540
        self.check_sizeof(0L, h + self.align(2))
 
541
        self.check_sizeof(1L, h + self.align(2))
 
542
        self.check_sizeof(-1L, h + self.align(2))
 
543
        self.check_sizeof(32768L, h + self.align(2) + 2)
 
544
        self.check_sizeof(32768L*32768L-1, h + self.align(2) + 2)
 
545
        self.check_sizeof(32768L*32768L, h + self.align(2) + 4)
 
546
        # string
 
547
        self.check_sizeof('', h + l + self.align(i + 1))
 
548
        self.check_sizeof('abc', h + l + self.align(i + 1) + 3)
 
549
 
 
550
 
388
551
def test_main():
389
 
    test.test_support.run_unittest(SysModuleTest)
 
552
    test_classes = (SysModuleTest, SizeofTest)
 
553
 
 
554
    test.test_support.run_unittest(*test_classes)
390
555
 
391
556
if __name__ == "__main__":
392
557
    test_main()