diff --git a/Tests/test_file_container.py b/Tests/test_file_container.py index 6abf5cc1451..ad0394cf9d4 100644 --- a/Tests/test_file_container.py +++ b/Tests/test_file_container.py @@ -57,69 +57,83 @@ def test_seek_mode_2(self): def test_read_n0(self): # Arrange - with open(TEST_FILE, "rb") as fh: - container = ContainerIO.ContainerIO(fh, 22, 100) + for bytesmode in (True, False): + with open(TEST_FILE, "rb" if bytesmode else "r") as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) - # Act - container.seek(81) - data = container.read() + # Act + container.seek(81) + data = container.read() - # Assert - self.assertEqual(data, b"7\nThis is line 8\n") + # Assert + if bytesmode: + data = data.decode() + self.assertEqual(data, "7\nThis is line 8\n") def test_read_n(self): # Arrange - with open(TEST_FILE, "rb") as fh: - container = ContainerIO.ContainerIO(fh, 22, 100) + for bytesmode in (True, False): + with open(TEST_FILE, "rb" if bytesmode else "r") as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) - # Act - container.seek(81) - data = container.read(3) + # Act + container.seek(81) + data = container.read(3) - # Assert - self.assertEqual(data, b"7\nT") + # Assert + if bytesmode: + data = data.decode() + self.assertEqual(data, "7\nT") def test_read_eof(self): # Arrange - with open(TEST_FILE, "rb") as fh: - container = ContainerIO.ContainerIO(fh, 22, 100) + for bytesmode in (True, False): + with open(TEST_FILE, "rb" if bytesmode else "r") as fh: + container = ContainerIO.ContainerIO(fh, 22, 100) - # Act - container.seek(100) - data = container.read() + # Act + container.seek(100) + data = container.read() - # Assert - self.assertEqual(data, b"") + # Assert + if bytesmode: + data = data.decode() + self.assertEqual(data, "") def test_readline(self): # Arrange - with open(TEST_FILE, "rb") as fh: - container = ContainerIO.ContainerIO(fh, 0, 120) + for bytesmode in (True, False): + with open(TEST_FILE, "rb" if bytesmode else "r") as fh: + container = ContainerIO.ContainerIO(fh, 0, 120) - # Act - data = container.readline() + # Act + data = container.readline() - # Assert - self.assertEqual(data, b"This is line 1\n") + # Assert + if bytesmode: + data = data.decode() + self.assertEqual(data, "This is line 1\n") def test_readlines(self): # Arrange - expected = [ - b"This is line 1\n", - b"This is line 2\n", - b"This is line 3\n", - b"This is line 4\n", - b"This is line 5\n", - b"This is line 6\n", - b"This is line 7\n", - b"This is line 8\n", - ] - with open(TEST_FILE, "rb") as fh: - container = ContainerIO.ContainerIO(fh, 0, 120) - - # Act - data = container.readlines() - - # Assert - - self.assertEqual(data, expected) + for bytesmode in (True, False): + expected = [ + "This is line 1\n", + "This is line 2\n", + "This is line 3\n", + "This is line 4\n", + "This is line 5\n", + "This is line 6\n", + "This is line 7\n", + "This is line 8\n", + ] + with open(TEST_FILE, "rb" if bytesmode else "r") as fh: + container = ContainerIO.ContainerIO(fh, 0, 120) + + # Act + data = container.readlines() + + # Assert + if bytesmode: + data = [line.decode() for line in data] + self.assertEqual(data, expected) diff --git a/src/PIL/ContainerIO.py b/src/PIL/ContainerIO.py index b8a3d0582dd..10ac6735d56 100644 --- a/src/PIL/ContainerIO.py +++ b/src/PIL/ContainerIO.py @@ -82,7 +82,7 @@ def read(self, n=0): else: n = self.length - self.pos if not n: # EOF - return b"" + return b"" if "b" in self.fh.mode else "" self.pos = self.pos + n return self.fh.read(n) @@ -92,13 +92,13 @@ def readline(self): :returns: An 8-bit string. """ - s = b"" + s = b"" if "b" in self.fh.mode else "" while True: c = self.read(1) if not c: break s = s + c - if c == b"\n": + if c == (b"\n" if "b" in self.fh.mode else "\n"): break return s