summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2002-04-17 21:34:05 (GMT)
committerWalter Dörwald <walter@livinglogic.de>2002-04-17 21:34:05 (GMT)
commit2ee4be077534577eed52c136d10d9f8c0731e864 (patch)
tree2c3021ea407fedc62b685d330a8081869456c605
parent1ec71ea48e344a556bf1ecfbe5d31913f48c091c (diff)
downloadcpython-2ee4be077534577eed52c136d10d9f8c0731e864.zip
cpython-2ee4be077534577eed52c136d10d9f8c0731e864.tar.gz
cpython-2ee4be077534577eed52c136d10d9f8c0731e864.tar.bz2
Apply diff3.txt from SF patch http://www.python.org/sf/536241
If a str or unicode method returns the original object, make sure that for str and unicode subclasses the original will not be returned. This should prevent SF bug http://www.python.org/sf/460020 from reappearing.
-rw-r--r--Lib/test/test_string.py19
-rw-r--r--Lib/test/test_unicode.py22
2 files changed, 41 insertions, 0 deletions
diff --git a/Lib/test/test_string.py b/Lib/test/test_string.py
index 4c5a60a..8f0ea47 100644
--- a/Lib/test/test_string.py
+++ b/Lib/test/test_string.py
@@ -22,6 +22,25 @@ def test(name, input, output, *args):
except:
value = sys.exc_type
f = name
+ if value == output:
+ # if the original is returned make sure that
+ # this doesn't happen with subclasses
+ if value is input:
+ class ssub(str):
+ def __repr__(self):
+ return 'ssub(%r)' % str.__repr__(self)
+ input = ssub(input)
+ try:
+ f = getattr(input, name)
+ value = apply(f, args)
+ except AttributeError:
+ f = getattr(string, name)
+ value = apply(f, (input,) + args)
+ if value is input:
+ if verbose:
+ print 'no'
+ print '*',f, `input`, `output`, `value`
+ return
if value != output:
if verbose:
print 'no'
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index c04d929..8e8ddf9 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -52,6 +52,25 @@ def test(method, input, output, *args):
exc = sys.exc_info()[:2]
else:
exc = None
+ if value == output and type(value) is type(output):
+ # if the original is returned make sure that
+ # this doesn't happen with subclasses
+ if value is input:
+ class usub(unicode):
+ def __repr__(self):
+ return 'usub(%r)' % unicode.__repr__(self)
+ input = usub(input)
+ try:
+ f = getattr(input, method)
+ value = apply(f, args)
+ except:
+ value = sys.exc_type
+ exc = sys.exc_info()[:2]
+ if value is input:
+ if verbose:
+ print 'no'
+ print '*',f, `input`, `output`, `value`
+ return
if value != output or type(value) is not type(output):
if verbose:
print 'no'
@@ -63,6 +82,7 @@ def test(method, input, output, *args):
print 'yes'
test('capitalize', u' hello ', u' hello ')
+test('capitalize', u'Hello ', u'Hello ')
test('capitalize', u'hello ', u'Hello ')
test('capitalize', u'aaaa', u'Aaaa')
test('capitalize', u'AaAa', u'Aaaa')
@@ -75,6 +95,7 @@ test('count', u'aaa', 3, 'a')
test('count', u'aaa', 0, 'b')
test('title', u' hello ', u' Hello ')
+test('title', u'Hello ', u'Hello ')
test('title', u'hello ', u'Hello ')
test('title', u"fOrMaT thIs aS titLe String", u'Format This As Title String')
test('title', u"fOrMaT,thIs-aS*titLe;String", u'Format,This-As*Title;String')
@@ -200,6 +221,7 @@ test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi')
test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi', 8)
test('expandtabs', u'abc\rab\tdef\ng\thi', u'abc\rab def\ng hi', 4)
test('expandtabs', u'abc\r\nab\tdef\ng\thi', u'abc\r\nab def\ng hi', 4)
+test('expandtabs', u'abc\r\nab\r\ndef\ng\r\nhi', u'abc\r\nab\r\ndef\ng\r\nhi', 4)
if 0:
test('capwords', u'abc def ghi', u'Abc Def Ghi')