1 import unittest, string 2 from test import test_support, string_tests 3 from UserList import UserList 4 5 class StringTest( 6 string_tests.CommonTest, 7 string_tests.MixinStrStringUserStringTest 8 ): 9 10 type2test = str 11 12 def checkequal(self, result, object, methodname, *args): 13 realresult = getattr(string, methodname)(object, *args) 14 self.assertEqual( 15 result, 16 realresult 17 ) 18 19 def checkraises(self, exc, object, methodname, *args): 20 self.assertRaises( 21 exc, 22 getattr(string, methodname), 23 object, 24 *args 25 ) 26 27 def checkcall(self, object, methodname, *args): 28 getattr(string, methodname)(object, *args) 29 30 def test_join(self): 31 # These are the same checks as in string_test.ObjectTest.test_join 32 # but the argument order ist different 33 self.checkequal('a b c d', ['a', 'b', 'c', 'd'], 'join', ' ') 34 self.checkequal('abcd', ('a', 'b', 'c', 'd'), 'join', '') 35 self.checkequal('w x y z', string_tests.Sequence(), 'join', ' ') 36 self.checkequal('abc', ('abc',), 'join', 'a') 37 self.checkequal('z', UserList(['z']), 'join', 'a') 38 if test_support.have_unicode: 39 self.checkequal(unicode('a.b.c'), ['a', 'b', 'c'], 'join', unicode('.')) 40 self.checkequal(unicode('a.b.c'), [unicode('a'), 'b', 'c'], 'join', '.') 41 self.checkequal(unicode('a.b.c'), ['a', unicode('b'), 'c'], 'join', '.') 42 self.checkequal(unicode('a.b.c'), ['a', 'b', unicode('c')], 'join', '.') 43 self.checkraises(TypeError, ['a', unicode('b'), 3], 'join', '.') 44 for i in [5, 25, 125]: 45 self.checkequal( 46 ((('a' * i) + '-') * i)[:-1], 47 ['a' * i] * i, 'join', '-') 48 self.checkequal( 49 ((('a' * i) + '-') * i)[:-1], 50 ('a' * i,) * i, 'join', '-') 51 52 self.checkraises(TypeError, string_tests.BadSeq1(), 'join', ' ') 53 self.checkequal('a b c', string_tests.BadSeq2(), 'join', ' ') 54 try: 55 def f(): 56 yield 4 + "" 57 self.fixtype(' ').join(f()) 58 except TypeError, e: 59 if '+' not in str(e): 60 self.fail('join() ate exception message') 61 else: 62 self.fail('exception not raised') 63 64 65 66 67 class ModuleTest(unittest.TestCase): 68 69 def test_attrs(self): 70 string.whitespace 71 string.lowercase 72 string.uppercase 73 string.letters 74 string.digits 75 string.hexdigits 76 string.octdigits 77 string.punctuation 78 string.printable 79 80 def test_atoi(self): 81 self.assertEqual(string.atoi(" 1 "), 1) 82 self.assertRaises(ValueError, string.atoi, " 1x") 83 self.assertRaises(ValueError, string.atoi, " x1 ") 84 85 def test_atol(self): 86 self.assertEqual(string.atol(" 1 "), 1L) 87 self.assertRaises(ValueError, string.atol, " 1x ") 88 self.assertRaises(ValueError, string.atol, " x1 ") 89 90 def test_atof(self): 91 self.assertAlmostEqual(string.atof(" 1 "), 1.0) 92 self.assertRaises(ValueError, string.atof, " 1x ") 93 self.assertRaises(ValueError, string.atof, " x1 ") 94 95 def test_maketrans(self): 96 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' 97 98 self.assertEqual(string.maketrans('abc', 'xyz'), transtable) 99 self.assertRaises(ValueError, string.maketrans, 'abc', 'xyzq') 100 101 def test_capwords(self): 102 self.assertEqual(string.capwords('abc def ghi'), 'Abc Def Ghi') 103 self.assertEqual(string.capwords('abc\tdef\nghi'), 'Abc Def Ghi') 104 self.assertEqual(string.capwords('abc\t def \nghi'), 'Abc Def Ghi') 105 self.assertEqual(string.capwords('ABC DEF GHI'), 'Abc Def Ghi') 106 self.assertEqual(string.capwords('ABC-DEF-GHI', '-'), 'Abc-Def-Ghi') 107 self.assertEqual(string.capwords('ABC-def DEF-ghi GHI'), 'Abc-def Def-ghi Ghi') 108 self.assertEqual(string.capwords(' aBc DeF '), 'Abc Def') 109 self.assertEqual(string.capwords('\taBc\tDeF\t'), 'Abc Def') 110 self.assertEqual(string.capwords('\taBc\tDeF\t', '\t'), '\tAbc\tDef\t') 111 112 def test_formatter(self): 113 fmt = string.Formatter() 114 self.assertEqual(fmt.format("foo"), "foo") 115 116 self.assertEqual(fmt.format("foo{0}", "bar"), "foobar") 117 self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6") 118 self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-") 119 120 # override get_value ############################################ 121 class NamespaceFormatter(string.Formatter): 122 def __init__(self, namespace={}): 123 string.Formatter.__init__(self) 124 self.namespace = namespace 125 126 def get_value(self, key, args, kwds): 127 if isinstance(key, str): 128 try: 129 # Check explicitly passed arguments first 130 return kwds[key] 131 except KeyError: 132 return self.namespace[key] 133 else: 134 string.Formatter.get_value(key, args, kwds) 135 136 fmt = NamespaceFormatter({'greeting':'hello'}) 137 self.assertEqual(fmt.format("{greeting}, world!"), 'hello, world!') 138 139 140 # override format_field ######################################### 141 class CallFormatter(string.Formatter): 142 def format_field(self, value, format_spec): 143 return format(value(), format_spec) 144 145 fmt = CallFormatter() 146 self.assertEqual(fmt.format('*{0}*', lambda : 'result'), '*result*') 147 148 149 # override convert_field ######################################## 150 class XFormatter(string.Formatter): 151 def convert_field(self, value, conversion): 152 if conversion == 'x': 153 return None 154 return super(XFormatter, self).convert_field(value, conversion) 155 156 fmt = XFormatter() 157 self.assertEqual(fmt.format("{0!r}:{0!x}", 'foo', 'foo'), "'foo':None") 158 159 160 # override parse ################################################ 161 class BarFormatter(string.Formatter): 162 # returns an iterable that contains tuples of the form: 163 # (literal_text, field_name, format_spec, conversion) 164 def parse(self, format_string): 165 for field in format_string.split('|'): 166 if field[0] == '+': 167 # it's markup 168 field_name, _, format_spec = field[1:].partition(':') 169 yield '', field_name, format_spec, None 170 else: 171 yield field, None, None, None 172 173 fmt = BarFormatter() 174 self.assertEqual(fmt.format('*|+0:^10s|*', 'foo'), '* foo *') 175 176 # test all parameters used 177 class CheckAllUsedFormatter(string.Formatter): 178 def check_unused_args(self, used_args, args, kwargs): 179 # Track which arguments actually got used 180 unused_args = set(kwargs.keys()) 181 unused_args.update(range(0, len(args))) 182 183 for arg in used_args: 184 unused_args.remove(arg) 185 186 if unused_args: 187 raise ValueError("unused arguments") 188 189 fmt = CheckAllUsedFormatter() 190 self.assertEqual(fmt.format("{0}", 10), "10") 191 self.assertEqual(fmt.format("{0}{i}", 10, i=100), "10100") 192 self.assertEqual(fmt.format("{0}{i}{1}", 10, 20, i=100), "1010020") 193 self.assertRaises(ValueError, fmt.format, "{0}{i}{1}", 10, 20, i=100, j=0) 194 self.assertRaises(ValueError, fmt.format, "{0}", 10, 20) 195 self.assertRaises(ValueError, fmt.format, "{0}", 10, 20, i=100) 196 self.assertRaises(ValueError, fmt.format, "{i}", 10, 20, i=100) 197 198 # Alternate formatting is not supported 199 self.assertRaises(ValueError, format, '', '#') 200 self.assertRaises(ValueError, format, '', '#20') 201 202 class BytesAliasTest(unittest.TestCase): 203 204 def test_builtin(self): 205 self.assertTrue(str is bytes) 206 207 def test_syntax(self): 208 self.assertEqual(b"spam", "spam") 209 self.assertEqual(br"egg\foo", "egg\\foo") 210 self.assertTrue(type(b""), str) 211 self.assertTrue(type(br""), str) 212 213 def test_main(): 214 test_support.run_unittest(StringTest, ModuleTest, BytesAliasTest) 215 216 if __name__ == "__main__": 217 test_main() 218