Home | History | Annotate | Download | only in idle_test
      1 import unittest
      2 import io
      3 from idlelib.PyShell import PseudoInputFile, PseudoOutputFile
      4 from test import test_support as support
      5 
      6 
      7 class Base(object):
      8     def __str__(self):
      9         return '%s:str' % type(self).__name__
     10     def __unicode__(self):
     11         return '%s:unicode' % type(self).__name__
     12     def __len__(self):
     13         return 3
     14     def __iter__(self):
     15         return iter('abc')
     16     def __getitem__(self, *args):
     17         return '%s:item' % type(self).__name__
     18     def __getslice__(self, *args):
     19         return '%s:slice' % type(self).__name__
     20 
     21 class S(Base, str):
     22     pass
     23 
     24 class U(Base, unicode):
     25     pass
     26 
     27 class BA(Base, bytearray):
     28     pass
     29 
     30 class MockShell:
     31     def __init__(self):
     32         self.reset()
     33 
     34     def write(self, *args):
     35         self.written.append(args)
     36 
     37     def readline(self):
     38         return self.lines.pop()
     39 
     40     def close(self):
     41         pass
     42 
     43     def reset(self):
     44         self.written = []
     45 
     46     def push(self, lines):
     47         self.lines = list(lines)[::-1]
     48 
     49 
     50 class PseudeOutputFilesTest(unittest.TestCase):
     51     def test_misc(self):
     52         shell = MockShell()
     53         f = PseudoOutputFile(shell, 'stdout', 'utf-8')
     54         self.assertIsInstance(f, io.TextIOBase)
     55         self.assertEqual(f.encoding, 'utf-8')
     56         self.assertIsNone(f.errors)
     57         self.assertIsNone(f.newlines)
     58         self.assertEqual(f.name, '<stdout>')
     59         self.assertFalse(f.closed)
     60         self.assertTrue(f.isatty())
     61         self.assertFalse(f.readable())
     62         self.assertTrue(f.writable())
     63         self.assertFalse(f.seekable())
     64 
     65     def test_unsupported(self):
     66         shell = MockShell()
     67         f = PseudoOutputFile(shell, 'stdout', 'utf-8')
     68         self.assertRaises(IOError, f.fileno)
     69         self.assertRaises(IOError, f.tell)
     70         self.assertRaises(IOError, f.seek, 0)
     71         self.assertRaises(IOError, f.read, 0)
     72         self.assertRaises(IOError, f.readline, 0)
     73 
     74     def test_write(self):
     75         shell = MockShell()
     76         f = PseudoOutputFile(shell, 'stdout', 'utf-8')
     77         f.write('test')
     78         self.assertEqual(shell.written, [('test', 'stdout')])
     79         shell.reset()
     80         f.write('t\xe8st')
     81         self.assertEqual(shell.written, [('t\xe8st', 'stdout')])
     82         shell.reset()
     83         f.write(u't\xe8st')
     84         self.assertEqual(shell.written, [(u't\xe8st', 'stdout')])
     85         shell.reset()
     86 
     87         f.write(S('t\xe8st'))
     88         self.assertEqual(shell.written, [('t\xe8st', 'stdout')])
     89         self.assertEqual(type(shell.written[0][0]), str)
     90         shell.reset()
     91         f.write(BA('t\xe8st'))
     92         self.assertEqual(shell.written, [('t\xe8st', 'stdout')])
     93         self.assertEqual(type(shell.written[0][0]), str)
     94         shell.reset()
     95         f.write(U(u't\xe8st'))
     96         self.assertEqual(shell.written, [(u't\xe8st', 'stdout')])
     97         self.assertEqual(type(shell.written[0][0]), unicode)
     98         shell.reset()
     99 
    100         self.assertRaises(TypeError, f.write)
    101         self.assertEqual(shell.written, [])
    102         self.assertRaises(TypeError, f.write, 123)
    103         self.assertEqual(shell.written, [])
    104         self.assertRaises(TypeError, f.write, 'test', 'spam')
    105         self.assertEqual(shell.written, [])
    106 
    107     def test_writelines(self):
    108         shell = MockShell()
    109         f = PseudoOutputFile(shell, 'stdout', 'utf-8')
    110         f.writelines([])
    111         self.assertEqual(shell.written, [])
    112         shell.reset()
    113         f.writelines(['one\n', 'two'])
    114         self.assertEqual(shell.written,
    115                          [('one\n', 'stdout'), ('two', 'stdout')])
    116         shell.reset()
    117         f.writelines(['on\xe8\n', 'tw\xf2'])
    118         self.assertEqual(shell.written,
    119                          [('on\xe8\n', 'stdout'), ('tw\xf2', 'stdout')])
    120         shell.reset()
    121         f.writelines([u'on\xe8\n', u'tw\xf2'])
    122         self.assertEqual(shell.written,
    123                          [(u'on\xe8\n', 'stdout'), (u'tw\xf2', 'stdout')])
    124         shell.reset()
    125 
    126         f.writelines([S('t\xe8st')])
    127         self.assertEqual(shell.written, [('t\xe8st', 'stdout')])
    128         self.assertEqual(type(shell.written[0][0]), str)
    129         shell.reset()
    130         f.writelines([BA('t\xe8st')])
    131         self.assertEqual(shell.written, [('t\xe8st', 'stdout')])
    132         self.assertEqual(type(shell.written[0][0]), str)
    133         shell.reset()
    134         f.writelines([U(u't\xe8st')])
    135         self.assertEqual(shell.written, [(u't\xe8st', 'stdout')])
    136         self.assertEqual(type(shell.written[0][0]), unicode)
    137         shell.reset()
    138 
    139         self.assertRaises(TypeError, f.writelines)
    140         self.assertEqual(shell.written, [])
    141         self.assertRaises(TypeError, f.writelines, 123)
    142         self.assertEqual(shell.written, [])
    143         self.assertRaises(TypeError, f.writelines, [123])
    144         self.assertEqual(shell.written, [])
    145         self.assertRaises(TypeError, f.writelines, [], [])
    146         self.assertEqual(shell.written, [])
    147 
    148     def test_close(self):
    149         shell = MockShell()
    150         f = PseudoOutputFile(shell, 'stdout', 'utf-8')
    151         self.assertFalse(f.closed)
    152         f.write('test')
    153         f.close()
    154         self.assertTrue(f.closed)
    155         self.assertRaises(ValueError, f.write, 'x')
    156         self.assertEqual(shell.written, [('test', 'stdout')])
    157         f.close()
    158         self.assertRaises(TypeError, f.close, 1)
    159 
    160 
    161 class PseudeInputFilesTest(unittest.TestCase):
    162     def test_misc(self):
    163         shell = MockShell()
    164         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    165         self.assertIsInstance(f, io.TextIOBase)
    166         self.assertEqual(f.encoding, 'utf-8')
    167         self.assertIsNone(f.errors)
    168         self.assertIsNone(f.newlines)
    169         self.assertEqual(f.name, '<stdin>')
    170         self.assertFalse(f.closed)
    171         self.assertTrue(f.isatty())
    172         self.assertTrue(f.readable())
    173         self.assertFalse(f.writable())
    174         self.assertFalse(f.seekable())
    175 
    176     def test_unsupported(self):
    177         shell = MockShell()
    178         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    179         self.assertRaises(IOError, f.fileno)
    180         self.assertRaises(IOError, f.tell)
    181         self.assertRaises(IOError, f.seek, 0)
    182         self.assertRaises(IOError, f.write, 'x')
    183         self.assertRaises(IOError, f.writelines, ['x'])
    184 
    185     def test_read(self):
    186         shell = MockShell()
    187         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    188         shell.push(['one\n', 'two\n', ''])
    189         self.assertEqual(f.read(), 'one\ntwo\n')
    190         shell.push(['one\n', 'two\n', ''])
    191         self.assertEqual(f.read(-1), 'one\ntwo\n')
    192         shell.push(['one\n', 'two\n', ''])
    193         self.assertEqual(f.read(None), 'one\ntwo\n')
    194         shell.push(['one\n', 'two\n', 'three\n', ''])
    195         self.assertEqual(f.read(2), 'on')
    196         self.assertEqual(f.read(3), 'e\nt')
    197         self.assertEqual(f.read(10), 'wo\nthree\n')
    198 
    199         shell.push(['one\n', 'two\n'])
    200         self.assertEqual(f.read(0), '')
    201         self.assertRaises(TypeError, f.read, 1.5)
    202         self.assertRaises(TypeError, f.read, '1')
    203         self.assertRaises(TypeError, f.read, 1, 1)
    204 
    205     def test_readline(self):
    206         shell = MockShell()
    207         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    208         shell.push(['one\n', 'two\n', 'three\n', 'four\n'])
    209         self.assertEqual(f.readline(), 'one\n')
    210         self.assertEqual(f.readline(-1), 'two\n')
    211         self.assertEqual(f.readline(None), 'three\n')
    212         shell.push(['one\ntwo\n'])
    213         self.assertEqual(f.readline(), 'one\n')
    214         self.assertEqual(f.readline(), 'two\n')
    215         shell.push(['one', 'two', 'three'])
    216         self.assertEqual(f.readline(), 'one')
    217         self.assertEqual(f.readline(), 'two')
    218         shell.push(['one\n', 'two\n', 'three\n'])
    219         self.assertEqual(f.readline(2), 'on')
    220         self.assertEqual(f.readline(1), 'e')
    221         self.assertEqual(f.readline(1), '\n')
    222         self.assertEqual(f.readline(10), 'two\n')
    223 
    224         shell.push(['one\n', 'two\n'])
    225         self.assertEqual(f.readline(0), '')
    226         self.assertRaises(TypeError, f.readlines, 1.5)
    227         self.assertRaises(TypeError, f.readlines, '1')
    228         self.assertRaises(TypeError, f.readlines, 1, 1)
    229 
    230     def test_readlines(self):
    231         shell = MockShell()
    232         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    233         shell.push(['one\n', 'two\n', ''])
    234         self.assertEqual(f.readlines(), ['one\n', 'two\n'])
    235         shell.push(['one\n', 'two\n', ''])
    236         self.assertEqual(f.readlines(-1), ['one\n', 'two\n'])
    237         shell.push(['one\n', 'two\n', ''])
    238         self.assertEqual(f.readlines(None), ['one\n', 'two\n'])
    239         shell.push(['one\n', 'two\n', ''])
    240         self.assertEqual(f.readlines(0), ['one\n', 'two\n'])
    241         shell.push(['one\n', 'two\n', ''])
    242         self.assertEqual(f.readlines(3), ['one\n'])
    243         shell.push(['one\n', 'two\n', ''])
    244         self.assertEqual(f.readlines(4), ['one\n', 'two\n'])
    245 
    246         shell.push(['one\n', 'two\n', ''])
    247         self.assertRaises(TypeError, f.readlines, 1.5)
    248         self.assertRaises(TypeError, f.readlines, '1')
    249         self.assertRaises(TypeError, f.readlines, 1, 1)
    250 
    251     def test_close(self):
    252         shell = MockShell()
    253         f = PseudoInputFile(shell, 'stdin', 'utf-8')
    254         shell.push(['one\n', 'two\n', ''])
    255         self.assertFalse(f.closed)
    256         self.assertEqual(f.readline(), 'one\n')
    257         f.close()
    258         self.assertFalse(f.closed)
    259         self.assertEqual(f.readline(), 'two\n')
    260         self.assertRaises(TypeError, f.close, 1)
    261 
    262 
    263 def test_main():
    264     support.run_unittest(PseudeOutputFilesTest, PseudeInputFilesTest)
    265 
    266 if __name__ == '__main__':
    267     test_main()
    268