blob: 7384999d63a95e2bccea6ff1c94b5b765fe0b052 [file] [log] [blame]
Guido van Rossum68bbcd22007-02-27 17:19:33 +00001"""Unit tests for io.py."""
2
Guido van Rossum28524c72007-02-27 05:47:44 +00003import unittest
4from test import test_support
5
6import io
7
Guido van Rossum68bbcd22007-02-27 17:19:33 +00008
9class MockReadIO(io.RawIOBase):
10 def __init__(self, readStack):
11 self._readStack = list(readStack)
12
13 def read(self, n=None):
14 try:
15 return self._readStack.pop(0)
16 except:
17 return io.EOF
18
19 def fileno(self):
20 return 42
21
22 def readable(self):
23 return True
24
25
26class MockWriteIO(io.RawIOBase):
27 def __init__(self):
28 self._writeStack = []
29
30 def write(self, b):
31 self._writeStack.append(b)
32 return len(b)
33
34 def writeable(self):
35 return True
36
37 def fileno(self):
38 return 42
39
40
Guido van Rossum28524c72007-02-27 05:47:44 +000041class IOTest(unittest.TestCase):
42
43 def write_ops(self, f):
44 f.write(b"blah.")
45 f.seek(0)
46 f.write(b"Hello.")
47 self.assertEqual(f.tell(), 6)
48 f.seek(-1, 1)
49 self.assertEqual(f.tell(), 5)
50 f.write(" world\n\n\n")
51 f.seek(0)
52 f.write("h")
53 f.seek(-2, 2)
54 f.truncate()
55
56 def read_ops(self, f):
57 data = f.read(5)
58 self.assertEqual(data, b"hello")
59 f.readinto(data)
60 self.assertEqual(data, b" worl")
61 f.readinto(data)
62 self.assertEqual(data, b"d\n")
63 f.seek(0)
64 self.assertEqual(f.read(20), b"hello world\n")
65 f.seek(-6, 2)
66 self.assertEqual(f.read(5), b"world")
67 f.seek(-6, 1)
68 self.assertEqual(f.read(5), b" worl")
69 self.assertEqual(f.tell(), 10)
70
71 def test_raw_file_io(self):
72 f = io.open(test_support.TESTFN, "wb", buffering=0)
73 self.assertEqual(f.readable(), False)
74 self.assertEqual(f.writable(), True)
75 self.assertEqual(f.seekable(), True)
76 self.write_ops(f)
77 f.close()
78 f = io.open(test_support.TESTFN, "rb", buffering=0)
79 self.assertEqual(f.readable(), True)
80 self.assertEqual(f.writable(), False)
81 self.assertEqual(f.seekable(), True)
82 self.read_ops(f)
83 f.close()
84
85 def test_raw_bytes_io(self):
86 f = io.BytesIO()
87 self.write_ops(f)
88 data = f.getvalue()
89 self.assertEqual(data, b"hello world\n")
90 f = io.BytesIO(data)
91 self.read_ops(f)
92
Guido van Rossum68bbcd22007-02-27 17:19:33 +000093
94class BytesIOTest(unittest.TestCase):
95
96 def testInit(self):
97 buf = b"1234567890"
98 bytesIo = io.BytesIO(buf)
99
100 def testRead(self):
101 buf = b"1234567890"
102 bytesIo = io.BytesIO(buf)
103
104 self.assertEquals(buf[:1], bytesIo.read(1))
105 self.assertEquals(buf[1:5], bytesIo.read(4))
106 self.assertEquals(buf[5:], bytesIo.read(900))
107 self.assertEquals(io.EOF, bytesIo.read())
108
109 def testReadNoArgs(self):
110 buf = b"1234567890"
111 bytesIo = io.BytesIO(buf)
112
113 self.assertEquals(buf, bytesIo.read())
114 self.assertEquals(io.EOF, bytesIo.read())
115
116 def testSeek(self):
117 buf = b"1234567890"
118 bytesIo = io.BytesIO(buf)
119
120 bytesIo.read(5)
121 bytesIo.seek(0)
122 self.assertEquals(buf, bytesIo.read())
123
124 bytesIo.seek(3)
125 self.assertEquals(buf[3:], bytesIo.read())
126
127 def testTell(self):
128 buf = b"1234567890"
129 bytesIo = io.BytesIO(buf)
130
131 self.assertEquals(0, bytesIo.tell())
132 bytesIo.seek(5)
133 self.assertEquals(5, bytesIo.tell())
134 bytesIo.seek(10000)
135 self.assertEquals(10000, bytesIo.tell())
136
137
138class BufferedReaderTest(unittest.TestCase):
139
140 def testRead(self):
141 rawIo = MockReadIO((b"abc", b"d", b"efg"))
142 bufIo = io.BufferedReader(rawIo)
143
144 self.assertEquals(b"abcdef", bufIo.read(6))
145
146 def testReadToEof(self):
147 rawIo = MockReadIO((b"abc", b"d", b"efg"))
148 bufIo = io.BufferedReader(rawIo)
149
150 self.assertEquals(b"abcdefg", bufIo.read(9000))
151
152 def testReadNoArgs(self):
153 rawIo = MockReadIO((b"abc", b"d", b"efg"))
154 bufIo = io.BufferedReader(rawIo)
155
156 self.assertEquals(b"abcdefg", bufIo.read())
157
158 def testFileno(self):
159 rawIo = MockReadIO((b"abc", b"d", b"efg"))
160 bufIo = io.BufferedReader(rawIo)
161
162 self.assertEquals(42, bufIo.fileno())
163
164 def testFilenoNoFileno(self):
165 # TODO will we always have fileno() function? If so, kill
166 # this test. Else, write it.
167 pass
168
169
170class BufferedWriterTest(unittest.TestCase):
171
172 def testWrite(self):
173 # Write to the buffered IO but don't overflow the buffer.
174 writer = MockWriteIO()
175 bufIo = io.BufferedWriter(writer, 8)
176
177 bufIo.write(b"abc")
178
179 self.assertFalse(writer._writeStack)
180
181 def testWriteOverflow(self):
182 writer = MockWriteIO()
183 bufIo = io.BufferedWriter(writer, 8)
184
185 bufIo.write(b"abc")
186 bufIo.write(b"defghijkl")
187
188 self.assertEquals(b"abcdefghijkl", writer._writeStack[0])
189
190 def testFlush(self):
191 writer = MockWriteIO()
192 bufIo = io.BufferedWriter(writer, 8)
193
194 bufIo.write(b"abc")
195 bufIo.flush()
196
197 self.assertEquals(b"abc", writer._writeStack[0])
198
199# TODO. Tests for open()
200
Guido van Rossum28524c72007-02-27 05:47:44 +0000201def test_main():
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000202 test_support.run_unittest(IOTest, BytesIOTest, BufferedReaderTest,
203 BufferedWriterTest)
Guido van Rossum28524c72007-02-27 05:47:44 +0000204
205if __name__ == "__main__":
206 test_main()