64
64
ascii_char_size = 1
65
65
ucs2_char_size = 2
66
66
ucs4_char_size = 4
67
+ pointer_size = 4 if sys .maxsize < 2 ** 32 else 8
67
68
68
69
69
70
class BaseStrTest :
@@ -372,7 +373,7 @@ def test_split_small(self, size):
372
373
# suffer for the list size. (Otherwise, it'd cost another 48 times
373
374
# size in bytes!) Nevertheless, a list of size takes
374
375
# 8*size bytes.
375
- @bigmemtest (size = _2G + 5 , memuse = 2 * ascii_char_size + 8 )
376
+ @bigmemtest (size = _2G + 5 , memuse = ascii_char_size * 2 + pointer_size )
376
377
def test_split_large (self , size ):
377
378
_ = self .from_latin1
378
379
s = _ (' a' ) * size + _ (' ' )
@@ -604,15 +605,15 @@ def tearDown(self):
604
605
for name , memuse in self ._adjusted .items ():
605
606
getattr (type (self ), name ).memuse = memuse
606
607
607
- @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 )
608
+ @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 + ascii_char_size * 2 )
608
609
def test_capitalize (self , size ):
609
610
self ._test_capitalize (size )
610
611
611
- @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 )
612
+ @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 + ascii_char_size * 2 )
612
613
def test_title (self , size ):
613
614
self ._test_title (size )
614
615
615
- @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 )
616
+ @bigmemtest (size = _2G , memuse = ucs4_char_size * 3 + ascii_char_size * 2 )
616
617
def test_swapcase (self , size ):
617
618
self ._test_swapcase (size )
618
619
@@ -630,7 +631,7 @@ def test_encode_raw_unicode_escape(self, size):
630
631
except MemoryError :
631
632
pass # acceptable on 32-bit
632
633
633
- @bigmemtest (size = _4G // 5 + 70 , memuse = ascii_char_size + ucs4_char_size + 1 )
634
+ @bigmemtest (size = _4G // 5 + 70 , memuse = ascii_char_size + 8 + 1 )
634
635
def test_encode_utf7 (self , size ):
635
636
try :
636
637
return self .basic_encode_test (size , 'utf7' )
@@ -820,7 +821,7 @@ class TupleTest(unittest.TestCase):
820
821
# having more than 2<<31 references to any given object. Hence the
821
822
# use of different types of objects as contents in different tests.
822
823
823
- @bigmemtest (size = _2G + 2 , memuse = 16 )
824
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 2 )
824
825
def test_compare (self , size ):
825
826
t1 = ('' ,) * size
826
827
t2 = ('' ,) * size
@@ -843,31 +844,31 @@ def basic_concat_test(self, size):
843
844
t = t + t
844
845
self .assertEqual (len (t ), size * 2 )
845
846
846
- @bigmemtest (size = _2G // 2 + 2 , memuse = 24 )
847
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 3 )
847
848
def test_concat_small (self , size ):
848
849
return self .basic_concat_test (size )
849
850
850
- @bigmemtest (size = _2G + 2 , memuse = 24 )
851
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 3 )
851
852
def test_concat_large (self , size ):
852
853
return self .basic_concat_test (size )
853
854
854
- @bigmemtest (size = _2G // 5 + 10 , memuse = 8 * 5 )
855
+ @bigmemtest (size = _2G // 5 + 10 , memuse = pointer_size * 5 )
855
856
def test_contains (self , size ):
856
857
t = (1 , 2 , 3 , 4 , 5 ) * size
857
858
self .assertEqual (len (t ), size * 5 )
858
859
self .assertTrue (5 in t )
859
860
self .assertFalse ((1 , 2 , 3 , 4 , 5 ) in t )
860
861
self .assertFalse (0 in t )
861
862
862
- @bigmemtest (size = _2G + 10 , memuse = 8 )
863
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size )
863
864
def test_hash (self , size ):
864
865
t1 = (0 ,) * size
865
866
h1 = hash (t1 )
866
867
del t1
867
868
t2 = (0 ,) * (size + 1 )
868
869
self .assertFalse (h1 == hash (t2 ))
869
870
870
- @bigmemtest (size = _2G + 10 , memuse = 8 )
871
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size )
871
872
def test_index_and_slice (self , size ):
872
873
t = (None ,) * size
873
874
self .assertEqual (len (t ), size )
@@ -892,60 +893,54 @@ def basic_test_repeat(self, size):
892
893
t = t * 2
893
894
self .assertEqual (len (t ), size * 2 )
894
895
895
- @bigmemtest (size = _2G // 2 + 2 , memuse = 24 )
896
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 3 )
896
897
def test_repeat_small (self , size ):
897
898
return self .basic_test_repeat (size )
898
899
899
- @bigmemtest (size = _2G + 2 , memuse = 24 )
900
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 3 )
900
901
def test_repeat_large (self , size ):
901
902
return self .basic_test_repeat (size )
902
903
903
904
@bigmemtest (size = _1G - 1 , memuse = 12 )
904
905
def test_repeat_large_2 (self , size ):
905
906
return self .basic_test_repeat (size )
906
907
907
- @bigmemtest (size = _1G - 1 , memuse = 9 )
908
+ @bigmemtest (size = _1G - 1 , memuse = pointer_size * 2 )
908
909
def test_from_2G_generator (self , size ):
909
- self .skipTest ("test needs much more memory than advertised, see issue5438" )
910
910
try :
911
- t = tuple (range ( size ))
911
+ t = tuple (iter ([ 42 ] * size ))
912
912
except MemoryError :
913
913
pass # acceptable on 32-bit
914
914
else :
915
- count = 0
916
- for item in t :
917
- self .assertEqual (item , count )
918
- count += 1
919
- self .assertEqual (count , size )
915
+ self .assertEqual (len (t ), size )
916
+ self .assertEqual (t [:10 ], (42 ,) * 10 )
917
+ self .assertEqual (t [- 10 :], (42 ,) * 10 )
920
918
921
- @bigmemtest (size = _1G - 25 , memuse = 9 )
919
+ @bigmemtest (size = _1G - 25 , memuse = pointer_size * 2 )
922
920
def test_from_almost_2G_generator (self , size ):
923
- self .skipTest ("test needs much more memory than advertised, see issue5438" )
924
921
try :
925
- t = tuple (range (size ))
926
- count = 0
927
- for item in t :
928
- self .assertEqual (item , count )
929
- count += 1
930
- self .assertEqual (count , size )
922
+ t = tuple (iter ([42 ]* size ))
931
923
except MemoryError :
932
- pass # acceptable, expected on 32-bit
924
+ pass # acceptable on 32-bit
925
+ else :
926
+ self .assertEqual (len (t ), size )
927
+ self .assertEqual (t [:10 ], (42 ,) * 10 )
928
+ self .assertEqual (t [- 10 :], (42 ,) * 10 )
933
929
934
930
# Like test_concat, split in two.
935
931
def basic_test_repr (self , size ):
936
- t = (0 ,) * size
932
+ t = (False ,) * size
937
933
s = repr (t )
938
- # The repr of a tuple of 0's is exactly three times the tuple length.
939
- self .assertEqual (len (s ), size * 3 )
940
- self .assertEqual (s [:5 ], '(0, 0' )
941
- self .assertEqual (s [- 5 :], '0, 0)' )
942
- self .assertEqual (s .count ('0' ), size )
934
+ # The repr of a tuple of Falses is exactly 7 times the tuple length.
935
+ self .assertEqual (len (s ), size * 7 )
936
+ self .assertEqual (s [:10 ], '(False, Fa' )
937
+ self .assertEqual (s [- 10 :], 'se, False)' )
943
938
944
- @bigmemtest (size = _2G // 3 + 2 , memuse = 8 + 3 * ascii_char_size )
939
+ @bigmemtest (size = _2G // 7 + 2 , memuse = pointer_size + ascii_char_size * 7 )
945
940
def test_repr_small (self , size ):
946
941
return self .basic_test_repr (size )
947
942
948
- @bigmemtest (size = _2G + 2 , memuse = 8 + 3 * ascii_char_size )
943
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size + ascii_char_size * 7 )
949
944
def test_repr_large (self , size ):
950
945
return self .basic_test_repr (size )
951
946
@@ -956,7 +951,7 @@ class ListTest(unittest.TestCase):
956
951
# lists hold references to various objects to test their refcount
957
952
# limits.
958
953
959
- @bigmemtest (size = _2G + 2 , memuse = 16 )
954
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 2 )
960
955
def test_compare (self , size ):
961
956
l1 = ['' ] * size
962
957
l2 = ['' ] * size
@@ -979,43 +974,45 @@ def basic_test_concat(self, size):
979
974
l = l + l
980
975
self .assertEqual (len (l ), size * 2 )
981
976
982
- @bigmemtest (size = _2G // 2 + 2 , memuse = 24 )
977
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 3 )
983
978
def test_concat_small (self , size ):
984
979
return self .basic_test_concat (size )
985
980
986
- @bigmemtest (size = _2G + 2 , memuse = 24 )
981
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 3 )
987
982
def test_concat_large (self , size ):
988
983
return self .basic_test_concat (size )
989
984
985
+ # XXX This tests suffers from overallocation, just like test_append.
986
+ # This should be fixed in future.
990
987
def basic_test_inplace_concat (self , size ):
991
988
l = [sys .stdout ] * size
992
989
l += l
993
990
self .assertEqual (len (l ), size * 2 )
994
991
self .assertTrue (l [0 ] is l [- 1 ])
995
992
self .assertTrue (l [size - 1 ] is l [size + 1 ])
996
993
997
- @bigmemtest (size = _2G // 2 + 2 , memuse = 24 )
994
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 2 * 9 / 8 )
998
995
def test_inplace_concat_small (self , size ):
999
996
return self .basic_test_inplace_concat (size )
1000
997
1001
- @bigmemtest (size = _2G + 2 , memuse = 24 )
998
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 2 * 9 / 8 )
1002
999
def test_inplace_concat_large (self , size ):
1003
1000
return self .basic_test_inplace_concat (size )
1004
1001
1005
- @bigmemtest (size = _2G // 5 + 10 , memuse = 8 * 5 )
1002
+ @bigmemtest (size = _2G // 5 + 10 , memuse = pointer_size * 5 )
1006
1003
def test_contains (self , size ):
1007
1004
l = [1 , 2 , 3 , 4 , 5 ] * size
1008
1005
self .assertEqual (len (l ), size * 5 )
1009
1006
self .assertTrue (5 in l )
1010
1007
self .assertFalse ([1 , 2 , 3 , 4 , 5 ] in l )
1011
1008
self .assertFalse (0 in l )
1012
1009
1013
- @bigmemtest (size = _2G + 10 , memuse = 8 )
1010
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size )
1014
1011
def test_hash (self , size ):
1015
1012
l = [0 ] * size
1016
1013
self .assertRaises (TypeError , hash , l )
1017
1014
1018
- @bigmemtest (size = _2G + 10 , memuse = 8 )
1015
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size )
1019
1016
def test_index_and_slice (self , size ):
1020
1017
l = [None ] * size
1021
1018
self .assertEqual (len (l ), size )
@@ -1079,14 +1076,16 @@ def basic_test_repeat(self, size):
1079
1076
l = l * 2
1080
1077
self .assertEqual (len (l ), size * 2 )
1081
1078
1082
- @bigmemtest (size = _2G // 2 + 2 , memuse = 24 )
1079
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 3 )
1083
1080
def test_repeat_small (self , size ):
1084
1081
return self .basic_test_repeat (size )
1085
1082
1086
- @bigmemtest (size = _2G + 2 , memuse = 24 )
1083
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 3 )
1087
1084
def test_repeat_large (self , size ):
1088
1085
return self .basic_test_repeat (size )
1089
1086
1087
+ # XXX This tests suffers from overallocation, just like test_append.
1088
+ # This should be fixed in future.
1090
1089
def basic_test_inplace_repeat (self , size ):
1091
1090
l = ['' ]
1092
1091
l *= size
@@ -1099,63 +1098,65 @@ def basic_test_inplace_repeat(self, size):
1099
1098
self .assertEqual (len (l ), size * 2 )
1100
1099
self .assertTrue (l [size - 1 ] is l [- 1 ])
1101
1100
1102
- @bigmemtest (size = _2G // 2 + 2 , memuse = 16 )
1101
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 2 * 9 / 8 )
1103
1102
def test_inplace_repeat_small (self , size ):
1104
1103
return self .basic_test_inplace_repeat (size )
1105
1104
1106
- @bigmemtest (size = _2G + 2 , memuse = 16 )
1105
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 2 * 9 / 8 )
1107
1106
def test_inplace_repeat_large (self , size ):
1108
1107
return self .basic_test_inplace_repeat (size )
1109
1108
1110
1109
def basic_test_repr (self , size ):
1111
- l = [0 ] * size
1110
+ l = [False ] * size
1112
1111
s = repr (l )
1113
- # The repr of a list of 0's is exactly three times the list length.
1114
- self .assertEqual (len (s ), size * 3 )
1115
- self .assertEqual (s [:5 ], '[0, 0 ' )
1116
- self .assertEqual (s [- 5 :], '0, 0 ]' )
1117
- self .assertEqual (s .count ('0 ' ), size )
1112
+ # The repr of a list of Falses is exactly 7 times the list length.
1113
+ self .assertEqual (len (s ), size * 7 )
1114
+ self .assertEqual (s [:10 ], '[False, Fa ' )
1115
+ self .assertEqual (s [- 10 :], 'se, False ]' )
1116
+ self .assertEqual (s .count ('F ' ), size )
1118
1117
1119
- @bigmemtest (size = _2G // 3 + 2 , memuse = 8 + 3 * ascii_char_size )
1118
+ @bigmemtest (size = _2G // 7 + 2 , memuse = pointer_size + ascii_char_size * 7 )
1120
1119
def test_repr_small (self , size ):
1121
1120
return self .basic_test_repr (size )
1122
1121
1123
- @bigmemtest (size = _2G + 2 , memuse = 8 + 3 * ascii_char_size )
1122
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size + ascii_char_size * 7 )
1124
1123
def test_repr_large (self , size ):
1125
1124
return self .basic_test_repr (size )
1126
1125
1127
1126
# list overallocates ~1/8th of the total size (on first expansion) so
1128
1127
# the single list.append call puts memuse at 9 bytes per size.
1129
- @bigmemtest (size = _2G , memuse = 9 )
1128
+ @bigmemtest (size = _2G , memuse = pointer_size * 9 / 8 )
1130
1129
def test_append (self , size ):
1131
1130
l = [object ()] * size
1132
1131
l .append (object ())
1133
1132
self .assertEqual (len (l ), size + 1 )
1134
1133
self .assertTrue (l [- 3 ] is l [- 2 ])
1135
1134
self .assertFalse (l [- 2 ] is l [- 1 ])
1136
1135
1137
- @bigmemtest (size = _2G // 5 + 2 , memuse = 8 * 5 )
1136
+ @bigmemtest (size = _2G // 5 + 2 , memuse = pointer_size * 5 )
1138
1137
def test_count (self , size ):
1139
1138
l = [1 , 2 , 3 , 4 , 5 ] * size
1140
1139
self .assertEqual (l .count (1 ), size )
1141
1140
self .assertEqual (l .count ("1" ), 0 )
1142
1141
1142
+ # XXX This tests suffers from overallocation, just like test_append.
1143
+ # This should be fixed in future.
1143
1144
def basic_test_extend (self , size ):
1144
1145
l = [object ] * size
1145
1146
l .extend (l )
1146
1147
self .assertEqual (len (l ), size * 2 )
1147
1148
self .assertTrue (l [0 ] is l [- 1 ])
1148
1149
self .assertTrue (l [size - 1 ] is l [size + 1 ])
1149
1150
1150
- @bigmemtest (size = _2G // 2 + 2 , memuse = 16 )
1151
+ @bigmemtest (size = _2G // 2 + 2 , memuse = pointer_size * 2 * 9 / 8 )
1151
1152
def test_extend_small (self , size ):
1152
1153
return self .basic_test_extend (size )
1153
1154
1154
- @bigmemtest (size = _2G + 2 , memuse = 16 )
1155
+ @bigmemtest (size = _2G + 2 , memuse = pointer_size * 2 * 9 / 8 )
1155
1156
def test_extend_large (self , size ):
1156
1157
return self .basic_test_extend (size )
1157
1158
1158
- @bigmemtest (size = _2G // 5 + 2 , memuse = 8 * 5 )
1159
+ @bigmemtest (size = _2G // 5 + 2 , memuse = pointer_size * 5 )
1159
1160
def test_index (self , size ):
1160
1161
l = [1 , 2 , 3 , 4 , 5 ] * size
1161
1162
size *= 5
@@ -1166,7 +1167,7 @@ def test_index(self, size):
1166
1167
self .assertRaises (ValueError , l .index , 6 )
1167
1168
1168
1169
# This tests suffers from overallocation, just like test_append.
1169
- @bigmemtest (size = _2G + 10 , memuse = 9 )
1170
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size * 9 / 8 )
1170
1171
def test_insert (self , size ):
1171
1172
l = [1.0 ] * size
1172
1173
l .insert (size - 1 , "A" )
@@ -1185,7 +1186,7 @@ def test_insert(self, size):
1185
1186
self .assertEqual (l [:3 ], [1.0 , "C" , 1.0 ])
1186
1187
self .assertEqual (l [size - 3 :], ["A" , 1.0 , "B" ])
1187
1188
1188
- @bigmemtest (size = _2G // 5 + 4 , memuse = 8 * 5 )
1189
+ @bigmemtest (size = _2G // 5 + 4 , memuse = pointer_size * 5 )
1189
1190
def test_pop (self , size ):
1190
1191
l = ["a" , "b" , "c" , "d" , "e" ] * size
1191
1192
size *= 5
@@ -1209,7 +1210,7 @@ def test_pop(self, size):
1209
1210
self .assertEqual (item , "c" )
1210
1211
self .assertEqual (l [- 2 :], ["b" , "d" ])
1211
1212
1212
- @bigmemtest (size = _2G + 10 , memuse = 8 )
1213
+ @bigmemtest (size = _2G + 10 , memuse = pointer_size )
1213
1214
def test_remove (self , size ):
1214
1215
l = [10 ] * size
1215
1216
self .assertEqual (len (l ), size )
@@ -1229,15 +1230,15 @@ def test_remove(self, size):
1229
1230
self .assertEqual (len (l ), size )
1230
1231
self .assertEqual (l [- 2 :], [10 , 10 ])
1231
1232
1232
- @bigmemtest (size = _2G // 5 + 2 , memuse = 8 * 5 )
1233
+ @bigmemtest (size = _2G // 5 + 2 , memuse = pointer_size * 5 )
1233
1234
def test_reverse (self , size ):
1234
1235
l = [1 , 2 , 3 , 4 , 5 ] * size
1235
1236
l .reverse ()
1236
1237
self .assertEqual (len (l ), size * 5 )
1237
1238
self .assertEqual (l [- 5 :], [5 , 4 , 3 , 2 , 1 ])
1238
1239
self .assertEqual (l [:5 ], [5 , 4 , 3 , 2 , 1 ])
1239
1240
1240
- @bigmemtest (size = _2G // 5 + 2 , memuse = 8 * 5 )
1241
+ @bigmemtest (size = _2G // 5 + 2 , memuse = pointer_size * 5 * 1. 5 )
1241
1242
def test_sort (self , size ):
1242
1243
l = [1 , 2 , 3 , 4 , 5 ] * size
1243
1244
l .sort ()
0 commit comments