11from test import test_support
2- from test .test_support import bigmemtest , _1G , _2G
2+ from test .test_support import bigmemtest , _1G , _2G , _4G , precisionbigmemtest
33
44import unittest
55import operator
@@ -54,6 +54,22 @@ def test_center(self, size):
5454 self .assertEquals (s [lpadsize :- rpadsize ], SUBSTR )
5555 self .assertEquals (s .strip (), SUBSTR .strip ())
5656
57+ @precisionbigmemtest (size = _2G - 1 , memuse = 1 )
58+ def test_center_unicode (self , size ):
59+ SUBSTR = u' abc def ghi'
60+ try :
61+ s = SUBSTR .center (size )
62+ except OverflowError :
63+ pass # acceptable on 32-bit
64+ else :
65+ self .assertEquals (len (s ), size )
66+ lpadsize = rpadsize = (len (s ) - len (SUBSTR )) // 2
67+ if len (s ) % 2 :
68+ lpadsize += 1
69+ self .assertEquals (s [lpadsize :- rpadsize ], SUBSTR )
70+ self .assertEquals (s .strip (), SUBSTR .strip ())
71+ del s
72+
5773 @bigmemtest (minsize = _2G , memuse = 2 )
5874 def test_count (self , size ):
5975 SUBSTR = ' abc def ghi'
@@ -70,10 +86,51 @@ def test_decode(self, size):
7086 s = '.' * size
7187 self .assertEquals (len (s .decode ('utf-8' )), size )
7288
89+ def basic_encode_test (self , size , enc , c = u'.' , expectedsize = None ):
90+ if expectedsize is None :
91+ expectedsize = size
92+
93+ s = c * size
94+ self .assertEquals (len (s .encode (enc )), expectedsize )
95+
7396 @bigmemtest (minsize = _2G + 2 , memuse = 3 )
7497 def test_encode (self , size ):
75- s = u'.' * size
76- self .assertEquals (len (s .encode ('utf-8' )), size )
98+ return self .basic_encode_test (size , 'utf-8' )
99+
100+ @precisionbigmemtest (size = _4G / 6 + 2 , memuse = 2 )
101+ def test_encode_raw_unicode_escape (self , size ):
102+ try :
103+ return self .basic_encode_test (size , 'raw_unicode_escape' )
104+ except MemoryError :
105+ pass # acceptable on 32-bit
106+
107+ @precisionbigmemtest (size = _4G / 5 + 70 , memuse = 3 )
108+ def test_encode_utf7 (self , size ):
109+ try :
110+ return self .basic_encode_test (size , 'utf7' )
111+ except MemoryError :
112+ pass # acceptable on 32-bit
113+
114+ @precisionbigmemtest (size = _4G / 4 + 5 , memuse = 6 )
115+ def test_encode_utf32 (self , size ):
116+ try :
117+ return self .basic_encode_test (size , 'utf32' , expectedsize = 4 * size + 4 )
118+ except MemoryError :
119+ pass # acceptable on 32-bit
120+
121+ @precisionbigmemtest (size = _2G - 1 , memuse = 2 )
122+ def test_decodeascii (self , size ):
123+ return self .basic_encode_test (size , 'ascii' , c = 'A' )
124+
125+ @precisionbigmemtest (size = _4G / 5 , memuse = 6 + 2 )
126+ def test_unicode_repr_oflw (self , size ):
127+ try :
128+ s = u"\uAAAA " * size
129+ r = repr (s )
130+ except MemoryError :
131+ pass # acceptable on 32-bit
132+ else :
133+ self .failUnless (s == eval (r ))
77134
78135 @bigmemtest (minsize = _2G , memuse = 2 )
79136 def test_endswith (self , size ):
@@ -459,6 +516,11 @@ def test_repr_large(self, size):
459516 self .assertEquals (s .count ('\\ ' ), size )
460517 self .assertEquals (s .count ('0' ), size * 2 )
461518
519+ @bigmemtest (minsize = 2 ** 32 / 5 , memuse = 6 + 2 )
520+ def test_unicode_repr (self , size ):
521+ s = u"\uAAAA " * size
522+ self .failUnless (len (repr (s )) > size )
523+
462524 # This test is meaningful even with size < 2G, as long as the
463525 # doubled string is > 2G (but it tests more if both are > 2G :)
464526 @bigmemtest (minsize = _1G + 2 , memuse = 3 )
@@ -642,6 +704,35 @@ def test_repeat_small(self, size):
642704 def test_repeat_large (self , size ):
643705 return self .basic_test_repeat (size )
644706
707+ @bigmemtest (minsize = _1G - 1 , memuse = 12 )
708+ def test_repeat_large_2 (self , size ):
709+ return self .basic_test_repeat (size )
710+
711+ @precisionbigmemtest (size = _1G - 1 , memuse = 9 )
712+ def test_from_2G_generator (self , size ):
713+ try :
714+ t = tuple (xrange (size ))
715+ except MemoryError :
716+ pass # acceptable on 32-bit
717+ else :
718+ count = 0
719+ for item in t :
720+ self .assertEquals (item , count )
721+ count += 1
722+ self .assertEquals (count , size )
723+
724+ @precisionbigmemtest (size = _1G - 25 , memuse = 9 )
725+ def test_from_almost_2G_generator (self , size ):
726+ try :
727+ t = tuple (xrange (size ))
728+ count = 0
729+ for item in t :
730+ self .assertEquals (item , count )
731+ count += 1
732+ self .assertEquals (count , size )
733+ except MemoryError :
734+ pass # acceptable, expected on 32-bit
735+
645736 # Like test_concat, split in two.
646737 def basic_test_repr (self , size ):
647738 t = (0 ,) * size
@@ -957,8 +1048,23 @@ def test_sort(self, size):
9571048 self .assertEquals (l [:10 ], [1 ] * 10 )
9581049 self .assertEquals (l [- 10 :], [5 ] * 10 )
9591050
1051+ class BufferTest (unittest .TestCase ):
1052+
1053+ @precisionbigmemtest (size = _1G , memuse = 4 )
1054+ def test_repeat (self , size ):
1055+ try :
1056+ b = buffer ("AAAA" )* size
1057+ except MemoryError :
1058+ pass # acceptable on 32-bit
1059+ else :
1060+ count = 0
1061+ for c in b :
1062+ self .assertEquals (c , 'A' )
1063+ count += 1
1064+ self .assertEquals (count , size * 4 )
1065+
9601066def test_main ():
961- test_support .run_unittest (StrTest , TupleTest , ListTest )
1067+ test_support .run_unittest (StrTest , TupleTest , ListTest , BufferTest )
9621068
9631069if __name__ == '__main__' :
9641070 if len (sys .argv ) > 1 :
0 commit comments