truncate() returns the new size and position.
write() returns the number of bytes/characters written/buffered.
FileIO.close() calls self.flush().
Implement readinto() for buffered readers.
Tests th check all these.
Test proper behavior of __enter__/__exit__.
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 0a37fc2..27fd56f 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -79,17 +79,19 @@
test_support.unlink(test_support.TESTFN)
def write_ops(self, f):
- f.write(b"blah.")
- f.seek(0)
- f.write(b"Hello.")
+ self.assertEqual(f.write(b"blah."), 5)
+ self.assertEqual(f.seek(0), 0)
+ self.assertEqual(f.write(b"Hello."), 6)
self.assertEqual(f.tell(), 6)
- f.seek(-1, 1)
+ self.assertEqual(f.seek(-1, 1), 5)
self.assertEqual(f.tell(), 5)
- f.write(" world\n\n\n")
- f.seek(0)
- f.write("h")
- f.seek(-2, 2)
- f.truncate()
+ self.assertEqual(f.write(" world\n\n\n"), 9)
+ self.assertEqual(f.seek(0), 0)
+ self.assertEqual(f.write("h"), 1)
+ self.assertEqual(f.seek(-1, 2), 13)
+ self.assertEqual(f.tell(), 13)
+ self.assertEqual(f.truncate(12), 12)
+ self.assertEqual(f.tell(), 12)
LARGE = 2**31
@@ -101,10 +103,10 @@
self.assertEqual(f.write(b"xxx"), 3)
self.assertEqual(f.tell(), self.LARGE + 3)
self.assertEqual(f.seek(-1, 1), self.LARGE + 2)
- f.truncate()
+ self.assertEqual(f.truncate(), self.LARGE + 2)
self.assertEqual(f.tell(), self.LARGE + 2)
self.assertEqual(f.seek(0, 2), self.LARGE + 2)
- f.truncate(self.LARGE + 1)
+ self.assertEqual(f.truncate(self.LARGE + 1), self.LARGE + 1)
self.assertEqual(f.tell(), self.LARGE + 1)
self.assertEqual(f.seek(0, 2), self.LARGE + 1)
self.assertEqual(f.seek(-1, 2), self.LARGE)
@@ -142,6 +144,20 @@
self.read_ops(f)
f.close()
+ def test_buffered_file_io(self):
+ f = io.open(test_support.TESTFN, "wb")
+ self.assertEqual(f.readable(), False)
+ self.assertEqual(f.writable(), True)
+ self.assertEqual(f.seekable(), True)
+ self.write_ops(f)
+ f.close()
+ f = io.open(test_support.TESTFN, "rb")
+ self.assertEqual(f.readable(), True)
+ self.assertEqual(f.writable(), False)
+ self.assertEqual(f.seekable(), True)
+ self.read_ops(f)
+ f.close()
+
def test_raw_bytes_io(self):
f = io.BytesIO()
self.write_ops(f)
@@ -163,9 +179,52 @@
print("Use 'regrtest.py -u largefile test_io' to run it.",
file=sys.stderr)
return
- f = io.open(test_support.TESTFN, "w+b", buffering=0)
+ f = io.open(test_support.TESTFN, "w+b", 0)
self.large_file_ops(f)
f.close()
+ f = io.open(test_support.TESTFN, "w+b")
+ self.large_file_ops(f)
+ f.close()
+
+ def test_with_open(self):
+ for bufsize in (0, 1, 100):
+ f = None
+ with open(test_support.TESTFN, "wb", bufsize) as f:
+ f.write("xxx")
+ self.assertEqual(f.closed, True)
+ f = None
+ try:
+ with open(test_support.TESTFN, "wb", bufsize) as f:
+ 1/0
+ except ZeroDivisionError:
+ self.assertEqual(f.closed, True)
+ else:
+ self.fail("1/0 didn't raise an exception")
+
+ def test_destructor(self):
+ record = []
+ class MyFileIO(io.FileIO):
+ def __del__(self):
+ record.append(1)
+ io.FileIO.__del__(self)
+ def close(self):
+ record.append(2)
+ io.FileIO.close(self)
+ def flush(self):
+ record.append(3)
+ io.FileIO.flush(self)
+ f = MyFileIO(test_support.TESTFN, "w")
+ f.write("xxx")
+ del f
+ self.assertEqual(record, [1, 2, 3])
+
+ def test_close_flushes(self):
+ f = io.open(test_support.TESTFN, "wb")
+ f.write("xxx")
+ f.close()
+ f = io.open(test_support.TESTFN, "rb")
+ self.assertEqual(f.read(), b"xxx")
+ f.close()
class MemorySeekTestMixin: