blob: 254c21d6f6e61fb684a4ad98adccc6d310350b47 [file] [log] [blame]
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001from test import support
Neal Norwitz3ce5d922008-08-24 07:08:55 +00002from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest
Thomas Wouters477c8d52006-05-27 19:21:47 +00003
4import unittest
5import operator
Thomas Wouters477c8d52006-05-27 19:21:47 +00006import sys
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00007import functools
Thomas Wouters477c8d52006-05-27 19:21:47 +00008
9# Bigmem testing houserules:
10#
11# - Try not to allocate too many large objects. It's okay to rely on
12# refcounting semantics, but don't forget that 's = create_largestring()'
13# doesn't release the old 's' (if it exists) until well after its new
14# value has been created. Use 'del s' before the create_largestring call.
15#
16# - Do *not* compare large objects using assertEquals or similar. It's a
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000017# lengthy operation and the errormessage will be utterly useless due to
Thomas Wouters477c8d52006-05-27 19:21:47 +000018# its size. To make sure whether a result has the right contents, better
19# to use the strip or count methods, or compare meaningful slices.
20#
21# - Don't forget to test for large indices, offsets and results and such,
22# in addition to large sizes.
23#
24# - When repeating an object (say, a substring, or a small list) to create
25# a large object, make the subobject of a length that is not a power of
26# 2. That way, int-wrapping problems are more easily detected.
27#
28# - While the bigmemtest decorator speaks of 'minsize', all tests will
29# actually be called with a much smaller number too, in the normal
30# test run (5Kb currently.) This is so the tests themselves get frequent
Thomas Wouters0e3f5912006-08-11 14:57:12 +000031# testing. Consequently, always make all large allocations based on the
Thomas Wouters477c8d52006-05-27 19:21:47 +000032# passed-in 'size', and don't rely on the size being very large. Also,
33# memuse-per-size should remain sane (less than a few thousand); if your
34# test uses more, adjust 'size' upward, instead.
35
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000036character_size = 4 if sys.maxunicode > 0xFFFF else 2
37
38
39class BaseStrTest:
40
Thomas Wouters477c8d52006-05-27 19:21:47 +000041 @bigmemtest(minsize=_2G, memuse=2)
42 def test_capitalize(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000043 _ = self.from_latin1
44 SUBSTR = self.from_latin1(' abc def ghi')
45 s = _('-') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +000046 caps = s.capitalize()
47 self.assertEquals(caps[-len(SUBSTR):],
48 SUBSTR.capitalize())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000049 self.assertEquals(caps.lstrip(_('-')), SUBSTR)
Thomas Wouters477c8d52006-05-27 19:21:47 +000050
51 @bigmemtest(minsize=_2G + 10, memuse=1)
52 def test_center(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000053 SUBSTR = self.from_latin1(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +000054 s = SUBSTR.center(size)
55 self.assertEquals(len(s), size)
56 lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
57 if len(s) % 2:
58 lpadsize += 1
59 self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
60 self.assertEquals(s.strip(), SUBSTR.strip())
61
62 @bigmemtest(minsize=_2G, memuse=2)
63 def test_count(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000064 _ = self.from_latin1
65 SUBSTR = _(' abc def ghi')
66 s = _('.') * size + SUBSTR
67 self.assertEquals(s.count(_('.')), size)
68 s += _('.')
69 self.assertEquals(s.count(_('.')), size + 1)
70 self.assertEquals(s.count(_(' ')), 3)
71 self.assertEquals(s.count(_('i')), 1)
72 self.assertEquals(s.count(_('j')), 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +000073
74 @bigmemtest(minsize=_2G, memuse=2)
75 def test_endswith(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000076 _ = self.from_latin1
77 SUBSTR = _(' abc def ghi')
78 s = _('-') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +000079 self.failUnless(s.endswith(SUBSTR))
80 self.failUnless(s.endswith(s))
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000081 s2 = _('...') + s
Thomas Wouters477c8d52006-05-27 19:21:47 +000082 self.failUnless(s2.endswith(s))
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000083 self.failIf(s.endswith(_('a') + SUBSTR))
Thomas Wouters477c8d52006-05-27 19:21:47 +000084 self.failIf(SUBSTR.endswith(s))
85
86 @bigmemtest(minsize=_2G + 10, memuse=2)
87 def test_expandtabs(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000088 _ = self.from_latin1
89 s = _('-') * size
Thomas Wouters477c8d52006-05-27 19:21:47 +000090 tabsize = 8
91 self.assertEquals(s.expandtabs(), s)
92 del s
93 slen, remainder = divmod(size, tabsize)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000094 s = _(' \t') * slen
Thomas Wouters477c8d52006-05-27 19:21:47 +000095 s = s.expandtabs(tabsize)
96 self.assertEquals(len(s), size - remainder)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +000097 self.assertEquals(len(s.strip(_(' '))), 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +000098
99 @bigmemtest(minsize=_2G, memuse=2)
100 def test_find(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000101 _ = self.from_latin1
102 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000103 sublen = len(SUBSTR)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000104 s = _('').join([SUBSTR, _('-') * size, SUBSTR])
105 self.assertEquals(s.find(_(' ')), 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000106 self.assertEquals(s.find(SUBSTR), 0)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000107 self.assertEquals(s.find(_(' '), sublen), sublen + size)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 self.assertEquals(s.find(SUBSTR, len(SUBSTR)), sublen + size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000109 self.assertEquals(s.find(_('i')), SUBSTR.find(_('i')))
110 self.assertEquals(s.find(_('i'), sublen),
111 sublen + size + SUBSTR.find(_('i')))
112 self.assertEquals(s.find(_('i'), size),
113 sublen + size + SUBSTR.find(_('i')))
114 self.assertEquals(s.find(_('j')), -1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115
116 @bigmemtest(minsize=_2G, memuse=2)
117 def test_index(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000118 _ = self.from_latin1
119 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000120 sublen = len(SUBSTR)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000121 s = _('').join([SUBSTR, _('-') * size, SUBSTR])
122 self.assertEquals(s.index(_(' ')), 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123 self.assertEquals(s.index(SUBSTR), 0)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000124 self.assertEquals(s.index(_(' '), sublen), sublen + size)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125 self.assertEquals(s.index(SUBSTR, sublen), sublen + size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000126 self.assertEquals(s.index(_('i')), SUBSTR.index(_('i')))
127 self.assertEquals(s.index(_('i'), sublen),
128 sublen + size + SUBSTR.index(_('i')))
129 self.assertEquals(s.index(_('i'), size),
130 sublen + size + SUBSTR.index(_('i')))
131 self.assertRaises(ValueError, s.index, _('j'))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132
133 @bigmemtest(minsize=_2G, memuse=2)
134 def test_isalnum(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000135 _ = self.from_latin1
136 SUBSTR = _('123456')
137 s = _('a') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +0000138 self.failUnless(s.isalnum())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000139 s += _('.')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000140 self.failIf(s.isalnum())
141
142 @bigmemtest(minsize=_2G, memuse=2)
143 def test_isalpha(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000144 _ = self.from_latin1
145 SUBSTR = _('zzzzzzz')
146 s = _('a') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +0000147 self.failUnless(s.isalpha())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000148 s += _('.')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000149 self.failIf(s.isalpha())
150
151 @bigmemtest(minsize=_2G, memuse=2)
152 def test_isdigit(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000153 _ = self.from_latin1
154 SUBSTR = _('123456')
155 s = _('9') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +0000156 self.failUnless(s.isdigit())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000157 s += _('z')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000158 self.failIf(s.isdigit())
159
160 @bigmemtest(minsize=_2G, memuse=2)
161 def test_islower(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000162 _ = self.from_latin1
163 chars = _(''.join(
164 chr(c) for c in range(255) if not chr(c).isupper()))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000165 repeats = size // len(chars) + 2
166 s = chars * repeats
167 self.failUnless(s.islower())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000168 s += _('A')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000169 self.failIf(s.islower())
170
171 @bigmemtest(minsize=_2G, memuse=2)
172 def test_isspace(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000173 _ = self.from_latin1
174 whitespace = _(' \f\n\r\t\v')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000175 repeats = size // len(whitespace) + 2
176 s = whitespace * repeats
177 self.failUnless(s.isspace())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000178 s += _('j')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000179 self.failIf(s.isspace())
180
181 @bigmemtest(minsize=_2G, memuse=2)
182 def test_istitle(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000183 _ = self.from_latin1
184 SUBSTR = _('123456')
185 s = _('').join([_('A'), _('a') * size, SUBSTR])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000186 self.failUnless(s.istitle())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000187 s += _('A')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000188 self.failUnless(s.istitle())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000189 s += _('aA')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000190 self.failIf(s.istitle())
191
192 @bigmemtest(minsize=_2G, memuse=2)
193 def test_isupper(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000194 _ = self.from_latin1
195 chars = _(''.join(
196 chr(c) for c in range(255) if not chr(c).islower()))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000197 repeats = size // len(chars) + 2
198 s = chars * repeats
199 self.failUnless(s.isupper())
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000200 s += _('a')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000201 self.failIf(s.isupper())
202
203 @bigmemtest(minsize=_2G, memuse=2)
204 def test_join(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000205 _ = self.from_latin1
206 s = _('A') * size
207 x = s.join([_('aaaaa'), _('bbbbb')])
208 self.assertEquals(x.count(_('a')), 5)
209 self.assertEquals(x.count(_('b')), 5)
210 self.failUnless(x.startswith(_('aaaaaA')))
211 self.failUnless(x.endswith(_('Abbbbb')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000212
213 @bigmemtest(minsize=_2G + 10, memuse=1)
214 def test_ljust(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000215 _ = self.from_latin1
216 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000217 s = SUBSTR.ljust(size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000218 self.failUnless(s.startswith(SUBSTR + _(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000219 self.assertEquals(len(s), size)
220 self.assertEquals(s.strip(), SUBSTR.strip())
221
222 @bigmemtest(minsize=_2G + 10, memuse=2)
223 def test_lower(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000224 _ = self.from_latin1
225 s = _('A') * size
Thomas Wouters477c8d52006-05-27 19:21:47 +0000226 s = s.lower()
227 self.assertEquals(len(s), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000228 self.assertEquals(s.count(_('a')), size)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000229
230 @bigmemtest(minsize=_2G + 10, memuse=1)
231 def test_lstrip(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000232 _ = self.from_latin1
233 SUBSTR = _('abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000234 s = SUBSTR.rjust(size)
235 self.assertEquals(len(s), size)
236 self.assertEquals(s.lstrip(), SUBSTR.lstrip())
237 del s
238 s = SUBSTR.ljust(size)
239 self.assertEquals(len(s), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000240 # Type-specific optimization
241 if isinstance(s, (str, bytes)):
242 stripped = s.lstrip()
243 self.failUnless(stripped is s)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000244
245 @bigmemtest(minsize=_2G + 10, memuse=2)
246 def test_replace(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000247 _ = self.from_latin1
248 replacement = _('a')
249 s = _(' ') * size
250 s = s.replace(_(' '), replacement)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251 self.assertEquals(len(s), size)
252 self.assertEquals(s.count(replacement), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000253 s = s.replace(replacement, _(' '), size - 4)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000254 self.assertEquals(len(s), size)
255 self.assertEquals(s.count(replacement), 4)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000256 self.assertEquals(s[-10:], _(' aaaa'))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000257
258 @bigmemtest(minsize=_2G, memuse=2)
259 def test_rfind(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000260 _ = self.from_latin1
261 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000262 sublen = len(SUBSTR)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000263 s = _('').join([SUBSTR, _('-') * size, SUBSTR])
264 self.assertEquals(s.rfind(_(' ')), sublen + size + SUBSTR.rfind(_(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000265 self.assertEquals(s.rfind(SUBSTR), sublen + size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000266 self.assertEquals(s.rfind(_(' '), 0, size), SUBSTR.rfind(_(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000267 self.assertEquals(s.rfind(SUBSTR, 0, sublen + size), 0)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000268 self.assertEquals(s.rfind(_('i')), sublen + size + SUBSTR.rfind(_('i')))
269 self.assertEquals(s.rfind(_('i'), 0, sublen), SUBSTR.rfind(_('i')))
270 self.assertEquals(s.rfind(_('i'), 0, sublen + size),
271 SUBSTR.rfind(_('i')))
272 self.assertEquals(s.rfind(_('j')), -1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000273
274 @bigmemtest(minsize=_2G, memuse=2)
275 def test_rindex(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000276 _ = self.from_latin1
277 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000278 sublen = len(SUBSTR)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000279 s = _('').join([SUBSTR, _('-') * size, SUBSTR])
280 self.assertEquals(s.rindex(_(' ')),
281 sublen + size + SUBSTR.rindex(_(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000282 self.assertEquals(s.rindex(SUBSTR), sublen + size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000283 self.assertEquals(s.rindex(_(' '), 0, sublen + size - 1),
284 SUBSTR.rindex(_(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000285 self.assertEquals(s.rindex(SUBSTR, 0, sublen + size), 0)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000286 self.assertEquals(s.rindex(_('i')),
287 sublen + size + SUBSTR.rindex(_('i')))
288 self.assertEquals(s.rindex(_('i'), 0, sublen), SUBSTR.rindex(_('i')))
289 self.assertEquals(s.rindex(_('i'), 0, sublen + size),
290 SUBSTR.rindex(_('i')))
291 self.assertRaises(ValueError, s.rindex, _('j'))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000292
293 @bigmemtest(minsize=_2G + 10, memuse=1)
294 def test_rjust(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000295 _ = self.from_latin1
296 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000297 s = SUBSTR.ljust(size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000298 self.failUnless(s.startswith(SUBSTR + _(' ')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299 self.assertEquals(len(s), size)
300 self.assertEquals(s.strip(), SUBSTR.strip())
301
302 @bigmemtest(minsize=_2G + 10, memuse=1)
303 def test_rstrip(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000304 _ = self.from_latin1
305 SUBSTR = _(' abc def ghi')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000306 s = SUBSTR.ljust(size)
307 self.assertEquals(len(s), size)
308 self.assertEquals(s.rstrip(), SUBSTR.rstrip())
309 del s
310 s = SUBSTR.rjust(size)
311 self.assertEquals(len(s), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000312 # Type-specific optimization
313 if isinstance(s, (str, bytes)):
314 stripped = s.rstrip()
315 self.failUnless(stripped is s)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000316
317 # The test takes about size bytes to build a string, and then about
318 # sqrt(size) substrings of sqrt(size) in size and a list to
319 # hold sqrt(size) items. It's close but just over 2x size.
320 @bigmemtest(minsize=_2G, memuse=2.1)
321 def test_split_small(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000322 _ = self.from_latin1
Thomas Wouters477c8d52006-05-27 19:21:47 +0000323 # Crudely calculate an estimate so that the result of s.split won't
324 # take up an inordinate amount of memory
325 chunksize = int(size ** 0.5 + 2)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000326 SUBSTR = _('a') + _(' ') * chunksize
Thomas Wouters477c8d52006-05-27 19:21:47 +0000327 s = SUBSTR * chunksize
328 l = s.split()
329 self.assertEquals(len(l), chunksize)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000330 expected = _('a')
331 for item in l:
332 self.assertEquals(item, expected)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000333 del l
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000334 l = s.split(_('a'))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000335 self.assertEquals(len(l), chunksize + 1)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000336 expected = _(' ') * chunksize
337 for item in filter(None, l):
338 self.assertEquals(item, expected)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000339
340 # Allocates a string of twice size (and briefly two) and a list of
341 # size. Because of internal affairs, the s.split() call produces a
342 # list of size times the same one-character string, so we only
343 # suffer for the list size. (Otherwise, it'd cost another 48 times
344 # size in bytes!) Nevertheless, a list of size takes
345 # 8*size bytes.
346 @bigmemtest(minsize=_2G + 5, memuse=10)
347 def test_split_large(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000348 _ = self.from_latin1
349 s = _(' a') * size + _(' ')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000350 l = s.split()
351 self.assertEquals(len(l), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000352 self.assertEquals(set(l), set([_('a')]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353 del l
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000354 l = s.split(_('a'))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355 self.assertEquals(len(l), size + 1)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000356 self.assertEquals(set(l), set([_(' ')]))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357
358 @bigmemtest(minsize=_2G, memuse=2.1)
359 def test_splitlines(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000360 _ = self.from_latin1
Thomas Wouters477c8d52006-05-27 19:21:47 +0000361 # Crudely calculate an estimate so that the result of s.split won't
362 # take up an inordinate amount of memory
363 chunksize = int(size ** 0.5 + 2) // 2
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000364 SUBSTR = _(' ') * chunksize + _('\n') + _(' ') * chunksize + _('\r\n')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000365 s = SUBSTR * chunksize
366 l = s.splitlines()
367 self.assertEquals(len(l), chunksize * 2)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000368 expected = _(' ') * chunksize
369 for item in l:
370 self.assertEquals(item, expected)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000371
372 @bigmemtest(minsize=_2G, memuse=2)
373 def test_startswith(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000374 _ = self.from_latin1
375 SUBSTR = _(' abc def ghi')
376 s = _('-') * size + SUBSTR
Thomas Wouters477c8d52006-05-27 19:21:47 +0000377 self.failUnless(s.startswith(s))
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000378 self.failUnless(s.startswith(_('-') * size))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 self.failIf(s.startswith(SUBSTR))
380
381 @bigmemtest(minsize=_2G, memuse=1)
382 def test_strip(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000383 _ = self.from_latin1
384 SUBSTR = _(' abc def ghi ')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000385 s = SUBSTR.rjust(size)
386 self.assertEquals(len(s), size)
387 self.assertEquals(s.strip(), SUBSTR.strip())
388 del s
389 s = SUBSTR.ljust(size)
390 self.assertEquals(len(s), size)
391 self.assertEquals(s.strip(), SUBSTR.strip())
392
393 @bigmemtest(minsize=_2G, memuse=2)
394 def test_swapcase(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000395 _ = self.from_latin1
396 SUBSTR = _("aBcDeFG12.'\xa9\x00")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000397 sublen = len(SUBSTR)
398 repeats = size // sublen + 2
399 s = SUBSTR * repeats
400 s = s.swapcase()
401 self.assertEquals(len(s), sublen * repeats)
402 self.assertEquals(s[:sublen * 3], SUBSTR.swapcase() * 3)
403 self.assertEquals(s[-sublen * 3:], SUBSTR.swapcase() * 3)
404
405 @bigmemtest(minsize=_2G, memuse=2)
406 def test_title(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000407 _ = self.from_latin1
408 SUBSTR = _('SpaaHAaaAaham')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409 s = SUBSTR * (size // len(SUBSTR) + 2)
410 s = s.title()
411 self.failUnless(s.startswith((SUBSTR * 3).title()))
412 self.failUnless(s.endswith(SUBSTR.lower() * 3))
413
414 @bigmemtest(minsize=_2G, memuse=2)
415 def test_translate(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000416 _ = self.from_latin1
417 trans = {
418 ord(_('.')): _('-'),
419 ord(_('a')): _('!'),
420 ord(_('Z')): _('$'),
421 }
422 SUBSTR = _('aZz.z.Aaz.')
423 if not isinstance(SUBSTR, str):
424 # Workaround the inexistence of bytes.maketrans()
425 chars = bytearray(range(256))
426 for k, v in trans.items():
427 chars[k] = ord(v)
428 trans = chars
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 sublen = len(SUBSTR)
430 repeats = size // sublen + 2
431 s = SUBSTR * repeats
432 s = s.translate(trans)
433 self.assertEquals(len(s), repeats * sublen)
434 self.assertEquals(s[:sublen], SUBSTR.translate(trans))
435 self.assertEquals(s[-sublen:], SUBSTR.translate(trans))
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000436 self.assertEquals(s.count(_('.')), 0)
437 self.assertEquals(s.count(_('!')), repeats * 2)
438 self.assertEquals(s.count(_('z')), repeats * 3)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000439
440 @bigmemtest(minsize=_2G + 5, memuse=2)
441 def test_upper(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000442 _ = self.from_latin1
443 s = _('a') * size
Thomas Wouters477c8d52006-05-27 19:21:47 +0000444 s = s.upper()
445 self.assertEquals(len(s), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000446 self.assertEquals(s.count(_('A')), size)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447
448 @bigmemtest(minsize=_2G + 20, memuse=1)
449 def test_zfill(self, size):
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000450 _ = self.from_latin1
451 SUBSTR = _('-568324723598234')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000452 s = SUBSTR.zfill(size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000453 self.failUnless(s.endswith(_('0') + SUBSTR[1:]))
454 self.failUnless(s.startswith(_('-0')))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000455 self.assertEquals(len(s), size)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000456 self.assertEquals(s.count(_('0')), size - len(SUBSTR))
457
458 # This test is meaningful even with size < 2G, as long as the
459 # doubled string is > 2G (but it tests more if both are > 2G :)
460 @bigmemtest(minsize=_1G + 2, memuse=3)
461 def test_concat(self, size):
462 _ = self.from_latin1
463 s = _('.') * size
464 self.assertEquals(len(s), size)
465 s = s + s
466 self.assertEquals(len(s), size * 2)
467 self.assertEquals(s.count(_('.')), size * 2)
468
469 # This test is meaningful even with size < 2G, as long as the
470 # repeated string is > 2G (but it tests more if both are > 2G :)
471 @bigmemtest(minsize=_1G + 2, memuse=3)
472 def test_repeat(self, size):
473 _ = self.from_latin1
474 s = _('.') * size
475 self.assertEquals(len(s), size)
476 s = s * 2
477 self.assertEquals(len(s), size * 2)
478 self.assertEquals(s.count(_('.')), size * 2)
479
480 @bigmemtest(minsize=_2G + 20, memuse=2)
481 def test_slice_and_getitem(self, size):
482 _ = self.from_latin1
483 SUBSTR = _('0123456789')
484 sublen = len(SUBSTR)
485 s = SUBSTR * (size // sublen)
486 stepsize = len(s) // 100
487 stepsize = stepsize - (stepsize % sublen)
488 for i in range(0, len(s) - stepsize, stepsize):
489 self.assertEquals(s[i], SUBSTR[0])
490 self.assertEquals(s[i:i + sublen], SUBSTR)
491 self.assertEquals(s[i:i + sublen:2], SUBSTR[::2])
492 if i > 0:
493 self.assertEquals(s[i + sublen - 1:i - 1:-3],
494 SUBSTR[sublen::-3])
495 # Make sure we do some slicing and indexing near the end of the
496 # string, too.
497 self.assertEquals(s[len(s) - 1], SUBSTR[-1])
498 self.assertEquals(s[-1], SUBSTR[-1])
499 self.assertEquals(s[len(s) - 10], SUBSTR[0])
500 self.assertEquals(s[-sublen], SUBSTR[0])
501 self.assertEquals(s[len(s):], _(''))
502 self.assertEquals(s[len(s) - 1:], SUBSTR[-1:])
503 self.assertEquals(s[-1:], SUBSTR[-1:])
504 self.assertEquals(s[len(s) - sublen:], SUBSTR)
505 self.assertEquals(s[-sublen:], SUBSTR)
506 self.assertEquals(len(s[:]), len(s))
507 self.assertEquals(len(s[:len(s) - 5]), len(s) - 5)
508 self.assertEquals(len(s[5:-5]), len(s) - 10)
509
510 self.assertRaises(IndexError, operator.getitem, s, len(s))
511 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1)
512 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31)
513
514 @bigmemtest(minsize=_2G, memuse=2)
515 def test_contains(self, size):
516 _ = self.from_latin1
517 SUBSTR = _('0123456789')
518 edge = _('-') * (size // 2)
519 s = _('').join([edge, SUBSTR, edge])
520 del edge
521 self.failUnless(SUBSTR in s)
522 self.failIf(SUBSTR * 2 in s)
523 self.failUnless(_('-') in s)
524 self.failIf(_('a') in s)
525 s += _('a')
526 self.failUnless(_('a') in s)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000527
528 @bigmemtest(minsize=_2G + 10, memuse=2)
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000529 def test_compare(self, size):
530 _ = self.from_latin1
531 s1 = _('-') * size
532 s2 = _('-') * size
533 self.assertEqual(s1, s2)
534 del s2
535 s2 = s1 + _('a')
536 self.failIf(s1 == s2)
537 del s2
538 s2 = _('.') * size
539 self.failIf(s1 == s2)
540
541 @bigmemtest(minsize=_2G + 10, memuse=1)
542 def test_hash(self, size):
543 # Not sure if we can do any meaningful tests here... Even if we
544 # start relying on the exact algorithm used, the result will be
545 # different depending on the size of the C 'long int'. Even this
546 # test is dodgy (there's no *guarantee* that the two things should
547 # have a different hash, even if they, in the current
548 # implementation, almost always do.)
549 _ = self.from_latin1
550 s = _('\x00') * size
551 h1 = hash(s)
552 del s
553 s = _('\x00') * (size + 1)
554 self.failIf(h1 == hash(s))
555
556
557class StrTest(unittest.TestCase, BaseStrTest):
558
559 def from_latin1(self, s):
560 return s
561
562 def basic_encode_test(self, size, enc, c='.', expectedsize=None):
563 if expectedsize is None:
564 expectedsize = size
565
566 s = c * size
567 self.assertEquals(len(s.encode(enc)), expectedsize)
568
569 def setUp(self):
570 # HACK: adjust memory use of tests inherited from BaseStrTest
571 # according to character size.
572 self._adjusted = {}
573 for name in dir(BaseStrTest):
574 if not name.startswith('test_'):
575 continue
576 meth = getattr(type(self), name)
577 try:
578 memuse = meth.memuse
579 except AttributeError:
580 continue
581 meth.memuse = character_size * memuse
582 self._adjusted[name] = memuse
583
584 def tearDown(self):
585 for name, memuse in self._adjusted.items():
586 getattr(type(self), name).memuse = memuse
587
588 @bigmemtest(minsize=_2G + 2, memuse=character_size + 1)
589 def test_encode(self, size):
590 return self.basic_encode_test(size, 'utf-8')
591
592 @precisionbigmemtest(size=_4G // 6 + 2, memuse=character_size + 1)
593 def test_encode_raw_unicode_escape(self, size):
594 try:
595 return self.basic_encode_test(size, 'raw_unicode_escape')
596 except MemoryError:
597 pass # acceptable on 32-bit
598
599 @precisionbigmemtest(size=_4G // 5 + 70, memuse=character_size + 1)
600 def test_encode_utf7(self, size):
601 try:
602 return self.basic_encode_test(size, 'utf7')
603 except MemoryError:
604 pass # acceptable on 32-bit
605
606 @precisionbigmemtest(size=_4G // 4 + 5, memuse=character_size + 4)
607 def test_encode_utf32(self, size):
608 try:
609 return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4)
610 except MemoryError:
611 pass # acceptable on 32-bit
612
613 @precisionbigmemtest(size=_2G - 1, memuse=character_size + 1)
614 def test_encode_ascii(self, size):
615 return self.basic_encode_test(size, 'ascii', c='A')
616
617 @precisionbigmemtest(size=_4G // 5, memuse=character_size * (6 + 1))
618 def test_unicode_repr_overflow(self, size):
619 try:
620 s = "\uAAAA"*size
621 r = repr(s)
622 except MemoryError:
623 pass # acceptable on 32-bit
624 else:
625 self.failUnless(s == eval(r))
626
627 @bigmemtest(minsize=_2G + 10, memuse=character_size * 2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000628 def test_format(self, size):
629 s = '-' * size
630 sf = '%s' % (s,)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000631 self.assertEqual(s, sf)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000632 del sf
633 sf = '..%s..' % (s,)
634 self.assertEquals(len(sf), len(s) + 4)
635 self.failUnless(sf.startswith('..-'))
636 self.failUnless(sf.endswith('-..'))
637 del s, sf
638
639 size //= 2
640 edge = '-' * size
641 s = ''.join([edge, '%s', edge])
642 del edge
643 s = s % '...'
644 self.assertEquals(len(s), size * 2 + 3)
645 self.assertEquals(s.count('.'), 3)
646 self.assertEquals(s.count('-'), size * 2)
647
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000648 @bigmemtest(minsize=_2G + 10, memuse=character_size * 2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000649 def test_repr_small(self, size):
650 s = '-' * size
651 s = repr(s)
652 self.assertEquals(len(s), size + 2)
653 self.assertEquals(s[0], "'")
654 self.assertEquals(s[-1], "'")
655 self.assertEquals(s.count('-'), size)
656 del s
657 # repr() will create a string four times as large as this 'binary
658 # string', but we don't want to allocate much more than twice
659 # size in total. (We do extra testing in test_repr_large())
660 size = size // 5 * 2
661 s = '\x00' * size
662 s = repr(s)
663 self.assertEquals(len(s), size * 4 + 2)
664 self.assertEquals(s[0], "'")
665 self.assertEquals(s[-1], "'")
666 self.assertEquals(s.count('\\'), size)
667 self.assertEquals(s.count('0'), size * 2)
668
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000669 @bigmemtest(minsize=_2G + 10, memuse=character_size * 5)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000670 def test_repr_large(self, size):
671 s = '\x00' * size
672 s = repr(s)
673 self.assertEquals(len(s), size * 4 + 2)
674 self.assertEquals(s[0], "'")
675 self.assertEquals(s[-1], "'")
676 self.assertEquals(s.count('\\'), size)
677 self.assertEquals(s.count('0'), size * 2)
678
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000679 @bigmemtest(minsize=2**32 / 5, memuse=character_size * 7)
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000680 def test_unicode_repr(self, size):
681 s = "\uAAAA" * size
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000682 for f in (repr, ascii):
683 r = f(s)
684 self.failUnless(len(r) > size)
685 self.failUnless(r.endswith(r"\uaaaa'"), r[-10:])
686 del r
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000687
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000688 # The character takes 4 bytes even in UCS-2 builds because it will
689 # be decomposed into surrogates.
690 @bigmemtest(minsize=2**32 / 5, memuse=4 + character_size * 9)
691 def test_unicode_repr_wide(self, size):
692 s = "\U0001AAAA" * size
693 for f in (repr, ascii):
694 r = f(s)
695 self.failUnless(len(r) > size)
696 self.failUnless(r.endswith(r"\U0001aaaa'"), r[-12:])
697 del r
Thomas Wouters477c8d52006-05-27 19:21:47 +0000698
Thomas Wouters477c8d52006-05-27 19:21:47 +0000699
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000700class BytesTest(unittest.TestCase, BaseStrTest):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000701
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000702 def from_latin1(self, s):
703 return s.encode("latin1")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000704
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000705 @bigmemtest(minsize=_2G + 2, memuse=1 + character_size)
706 def test_decode(self, size):
707 s = self.from_latin1('.') * size
708 self.assertEquals(len(s.decode('utf-8')), size)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000709
Thomas Wouters477c8d52006-05-27 19:21:47 +0000710
Antoine Pitrou7cdb4952009-03-07 23:40:49 +0000711class BytearrayTest(unittest.TestCase, BaseStrTest):
712
713 def from_latin1(self, s):
714 return bytearray(s.encode("latin1"))
715
716 @bigmemtest(minsize=_2G + 2, memuse=1 + character_size)
717 def test_decode(self, size):
718 s = self.from_latin1('.') * size
719 self.assertEquals(len(s.decode('utf-8')), size)
720
721 test_hash = None
722 test_split_large = None
Thomas Wouters477c8d52006-05-27 19:21:47 +0000723
724class TupleTest(unittest.TestCase):
725
726 # Tuples have a small, fixed-sized head and an array of pointers to
727 # data. Since we're testing 64-bit addressing, we can assume that the
728 # pointers are 8 bytes, and that thus that the tuples take up 8 bytes
729 # per size.
730
731 # As a side-effect of testing long tuples, these tests happen to test
732 # having more than 2<<31 references to any given object. Hence the
733 # use of different types of objects as contents in different tests.
734
735 @bigmemtest(minsize=_2G + 2, memuse=16)
736 def test_compare(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000737 t1 = ('',) * size
738 t2 = ('',) * size
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000739 self.assertEqual(t1, t2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000740 del t2
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000741 t2 = ('',) * (size + 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000742 self.failIf(t1 == t2)
743 del t2
744 t2 = (1,) * size
745 self.failIf(t1 == t2)
746
747 # Test concatenating into a single tuple of more than 2G in length,
748 # and concatenating a tuple of more than 2G in length separately, so
749 # the smaller test still gets run even if there isn't memory for the
750 # larger test (but we still let the tester know the larger test is
751 # skipped, in verbose mode.)
752 def basic_concat_test(self, size):
753 t = ((),) * size
754 self.assertEquals(len(t), size)
755 t = t + t
756 self.assertEquals(len(t), size * 2)
757
758 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
759 def test_concat_small(self, size):
760 return self.basic_concat_test(size)
761
762 @bigmemtest(minsize=_2G + 2, memuse=24)
763 def test_concat_large(self, size):
764 return self.basic_concat_test(size)
765
766 @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
767 def test_contains(self, size):
768 t = (1, 2, 3, 4, 5) * size
769 self.assertEquals(len(t), size * 5)
770 self.failUnless(5 in t)
771 self.failIf((1, 2, 3, 4, 5) in t)
772 self.failIf(0 in t)
773
774 @bigmemtest(minsize=_2G + 10, memuse=8)
775 def test_hash(self, size):
776 t1 = (0,) * size
777 h1 = hash(t1)
778 del t1
779 t2 = (0,) * (size + 1)
780 self.failIf(h1 == hash(t2))
781
782 @bigmemtest(minsize=_2G + 10, memuse=8)
783 def test_index_and_slice(self, size):
784 t = (None,) * size
785 self.assertEquals(len(t), size)
786 self.assertEquals(t[-1], None)
787 self.assertEquals(t[5], None)
788 self.assertEquals(t[size - 1], None)
789 self.assertRaises(IndexError, operator.getitem, t, size)
790 self.assertEquals(t[:5], (None,) * 5)
791 self.assertEquals(t[-5:], (None,) * 5)
792 self.assertEquals(t[20:25], (None,) * 5)
793 self.assertEquals(t[-25:-20], (None,) * 5)
794 self.assertEquals(t[size - 5:], (None,) * 5)
795 self.assertEquals(t[size - 5:size], (None,) * 5)
796 self.assertEquals(t[size - 6:size - 2], (None,) * 4)
797 self.assertEquals(t[size:size], ())
798 self.assertEquals(t[size:size+5], ())
799
800 # Like test_concat, split in two.
801 def basic_test_repeat(self, size):
802 t = ('',) * size
803 self.assertEquals(len(t), size)
804 t = t * 2
805 self.assertEquals(len(t), size * 2)
806
807 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
808 def test_repeat_small(self, size):
809 return self.basic_test_repeat(size)
810
811 @bigmemtest(minsize=_2G + 2, memuse=24)
812 def test_repeat_large(self, size):
813 return self.basic_test_repeat(size)
814
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000815 @bigmemtest(minsize=_1G - 1, memuse=12)
816 def test_repeat_large_2(self, size):
817 return self.basic_test_repeat(size)
818
819 @precisionbigmemtest(size=_1G - 1, memuse=9)
820 def test_from_2G_generator(self, size):
821 try:
822 t = tuple(range(size))
823 except MemoryError:
824 pass # acceptable on 32-bit
825 else:
826 count = 0
827 for item in t:
828 self.assertEquals(item, count)
829 count += 1
830 self.assertEquals(count, size)
831
832 @precisionbigmemtest(size=_1G - 25, memuse=9)
833 def test_from_almost_2G_generator(self, size):
834 try:
835 t = tuple(range(size))
836 count = 0
837 for item in t:
838 self.assertEquals(item, count)
839 count += 1
840 self.assertEquals(count, size)
841 except MemoryError:
842 pass # acceptable, expected on 32-bit
843
Thomas Wouters477c8d52006-05-27 19:21:47 +0000844 # Like test_concat, split in two.
845 def basic_test_repr(self, size):
846 t = (0,) * size
847 s = repr(t)
848 # The repr of a tuple of 0's is exactly three times the tuple length.
849 self.assertEquals(len(s), size * 3)
850 self.assertEquals(s[:5], '(0, 0')
851 self.assertEquals(s[-5:], '0, 0)')
852 self.assertEquals(s.count('0'), size)
853
854 @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
855 def test_repr_small(self, size):
856 return self.basic_test_repr(size)
857
858 @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
859 def test_repr_large(self, size):
860 return self.basic_test_repr(size)
861
862class ListTest(unittest.TestCase):
863
864 # Like tuples, lists have a small, fixed-sized head and an array of
865 # pointers to data, so 8 bytes per size. Also like tuples, we make the
866 # lists hold references to various objects to test their refcount
867 # limits.
868
869 @bigmemtest(minsize=_2G + 2, memuse=16)
870 def test_compare(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000871 l1 = [''] * size
872 l2 = [''] * size
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000873 self.assertEqual(l1, l2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000874 del l2
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000875 l2 = [''] * (size + 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000876 self.failIf(l1 == l2)
877 del l2
878 l2 = [2] * size
879 self.failIf(l1 == l2)
880
881 # Test concatenating into a single list of more than 2G in length,
882 # and concatenating a list of more than 2G in length separately, so
883 # the smaller test still gets run even if there isn't memory for the
884 # larger test (but we still let the tester know the larger test is
885 # skipped, in verbose mode.)
886 def basic_test_concat(self, size):
887 l = [[]] * size
888 self.assertEquals(len(l), size)
889 l = l + l
890 self.assertEquals(len(l), size * 2)
891
892 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
893 def test_concat_small(self, size):
894 return self.basic_test_concat(size)
895
896 @bigmemtest(minsize=_2G + 2, memuse=24)
897 def test_concat_large(self, size):
898 return self.basic_test_concat(size)
899
900 def basic_test_inplace_concat(self, size):
901 l = [sys.stdout] * size
902 l += l
903 self.assertEquals(len(l), size * 2)
904 self.failUnless(l[0] is l[-1])
905 self.failUnless(l[size - 1] is l[size + 1])
906
907 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
908 def test_inplace_concat_small(self, size):
909 return self.basic_test_inplace_concat(size)
910
911 @bigmemtest(minsize=_2G + 2, memuse=24)
912 def test_inplace_concat_large(self, size):
913 return self.basic_test_inplace_concat(size)
914
915 @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
916 def test_contains(self, size):
917 l = [1, 2, 3, 4, 5] * size
918 self.assertEquals(len(l), size * 5)
919 self.failUnless(5 in l)
920 self.failIf([1, 2, 3, 4, 5] in l)
921 self.failIf(0 in l)
922
923 @bigmemtest(minsize=_2G + 10, memuse=8)
924 def test_hash(self, size):
925 l = [0] * size
926 self.failUnlessRaises(TypeError, hash, l)
927
928 @bigmemtest(minsize=_2G + 10, memuse=8)
929 def test_index_and_slice(self, size):
930 l = [None] * size
931 self.assertEquals(len(l), size)
932 self.assertEquals(l[-1], None)
933 self.assertEquals(l[5], None)
934 self.assertEquals(l[size - 1], None)
935 self.assertRaises(IndexError, operator.getitem, l, size)
936 self.assertEquals(l[:5], [None] * 5)
937 self.assertEquals(l[-5:], [None] * 5)
938 self.assertEquals(l[20:25], [None] * 5)
939 self.assertEquals(l[-25:-20], [None] * 5)
940 self.assertEquals(l[size - 5:], [None] * 5)
941 self.assertEquals(l[size - 5:size], [None] * 5)
942 self.assertEquals(l[size - 6:size - 2], [None] * 4)
943 self.assertEquals(l[size:size], [])
944 self.assertEquals(l[size:size+5], [])
945
946 l[size - 2] = 5
947 self.assertEquals(len(l), size)
948 self.assertEquals(l[-3:], [None, 5, None])
949 self.assertEquals(l.count(5), 1)
950 self.assertRaises(IndexError, operator.setitem, l, size, 6)
951 self.assertEquals(len(l), size)
952
953 l[size - 7:] = [1, 2, 3, 4, 5]
954 size -= 2
955 self.assertEquals(len(l), size)
956 self.assertEquals(l[-7:], [None, None, 1, 2, 3, 4, 5])
957
958 l[:7] = [1, 2, 3, 4, 5]
959 size -= 2
960 self.assertEquals(len(l), size)
961 self.assertEquals(l[:7], [1, 2, 3, 4, 5, None, None])
962
963 del l[size - 1]
964 size -= 1
965 self.assertEquals(len(l), size)
966 self.assertEquals(l[-1], 4)
967
968 del l[-2:]
969 size -= 2
970 self.assertEquals(len(l), size)
971 self.assertEquals(l[-1], 2)
972
973 del l[0]
974 size -= 1
975 self.assertEquals(len(l), size)
976 self.assertEquals(l[0], 2)
977
978 del l[:2]
979 size -= 2
980 self.assertEquals(len(l), size)
981 self.assertEquals(l[0], 4)
982
983 # Like test_concat, split in two.
984 def basic_test_repeat(self, size):
985 l = [] * size
986 self.failIf(l)
987 l = [''] * size
988 self.assertEquals(len(l), size)
989 l = l * 2
990 self.assertEquals(len(l), size * 2)
991
992 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
993 def test_repeat_small(self, size):
994 return self.basic_test_repeat(size)
995
996 @bigmemtest(minsize=_2G + 2, memuse=24)
997 def test_repeat_large(self, size):
998 return self.basic_test_repeat(size)
999
1000 def basic_test_inplace_repeat(self, size):
1001 l = ['']
1002 l *= size
1003 self.assertEquals(len(l), size)
1004 self.failUnless(l[0] is l[-1])
1005 del l
1006
1007 l = [''] * size
1008 l *= 2
1009 self.assertEquals(len(l), size * 2)
1010 self.failUnless(l[size - 1] is l[-1])
1011
1012 @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
1013 def test_inplace_repeat_small(self, size):
1014 return self.basic_test_inplace_repeat(size)
1015
1016 @bigmemtest(minsize=_2G + 2, memuse=16)
1017 def test_inplace_repeat_large(self, size):
1018 return self.basic_test_inplace_repeat(size)
1019
1020 def basic_test_repr(self, size):
1021 l = [0] * size
1022 s = repr(l)
1023 # The repr of a list of 0's is exactly three times the list length.
1024 self.assertEquals(len(s), size * 3)
1025 self.assertEquals(s[:5], '[0, 0')
1026 self.assertEquals(s[-5:], '0, 0]')
1027 self.assertEquals(s.count('0'), size)
1028
1029 @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
1030 def test_repr_small(self, size):
1031 return self.basic_test_repr(size)
1032
1033 @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
1034 def test_repr_large(self, size):
1035 return self.basic_test_repr(size)
1036
1037 # list overallocates ~1/8th of the total size (on first expansion) so
1038 # the single list.append call puts memuse at 9 bytes per size.
1039 @bigmemtest(minsize=_2G, memuse=9)
1040 def test_append(self, size):
1041 l = [object()] * size
1042 l.append(object())
1043 self.assertEquals(len(l), size+1)
1044 self.failUnless(l[-3] is l[-2])
1045 self.failIf(l[-2] is l[-1])
1046
1047 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1048 def test_count(self, size):
1049 l = [1, 2, 3, 4, 5] * size
1050 self.assertEquals(l.count(1), size)
1051 self.assertEquals(l.count("1"), 0)
1052
1053 def basic_test_extend(self, size):
Guido van Rossuma5d0c262007-07-12 08:11:23 +00001054 l = [object] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 l.extend(l)
1056 self.assertEquals(len(l), size * 2)
1057 self.failUnless(l[0] is l[-1])
1058 self.failUnless(l[size - 1] is l[size + 1])
1059
1060 @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
1061 def test_extend_small(self, size):
1062 return self.basic_test_extend(size)
1063
1064 @bigmemtest(minsize=_2G + 2, memuse=16)
1065 def test_extend_large(self, size):
1066 return self.basic_test_extend(size)
1067
1068 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1069 def test_index(self, size):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001070 l = [1, 2, 3, 4, 5] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071 size *= 5
1072 self.assertEquals(l.index(1), 0)
1073 self.assertEquals(l.index(5, size - 5), size - 1)
1074 self.assertEquals(l.index(5, size - 5, size), size - 1)
1075 self.assertRaises(ValueError, l.index, 1, size - 4, size)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001076 self.assertRaises(ValueError, l.index, 6)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077
1078 # This tests suffers from overallocation, just like test_append.
1079 @bigmemtest(minsize=_2G + 10, memuse=9)
1080 def test_insert(self, size):
1081 l = [1.0] * size
1082 l.insert(size - 1, "A")
1083 size += 1
1084 self.assertEquals(len(l), size)
1085 self.assertEquals(l[-3:], [1.0, "A", 1.0])
1086
1087 l.insert(size + 1, "B")
1088 size += 1
1089 self.assertEquals(len(l), size)
1090 self.assertEquals(l[-3:], ["A", 1.0, "B"])
1091
1092 l.insert(1, "C")
1093 size += 1
1094 self.assertEquals(len(l), size)
1095 self.assertEquals(l[:3], [1.0, "C", 1.0])
1096 self.assertEquals(l[size - 3:], ["A", 1.0, "B"])
1097
1098 @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5)
1099 def test_pop(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001100 l = ["a", "b", "c", "d", "e"] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +00001101 size *= 5
1102 self.assertEquals(len(l), size)
1103
1104 item = l.pop()
1105 size -= 1
1106 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001107 self.assertEquals(item, "e")
1108 self.assertEquals(l[-2:], ["c", "d"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001109
1110 item = l.pop(0)
1111 size -= 1
1112 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001113 self.assertEquals(item, "a")
1114 self.assertEquals(l[:2], ["b", "c"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115
1116 item = l.pop(size - 2)
1117 size -= 1
1118 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001119 self.assertEquals(item, "c")
1120 self.assertEquals(l[-2:], ["b", "d"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121
1122 @bigmemtest(minsize=_2G + 10, memuse=8)
1123 def test_remove(self, size):
1124 l = [10] * size
1125 self.assertEquals(len(l), size)
1126
1127 l.remove(10)
1128 size -= 1
1129 self.assertEquals(len(l), size)
1130
1131 # Because of the earlier l.remove(), this append doesn't trigger
1132 # a resize.
1133 l.append(5)
1134 size += 1
1135 self.assertEquals(len(l), size)
1136 self.assertEquals(l[-2:], [10, 5])
1137 l.remove(5)
1138 size -= 1
1139 self.assertEquals(len(l), size)
1140 self.assertEquals(l[-2:], [10, 10])
1141
1142 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1143 def test_reverse(self, size):
1144 l = [1, 2, 3, 4, 5] * size
1145 l.reverse()
1146 self.assertEquals(len(l), size * 5)
1147 self.assertEquals(l[-5:], [5, 4, 3, 2, 1])
1148 self.assertEquals(l[:5], [5, 4, 3, 2, 1])
1149
1150 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1151 def test_sort(self, size):
1152 l = [1, 2, 3, 4, 5] * size
1153 l.sort()
1154 self.assertEquals(len(l), size * 5)
1155 self.assertEquals(l.count(1), size)
1156 self.assertEquals(l[:10], [1] * 10)
1157 self.assertEquals(l[-10:], [5] * 10)
1158
1159def test_main():
Antoine Pitrou7cdb4952009-03-07 23:40:49 +00001160 support.run_unittest(StrTest, BytesTest, BytearrayTest,
1161 TupleTest, ListTest)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001162
1163if __name__ == '__main__':
1164 if len(sys.argv) > 1:
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001165 support.set_memlimit(sys.argv[1])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 test_main()