Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6c86fe2

Browse files
Issue #23583: Added tests for standard IO streams in IDLE.
1 parent ec4f959 commit 6c86fe2

2 files changed

Lines changed: 238 additions & 0 deletions

File tree

Lib/idlelib/idle_test/test_io.py

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

Misc/NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ Library
108108

109109
- Issue #23361: Fix possible overflow in Windows subprocess creation code.
110110

111+
Tests
112+
-----
113+
114+
- Issue #23583: Added tests for standard IO streams in IDLE.
115+
111116
Build
112117
-----
113118

0 commit comments

Comments
 (0)