Home | History | Annotate | Download | only in test
      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