mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-140911: Ensure that UserString.index() and UserString.rindex() accept UserString as argument (GH-140945)
This commit is contained in:
parent
d07d3a3c57
commit
e6174ee981
3 changed files with 48 additions and 33 deletions
|
|
@ -1542,6 +1542,8 @@ def format_map(self, mapping):
|
||||||
return self.data.format_map(mapping)
|
return self.data.format_map(mapping)
|
||||||
|
|
||||||
def index(self, sub, start=0, end=_sys.maxsize):
|
def index(self, sub, start=0, end=_sys.maxsize):
|
||||||
|
if isinstance(sub, UserString):
|
||||||
|
sub = sub.data
|
||||||
return self.data.index(sub, start, end)
|
return self.data.index(sub, start, end)
|
||||||
|
|
||||||
def isalpha(self):
|
def isalpha(self):
|
||||||
|
|
@ -1610,6 +1612,8 @@ def rfind(self, sub, start=0, end=_sys.maxsize):
|
||||||
return self.data.rfind(sub, start, end)
|
return self.data.rfind(sub, start, end)
|
||||||
|
|
||||||
def rindex(self, sub, start=0, end=_sys.maxsize):
|
def rindex(self, sub, start=0, end=_sys.maxsize):
|
||||||
|
if isinstance(sub, UserString):
|
||||||
|
sub = sub.data
|
||||||
return self.data.rindex(sub, start, end)
|
return self.data.rindex(sub, start, end)
|
||||||
|
|
||||||
def rjust(self, width, *args):
|
def rjust(self, width, *args):
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,18 @@ def checkcall(self, obj, methodname, *args):
|
||||||
args = self.fixtype(args)
|
args = self.fixtype(args)
|
||||||
getattr(obj, methodname)(*args)
|
getattr(obj, methodname)(*args)
|
||||||
|
|
||||||
|
def _get_teststrings(self, charset, digits):
|
||||||
|
base = len(charset)
|
||||||
|
teststrings = set()
|
||||||
|
for i in range(base ** digits):
|
||||||
|
entry = []
|
||||||
|
for j in range(digits):
|
||||||
|
i, m = divmod(i, base)
|
||||||
|
entry.append(charset[m])
|
||||||
|
teststrings.add(''.join(entry))
|
||||||
|
teststrings = [self.fixtype(ts) for ts in teststrings]
|
||||||
|
return teststrings
|
||||||
|
|
||||||
def test_count(self):
|
def test_count(self):
|
||||||
self.checkequal(3, 'aaa', 'count', 'a')
|
self.checkequal(3, 'aaa', 'count', 'a')
|
||||||
self.checkequal(0, 'aaa', 'count', 'b')
|
self.checkequal(0, 'aaa', 'count', 'b')
|
||||||
|
|
@ -130,17 +142,7 @@ def test_count(self):
|
||||||
# For a variety of combinations,
|
# For a variety of combinations,
|
||||||
# verify that str.count() matches an equivalent function
|
# verify that str.count() matches an equivalent function
|
||||||
# replacing all occurrences and then differencing the string lengths
|
# replacing all occurrences and then differencing the string lengths
|
||||||
charset = ['', 'a', 'b']
|
teststrings = self._get_teststrings(['', 'a', 'b'], 7)
|
||||||
digits = 7
|
|
||||||
base = len(charset)
|
|
||||||
teststrings = set()
|
|
||||||
for i in range(base ** digits):
|
|
||||||
entry = []
|
|
||||||
for j in range(digits):
|
|
||||||
i, m = divmod(i, base)
|
|
||||||
entry.append(charset[m])
|
|
||||||
teststrings.add(''.join(entry))
|
|
||||||
teststrings = [self.fixtype(ts) for ts in teststrings]
|
|
||||||
for i in teststrings:
|
for i in teststrings:
|
||||||
n = len(i)
|
n = len(i)
|
||||||
for j in teststrings:
|
for j in teststrings:
|
||||||
|
|
@ -197,17 +199,7 @@ def test_find(self):
|
||||||
# For a variety of combinations,
|
# For a variety of combinations,
|
||||||
# verify that str.find() matches __contains__
|
# verify that str.find() matches __contains__
|
||||||
# and that the found substring is really at that location
|
# and that the found substring is really at that location
|
||||||
charset = ['', 'a', 'b', 'c']
|
teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5)
|
||||||
digits = 5
|
|
||||||
base = len(charset)
|
|
||||||
teststrings = set()
|
|
||||||
for i in range(base ** digits):
|
|
||||||
entry = []
|
|
||||||
for j in range(digits):
|
|
||||||
i, m = divmod(i, base)
|
|
||||||
entry.append(charset[m])
|
|
||||||
teststrings.add(''.join(entry))
|
|
||||||
teststrings = [self.fixtype(ts) for ts in teststrings]
|
|
||||||
for i in teststrings:
|
for i in teststrings:
|
||||||
for j in teststrings:
|
for j in teststrings:
|
||||||
loc = i.find(j)
|
loc = i.find(j)
|
||||||
|
|
@ -244,17 +236,7 @@ def test_rfind(self):
|
||||||
# For a variety of combinations,
|
# For a variety of combinations,
|
||||||
# verify that str.rfind() matches __contains__
|
# verify that str.rfind() matches __contains__
|
||||||
# and that the found substring is really at that location
|
# and that the found substring is really at that location
|
||||||
charset = ['', 'a', 'b', 'c']
|
teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5)
|
||||||
digits = 5
|
|
||||||
base = len(charset)
|
|
||||||
teststrings = set()
|
|
||||||
for i in range(base ** digits):
|
|
||||||
entry = []
|
|
||||||
for j in range(digits):
|
|
||||||
i, m = divmod(i, base)
|
|
||||||
entry.append(charset[m])
|
|
||||||
teststrings.add(''.join(entry))
|
|
||||||
teststrings = [self.fixtype(ts) for ts in teststrings]
|
|
||||||
for i in teststrings:
|
for i in teststrings:
|
||||||
for j in teststrings:
|
for j in teststrings:
|
||||||
loc = i.rfind(j)
|
loc = i.rfind(j)
|
||||||
|
|
@ -295,6 +277,19 @@ def test_index(self):
|
||||||
else:
|
else:
|
||||||
self.checkraises(TypeError, 'hello', 'index', 42)
|
self.checkraises(TypeError, 'hello', 'index', 42)
|
||||||
|
|
||||||
|
# For a variety of combinations,
|
||||||
|
# verify that str.index() matches __contains__
|
||||||
|
# and that the found substring is really at that location
|
||||||
|
teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5)
|
||||||
|
for i in teststrings:
|
||||||
|
for j in teststrings:
|
||||||
|
if j in i:
|
||||||
|
loc = i.index(j)
|
||||||
|
self.assertGreaterEqual(loc, 0)
|
||||||
|
self.assertEqual(i[loc:loc+len(j)], j)
|
||||||
|
else:
|
||||||
|
self.assertRaises(ValueError, i.index, j)
|
||||||
|
|
||||||
def test_rindex(self):
|
def test_rindex(self):
|
||||||
self.checkequal(12, 'abcdefghiabc', 'rindex', '')
|
self.checkequal(12, 'abcdefghiabc', 'rindex', '')
|
||||||
self.checkequal(3, 'abcdefghiabc', 'rindex', 'def')
|
self.checkequal(3, 'abcdefghiabc', 'rindex', 'def')
|
||||||
|
|
@ -321,6 +316,19 @@ def test_rindex(self):
|
||||||
else:
|
else:
|
||||||
self.checkraises(TypeError, 'hello', 'rindex', 42)
|
self.checkraises(TypeError, 'hello', 'rindex', 42)
|
||||||
|
|
||||||
|
# For a variety of combinations,
|
||||||
|
# verify that str.rindex() matches __contains__
|
||||||
|
# and that the found substring is really at that location
|
||||||
|
teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5)
|
||||||
|
for i in teststrings:
|
||||||
|
for j in teststrings:
|
||||||
|
if j in i:
|
||||||
|
loc = i.rindex(j)
|
||||||
|
self.assertGreaterEqual(loc, 0)
|
||||||
|
self.assertEqual(i[loc:loc+len(j)], j)
|
||||||
|
else:
|
||||||
|
self.assertRaises(ValueError, i.rindex, j)
|
||||||
|
|
||||||
def test_find_periodic_pattern(self):
|
def test_find_periodic_pattern(self):
|
||||||
"""Cover the special path for periodic patterns."""
|
"""Cover the special path for periodic patterns."""
|
||||||
def reference_find(p, s):
|
def reference_find(p, s):
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
:mod:`collections`: Ensure that the methods ``UserString.rindex()`` and
|
||||||
|
``UserString.index()`` accept :class:`collections.UserString` instances as the
|
||||||
|
sub argument.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue