Kaydet (Commit) 0fd583ce authored tarafından Walter Dörwald's avatar Walter Dörwald

Port all string tests to PyUnit and share as much tests

between str, unicode, UserString and the string module
as possible. This increases code coverage in stringobject.c
from 83% to 86% and should help keep the string classes
in sync in the future. From SF patch #662807
üst 1b56de05
This diff is collapsed.
This diff is collapsed.
import unittest
from test import test_support, string_tests
class StrTest(
string_tests.CommonTest,
string_tests.MixinStrUnicodeUserStringTest,
string_tests.MixinStrUserStringTest
):
type2test = str
# We don't need to propagate to str
def fixtype(self, obj):
return obj
def test_main():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(StrTest))
test_support.run_suite(suite)
if __name__ == "__main__":
test_main()
from test.test_support import verbose, TestSkipped import unittest, string
from test import string_tests from test import test_support, string_tests
import string, sys from UserList import UserList
# XXX: kludge... short circuit if strings don't have methods class StringTest(
try: string_tests.CommonTest,
''.join string_tests.MixinStrStringUserStringTest
except AttributeError: ):
raise TestSkipped
type2test = str
def test(name, input, output, *args):
if verbose: def checkequal(self, result, object, methodname, *args):
print 'string.%s%s =? %s... ' % (name, (input,) + args, output), realresult = getattr(string, methodname)(object, *args)
try: self.assertEqual(
# Prefer string methods over string module functions result,
try: realresult
f = getattr(input, name) )
value = apply(f, args)
except AttributeError: def checkraises(self, exc, object, methodname, *args):
f = getattr(string, name) self.assertRaises(
value = apply(f, (input,) + args) exc,
except: getattr(string, methodname),
value = sys.exc_type object,
f = name *args
if value == output: )
# if the original is returned make sure that
# this doesn't happen with subclasses def checkcall(self, object, methodname, *args):
if value is input: getattr(string, methodname)(object, *args)
class ssub(str):
def __repr__(self): def test_join(self):
return 'ssub(%r)' % str.__repr__(self) # These are the same checks as in string_test.ObjectTest.test_join
input = ssub(input) # but the argument order ist different
try: self.checkequal('a b c d', ['a', 'b', 'c', 'd'], 'join', ' ')
f = getattr(input, name) self.checkequal('abcd', ('a', 'b', 'c', 'd'), 'join', '')
value = apply(f, args) self.checkequal('w x y z', string_tests.Sequence(), 'join', ' ')
except AttributeError: self.checkequal('abc', ('abc',), 'join', 'a')
f = getattr(string, name) self.checkequal('z', UserList(['z']), 'join', 'a')
value = apply(f, (input,) + args) if test_support.have_unicode:
if value is input: self.checkequal(unicode('a.b.c'), ['a', 'b', 'c'], 'join', unicode('.'))
if verbose: self.checkequal(unicode('a.b.c'), [unicode('a'), 'b', 'c'], 'join', '.')
print 'no' self.checkequal(unicode('a.b.c'), ['a', unicode('b'), 'c'], 'join', '.')
print '*',f, `input`, `output`, `value` self.checkequal(unicode('a.b.c'), ['a', 'b', unicode('c')], 'join', '.')
return self.checkraises(TypeError, ['a', unicode('b'), 3], 'join', '.')
if value != output: for i in [5, 25, 125]:
if verbose: self.checkequal(
print 'no' ((('a' * i) + '-') * i)[:-1],
print f, `input`, `output`, `value` ['a' * i] * i, 'join', '-')
else: self.checkequal(
if verbose: ((('a' * i) + '-') * i)[:-1],
print 'yes' ('a' * i,) * i, 'join', '-')
string_tests.run_module_tests(test) self.checkraises(TypeError, string_tests.BadSeq1(), 'join', ' ')
string_tests.run_method_tests(test) self.checkequal('a b c', string_tests.BadSeq2(), 'join', ' ')
string_tests.run_contains_tests(test)
string_tests.run_inplace_tests(str) class ModuleTest(unittest.TestCase):
string.whitespace def test_attrs(self):
string.lowercase string.whitespace
string.uppercase string.lowercase
string.uppercase
# Float formatting string.letters
for prec in range(100): string.digits
formatstring = '%%.%if' % prec string.hexdigits
value = 0.01 string.octdigits
for x in range(60): string.punctuation
value = value * 3.141592655 / 3.0 * 10.0 string.printable
#print 'Overflow check for x=%i and prec=%i:' % \
# (x, prec), def test_atoi(self):
try: self.assertEqual(string.atoi(" 1 "), 1)
result = formatstring % value self.assertRaises(ValueError, string.atoi, " 1x")
except OverflowError: self.assertRaises(ValueError, string.atoi, " x1 ")
# The formatfloat() code in stringobject.c and
# unicodeobject.c uses a 120 byte buffer and switches from def test_atol(self):
# 'f' formatting to 'g' at precision 50, so we expect self.assertEqual(string.atol(" 1 "), 1L)
# OverflowErrors for the ranges x < 50 and prec >= 67. self.assertRaises(ValueError, string.atol, " 1x ")
if x >= 50 or \ self.assertRaises(ValueError, string.atol, " x1 ")
prec < 67:
print '*** unexpected OverflowError for x=%i and prec=%i' % (x, prec) def test_atof(self):
else: self.assertAlmostEqual(string.atof(" 1 "), 1.0)
#print 'OverflowError' self.assertRaises(ValueError, string.atof, " 1x ")
pass self.assertRaises(ValueError, string.atof, " x1 ")
else:
#print result def test_maketrans(self):
pass transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
self.assertEqual(string.maketrans('abc', 'xyz'), transtable)
self.assertRaises(ValueError, string.maketrans, 'abc', 'xyzq')
def test_capwords(self):
self.assertEqual(string.capwords('abc def ghi'), 'Abc Def Ghi')
self.assertEqual(string.capwords('abc\tdef\nghi'), 'Abc Def Ghi')
self.assertEqual(string.capwords('abc\t def \nghi'), 'Abc Def Ghi')
self.assertEqual(string.capwords('ABC DEF GHI'), 'Abc Def Ghi')
self.assertEqual(string.capwords('ABC-DEF-GHI', '-'), 'Abc-Def-Ghi')
self.assertEqual(string.capwords('ABC-def DEF-ghi GHI'), 'Abc-def Def-ghi Ghi')
def test_main():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(StringTest))
suite.addTest(unittest.makeSuite(ModuleTest))
test_support.run_suite(suite)
if __name__ == "__main__":
test_main()
This diff is collapsed.
#!/usr/bin/env python #!/usr/bin/env python
import sys
from test.test_support import verbose
from test import string_tests
# UserString is a wrapper around the native builtin string type. # UserString is a wrapper around the native builtin string type.
# UserString instances should behave similar to builtin string objects. # UserString instances should behave similar to builtin string objects.
# The test cases were in part derived from 'test_string.py'.
import unittest
from test import test_support, string_tests
from UserString import UserString from UserString import UserString
class UserStringTest(
string_tests.CommonTest,
string_tests.MixinStrUnicodeUserStringTest,
string_tests.MixinStrStringUserStringTest,
string_tests.MixinStrUserStringTest
):
type2test = UserString
# Overwrite the three testing methods, because UserString
# can't cope with arguments propagated to UserString
# (and we don't test with subclasses)
def checkequal(self, result, object, methodname, *args):
result = self.fixtype(result)
object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it
realresult = getattr(object, methodname)(*args)
self.assertEqual(
result,
realresult
)
def checkraises(self, exc, object, methodname, *args):
object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it
self.assertRaises(
exc,
getattr(object, methodname),
*args
)
def checkcall(self, object, methodname, *args):
object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it
getattr(object, methodname)(*args)
def test_main():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(UserStringTest))
test_support.run_suite(suite)
if __name__ == "__main__": if __name__ == "__main__":
verbose = '-v' in sys.argv test_main()
tested_methods = {}
def test(methodname, input, output, *args):
global tested_methods
tested_methods[methodname] = 1
if verbose:
print '%r.%s(%s)' % (input, methodname, ", ".join(map(repr, args))),
u = UserString(input)
objects = [input, u, UserString(u)]
res = [""] * 3
for i in range(3):
object = objects[i]
try:
f = getattr(object, methodname)
except AttributeError:
f = None
res[i] = AttributeError
else:
try:
res[i] = apply(f, args)
except:
res[i] = sys.exc_type
if res[0] == res[1] == res[2] == output:
if verbose:
print 'yes'
else:
if verbose:
print 'no'
print (methodname, input, output, args, res[0], res[1], res[2])
string_tests.run_method_tests(test)
string_tests.run_contains_tests(test)
string_tests.run_inplace_tests(UserString)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment